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

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

कोड का उदाहरण

MediaPipe Tasks कोड का उदाहरण, 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/interactive_segmentation/android
    

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

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

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

  • InteractiveSegmentationHelper.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() तरीके का इस्तेमाल करें. यह तरीका अगले सेक्शन में दिए गए कोड के उदाहरण में दिखाया गया है.

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

टास्क बनाएं

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

InteractiveSegmenterOptions options =
  InteractiveSegmenterOptions.builder()
    .setBaseOptions(
      BaseOptions.builder().setModelAssetPath("model.tflite").build())
    .setOutputCategoryMask(true)
    .setOutputConfidenceMasks(false)
    .setResultListener((result, inputImage) -> {
         // Process the segmentation result here.
    })
    .setErrorListener((result, inputImage) -> {
         // Process the segmentation errors here.
    })    .build();
interactivesegmenter = InteractiveSegmenter.createFromOptions(context, options);

इस टास्क को सेट अप करने के ज़्यादा उदाहरण के लिए, InteractiveSegmenterHelper क्लास setupInteractiveSegmenter() फ़ंक्शन देखें.

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

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

विकल्प का नाम ब्यौरा वैल्यू रेंज डिफ़ॉल्ट मान
outputCategoryMask अगर इसे True पर सेट किया जाता है, तो आउटपुट में uint8 इमेज के तौर पर सेगमेंटेशन मास्क शामिल होता है. यहां हर पिक्सल वैल्यू से पता चलता है कि पिक्सल पसंद की जगह पर मौजूद ऑब्जेक्ट का हिस्सा है या नहीं. {True, False} False
outputConfidenceMasks अगर इसे True पर सेट किया जाता है, तो आउटपुट में सेगमेंटेशन मास्क को फ़्लोट वैल्यू इमेज के तौर पर शामिल किया जाता है. यहां हर फ़्लोट वैल्यू से यह पता चलता है कि पिक्सल, पसंदीदा जगह पर मौजूद ऑब्जेक्ट का हिस्सा है. {True, False} True
displayNamesLocale अगर यह उपलब्ध हो, तो टास्क के मॉडल के मेटाडेटा में दिए गए डिसप्ले नेम के लिए, लेबल की भाषा सेट करता है. अंग्रेज़ी के लिए डिफ़ॉल्ट रूप से en है. TensorFlow Lite Metadata Writer API का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के हिसाब से लेबल जोड़े जा सकते हैं स्थान-भाषा का कोड en
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 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();

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

टास्क चलाएं

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

RegionOfInterest roi = RegionOfInterest.create(
    NormalizedKeypoint.create(
        normX * it.width,
        normY * it.height
    )
);

ImageSegmenterResult segmenterResult = interactivesegmenter.segment(image, roi);

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

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

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

नीचे दिए सेक्शन में, इस टास्क से मिलने वाले आउटपुट डेटा के बारे में बताया गया है:

कैटगरी मास्क

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

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

कॉन्फ़िडेंस मास्क

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