इमेज सेगमेंटर टैस्क की मदद से, पहले से तय की गई कैटगरी के आधार पर इमेज को अलग-अलग हिस्सों में बांटा जा सकता है. साथ ही, बैकग्राउंड को धुंधला करने जैसे विज़ुअल इफ़ेक्ट भी लागू किए जा सकते हैं. इन निर्देशों में, iOS ऐप्लिकेशन के साथ इमेज सेगमेंटर का इस्तेमाल करने का तरीका बताया गया है.
इन निर्देशों में बताया गया कोड सैंपल, GitHub पर उपलब्ध है.
वेब के लिए डिमो देखकर, इस टास्क को काम करते हुए देखा जा सकता है. इस टास्क की सुविधाओं, मॉडल, और कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानने के लिए, खास जानकारी देखें.
कोड का उदाहरण
MediaPipe Tasks कोड के उदाहरण में, iOS के लिए इमेज सेगमेंटर ऐप्लिकेशन को आसानी से लागू करने का तरीका बताया गया है.
इस उदाहरण में, इमेज सेगमेंटर का इस्तेमाल किया गया है, जो कैटगरी मास्क दिखाता है. यह लाइव कैमरे के फ़ीड या डिवाइस की गैलरी में मौजूद इमेज और वीडियो पर, इमेज सेगमेंटेशन करने के लिए, iOS डिवाइस के कैमरे का इस्तेमाल करता है.
इस ऐप्लिकेशन का इस्तेमाल, अपने iOS ऐप्लिकेशन के लिए शुरुआती बिंदु के तौर पर किया जा सकता है. इसके अलावा, किसी मौजूदा ऐप्लिकेशन में बदलाव करते समय, इसका इस्तेमाल किया जा सकता है. इमेज सेगमेंटर के उदाहरण का कोड, GitHub पर होस्ट किया गया है.
कोड डाउनलोड करना
यहां दिए गए निर्देशों में, git कमांड-लाइन टूल का इस्तेमाल करके, उदाहरण के कोड की लोकल कॉपी बनाने का तरीका बताया गया है.
उदाहरण के तौर पर दिया गया कोड डाउनलोड करने के लिए:
यहां दिए गए कमांड का इस्तेमाल करके, Git डेटा स्टोर करने की जगह को क्लोन करें:
git clone https://github.com/google-ai-edge/mediapipe-samples/
इसके अलावा, अपने git इंस्टेंस को स्पैर्स चेकआउट का इस्तेमाल करने के लिए कॉन्फ़िगर करें, ताकि आपके पास सिर्फ़ Image Segmenter के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें हों:
cd mediapipe-samples git sparse-checkout init --cone git sparse-checkout set examples/image_segmentation/ios/
उदाहरण के तौर पर दिए गए कोड का लोकल वर्शन बनाने के बाद, MediaPipe टास्क लाइब्रेरी इंस्टॉल की जा सकती है. इसके बाद, Xcode का इस्तेमाल करके प्रोजेक्ट खोलें और ऐप्लिकेशन चलाएं. निर्देशों के लिए, iOS के लिए सेटअप गाइड देखें.
मुख्य कॉम्पोनेंट
नीचे दी गई फ़ाइलों में, इमेज सेगमेंटर के उदाहरण वाले ऐप्लिकेशन के लिए ज़रूरी कोड शामिल है:
- ImageSegmenterService.swift: यह Image Segmenter को शुरू करता है, मॉडल चुनने की प्रोसेस को मैनेज करता है, और इनपुट डेटा पर अनुमान लगाता है.
- CameraViewController.swift: यह लाइव कैमरा फ़ीड इनपुट मोड के लिए यूज़र इंटरफ़ेस (यूआई) लागू करता है और नतीजों को विज़ुअलाइज़ करता है.
- MediaLibraryViewController.swift, स्टिल इमेज और वीडियो फ़ाइल इनपुट मोड के लिए यूज़र इंटरफ़ेस (यूआई) लागू करता है और नतीजों को विज़ुअलाइज़ करता है.
सेटअप
इस सेक्शन में, इमेज सेगमेंटर का इस्तेमाल करने के लिए, डेवलपमेंट एनवायरमेंट और कोड प्रोजेक्ट सेट अप करने के मुख्य चरणों के बारे में बताया गया है. MediaPipe Tasks का इस्तेमाल करने के लिए, डेवलपमेंट एनवायरमेंट सेट अप करने के बारे में सामान्य जानकारी पाने के लिए, iOS के लिए सेटअप गाइड देखें. इसमें, प्लैटफ़ॉर्म के वर्शन से जुड़ी ज़रूरी शर्तें भी शामिल हैं.
डिपेंडेंसी
Image Segmenter, MediaPipeTasksVision
लाइब्रेरी का इस्तेमाल करता है. इसे CocoaPods का इस्तेमाल करके इंस्टॉल करना ज़रूरी है. यह लाइब्रेरी, Swift और Objective-C, दोनों तरह के ऐप्लिकेशन के साथ काम करती है. साथ ही, इसके लिए भाषा के हिसाब से किसी अन्य सेटअप की ज़रूरत नहीं होती.
macOS पर CocoaPods इंस्टॉल करने के निर्देशों के लिए, CocoaPods को इंस्टॉल करने की गाइड देखें.
अपने ऐप्लिकेशन के लिए ज़रूरी पॉड के साथ Podfile
बनाने का तरीका जानने के लिए, CocoaPods का इस्तेमाल करना लेख पढ़ें.
नीचे दिए गए कोड का इस्तेमाल करके, Podfile
में MediaPipeTasksVision पॉड जोड़ें:
target 'MyImageSegmenterApp' do
use_frameworks!
pod 'MediaPipeTasksVision'
end
अगर आपके ऐप्लिकेशन में यूनिट टेस्ट टारगेट शामिल हैं, तो Podfile
को सेट अप करने के बारे में ज़्यादा जानकारी के लिए, iOS के लिए सेट अप करने की गाइड देखें.
मॉडल
MediaPipe Image Segmenter टास्क के लिए, ट्रेन किए गए ऐसे मॉडल की ज़रूरत होती है जो इस टास्क के साथ काम करता हो. इमेज सेगमेंटर के लिए, पहले से ट्रेन किए गए उपलब्ध मॉडल के बारे में ज़्यादा जानकारी के लिए, टास्क की खास जानकारी वाला मॉडल सेक्शन देखें.
कोई मॉडल चुनें और डाउनलोड करें. इसके बाद, Xcode का इस्तेमाल करके उसे अपनी प्रोजेक्ट डायरेक्ट्री में जोड़ें. अपने Xcode प्रोजेक्ट में फ़ाइलें जोड़ने का तरीका जानने के लिए, अपने Xcode प्रोजेक्ट में फ़ाइलों और फ़ोल्डर को मैनेज करना लेख पढ़ें.
अपने ऐप्लिकेशन बंडल में मॉडल का पाथ बताने के लिए, BaseOptions.modelAssetPath
प्रॉपर्टी का इस्तेमाल करें. कोड का उदाहरण देखने के लिए, अगला सेक्शन देखें.
टास्क बनाना
इमेज सेगमेंटर टास्क बनाने के लिए, उसके किसी एक इनिशलाइज़र को कॉल करें. ImageSegmenter(options:)
initializer, कॉन्फ़िगरेशन के विकल्पों के लिए वैल्यू स्वीकार करता है.
अगर आपको पसंद के मुताबिक कॉन्फ़िगरेशन के विकल्पों के साथ शुरू किए गए इमेज सेगमेंटर की ज़रूरत नहीं है, तो डिफ़ॉल्ट विकल्पों के साथ इमेज सेगमेंटर बनाने के लिए, ImageSegmenter(modelPath:)
शुरू करने वाले टूल का इस्तेमाल किया जा सकता है. कॉन्फ़िगरेशन के विकल्पों के बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन की खास जानकारी देखें.
इमेज सेगमेंटर टास्क, इनपुट डेटा के तीन टाइप के साथ काम करता है: स्टिल इमेज, वीडियो फ़ाइलें, और लाइव वीडियो स्ट्रीम. डिफ़ॉल्ट रूप से, 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 |
टास्क के लिए रनिंग मोड सेट करता है. इसके तीन मोड हैं: IMAGE: एक इमेज इनपुट के लिए मोड. वीडियो: किसी वीडियो के डिकोड किए गए फ़्रेम के लिए मोड. 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 मेटाडेटा राइटर एपीआई का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के लेबल जोड़े जा सकते हैं |
स्थानीय भाषा का कोड | en |
result_callback |
जब इमेज सेगमेंटर 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
फ़ॉर्मैट, इन रनिंग मोड के लिए सबसे सही है:
इमेज: ऐप्लिकेशन बंडल, उपयोगकर्ता की गैलरी या फ़ाइल सिस्टम में मौजूद इमेज को
MPImage
ऑब्जेक्ट में बदला जा सकता है. हालांकि, इसके लिए ज़रूरी है कि इमेज कोUIImage
फ़ॉर्मैट में फ़ॉर्मैट किया गया हो.वीडियो: 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];
इस उदाहरण में, डिफ़ॉल्ट UIImage.Orientation.Up ओरिएंटेशन के साथ MPImage
को शुरू किया गया है. MPImage
को इस्तेमाल की जा सकने वाली किसी भी UIImage.Orientation वैल्यू के साथ शुरू किया जा सकता है. इमेज सेगमेंटर, .upMirrored
,
.downMirrored
, .leftMirrored
, .rightMirrored
जैसे मिरर किए गए ओरिएंटेशन के साथ काम नहीं करता.
UIImage
के बारे में ज़्यादा जानकारी के लिए, UIImage Apple Developer के दस्तावेज़ देखें.
CVPixelBuffer
CVPixelBuffer
फ़ॉर्मैट, उन ऐप्लिकेशन के लिए सबसे सही है जो फ़्रेम जनरेट करते हैं और प्रोसेसिंग के लिए iOS CoreImage फ़्रेमवर्क का इस्तेमाल करते हैं.
CVPixelBuffer
फ़ॉर्मैट, इन रनिंग मोड के लिए सबसे सही है:
इमेज: iOS के
CoreImage
फ़्रेमवर्क का इस्तेमाल करके, कुछ प्रोसेस करने के बादCVPixelBuffer
इमेज जनरेट करने वाले ऐप्लिकेशन को इमेज रनिंग मोड में, इमेज सेगमेंटर को भेजा जा सकता है.वीडियो: वीडियो फ़्रेम को प्रोसेस करने के लिए,
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 Developer दस्तावेज़ देखें.
CMSampleBuffer
CMSampleBuffer
फ़ॉर्मैट, एक जैसे मीडिया टाइप के मीडिया सैंपल को सेव करता है. साथ ही, यह लाइव स्ट्रीम के रनिंग मोड के लिए काफ़ी सही है. iOS कैमरों से लाइव फ़्रेम, iOS AVCaptureVideoDataOutput की मदद से, CMSampleBuffer
फ़ॉर्मैट में अलग-अलग डिलीवर किए जाते हैं.
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:)
नीचे दिए गए कोड सैंपल में, इन अलग-अलग मोड में Image Segmenter को चलाने के आसान उदाहरण दिए गए हैं:
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 के Dispatch या NSOperation फ़्रेमवर्क का इस्तेमाल करके, बैकग्राउंड थ्रेड में प्रोसेसिंग को पूरा करें.
लाइव स्ट्रीम मोड में चलने पर, इमेज सेगमेंटर टास्क तुरंत रिटर्न करता है और मौजूदा थ्रेड को ब्लॉक नहीं करता. यह हर इनपुट फ़्रेम को प्रोसेस करने के बाद, इमेज सेगमेंटर के साथ
imageSegmenter(_:didFinishSegmentation:timestampInMilliseconds:error:)
तरीका शुरू करता है. इमेज सेगमेंटर, इस तरीके को किसी खास सीरियल डिस्पैच कतार पर एसिंक्रोनस तरीके से लागू करता है. यूज़र इंटरफ़ेस पर नतीजे दिखाने के लिए, नतीजों को प्रोसेस करने के बाद, उन्हें मुख्य सूची में भेजें. अगर इमेज सेगमेंटर टास्क किसी दूसरे फ़्रेम को प्रोसेस कर रहा है, तोsegmentAsync
फ़ंक्शन को कॉल करने पर, इमेज सेगमेंटर नए इनपुट फ़्रेम को अनदेखा कर देता है.
नतीजों को मैनेज और दिखाना
अनुमान लगाने की प्रोसेस पूरी होने पर, इमेज सेगमेंटर टास्क एक ImageSegmenterResult
ऑब्जेक्ट दिखाता है. इसमें सेगमेंटेशन टास्क के नतीजे होते हैं. आउटपुट का कॉन्टेंट, टास्क को कॉन्फ़िगर करते समय सेट किए गए आउटपुट टाइप पर निर्भर करता है.
नीचे दी गई इमेज में, कैटगरी वैल्यू मास्क के लिए टास्क के आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है. कैटगरी मास्क की रेंज [0, 255]
है और हर पिक्सल वैल्यू, मॉडल के आउटपुट की विजेता कैटगरी के इंडेक्स को दिखाती है. जीतने वाली कैटगरी के इंडेक्स का स्कोर, उन सभी कैटगरी के स्कोर से ज़्यादा होता है जिन्हें मॉडल पहचान सकता है.
ओरिजनल इमेज और कैटगरी मास्क का आउटपुट. Pascal VOC 2012 के डेटासेट से ली गई सोर्स इमेज.
इमेज सेगमेंटर के उदाहरण वाले कोड से पता चलता है कि इमेज सेगमेंटर के नतीजे कैसे दिखाए जाते हैं. ज़्यादा जानकारी के लिए, कोड का उदाहरण देखें.