คำแนะนำการตรวจจับวัตถุสำหรับ iOS

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

คุณสามารถดูการทำงานนี้ได้โดยดูที่ เว็บ การสาธิต สำหรับ เพื่อทราบข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่า งานนี้ ดู ภาพรวม

ตัวอย่างโค้ด

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

คุณสามารถใช้แอปนี้เป็นจุดเริ่มต้นสำหรับแอป iOS ของคุณเอง หรืออ้างอิงถึงแอป เมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่าง Object Detector ถูกโฮสต์บน GitHub

ดาวน์โหลดโค้ด

วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาตัวอย่างในเครื่อง โดยใช้เครื่องมือบรรทัดคำสั่ง git

วิธีดาวน์โหลดโค้ดตัวอย่าง

  1. โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้

    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. นอกจากนี้ คุณสามารถกำหนดค่าอินสแตนซ์ Git ให้ใช้การชำระเงินแบบกระจัดกระจายเพื่อให้คุณมี เฉพาะไฟล์สำหรับแอปตัวอย่าง Object Detector เท่านั้น

    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/object_detection/ios/
    

หลังจากสร้างโค้ดตัวอย่างในเวอร์ชันในเครื่องแล้ว คุณสามารถติดตั้ง ไลบรารีงาน MediaPipe เปิดโปรเจ็กต์โดยใช้ Xcode และเรียกใช้แอป สำหรับ โปรดดูวิธีการในคู่มือการการตั้งค่าสำหรับ iOS

องค์ประกอบสำคัญ

ไฟล์ต่อไปนี้มีโค้ดที่สำคัญสำหรับตัวอย่าง Object Detector แอปพลิเคชัน:

  • ObjectDetectorService.swift: เริ่มต้นตัวตรวจจับ จัดการการเลือกโมเดล และเรียกใช้การอนุมานเกี่ยวกับข้อมูลอินพุต
  • CameraViewController.swift: ใช้ UI สำหรับโหมดป้อนข้อมูลฟีดกล้องแบบสดและแสดงภาพ ผลการตรวจจับ
  • MediaLibraryViewController.swift: ใช้ UI สำหรับโหมดป้อนข้อมูลไฟล์ภาพนิ่งและไฟล์วิดีโอ และ แสดงภาพผลลัพธ์การตรวจจับ

ตั้งค่า

ส่วนนี้จะอธิบายขั้นตอนสำคัญในการตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์ และ โปรเจ็กต์โค้ดเพื่อใช้ตัวตรวจจับออบเจ็กต์ สำหรับข้อมูลทั่วไปเกี่ยวกับการตั้งค่า สภาพแวดล้อมในการพัฒนาซอฟต์แวร์สำหรับการใช้งาน MediaPipe ซึ่งรวมถึงเวอร์ชันแพลตฟอร์ม โปรดดูคู่มือการตั้งค่าสำหรับ iOS

การอ้างอิง

ตัวตรวจจับวัตถุใช้ไลบรารี MediaPipeTasksVision ซึ่งต้องติดตั้ง ด้วยการใช้ CocoaPods ไลบรารีใช้งานได้ทั้งกับแอป Swift และ Objective-C และไม่จำเป็นต้องมีการตั้งค่าเฉพาะภาษาใดๆ เพิ่มเติม

ดูวิธีการติดตั้ง CocoaPods ใน macOS ได้ที่ CocoaPods คู่มือการติดตั้ง หากต้องการทราบวิธีการสร้าง Podfile ด้วยพ็อดที่จำเป็นสำหรับ โปรดดูที่การใช้ CocoaPods

เพิ่มพ็อด MediaPipeTasksVision ใน Podfile โดยใช้โค้ดต่อไปนี้

target 'MyObjectDetectorApp' do
  use_frameworks!
  pod 'MediaPipeTasksVision'
end

หากแอปของคุณมีเป้าหมายการทดสอบ 1 หน่วย โปรดดูคู่มือการตั้งค่าสำหรับ iOS หากต้องการข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่า Podfile ของคุณ

รุ่น

งาน MediaPipe Object Detector ต้องการโมเดลที่ผ่านการฝึกอบรมซึ่งเข้ากันได้ กับงานนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโมเดลที่ผ่านการฝึกที่ใช้ได้สำหรับ ตัวตรวจจับวัตถุ โปรดดูภาพรวมงานโมเดล

เลือกและดาวน์โหลดโมเดล แล้วเพิ่มลงในไดเรกทอรีโปรเจ็กต์โดยใช้ Xcode โปรดดูวิธีเพิ่มไฟล์ลงในโปรเจ็กต์ Xcode ที่หัวข้อการจัดการ ไฟล์และโฟลเดอร์ใน Xcode โปรเจ็กต์

ใช้พร็อพเพอร์ตี้ BaseOptions.modelAssetPath เพื่อระบุเส้นทางไปยังโมเดล ใน App Bundle ของคุณ ดูตัวอย่างโค้ดได้ในส่วนถัดไป

สร้างงาน

คุณสามารถสร้างงานของตัวตรวจจับวัตถุได้โดยเรียกใช้ตัวเริ่มต้นรายการใดรายการหนึ่ง ตัวเริ่มต้น ObjectDetector(options:) กำหนดค่าตัวเลือกการกำหนดค่า รวมทั้งโหมดการวิ่ง ภาษาของชื่อที่แสดง จำนวนผลลัพธ์สูงสุด ความเชื่อมั่น เกณฑ์ รายการที่อนุญาตของหมวดหมู่ และรายการที่ปฏิเสธ

หากคุณไม่ต้องการให้ตัวตรวจจับออบเจ็กต์ที่เริ่มต้นโดยใช้การกำหนดค่าที่กำหนดเอง คุณสามารถใช้เครื่องมือเริ่มต้น ObjectDetector(modelPath:) เพื่อสร้าง เครื่องมือตรวจจับวัตถุที่มีตัวเลือกเริ่มต้น ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดค่า โปรดดูที่ภาพรวมการกำหนดค่า

งานการตรวจจับวัตถุรองรับข้อมูลอินพุต 3 ประเภท ได้แก่ ภาพนิ่งและไฟล์วิดีโอ และสตรีมวิดีโอสด โดยค่าเริ่มต้น ObjectDetector(modelPath:) จะเริ่มต้น สำหรับภาพนิ่ง เมื่อต้องการให้งานเริ่มต้นดำเนินการเพื่อประมวลผลวิดีโอ หรือสตรีมวิดีโอสด ให้ใช้ ObjectDetector(options:) เพื่อระบุวิดีโอ หรือไลฟ์สตรีมโหมดทำงาน นอกจากนี้โหมดสตรีมแบบสดยังต้องใช้ส่วนเสริม ตัวเลือกการกำหนดค่า objectDetectorLiveStreamDelegate ซึ่งทำให้ ตัวตรวจจับออบเจ็กต์เพื่อส่งผลลัพธ์การตรวจจับไปยังผู้รับมอบสิทธิ์แบบไม่พร้อมกัน

เลือกแท็บที่ตรงกับโหมดการวิ่งของคุณเพื่อดูวิธีสร้างงาน และเรียกใช้การอนุมาน

Swift

รูปภาพ

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = ObjectDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image
options.maxResults = 5

let objectDetector = try ObjectDetector(options: options)
    

วิดีโอ

import MediaPipeTasksVision

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = ObjectDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video
options.maxResults = 5

let objectDetector = try ObjectDetector(options: options)
    

สตรีมแบบสด

import MediaPipeTasksVision

// Class that conforms to the `ObjectDetectorLiveStreamDelegate` protocol and
// implements the method that the object detector calls once it
// finishes performing detection on each input frame.
class ObjectDetectorResultProcessor: NSObject, ObjectDetectorLiveStreamDelegate {

  func objectDetector(
    _ objectDetector: ObjectDetector,
    didFinishDetection objectDetectionResult: ObjectDetectorResult?,
    timestampInMilliseconds: Int,
    error: Error?) {
    // Process the detection result or errors here.
  }
}

let modelPath = Bundle.main.path(forResource: "model",
                                      ofType: "tflite")

let options = ObjectDetectorOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream
options.maxResults = 5

// Assign an object of the class to the `objectDetectorLiveStreamDelegate`
// property.
let processor = ObjectDetectorResultProcessor()
options.objectDetectorLiveStreamDelegate = processor

let objectDetector = try ObjectDetector(options: options)
    

Objective-C

รูปภาพ

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;
options.maxResults = 5;

MPPObjectDetector *objectDetector =
      [[MPPObjectDetector alloc] initWithOptions:options error:nil];
    

วิดีโอ

@import MediaPipeTasksVision;

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;
options.maxResults = 5;

MPPObjectDetector *objectDetector =
      [[MPPObjectDetector alloc] initWithOptions:options error:nil];
    

สตรีมแบบสด

@import MediaPipeTasksVision;

// Class that conforms to the `ObjectDetectorLiveStreamDelegate` protocol and
// implements the method that the object detector calls once it
// finishes performing detection on each input frame.

@interface APPObjectDetectorResultProcessor : NSObject 

@end

@implementation MPPObjectDetectorResultProcessor

-   (void)objectDetector:(MPPObjectDetector *)objectDetector
    didFinishDetectionWithResult:(MPPObjectDetectorResult *)ObjectDetectorResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the detection result or errors here.

}

@end

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"model"
                                                      ofType:@"tflite"];

MPPObjectDetectorOptions *options = [[MPPObjectDetectorOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;
options.maxResults = 5;

// Assign an object of the class to the `objectDetectorLiveStreamDelegate`
// property.
APPObjectDetectorResultProcessor *processor = [APPObjectDetectorResultProcessor new];
options.objectDetectorLiveStreamDelegate = processor;

MPPObjectDetector *objectDetector =
      [[MPPObjectDetector alloc] initWithOptions:options error:nil];
    

ตัวเลือกการกำหนดค่า

งานนี้มีตัวเลือกการกำหนดค่าต่อไปนี้สำหรับแอป iOS

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
runningMode ตั้งค่าโหมดการทำงานสำหรับงาน มี 3 แบบ โหมด:

รูปภาพ: โหมดสำหรับอินพุตรูปภาพเดียว

วิดีโอ: โหมดสำหรับเฟรมที่ถอดรหัสของวิดีโอ

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ resultsListener ต้องเป็น ถูกเรียกให้ตั้งค่า Listener เพื่อรับผลลัพธ์ แบบไม่พร้อมกัน
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
displayNamesLocales ตั้งค่าภาษาของป้ายกำกับที่จะใช้กับชื่อที่แสดงซึ่งระบุไว้ใน ข้อมูลเมตาของโมเดลงาน (หากมี) ค่าเริ่มต้นคือ en สำหรับ ภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลแล้วลงในข้อมูลเมตาของโมเดลที่กำหนดเองได้ โดยใช้ TensorFlow Lite Metadata Writer API รหัสภาษา en
maxResults ตั้งค่าจำนวนผลลัพธ์การตรวจหาคะแนนสูงสุด (ไม่บังคับ) เป็น ผลตอบแทน จำนวนบวกใดก็ได้ -1 (แสดงผลลัพธ์ทั้งหมด)
scoreThreshold ตั้งค่าเกณฑ์คะแนนการคาดการณ์ซึ่งจะลบล้างเกณฑ์ที่ระบุไว้ใน ข้อมูลเมตาของโมเดล (หากมี) ผลลัพธ์ที่ต่ำกว่าค่านี้ถูกปฏิเสธ ทศนิยมใดก็ได้ ไม่ได้ตั้งค่า
categoryAllowlist ตั้งค่ารายการชื่อหมวดหมู่ที่อนุญาตซึ่งไม่บังคับ หากไม่ว่างเปล่า ผลลัพธ์การตรวจจับที่มีชื่อหมวดหมู่ที่ไม่ได้อยู่ในชุดนี้จะ ถูกกรองออก ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้ไม่เกี่ยวข้องกับ categoryDenylist และใช้ ทั้งคู่จะทําให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า
categoryDenylist ตั้งค่ารายการตัวเลือกชื่อหมวดหมู่ที่ไม่ได้รับอนุญาต ถ้า ไม่ว่างเปล่า ระบบจะกรองผลลัพธ์การตรวจจับที่มีชื่อหมวดหมู่อยู่ในชุดนี้ ระบบจะไม่สนใจชื่อหมวดหมู่ที่ซ้ำกันหรือไม่รู้จัก ตัวเลือกนี้มีผลร่วมกัน เฉพาะตัวสำหรับ categoryAllowlist และการใช้ทั้ง 2 อย่างจะทำให้เกิดข้อผิดพลาด สตริงใดก็ได้ ไม่ได้ตั้งค่า

การกำหนดค่าสตรีมแบบสด

เมื่อตั้งค่าโหมดทำงานเป็นสตรีมแบบสด เครื่องมือตรวจจับวัตถุจำเป็นต้องใช้ ตัวเลือกการกำหนดค่า objectDetectorLiveStreamDelegate เพิ่มเติม จะทำให้ตัวตรวจจับส่งผลการตรวจจับแบบไม่พร้อมกัน ผู้รับมอบสิทธิ์ จะใช้ objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:) ซึ่งเครื่องมือตรวจจับออบเจ็กต์เรียกใช้หลังจากประมวลผลผลลัพธ์การตรวจจับสำหรับ แต่ละเฟรมได้

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
objectDetectorLiveStreamDelegate เปิดใช้ตัวตรวจจับออบเจ็กต์เพื่อรับผลการตรวจจับแบบไม่พร้อมกันใน โหมดสตรีมแบบสด คลาสที่มีการตั้งค่าอินสแตนซ์เป็นพร็อพเพอร์ตี้นี้จะต้อง ติดตั้งใช้งาน objectDetector(_:didFinishDetection:timestampInMilliseconds:error:) ไม่เกี่ยวข้อง ไม่ได้ตั้งค่า

เตรียมข้อมูล

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

เลือกรูปแบบรูปภาพ iOS ตามกรณีการใช้งานและโหมดการทำงาน แอปพลิเคชันต้องการ MPImage ยอมรับ UIImage, CVPixelBuffer และ CMSampleBuffer รูปแบบรูปภาพ iOS

UIImage

รูปแบบ UIImage เหมาะกับโหมดการวิ่งต่อไปนี้

  • รูปภาพ: รูปภาพจาก App Bundle แกลเลอรีของผู้ใช้ หรือระบบไฟล์ที่จัดรูปแบบเป็น แปลงรูปภาพ UIImage รูปเป็นวัตถุ MPImage ได้

  • วิดีโอ: ใช้ AVAssetImageGenerator เพื่อแยกเฟรมวิดีโอไปยัง CGImage รูปแบบ แล้วแปลงเป็น UIImage รูปภาพ

Swift

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(uiImage: image)
    

Objective-C

// Load an image on the user's device as an iOS `UIImage` object.

// Convert the `UIImage` object to a MediaPipe's Image object having the default
// orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

ตัวอย่างนี้จะเริ่มต้น MPImage ด้วยค่าเริ่มต้น UIImage.Orientation.Up การวางแนว คุณสามารถเริ่มต้น MPImage ด้วย UIImage.Orientation ตัวตรวจจับวัตถุไม่รองรับการวางแนวแบบมิเรอร์ เช่น .upMirrored .downMirrored, .leftMirrored, .rightMirrored

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ UIImage โปรดดูที่ UIImage ของ Apple Developer เอกสารประกอบ

CVPixelBuffer

รูปแบบ CVPixelBuffer เหมาะกับแอปพลิเคชันที่สร้างเฟรม และใช้ CoreImage ของ iOS สำหรับการประมวลผลข้อมูล

รูปแบบ CVPixelBuffer เหมาะกับโหมดการวิ่งต่อไปนี้

  • รูปภาพ: แอปที่สร้างรูปภาพ CVPixelBuffer รูปหลังจากประมวลผล ที่ใช้เฟรมเวิร์ก CoreImage ของ iOS สามารถส่งไปยังตัวตรวจจับวัตถุใน โหมดเรียกใช้รูปภาพ

  • วิดีโอ: แปลงเฟรมวิดีโอเป็นรูปแบบ CVPixelBuffer ได้สำหรับ ประมวลผล จากนั้นจึงส่งไปยังเครื่องมือตรวจจับออบเจ็กต์ในโหมดวิดีโอ

  • สตรีมแบบสด: ระบบอาจแปลงแอปที่ใช้กล้อง iOS ในการสร้างเฟรม เป็นรูปแบบ CVPixelBuffer เพื่อการประมวลผลก่อนที่จะส่งไปยัง ตัวตรวจจับวัตถุในโหมดสตรีมแบบสด

Swift

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(pixelBuffer: pixelBuffer)
    

Objective-C

// Obtain a CVPixelBuffer.

// Convert the `CVPixelBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithUIImage:image error:nil];
    

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับ CVPixelBuffer ได้ที่ CVPixelBuffer Apple นักพัฒนาซอฟต์แวร์ เอกสารประกอบ

CMSampleBuffer

รูปแบบ CMSampleBuffer จะจัดเก็บตัวอย่างสื่อของประเภทสื่อแบบเดียวกัน และ เหมาะกับโหมดทำงานของสตรีมแบบสด เฟรมแบบสดจากกล้อง iOS ส่งแบบไม่พร้อมกันในรูปแบบ CMSampleBuffer โดย iOS AVCaptureVideoDataOutput.

Swift

// Obtain a CMSampleBuffer.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the default
// orientation `UIImage.Orientation.up`.
let image = try MPImage(sampleBuffer: sampleBuffer)
    

Objective-C

// Obtain a `CMSampleBuffer`.

// Convert the `CMSampleBuffer` object to a MediaPipe's Image object having the
// default orientation `UIImageOrientationUp`.
MPImage *image = [[MPPImage alloc] initWithSampleBuffer:sampleBuffer error:nil];
    

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ CMSampleBuffer โปรดดู CMSampleBuffer Apple นักพัฒนาซอฟต์แวร์ เอกสารประกอบ

เรียกใช้งาน

ในการเรียกใช้ตัวตรวจจับวัตถุ ให้ใช้เมธอด detect() ที่เจาะจงสำหรับ โหมดทำงาน:

  • ภาพนิ่ง: detect(image:)
  • วิดีโอ: detect(videoFrame:timestampInMilliseconds:)
  • สตรีมแบบสด: detectAsync(image:)

ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างพื้นฐานของวิธีเรียกใช้เครื่องมือตรวจจับออบเจ็กต์ใน โหมดการทำงานต่างๆ ต่อไปนี้

Swift

รูปภาพ

let objectDetector.detect(image:image)
    

วิดีโอ

let objectDetector.detect(videoFrame:image)
    

สตรีมแบบสด

let objectDetector.detectAsync(image:image)
    

Objective-C

รูปภาพ

MPPObjectDetectorResult *result = [objectDetector detectInImage:image error:nil];
    

วิดีโอ

MPPObjectDetectorResult *result = [objectDetector detectInVideoFrame:image          timestampInMilliseconds:timestamp error:nil];
    

สตรีมแบบสด

BOOL success = [objectDetector detectAsyncInImage:image
                          timestampInMilliseconds:timestamp
                                            error:nil];
    

ตัวอย่างโค้ดเครื่องมือตรวจจับวัตถุแสดงการใช้งานของแต่ละโหมดเหล่านี้ รายละเอียดเพิ่มเติม detect(image:), detect(videoFrame:) และ detectAsync(image:) โค้ดตัวอย่างช่วยให้ผู้ใช้สลับไปมาระหว่าง โหมดการประมวลผลที่อาจไม่จำเป็นสำหรับกรณีการใช้งานของคุณ

โปรดทราบดังต่อไปนี้

  • เมื่อทำงานในโหมดวิดีโอหรือโหมดสตรีมแบบสด คุณต้องระบุ การประทับเวลาของเฟรมอินพุตกับงานตัวตรวจจับวัตถุ

  • เมื่อทำงานในโหมดรูปภาพหรือวิดีโอ งานตัวตรวจจับวัตถุจะบล็อก เทรดปัจจุบันจนกว่าจะประมวลผลรูปภาพหรือเฟรมอินพุตเสร็จสิ้น ถึง หลีกเลี่ยงการบล็อกเทรดปัจจุบัน เรียกใช้การประมวลผลในเบื้องหลัง เทรดโดยใช้ iOS ผู้มอบหมายหรือ NSOperation ของ Google

  • เมื่อทำงานในโหมดสตรีมแบบสด งานตัวตรวจจับวัตถุจะแสดงผลทันที และไม่บล็อกชุดข้อความปัจจุบัน โดยเรียกใช้ objectDetector(_objectDetector:didFinishDetection:timestampInMilliseconds:error:) กับผลลัพธ์การตรวจจับหลังจากประมวลผลเฟรมอินพุตแต่ละเฟรม ตัวตรวจจับวัตถุเรียกใช้เมธอดนี้แบบไม่พร้อมกันในอนุกรมเฉพาะ คิวการจัดส่งสินค้า สำหรับการแสดงผลลัพธ์ในอินเทอร์เฟซผู้ใช้ ให้มอบหมาย ไปยังคิวหลักหลังจากประมวลผลผลลัพธ์ หาก detectAsync จะถูกเรียกเมื่องานของตัวตรวจจับวัตถุไม่ว่างในการประมวลผล ตัวตรวจจับวัตถุจะไม่สนใจเฟรมอินพุตใหม่

จัดการและแสดงผลลัพธ์

เมื่อเรียกใช้การอนุมาน งานตัวตรวจจับออบเจ็กต์จะแสดงผล ObjectDetectorResult ซึ่งอธิบายออบเจ็กต์ที่พบในรูปภาพอินพุต

ตัวอย่างต่อไปนี้แสดงตัวอย่างข้อมูลเอาต์พุตจากงานนี้

ObjectDetectorResult:
 Detection #0:
  Box: (x: 355, y: 133, w: 190, h: 206)
  Categories:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1:
  Box: (x: 103, y: 15, w: 138, h: 369)
  Categories:
   index       : 17
   score       : 0.73047
   class name  : dog

รูปภาพต่อไปนี้แสดงการแสดงภาพเอาต์พุตของงาน

โค้ดตัวอย่าง Object Detector แสดงวิธีแสดงผลลัพธ์การตรวจจับ ที่ส่งคืนจากงาน โปรดดูรายละเอียดในตัวอย่างโค้ด