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

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

कोड का उदाहरण

MediaPipe टास्क कोड के उदाहरण में 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/image_segmentation/android
    

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

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

इन फ़ाइलों में इस इमेज का ज़रूरी कोड शामिल है सेगमेंटेशन का उदाहरण:

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

सेटअप

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

डिपेंडेंसी

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

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

मॉडल

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

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

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

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

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

टास्क बनाएं

टास्क बनाने के लिए, 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)
    

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

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

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

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

अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इमेज: सिंगल इमेज इनपुट का मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है वीडियो: किसी वीडियो के डिकोड किए गए फ़्रेम के लिए मोड.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है LIVE_STREAM: इनपुट की लाइवस्ट्रीम करने का मोड जैसी निजी जानकारी को किसी भी समय रिकॉर्ड कर सकते हैं. इस मोड में, resultListener होना चाहिए नतीजे पाने के लिए, लिसनर सेट अप करने के लिए कॉल किया गया एसिंक्रोनस रूप से.
{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 मोड में होगा, तब एसिंक्रोनस रूप से काम करेगा. इसका इस्तेमाल सिर्फ़ तब किया जा सकता है, जब रनिंग मोड को 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();
    

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

टास्क को पूरा करें

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

इमेज

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].

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

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

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

ओरिजनल इमेज और कैटगरी मास्क का आउटपुट. इमेज का सोर्स यहां से लिया गया: पास्कल वीओसी 2012 डेटासेट.