Treinei uma rede convolucional para classificar as imagens de um componente mecânico como boas ou defeituosas. Embora a precisão do teste fosse alta, percebi que o modelo tinha um desempenho ruim em imagens com iluminação ligeiramente diferente.
Os recursos que estou tentando detectar são sutis, e a iluminação parece fazer com que o modelo chame muitos negativos negativos. A maioria, se não todos, dos dados de treinamento e teste vieram de imagens gravadas sob iluminação difusa. As novas imagens em que experimentei o modelo foram fotografadas com luzes focadas.
Na esperança de que a equalização do histograma ( CLAHE ) ajudasse, eu fiz a equalização das imagens antes de alimentá-la com o modelo, fiz isso para treinamento e também para dados de teste. O problema então era que a precisão era alta, mas o modelo parecia ter aprendido alguma outra correlação entre as imagens e os rótulos. Após a equalização, tudo na imagem se destaca, os defeitos se tornam ainda mais sutis e difíceis de detectar, mesmo para o olho humano.
A previsão do modelo mudou mesmo quando o mesmo componente foi fotografado com a mesma iluminação, mas com a luz em orientações diferentes. Portanto, minha pergunta é: o que posso fazer, no final dos dados ou com o modelo, para que se torne robusto às mudanças na iluminação (ou ao mesmo tipo de iluminação, mas que mude a orientação da iluminação)?
Respostas:
Isso é chamado de super adaptação, seu modelo aprendeu a prever rótulos com base em recursos que não são realmente responsáveis por previsões específicas; portanto, quando não são apresentados, ele não consegue prever corretamente. Embora existam várias maneiras de lidar com o ajuste excessivo (por exemplo, desistência), o que você parece precisar é de aumento de imagem. É uma maneira simples, mas muito poderosa, de treinar uma rede neural robusta. Para o seu caso - apenas simule diferentes condições de iluminação, por exemplo, aumentando / diminuindo os valores de pixel aleatoriamente para suas entradas para as mesmas etiquetas. Também é prática comum adicionar ruído aleatório, rotações aleatórias, virar etc.
Para mais informações, verifique esta resposta do stackoverflow.
Além disso, publiquei recentemente um projeto em que usei várias funções de aumento que você pode achar úteis. Consulte: https://github.com/Naurislv/P12.1-Semantic-Segmentation/blob/master/augmentation.py
fonte