Python के लिए इमेज एम्बेड करने की गाइड

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

इस टास्क की क्षमताओं, मॉडल, और कॉन्फ़िगरेशन विकल्पों के बारे में ज़्यादा जानकारी के लिए, खास जानकारी देखें.

कोड का उदाहरण

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

सेटअप

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

पैकेज

इमेज एम्बेडर, MediaPipe पीआईपी पैकेज को टास्क करता है. इन चीज़ों के साथ डिपेंडेंसी इंस्टॉल की जा सकती है:

$ python -m pip install mediapipe

इंपोर्ट

इमेज एम्बेडर टास्क फ़ंक्शन को ऐक्सेस करने के लिए, नीचे दी गई क्लास को इंपोर्ट करें:

import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

मॉडल

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

कोई मॉडल चुनें और उसे डाउनलोड करें. इसके बाद, उसे किसी लोकल डायरेक्ट्री में सेव करें. आपके पास सुझाए गए MobileNetV3 मॉडल का इस्तेमाल करने का विकल्प है.

model_path = '/absolute/path/to/mobilenet_v3_small_075_224_embedder.tflite'

model_asset_path पैरामीटर में मॉडल का पाथ बताएं, जैसा कि यहां दिखाया गया है:

base_options = BaseOptions(model_asset_path=model_path)

टास्क बनाएं

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

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

Image

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    quantize=True,
    running_mode=VisionRunningMode.IMAGE)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

वीडियो

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    quantize=True,
    running_mode=VisionRunningMode.VIDEO)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

लाइव स्ट्रीम

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageEmbedderResult = mp.tasks.vision.ImageEmbedder.ImageEmbedderResult
ImageEmbedder = mp.tasks.vision.ImageEmbedder
ImageEmbedderOptions = mp.tasks.vision.ImageEmbedderOptions
VisionRunningMode = mp.tasks.vision.RunningMode

def print_result(result: ImageEmbedderResult, output_image: mp.Image, timestamp_ms: int):
    print('ImageEmbedderResult result: {}'.format(result))

options = ImageEmbedderOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    quantize=True,
    result_callback=print_result)

with ImageEmbedder.create_from_options(options) as embedder:
  # The embedder is initialized. Use it here.
  # ...
    

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

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

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

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

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

LIVE_STREAM: इनपुट डेटा की लाइव स्ट्रीम का मोड, जैसे कि कैमरे से स्ट्रीम किया जाने वाला मोड. इस मोड में, रिज़ल्ट पहचानकर्ता को लिसनर को सेट अप करने के लिए कॉल किया जाना चाहिए, ताकि वह एसिंक्रोनस तरीके से नतीजे पा सके.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize रिटर्न किए गए फ़ीचर वेक्टर को L2 स्टैंडर्ड के साथ सामान्य बनाना है या नहीं. इस विकल्प का इस्तेमाल सिर्फ़ तब करें, जब मॉडल में पहले से ही कोई नेटिव L2_NORMALIZATION TFLite Op मौजूद न हो. ज़्यादातर मामलों में, ऐसा पहले से ही होता है और L2 नॉर्मलाइज़ेशन को TFLite अनुमान के ज़रिए पूरा किया जाता है. इसके लिए, इस विकल्प की कोई ज़रूरत नहीं होती. Boolean False
quantize दिखाए गए एम्बेड किए गए मैसेज को स्केलर क्वांटाइज़ेशन के ज़रिए बाइट में मापा जाना चाहिए या नहीं. एम्बेड किए गए डाइमेंशन को यूनिट-नर्म माना जाता है. इसलिए, किसी भी डाइमेंशन की वैल्यू [-1.0, 1.0] में होने की गारंटी होती है. अगर ऐसा नहीं है, तो l2_normalize विकल्प का इस्तेमाल करें. Boolean False
result_callback जब इमेज एम्बेडर लाइव स्ट्रीम मोड में होता है, तो यह नतीजा लिसनर को एम्बेड करने के नतीजों को एसिंक्रोनस तरीके से पाने के लिए सेट करता है. सिर्फ़ तब इस्तेमाल किया जा सकता है, जब रनिंग मोड LIVE_STREAM पर सेट हो लागू नहीं सेट नहीं किया गया है

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

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

Image

import mediapipe as mp

# Load the input image from an image file.
mp_image = mp.Image.create_from_file('/path/to/image')

# Load the input image from a numpy array.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_image)
    

वीडियो

import mediapipe as mp

# Use OpenCV’s VideoCapture to load the input video.

# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You’ll need it to calculate the timestamp for each frame.

# Loop through each frame in the video using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

लाइव स्ट्रीम

import mediapipe as mp

# Use OpenCV’s VideoCapture to start capturing from the webcam.

# Create a loop to read the latest frame from the camera using VideoCapture#read()

# Convert the frame received from OpenCV to a MediaPipe’s Image object.
mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=numpy_frame_from_opencv)
    

टास्क चलाएं

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

Image

# Perform image embedding on the provided single image.
embedding_result = embedder.embed(mp_image)
    

वीडियो

# Calculate the timestamp of the current frame
frame_timestamp_ms = 1000 * frame_index / video_file_fps

# Perform image embedding on the video frame.
embedding_result = embedder.embed_for_video(mp_image, frame_timestamp_ms)
    

लाइव स्ट्रीम


# Send the latest frame to perform image embedding.
# Results are sent to the `result_callback` provided in the `ImageEmbedderOptions`.
embedder.embed_async(mp_image, frame_timestamp_ms)
    

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

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

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

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

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

ImageEmbedderResult:
  Embedding #0 (sole embedding head):
    float_embedding: {0.0, 0.0, ..., 0.0, 1.0, 0.0, 0.0, 2.0}
    head_index: 0

यह नतीजा इस इमेज को एम्बेड करके लिया गया था:

ImageEmbedder.cosine_similarity फ़ंक्शन का इस्तेमाल करके, दो एम्बेड किए गए लिंक की समानता की तुलना की जा सकती है. उदाहरण के लिए, यह कोड देखें.

# Compute cosine similarity.
similarity = ImageEmbedder.cosine_similarity(
  embedding_result.embeddings[0],
  other_embedding_result.embeddings[0])