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

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

قبل از شروع

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

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

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

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

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

      سویفت

      import FirebaseMLModelDownloader

      هدف-C

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

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

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

    3. اگر APIهای مبتنی بر Cloud قبلاً فعال نشده‌اند، روی Enable Cloud-based APIs کلیک کنید.

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

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

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

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

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

    سویفت

    let image = VisionImage(image: uiImage)

    هدف-C

    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
        }
    }

    هدف-C

    - (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
    )

    هدف-C

    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. یک شی VisionImage با استفاده از شی CMSampleBufferRef و ابرداده چرخش ایجاد کنید:

    سویفت

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

    هدف-C

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

2. برچسب تصویر را پیکربندی و اجرا کنید

برای برچسب گذاری اشیاء در یک تصویر، شی 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)
    

    هدف-C

    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.
        // ...
    }
    

    هدف-C

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

3. اطلاعاتی در مورد اشیاء برچسب دار دریافت کنید

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

به عنوان مثال:

سویفت

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

هدف-C

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

مراحل بعدی