YOLO Object Detector
YOLOv1 من الورقة البحثية، في PyTorch
أعطه صورة فيرسم صندوقاً حول كل جسم يعرفه، مع فئته، في تمريرة واحدة.
- mAP@0.5 0.952
- 8.3 M معامل، نحو 25 دقيقة على CPU
- شبكة الورقة: 271.7 M معامل
التقنياتPyTorch
torchvision
pytestMatplotlib
NumPy
Kaggle
Google Colab

نظرة عامة
يحوّل 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 صحيح؟
أهم الميزات
- معماريتان خلف راية (flag) واحدة: شبكة الورقة بـ24 طبقة التفافية + 2 FC (271.7M معلمة، 448 px) وشبكة صغيرة بـ6 طبقات التفافية (8.3M معلمة، 112 px) لتشغيلات CPU، كلتاهما بتطبيع الدفعات (batch norm) ومضاعِف عرض.
- خسارة الورقة لأي عدد من الصناديق في كل خلية: المتنبئ ذو أفضل IoU هو المسؤول، وλ_coord = 5 وλ_noobj = 0.5، وأحجام الصناديق بالجذر التربيعي، وتسجيل المكوّنات الأربعة في كل حقبة.
- فك الترميز بدرجة خاصة بالفئة هي الثقة × P(class)، وكبح القيم غير العظمى لكل فئة، وmAP@0.5 على طريقة VOC بالاستيفاء على كل النقاط.
- أربع مجموعات بيانات براية واحدة: أشكال مولَّدة آنياً، وأرقام MNIST على لوحة، وPASCAL VOC 2007 / 2012، وأي مجلد images/ + labels/ بصيغة YOLO النصية مع تقسيم تدريب / تحقق ببذرة ثابتة.
- تعزيز على طريقة الورقة (مقياس، وإزاحة، وقلب، واهتزاز سطوع وتشبع) يحرّك الصناديق ويقصّها، مع مفتاح لتعطيله.
- ثلاثة أوامر: yolov1-train يكتب best.pt ومنحنيات السجل وشبكة تنبؤ وAP لكل فئة؛ وyolov1-evaluate يبلّغ عن mAP؛ وyolov1-predict يرسم الصناديق على ملفات أو بث كاميرا ويب.
- مجموعة اختبارات pytest تتحقق من IoU والترميز وفك الترميز وكل مكوّن من الخسارة وmAP وNMS مقابل قيم محسوبة يدوياً، إضافة إلى فحص سلامة بفرط التخصيص على أربع صور.
كيف يعمل
ترميز الأهداف
يذهب كل صندوق حقيقة أرضية إلى خلية الشبكة التي تحوي مركزه، كإزاحة داخل الخلية وحجم نسبي إلى الصورة وفئة أحادية الترميز، فينتج موتّر S × S × (C + 5B).
تمريرة أمامية واحدة
كتل التفاف وتطبيع دفعات وleaky-ReLU مع أربعة تجميعات قصوى تختزل الصورة إلى خريطة 7 × 7؛ وطبقتان كاملتا الاتصال تخرجان كل صندوق وثقة واحتمال فئة دفعة واحدة.
خسارة مجموع مربعات الخطأ
لكل جسم، الصندوق ذو أعلى IoU هو المسؤول ويُجذب نحو الإحداثيات الهدف ونحو ثقة 1؛ وكل متنبئ آخر يُدفع نحو ثقة 0 مرجَّحاً بـ λ_noobj؛ وتُنحدر احتمالات الفئات في خلايا الأجسام.
فك الترميز والكبح
يحصل كل صندوق على الدرجة الثقة × أفضل احتمال فئة؛ وتُسقط الصناديق تحت العتبة، وتُزال صناديق الفئة نفسها التي تتداخل مع صندوق محتفَظ به فوق IoU الخاص بـ NMS.
قياس mAP
لكل فئة، تُرتَّب الاكتشافات حسب الدرجة، وتُطابَق مع حقيقة أرضية غير مطابَقة عند IoU ≥ 0.5، وAP هو المساحة تحت غلاف الدقة؛ وmAP يأخذ متوسط الفئات التي لها حقيقة أرضية.
أمثلة



المدخل
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.
التقنيات المستخدمة
الشبكة والخسارة وفك الترميز وNMS وmAP وحلقة التدريب
تنزيل MNIST وPASCAL VOC وتحويلات الصور
فحوص محسوبة يدوياً للصناديق والخسارة والمقاييس والبيانات واختبار سلامة بفرط التخصيص
منحنيات التدريب وشبكات التنبؤ
توليد الأشكال وإدارة الصناديق
دفتر تدريب على GPU لـ VOC ومجموعات البيانات بصيغة YOLO
الدفتر نفسه، مولَّد من src بواسطة build_notebook.py
ما تعلمته
- كاشف لا يستطيع حفظ أربع صور فيه خطأ في بياناته أو خسارته أو فك ترميزه، لذا فاختبار فرط التخصيص هو أنفع اختبار في المجموعة
- التعزيز (augmentation) يجب أن يحترم التسميات: الرقم المقلوب أفقياً رقم مختلف، لذا يتدرب تشغيل MNIST بلا قلب
الحدود
- لم يُبلَّغ عن أي تدريب على PASCAL VOC أو Mapillary: شبكة الورقة تحتاج إلى GPU، والأرقام المنشورة تدريبات قصيرة على CPU ببيانات بسيطة
- دفاتر 2023 التي انطلق منها المشروع قاست mAP على صور التدريب، لذا لا يقارَن أي من أرقامها بالحزمة
الكلمات المفتاحية
YOLO · YOLOv1 · كشف الأجسام · You Only Look Once · PyTorch · كبح القيم غير العظمى · NMS · متوسط الدقة المتوسطة · mAP · PASCAL VOC · MNIST · إشارات المرور Mapillary · الرؤية الحاسوبية · التعلم العميق