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

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

ก่อนเริ่มต้น

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

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

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

    ถัดไป ให้ตั้งค่าบางอย่างในแอป ดังนี้

    1. นําเข้า Firebase ในแอป โดยทําดังนี้
      SwiftObjective-C
      import FirebaseMLModelDownloader
      @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
    SwiftObjective-C
    let image = VisionImage(image: uiImage)
    FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

วิธีใช้ CMSampleBufferRef

  1. สร้างออบเจ็กต์ VisionImageMetadata ที่ระบุการวางแนวของข้อมูลรูปภาพที่อยู่ในบัฟเฟอร์ CMSampleBufferRef

    วิธีดูการวางแนวรูปภาพ

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

    จากนั้นสร้างออบเจ็กต์ข้อมูลเมตา โดยทำดังนี้

    SwiftObjective-C
    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. สร้างออบเจ็กต์ VisionImage โดยใช้ออบเจ็กต์ CMSampleBufferRef และข้อมูลเมตาการหมุน โดยทำดังนี้
    SwiftObjective-C
    let image = VisionImage(buffer: sampleBuffer)
    image.metadata = metadata
    FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
    image.metadata = metadata;

2. กําหนดค่าและเรียกใช้โปรแกรมติดป้ายกำกับรูปภาพ

หากต้องการติดป้ายกำกับวัตถุในรูปภาพ ให้ส่งออบเจ็กต์ VisionImage ไปยังเมธอด processImage() ของ VisionImageLabeler

  1. ก่อนอื่น ให้รับอินสแตนซ์ของ VisionImageLabeler โดยทำดังนี้

    SwiftObjective-C
    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() ดังนี้

    SwiftObjective-C
    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.
                   // ...
               }];
    

3. ดูข้อมูลเกี่ยวกับวัตถุที่ติดป้ายกำกับ

หากติดป้ายกำกับรูปภาพสำเร็จ ระบบจะส่งอาร์เรย์ของVisionImageLabel ออบเจ็กต์ไปยัง Completion Handler คุณดูข้อมูลเกี่ยวกับองค์ประกอบที่ระบบจดจำได้ในรูปภาพจากวัตถุแต่ละรายการ

เช่น

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

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