برچسب گذاری تصاویر با Firebase ML در پلتفرم های اپل

شما می‌توانید Firebase ML برای برچسب‌گذاری اشیاء شناسایی‌شده در یک تصویر استفاده کنید. برای اطلاعات بیشتر در مورد ویژگی‌های این API، به نمای کلی مراجعه کنید.

قبل از اینکه شروع کنی

    اگر هنوز Firebase را به برنامه خود اضافه نکرده‌اید، با دنبال کردن مراحل موجود در راهنمای شروع به کار ، این کار را انجام دهید.

    برای نصب و مدیریت وابستگی‌های Firebase از Swift Package Manager استفاده کنید.

    1. در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
    2. وقتی از شما خواسته شد، مخزن SDK پلتفرم‌های اپل فایربیس را اضافه کنید:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. کتابخانه Firebase ML را انتخاب کنید.
    5. پرچم -ObjC را به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید.
    6. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی‌های شما در پس‌زمینه می‌کند.

    در مرحله بعد، برخی تنظیمات درون برنامه‌ای را انجام دهید:

    1. در برنامه خود، Firebase را وارد کنید:

      سویفت

      import FirebaseMLModelDownloader

      هدف-سی

      @import FirebaseMLModelDownloader;
  1. اگر هنوز APIهای مبتنی بر ابر را برای پروژه خود فعال نکرده‌اید، اکنون این کار را انجام دهید:

    1. صفحه Firebase ML APIs را در کنسول Firebase باز کنید.
    2. اگر هنوز پروژه خود را به طرح قیمت‌گذاری پرداخت در محل Blaze ارتقا نداده‌اید، برای انجام این کار روی ارتقا کلیک کنید. (فقط در صورتی که پروژه شما در طرح قیمت‌گذاری Blaze نباشد، از شما خواسته می‌شود که آن را ارتقا دهید.)

      فقط پروژه‌های موجود در طرح قیمت‌گذاری Blaze می‌توانند از APIهای مبتنی بر ابر استفاده کنند.

    3. اگر APIهای مبتنی بر ابر از قبل فعال نشده‌اند، روی فعال کردن APIهای مبتنی بر ابر کلیک کنید.

حالا آماده‌اید تا تصاویر را برچسب‌گذاری کنید.

۱. تصویر ورودی را آماده کنید

با استفاده از UIImage یا CMSampleBufferRef یک شیء VisionImage ایجاد کنید.

برای استفاده از UIImage :

  1. در صورت لزوم، تصویر را بچرخانید تا ویژگی imageOrientation آن به .up برسد.
  2. یک شیء VisionImage با استفاده از UIImage با چرخش صحیح ایجاد کنید. هیچ فراداده چرخشی را مشخص نکنید - باید از مقدار پیش‌فرض .topLeft استفاده شود.

    سویفت

    let image = VisionImage(image: uiImage)

    هدف-سی

    FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

برای استفاده از CMSampleBufferRef :

  1. یک شیء VisionImageMetadata ایجاد کنید که جهت داده‌های تصویر موجود در بافر CMSampleBufferRef را مشخص کند.

    برای بدست آوردن جهت تصویر:

    سویفت

    func imageOrientation(
        deviceOrientation: UIDeviceOrientation,
        cameraPosition: AVCaptureDevice.Position
        ) -> VisionDetectorImageOrientation {
        switch deviceOrientation {
        case .portrait:
            return cameraPosition == .front ? .leftTop : .rightTop
        case .landscapeLeft:
            return cameraPosition == .front ? .bottomLeft : .topLeft
        case .portraitUpsideDown:
            return cameraPosition == .front ? .rightBottom : .leftBottom
        case .landscapeRight:
            return cameraPosition == .front ? .topRight : .bottomRight
        case .faceDown, .faceUp, .unknown:
            return .leftTop
        }
    }

    هدف-سی

    - (FIRVisionDetectorImageOrientation)
        imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                               cameraPosition:(AVCaptureDevicePosition)cameraPosition {
      switch (deviceOrientation) {
        case UIDeviceOrientationPortrait:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationLeftTop;
          } else {
            return FIRVisionDetectorImageOrientationRightTop;
          }
        case UIDeviceOrientationLandscapeLeft:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationBottomLeft;
          } else {
            return FIRVisionDetectorImageOrientationTopLeft;
          }
        case UIDeviceOrientationPortraitUpsideDown:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationRightBottom;
          } else {
            return FIRVisionDetectorImageOrientationLeftBottom;
          }
        case UIDeviceOrientationLandscapeRight:
          if (cameraPosition == AVCaptureDevicePositionFront) {
            return FIRVisionDetectorImageOrientationTopRight;
          } else {
            return FIRVisionDetectorImageOrientationBottomRight;
          }
        default:
          return FIRVisionDetectorImageOrientationTopLeft;
      }
    }

    سپس، شیء متادیتا را ایجاد کنید:

    سویفت

    let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
    let metadata = VisionImageMetadata()
    metadata.orientation = imageOrientation(
        deviceOrientation: UIDevice.current.orientation,
        cameraPosition: cameraPosition
    )

    هدف-سی

    FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
    AVCaptureDevicePosition cameraPosition =
        AVCaptureDevicePositionBack;  // Set to the capture device you used.
    metadata.orientation =
        [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                     cameraPosition:cameraPosition];
  2. با استفاده از شیء CMSampleBufferRef و متادیتای چرخش، یک شیء VisionImage ایجاد کنید:

    سویفت

    let image = VisionImage(buffer: sampleBuffer)
    image.metadata = metadata

    هدف-سی

    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
    image.metadata = metadata;

۲. پیکربندی و اجرای برچسب‌گذار تصویر

برای برچسب‌گذاری اشیاء در یک تصویر، شیء VisionImage را به متد processImage() از VisionImageLabeler ارسال کنید.

  1. ابتدا، یک نمونه از VisionImageLabeler دریافت کنید:

    سویفت

    let labeler = Vision.vision().cloudImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionCloudImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().cloudImageLabeler(options: options)
    

    هدف-سی

    FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionCloudImageLabelerOptions *options =
    //         [[FIRVisionCloudImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] cloudImageLabelerWithOptions:options];
    
  2. سپس، تصویر را به متد processImage() ارسال کنید:

    سویفت

    labeler.process(image) { labels, error in
        guard error == nil, let labels = labels else { return }
    
        // Task succeeded.
        // ...
    }
    

    هدف-سی

    [labeler processImage:image
               completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels,
                            NSError *_Nullable error) {
                   if (error != nil) { return; }
    
                   // Task succeeded.
                   // ...
               }];
    

۳. اطلاعات مربوط به اشیاء برچسب‌گذاری شده را دریافت کنید

اگر برچسب‌گذاری تصویر با موفقیت انجام شود، آرایه‌ای از اشیاء VisionImageLabel به کنترل‌کننده‌ی تکمیل ارسال می‌شود. از هر شیء، می‌توانید اطلاعاتی در مورد یک ویژگی شناسایی‌شده در تصویر دریافت کنید.

برای مثال:

سویفت

for label in labels {
    let labelText = label.text
    let entityId = label.entityID
    let confidence = label.confidence
}

هدف-سی

for (FIRVisionImageLabel *label in labels) {
   NSString *labelText = label.text;
   NSString *entityId = label.entityID;
   NSNumber *confidence = label.confidence;
}

مراحل بعدی