دليل تقسيم الصور في Python

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

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

يقدّم مثال الرمز البرمجي لفئة Image Segmenter تنفيذًا كاملاً لهذه مهمة باستخدام Python، ويمكنك الرجوع إليه. يساعدك هذا الرمز في اختبار هذه المهمة والبدء في إنشاء تطبيق لتقسيم الصور. يمكنك عرض نموذج رمز "أداة تقسيم الصور" وتشغيله وتعديله باستخدام متصفّح الويب فقط.

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

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

الطرود

تتطلّب مهمة "أداة تقسيم الصور" من MediaPipe حزمة mediapipe. يمكنك تثبيت الموارد الاعتمادية المطلوبة باستخدام الأمر التالي:

$ python -m pip install mediapipe

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

استورِد الفئات التالية للوصول إلى دوال مهمة "مُقسِّم الصور":

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

الطراز

تتطلّب مهمة "أداة تقسيم الصور" من MediaPipe نموذجًا مدرَّبًا متوافقًا مع هذه المهمة. لمزيد من المعلومات عن النماذج المدربة المتاحة لأداة "تقسيم الصور"، اطّلِع على القسم النماذج ضمن النظرة العامة على المهمة.

اختَر النموذج ونزِّله، ثم احفظه في دليل مشروعك:

model_path = '/absolute/path/to/model.tflite'

حدِّد مسار النموذج ضمن مَعلمة "اسم النموذج"، كما هو موضّح أدناه:

base_options = BaseOptions(model_asset_path=model_path)

إنشاء المهمة

تستخدِم مهمة "مُقسِّم الصور" من MediaPipe الدالة create_from_options ل إعداد المهمة. تقبل الدالة create_from_options قيمًا لتتمكّن خيارات الضبط من التعامل معها. لمزيد من المعلومات عن إعداد المهام، راجِع خيارات الإعداد.

تعرض هذه العيّنات أيضًا الصيغ المختلفة لإنشاء المهام للصور وملفات الفيديو وأحداث البث المباشر.

صورة

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the image mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.IMAGE,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

فيديو

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the video mode:
options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
  

بث مباشر

BaseOptions = mp.tasks.BaseOptions
ImageSegmenter = mp.tasks.vision.ImageSegmenter
ImageSegmenterOptions = mp.tasks.vision.ImageSegmenterOptions
VisionRunningMode = mp.tasks.vision.RunningMode

# Create a image segmenter instance with the live stream mode:
def print_result(result: List[Image], output_image: Image, timestamp_ms: int):
    print('segmented masks size: {}'.format(len(result)))

options = ImageSegmenterOptions(
    base_options=BaseOptions(model_asset_path='/path/to/model.task'),
    running_mode=VisionRunningMode.VIDEO,
    output_category_mask=True)
with ImageSegmenter.create_from_options(options) as segmenter:
    

خيارات الضبط

تتضمّن هذه المهمة خيارات الضبط التالية لتطبيقات Python:

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

IMAGE: وضع الإدخالات باستخدام صورة واحدة.

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

LIVE_STREAM: وضع البث المباشر لبيانات الإدخال ، مثل بيانات الكاميرا في هذا الوضع، يجب استدعاء resultListener لإعداد مستمع لتلقّي النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask في حال ضبط القيمة على True، يتضمّن الناتج قناع تقسيم كصورة uint8، حيث تشير قيمة كل بكسل إلى قيمة الفئة الفائزة. {True, False} False
output_confidence_masks في حال ضبطه على True، يتضمّن الناتج قناع تقسيم كصورة قيمة عائمة، حيث تمثّل كل قيمة عائمة خريطة تقييم الثقة للفئة. {True, False} True
display_names_locale لضبط لغة التصنيفات لاستخدامها في الأسماء المعروضة المقدَّمة في البيانات الوصفية لنموذج المهمة، في حال توفّرها. القيمة التلقائية هي en لعبارة English. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص باستخدام واجهة برمجة التطبيقات TensorFlow Lite Metadata Writer API. رمز اللغة en
result_callback ضبط مستمع النتائج لتلقّي نتائج التقسيم بشكل غير متزامن عندما يكون أداة تقسيم الصور في وضع LIVE_STREAM لا يمكن استخدامها إلا عند ضبط وضع التشغيل على LIVE_STREAM لا ينطبق لا ينطبق

إعداد البيانات

حضِّر الإدخال كملف صورة أو صفيف numpy، ثم حوِّله إلى عنصر mediapipe.Image. إذا كان الإدخال عبارة عن ملف فيديو أو بث مباشر من كاميرا ويب، يمكنك استخدام مكتبة خارجية مثل OpenCV لتحميل لقطات الإدخال كصفائفnumpy.

صورة

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

فيديو

# Use OpenCV’s VideoCapture to load the input video.
# Load the frame rate of the video using OpenCV’s CV_CAP_PROP_FPS
# You need the frame rate 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)
    

بث مباشر

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

للاطّلاع على مثال على رمز يعرض عملية إعداد البيانات لخدمة "تقسيم الصور"، يمكنك الاطّلاع على مثال على الرمز.

تنفيذ المهمة

تستخدِم أداة "تقسيم الصور" الدوالّ segment وsegment_for_video وsegment_async لبدء الاستنتاجات. بالنسبة إلى تقسيم الصور، يشمل ذلك المعالجة المُسبَقة لبيانات الإدخال وتشغيل نموذج التقسيم والمعالجة المُسبَقة لنتائج النموذج الأوّلي إلى الأقنعة المقسّمة.

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

صورة

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the image mode.
segmented_masks = segmenter.segment(mp_image)
    

فيديو

# Perform image segmentation on the provided single image.
# The image segmenter must be created with the video mode.
segmented_masks = segmenter.segment_for_video(mp_image, frame_timestamp_ms)
    

بث مباشر

# Send live image data to perform image segmentation.
# The results are accessible via the `result_callback` provided in
# the `ImageSegmenterOptions` object.
# The image segmenter must be created with the live stream mode.
segmenter.segment_async(mp_image, frame_timestamp_ms)
    

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

  • عند التشغيل في وضع الفيديو أو وضع البث المباشر، يجب أيضًا تزويد مهمة "مُقسِّم الصور" بالطوابع الزمنية لإطار الإدخال.
  • عند التشغيل في نموذج الصورة أو الفيديو، ستؤدي مهمة "مُقسِّم الصور" إلى حظر سلسلة المهام الحالية إلى أن تنتهي من معالجة الصورة أو الإطار المُدخل.

للحصول على مثال أكثر اكتمالاً على تنفيذ استنتاجات أداة "تقسيم الصور"، اطّلِع على مثال الرمز البرمجي.

معالجة النتائج وعرضها

تُخرج أداة "تقسيم الصور" قائمة ببيانات Image. إذا كان output_type يساوي CATEGORY_MASK، يكون الناتج قائمة تحتوي على قناع مجزأ واحد كصورة uint8. يشير البكسل إلى فهرس الفئة التي تم التعرّف عليها في الصورة المُدخلة. إذا كان output_type هو CONFIDENCE_MASK، تكون النتيجة مصفوفة بحجم رقم الفئة. كل قناع مقسّم هو صورة عائمة ضمن النطاق [0,1]، تمثّل درجة الثقة للبكسل الذي ينتمي إلى الفئة.

تعرض الأقسام التالية أمثلة على بيانات الإخراج من هذه المهمة:

ثقة الفئة

تعرض الصور التالية تمثيلاً مرئيًا لمخرجات المهمة لفئة قناع الثقة. يحتوي الناتج عن قناع الثقة على قيم عائمة تتراوح بين [0, 1].

فتاتان تركبان حصانًا وفتاة تمشي بجانب الحصان قناع الصورة الذي يحدّد شكل الفتيات والحصان من الصورة السابقة تم التقاط النصف الأيسر من مخطّط الصورة، ولكن لم يتم التقاط النصف الأيمن من الصورة.

الصورة الأصلية وإخراج قناع ثقة الفئة الصورة المصدر من مجموعة بيانات Pascal VOC 2012.

قيمة الفئة

تعرض الصور التالية تمثيلاً مرئيًا لمعدّل إنجاز المهمة لقناع قيمة الفئة. نطاق قناع الفئة هو [0, 255]، وتمثل كل قيمة بكسل فهرس الفئة الفائزة في مخرجات النموذج. يحصل فئة الفهرس الفائزة على أعلى نتيجة بين الفئات التي يمكن للنموذج التعرّف عليها.

فتاتان تركبان حصانًا وفتاة تمشي بجانب الحصان قناع الصورة الذي يحدّد شكل الفتيات والحصان من الصورة السابقة تم حجب شكل الفتيات الثلاث والحصان بدقة

الصورة الأصلية ونتيجة قناع الفئة الصورة المصدر من مجموعة بيانات Pascal VOC 2012.