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

تُعد مجموعة بيانات medical-pills أعلاه — وهي لقطات مقرّبة لعبوات الأقراص، مع وضع مربع حول كل قرص — موضوعًا مناسبًا للتدقيق. تعرض منصة Ultralytics الأعداد الرئيسية في صفحة مجموعة البيانات؛ ويحسب النص البرمجي أدناه الأرقام التي تكشف التغطية، باستخدام النسخة المرفقة مع ultralytics:
from collections import Counter
from pathlib import Path
from PIL import Image, ImageStat
from ultralytics.data.utils import check_det_dataset
data = check_det_dataset("medical-pills.yaml") # downloads the dataset on first use
for split in ("train", "val"):
images = sorted(Path(data[split]).glob("*.jpg"))
labels = [Path(str(p).replace("/images/", "/labels/")).with_suffix(".txt") for p in images]
rows = [line.split() for f in labels if f.exists() for line in f.read_text().splitlines()]
classes = Counter(data["names"][int(r[0])] for r in rows)
backgrounds = sum(not f.exists() or not f.read_text().strip() for f in labels)
areas = sorted(float(r[3]) * float(r[4]) for r in rows) # box area as a share of the image
sizes = Counter(Image.open(p).size for p in images)
brightness = [ImageStat.Stat(Image.open(p).convert("L")).mean[0] for p in images]
print(f"{split}: {len(images)} images, {backgrounds} backgrounds, {dict(classes)}, sizes {dict(sizes)}")
print(f" boxes: median {areas[len(areas) // 2]:.1%} of the image, {sum(a < 0.01 for a in areas)} of {len(areas)} under 1%")
print(f" brightness: {min(brightness):.0f} to {max(brightness):.0f} (0 = black, 255 = white)")train: 92 images, 0 backgrounds, {'pill': 1623}, sizes {(1920, 1080): 92}
boxes: median 1.4% of the image, 320 of 1623 under 1%
brightness: 171 to 198 (0 = black, 255 = white)
val: 23 images, 0 backgrounds, {'pill': 399}, sizes {(1920, 1080): 23}
boxes: median 1.4% of the image, 79 of 399 under 1%
brightness: 171 to 198 (0 = black, 255 = white)اقرأ النتائج بوصفها تقريرًا عن التغطية، بحيث يُعرض اكتشاف واحد في كل سطر:
| النتيجة | دلالتها | القرار |
|---|---|---|
| دقة واحدة، 1920×1080 | كاميرا واحدة، وإعداد واحد | اجمع بيانات من كل طراز كاميرا ستنشر النموذج عليه |
| السطوع بين 171 و198 فقط | إضاءة استوديو ساطعة ومتجانسة، بلا ظروف خافتة | اجمع لقطات في ظروف خافتة وإضاءة خلفية وإضاءة مختلطة قبل النشر عند منضدة صيدلية |
| 0 صورة خلفية | لم يرَ النموذج قط مشهدًا بلا أقراص | أضف عبوات أقراص فارغة وأقراصًا أخرى ومناضد خالية بوصفها أمثلة سلبية صعبة |
| وسيط حجم المربع 1.4% من الصورة؛ ومربع واحد من كل خمسة أصغر من 1% | أجسام صغيرة | أبقِ imgsz مرتفعًا بما يكفي، وأدرج عمدًا لقطات للأجسام البعيدة |
فئة واحدة، pill | لا توجد أنواع مختلفة للأقراص | هذا مناسب للعدّ؛ ولا تضف فئات إلا إذا تطلب القرار ذلك |
لن يظهر أيٌّ من ذلك في درجة التحقق، لأن مجموعة التحقق تشترك في كل هذه السمات.
محاور التغطية الأربعة#
| المحور | ما ينبغي جمعه | الإخفاق المعتاد عند غيابه |
|---|---|---|
| الإضاءة | الفجر والظهيرة والغسق والليل والوهج والإضاءة الخلفية ومصابيح الفلورسنت الوامضة | ينهار الاستدعاء عند تغيّر الورديات أو تحت أشعة الشمس المباشرة |
| الطقس والظروف الجوية | المطر والضباب والثلج والغبار والتكاثف على العدسة | إيجابيات كاذبة بسبب القطرات، وحالات فائتة في الضباب الخفيف |
| الحجب والفوضى البصرية | أهداف محجوبة جزئيًا ومشاهد مزدحمة وأجسام مقطوعة عند حافة الإطار | يفوته الهدف كلما لم يكن ظاهرًا بالكامل |
| الكاميرا وموضع الرؤية | العدسة وارتفاع التثبيت وزاويته والدقة والضغط وضبابية الحركة | يعمل على كاميرا الموقع التجريبي، لكنه يفشل في الموقع التالي |
كان موضع الرؤية هو المحور الذي أغفلته تجربة المرسى: الفئة نفسها من زاوية جديدة، فانخفض الاستدعاء إلى الصفر.
الأمثلة السلبية الصعبة وصور الخلفية#
يجب أن يتعلم الكاشف أيضًا ما ليس الهدف. تبدو الأمثلة السلبية الصعبة مشابهةً للهدف ظاهريًا: ففي حالة كاشف الرافعات الشوكية، تشمل الأمثلة عربة نقل المنصات ورافعة المقص وانعكاس رافعة شوكية على أرضية مصقولة وملصق سلامة مطبوع عليه رسم رافعة شوكية.
في تنسيق YOLO، صورة الخلفية هي ببساطة صورة لا يوجد لها ملف تسميات — أي لا شيء يُرسم عليها. توصي نصائح التدريب من Ultralytics بنحو 0–10% من صور الخلفية للحد من الإيجابيات الكاذبة؛ وتشكل صور الخلفية نحو 1% من COCO نفسها. خصص هذه النسبة لأمثلة سلبية صعبة من بيئتك بدلًا من إطارات فارغة عشوائية. يمكن لـزيادة البيانات تغيير السطوع والزاوية، لكنها لا تستطيع ابتكار عربة نقل منصات لم يرها النموذج من قبل.
مواطن الخلل#
العَرَض: 10,000 صورة تحمل تسميات، كلها نهارية ومن كاميرا تجريبية واحدة. الحل: سجّل من كاميرات النشر طوال أسبوعين تقريبًا وفي كامل نطاق الظروف، ودقّق التغطية، ثم ادفع مقابل وضع التسميات. يمكن أن تسدّ البيانات الاصطناعية فجوة معروفة، لكنها لا تحل محل التسجيلات الحقيقية.
العَرَض: قيمة mAP مرتفعة على التحقق، ونتائج ضعيفة في أول موقع جديد. الحل: تذكّر أن مجموعة التحقق تشترك مع مجموعة البيانات في نقاطها العمياء. استخرج عشر صور تدريب عشوائية وعشرة إطارات من الإنتاج، واطلب من زميل تمييزها؛ إذا استطاع ذلك، فلديك فجوة نطاق.
لإنشاء خطة أخذ عينات بأعداد مستهدفة لكل حالة، تابع إلى جمع بيانات عالية الجودة وممثلة في بناء مجموعات بيانات YOLO عالية الأداء.
عرض الحل
بالنسبة إلى medical-pills المنشورة على منضدة صيدلية تحت إضاءة متجر مختلطة، املأ الشبكة اعتمادًا على التدقيق (سطوع 171–198، ومصدر واحد بدقة 1920×1080، وصفر من الخلفيات) وتصفح سريع للصور، يكشف عن العبوات نفسها على السطح الساطع نفسه من دون أيدٍ:
| الفئة | إضاءة استوديو ساطعة | إضاءة متجر خافتة أو دافئة | إضاءة خلفية / وهج | مغطى جزئيًا بيد | كاميرا هاتف |
|---|---|---|---|---|---|
pill | 2,022 | 0 | 0 | 0 | 0 |
| الخلفية | 0 | 0 | 0 | — | 0 |
خطة الجمع حسب الأولوية:
- إضاءة متجر خافتة أو دافئة — الحالة المعتادة للمنضدة، ولا توجد لها صور حاليًا.
- مغطى جزئيًا بيد — يحدث ذلك في كل تفاعل فعلي تقريبًا.
- كاميرا هاتف — مستشعر ثانٍ ودقة مختلفة.
- إضاءة خلفية / وهج — تعكس العبوات المغلفة بورق القصدير ضوء النوافذ والمصابيح السقفية.
السلبيات الصعبة: عبوات فقاعات فارغة (ورق القصدير نفسه، بلا حبوب) وأغراض دائرية أخرى على المنضدة — عملات وأزرار وحلوى. أضفها كصور خلفية، بنسبة تقارب 5–10% من مجموعة البيانات.