คู่มือการจัดประเภทรูปภาพสําหรับ iOS

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ตั้งค่า

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

การอ้างอิง

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

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

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

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

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

รุ่น

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

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

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

สร้างงาน

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

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

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

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

Swift

รูปภาพ

import MediaPipeTasksVision

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

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

let imageClassifier = try ImageClassifier(options: options)
    

วิดีโอ

import MediaPipeTasksVision

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

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

let imageClassifier = try ImageClassifier(options: options)
    

ไลฟ์สด

import MediaPipeTasksVision

// Class that conforms to the `ImageClassifierLiveStreamDelegate` protocol and
// implements the method that the image classifier calls once it
// finishes performing classification on each input frame.
class ImageClassifierResultProcessor: NSObject, ImageClassifierLiveStreamDelegate {

   func imageClassifier(
    _ imageClassifier: ImageClassifier,
    didFinishClassification result: ImageClassifierResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the image classifier result or errors here.

  }
}

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

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

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

let imageClassifier = try ImageClassifier(options: options)
    

Objective-C

รูปภาพ

@import MediaPipeTasksVision;

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

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

MPPImageClassifier *imageClassifier =
      [[MPPImageClassifier alloc] initWithOptions:options error:nil];
    

วิดีโอ

@import MediaPipeTasksVision;

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

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

MPPImageClassifier *imageClassifier =
      [[MPPImageClassifier alloc] initWithOptions:options error:nil];
    

ไลฟ์สด

@import MediaPipeTasksVision;

// Class that conforms to the `MPPImageClassifierLiveStreamDelegate` protocol
// and implements the method that the image classifier calls once it finishes
// performing classification on each input frame.

@interface APPImageClassifierResultProcessor : NSObject 

@end

@implementation APPImageClassifierResultProcessor

-   (void)imageClassifier:(MPPImageClassifier *)imageClassifier
    didFinishClassificationWithResult:(MPPImageClassifierResult *)imageClassifierResult
              timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                                error:(NSError *)error {

    // Process the image classifier result or errors here.

}

@end

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

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

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

MPPImageClassifier *imageClassifier =
      [[MPPImageClassifier alloc] initWithOptions:options error:nil];
    

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

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

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

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

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

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

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

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

ชื่อตัวเลือก คำอธิบาย ช่วงค่า ค่าเริ่มต้น
imageClassifierLiveStreamDelegate เปิดใช้ตัวแยกประเภทรูปภาพเพื่อรับผลการจัดประเภทแบบไม่พร้อมกัน ในโหมดสตรีมแบบสด คลาสที่มีการตั้งค่าอินสแตนซ์เป็นพร็อพเพอร์ตี้นี้จะต้อง ติดตั้งใช้งาน imageClassifier(_:didFinishClassification: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 นักพัฒนาซอฟต์แวร์ เอกสารประกอบ

เรียกใช้งาน

หากต้องการเรียกใช้ตัวแยกประเภทรูปภาพ ให้ใช้เมธอด classify() เฉพาะ โหมดทำงาน:

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

ตัวแยกประเภทรูปภาพจะแสดงหมวดหมู่ที่เป็นไปได้สำหรับวัตถุภายใน รูปภาพหรือเฟรมที่ป้อน

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

Swift

รูปภาพ

let result = try imageClassifier.classify(image: image)
    

วิดีโอ

let result = try imageClassifier.classify(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

ไลฟ์สด

try imageClassifier.classifyAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

รูปภาพ

MPPImageClassifierResult *result = [imageClassifier classifyImage:image
                                                            error:nil];
    

วิดีโอ

MPPImageClassifierResult *result = [imageClassifier classifyVideoFrame:image
                                               timestampInMilliseconds:timestamp
                                                                 error:nil];
    

ไลฟ์สด

BOOL success = [imageClassifier classifyAsyncImage:image
                          timestampInMilliseconds:timestamp
                                            error:nil];
    

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

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

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

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

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

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

เมื่อใช้การอนุมาน งานตัวแยกประเภทรูปภาพจะแสดงผล ออบเจ็กต์ ImageClassifierResult รายการที่มีรายการหมวดหมู่ที่เป็นไปได้ สำหรับวัตถุภายในรูปภาพหรือเฟรมอินพุต

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

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

ผลลัพธ์นี้มาจากการเรียกใช้ Bird Classifier ใน:

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