งานตัวแยกประเภทรูปภาพให้คุณทําการแยกประเภทรูปภาพได้ คุณสามารถใช้งานนี้เพื่อระบุว่ารูปภาพแสดงถึงอะไรในชุดหมวดหมู่ที่กำหนดไว้ในเวลาฝึก คำแนะนำเหล่านี้จะแสดงวิธีการใช้ตัวแยกประเภทรูปภาพในแอป iOS ตัวอย่างโค้ดที่อธิบายไว้ในวิธีการเหล่านี้มีอยู่ใน GitHub
คุณดูการใช้งานจริงของงานนี้ได้โดยดูการสาธิตการใช้เว็บนี้ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสามารถ โมเดล และตัวเลือกการกำหนดค่าของงานนี้ โปรดดูที่ภาพรวม
ตัวอย่างโค้ด
โค้ดตัวอย่าง MediaPipe Tasks เป็นการใช้งานพื้นฐานของแอปตัวแยกประเภทรูปภาพสำหรับ iOS ตัวอย่างนี้ใช้กล้องบนอุปกรณ์ iOS จริงในการแยกประเภทออบเจ็กต์อย่างต่อเนื่อง และยังใช้รูปภาพและวิดีโอจากแกลเลอรีของอุปกรณ์เพื่อจำแนกออบเจ็กต์แบบคงที่ได้ด้วย
คุณสามารถใช้แอปเป็นจุดเริ่มต้นสำหรับแอป iOS ของคุณเอง หรือใช้อ้างอิงเมื่อแก้ไขแอปที่มีอยู่ โค้ดตัวอย่างตัวแยกประเภทรูปภาพจะโฮสต์อยู่ใน GitHub
ดาวน์โหลดโค้ด
วิธีการต่อไปนี้แสดงวิธีสร้างสำเนาโค้ดตัวอย่างในเครื่องโดยใช้เครื่องมือบรรทัดคำสั่ง git
วิธีดาวน์โหลดโค้ดตัวอย่าง
โคลนที่เก็บ Git โดยใช้คำสั่งต่อไปนี้
git clone https://github.com/google-ai-edge/mediapipe-samples
คุณสามารถเลือกกำหนดค่าอินสแตนซ์ 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 หน่วย โปรดดูข้อมูลการตั้งค่า Podfile
เพิ่มเติมในคู่มือการตั้งค่าสำหรับ iOS
รุ่น
งานตัวแยกประเภทรูปภาพ 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 ไม่ได้ และการใช้ทั้ง 2 อย่างจะทำให้เกิดข้อผิดพลาด |
สตริงใดก็ได้ | ไม่ได้ตั้งค่า |
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
ได้ที่เอกสารสำหรับนักพัฒนาซอฟต์แวร์ Apple ด้าน UIImage
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
ได้ที่เอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ Apple ของ CVPixelBuffer
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
ได้ในเอกสารประกอบสำหรับนักพัฒนาซอฟต์แวร์ Apple ของ CMSampleBuffer
เรียกใช้งาน
หากต้องการเรียกใช้ตัวแยกประเภทรูปภาพ ให้ใช้เมธอด 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 Dispatch หรือ NSOperation
เมื่อทำงานในโหมดสตรีมแบบสด งานตัวแยกประเภทรูปภาพจะแสดงผลทันทีและไม่บล็อกชุดข้อความปัจจุบัน โดยจะเรียกใช้เมธอด
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 ใน:
โค้ดตัวอย่างตัวแยกประเภทรูปภาพแสดงวิธีแสดงผลการจัดประเภทที่แสดงผลจากงาน ดูรายละเอียดได้ในตัวอย่างโค้ด