Обучение модели дефектов мостового крана без разметки

Схема: самоконтролируемое предобучение + дообучение на малом числе размеченных данных

Используя 5,000 неразмеченных изображений компонентов мостового крана (канат стальной / колесо / рельс / крюк / тормоз), выполнено предобучение backbone ResNet-18 методом контрастивного обучения: SimCLR (NT-Xent loss, температурный коэффициент τ=0.5, Batch=256) и MoCo v2 (импульсный энкодер m=0.999, длина очереди 4,096). После предобучения классификационная головка дообучалась на 100 размеченных изображениях: SimCLR+100 размеченных F1=0.89, MoCo v2+100 размеченных F1=0.90. Это превосходит предобучение на ImageNet (F1=0.85, +4~5%) и обучение с нуля (F1=0.62, +27%). При использовании 500 размеченных изображений контрастивное обучение достигает F1=0.93, приближаясь к верхней границе полного контроля F1=0.94.

Основное узкое место при обнаружении дефектов компонентов крана — не архитектура модели, а размеченные данные: получение 5,000 неразмеченных изображений занимает 1–2 дня, тогда как разметка аналогичного объёма данных требует 2–3 недель. Контрастивное обучение (Contrastive Learning) решает эту проблему, формируя на неразмеченных данных задачу самоконтролируемого предобучения с парами «положительный-отрицательный пример». Это позволяет модели изучить универсальные визуальные признаки, после чего для развертывания достаточно дообучить её на 100–500 размеченных изображениях. В данной статье на примере двух популярных методов — SimCLR (2020, Google) и MoCo v2 (2020, FAIR) — проверяется эффективность подхода «самоконтролируемое предобучение + дообучение на малой выборке» на наборе данных о дефектах компонентов крана, а также проводится сравнение с предобучением на ImageNet и обучением с нуля. Среда эксперимента: PyTorch 2.1.0 + NVIDIA A10 (48GB) + 4×RTX 4090 (для больших Batch в SimCLR).

Можно ли обучить модель обнаружения дефектов крана без размеченных данных? Практический опыт контрастивного обучения и малого дообучения

Принцип работы контрастивного обучения

Основная идея контрастивного обучения: «разные варианты аугментации одного и того же изображения должны быть близки в пространстве признаков, а разные изображения — далеки». На примере SimCLR: ① для каждого изображения в Batch случайным образом применяются два вида аугментации (случайное кадрирование с масштабом 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) вместо большого Batch, что решает проблему нехватки памяти.

SimCLR
NT-Xent loss · Температурный коэффициент τ=0.5 · Batch=256 · Требует большой Batch (≥256) · Очередь не нужна
MoCo v2
Импульсный энкодер m=0.999 · Длина очереди 4,096 · Достаточно малого Batch (64) · Разделение положительных и отрицательных примеров
Аугментация данных
Случайное кадрирование (0.08~1.0) · Изменение цвета · Гауссово размытие · Оттенки серого · Горизонтальное отражение (0.5) · Комбинация из 5 видов аугментации
Время предобучения
SimCLR ~4ч (Batch=256, A10) · MoCo v2 ~6ч (Queue=4096, RTX 4090) · 5,000 изображений × 200 эпох

Экспериментальные данные и методика оценки

Набор данных: изображения поверхностных дефектов 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%
SimCLR5,000промышленных изображений~4h68.5%89.2%92.3%93.5%94.2%
MoCo v25,000промышленных изображений~6h70.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%), эффективность разметки выше в 3 раза; ③при 500 размеченных образцах разрыв между тремя подходами сокращается (93.0~93.8%), а при полных 1 500 образцах показатели практически выравниваются (94.0~94.3%); ④MoCo v2 стабильно превосходит SimCLR при любом объёме разметки (+0.6~1.8%), что обусловлено устойчивостью momentum-энкодера.


Сравнение SimCLR и MoCo v2: какой метод эффективнее

Параметр сравненияSimCLRMoCo v2рекомендация для промышленных сценариев
ключевой механизмсквозное контрастивное обучение,тот жеBatchформирование положительных и отрицательных образцов внутриимпульс (momentum)Энкодер+очередь,разделение положительных и отрицательных образцов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строк)средний(импульс (momentum)Энкодер+управление очередью~300строк)SimCLR(быстрый прототип)

Рекомендация для промышленного внедрения: если объём видеопамяти GPU достаточен (≥24 ГБ, можно задать Batch≥256) и приоритет — быстрая итерация, выбирайте SimCLR (быстрое обучение, простой код). Если видеопамять ограничена (≤16 ГБ) или требуется максимальная точность, выбирайте MoCo v2. Для задач мостового крана рекомендуем MoCo v2 — при работе на Jetson AGX Orin (64 ГБ) верхняя граница Batch составляет около 128, а MoCo v2 лучше адаптирован к малым Batch.


Сравнение стратегий аугментации данных

Аугментация данных — ключевой фактор успеха контрастивного обучения. В данном эксперименте (MoCo v2, 100 размеченных образцов) мы поочерёдно отключали каждый компонент аугментации, чтобы оценить его вклад:

аугментацияКомпонентF1(100разметка)изменение по сравнению с полной аугментациейрейтинг вклада
полная аугментация(Стандартконфигурация)0.903базовая линия
отключение случайного кадрирования0.814-0.0891(наиболее критичный)
отключение цветового дрожания0.852-0.0512
отключение гауссова размытия0.876-0.0273
отключение преобразования в оттенки серого0.891-0.0124
отключение горизонтального отражения0.897-0.0065

Случайное кадрирование — ключевой метод аугментации в контрастивном обучении: оно заставляет модель изучать локальные текстурные паттерны объекта, а не полагаться на общую компоновку изображения (в промышленных сценариях дефекты обычно занимают лишь 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?

О: 14 миллионов естественных изображений в ImageNet (кошки, собаки, автомобили, сцены) дают модели общие признаки — края и текстуры, однако высокоуровневая семантика далека от промышленных дефектов. Контрастивное обучение использует напрямую 5 000 промышленных изображений для предобучения, поэтому кодировщик признаков изначально адаптирован к текстурным паттернам дефектов (царапины, трещины, износ, коррозия). В экспериментах с 100 размеченными образцами SimCLR показал F1=0.89 против F1=0.85 у ImageNet — различие статистически значимо (критерий Макнемара, 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 изображений. Рекомендуется в первую очередь обеспечивать разнообразие данных (разные углы съёмки, освещение, фон), а не просто наращивать количество.

В: Что выбрать при тонкой настройке — заморозку backbone или полную настройку всех слоёв?

О: При 100 размеченных образцах заморозка backbone (обучение только FC-классификатора, lr=0.001, 50 эпох, F1=0.90) работает лучше; полная настройка из-за переобучения снижает F1 до 0.87. При 500 размеченных образцах полная настройка (lr уменьшен в 10 раз до 0.0001, 30 эпох, F1=0.93) превосходит заморозку (F1=0.91). Ориентир: при ≥200 размеченных образцах на класс можно пробовать полную настройку.

В: Нужно ли переобучать модель при появлении нового класса дефектов в промышленности?

О: Нет. Предобучение даёт универсальные визуальные признаки (текстуры, края, формы) и не зависит от меток классов. Для добавления 6-го класса «трещина» достаточно 10–20 размеченных изображений, которые вместе с исходными 100 образцами используются для тонкой настройки FC-слоя (выходная размерность 67); время настройки — менее 5 минут. Если текстурный паттерн нового дефекта принципиально отличается от существующих пяти классов (например, пористость сварного шва против поверхностной царапины), рекомендуется дообучить предобученный backbone (≈2 часа) и затем выполнить тонкую настройку.

Похожие статьи

contact

contact us

phone:
+86 13903802779

mail:3915269@qq.com

Working hours: Monday to Friday

Wechat
Wechat
SHARE
TOP