Aprendizado profundo - não apenas selos em telefones celulares ou como diagnosticamos carrinhos de locomotivas


Há alguns dias, a Aurorai transferiu um sistema de reconhecimento de defeitos e monitoramento de vagões para as locomotivas Ermak para a operação de teste. A tarefa não é trivial e muito interessante, cujo primeiro passo foi avaliar a condição das pastilhas dos freios e a largura da braçadeira. Conseguimos resolver o problema com uma precisão de 1 mm a uma velocidade de locomotiva de até 30 km / h! Quero observar que, devido às especificidades, foi possível usar o "TTA (aumento do tempo de teste)" - um exemplo vívido de um hack no estilo kaggle de competição que não se encaixa bem na segmentação semântica e prod baseada no codificador se_resnext50 , que fornece um resultado incrivelmente preciso na previsão de máscara .

Descrição da tarefa

É necessário criar um complexo de software e hardware para detectar defeitos das pastilhas de freio e saída de dados para o encarregado da mudança.

Pré-requisitos para a Tarefa

Como se viu, um grande número de pastilhas, cerca de 80%, muda no PTOL (pontos de inspeção técnica de locomotivas), e isso acontece a cada 72 horas para cada locomotiva. A maior parte das verificações no PTOL é uma inspeção visual feita pelo mestre da parte externa do carrinho de locomotiva.



Planeje a solução do problema:

  1. Seleção de equipamentos
  2. Coleta de dados
  3. Modelo de treinamento
  4. Desenvolvimento de servidor com API REST
  5. Desenvolvimento de cliente para tablet Android
  6. Projeto e montagem de um rack para posicionamento de câmeras e luz
  7. Operação experimental

Seleção de equipamentos

Talvez uma das tarefas mais difíceis, se não a mais difícil, foi escolher câmeras, lentes e luz em um orçamento e tempo limitados: o MVP deveria ser realizado em um mês e meio. Em alguns dias, o Google me tornou um especialista em hardware para visão de máquina. A escolha foi feita nas câmeras Basler e uma luz de fundo pulsada de 6k lúmens, sincronizada com a câmera. A favor de Basler (70 quadros / s, resolução de até 1920x1024), sua API python falou, o que facilitou muito a integração de todos os componentes do sistema, o único aspecto negativo é o preço das câmeras ~ 100 tr.

A escolha de uma lente para câmeras foi complicada pela falta de compreensão da distância focal e do ângulo de visão necessários. Eu tive que correr riscos, mas peguei uma calculadora de lentes e uma pitada de sorte.

Iluminação: o tempo necessário para os LEDs brilharem, seu tipo e parâmetros de lente foram estabelecidos experimentalmente. Tentei 3 modificações diferentes de lentes para LEDs, com um ângulo de 30, 45, 60, eventualmente escolhi lentes foscas com um ângulo de 45.





Montagem e teste do sinal de controle de pulso da câmera



Para hardware de servidor, peguei o Intel Core i7-7740X Kaby Lake, 46gb de RAM, 1 TB SSD e 3x1080Ti - isso é suficiente para prever duas locomotivas de 3 seções em não mais de 2 minutos.

O resfriamento coletivo de um sanduíche nas placas de vídeo sopra 10 graus.



Coleta de dados

Criar um conjunto de dados é uma música separada, ninguém pode confiar nesse evento e, portanto, fui enviado para uma cidade distante e pouco conhecida nas profundezas de nossa vasta pátria. Fotografei cerca de 400 almofadas no meu telefone (!!!) . Olhando para o futuro, direi que os valentes funcionários do depósito, aparentemente assustados com o auditor de Moscou, mudaram todas as almofadas das locomotivas para completamente novas e as pintaram com uma nova camada de tinta; foi engraçado e assustador olhar para ela. Eu estava ansioso pelo pior, embora ainda houvesse cerca de 400 fotos de blocos completamente diferentes que fiz no depósito de Moscou.

Só restava acreditar em um milagre, acumular acréscimos, criar heurísticas para remover segmentos errados, dos quais havia muitos, já que eu não pensava em anti-exemplos.

Aguardando:



Realidade:





Aqui deve-se dizer que não havia um único exemplo de blocos muito desgastados.

Modelo de treinamento

O modelo com o codificador se_resnext50 e o decodificador com o bloco scse deste repositório mostrou-se melhor, mas o scse (implementação para pytorch) teve que ser removido por motivos de agilidade no processo de previsão, porque teve que ser previsto em um minuto. Para o treinamento do modelo, foi utilizada a estrutura Pytorch 1.0.1 , com um grande número de aprimoramentos de albumentações e um aumento Horizontal Flip auto-escrito para alterar a classe na exibição.

def train_transform(p=1): return Compose([ OneOf([ CLAHE(clip_limit=2), IAASharpen(), IAAEmboss(), RandomBrightnessContrast(brightness_limit=0.8, contrast_limit=0.8), HueSaturationValue(hue_shift_limit=50, sat_shift_limit=50, val_shift_limit=50), RGBShift(r_shift_limit=50, g_shift_limit=50, b_shift_limit=50), JpegCompression(quality_lower=30), RandomGamma(), GaussNoise() ], p=0.3), OneOf([ Blur(), MotionBlur(), MedianBlur(), ], p=0.3), ShiftScaleRotate(shift_limit=0.2, scale_limit=0.4, rotate_limit=5, p=0.5), Normalize(p=1) ], p=p) 

Como uma função de perda, escolhi a perda Lovász-Softmax , que se comportou quase da mesma forma que bce + jaccard, mas melhor que BCE , que se encaixa muito na marcação. A escolha de um algoritmo para determinar o número de série de um par de rodas e blocos também foi um desafio, havia opções com aprendizado métrico , mas eu precisava mostrar rapidamente o resultado, e surgiu a ideia de marcar os blocos nas classes 1 e 2, onde 1 é a orientação à direita e 2 é para a esquerda. A rede começou a prever não apenas a máscara, mas a orientação. Usando heurísticas simples, foi possível determinar de forma confiável os números de série de blocos e rodados, e, em seguida, calcular a média das previsões, de fato, usar o TTA com uma ligeira mudança de objeto durante o movimento e diferentes ângulos de iluminação fornece um bom resultado na precisão da máscara, mesmo com uma resolução de 320x320.

Separadamente, a tarefa era determinar o defeito em forma de cunha dos blocos; havia muitas idéias da Transformação Huff , para marcar os cantos / bordas do bloco com pontos / linhas de diferentes classes. No final, a opção venceu a maneira como os trabalhadores o fazem: você precisa recuar 5 cm da borda estreita e medir a largura, se estiver dentro da faixa normal, e pular o bloco.

O pipeline de treinamento foi retirado daqui pela Segmentação de Instrumentos Robóticos MICCAI 2017 . O processo de treinamento consiste em três etapas: treinamento com um codificador congelado, treinamento de toda a rede e treinamento com CosineAnnealingLR . Os dois primeiros estágios usam o ReduceLROnPlateau .

Programando um servidor e cliente REST no Android

Para o servidor REST, escolhi o balão - é mais fácil não lançar em dois minutos. Decidi criar um banco de dados para armazenamento com minhas próprias mãos na forma de uma estrutura de pastas simples e um arquivo de estado atual. A aplicação para o tablet no Android Studio, o benefício das versões mais recentes é apenas um paraíso para o desenvolvedor.

Projeto e montagem de um rack para posicionamento de câmeras e luz

Lembrei-me dos velhos tempos em que fazia estações de carregamento para veículos elétricos, e essa experiência foi muito útil - decidimos fabricá-la a partir de racks estruturais de alumínio impressos em uma impressora 3D.





Chegando ao teste!


O resultado superou todas as expectativas. Para especialistas em visão computacional, a tarefa pode parecer bastante direta e simples. No entanto, fiquei cético por causa de duas coisas: primeiro, o conjunto de treinamento era pequeno e não continha casos de fronteira, como blocos muito finos; segundo, os testes foram realizados em condições muito diferentes de tiro e iluminação.





Na validação, o Jaccard atinge 0,96, visualmente os blocos são segmentados com muita clareza, adicionam uma média de várias fotos e obtêm uma precisão muito boa na estimativa da largura dos blocos. Durante os testes, descobriu-se que você pode trabalhar com os carrinhos de outras locomotivas, mas tirar câmeras mais rápidas:





Concluindo, quero dizer que a tecnologia se mostrou muito bem e, na minha opinião, tem um grande potencial em termos de eliminar o fator humano, reduzindo o tempo de inatividade de uma locomotiva e fazendo previsões.

Agradecimentos

Graças à comunidade ods.ai , sem sua ajuda, eu não seria capaz de fazer tudo isso em tão pouco tempo! Muito obrigado a n01z3 , DL, que desejava que eu assumisse a DL, por seus inestimáveis ​​conselhos e extraordinário profissionalismo! Muito obrigado ao idealizador ideológico Vasily Manko (CEO, empresa Aurorai), a melhor designer Tatyana Brusova.

Vejo você no próximo episódio da história!

Aurorai, llc

Source: https://habr.com/ru/post/pt443016/


All Articles