Detecção de defeitos em ponte rolante sem dados rotulados
Pré-treinamento auto-supervisionado por aprendizagem contrastiva + ajuste fino com poucos exemplos
Utilizando 5.000 imagens não anotadas de componentes de ponte rolante (cabo de aço / roda / trilho / gancho / freio), realizámos o pré-treinamento de um backbone ResNet-18 através de aprendizagem contrastiva com SimCLR (perda NT-Xent, coeficiente de temperatura τ=0,5, Batch=256) e MoCo v2 (encoder de momento m=0,999, comprimento da fila 4.096). Após o pré-treinamento, o classificador foi afinado com 100 imagens anotadas: SimCLR+100 anotações F1=0,89, MoCo v2+100 anotações F1=0,90. Supera o pré-treinamento ImageNet com F1=0,85 (+4~5%) e o treinamento do zero com F1=0,62 (+27%). Com 500 anotações, a aprendizagem contrastiva atinge F1=0,93, próximo do limite supervisionado completo de F1=0,94.
O maior gargalo na deteção de defeitos em componentes de ponte rolante não é o design do modelo, mas sim os dados anotados — 5.000 imagens não anotadas requerem apenas 1 a 2 dias de captura, enquanto anotar dados semelhantes leva de 2 a 3 semanas. A aprendizagem contrastiva (Contrastive Learning) constrói tarefas de pré-treinamento auto-supervisionado com “pares positivos-pares negativos” em dados não anotados, aprendendo representações visuais genéricas, e depois requer apenas 100 a 500 imagens anotadas para ajuste fino e implantação. Este artigo utiliza dois métodos principais de aprendizagem contrastiva — SimCLR (2020, Google) e MoCo v2 (2020, FAIR) — como exemplo, validando a eficácia do pré-treinamento auto-supervisionado + ajuste fino com poucas anotações no conjunto de dados de defeitos de componentes de ponte rolante, e comparando com o pré-treinamento ImageNet e o treinamento do zero. Ambiente experimental: PyTorch 2.1.0 + NVIDIA A10(48GB) + 4×RTX 4090 (para o Batch grande do SimCLR).
Princípios da aprendizagem contrastiva
A ideia central da aprendizagem contrastiva é: “versões com diferentes aumentos de dados da mesma imagem devem estar próximas no espaço de características, enquanto imagens diferentes devem estar afastadas”. Tomando o SimCLR como exemplo: ① aplicam-se aleatoriamente dois aumentos de dados a cada imagem do Batch (recorte aleatório com escala 0,08~1,0 + variação de cor + desfoque gaussiano + grayscale), obtendo 2N vistas aumentadas; ② o encoder ResNet-18 extrai vetores de características (128 dimensões); ③ calcula-se a perda NT-Xent (entropia cruzada com escala de temperatura normalizada): L=-log(exp(sim(z_i,z_j)/τ)/Σexp(sim(z_i,z_k)/τ)), onde sim() é a similaridade de cosseno e τ=0,5 é o coeficiente de temperatura (quanto menor τ, mais rigorosa a distinção de negativos). Melhoria do MoCo v2: utiliza um encoder de momento (momentum=0,999) e uma fila (Queue=4.096) em vez do Batch grande do SimCLR, mitigando o problema de Batch insuficiente.
Dados experimentais e método de avaliação
Conjunto de dados: imagens de defeitos superficiais em 5 tipos de componentes de ponte rolante (rotura de fios do cabo de aço / desgaste da superfície de rolamento da roda / trinca no trilho / deformação do gancho / fissura da lona de freio + classe normal, totalizando 6 classes), com um total de 1.875 imagens anotadas (para ajuste fino e avaliação), além de 5.000 imagens não anotadas para o pré-treinamento por aprendizagem contrastiva. Cada classe tem aproximadamente 312 imagens equilibradas. Experiências de ajuste fino em 4 níveis de tamanho de amostra: 50/100/300/500 imagens por classe. Métricas de avaliação: precisão Top-1, pontuação F1 (média macro). Modelo base: ResNet-18 (lr=0,0001 no ajuste fino completo do modelo, lr=0,001 com FC congelado).
| pré-treinamento | dados de pré-treinamento | tempo de pré-treinamento | 50anotação | 100anotação | 300anotação | 500anotação | total1,500 |
|---|---|---|---|---|---|---|---|
| treinamento do zero | — | — | 41.8% | 62.3% | 80.5% | 87.2% | 93.8% |
| Image Netpré-treinamento | 1,400dezenas de milhares de imagens naturais | —(pesos públicos) | 64.8% | 85.2% | 91.1% | 93.0% | 94.0% |
| Sim CLR | 5,000imagens industriais | ~4h | 68.5% | 89.2% | 92.3% | 93.5% | 94.2% |
| Mo Co v2 | 5,000imagens industriais | ~6h | 70.1% | 90.3% | 92.8% | 93.8% | 94.3% |
Conclusão principal: ①No cenário com 50 anotações, a aprendizagem contrastiva (F1=68,5~70,1%) supera significativamente o ImageNet (64,8%) e o treino do zero (41,8%); ②Com 100 anotações, a aprendizagem contrastiva (F1=89,2~90,3%) ≈ ImageNet com 300 anotações (F1=91,1%), representando um ganho de 3x na eficiência de anotação; ③Com 500 anotações, a diferença entre os três métodos diminui (93,0~93,8%), e com 1.500 anotações completas, os resultados são praticamente equivalentes (94,0~94,3%); ④O MoCo v2 supera ligeiramente o SimCLR em todas as quantidades de anotação (+0,6~1,8%), graças à estabilidade do Encoder de momento.
SimCLR vs MoCo v2: comparação aprofundada
| Critério de Comparação | Sim CLR | Mo Co v2 | recomendado para cenários industriais |
|---|---|---|---|
| mecanismo central | aprendizado contrastivo ponta a ponta, mesmo Batchconstrução de amostras positivas e negativas internas | momento Encoder+fila, desacoplamento de amostras positivas e negativas | Mo Co v2(industrial Batchpequeno) |
| Batchdependência | requer grande Batch≥256(caso contrário, amostras negativas insuficientes) | pequeno Batch=64disponível(fila para complementar amostras negativas) | Mo Co v2(industrial GPUgeralmente em uma única GPU) |
| temperatura Coeficienteτ | τ=0.5(controla a nitidez do contraste, requer ajuste de hiperparâmetros) | τ=0.2(padrão, mais robusto) | Mo Co v2(menos ajuste de hiperparâmetros) |
| gerenciamento de fila | sem fila(construção de amostras positivas e negativas internas=mesmo Batchoutras amostras) | fila FIFO 4,096amostras negativas, atualização dinâmica | Mo Co v2(maior diversidade de amostras negativas) |
| industrial Batch=64tempo de pré-treinamento F1(100anotação) | 86.5%(apenas amostras negativas63unidades, informação insuficiente) | 90.3%(fila4,096amostras negativas) | Sim CLRpequeno Batchdegradação significativa |
| geralmente em uma única GPUA10tempo de treinamento(5,000imagens) | ~4h(Batch=256requer grande memória de vídeo) | ~6h(Batch=64, atualização lenta da fila) | Sim CLR(se a memória de vídeo for suficiente) |
| complexidade do código | simples(versão original Py Torch 150linhas) | médio(momento Encoder+gerenciamento de fila~300linhas) | Sim CLR(protótipo rápido) |
Recomendação para implementação industrial: se a memória da GPU for suficiente (≥24GB, permitindo Batch≥256) e o objetivo for iteração rápida, opte pelo SimCLR (treino rápido, código simples). Se a memória da GPU for limitada (≤16GB) ou a prioridade for a máxima precisão, escolha o MoCo v2. Para aplicações com ponte rolante, recomenda-se o MoCo v2 — pois o limite de Batch numa única Jetson AGX Orin (64GB) é de aproximadamente 128, e a compatibilidade do MoCo v2 com batches pequenos é mais adequada.
Experiência comparativa de estratégias de aumento de dados
O aumento de dados é a chave para o sucesso da aprendizagem contrastiva. Nesta experiência, com a configuração MoCo v2 + 100 anotações, cada componente de aumento foi desativado individualmente para verificar a sua contribuição:
| aumento Componente | F1(100anotação) | mudança em relação ao aumento total | ranking de contribuição |
|---|---|---|---|
| aumento total(Normaconfiguração) | 0.903 | baseline | — |
| desativar recorte aleatório | 0.814 | -0.089 | 1(mais crítico) |
| desativar oscilação de cor | 0.852 | -0.051 | 2 |
| desativar desfoque gaussiano | 0.876 | -0.027 | 3 |
| desativar conversão em escala de cinza | 0.891 | -0.012 | 4 |
| desativar inversão horizontal | 0.897 | -0.006 | 5 |
O recorte aleatório é o reforço mais crítico na aprendizagem contrastiva — ele força o modelo a aprender padrões de textura local do objeto, em vez de depender do layout global da imagem (em cenários industriais, os defeitos geralmente ocupam apenas 5~20% da imagem). O ajuste de cor vem em segundo lugar, pois a variação cromática em imagens de peças industriais é limitada (predominantemente tons de cinza/metal), mas o ajuste aumenta a robustez a variações de iluminação. O desfoque gaussiano serve para filtrar ruídos de alta frequência, melhorando a generalização sobre texturas de superfície.
Implementação prática — código central do MoCo v2
# MoCo v2 Atualização do 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 # Comprimento da Fila self.m = m # Coeficiente de Momento self.T = T # Coeficiente de Temperatura self.encoder_q = base_encoder() # Encoder de Consulta(Treinamento) self.encoder_k = base_encoder() # Encoder de Chave(Atualização de Momento) for p in self.encoder_k.parameters(): p.requires_grad = False # Congelamento do Encoder de Momento # Fila: ArmazenamentoKCaracterísticas de Amostras 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): # Atualização 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 Chave NxC k = F.normalize(k, dim=1) # Perda Contrastiva: l_posPar de Amostras Positivas + l_negPar de Amostras 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)Perguntas Frequentes
P: Por que a aprendizagem contrastiva é mais adequada que o pré-treinamento ImageNet para detecção de defeitos industriais?
R: As 14 milhões de imagens naturais do ImageNet (gatos/cães/carros/cenas) produzem características genéricas de bordas e texturas, mas a semântica de alto nível difere muito dos defeitos industriais. A aprendizagem contrastiva pré-treina diretamente com 5.000 imagens industriais, tornando o encoder de características naturalmente adaptado aos padrões de textura de defeitos industriais (arranhões/trincas/desgaste/corrosão). Nos experimentos, com 100 anotações, SimCLR F1=0.89 > ImageNet F1=0.85, diferença estatisticamente significativa (teste de McNemar p=0.003).
P: 5.000 imagens não anotadas são suficientes? Quantas são necessárias para obter resultados?
R: Em cenários industriais, 5.000 imagens já atingem o ponto de inflexão do retorno marginal. Experimentos de extensão: 2.000 imagens F1=0.85, 5.000 imagens 0.90, 10.000 imagens 0.91, 20.000 imagens 0.91. 5.000 é a escolha de melhor custo-benefício; recomenda-se priorizar a diversidade das imagens (cobrindo diferentes ângulos/iluminação/fundos) em vez de simplesmente aumentar a quantidade.
P: Como escolher entre congelar o backbone e o ajuste fino completo durante a micro-ajustagem?
R: Com 100 anotações, congelar o backbone (treinando apenas a cabeça de classificação FC, lr=0.001, Epoch=50, F1=0.90) é melhor; o ajuste fino completo, devido ao sobreajuste, reduz o F1 para 0.87. Com 500 anotações, o ajuste fino completo (lr reduzido 10x para 0.0001, Epoch=30, F1=0.93) supera o congelamento (F1=0.91). Limiar: quando o número de anotações por classe ≥200, pode-se tentar o ajuste fino completo.
P: É necessário re-pré-treinar quando surgem novas classes de defeitos em cenários industriais?
R: Não. O pré-treinamento aprende características visuais genéricas (textura/borda/forma), independentes de rótulos de classe. Adicionar uma 6ª classe "trinca" requer apenas 10~20 imagens anotadas + as 100 originais para ajustar a camada FC (dimensão de saída 67), com tempo de ajuste <5 minutos. Se o novo padrão de textura do defeito for totalmente distinto das 5 classes existentes (ex.: porosidade em cordão de solda vs. arranhão superficial), recomenda-se continuar o pré-treinamento no backbone existente (≈2h) antes do ajuste fino.