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

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

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

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

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

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

الطرود

تتطلب مهمة MediaPipe Image segmenter (أداة تقسيم الصور في 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 Image Cliper (أداة تقسيم الصور 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:
    

خيارات الضبط

تتضمن هذه المهمة خيارات التهيئة التالية لتطبيقات بايثون:

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

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

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

البث المباشر: وضع بث مباشر لبيانات الإدخال، مثل الكاميرا. في هذا الوضع، يجب استدعاء resultsListener لإعداد أداة معالجة الصوت لكي تتلقى النتائج بشكل غير متزامن.
{IMAGE, VIDEO, LIVE_STREAM} IMAGE
output_category_mask في حال ضبط هذه السياسة على True، سيتضمّن الناتج قناع تصنيف على شكل صورة uint8، حيث تشير كل قيمة بكسل إلى قيمة الفئة الفائزة. {True, False} False
output_confidence_masks في حال ضبط هذه القيمة على True، تتضمّن النتيجة قناع تصنيف على شكل صورة ذات قيمة عائمة، حيث تمثل كل قيمة عائمة خريطة نتيجة الثقة للفئة. {True, False} True
display_names_locale تحدِّد هذه السياسة لغة التصنيفات التي سيتم استخدامها للأسماء المعروضة في البيانات الوصفية لنموذج المهمة، إذا كان ذلك متاحًا. الإعداد التلقائي هو en للغة الإنجليزية. يمكنك إضافة تصنيفات مترجَمة إلى البيانات الوصفية لنموذج مخصّص باستخدام TensorFlow Lite Metadata Scriptr API. رمز اللغة en
result_callback تعمل هذه السياسة على ضبط أداة معالجة النتائج لتلقّي نتائج التقسيم على نحو غير متزامن عندما يكون مقسّم الصور في وضع البث المباشر. لا يمكن استخدام هذا الخيار إلا عند ضبط وضع التشغيل على 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.