คู่มือการแบ่งกลุ่มรูปภาพสำหรับ 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_segmentation/ios/
    

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

องค์ประกอบหลัก

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

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

ตั้งค่า

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

การอ้างอิง

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

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

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

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

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

รุ่น

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

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

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

สร้างงาน

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

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

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

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

Swift

รูปภาพ

import MediaPipeTasksVision

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

let options = ImageSegmenterOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .image
options.shouldOutputCategoryMask = true
options.shouldOutputConfidenceMasks = false

let imageSegmenter = try ImageSegmenter(options: options)
    

วิดีโอ

import MediaPipeTasksVision

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

let options = ImageSegmenterOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .video
options.shouldOutputCategoryMask = true
options.shouldOutputConfidenceMasks = false

let imageSegmenter = try ImageSegmenter(options: options)
    

ไลฟ์สด

import MediaPipeTasksVision

// Class that conforms to the `imageSegmenterLiveStreamDelegate` protocol and
// implements the method that the image segmenter calls once it finishes
// performing segmentation of each input frame.
class ImageSegmenterResultProcessor: NSObject, ImageSegmenterLiveStreamDelegate {

  func imageSegmenter(
    _ imageSegmenter: ImageSegmenter,
    didFinishSegmentation result: ImageSegmenterResult?,
    timestampInMilliseconds: Int,
    error: Error?) {

    // Process the image segmentation result or errors here.

  }
}

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

let options = ImageSegmenterOptions()
options.baseOptions.modelAssetPath = modelPath
options.runningMode = .liveStream
options.shouldOutputCategoryMask = true
options.shouldOutputConfidenceMasks = false

// Set `imageSegmenterLiveStreamDelegate` to the object of the class that
// confirms to the `ImageSegmenterLiveStreamDelegate` protocol.
let processor = ImageSegmenterResultProcessor()
options.imageSegmenterLiveStreamDelegate = processor

let imageSegmenter = try ImageSegmenter(options: options)
    

Objective-C

รูปภาพ

@import MediaPipeTasksVision;

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

MPPImageSegmenterOptions *options = [[MPPImageSegmenterOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeImage;
options.shouldOutputCategoryMask = YES;
options.shouldOutputConfidenceMasks = NO;

MPPImageSegmenter *imageSegmenter =
  [[MPPImageSegmenter alloc] initWithOptions:options error:nil];
    

วิดีโอ

@import MediaPipeTasksVision;

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

MPPImageSegmenterOptions *options = [[MPPImageSegmenterOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeVideo;
options.shouldOutputCategoryMask = YES;
options.shouldOutputConfidenceMasks = NO;

MPPImageSegmenter *imageSegmenter =
  [[MPPImageSegmenter alloc] initWithOptions:options error:nil];
    

ไลฟ์สด

@import MediaPipeTasksVision;

// Class that conforms to the `MPPImageSegmenterLiveStreamDelegate` protocol
// and implements the method that the image segmenter calls once it finishes
// performing segmentation of each input frame.

@interface APPImageSegmenterResultProcessor : NSObject 

@end

@implementation APPImageSegmenterResultProcessor

-   (void)imageSegmenter:(MPPImageSegmenter *)imageSegmenter
    didFinishSegmentationWithResult:(MPPImageSegmenterResult *)imageSegmenterResult
         timestampInMilliseconds:(NSInteger)timestampInMilliseconds
                           error:(NSError *)error {

    // Process the image segmentation result or errors here.

}

@end

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

MPPImageSegmenterOptions *options = [[MPPImageSegmenterOptions alloc] init];
options.baseOptions.modelAssetPath = modelPath;
options.runningMode = MPPRunningModeLiveStream;
options.shouldOutputCategoryMask = YES;
options.shouldOutputConfidenceMasks = NO;

// Set `imageSegmenterLiveStreamDelegate` to the object of the class that
// confirms to the `MPPImageSegmenterLiveStreamDelegate` protocol.
APPImageSegmenterResultProcessor *processor =
  [APPImageSegmenterResultProcessor new];
options.imageSegmenterLiveStreamDelegate = processor;

MPPImageSegmenter *imageSegmenter =
  [[MPPImageSegmenter alloc] initWithOptions:options error:nil];
    

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

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

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

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

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

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

LIVE_STREAM: โหมดสำหรับสตรีมแบบสดของอินพุต เช่น ข้อมูลจากกล้อง ในโหมดนี้ ImageSegmenterLiveStreamDelegate ต้องตั้งค่าเป็นอินสแตนซ์ของคลาสที่นำฟังก์ชัน ImageSegmenterLiveStreamDelegateเพื่อรับการแบ่งกลุ่ม ไม่พร้อมกัน
{RunningMode.image, RunningMode.video, RunningMode.liveStream} RunningMode.image
shouldOutputCategoryMask หากตั้งค่าเป็น True เอาต์พุตจะมีมาสก์การแบ่งกลุ่ม เป็นรูปภาพ uint8 โดยที่ค่าพิกเซลแต่ละค่าจะระบุหมวดหมู่ที่ชนะ {True, False} False
shouldOutputConfidenceMasks หากตั้งค่าเป็น True เอาต์พุตจะมีมาสก์การแบ่งกลุ่ม เป็นภาพค่าจำนวนลอยตัว โดยที่ค่าจำนวนลอยตัวแต่ละค่าแสดงความเชื่อมั่น ตารางคะแนนของหมวดหมู่ {True, False} True
displayNamesLocale ตั้งค่าภาษาของป้ายกำกับที่จะใช้กับชื่อที่แสดงซึ่งระบุไว้ใน ข้อมูลเมตาของโมเดลงาน (หากมี) ค่าเริ่มต้นคือ en สำหรับ ภาษาอังกฤษ คุณเพิ่มป้ายกำกับที่แปลแล้วลงในข้อมูลเมตาของโมเดลที่กำหนดเองได้ โดยใช้ TensorFlow Lite Metadata Writer API รหัสภาษา en
result_callback ตั้งค่า Listener ผลลัพธ์เพื่อรับผลลัพธ์การแบ่งกลุ่ม แบบไม่พร้อมกันเมื่อตัวแบ่งกลุ่มรูปภาพอยู่ในโหมด LIVE_STREAM ใช้ได้เมื่อตั้งค่าโหมดวิ่งเป็น LIVE_STREAM เท่านั้น ไม่มี ไม่มี

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

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

เรียกใช้งาน

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

  • ภาพนิ่ง: segment(image:)
  • วิดีโอ: segment(videoFrame:timestampInMilliseconds:)
  • สตรีมสด: segmentAsync(image:timestampInMilliseconds:)

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

Swift

รูปภาพ

let result = try imageSegmenter.segment(image: image)
    

วิดีโอ

let result = try imageSegmenter.segment(
  videoFrame: image,
  timestampInMilliseconds: timestamp)
    

สตรีมแบบสด

try imageSegmenter.segmentAsync(
  image: image,
  timestampInMilliseconds: timestamp)
    

Objective-C

รูปภาพ

MPPImageSegmenterResult *result =
  [imageSegmenter segmentImage:image error:nil];
    

วิดีโอ

MPPImageSegmenterResult *result =
  [imageSegmenter segmentVideoFrame:image
            timestampInMilliseconds:timestamp
                              error:nil];
    

สตรีมแบบสด

BOOL success =
  [imageSegmenter segmentAsyncImage:image
            timestampInMilliseconds:timestamp
                              error:nil];
    

ตัวอย่างโค้ดตัวแบ่งกลุ่มรูปภาพแสดงการใช้งานของแต่ละโหมดเหล่านี้ รายละเอียดเพิ่มเติม segment(image:) segment(videoFrame:timestampInMilliseconds:) และ segmentAsync(image:timestampInMilliseconds:)

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

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

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

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

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

หลังจากเรียกใช้การอนุมาน งานเครื่องมือแบ่งกลุ่มรูปภาพจะแสดงผล ImageSegmenterResult ซึ่งมีผลลัพธ์ของงานการแบ่งกลุ่ม เนื้อหาของ เอาต์พุตจะขึ้นอยู่กับประเภทเอาต์พุตที่คุณตั้งค่าไว้เมื่อ กำหนดค่าแล้ว งานนั้น

รูปภาพต่อไปนี้แสดงภาพเอาต์พุตงานสำหรับหมวดหมู่ มาสก์ค่า ช่วงมาสก์หมวดหมู่คือ [0, 255] และค่าพิกเซลแต่ละค่า แสดงดัชนีหมวดหมู่ที่ชนะของเอาต์พุตโมเดล หมวดหมู่ที่ชนะ ดัชนีได้คะแนนสูงสุดในบรรดาหมวดหมู่ ที่โมเดลสามารถรับรู้ได้

ผลลัพธ์มาสก์รูปภาพและหมวดหมู่ต้นฉบับ แหล่งที่มาของรูปภาพจาก VOC ของ Pascal ปี 2012 ชุดข้อมูล

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