ติดป้ายกำกับรูปภาพด้วย Firebase ML บนแพลตฟอร์ม Apple

คุณสามารถใช้ Firebase ML เพื่อติดป้ายกำกับวัตถุที่รู้จักในรูปภาพ ดู ภาพรวม สำหรับข้อมูลเกี่ยวกับคุณลักษณะของ API นี้

ก่อนที่คุณจะเริ่ม

    หากคุณยังไม่ได้เพิ่ม Firebase ลงในแอปของคุณ ให้ทำตามขั้นตอนใน คู่มือการเริ่มต้นใช้งาน

    ใช้ Swift Package Manager เพื่อติดตั้งและจัดการการพึ่งพา Firebase

    1. ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Package
    2. เมื่อได้รับแจ้ง ให้เพิ่มพื้นที่เก็บข้อมูล SDK แพลตฟอร์ม Firebase Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. เลือกไลบรารี Firebase ML
    5. เพิ่มแฟล็ก -ObjC ไปยังส่วน Other Linker Flags ของการตั้งค่า build ของเป้าหมายของคุณ
    6. เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการอ้างอิงของคุณโดยอัตโนมัติในเบื้องหลัง

    จากนั้น ให้ทำการตั้งค่าในแอป:

    1. ในแอปของคุณ ให้นำเข้า Firebase:

      สวิฟท์

      import FirebaseMLModelDownloader

      วัตถุประสงค์-C

      @import FirebaseMLModelDownloader;
  1. หากคุณยังไม่ได้เปิดใช้งาน API บนระบบคลาวด์สำหรับโปรเจ็กต์ของคุณ ให้ดำเนินการทันที:

    1. เปิด หน้า Firebase ML API ของคอนโซล Firebase
    2. หากคุณยังไม่ได้อัปเกรดโปรเจ็กต์เป็นแผนราคา Blaze ให้คลิก อัปเกรด เพื่อดำเนินการดังกล่าว (คุณจะได้รับแจ้งให้อัปเกรดเฉพาะในกรณีที่โปรเจ็กต์ของคุณไม่ได้อยู่ในแผน Blaze)

      เฉพาะโปรเจ็กต์ระดับ Blaze เท่านั้นที่ใช้ API บนระบบคลาวด์ได้

    3. หากยังไม่ได้เปิดใช้งาน API ในระบบคลาวด์ ให้คลิก เปิดใช้งาน API ในระบบคลาวด์

ตอนนี้คุณพร้อมที่จะติดป้ายกำกับรูปภาพแล้ว

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

ขั้นตอนถัดไป