تتيح لك مهمة "تصنيف الصور" من MediaPipe إجراء تصنيف للصور. يمكنك استخدام هذه المهمة لتحديد ما تمثله الصورة من بين مجموعة من الفئات المحدّدة في وقت التدريب. توضّح لك هذه التعليمات كيفية استخدام Image Classifier مع Python.
يمكنك الاطّلاع على هذه المهمة وهي قيد التنفيذ من خلال عرض Web demo. للحصول على مزيد من المعلومات عن إمكانات مهمة هذه ونماذجها وخيارات الضبط، يُرجى الاطّلاع على نظرة عامة.
مثال على الرمز البرمجي
يقدّم رمز Image Classifier النموذجي تنفيذًا كاملاً لهذه مهمة باستخدام Python، ويمكنك الرجوع إليه. يساعدك هذا الرمز في اختبار هذه المهمة والبدء في إنشاء مصنّف الصور الخاص بك. يمكنك عرض مثال رمز "تصنيف الصور" وتشغيله وتعديله باستخدام متصفّح الويب فقط.
إذا كنت بصدد تنفيذ "أداة تصنيف الصور" لأجهزة Raspberry Pi، يمكنك الرجوع إلى مثال تطبيق Raspberry Pi.
ضبط إعدادات الجهاز
يوضّح هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير و مشاريع الرموز البرمجية لاستخدام "أداة تصنيف الصور" على وجه التحديد. للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك requirements لإصدار النظام الأساسي، يُرجى الاطّلاع على دليل الإعداد ل IDE Python.
الطرود
تتطلّب مهمة "تصنيف الصور" حزمة mediapipe pip. يمكنك تثبيت التبعية التالية باستخدام ما يلي:
$ 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 نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. لمزيد من المعلومات عن النماذج المدربة المتاحة لخدمة "تصنيف الصور"، اطّلِع على قسم "النماذج" ضمن النظرة العامة على المهمة.
اختَر نموذجًا ونزِّله، ثم احفظه في دليل على الجهاز. يمكنك استخدام نموذج EfficientNet-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
خيارات الضبط، بما في ذلك وضع
التشغيل ولغة عرض الأسماء والحد الأقصى لعدد النتائج وعتبة الثقة وقائمة السماح
بالفئات وقائمة الرفض. لمزيد من المعلومات عن خيارات الإعداد، يُرجى الاطّلاع على نظرة عامة على الإعداد.
تتيح مهمة "تصنيف الصور" استخدام 3 أنواع من بيانات الإدخال: الصور الثابتة وملفات الفيديو وأحداث البث المباشر للفيديو. اختَر علامة التبويب التي تتوافق مع نوع بيانات الإدخال لاطلاعك على كيفية إنشاء المهمة وتنفيذ الاستنتاج.
صورة
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 |
لضبط وضع التشغيل للمهمة هناك ثلاثة
أوضاع: IMAGE: وضع الإدخالات باستخدام صورة واحدة. VIDEO: وضع الإطارات التي تم فك ترميزها في الفيديو LIVE_STREAM: وضع البث المباشر لبيانات الإدخال ، مثل بيانات الكاميرا في هذا الوضع، يجب استدعاء resultListener لإعداد مستمع لتلقّي النتائج بشكل غير متزامن. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
display_names_locale |
لضبط لغة التصنيفات لاستخدامها في الأسماء المعروضة المقدَّمة في
البيانات الوصفية لنموذج المهمة، في حال توفّرها. القيمة التلقائية هي en لعبارة
English. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص
باستخدام واجهة برمجة التطبيقات TensorFlow Lite Metadata Writer API. |
رمز اللغة | en |
max_results |
تُستخدَم لتحديد الحد الأقصى الاختياري لعدد نتائج التصنيف التي ستعرضها. إذا كان < 0، سيتم عرض جميع النتائج المتاحة. | أي أرقام موجبة | -1 |
score_threshold |
تُستخدَم لضبط الحدّ الأدنى لنتيجة التوقّع الذي يحلّ محلّ الحدّ المتوفّر في البيانات الوصفية للنموذج (إن توفّرت). ويتم رفض النتائج التي تقلّ عن هذه القيمة. | أيّ عائمة | لم يتم الضبط |
category_allowlist |
لضبط القائمة الاختيارية لأسماء الفئات المسموح بها. إذا لم تكن فارغة،
سيتم استبعاد نتائج التصنيف التي لا يتضمّن اسم فئتها هذه المجموعة. ويتم تجاهل أسماء الفئات المكرّرة أو غير المعروفة.
هذا الخيار غير متوافق مع الخيار category_denylist ، ويؤدي استخدام
كلا الخيارَين إلى حدوث خطأ. |
أي سلاسل | لم يتم الضبط |
category_denylist |
لضبط القائمة الاختيارية لأسماء الفئات غير المسموح بها. إذا كانت هذه المجموعة ليست فارغة، سيتم فلترة نتائج التصنيف التي يكون اسم فئتها في هذه المجموعة. ويتم تجاهل أسماء الفئات المكرّرة أو غير المعروفة. هذا الخيار متناقض
مع الخيار category_allowlist ، ويؤدي استخدام كليهما إلى حدوث خطأ. |
أي سلاسل | لم يتم الضبط |
result_callback |
ضبط مستمع النتائج لتلقّي نتائج التصنيف
بشكل غير متزامن عندما يكون "تصنيف الصور" في وضع البث المباشر
لا يمكن استخدامها إلا عند ضبط وضع التشغيل على LIVE_STREAM |
لا ينطبق | لم يتم الضبط |
إعداد البيانات
حضِّر الإدخال كملف صورة أو صفيف numpy، ثم حوِّله إلى عنصر
mediapipe.Image
. إذا كان الإدخال عبارة عن ملف فيديو أو بث مباشر من كاميرا ويب، يمكنك استخدام مكتبة خارجية مثل OpenCV لتحميل لقطات الإدخال كصفائف numpy.
توضّح الأمثلة التالية كيفية إعداد البيانات لمعالجتها في كل نوع من أنواع البيانات المتاحة.
صورة
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 Classifier API الفئات المحتملة للموضوع ضمن الصورة أو الإطار المُدخلَين.
صورة
# 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)
يُرجى ملاحظة ما يلي:
- عند التشغيل في وضع الفيديو أو وضع البث المباشر، يجب أيضًا تزويد مهمة "تصنيف الصور" بطابع زمني لإطار الإدخال.
- عند التشغيل في نموذج الصورة أو الفيديو، ستؤدي مهمة "تصنيف الصور" إلى حظر سلسلة المهام الحالية إلى أن تنتهي من معالجة الصورة أو الإطار المُدخل.
- عند التشغيل في وضع البث المباشر، لا تحظر مهمة Image Classifier
سلسلة المحادثات الحالية، بل تعود على الفور. سيستدعي مستمع النتائج نتيجة التصنيف في كل مرة تنتهي فيها عملية معالجة لقطة إدخال. إذا تمّ استدعاء الدالة
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
تم الحصول على هذه النتيجة من خلال تشغيل أداة تصنيف الطيور على:
يوضّح مثال الرمز البرمجي لمُصنِّف الصور كيفية عرض نتائج التصنيف المعروضة من المهمة، اطّلِع على مثال الرمز البرمجي لمعرفة التفاصيل.