Python के लिए इमेज क्लासिफ़िकेशन गाइड

MediaPipe इमेज क्लासिफ़ायर टास्क से आपको इमेज की कैटगरी तय करने में मदद मिलती है. इस टास्क का इस्तेमाल यह पहचानने के लिए किया जा सकता है कि ट्रेनिंग के समय तय की गई कैटगरी में से कोई इमेज कौनसी है. इन निर्देशों में, Python के साथ इमेज क्लासिफ़ायर का इस्तेमाल करने का तरीका बताया गया है.

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

कोड का उदाहरण

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

अगर Raspberry Pi के लिए इमेज क्लासिफ़ायर लागू किया जा रहा है, तो Raspberry Pi उदाहरण ऐप्लिकेशन देखें.

सेटअप

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

पैकेज

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

$ python -m pip install mediapipe
``` ### Imports

Import the following classes to access the Image Classifier task functions:

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

मॉडल

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

कोई मॉडल चुनें और डाउनलोड करें, और फिर उसे लोकल डायरेक्ट्री में स्टोर करें. इसके लिए, सुझाए गए FunctionNet-Lite0 मॉडल का इस्तेमाल करें.

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

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

base_options = BaseOptions(model_asset_path=model_path)

टास्क बनाएं

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

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

Image

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.IMAGE)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

वीडियो

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    max_results=5,
    running_mode=VisionRunningMode.VIDEO)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

लाइव स्ट्रीम

import mediapipe as mp

BaseOptions = mp.tasks.BaseOptions
ImageClassifierResult = mp.tasks.vision.ImageClassifier.ImageClassifierResult
ImageClassifier = mp.tasks.vision.ImageClassifier
ImageClassifierOptions = mp.tasks.vision.ImageClassifierOptions
VisionRunningMode = mp.tasks.vision.RunningMode

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

options = ImageClassifierOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.tflite'),
    running_mode=VisionRunningMode.LIVE_STREAM,
    max_results=5,
    result_callback=print_result)

with ImageClassifier.create_from_options(options) as classifier:
  # The classifier is initialized. Use it here.
  # ...
    

इमेज के साथ इस्तेमाल करने के लिए इमेज क्लासिफ़ायर बनाने का पूरा उदाहरण देखने के लिए, कोड का उदाहरण देखें.

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

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

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

इमेज: एक इमेज के इनपुट का मोड.

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

LIVE_STREAM: यह इनपुट डेटा की लाइव स्ट्रीम का मोड है, जैसे कि कैमरे से. इस मोड में, resultListener को कॉल किया जाना चाहिए, ताकि एसिंक्रोनस तरीके से नतीजे पाने के लिए, लिसनर सेट अप किया जा सके.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
display_names_locale अगर उपलब्ध हो, तो टास्क के मॉडल के मेटाडेटा में दिए गए डिसप्ले नेम में इस्तेमाल करने के लिए, लेबल की भाषा सेट करता है. अंग्रेज़ी के लिए डिफ़ॉल्ट भाषा en है. किसी कस्टम मॉडल के मेटाडेटा में स्थानीय भाषा के मुताबिक लेबल जोड़े जा सकते हैं. इसके लिए, आपको TensorFlow Lite Metadata Writer API का इस्तेमाल करना होगा स्थान-भाषा कोड en
max_results यह फ़ंक्शन, सबसे ऊपर-स्कोर किए गए क्लासिफ़िकेशन के नतीजों की वैकल्पिक संख्या को, लौटाने के लिए सेट करता है. अगर 0 से कम है, तो सभी उपलब्ध नतीजे दिखाए जाएंगे. कोई भी धनात्मक संख्या -1
score_threshold यह अनुमानित स्कोर के थ्रेशोल्ड को सेट करता है, जो मॉडल मेटाडेटा (अगर कोई हो) में दिए गए थ्रेशोल्ड को बदल देता है. इस वैल्यू से कम के नतीजे अस्वीकार कर दिए जाते हैं. कोई भी फ़्लोट सेट नहीं किया गया है
category_allowlist अनुमति वाली कैटगरी के नामों की वैकल्पिक सूची सेट करता है. अगर खाली नहीं है, तो क्लासिफ़िकेशन के जिन नतीजों की कैटगरी का नाम इस सेट में नहीं है उन्हें फ़िल्टर कर दिया जाएगा. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता. यह विकल्प category_denylist के साथ म्यूचुअली एक्सक्लूसिव है और दोनों के नतीजों का इस्तेमाल करने पर गड़बड़ी होती है. कोई भी स्ट्रिंग सेट नहीं किया गया है
category_denylist ऐसी कैटगरी के नामों की वैकल्पिक सूची सेट करता है जिनकी अनुमति नहीं है. अगर कोई कैटगरी खाली नहीं है, तो ऐसे क्लासिफ़िकेशन के नतीजे जिनके लिए इस सेट में कैटगरी का नाम है उन्हें फ़िल्टर कर दिया जाएगा. श्रेणी के डुप्लीकेट या अज्ञात नामों पर ध्यान नहीं दिया जाता. यह विकल्प category_allowlist के साथ म्यूचुअली एक्सक्लूसिव है और दोनों के इस्तेमाल से गड़बड़ी होती है. कोई भी स्ट्रिंग सेट नहीं किया गया है
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 classification on the provided single image.
classification_result = classifier.classify(mp_image)
    

वीडियो

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

# Perform image classification on the video frame.
classification_result = classifier.classify_for_video(mp_image, frame_timestamp_ms)
    

लाइव स्ट्रीम


# Send the latest frame to perform image classification.
# Results are sent to the `result_callback` provided in the `ImageClassifierOptions`.
classifier.classify_async(mp_image, frame_timestamp_ms)
    

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

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

इमेज के साथ इस्तेमाल करने के लिए इमेज क्लासिफ़ायर बनाने का पूरा उदाहरण देखने के लिए, कोड का उदाहरण देखें.

नतीजों को हैंडल करना और दिखाना

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

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

ImageClassifierResult:
 Classifications #0 (single classification head):
  head index: 0
  category #0:
   category name: "/m/01bwb9"
   display name: "Passer domesticus"
   score: 0.91406
   index: 671
  category #1:
   category name: "/m/01bwbt"
   display name: "Passer montanus"
   score: 0.00391
   index: 670

यह नतीजा, इन चीज़ों पर बर्ड क्लासिफ़ायर चलाकर मिला है:

इमेज क्लासिफ़ायर के उदाहरण कोड से यह पता चलता है कि टास्क के आधार पर मिले क्लासिफ़िकेशन के नतीजे कैसे दिखाए जाएं. ज़्यादा जानकारी के लिए, कोड का उदाहरण देखें.