تتيح لك مهمة "إدراج الصور" من MediaPipe تحويل بيانات الصور إلى تمثيل رقمي لإنجاز مهام معالجة الصور ذات الصلة بالذكاء الاصطناعي، مثل مقارنة تشابه صورتَين. توضّح لك هذه التعليمات كيفية استخدام مكتبة Image Embedder مع Python.
لمزيد من المعلومات عن الإمكانات والنماذج وخيارات الضبط لهذه المهمة، اطّلِع على نظرة عامة.
مثال على الرمز البرمجي
يقدّم مثال الرمز البرمجي لأداة "إدراج الصور" تنفيذًا كاملاً لهذه مهمة باستخدام Python، ويمكنك الرجوع إليه. يساعدك هذا الرمز في اختبار هذه المهمة والبدء في إنشاء أداة تضمين الصور الخاصة بك. يمكنك عرض مثال رمز "أداة تضمين الصور" وتشغيله وتعديله باستخدام متصفح الويب فقط مع Google Colab. يمكنك الاطّلاع على رمز المصدر الخاص بهذا المثال على GitHub.
ضبط إعدادات الجهاز
يوضّح هذا القسم الخطوات الرئيسية لإعداد بيئة التطوير و مشاريع الرموز البرمجية لاستخدام أداة "إدراج الصور" على وجه التحديد. للحصول على معلومات عامة حول إعداد بيئة التطوير لاستخدام مهام MediaPipe، بما في ذلك requirements لإصدار النظام الأساسي، يُرجى الاطّلاع على دليل الإعداد ل IDE 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
خيارات الضبط لضبط خيارات
المُضمِّن. لمزيد من المعلومات حول خيارات الضبط، يُرجى الاطّلاع على نظرة عامة على الضبط.
تتيح مهمة "إدراج الصور" 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. # ...
خيارات الضبط
تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات Python:
اسم الخيار | الوصف | نطاق القيمة | القيمة التلقائية |
---|---|---|---|
running_mode |
لضبط وضع التشغيل للمهمة هناك ثلاثة
أوضاع: IMAGE: وضع الإدخالات باستخدام صورة واحدة. VIDEO: وضع الإطارات التي تم فك ترميزها في الفيديو LIVE_STREAM: وضع البث المباشر لبيانات الإدخال ، مثل بيانات الكاميرا في هذا الوضع، يجب استدعاء resultListener لإعداد مستمع لتلقّي النتائج بشكل غير متزامن. |
{IMAGE, VIDEO, LIVE_STREAM } |
IMAGE |
l2_normalize |
ما إذا كان يجب تطبيع متجه السمات المعروض باستخدام معيار L2 لا تستخدِم هذا الخيار إلا إذا كان النموذج لا يحتوي على خطوة معالجة برمجية أساسية L2_NORMALIZATION في TFLite. وفي معظم الحالات، يكون هذا هو الحال، وبالتالي يتم تحقيق تسويّة L2 من خلال الاستنتاج في 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 API ناقلات التضمين لملف الصورة أو الإطار الذي تم إدخاله.
صورة
# 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])