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

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

कोड का उदाहरण

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

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

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

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

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

उदाहरण के तौर पर दिया गया कोड डाउनलोड करने के लिए:

  1. यहां दिए गए कमांड का इस्तेमाल करके, Git डेटा स्टोर करने की जगह को क्लोन करें:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, अपने git इंस्टेंस को स्पैर्स चेकआउट का इस्तेमाल करने के लिए कॉन्फ़िगर करें, ताकि आपके पास सिर्फ़ Image Segmenter के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें हों:
    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 Image Segmenter टास्क के लिए, ट्रेन किए गए ऐसे मॉडल की ज़रूरत होती है जो इस टास्क के साथ काम करता हो. इमेज सेगमेंटर के लिए, ट्रेन किए गए उपलब्ध मॉडल के बारे में ज़्यादा जानने के लिए, टास्क की खास जानकारी वाला मॉडल सेक्शन देखें.

मॉडल चुनें और डाउनलोड करें. इसके बाद, उसे अपनी प्रोजेक्ट डायरेक्ट्री में सेव करें:

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

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

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

टास्क बनाना

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

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

इमेज

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 टास्क के लिए रनिंग मोड सेट करता है. इसके तीन मोड हैं:

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

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

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

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

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

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

इमेज

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

// Load an image on the users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes 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 videos metadata, load the METADATA_KEY_DURATION and
// METADATA_KEY_VIDEO_FRAME_COUNT value. Youll need them
// to calculate the timestamp of each frame later.

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

// Convert the Androids Bitmap object to a MediaPipes Image object.
Image mpImage = new BitmapImageBuilder(frame).build();
    

लाइव स्ट्रीम

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

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

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

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

टास्क चलाना

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

इमेज

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 के डेटासेट से ली गई सोर्स इमेज.