Android के लिए, इमेज सेगमेंटेशन गाइड

MediaPipe इमेज सेगमेंटर टास्क की मदद से आप इमेज को पहले से तय श्रेणियों के आधार पर क्षेत्रों में बांट सकते हैं, ताकि बैकग्राउंड धुंधला करने जैसे विज़ुअल इफ़ेक्ट लागू किए जा सकें. इन निर्देशों से आपको पता चलता है कि Android ऐप्लिकेशन के साथ इमेज सेगमेंटर कैसे इस्तेमाल किया जा सकता है. इन निर्देशों में बताया गया कोड का उदाहरण, GitHub पर उपलब्ध है. इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

MediaPipe Tasks कोड के उदाहरण में Android के लिए इमेज सेगमेंटर ऐप्लिकेशन को दो आसान तरीकों से लागू किया जाता है:

इन उदाहरणों में, लाइव कैमरा फ़ीड पर इमेज को अलग-अलग सेगमेंट में बांटने के लिए, फ़िज़िकल Android डिवाइस पर कैमरे का इस्तेमाल किया गया है. इसके अलावा, डिवाइस की गैलरी से इमेज और वीडियो भी चुने जा सकते हैं. इन ऐप्लिकेशन को, अपने Android ऐप्लिकेशन के लिए शुरुआती पॉइंट के तौर पर इस्तेमाल किया जा सकता है. इसके अलावा, किसी मौजूदा ऐप्लिकेशन में बदलाव करते समय इनका इस्तेमाल भी किया जा सकता है. इमेज सेगमेंटर का उदाहरण कोड GitHub पर होस्ट किया गया है.

नीचे दिए गए सेक्शन, कैटगरी मास्क वाले इमेज सेगमेंटर ऐप्लिकेशन के बारे में बताते हैं.

कोड डाउनलोड करें

नीचे दिए गए निर्देशों में git कमांड लाइन टूल का इस्तेमाल करके, उदाहरण कोड की लोकल कॉपी बनाने का तरीका बताया गया है.

उदाहरण कोड डाउनलोड करने के लिए:

  1. नीचे दिए गए निर्देश का इस्तेमाल करके, गिट रिपॉज़िटरी का क्लोन बनाएं:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, स्पार्स चेकआउट का इस्तेमाल करने के लिए अपना गिट इंस्टेंस कॉन्फ़िगर करें, ताकि आपके पास सिर्फ़ इमेज सेगमेंटर के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें रहें:
    cd mediapipe
    git sparse-checkout init --cone
    git sparse-checkout set examples/image_segmentation/android
    

उदाहरण कोड का स्थानीय वर्शन बनाने के बाद, प्रोजेक्ट को Android Studio में इंपोर्ट किया जा सकता है. इसके बाद, ऐप्लिकेशन को चलाया जा सकता है. निर्देशों के लिए, Android के लिए सेटअप गाइड देखें.

मुख्य कॉम्पोनेंट

नीचे दी गई फ़ाइलों में इस इमेज सेगमेंटेशन के उदाहरण ऐप्लिकेशन के लिए ज़रूरी कोड मौजूद है:

  • ImageSegmenterHelper.kt - इमेज सेगमेंटर टास्क शुरू करता है और मॉडल और प्रतिनिधि चुनने का काम मैनेज करता है.
  • CameraFragment.kt - कैमरे के लिए यूज़र इंटरफ़ेस और कंट्रोल कोड देता है.
  • GalleryFragment.kt - इमेज और वीडियो फ़ाइलों को चुनने के लिए, यूज़र इंटरफ़ेस और कंट्रोल कोड देता है.
  • OverlayView.kt - सेगमेंटेशन के नतीजों को मैनेज और फ़ॉर्मैट करता है.

सेटअप

इस सेक्शन में, इमेज सेगमेंटर का इस्तेमाल करने के लिए डेवलपमेंट एनवायरमेंट को सेट अप करने और कोड प्रोजेक्ट सेट करने के मुख्य चरणों के बारे में बताया गया है. MediaPipe Tasks का इस्तेमाल करने और प्लैटफ़ॉर्म के वर्शन की ज़रूरी शर्तों के साथ-साथ अपना डेवलपमेंट एनवायरमेंट सेट अप करने से जुड़ी सामान्य जानकारी के लिए, Android के लिए सेटअप गाइड देखें.

डिपेंडेंसी

इमेज सेगमेंटर, com.google.mediapipe:tasks-vision लाइब्रेरी का इस्तेमाल करता है. इस डिपेंडेंसी को अपने Android ऐप्लिकेशन डेवलपमेंट प्रोजेक्ट की build.gradle फ़ाइल में जोड़ें. नीचे दिए गए कोड के साथ ज़रूरी डिपेंडेंसी इंपोर्ट करें:

dependencies {
    ...
    implementation 'com.google.mediapipe:tasks-vision:latest.release'
}

मॉडल

MediaPipe इमेज सेगमेंटर टास्क के लिए एक प्रशिक्षित मॉडल की ज़रूरत होती है, जो इस टास्क के साथ काम कर सके. इमेज सेगमेंटर के लिए उपलब्ध प्रशिक्षित मॉडल के बारे में ज़्यादा जानकारी के लिए, टास्क की खास जानकारी वाला मॉडल सेक्शन देखें.

मॉडल चुनें और डाउनलोड करें और फिर इसे अपनी प्रोजेक्ट डायरेक्ट्री में स्टोर करें:

<dev-project-root>/src/main/assets

मॉडल के इस्तेमाल किए गए पाथ के बारे में बताने के लिए BaseOptions.Builder.setModelAssetPath() तरीके का इस्तेमाल करें. इस तरीके की जानकारी अगले सेक्शन में दिए गए कोड उदाहरण में दी गई है.

इमेज सेगमेंटर उदाहरण कोड में, मॉडल को setupImageSegmenter() फ़ंक्शन में ImageSegmenterHelper.kt क्लास में तय किया गया है.

टास्क बनाएं

टास्क बनाने के लिए, createFromOptions फ़ंक्शन का इस्तेमाल किया जा सकता है. createFromOptions फ़ंक्शन, कॉन्फ़िगरेशन के विकल्प स्वीकार करता है. इनमें मास्क आउटपुट टाइप भी शामिल हैं. टास्क को कॉन्फ़िगर करने के बारे में ज़्यादा जानने के लिए, कॉन्फ़िगरेशन के विकल्प देखें.

इमेज सेगमेंटर टास्क, इन इनपुट डेटा टाइप के साथ काम करता है: स्टिल इमेज, वीडियो फ़ाइलें, और लाइव वीडियो स्ट्रीम. टास्क बनाते समय, आपको इनपुट डेटा टाइप से मेल खाने वाला 'रनिंग मोड' तय करना होगा. टास्क को बनाने का तरीका जानने के लिए, अपने इनपुट डेटा टाइप के लिए टैब चुनें.

Image

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.IMAGE)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

वीडियो

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.VIDEO)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .build();
imagesegmenter = ImageSegmenter.createFromOptions(context, options);
    

लाइव स्ट्रीम

ImageSegmenterOptions options =
  ImageSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setRunningMode(RunningMode.LIVE_STREAM)
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })
    .build()
imagesegmenter = ImageSegmenter.createFromOptions(context, options)
    

इमेज सेगमेंटर के उदाहरण वाले कोड को लागू करने से, उपयोगकर्ता एक से दूसरे प्रोसेसिंग मोड पर स्विच कर सकता है. यह तरीका टास्क बनाने वाले कोड को ज़्यादा जटिल बना देता है. ऐसा भी हो सकता है कि वह आपके इस्तेमाल के उदाहरण के लिए सही न हो. setupImageSegmenter() फ़ंक्शन की मदद से, इस कोड को ImageSegmenterHelper क्लास में देखा जा सकता है.

कॉन्फ़िगरेशन विकल्प

इस टास्क में, Android ऐप्लिकेशन के कॉन्फ़िगरेशन के ये विकल्प मौजूद हैं:

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
runningMode टास्क के लिए, रनिंग मोड सेट करता है. इसके तीन मोड होते हैं:

इमेज: सिंगल इमेज इनपुट के लिए मोड.

वीडियो: वीडियो के डिकोड किए गए फ़्रेम का मोड.

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
outputCategoryMask अगर इसे True पर सेट किया जाता है, तो आउटपुट में uint8 इमेज के तौर पर सेगमेंटेशन मास्क शामिल होता है. इसमें हर पिक्सल वैल्यू, विनिंग कैटगरी की वैल्यू को दिखाती है. {True, False} False
outputConfidenceMasks अगर इसे True पर सेट किया जाता है, तो आउटपुट में सेगमेंटेशन मास्क को फ़्लोट वैल्यू इमेज के तौर पर शामिल किया जाता है. इसकी हर फ़्लोट वैल्यू, कैटगरी का कॉन्फ़िडेंस स्कोर मैप दिखाती है. {True, False} True
displayNamesLocale अगर यह उपलब्ध हो, तो टास्क के मॉडल के मेटाडेटा में दिए गए डिसप्ले नेम के लिए, लेबल की भाषा सेट करता है. अंग्रेज़ी के लिए डिफ़ॉल्ट रूप से en है. TensorFlow Lite Metadata Writer API का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के हिसाब से लेबल जोड़े जा सकते हैं स्थान-भाषा का कोड en
resultListener जब इमेज सेगमेंटर लाइव स्ट्रीम मोड में होता है, तो यह सुविधा नतीजे के लिसनर को सेट करती है, ताकि सेगमेंट के नतीजों को एसिंक्रोनस तरीके से पाया जा सके. सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो लागू नहीं लागू नहीं
errorListener गड़बड़ी की जानकारी देने वाला वैकल्पिक लिसनर सेट करता है. लागू नहीं सेट नहीं किया गया है

डेटा तैयार करना

इमेज सेगमेंटर, इमेज, वीडियो फ़ाइल, और लाइव स्ट्रीम वीडियो के साथ काम करता है. यह टास्क, डेटा इनपुट की प्री-प्रोसेसिंग को हैंडल करता है. इसमें साइज़ बदलना, घुमाना, और वैल्यू को सामान्य बनाना भी शामिल है.

इमेज सेगमेंटर को पास करने से पहले आपको इनपुट इमेज या फ़्रेम को किसी com.google.mediapipe.framework.image.MPImage ऑब्जेक्ट में बदलना होगा.

Image

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load an image on the user’s device as a Bitmap object using BitmapFactory.

// Convert an Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(bitmap).build();
    

वीडियो

import com.google.mediapipe.framework.image.BitmapImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Load a video file on the user's device using MediaMetadataRetriever

// From the video’s metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. You’ll need them
// to calculate the timestamp of each frame later.

// Loop through the video and load each frame as a Bitmap object.

// Convert the Android’s Bitmap object to a MediaPipe’s Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

लाइव स्ट्रीम

import com.google.mediapipe.framework.image.MediaImageBuilder;
import com.google.mediapipe.framework.image.MPImage;

// Create a CameraX’s ImageAnalysis to continuously receive frames
// from the device’s camera. Configure it to output frames in RGBA_8888
// format to match with what is required by the model.

// For each Android’s ImageProxy object received from the ImageAnalysis,
// extract the encapsulated Android’s Image object and convert it to
// a MediaPipe’s Image object.
android.media.Image mediaImage = imageProxy.getImage()
Image mpImage = new MediaImageBuilder(mediaImage).build();
    

इमेज सेगमेंटर के उदाहरण कोड में, ImageSegmenterHelper क्लास में डेटा तैयार करने का काम segmentLiveStreamFrame() फ़ंक्शन के ज़रिए किया जाता है.

टास्क चलाएं

इस्तेमाल किए जा रहे रनिंग मोड के हिसाब से, किसी दूसरे segment फ़ंक्शन को कॉल किया जा सकता है. इमेज सेगमेंटर फ़ंक्शन, इनपुट इमेज या फ़्रेम में पहचाने गए सेगमेंट क्षेत्रों को दिखाता है.

Image

ImageSegmenterResult segmenterResult = imagesegmenter.segment(image);
    

वीडियो

// Calculate the timestamp in milliseconds of the current frame.
long frame_timestamp_ms = 1000 * video_duration * frame_index / frame_count;

// Run inference on the frame.
ImageSegmenterResult segmenterResult =
    imagesegmenter.segmentForVideo(image, frameTimestampMs);
    

लाइव स्ट्रीम

// Run inference on the frame. The segmentations results will be available via
// the `resultListener` provided in the `ImageSegmenterOptions` when the image
// segmenter was created.
imagesegmenter.segmentAsync(image, frameTimestampMs);
    

निम्न पर ध्यान दें:

  • वीडियो मोड या लाइव स्ट्रीम मोड में विज्ञापन चलाते समय, इमेज सेगमेंटर टास्क को इनपुट फ़्रेम का टाइमस्टैंप भी देना होगा.
  • इमेज या वीडियो मोड में चलते समय, इमेज सेगमेंटर टास्क मौजूदा थ्रेड को तब तक ब्लॉक रखता है, जब तक इनपुट इमेज या फ़्रेम की प्रोसेसिंग पूरी नहीं हो जाती. यूज़र इंटरफ़ेस को ब्लॉक होने से बचाने के लिए, प्रोसेसिंग को बैकग्राउंड थ्रेड में चलाएं.
  • लाइव स्ट्रीम मोड में चलाते समय, इमेज सेगमेंटर टास्क मौजूदा थ्रेड को ब्लॉक नहीं करता है, लेकिन तुरंत वापस आ जाता है. यह जब भी इनपुट फ़्रेम की प्रोसेसिंग पूरी करेगा, तब यह खोज के नतीजे के साथ अपने रिज़ल्ट लिसनर को शुरू करेगा. अगर इमेज सेगमेंटर टास्क किसी दूसरे फ़्रेम को प्रोसेस करने में व्यस्त है और segmentAsync फ़ंक्शन कॉल किया जाता है, तो यह टास्क नए इनपुट फ़्रेम को अनदेखा कर देता है.

इमेज सेगमेंटर के उदाहरण कोड में, segment फ़ंक्शन के बारे में ImageSegmenterHelper.kt फ़ाइल में बताया गया है.

नतीजे मैनेज करें और दिखाएं

अनुमान लगाने पर, इमेज सेगमेंटर टास्क एक ImageSegmenterResult ऑब्जेक्ट दिखाता है. इस ऑब्जेक्ट में सेगमेंटेशन टास्क के नतीजे होते हैं. आउटपुट का कॉन्टेंट, टास्क को कॉन्फ़िगर करते समय सेट किए गए outputType के हिसाब से तय होता है.

यहां दिए गए सेक्शन, इस टास्क के आउटपुट डेटा के उदाहरण दिखाते हैं:

कैटगरी कॉन्फ़िडेंस

नीचे दी गई इमेज में कैटगरी कॉन्फ़िडेंस मास्क के लिए टास्क के आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है. कॉन्फ़िडेंस मास्क आउटपुट में [0, 1] के बीच फ़्लोट वैल्यू होती हैं.

ओरिजनल इमेज और कैटगरी कॉन्फ़िडेंस मास्क आउटपुट. Pascal VOC 2012 डेटासेट से सोर्स इमेज.

कैटगरी की वैल्यू

नीचे दी गई इमेज में कैटगरी वैल्यू मास्क के लिए टास्क आउटपुट का विज़ुअलाइज़ेशन दिखाया गया है. कैटगरी मास्क की रेंज [0, 255] है और हर पिक्सल वैल्यू मॉडल आउटपुट की विनिंग कैटगरी इंडेक्स को दिखाती है. जीतने वाली कैटगरी के इंडेक्स का वह स्कोर सबसे ज़्यादा होता है जिसे मॉडल पहचान सकता है.

ओरिजनल इमेज और कैटगरी मास्क का आउटपुट. Pascal VOC 2012 डेटासेट से सोर्स इमेज.