اكتشاف الكائنات ثلاثية الأبعاد (الصناديق المحيطة ثلاثية الأبعاد) في Python باستخدام ذكاء بيانات MediaPipe Objectron PlatoBlockchain. البحث العمودي. عاي.

اكتشاف الكائنات ثلاثية الأبعاد (الصناديق المحيطة ثلاثية الأبعاد) في Python باستخدام MediaPipe Objectron

المُقدّمة

لقد اكتسب اكتشاف الكائنات زخمًا، ويتم إجراء تحسينات على عدة طرق لحلها. في العامين الماضيين، تفوقت الأساليب المعتمدة على YOLO على الأساليب الأخرى من حيث الدقة والسرعة، مع التطورات الحديثة مثل YOLOv7 وYOLOv6 (الذي تم إصداره بشكل مستقل، بعد YOLOv7).

ومع ذلك - كل هذه الأمور مثيرة للقلق كشف الكائنات ثنائية الأبعاد، وهي مهمة صعبة في حد ذاتها. في الآونة الأخيرة، تمكنا من الأداء بنجاح كشف الكائنات ثنائية الأبعادوعلى الرغم من أن أجهزة الكشف هذه لا تزال في مرحلة غير مستقرة أكثر من أجهزة الكشف عن الأجسام ثنائية الأبعاد، إلا أن دقتها آخذة في الارتفاع.

في هذا الدليل، سنقوم بالكشف عن الكائنات ثلاثية الأبعاد في لغة Python باستخدام كائن MediaPipe.

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

يمكن استخدام كل هذه العناصر في المهام النهائية - مثل تطبيق المرشحات على الوجوه، والتركيز الآلي للكاميرا، والتحقق من القياسات الحيوية، والروبوتات التي يتم التحكم فيها يدويًا، وما إلى ذلك. وتتوفر معظم المشاريع مع واجهات برمجة التطبيقات لأنظمة Android وiOS وC++ وPython وJavaScript، بينما بعضها متاح فقط للغات معينة.

في هذا الدليل، سنعمل مع كائن MediaPipe، متاح لأنظمة Android وC++ وPython وJavaScript.

MediaPipe والكشف عن الكائنات ثلاثية الأبعاد

كائن تم تدريب الحل على مجموعة بيانات الكائن، والذي يحتوي على مقاطع فيديو قصيرة تركز على الكائنات. تحتوي مجموعة البيانات على 9 كائنات فقط: الدراجات، والكتب، والزجاجات، والكاميرات، وصناديق الحبوب، والكراسي، والأكواب، وأجهزة الكمبيوتر المحمولة والأحذية، لذا فهي ليست مجموعة بيانات عامة جدًا، ولكن معالجة وشراء مقاطع الفيديو هذه مكلفة إلى حد ما (أوضاع الكاميرا، متناثرة) السحب النقطية، وتوصيف الأسطح المستوية، وما إلى ذلك لكل إطار من كل فيديو)، مما يجعل حجم مجموعة البيانات حوالي 2 تيرابايت.

نموذج Objectron المدرّب (المعروف باسم a حل لمشاريع MediaPipe) يتم تدريبه على أربع فئات – الأحذية والكراسي والأكواب والكاميرات.

يستخدم اكتشاف الكائنات ثنائية الأبعاد مصطلح "المربعات المحيطة"، في حين أنها في الواقع مستطيلات. يتنبأ اكتشاف الكائنات ثلاثية الأبعاد فعليًا مربعات حول الكائنات، والتي يمكنك من خلالها استنتاج اتجاهها وحجمها وحجمها التقريبي وما إلى ذلك. وهذه مهمة صعبة إلى حد ما، خاصة في ظل عدم وجود مجموعات البيانات المناسبة وتكلفة إنشائها. وعلى الرغم من صعوبتها، إلا أن المشكلة تبشر بالخير بالنسبة للكثيرين الحقيقة المدمجة (AR) التطبيقات!

يمكن تشغيل حل Objectron في وضع مرحلة واحدة أو مرحلتين - حيث يكون وضع المرحلة الواحدة أفضل في اكتشاف كائنات متعددة، بينما يكون الوضع ذو المرحلتين أفضل في اكتشاف كائن رئيسي واحد في المشهد، ويعمل بشكل ملحوظ أسرع. يستخدم خط الأنابيب أحادي المرحلة العمود الفقري MobileNetV2، بينما يستخدم خط الأنابيب ذو المرحلتين واجهة برمجة تطبيقات TensorFlow Object Detection.

عندما يتم اكتشاف كائن ما في مقطع فيديو، لا يتم إجراء تنبؤات إضافية له في كل إطار لسببين:

  • تؤدي التنبؤات المستمرة إلى توتر شديد (بسبب العشوائية المتأصلة في التنبؤات)
  • يعد تشغيل نماذج كبيرة على كل إطار أمرًا مكلفًا

يقوم الفريق بتفريغ التوقعات الثقيلة للمواجهات الأولى فقط ثم يتتبع هذا المربع طالما أن الكائن المعني لا يزال في المشهد. بمجرد كسر خط الرؤية وإعادة ظهور الجسم، يتم إجراء التنبؤ مرة أخرى. وهذا يجعل من الممكن استخدام نماذج أكبر بدقة أعلى، مع الحفاظ على المتطلبات الحسابية منخفضة، ويقلل من متطلبات البرامج الضارة للاستدلال في الوقت الفعلي!

لنبدأ ونثبت MediaPipe، ونستورد حل Objectron ونطبقه على الصور الثابتة وتغذية الفيديو القادمة مباشرة من الكاميرا.

تثبيت ميديابيبي

لنقم أولاً بتثبيت MediaPipe وإعداد طريقة مساعدة لجلب الصور من عنوان URL محدد:

! pip install mediapipe

بعد تثبيت الإطار، فلنستورده إلى جانب المكتبات الشائعة:

import mediapipe as mp

import cv2
import numpy as np
import matplotlib.pyplot as plt

لنحدد طريقة مساعدة لجلب الصور المعطاة لعنوان URL والتي تُرجع مصفوفة RGB تمثل تلك الصورة:

import PIL
import urllib

def url_to_array(url):
    req = urllib.request.urlopen(url)
    arr = np.array(bytearray(req.read()), dtype=np.int8)
    arr = cv2.imdecode(arr, -1)
    arr = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
    return arr

mug = 'https://goodstock.photos/wp-content/uploads/2018/01/Laptop-Coffee-Mug-on-Table.jpg'
mug = url_to_array(mug)

أخيرًا، سنرغب في استيراد كل من حل Objectron وأدوات الرسم المساعدة لتصور التنبؤات:

mp_objectron = mp.solutions.objectron
mp_drawing = mp.solutions.drawing_utils

اكتشاف الكائنات ثلاثية الأبعاد على الصور الثابتة باستخدام MediaPipe

Objectron يسمح الفصل بالعديد من الوسائط، بما في ذلك:

  • static_image_mode: سواء كنت تغذي صورة أو مجموعة من الصور (فيديو)
  • max_num_objects: الحد الأقصى لعدد الكائنات التي يمكن تحديدها
  • min_detection_confidence: عتبة ثقة الكشف (مدى التأكد من أن الشبكة يجب أن تصنف كائنًا لفئة معينة)
  • model_name: النموذج الذي ترغب في تحميله بينهما 'Cup', 'Shoe', 'Camera' و 'Chair'.

مع وضع ذلك في الاعتبار - فلنقم بإنشاء مثيل لـ Objectron و process() صورة الإدخال:


objectron = mp_objectron.Objectron(
    static_image_mode=True,
    max_num_objects=5,
    min_detection_confidence=0.2,
    model_name='Cup')


results = objectron.process(mug)

results تحتوي على معالم ثنائية وثلاثية الأبعاد للكائن (الأشياء) المكتشفة بالإضافة إلى التدوير والترجمة والمقياس لكل منها. يمكننا معالجة النتائج ورسم المربعات المحيطة بسهولة إلى حد ما باستخدام أدوات الرسم المتوفرة:

تحقق من دليلنا العملي العملي لتعلم Git ، مع أفضل الممارسات ، والمعايير المقبولة في الصناعة ، وورقة الغش المضمنة. توقف عن أوامر Googling Git وفي الواقع تعلم ذلك!

if not results.detected_objects:
    print(f'No box landmarks detected.')


annotated_image = mug.copy()
for detected_object in results.detected_objects:
    
    mp_drawing.draw_landmarks(annotated_image, 
                              detected_object.landmarks_2d, 
                              mp_objectron.BOX_CONNECTIONS)

    
    mp_drawing.draw_axis(annotated_image, 
                         detected_object.rotation, 
                         detected_object.translation)
  

fig, ax = plt.subplots(figsize=(10, 10))
ax.imshow(annotated_image)
ax.axis('off')
plt.show()

وينتج عنه:

اكتشاف الكائنات ثلاثية الأبعاد من الفيديو أو كاميرا الويب باستخدام MediaPipe

هناك تطبيق أكثر إثارة على مقاطع الفيديو! لا يتعين عليك تغيير الكود كثيرًا لاستيعاب مقاطع الفيديو، سواء كنت تقدم مقطع فيديو من كاميرا الويب أو ملف فيديو موجود. يعد OpenCV مناسبًا بشكل طبيعي لقراءة إطارات الفيديو ومعالجتها وإدخالها في نموذج الكائنات:


cap = cv2.VideoCapture(0)



objectron = mp_objectron.Objectron(static_image_mode=False,
                            max_num_objects=5,
                            min_detection_confidence=0.4,
                            min_tracking_confidence=0.70,
                            model_name='Cup')
                            

while cap.isOpened():
    success, image = cap.read()

    image.flags.writeable = False
    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = objectron.process(image)

    image.flags.writeable = True
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
    if results.detected_objects:
        for detected_object in results.detected_objects:
            
            mp_drawing.draw_landmarks(image, 
                                      detected_object.landmarks_2d, 
                                      mp_objectron.BOX_CONNECTIONS)
            
            mp_drawing.draw_axis(image, 
                                 detected_object.rotation,
                                 detected_object.translation)

    cv2.imshow('MediaPipe Objectron', cv2.flip(image, 1))
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

جعل الصورة غير قابلة للكتابة مع image.flags.writeable = False يجعل العملية تسير بشكل أسرع إلى حد ما، وهو تغيير اختياري. الاخير cv2.flip() على الصورة الناتجة هو أيضًا أمر اختياري - وببساطة يجعل الإخراج معكوسًا لجعله أكثر سهولة قليلاً.

عند تشغيلها على الكاميرا وكوب ايكيا الشائع عالميًا، هذه هي النتائج:

اكتشاف الكائنات ثلاثية الأبعاد (الصناديق المحيطة ثلاثية الأبعاد) في Python باستخدام ذكاء بيانات MediaPipe Objectron PlatoBlockchain. البحث العمودي. عاي.

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

اكتشاف الكائنات ثلاثية الأبعاد (الصناديق المحيطة ثلاثية الأبعاد) في Python باستخدام ذكاء بيانات MediaPipe Objectron PlatoBlockchain. البحث العمودي. عاي.

تتوقف التنبؤات بالنسبة للكائن عند الاكتشاف الأول، ويلتقط تتبع الصندوق بوضوح أن الكائن قد غادر الإطار، ويقوم بإجراء التنبؤ والتتبع مرة أخرى بمجرد عودة الكائن إلى الإطار. يبدو أن التتبع يعمل بشكل أفضل إلى حد ما عندما يتمكن النموذج من رؤية مقبض القدح، نظرًا لأن المخرجات تكون أكثر توترًا عندما لا يكون المقبض مرئيًا (ربما لأنه من الصعب التأكد بدقة من الاتجاه الحقيقي للكوب).

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

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

وفي الختام

لا يزال اكتشاف الكائنات ثلاثية الأبعاد في مرحلة مبكرة إلى حد ما، ويعتبر Objectron من MediaPipe بمثابة عرض توضيحي قادر! على الرغم من حساسيته لظروف الإضاءة، وأنواع الكائنات (الأكواب الشفافة مقابل غير الشفافة، وما إلى ذلك) والتوتر قليلاً، إلا أن Objectron يقدم لمحة جيدة عما سيكون من الممكن القيام به قريبًا بدقة أعلى وإمكانية الوصول أكثر من أي وقت مضى.

الطابع الزمني:

اكثر من ستاكابوز