كشف عيوب الرافعة العلوية LXD/DXT: دليل المقارنة والضبط
نهج التعلّم الذاتي المقارن مع الضبط الدقيق قليل العينات
تم استخدام 5,000 صورة غير مصنّفة لمكونات الرافعة العلوية (الحبل السلكي/العجلة/السكة/الخطاف/المكبح) لتدريب تمهيدي ذاتي المقارنة على ResNet-18 backbone عبر SimCLR (خسارة NT-Xent، معامل الحرارة τ=0.5، Batch=256) وMoCo v2 (مشفر الزخم m=0.999، طول قائمة الانتظار 4,096). بعد التدريب التمهيدي، تم ضبط رأس التصنيف بدقة باستخدام 100 صورة مصنّفة: SimCLR+100 مصنّفة F1=0.89، MoCo v2+100 مصنّفة F1=0.90. وهذا يتفوق على F1=0.85 (+4~5%) للتدريب المسبق على ImageNet وF1=0.62 (+27%) للتدريب من الصفر. باستخدام 500 صورة مصنّفة مع التعلّم المقارن، بلغ F1=0.93، مقاربًا للحد الأعلى للإشراف الكامل F1=0.94.
العقبة الأكبر في كشف عيوب مكونات الرافعة العلوية ليست تصميم النموذج، بل البيانات المصنّفة — فالتقاط 5,000 صورة غير مصنّفة يستغرق يومًا أو يومين فقط، بينما يستغرق تصنيف بيانات مماثلة من 2 إلى 3 أسابيع. يعمل التعلّم المقارن (Contrastive Learning) على بناء مهام تدريب ذاتي للإشراف عبر إنشاء "أزواج موجبة-أزواج سالبة" من البيانات غير المصنّفة، لتعلّم تمثيلات بصرية عامة، ثم يكفي ضبط دقيق على 100 إلى 500 صورة مصنّفة للنشر. تستعرض هذه المقالة طريقتين رئيسيتين للتعلّم المقارن: SimCLR (2020, Google) وMoCo v2 (2020, FAIR)، وتتحقق من فعالية التدريب الذاتي المقارن مع ضبط دقيق قليل العينات على مجموعة بيانات عيوب مكونات الرافعة العلوية، ومقارنتها بالتدريب المسبق على ImageNet والتدريب من الصفر. بيئة التجربة: PyTorch 2.1.0 + NVIDIA A10(48GB) + 4×RTX 4090 (لدفعات SimCLR الكبيرة).
مبدأ التعلّم المقارن لكشف العيوب
الفكرة الجوهرية للتعلّم المقارن هي: "يجب أن تكون النسخ المعززة المختلفة لنفس الصورة متقاربة في فضاء الميزات، بينما يجب أن تكون الصور المختلفة متباعدة". على سبيل المثال مع SimCLR: ① يتم تطبيق تحسينين عشوائيين للبيانات على كل صورة في الدفعة (قص عشوائي وتحجيم 0.08~1.0 + اهتزاز ألوان + ضبابية غاوسية + تحويل إلى تدرج رمادي)، للحصول على 2N عرضًا معززًا؛ ② يتم استخدام مشفر ResNet-18 لاستخراج متجهات الميزات (128 بُعدًا)؛ ③ يتم حساب خسارة NT-Xent (الانتروبيا المتقاطعة بالحرارة المعيارية): L=-log(exp(sim(z_i,z_j)/τ)/Σexp(sim(z_i,z_k)/τ))، حيث sim() هي تشابه جيب التمام، وτ=0.5 هو معامل الحرارة (كلما صغر τ، كان التمييز بين العينات السالبة أكثر صرامة). تحسين MoCo v2: استخدام مشفر الزخم (momentum=0.999) وقائمة انتظار (Queue=4,096) بدلاً من الدفعة الكبيرة في SimCLR، للتخفيف من مشكلة عدم كفاية الدفعات.
بيانات التجربة ومنهجية التقييم
مجموعة البيانات: صور عيوب سطح 5 مكونات للرافعة العلوية (انقطاع الحبل السلكي/اهتراء سطح سير العجلة/شرخ السكة/تشوه الخطاف/تشقق بطانة الفرامل + الفئة السليمة، بإجمالي 6 فئات)، بمجموع 1,875 صورة مصنّفة (للضبط الدقيق والتقييم)، بالإضافة إلى 5,000 صورة غير مصنّفة للتدريب التمهيدي المقارن. كل فئة متوازنة بحوالي 312 صورة. تم إجراء تجارب ضبط دقيق على 4 مستويات حسب حجم العينة: 50/100/300/500 صورة/فئة. مؤشرات التقييم: دقة Top-1، درجة F1 (المتوسط الكلي). النموذج الأساسي: ResNet-18 (عند الضبط الدقيق للنموذج الكامل lr=0.0001، عند تجميد طبقة FC lr=0.001).
| خطة التدريب المسبق | بيانات التدريب المسبق | زمن التدريب المسبق | 50وضع العلامات | 100وضع العلامات | 300وضع العلامات | 500وضع العلامات | الكمية الكاملة1,500 |
|---|---|---|---|---|---|---|---|
| التدريب من الصفر | — | — | 41.8% | 62.3% | 80.5% | 87.2% | 93.8% |
| ImageNetالتدريب المسبق | 1,400عشرات الآلاف من الصور الطبيعية | —(الأوزان العامة) | 64.8% | 85.2% | 91.1% | 93.0% | 94.0% |
| SimCLR | 5,000صور صناعية | ~4h | 68.5% | 89.2% | 92.3% | 93.5% | 94.2% |
| MoCo v2 | 5,000صور صناعية | ~6h | 70.1% | 90.3% | 92.8% | 93.8% | 94.3% |
الخلاصة الأساسية: ①في سيناريو 50 عينة مُعلَّمة، يتفوق التعلّم المقارن (F1=68.5~70.1%) بشكل ملحوظ على ImageNet (64.8%) والتعلّم من الصفر (41.8%)؛ ②التعلّم المقارن مع 100 عينة مُعلَّمة (F1=89.2~90.3%) يعادل تقريبًا ImageNet مع 300 عينة (F1=91.1%)، أي كفاءة تعليم أعلى بثلاث مرات؛ ③مع 500 عينة مُعلَّمة، تتقلص الفجوة بين الطرق الثلاث (93.0~93.8%)، وعند الوصول إلى 1,500 عينة كاملة، تتقارب النتائج تقريبًا (94.0~94.3%)؛ ④يتفوق MoCo v2 على SimCLR بشكل طفيف في جميع أحجام البيانات المُعلَّمة (+0.6~1.8%)، وذلك بفضل استقرار المشفر الزخمي.
مقارنة معمّقة بين SimCLR وMoCo v2
| بعد المقارنة | SimCLR | MoCo v2 | موصى به للتطبيقات الصناعية |
|---|---|---|---|
| الآلية الأساسية | التعلم المقارن من البداية إلى النهاية،نفسBatchبناء العينات الإيجابية والسلبية داخلياً | الزخممشفر+قائمة الانتظار،فصل العينات الإيجابية والسلبية | MoCo v2(صناعيBatchصغير) |
| Batchيعتمد على | يتطلب حجمًا كبيرًاBatch≥256(وإلا ستكون العينات السلبية غير كافية) | صغيرBatch=64يمكن استخدام(قائمة الانتظار لتكملة العينات السلبية) | MoCo v2(صناعيGPUعادةً ببطاقة واحدة) |
| درجة الحرارةمعاملτ | τ=0.5(التحكم في حدة المقارنة،يتطلب ضبط المعاملات) | τ=0.2(الافتراضي،أكثر متانة) | MoCo v2(أقل ضبطًا للمعاملات) |
| إدارة قائمة الانتظار | بدون قائمة انتظار(بناء العينات الإيجابية والسلبية داخلياً=نفسBatchعينات أخرى) | قائمة الانتظارFIFO 4,096عينات سلبية،تحديث ديناميكي | MoCo v2(تنوع أعلى للعينات السلبية) |
| صناعيBatch=64زمن التدريب المسبقF1(100وضع العلامات) | 86.5%(العينات السلبية فقط63عدد،محتوى معلوماتي غير كافٍ) | 90.3%(قائمة الانتظار4,096عينات سلبية) | SimCLRصغيرBatchتدهور ملحوظ |
| عادةً ببطاقة واحدةA10زمن التدريب(5,000صورة) | ~4h(Batch=256يتطلب ذاكرة كبيرة) | ~6h(Batch=64, تحديث بطيء لقائمة الانتظار) | SimCLR(إذا كانت الذاكرة كافية) |
| تعقيد الكود | بسيط(النسخة الأصليةPyTorch 150سطر) | متوسط(الزخممشفر+إدارة قائمة الانتظار~300سطر) | SimCLR(نموذج أولي سريع) |
توصية النشر الصناعي: إذا كانت ذاكرة GPU كافية (≥24GB، يمكن ضبط Batch≥256) وكنت تسعى إلى تكرار سريع، فاختر SimCLR (تدريب أسرع، كود أبسط). أما إذا كانت ذاكرة GPU محدودة (≤16GB) أو كنت تسعى إلى أقصى دقة، فاختر MoCo v2. في تطبيقات الرافعة العلوية، نوصي باستخدام MoCo v2 — لأن الحد الأقصى لحجم الدفعة على Jetson AGX Orin (64GB) يبلغ حوالي 128، وخاصية ملاءمة الدفعات الصغيرة في MoCo v2 تجعله الخيار الأمثل.
تجربة مقارنة استراتيجيات تحسين البيانات
يُعد تحسين البيانات عاملًا حاسمًا في نجاح التعلم المقارن. في هذه التجربة، وباستخدام إعداد MoCo v2 مع 100 عينة مُعلَّمة، قمنا بتعطيل كل مكوّن تحسين على حدة للتحقق من مساهمته:
| التعزيزمكون | F1(100وضع العلامات) | التغيير مقارنة بالتعزيز الكامل | ترتيب المساهمة |
|---|---|---|---|
| التعزيز الكامل(المعيارالإعدادات) | 0.903 | المرجع | — |
| إيقاف القص العشوائي | 0.814 | -0.089 | 1(الأكثر أهمية) |
| إيقاف تذبذب الألوان | 0.852 | -0.051 | 2 |
| إيقاف التمويه الغاوسي | 0.876 | -0.027 | 3 |
| إيقاف التحويل إلى الرمادي | 0.891 | -0.012 | 4 |
| إيقاف التقليب الأفقي | 0.897 | -0.006 | 5 |
يُعد القص العشوائي أهم تحسين في التعلم المقارن، إذ يُجبر النموذج على تعلم أنماط النسيج المحلية للهدف بدلاً من الاعتماد على التخطيط العام للصورة (في المشاهد الصناعية، عادةً ما تشغل العيوب 5% إلى 20% فقط من الصورة). يأتي اهتزاز الألوان في المرتبة الثانية، لأن التغيرات اللونية في صور الأجزاء الصناعية محدودة (غالباً ما تكون رمادية أو معدنية)، لكن الاهتزاز يزيد من المتانة تجاه تغيرات الإضاءة. أما التمويه الغاوسي فيعمل على تصفية الضوضاء عالية التردد، مما يعزز القدرة على التعميم على أسطح النسيج.
التنفيذ الهندسي — الكود الأساسي لـ MoCo v2
# MoCo v2 تحديث المشفر الزخمي (PyTorchرمز زائف) class MoCo(nn.Module): def __init__(self, base_encoder=resnet18, dim=128, K=4096, m=0.999, T=0.2): super().__init__() self.K = K # طول قائمة الانتظار self.m = m # معامل الزخم self.T = T # معامل الحرارة self.encoder_q = base_encoder() # مشفر الاستعلام(تدريب) self.encoder_k = base_encoder() # مشفر المفتاح(تحديث الزخم) for p in self.encoder_k.parameters(): p.requires_grad = False # تجميد المشفر الزخمي # قائمة انتظار: تخزينKميزات العينات السلبية self.register_buffer("queue", torch.randn(dim, K)) self.queue = F.normalize(self.queue, dim=0) self.register_buffer("queue_ptr", torch.zeros(1, dtype=torch.long)) @torch.no_grad() def _momentum_update(self): # تحديث الزخم: θ_k = m*θ_k + (1-m)*θ_q for p_q, p_k in zip(self.encoder_q.parameters(), self.encoder_k.parameters()): p_k.data = self.m * p_k.data + (1 - self.m) * p_q.data def forward(self, im_q, im_k): q = self.encoder_q(im_q) # ميزة الاستعلام NxC q = F.normalize(q, dim=1) with torch.no_grad(): self._momentum_update() k = self.encoder_k(im_k) # ميزة المفتاح NxC k = F.normalize(k, dim=1) # خسارة التباين: l_posزوج العينات الإيجابي + l_negزوج العينات السلبي l_pos = torch.einsum("nc,nc->n", q, k).unsqueeze(-1) # Nx1 l_neg = torch.einsum("nc,ck->nk", q, self.queue.clone().detach()) # NxK logits = torch.cat([l_pos, l_neg], dim=1) / self.T # Nx(1+K) labels = torch.zeros(logits.shape[0], dtype=torch.long) return F.cross_entropy(logits, labels)الأسئلة الشائعة حول التعلم المقارن
س: لماذا يتفوق التعلم المقارن على التدريب المسبق باستخدام ImageNet في كشف العيوب الصناعية؟
ج: الميزات التي يتعلمها ImageNet من 14 مليون صورة طبيعية (قطط/كلاب/سيارات/مشاهد) هي حواف وأنسجة عامة، لكن دلالاتها عالية المستوى تختلف كثيراً عن العيوب الصناعية. يستخدم التعلم المقارن 5,000 صورة صناعية للتدريب المسبق مباشرة، مما يجعل مشفر الميزات ملائماً بشكل طبيعي لأنماط نسيج العيوب الصناعية (خدوش/شرخ/اهتراء/صدأ). في التجارب، مع 100 عينة موسومة، كانت F1 لـ SimCLR = 0.89 > F1 لـ ImageNet = 0.85، وهذا الفرق ذو دلالة إحصائية (اختبار ماكنمار p=0.003).
س: هل 5,000 صورة بدون بيانات موسومة كافية؟ وما العدد المطلوب لتحقيق الفعالية؟
ج: في المشاهد الصناعية، تصل 5,000 صورة إلى نقطة تناقص العائدات الهامشية. تجارب التوسع: 2,000 صورة F1=0.85، 5,000 صورة 0.90، 10,000 صورة 0.91، 20,000 صورة 0.91. 5,000 صورة هي الخيار الأمثل من حيث الكفاءة التكلفية، ويُنصح بإعطاء الأولوية لتنوع الصور (تغطية زوايا/إضاءات/خلفيات مختلفة) بدلاً من مجرد زيادة العدد.
س: كيف نختار بين تجميد الطبقات الأساسية والضبط الدقيق الكامل؟
ج: مع 100 عينة موسومة، يؤدي تجميد الطبقات الأساسية (تدريب رأس التصنيف FC فقط، lr=0.001, Epoch=50, F1=0.90) إلى نتيجة أفضل، بينما ينخفض F1 إلى 0.87 مع الضبط الدقيق الكامل بسبب الإفراط في التكيف. مع 500 عينة موسومة، يتفوق الضبط الدقيق الكامل (تصغير lr 10 مرات إلى 0.0001, Epoch=30, F1=0.93) على التجميد (F1=0.91). القاعدة: عندما يصل عدد العينات الموسومة لكل فئة إلى 200 أو أكثر، يمكن تجربة الضبط الدقيق الكامل.
س: هل يتطلب إضافة فئة عيوب جديدة في المشهد الصناعي إعادة التدريب المسبق؟
ج: لا. فالتدريب المسبق يتعلم ميزات بصرية عامة (نسيج/حواف/شكل) ولا يعتمد على تسميات الفئات. لإضافة الفئة السادسة "شرخ"، يكفي استخدام 10 إلى 20 صورة موسومة جديدة مع الـ 100 صورة الأصلية لضبط طبقة FC (بأبعاد مخرجات 67)، ويستغرق الضبط أقل من 5 دقائق. إذا كان نمط نسيج العيب الجديد مختلفاً تماماً عن الفئات الخمس الموجودة (مثل مسامية خط اللحام مقابل الخدوش السطحية)، يُنصح بمواصلة التدريب المسبق على الطبقات الأساسية الحالية (حوالي ساعتين) ثم الضبط الدقيق.