Detección de defectos en puente grúa con aprendizaje contrastivo

Esquema de preentrenamiento autosupervisado con aprendizaje contrastivo + ajuste fino con pocas muestras

Se utilizan 5.000 imágenes sin etiquetar de componentes de puente grúa (cable de acero, rueda, carril, gancho y freno) para preentrenar un backbone ResNet-18 mediante aprendizaje contrastivo con SimCLR (pérdida NT-Xent, coeficiente de temperatura τ=0,5, Batch=256) y MoCo v2 (encoder con momento m=0,999, longitud de cola 4.096). Tras el preentrenamiento, se ajusta el clasificador con 100 imágenes etiquetadas: SimCLR+100 etiquetas F1=0,89, MoCo v2+100 etiquetas F1=0,90. Supera al preentrenamiento con ImageNet (F1=0,85, +4~5%) y al entrenamiento desde cero (F1=0,62, +27%). Con 500 etiquetas, el aprendizaje contrastivo alcanza F1=0,93, cerca del límite supervisado completo de F1=0,94.

El mayor cuello de botella en la detección de defectos en componentes de puente grúa no es el diseño del modelo, sino los datos etiquetados: capturar 5.000 imágenes sin etiquetar solo requiere 1~2 días, pero etiquetar datos equivalentes lleva de 2 a 3 semanas. El aprendizaje contrastivo (Contrastive Learning) construye tareas de preentrenamiento autosupervisado con ”pares positivos-pares negativos” sobre datos no etiquetados para aprender representaciones visuales genéricas, y luego solo se necesitan entre 100 y 500 imágenes etiquetadas para el ajuste fino y la implementación. Este artículo toma como ejemplo dos métodos de aprendizaje contrastivo ampliamente utilizados —SimCLR (2020, Google) y MoCo v2 (2020, FAIR)— y valida la eficacia del preentrenamiento autosupervisado + ajuste fino con pocas etiquetas en un conjunto de datos de defectos de componentes de puente grúa, comparándolo con el preentrenamiento con ImageNet y el entrenamiento desde cero. Entorno experimental: PyTorch 2.1.0 + NVIDIA A10(48GB) + 4×RTX 4090 (para el batch grande de SimCLR).

¿Se puede entrenar un modelo de detección de defectos en puentes grúa sin datos etiquetados? Registro práctico de aprendizaje contrastivo + ajuste fino con pocas muestras

Principios del aprendizaje contrastivo

La idea central del aprendizaje contrastivo es: ”las diferentes versiones aumentadas de una misma imagen deben estar cerca en el espacio de características, mientras que imágenes distintas deben estar alejadas”. Tomando SimCLR como ejemplo: ①se aplican aleatoriamente dos aumentos de datos a cada imagen del batch (recorte aleatorio con escala 0,08~1,0 + alteración de color + desenfoque gaussiano + escala de grises), obteniendo 2N vistas aumentadas; ②se extraen vectores de características (128 dimensiones) con el encoder ResNet-18; ③se calcula la pérdida NT-Xent (entropía cruzada normalizada con temperatura): L=-log(exp(sim(z_i,z_j)/τ)/Σexp(sim(z_i,z_k)/τ)), donde sim() es la similitud coseno y τ=0,5 es el coeficiente de temperatura (cuanto menor es τ, más estricta es la distinción entre muestras negativas). La mejora de MoCo v2: utiliza un encoder con momento (momentum=0,999) y una cola (Queue=4.096) en lugar del batch grande de SimCLR, aliviando el problema de batches insuficientes.

SimCLR
Pérdida NT-Xent · Coeficiente de temperatura τ=0,5 · Batch=256 · Requiere batch grande (≥256) · No necesita cola
MoCo v2
Encoder con momento m=0,999 · Longitud de cola 4.096 · Batch pequeño (64) suficiente · Pares positivos/negativos desacoplados
Aumento de datos
Recorte aleatorio (0,08~1,0) · Alteración de color · Desenfoque gaussiano · Escala de grises · Volteo horizontal (0,5) · Combinación de 5 aumentos
Tiempo de preentrenamiento
SimCLR ~4h (Batch=256, A10) · MoCo v2 ~6h (Queue=4096, RTX 4090) · 5.000 imágenes × 200 épocas

Datos experimentales y metodología de evaluación

Conjunto de datos: imágenes de defectos superficiales en 5 tipos de componentes de puente grúa (rotura de hilos en cable de acero, desgaste en la superficie de rodadura de la rueda, grietas en el carril, deformación del gancho, fisuración del forro de freno + clase normal, 6 clases en total), sumando 1.875 imágenes etiquetadas (para ajuste fino y evaluación), además de 5.000 imágenes sin etiquetar para el preentrenamiento con aprendizaje contrastivo. Cada clase tiene aproximadamente 312 imágenes. Se realizan experimentos de ajuste fino en 4 niveles de muestra: 50/100/300/500 imágenes por clase. Métricas de evaluación: precisión Top-1 y puntuación F1 (promedio macro). Modelo base: ResNet-18 (lr=0,0001 en ajuste fino completo, lr=0,001 al congelar la capa FC).

esquema de preentrenamientodatos de preentrenamientotiempo de preentrenamiento50etiquetado100etiquetado300etiquetado500etiquetadocompleto1,500
entrenamiento desde cero41.8%62.3%80.5%87.2%93.8%
Image Netpreentrenamiento1,400diez mil imágenes naturales—(pesos públicos)64.8%85.2%91.1%93.0%94.0%
Sim CLR5,000imágenes industriales~4h68.5%89.2%92.3%93.5%94.2%
Mo Co v25,000imágenes industriales~6h70.1%90.3%92.8%93.8%94.3%

Conclusiones principales: ①Con 50 etiquetas, el aprendizaje contrastivo (F1=68,5~70,1%) supera significativamente a ImageNet (64,8%) y al entrenamiento desde cero (41,8%); ②El aprendizaje contrastivo con 100 etiquetas (F1=89,2~90,3%) ≈ ImageNet con 300 etiquetas (F1=91,1%), lo que triplica la eficiencia de etiquetado; ③Con 500 etiquetas, las diferencias se reducen (93,0~93,8%), y con 1.500 etiquetas completas, los resultados son casi idénticos (94,0~94,3%); ④MoCo v2 supera ligeramente a SimCLR en todos los volúmenes de etiquetas (+0,6~1,8%), gracias a la estabilidad del Encoder de momento.


Comparativa en profundidad: SimCLR frente a MoCo v2

Dimensión de ComparaciónSim CLRMo Co v2recomendado para entornos industriales
mecanismo centralaprendizaje contrastivo de extremo a extremo, mismo Batchconstrucción de muestras positivas y negativas internasmomento Encoder+cola, desacoplamiento de muestras positivas y negativasMo Co v2(industrial Batchpequeño)
Batchdependenciarequiere grande Batch≥256(de lo contrario, muestras negativas insuficientes)pequeño Batch=64disponible(cola para complementar muestras negativas)Mo Co v2(industrial GPUgeneralmente una sola GPU)
temperatura Coeficienteττ=0.5(controla la nitidez del contraste, requiere ajuste de hiperparámetros)τ=0.2(por defecto, más robusto)Mo Co v2(menos ajuste de hiperparámetros)
gestión de colasin cola(construcción de muestras positivas y negativas internas=mismo Batchotras muestras)cola FIFO 4,096muestras negativas, actualización dinámicaMo Co v2(mayor diversidad de muestras negativas)
industrial Batch=64tiempo de preentrenamiento F1(100etiquetado)86.5%(solo muestras negativas63unidades, información insuficiente)90.3%(cola4,096muestras negativas) Sim CLRpequeño Batchdegradación significativa
generalmente una sola GPUA10tiempo de entrenamiento(5,000imágenes)~4h(Batch=256requiere gran memoria de video)~6h(Batch=64, actualización de cola lenta)Sim CLR(si la memoria de video es suficiente)
complejidad del códigosimple(versión original Py Torch 150líneas)medio(momento Encoder+gestión de cola~300líneas)Sim CLR(prototipo rápido)

Recomendación para despliegues industriales: si dispone de memoria GPU suficiente (≥24 GB, puede fijar Batch≥256) y busca iteración rápida, elija SimCLR (entrenamiento veloz, código simple). Si la memoria GPU es limitada (≤16 GB) o prioriza la máxima precisión, opte por MoCo v2. Para el despliegue en entornos de puente grúa, se recomienda MoCo v2 — dado que el límite de Batch en una sola Jetson AGX Orin (64 GB) es de aproximadamente 128, la compatibilidad de MoCo v2 con lotes pequeños resulta más adecuada.


Comparativa de estrategias de aumento de datos

El aumento de datos es clave para el éxito del aprendizaje contrastivo. En este experimento, con MoCo v2 y 100 etiquetas, se desactivó cada componente de aumento de forma individual para verificar su contribución:

aumento ComponenteF1(100etiquetado)cambio en comparación con aumento completoranking de contribución
aumento completo(Normaconfiguración)0.903referencia
desactivar recorte aleatorio0.814-0.0891(más crítico)
desactivar jitter de color0.852-0.0512
desactivar desenfoque gaussiano0.876-0.0273
desactivar conversión a escala de grises0.891-0.0124
desactivar volteo horizontal0.897-0.0065

El recorte aleatorio es la mejora más crítica en el aprendizaje contrastivo: obliga al modelo a aprender patrones de textura local del objetivo, en lugar de depender de la disposición general de la imagen (en escenarios industriales, los defectos suelen ocupar solo el 5~20% de la imagen). El ajuste de color ocupa el segundo lugar, porque las variaciones de color en imágenes de piezas industriales son limitadas (mayormente en escala de grises o tonos metálicos), pero el ajuste aumenta la robustez frente a cambios de iluminación. El desenfoque gaussiano sirve para filtrar el ruido de alta frecuencia y mejorar la capacidad de generalización sobre texturas superficiales.


Implementación práctica: código central de MoCo v2

# MoCo v2 Actualización del encoder de momento (PyTorchPseudocódigo) 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 # Longitud de la cola self.m = m # Coeficiente de momento self.T = T # Coeficiente de temperatura self.encoder_q = base_encoder() # Encoder de consulta(Entrenamiento) self.encoder_k = base_encoder() # Encoder de clave(Actualización de momento) for p in self.encoder_k.parameters(): p.requires_grad = False # Congelar encoder de momento # Cola: AlmacenamientoKCaracterísticas de muestras negativas 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): # Actualización de momento: θ_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) # Características de consulta NxC q = F.normalize(q, dim=1) with torch.no_grad(): self._momentum_update() k = self.encoder_k(im_k) # Características de clave NxC k = F.normalize(k, dim=1) # Pérdida contrastiva: l_posPar de muestras positivas + l_negPar de muestras negativas 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)

Preguntas frecuentes sobre detección de defectos

P: ¿Por qué el aprendizaje contrastivo supera al preentrenamiento con ImageNet en la detección de defectos industriales?

R: Las 14 millones de imágenes naturales de ImageNet (gatos, perros, coches, escenas) aportan características genéricas de bordes y texturas, pero su semántica de alto nivel difiere mucho de los defectos industriales. El aprendizaje contrastivo preentrena directamente con 5.000 imágenes industriales, por lo que el encoder de características se adapta de forma natural a los patrones de textura de defectos (rayones, grietas, desgaste, corrosión). En los experimentos, con 100 etiquetas, SimCLR obtuvo F1=0.89 frente a F1=0.85 de ImageNet, diferencia estadísticamente significativa (prueba de McNemar, p=0.003).

P: ¿Son suficientes 5.000 imágenes sin etiquetar? ¿Cuántas se necesitan para obtener resultados?

R: En entornos industriales, 5.000 imágenes ya alcanzan el punto de rendimiento marginal decreciente. Experimentos de ampliación: 2.000 imágenes → F1=0.85; 5.000 → 0.90; 10.000 → 0.91; 20.000 → 0.91. Las 5.000 imágenes ofrecen la mejor relación coste-beneficio; se recomienda priorizar la diversidad de las imágenes (cubriendo distintos ángulos, iluminación y fondos) antes que aumentar simplemente la cantidad.

P: ¿Cómo elegir entre congelar el backbone y el ajuste fino completo durante la puesta a punto?

R: Con 100 etiquetas, congelar el backbone (entrenando solo la capa de clasificación FC, lr=0.001, Epoch=50, F1=0.90) es mejor; el ajuste fino completo reduce F1 a 0.87 por sobreajuste. Con 500 etiquetas, el ajuste fino completo (lr reducido 10 veces a 0.0001, Epoch=30, F1=0.93) supera a la congelación (F1=0.91). Umbral: cuando el número de etiquetas por clase sea ≥200, se puede intentar el ajuste fino completo.

P: ¿Es necesario volver a preentrenar cuando aparecen nuevas categorías de defectos en entornos industriales?

R: No. El preentrenamiento aprende características visuales generales (texturas, bordes, formas) que no dependen de etiquetas de clase. Para añadir una sexta clase, por ejemplo "grietas", basta con 10~20 imágenes etiquetadas que se ajustan junto con las 100 originales en la capa FC (dimensión de salida 67); el tiempo de ajuste es inferior a 5 minutos. Si el nuevo patrón de textura del defecto es completamente distinto a las 5 clases existentes (como porosidad en cordones de soldadura frente a rayones superficiales), se recomienda continuar el preentrenamiento sobre el backbone existente (≈2 h) antes del ajuste fino.

Artículos relacionados

contact

contact us

phone:
+86 13903802779

mail:3915269@qq.com

Working hours: Monday to Friday

Wechat
Wechat
SHARE
TOP