ابدأ بهدف العمل
حوّل هدفًا تجاريًا إلى مهمة رؤية وفئات محددة واختبار قبول يمكنك تشغيله برمجيًا، قبل جمع أي صورة.

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

تجيب خمسة صفوف عن الأسئلة التي تعتمد عليها كل خطوة لاحقة. ويتناول دليل تحديد أهداف المشروع الموضوعات نفسها بمزيد من التفصيل. إليك مثالًا مكتملًا لمستودع، تستند إليه هذه الدورة:
| الصف | السؤال الذي يجيب عنه | مثال المستودع |
|---|---|---|
| هدف العمل | ما التغيير المطلوب للعمل، ومتى؟ | خفض حوادث الاقتراب الخطر عند أبواب التحميل بنسبة 30% خلال ستة أشهر. |
| مهمة الرؤية | ما مخرجات النموذج؟ | كشف الكائنات: مربعات حول الرافعات الشوكية والأشخاص. |
| الفئات | ما الذي يحصل على تسمية تحديدًا؟ | forklift، person، pallet؛ وكل ما عداها يُعد خلفية. |
| اختبار القبول | ما القيمة التي تعني «جاهز للنشر»؟ | استدعاء person ≥ 0.95 عند دقة ≥ 0.85 على 500 إطار من كاميرات لم تُستخدم في التدريب. |
| خارج النطاق | ما الذي لن يعد به الإصدار الأول؟ | أرصفة تحميل حالكة الظلام، وأشخاص محجوبون بالكامل خلف الرفوف، ورافعات يدوية للمنصات. |
ثبّت الصفحة في مكان يستطيع الفريق بأكمله رؤيته. إذا اعترض أحد أصحاب المصلحة على صف لاحقًا، فعدّل الصفحة أولًا ثم مجموعة البيانات.
اختر أبسط مهمة تجيب عن السؤال#

تحدد المهمة ما يرسمه المعلّقون، وهذا بدوره يحدد معظم ميزانية وضع التسميات. اتبع شجرة القرار هذه، وتوقف عند أول مهمة تجيب عن سؤال العمل:
يدعم Ultralytics YOLO سبع مهام. عند تخطيط مجموعة البيانات، المهم هو تكلفة وضع التسميات لكل مهمة؛ ويقارن درس أساسيات الرؤية الحاسوبية بينها بالتفصيل في درس مهام الرؤية.
| المهمة | ما ينتجه المعلّقون | الجهد اللازم لوضع التسميات | اخترها عندما |
|---|---|---|---|
| التصنيف | تسمية واحدة لكل صورة | الأقل | تكفي إجابة واحدة لكل صورة |
| الكشف | فئة + مربع إحاطة بمحاذاة المحاور لكل كائن | منخفض | تحتاج إلى عدّ الكائنات أو تحديد مواقعها |
| OBB | فئة + مربع إحاطة مدوّر لكل كائن | متوسط | الكائنات طويلة ونحيلة، أو تُرى من الأعلى |
| الوضعية | فئة + نقاط مفتاحية مسماة لكل كائن | مرتفع | مواضع المفاصل أو أجزاء الجسم مهمة |
| تجزئة الكائنات | فئة + مضلع لكل كائن | مرتفع | محيط كل كائن مهم |
| التجزئة الدلالية | فئة لكل بكسل | الأعلى | تحتاج إلى مناطق، لا إلى كائنات قابلة للعد |
| تقدير العمق | لا شيء مرسوم: خريطة عمق لكل صورة، تأتي عادةً من مستشعر عمق | يعتمد ذلك على أجهزة الالتقاط | تحتاج إلى المسافة عند كل بكسل |

اقرأ لوحة الموز كما لو كانت قائمة أسعار: فالكشف يحدد بالفعل وجود الموز وموقعه وعدده، ولا تضيف لوحتا التقسيم سوى الحجم والشكل، مقابل تكلفة وسم أعلى بكثير. إذا كان العمل يحتاج فقط إلى معرفة «كم عدد الموزات»، فالكشف هو الحل، واستخدام المضلعات هدر للميزانية.
تلجأ الفرق غالبًا إلى التجزئة لأنها تبدو أدق، ثم تنفد ميزانية وضع التسميات قبل أن تغطي مجموعة البيانات المناوبات الليلية أو المطر أو الموقع الثاني. تكلف المضلعات عدة أضعاف تكلفة المربعات لكل كائن. اختر التجزئة فقط عندما يتطلب أحد بنود الهدف الحدود نفسها، مثل قياس المساحة أو اقتطاع قناع.
اكتب فئات يستطيع المعلّق تطبيقها#
لا تكون الفئة مفيدة إلا إذا صنّف معلّقان الكائن نفسه بالطريقة ذاتها. اكتب لكل فئة تعريفاً من جملة واحدة يذكر شيئاً مشابهاً في المظهر يستثنيه:
forklift: شاحنة رفع آلية، بما في ذلك شوكتاها وساريتها. لا تشمل رافعات المنصات اليدوية.person: أي إنسان، حتى إن كان ظاهراً جزئياً أو جالساً أو داخل مقصورة مركبة. لا تشمل الانعكاسات والملصقات.pallet: منصة شحن خشبية أو بلاستيكية، محمّلة أو فارغة. لا تشمل الصناديق المكدسة من دون قاعدة منصة.
بعد ذلك، اختر مستوى التفصيل عن قصد. الفئات العامة («مركبة») أقل تكلفة وأسرع تقارباً؛ أما الفئات الدقيقة («سيدان»، «شاحنة صغيرة») فهي أنفع في المراحل اللاحقة، لكن يصعب الحفاظ على اتساقها. ابدأ بما يحتاج إليه العمل. يمكن دمج التسميات الدقيقة في فئات عامة لاحقاً بسطر واحد من التعليمات البرمجية، لكن لا يمكن أبداً تقسيم الفئات العامة من دون إعادة الوسم.
«أي شيء يبدو خطيرًا» أو «الأشياء التي تسد الممر» ليست فئة. فهذا يطلب من كل شخص يعمل على التعليقات التوضيحية إصدار حكمه الخاص، ويتعلم النموذج المدرّب على أحكام غير متسقة عدم الاتساق. أعد صياغة الفئة الغامضة حتى يتمكن شخص جديد يعمل على التعليقات التوضيحية من تطبيقها استنادًا إلى التعريف وحده، أو حوّلها إلى قاعدة تُطبّق بعد الكشف (مثل «أي pallet داخل مضلع الممر»).
حوّل المقياس إلى اختبار قبول قابل للتنفيذ#
اختر المقياس الذي يتوافق مع تكلفة الخطأ:
- تفويت حالة مكلف (السلامة، العيوب): اجعل الاستدعاء لهذه الفئة شرطاً للاجتياز.
- الإنذار الكاذب مكلف (رفض الأجزاء آلياً، تنبيه الموظفين): اجعل الدقة شرطاً للاجتياز.
- كل الفئات متساوية الأهمية (العد، المخزون): اجعل AP لكل فئة شرطاً للاجتياز، كي لا تختبئ أي فئة خلف المتوسط.
يشرح دليل مقاييس أداء YOLO كل مقياس. ثم اكتب الاختبار على هيئة تعليمات برمجية، كي لا يعود السؤال «هل الأداء جيد بما يكفي؟» موضع نقاش. يعمل هذا البرنامج النصي اليوم بنموذج مدرّب مسبقاً على مجموعة العرض COCO8، ثم يعمل لاحقاً باستخدام نقطة تحقق خاصة بك ومجموعة اختبار محجوبة:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # later: your fine-tuned runs/detect/train/weights/best.pt
metrics = model.val(data="coco8.yaml", classes=[0], verbose=False) # 0 = person; later: your holdout YAML
precision, recall = metrics.box.mp, metrics.box.mr
print(f"person: precision={precision:.2f} recall={recall:.2f}")
print("PASS" if recall >= 0.95 and precision >= 0.85 else "FAIL: below the acceptance test") all 4 10 0.939 0.8 0.848 0.387
person: precision=0.94 recall=0.80
FAIL: below the acceptance testما الذي يخبرك به كل سطر:
- يقيّم
classes=[0]الفئةpersonفقط، لذا لا يمكن للفئات الأخرى رفع النتيجة. استخدم معرّف فئة السلامة الخاص بك. - يُظهر صف أداة التحقق 4 صور تضم 10 أشخاص موسومين. يمثّل
mpوmrالدقة والاستدعاء عند عتبة الثقة التي تحقق أفضل توازن بينهما (أقصى F1). - يعثر نموذج COCO المدرّب مسبقاً على 8 من أصل 10 أشخاص، لذا يبلغ الاستدعاء 0.80: نتيجة دقيقة، لكنها غير آمنة بما يكفي. إن ظهور نتيجة FAIL يعني أن الاختبار يؤدي وظيفته. في هذه الدورة، تعني نتيجة FAIL الرجوع إلى البيانات، لا إلى المعلمات الفائقة.
الاختبار المستخرج من الكاميرات والأيام نفسها المستخدمة في التدريب يقيس الحفظ، لا الجاهزية. حدّد مجموعة الحجز في الهدف («كاميرات لم تُستخدم في التدريب»، «أسبوعا اللقطات الأخيران»)، وأنشئها باستخدام قسّم مجموعة البيانات على نحو صحيح.
دوّن ما لن يفعله الإصدار الأول v1#
لا يوجد نموذج مثالي، لذا حدّد مسبقاً حالات الإخفاق المقبولة: الظروف التي لن تقدم وعوداً بشأنها (الضباب الكثيف، الظلام الدامس)، والأشياء المتشابهة التي تقبل الالتباس بينها، والفئات النادرة المؤجلة إلى الإصدار الثاني v2. يمنع هذا الصف الحكم على نموذج يحقق هدفه وفق معيار 100% غير مكتوب، ويوضح لفريق جمع البيانات أين لا ينبغي إنفاق الجهد في الوقت الحالي.
عرض الحل
مثال عملي لهدف مشروع مختلف: سلسلة متاجر بقالة تكشف الخانات الفارغة على الرفوف:
| الصف | الإجابة |
|---|---|
| هدف العمل | خفض دقائق نفاد المخزون للمنتجات الـ200 الأعلى مبيعاً بنسبة 25% خلال ربع سنة. |
| مهمة الرؤية | الكشف. يحتاج المتجر إلى موقع كل خانة فارغة، لا إلى محيطها، لذا تتفوق الصناديق على المضلعات. |
| الفئات | gap: خانة رف فارغة بعرض منتج واحد على الأقل؛ لا تشمل الخانات التي يحجبها متسوق أو عربة. price_tag: بطاقة حافة الرف؛ لا تشمل الملصقات الترويجية. |
| اختبار القبول | استدعاء gap ≥ 0.90 عند دقة ≥ 0.80، على 400 صورة من 5 متاجر لم تُستخدم في التدريب. |
| خارج النطاق | أبواب المجمّدات التي تعاني من الوهج، وعروض نهايات الممرات، وقسم المنتجات الطازجة. |
يأتي الاستدعاء أولاً لأن تفويت خانة فارغة يكلف عملية بيع، بينما يكلف الإنذار الكاذب أحد الموظفين جولة قصيرة. يتغير acceptance_test.py في ثلاثة مواضع فقط: data="holdout_stores.yaml" (المتاجر الخمسة غير المرئية)، وclasses=[0] (أصبح 0 هو gap)، والعتبات recall >= 0.90 and precision >= 0.80.