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

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

कोड का उदाहरण

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

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

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

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

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

  1. यहां दिए गए कमांड का इस्तेमाल करके, Git डेटा स्टोर करने की जगह को क्लोन करें:
    git clone https://github.com/google-ai-edge/mediapipe-samples
    
  2. इसके अलावा, अपने git इंस्टेंस को स्पैर्स चेकआउट का इस्तेमाल करने के लिए कॉन्फ़िगर करें, ताकि आपके पास सिर्फ़ इंटरैक्टिव इमेज सेगमेंटर के उदाहरण वाले ऐप्लिकेशन की फ़ाइलें हों:
    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(exception -> {
         // 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 मेटाडेटा राइटर एपीआई का इस्तेमाल करके, कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के लेबल जोड़े जा सकते हैं स्थानीय भाषा का कोड 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 users device as a Bitmap object using BitmapFactory.

// Convert an Androids Bitmap object to a MediaPipes Image object.
MPImage mpImage = new BitmapImageBuilder(bitmap).build();

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

टास्क चलाना

अनुमान लगाने और सेगमेंट जनरेट करने के लिए, 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] के बीच फ़्लोट वैल्यू होती हैं. ज़्यादा वैल्यू से यह पता चलता है कि इमेज पिक्सल, दिलचस्पी के इलाके में मौजूद ऑब्जेक्ट का हिस्सा है.