تتيح لك مهمة أداة تضمين الصور MediaPipe تحويل بيانات الصور إلى تمثيل رقمي لإنجاز مهام معالجة الصور المتعلقة بتعلُّم الآلة، مثل مقارنة التشابه بين صورتين. توضّح لك هذه التعليمات كيفية استخدام أداة تضمين الصور باستخدام Python.
مزيد من المعلومات حول الإمكانات والنماذج وخيارات الضبط هذه المهمة، راجع نظرة عامة.
مثال على الرمز البرمجي
يقدم الرمز البرمجي لأداة تضمين الصور تنفيذًا كاملاً المهمة في لغة بايثون كمرجع لك. يساعدك هذا الرمز في اختبار هذه المهمة والحصول على في إنشاء أداة تضمين الصور الخاصة بك. يمكنك عرض ملف الدفع وتشغيله وتعديله مثال لأداة تضمين الصور الرمز باستخدام متصفح الويب مع Google Colab. يمكنك عرض رمز المصدر هذا المثال على GitHub.
ضبط إعدادات الجهاز
يصف هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير لترميز الصور خصيصًا لاستخدام أداة تضمين الصور. للحصول على معلومات عامة عن إعداد بيئة التطوير الخاصة بك لاستخدام مهام MediaPipe، بما في ذلك متطلبات إصدار النظام الأساسي، راجع دليل إعداد Python
الطرود
تقوم أداة تضمين الصورة بمهمة حزمة Mediapip pip. يمكنك تثبيت التبعية مع ما يلي:
$ 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
خيارات الإعداد لضبط أداة التضمين.
الخيارات. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على الإعدادات.
نظرة عامة:
تتيح مهمة أداة تضمين الصور 3 أنواع من بيانات الإدخال: الصور الثابتة وملفات الفيديو. وأحداث الفيديو المباشرة اختَر علامة التبويب المقابلة لنوع بيانات الإدخال ونرى كيفية إنشاء المهمة وتنفيذ الاستنتاج.
صورة
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. # ...
خيارات الإعداد
تشتمل هذه المهمة على خيارات الإعداد التالية لتطبيقات بايثون:
اسم الخيار | الوصف | نطاق القيمة | القيمة الافتراضية |
---|---|---|---|
running_mode |
لضبط وضع التشغيل للمهمة. هناك ثلاثة
وسائل النقل: IMAGE: وضع إدخالات الصورة الفردية فيديو: وضع الإطارات التي تم فك ترميزها لفيديو معيّن LIVE_STREAM: وضع البث المباشر للإدخال البيانات، مثل تلك الواردة من الكاميرا. في هذا الوضع، يجب أن يكون resultListener يتم استدعاءها لإعداد مستمع للحصول على النتائج بشكل غير متزامن. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
ما إذا كان ستتم تسوية متجه الميزة المرتجعة بمعيار L2. لا تستخدم هذا الخيار إلا إذا كان النموذج لا يحتوي على رموز أصلية L2_NORMALIZATION TFLite Op. في معظم الحالات، يكون هذا هو الحال بالفعل يتم تحقيق تسوية المستوى 2 من خلال استنتاج TFLite بدون الحاجة إلى لهذا الخيار. | Boolean |
False |
quantize |
ما إذا كان يجب قياس التضمين الذي يتم عرضه بوحدات البايت عبر الكمية الكمّية. يتم الافتراض ضمنيًا أن التضمينات تستند إلى معيار وحدة وبالتالي، يمكن ضمان توفُّر قيمة لأي سمة في [ -1.0، 1.0]. استخدام الخيار l2_normalize إذا لم يكن الأمر كذلك. | Boolean |
False |
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 Embedder متجهات التضمين إدخال صورة أو إطار
صورة
# 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])