ติดป้ายกำกับรูปภาพด้วย ML Kit บน iOS

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

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

  1. หากคุณยังไม่ได้เพิ่ม Firebase ลงในแอปของคุณ ให้ทำตามขั้นตอนใน คู่มือการเริ่มต้นใช้งาน
  2. รวมไลบรารี ML Kit ไว้ใน Podfile ของคุณ:
    pod 'Firebase/MLVision', '6.25.0'

    # If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'

    หลังจากที่คุณติดตั้งหรืออัปเดต Pod ของโปรเจ็กต์แล้ว อย่าลืมเปิดโปรเจ็กต์ Xcode โดยใช้ .xcworkspace
  3. ในแอปของคุณ ให้นำเข้า Firebase:

    สวิฟท์

    import Firebase

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

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

    1. เปิด หน้า ML Kit 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().onDeviceImageLabeler()
    
    // Or, to set the minimum confidence required:
    // let options = VisionOnDeviceImageLabelerOptions()
    // options.confidenceThreshold = 0.7
    // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
    

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

    FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler];
    
    // Or, to set the minimum confidence required:
    // FIRVisionOnDeviceImageLabelerOptions *options =
    //         [[FIRVisionOnDeviceImageLabelerOptions alloc] init];
    // options.confidenceThreshold = 0.7;
    // FIRVisionImageLabeler *labeler =
    //         [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
    

    หากคุณต้องการใช้เครื่องติดป้ายกำกับรูปภาพบนคลาวด์:

    สวิฟท์

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

เคล็ดลับในการปรับปรุงประสิทธิภาพแบบเรียลไทม์

หากคุณต้องการติดป้ายกำกับรูปภาพในแอปพลิเคชันแบบเรียลไทม์ ให้ปฏิบัติตามหลักเกณฑ์เหล่านี้เพื่อให้ได้อัตราเฟรมที่ดีที่สุด:

  • คันเร่งเรียกไปยังผู้ติดป้ายกำกับรูปภาพ หากมีเฟรมวิดีโอใหม่ในขณะที่เครื่องติดป้ายกำกับรูปภาพกำลังทำงาน ให้ปล่อยเฟรมนั้น
  • หากคุณใช้เอาท์พุตของผู้ติดป้ายกำกับรูปภาพเพื่อวางซ้อนกราฟิกบนรูปภาพอินพุต ขั้นแรกให้รับผลลัพธ์จาก ML Kit จากนั้นเรนเดอร์รูปภาพและโอเวอร์เลย์ในขั้นตอนเดียว การทำเช่นนี้ คุณจะเรนเดอร์ไปยังพื้นผิวจอแสดงผลเพียงครั้งเดียวสำหรับแต่ละเฟรมอินพุต ดูตัวอย่างคลาส PreviewOverlayView และ FIRDetectionOverlayView ในแอปตัวอย่าง Showcase

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