इमेज सेगमेंटर टास्क की मदद से, पहले से तय कैटगरी के आधार पर इमेज को अलग-अलग इलाकों में बांटा जा सकता है. साथ ही, बैकग्राउंड को धुंधला करने जैसे विज़ुअल इफ़ेक्ट इस्तेमाल किए जा सकते हैं. इन निर्देशों में, इमेज सेगमेंटर को 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 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 Metadata Writer API का इस्तेमाल करना होगा |
स्थानीय भाषा का कोड | 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 के डेवलपर दस्तावेज़ देखें.
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 के डेटासेट से ली गई सोर्स इमेज.
इमेज सेगमेंटर के उदाहरण वाले कोड से, इमेज सेगमेंटर के नतीजे दिखाने का तरीका पता चलता है. ज़्यादा जानकारी के लिए, कोड का उदाहरण देखें.