إسماعيل بن علا

YOLO Object Detector

YOLOv1 من الورقة البحثية، في PyTorch

الرؤية الحاسوبية · شتنبر 2023 · مكتمل

أعطه صورة فيرسم صندوقاً حول كل جسم يعرفه، مع فئته، في تمريرة واحدة.

التقنياتPyTorchtorchvisionpytestMatplotlibNumPyKaggleGoogle Colab

YOLO Object Detector — نظرة عامة

نظرة عامة

يحوّل YOLOv1 كشف الأجسام (object detection) إلى انحدار واحد: تُقسَّم الصورة إلى شبكة 7 × 7، والخلية التي تحوي مركز الجسم تتنبأ بفئته وبصندوقين مرشحين مع ثقة. ترى الشبكة الصورة كاملة دفعة واحدة، فيكون الكشف تمريرة أمامية واحدة. كتبت كل جزء منه في PyTorch من الورقة البحثية: الشبكة ذات الـ24 طبقة، وخسارة مجموع مربعات الخطأ، وترميز الأهداف، وفك الترميز، وكبح القيم غير العظمى (non-max suppression)، وmAP، بلا مكتبة كشف ولا أوزان مدرّبة مسبقاً.

بدأ المشروع في 2023 كدفترين مدرَّبين على إشارات المرور من Mapillary. وحين أعدت كتابته كحزمة مختبَرة وجدت أن ملفي CSV للاختبار والتحقق كانا مجموعتين فرعيتين من ملف CSV للتدريب، فكل mAP كان قد قيس على صور التدريب؛ وأن الفئات فوق 20 لم تكن تُحسب أبداً؛ وأن الصناديق كانت تُرسم من مركزها كأنه زاوية؛ وأن الصندوق الثاني في كل خلية لم يكن يُستخدم عند الاختبار. ويحتفظ مجلد legacy بالدفاتر والقائمة الكاملة للتصحيحات.

لإظهار أن خط المعالجة يتعلم دون تدريب مسبق على ImageNet، أضفت مجموعتي بيانات تعملان على CPU: أشكال اصطناعية وأرقام MNIST مبعثرة على لوحة. تبلغ شبكة صغيرة من 8.3M معلمة mAP@0.5 على التحقق قدره 0.952 على الأشكال و0.921 على الأرقام في نحو 25 دقيقة لكل منهما. وPASCAL VOC وأي مجلد بصيغة YOLO مدعومان عبر الأمر نفسه ودفتر Kaggle / Colab، لكن تلك التشغيلات على GPU غير مبلَّغ عنها.

السؤال

هل يستطيع كاشف أحادي التمريرة مكتوب بلا مكتبات كشف ولا أوزان مدرّبة مسبقاً أن يتعلم إيجاد الأجسام وتصنيفها، وكيف أثبت أن كود الخسارة وفك الترميز وmAP صحيح؟

أهم الميزات

كيف يعمل

  1. ترميز الأهداف

    يذهب كل صندوق حقيقة أرضية إلى خلية الشبكة التي تحوي مركزه، كإزاحة داخل الخلية وحجم نسبي إلى الصورة وفئة أحادية الترميز، فينتج موتّر S × S × (C + 5B).

  2. تمريرة أمامية واحدة

    كتل التفاف وتطبيع دفعات وleaky-ReLU مع أربعة تجميعات قصوى تختزل الصورة إلى خريطة 7 × 7؛ وطبقتان كاملتا الاتصال تخرجان كل صندوق وثقة واحتمال فئة دفعة واحدة.

  3. خسارة مجموع مربعات الخطأ

    لكل جسم، الصندوق ذو أعلى IoU هو المسؤول ويُجذب نحو الإحداثيات الهدف ونحو ثقة 1؛ وكل متنبئ آخر يُدفع نحو ثقة 0 مرجَّحاً بـ λ_noobj؛ وتُنحدر احتمالات الفئات في خلايا الأجسام.

  4. فك الترميز والكبح

    يحصل كل صندوق على الدرجة الثقة × أفضل احتمال فئة؛ وتُسقط الصناديق تحت العتبة، وتُزال صناديق الفئة نفسها التي تتداخل مع صندوق محتفَظ به فوق IoU الخاص بـ NMS.

  5. قياس mAP

    لكل فئة، تُرتَّب الاكتشافات حسب الدرجة، وتُطابَق مع حقيقة أرضية غير مطابَقة عند IoU ≥ 0.5، وAP هو المساحة تحت غلاف الدقة؛ وmAP يأخذ متوسط الفئات التي لها حقيقة أرضية.

أمثلة

صور تحقق الأشكال: الحقيقة الأرضية في الأعلى، والتنبؤات بعد 20 حقبة في الأسفل. تبلغ الشبكة الصغيرة mAP@0.5 على التحقق قدره 0.952 (الدائرة 0.94، والمربع 0.97، والمثلث 0.94).
صور تحقق الأشكال: الحقيقة الأرضية في الأعلى، والتنبؤات بعد 20 حقبة في الأسفل. تبلغ الشبكة الصغيرة mAP@0.5 على التحقق قدره 0.952 (الدائرة 0.94، والمربع 0.97، والمثلث 0.94).
أرقام MNIST مبعثرة على لوحة: الحقيقة الأرضية في الأعلى، والصناديق المتنبَّأ بها مع الفئة والدرجة في الأسفل (عتبة العرض 0.3). mAP@0.5 على التحقق هو 0.921؛ وأضعف الفئات الرقم 1 عند 0.75 والرقم 8 عند 0.88.
أرقام MNIST مبعثرة على لوحة: الحقيقة الأرضية في الأعلى، والصناديق المتنبَّأ بها مع الفئة والدرجة في الأسفل (عتبة العرض 0.3). mAP@0.5 على التحقق هو 0.921؛ وأضعف الفئات الرقم 1 عند 0.75 والرقم 8 عند 0.88.
تشغيل MNIST على مدى 12 حقبة: خسارة التدريب والتحقق، وmAP@0.5 على التحقق يصعد إلى 0.92، ومكوّنات الخسارة الأربعة (الإحداثيات، وثقة الجسم، وثقة اللاجسم، والفئة).
تشغيل MNIST على مدى 12 حقبة: خسارة التدريب والتحقق، وmAP@0.5 على التحقق يصعد إلى 0.92، ومكوّنات الخسارة الأربعة (الإحداثيات، وثقة الجسم، وثقة اللاجسم، والفئة).

المدخل

yolov1-train --dataset mnist --root data --image-size 112 --arch small --hidden 512 --dropout 0.3 --no-augment --train-size 10000 --val-size 500 --epochs 12 --batch-size 32 --lr 1e-3 --output-dir checkpoints/mnist

المخرج

checkpoints/mnist/: best.pt (highest validation mAP), last.pt, history.json, history.png, predictions.png, best_metrics.json — validation mAP@0.5 0.921 after 12 epochs, about 26 minutes on an 8-core CPU.

وصفة MNIST من ملف README. بـ3,000 صورة تدريب فقط تفرط الشبكة نفسها في التخصيص (خسارة تدريب 0.3، وتحقق 1.6، وmAP 0.55)، ولهذا يستخدم التشغيل 10,000.

التقنيات المستخدمة

ما تعلمته

الحدود

الكلمات المفتاحية

YOLO · YOLOv1 · كشف الأجسام · You Only Look Once · PyTorch · كبح القيم غير العظمى · NMS · متوسط الدقة المتوسطة · mAP · PASCAL VOC · MNIST · إشارات المرور Mapillary · الرؤية الحاسوبية · التعلم العميق