الوحدة 9 — التوسيم والتكثير وجودة مجموعات البيانات
المعمارية والخسارة والتقييم — كلّ ما سبق مهمّ. لكن جودة البيانات تُقرّر الأداء أكثر من أيّ منها. مشروع تقاطع الطرق يتطلّب مجموعة صور موسومة بدقّة، بتنوّع كافٍ، وتقسيم صحيح بين تدريب وتقييم. هذه الوحدة تعالج المسائل العملية الحاسمة التي تُغفل في معظم الكتب.
أدوات التوسيم
مجموعة أدوات ناضجة اليوم:
- CVAT (Computer Vision Annotation Tool): مفتوح المصدر من Intel، ممتاز للفرق. يدعم الصناديق والأقنعة والنقاط الرئيسية، ويستورد ويُصدّر بكلّ الصيغ الشائعة. يعمل في المتصفّح.
- Label Studio: مفتوح المصدر، أعمّ من الرؤية لكنّه ممتاز فيها. يُدمج نماذج مسبقة لتسريع التوسيم (نتنبّأ ثم نصحّح).
- Roboflow: خدمة مُدارة، تُبسّط التوسيم والتقسيم والتصدير. مجّانية للمشاريع الصغيرة.
- Segments.ai وScale AI: خدمات تجارية عالية الجودة، تُستأجَر لفرق التوسيم.
توسيم مسرَّع بـSAM
كما رأت الوحدة 7، Segment Anything يقلّب اقتصاديات التوسيم. تدفّق شائع اليوم:
- المُوسِّم يرسم صندوقًا خشنًا حول جسم
- SAM يُنتج قناعًا دقيقًا داخل الصندوق فورًا
- المُوسِّم يوافق أو يُعدّل بنقرات إضافية
الوقت لكلّ قناع ينزل من قرابة 90 ثانية إلى قرابة 15 ثانية، والدقّة تتحسّن (فSAM أدقّ من الإنسان المتعب في نهاية جلسة طويلة).
الاتّفاق بين المُوسِّمين
قاعدة عمليّة: أيّ توسيم مهمّ يجب أن يقوم به شخصان على الأقلّ، والاتّفاق بينهما يُقاس رياضيًا. لماذا؟ لأنّ التوسيم البشري يحمل ذاتيّة لا يمكن كشفها إلّا بالمقارنة.
مثال ملموس: صندوق سيّارة مرئية جزئيًا خلف عمود. مُوسِّم يرسم صندوقًا حول الجزء المرئي فقط؛ آخر يرسم صندوقًا يُقدّر أبعاد السيّارة كاملة. الاثنان معقولان، لكنّ النموذج المُدرَّب على مزيج منهما سيتعلّم قواعد متضاربة.
Cohen's Kappa يقيس الاتّفاق مع تصحيح الصدفة، ويعطي رقمًا بين 0 (عشوائي) و1 (اتّفاق تامّ). للتوسيم في الرؤية، متوسّط IoU بين توسيمات مختلفة على نفس الصور مقياس عملي.
عتبات تفسيرية:
- IoU > 0.85 بين مُوسِّمَين: توسيم متّسق، صالح للاستخدام
- IoU بين 0.65 و0.85: مُنطلَق مقبول، يحتاج تصحيح مبادئ التوسيم
- IoU < 0.65: مشكلة جوهرية في التعليمات؛ إعادة توسيم مجموعة صغيرة مع مُنسِّق
دليل التوسيم المكتوب يُقلّل هذا الخلاف بشدّة: نصّ يُحدّد صراحةً كيف نرسم الصندوق حول جسم مقطوع بالإطار، وكيف نتعامل مع الحجب الجزئي، ومتى نعتبر الجسم صغيرًا جدًّا للتوسيم.
التكثير المتوافق مع الصناديق
التكثير (data augmentation) يخلق تنويعات من الصور المتاحة لزيادة تنوّع التدريب دون توسيم إضافي. في الرؤية، بعض التحويلات تُبقي الصناديق سليمة (كتغيير الإضاءة)، وبعضها يُغيّر إحداثيات الصناديق (كالانقلاب أو الاقتصاص).
Albumentations هي المكتبة القياسية اليوم. سريعة (مكتوبة بجزء منها في C++)، ومتكاملة مع كلّ الأُطر، وتدير الصناديق والأقنعة تلقائيًا مع تحويلات الصورة.
import albumentations as A
from albumentations.pytorch import ToTensorV2
pipeline = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(brightness_limit=0.2, contrast_limit=0.2, p=0.5),
A.RandomRain(p=0.1), # كاميرا التقاطع في الطقس المتقلب
A.MotionBlur(blur_limit=5, p=0.1),
A.RandomScale(scale_limit=0.2, p=0.5),
A.Resize(640, 640),
ToTensorV2(),
], bbox_params=A.BboxParams(
format="yolo", # (x_center, y_center, w, h) مسواة
label_fields=["class_labels"],
min_visibility=0.3, # نحذف الصناديق التي ظهر منها اقل من 30%
))
image = ... # (H, W, 3)
bboxes = [[0.35, 0.42, 0.15, 0.10], [0.60, 0.55, 0.20, 0.25]]
class_labels = ["car", "car"]
result = pipeline(image=image, bboxes=bboxes, class_labels=class_labels)
image_augmentee = result["image"]
bboxes_augmentees = result["bboxes"]
قاعدة ذهبية: لا تُكثّر مجموعة التقييم. التقييم يجب أن يُقاس على البيانات الحقيقية كما ستأتي في الإنتاج، لا على تنويعات صناعية.
تسرّب البيانات عبر الصور المتقاربة
هنا نصل إلى الفخّ الأشيع في الرؤية، والذي يُبطل نصف نتائج المشاريع التي أراها. تسرّب البيانات يعني أنّ معلومات التقييم تسرّبت إلى التدريب، فيُبالغ التقييم في التفاؤل.
في الرؤية، السبب الأشيع هو الصور المتقاربة. مثال محدّد لمشروعنا:
كاميرا التقاطع تلتقط صورة كلّ ثانية. لدينا 100 ألف صورة، نقسمها عشوائيًا 80/20 بين تدريب واخت بار. النتيجة: الصور المتتالية (الثانية 42 والثانية 43) تنتهي كثيرًا في مجموعات مختلفة، والفرق بينهما هو مركبة تحرّكت بضعة بكسلات. النموذج يحفظ الصورة، ويُقدّم mAP خرافيًا على الاختبار — ثم يفشل تمامًا على فيديو الأسبوع التالي.
الحلّ: التقسيم يجب أن يُحترم الوحدات الطبيعية للبيانات، لا الصور الفردية. في هذه الحالة:
- التقسيم بالوقت: كلّ الصور قبل تاريخ معيّن للتدريب، وبعده للاختبار
- التقسيم بالفيديو: كلّ إطارات فيديو واحد في المجموعة نفسها؛ فيديوهات مختلفة للتقسيم
- التقسيم بالمشهد: صور يوم مشمس في التدريب، صور يوم ماطر في الاختبار
مبدأ عامّ: إن كان التصفّح البصري لصورة تدريب وصورة اختبار يجعلهما تبدوان «مسحوبتين من نفس المشهد»، فأنت أمام تسرّب.
كشف التسرّب بمقياس تشابه
للكشف الآلي عن الصور المتقاربة بين التدريب والاختبار، نستخدم بصمة صور: نمرّر كلّ صورة عبر شبكة CNN مُدرَّبة مسبقًا (كـResNet)، ونأخذ متّجه سماتها. ثم نحسب أقرب جار في التدريب لكلّ صورة اختبار. المسافة الكوسينية:
قيمة قريبة من 1 تعني صورًا شبه متطابقة. كلّ زوج بتشابه أعلى من 0.95 يجب أن يوضَع في المجموعة نفسها، أو أن تُحذف إحدى الصورتين.
import torch
from torchvision.models import resnet50, ResNet50_Weights
from torchvision.transforms import functional as F
from PIL import Image
import numpy as np
modele = resnet50(weights=ResNet50_Weights.DEFAULT)
modele.fc = torch.nn.Identity() # نحذف طبقة التصنيف
modele.eval()
def bassmat_image(chemin):
image = Image.open(chemin).convert("RGB").resize((224, 224))
tensor = F.to_tensor(image).unsqueeze(0)
tensor = F.normalize(tensor, [0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
with torch.no_grad():
return modele(tensor).squeeze().numpy()
def similarite(a, b):
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
# نحسب البصمات لكل مجموعة، ثم نبحث عن اقرب جار
bassmat_train = [bassmat_image(c) for c in fichiers_train]
bassmat_test = [bassmat_image(c) for c in fichiers_test]
for i, bt in enumerate(bassmat_test):
sims = [similarite(bt, btr) for btr in bassmat_train]
max_sim = max(sims)
if max_sim > 0.95:
print(f"تسرب محتمل: صورة الاختبار {i} تشبه صورة تدريب بمعامل {max_sim:.3f}")
لا شيء يبدو أكثر إثارة من mAP يقفز من 0.55 إلى 0.85 بمجرّد إضافة بيانات. المشكلة أنّه غالبًا وهم: البيانات الجديدة كانت متقاربة زمنيًا مع مجموعة التقييم. اختبار بسيط: قبل الاحتفال بأيّ تحسّن، أعِد التقييم على فيديو جديد كليًّا، غير مقتطع من مصدر التدريب. الفرق بين الرقمين يُنبّئ عن حجم التسرّب.
في الخلاصة
- الاتّفاق بين المُوسِّمين يُقاس رياضيًا (IoU متبادل، Cohen's Kappa)؛ IoU < 0.85 مؤشّر على حاجة إلى دليل توسيم أوضح.
- Albumentations يُدير التكثير مع الصناديق والأقنعة تلقائيًا؛ التكثير للتدريب فقط، لا للتقييم أبدًا.
- الصور المتقاربة زمنيًا أو بالمشهد أشيع تسرّب في الرؤية؛ قسّم بالوقت أو بالفيديو أو بالمشهد، لا عشوائيًا بالصور الفردية.
- بصمة CNN + تشابه كوسيني أداة تلقائية لكشف التسرّب؛ زوج بتشابه > 0.95 يجب أن يبقى في نفس المجموعة أو تُحذف صورته.
الوحدة التالية: المشروع الختامي — سلسلة كاملة على مجموعة مخصّصة لتقاطع الطرق، من الصفر إلى التصدير.