دليل تصنيف الصور في Python

تتيح لك مهمة مصنِّف صور MediaPipe تصنيف الصور. يمكنك استخدام هذه المهمة لتحديد ما تمثله الصورة بين مجموعة من الفئات المحددة في وقت التدريب. وتوضح لك هذه التعليمات كيفية استخدام مصنِّف الصور مع بايثون.

يمكنك الاطّلاع على هذه المهمة وهي قيد التنفيذ من خلال الاطّلاع على العرض التوضيحي للويب. لمزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط لهذه المهمة، يمكنك الاطّلاع على نظرة عامة.

مثال على الرمز البرمجي

يوفّر مثال الرمز لمصنِّف الصور تنفيذًا كاملاً لهذه المهمة في بايثون كمرجع لك. تساعدك هذه التعليمات البرمجية على اختبار هذه المهمة والبدء في إنشاء مصنف للصور الخاص بك. يمكنك عرض مثال على الرمز في "مصنِّف الصور" وتشغيله وتعديله باستخدام متصفّح الويب.

إذا كنت بصدد تنفيذ "مصنِّف الصور" في Raspberry Pi، يمكنك الرجوع إلى مثال على تطبيق Raspberry Pi.

ضبط إعدادات الجهاز

يصف هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير ومشاريع الترميز خصيصًا لاستخدام "أداة تصنيف الصور". للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار النظام الأساسي، يمكنك الاطّلاع على دليل إعداد Python.

الطرود

يقوم مصنف الصورة بمهمة حزمة Mediapip 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.
  # ...
    

للاطّلاع على مثال كامل حول إنشاء "مصنِّف صور" لاستخدامه مع صورة، يُرجى مراجعة مثال الرمز البرمجي.

خيارات الإعداد

تشتمل هذه المهمة على خيارات الإعداد التالية لتطبيقات بايثون:

اسم الخيار الوصف نطاق القيمة القيمة التلقائية
running_mode لضبط وضع التشغيل للمهمة. هناك ثلاثة أوضاع:

IMAGE: هو الوضع الخاص بإدخالات الصور الفردية.

الفيديو: وضع الإطارات التي تم فك ترميزها في فيديو

LIVE_STREAM: وضع البث المباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء كائن resultsListener لإعداد أداة استماع لتلقّي النتائج بشكل غير متزامن.
{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 لا ينطبق لم يتم التحديد

تجهيز البيانات

عليك تحضير الإدخال كملف صورة أو صفيفة 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)
    

يُرجى ملاحظة ما يلي:

  • عند تشغيل وضع الفيديو أو البث المباشر، يجب أيضًا توفير الطابع الزمني لإطار الإدخال لمهمة "مصنِّف الصور".
  • عند تشغيل الصورة أو نموذج الفيديو، ستحظر مهمة "مصنِّف الصور" سلسلة المحادثات الحالية إلى أن تنتهي من معالجة الصورة أو الإطار المُدخَل.
  • عند استخدام "وضع البث المباشر"، لا تحجب مهمة "مصنِّف الصور" سلسلة المحادثات الحالية ولكنها تعود فورًا. وسوف يستدعي أداة الاستماع للنتائج مع نتيجة التصنيف في كل مرة ينتهي فيها من معالجة إطار إدخال. إذا تم استدعاء دالة 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

تم الحصول على هذه النتيجة من خلال تشغيل مصنِّف الطيور على:

يوضّح رمز نموذج "مصنِّف الصور" كيفية عرض نتائج التصنيف التي تم عرضها من المهمة. راجِع مثال الرمز البرمجي لمعرفة التفاصيل.