Deep Learning - non seulement les scellés sur les téléphones mobiles ou la façon dont nous diagnostiquons les chariots de locomotive


Il y a quelques jours à peine, Aurorai a transféré l'opération d'essai à un système de reconnaissance des défauts et de surveillance des chariots pour les locomotives Ermak. La tâche est non triviale et très intéressante, dont la première étape a été d'évaluer l'état des plaquettes de frein et la largeur de l'entretoise. Nous avons réussi à résoudre le problème avec une précision de 1 mm à une vitesse de locomotive allant jusqu'à 30 km / h! Je tiens à noter qu'en raison des spécificités, il a été possible d'utiliser "TTA (test-time augmentation)" - un exemple vivant d'un hack de compétition de style kaggle qui ne correspond pas bien à la segmentation sémantique et prod basée sur l' encodeur se_resnext50 , ce qui donne un résultat incroyablement précis dans la prédiction du masque .

Description de la tâche

Il est nécessaire de créer un complexe matériel-logiciel pour détecter les défauts des plaquettes de frein et la sortie des données au chef d'équipe.

Prérequis pour la tâche

Il s'est avéré qu'un grand nombre de plaquettes, environ 80%, changent dans les PTOL (points d'inspection technique des locomotives), et cela se produit toutes les 72 heures pour chaque locomotive. La majeure partie des vérifications dans le PTOL est une inspection visuelle par le capitaine de la partie extérieure du chariot de locomotive.



Plan pour résoudre le problème:

  1. Sélection d'équipement
  2. Collecte de données
  3. Formation modèle
  4. Développement de serveur avec REST API
  5. Développement client tablette Android
  6. Conception et montage d'un rack pour le placement des caméras et de la lumière
  7. Opération d'essai

Sélection d'équipement

L'une des tâches les plus difficiles, sinon les plus difficiles, était peut-être de choisir des caméras, des objectifs et de la lumière dans un budget et un temps limités: MVP devait être fait en un mois et demi. En quelques jours, Google a fait de moi un expert en matériel de vision industrielle. Le choix a été fait sur les caméras Basler et un rétro-éclairage pulsé de 6k lumens, synchronisé avec la caméra. En faveur de Basler (70 images / sec, résolution jusqu'à 1920x1024) son API python parlait, ce qui facilitait grandement l'intégration de tous les composants du système, le seul inconvénient est le prix des caméras ~ 100 tr.

Le choix d'un objectif pour les caméras a été compliqué par un manque de compréhension de la distance focale et de l'angle de vision nécessaires, j'ai dû prendre des risques, mais j'ai sorti un calculateur d'objectif et une pincée de chance.

Rétroéclairage: le temps nécessaire pour que les LED brillent, leur type et les paramètres de l'objectif ont été établis expérimentalement. J'ai essayé 3 modifications de lentilles différentes pour les LED, avec un angle de 30, 45, 60, j'ai finalement choisi des lentilles mates avec un angle de 45.





Assemblage et test du signal de commande d'impulsion pour la caméra



Pour le matériel du serveur, j'ai pris Intel Core i7-7740X Kaby Lake, 46 Go de RAM, 1 To SSD et 3x1080Ti - cela suffit pour prédire deux locomotives à 3 sections en moins de 2 minutes.

Le refroidissement de la ferme collective d'un sandwich à partir de cartes vidéo souffle de 10 degrés.



Collecte de données

La création d'un ensemble de données est une chanson distincte, personne ne peut être chargé de cet événement, et j'ai donc été envoyé dans une ville lointaine et peu connue au fond de notre vaste patrie. J'ai photographié environ 400 pads sur mon téléphone (!!!) . À l'avenir, je dirai que les vaillants employés du dépôt, apparemment effrayés par le vérificateur de Moscou, ont changé tous les tampons des locomotives pour les remplacer par de nouveaux et les ont peints avec une nouvelle couche de peinture, c'était drôle et effrayant de le regarder. J'attendais le pire avec impatience, bien qu'il y ait encore environ 400 photos de blocs complètement différents que j'ai faits dans le dépôt de Moscou.

Il ne restait plus qu'à croire en un miracle, empiler sur les augmentations, inventer des heuristiques pour supprimer les segments erronés, dont il y en avait beaucoup, puisque je ne pensais pas aux anti-exemples.

En attente:



Réalité:





Il faut dire ici qu'il n'y avait pas un seul exemple de blocs fortement usés.

Formation modèle

Le modèle avec l'encodeur se_resnext50 et le décodeur avec le bloc scse de ce référentiel se sont révélés les meilleurs, mais scse (implémentation pour pytorch) a dû être supprimé pour des raisons d'accélération du processus de prédiction, car devait être prédit en une minute. Pour la formation des modèles, le cadre Pytorch 1.0.1 a été utilisé , avec un grand nombre d'augmentations des albumentations et l'augmentation horizontale auto-écrite pour changer la classe lors de l'affichage.

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) 

En tant que fonction de perte, j'ai choisi la perte Lovász-Softmax , elle se comportait presque de la même manière que bce + jaccard, mais mieux que BCE , qui correspond trop au balisage. Le choix d'un algorithme pour déterminer le numéro de série d'une paire de roues et de blocs était également un défi, il y avait des options d' apprentissage métrique , mais je devais montrer rapidement le résultat, et l'idée est venue de marquer les blocs dans les classes 1 et 2, où 1 est l'orientation vers la droite et 2 est à gauche. Le réseau a commencé à prédire non seulement le masque, mais l'orientation. En utilisant des heuristiques simples, il a été possible de déterminer de manière fiable les numéros de série des blocs et des essieux montés, puis de faire la moyenne des prédictions, en fait, en utilisant TTA avec un léger décalage de l'objet pendant le mouvement et différents angles d'éclairage donne un bon résultat dans la précision du masque même à une résolution de 320x320.

Séparément, la tâche consistait à déterminer le défaut en forme de coin des blocs, il y avait beaucoup d'idées de la transformation de Huff , pour marquer les coins / bordures du bloc avec des points / lignes de différentes classes. En fin de compte, l'option a gagné sur la façon dont les travailleurs le font: vous devez vous éloigner de 5 cm du bord étroit et mesurer la largeur, si elle se situe dans la plage normale, puis sauter le bloc.

Le pipeline de formation a été pris à partir d'ici par la segmentation de l'instrument robotique MICCAI 2017 . Le processus de formation comprend trois étapes: la formation avec un encodeur gelé, la formation de l'ensemble du réseau et la formation avec CosineAnnealingLR . Les deux premières étapes utilisent ReduceLROnPlateau .

Programmation d'un serveur et d'un client REST sur Android

Pour le serveur REST, j'ai choisi flask - il est plus facile de ne pas proposer de lancement en 2 minutes. J'ai décidé de créer une base de données pour le stockage de mes propres mains sous la forme d'une structure de dossiers simple et d'un fichier d'état actuel. L'application pour la tablette sur Android Studio, l'avantage des dernières versions n'est qu'un paradis pour le développeur.

Conception et montage d'un rack pour le placement des caméras et de la lumière

Je me souvenais du temps où je fabriquais des bornes de recharge pour voitures électriques, et cette expérience était très pratique - nous avons décidé de la fabriquer à partir de supports structurels en aluminium imprimés sur une imprimante 3D.





Se rendre au test!


Le résultat a dépassé toutes les attentes. Pour les spécialistes de la vision par ordinateur, la tâche peut sembler assez simple et simple. Cependant, j'avais un certain scepticisme à cause de deux choses: premièrement, l'ensemble de formation était petit et ne contenait pas de cas limites tels que des blocs très minces; deuxièmement, les tests ont eu lieu dans des conditions de prise de vue et d'éclairage très différentes.





Jaccard lors de la validation atteint 0,96, visuellement les pads sont segmentés très clairement, ajoutent une moyenne sur plusieurs photos et obtiennent une très bonne précision dans l'estimation de la largeur des pads. Au cours des tests, il s'est avéré que vous pouvez travailler avec les chariots d'autres locomotives, mais prendre des caméras plus rapides:





En conclusion, je tiens à dire que la technologie s'est très bien montrée et, à mon avis, a un grand potentiel en termes d'élimination du facteur humain, de réduction des temps d'arrêt d'une locomotive et de prévision.

Remerciements

Grâce à la communauté ods.ai , sans votre aide, je ne pourrais pas faire tout cela en si peu de temps! Un grand merci à n01z3 , DL, qui m'a souhaité de rejoindre DL, pour ses précieux conseils et son extraordinaire professionnalisme! Un grand merci au cerveau idéologique Vasily Manko (PDG, société Aurorai), la meilleure créatrice Tatyana Brusova.

Rendez-vous dans le prochain épisode de l'histoire!

Aurorai, llc

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


All Articles