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

تتيح لك مهمة MediaPipe Image inlineer (أداة تضمين الصور MediaPipe) تحويل بيانات الصور إلى تمثيل رقمي لإنجاز مهام معالجة الصور المتعلقة بتعلُّم الآلة، مثل مقارنة التشابه بين صورتين. توضح لك هذه التعليمات كيفية استخدام أداة تضمين الصور مع بايثون.

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

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

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

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

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

الطرود

مهمة أداة تضمين الصور لحزمة نافذة الوسائط المتعددة. يمكنك تثبيت التبعية باستخدام ما يلي:

$ python -m pip install mediapipe

عمليات الاستيراد

يمكنك استيراد الفئات التالية للوصول إلى وظائف مهمة أداة تضمين الصور:

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

الطراز

تتطلب مهمة MediaPipe Image embeder (أداة تضمين الصور 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: وضع إدخالات الصورة الفردية.

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

البث المباشر: وضع بث مباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء resultsListener لإعداد أداة معالجة الصوت لكي تتلقى النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
l2_normalize ما إذا كان سيتم تسوية الخط المتجه للميزة الذي تم إرجاعه باستخدام معيار L2. لا تستخدم هذا الخيار إلا إذا لم يكن النموذج يحتوي على L2_NORMALIZATION TFLite Op أصلي. في معظم الحالات، يتم تسوية 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)
    

تنفيذ المهمة

يمكنك استدعاء دالة التضمين المقابلة لوضع التشغيل لديك للحصول على استنتاجات. ستعرض واجهة برمجة تطبيقات تضمين الصور متجهات التضمين لصورة الإدخال أو الإطار.

صورة

# 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])