Aprendizaje profundo: no solo sella en teléfonos móviles o cómo diagnosticamos los carros de locomotoras


Hace solo un par de días, Aurorai transfirió un sistema de reconocimiento de defectos y monitoreo de trole para las locomotoras Ermak a la operación de prueba. La tarea no es trivial y es muy interesante, el primer paso fue evaluar la condición de las pastillas de freno y el ancho de la abrazadera. ¡Logramos resolver el problema con una precisión de 1 mm a una velocidad de locomotora de hasta 30 km / h! Quiero señalar que, debido a los detalles, fue posible utilizar "TTA (aumento de tiempo de prueba)" , un ejemplo vívido de un truco de estilo kaggle de competencia que no encaja bien con la segmentación semántica y basada en el codificador se_resnext50 , que proporciona un resultado increíblemente preciso en la predicción de la máscara .

Descripción de la tarea

Es necesario crear un complejo de hardware y software para detectar defectos de las pastillas de freno y la salida de datos al jefe de turno.

Prerrequisitos para la tarea

Al final resultó que, una gran cantidad de almohadillas, alrededor del 80%, cambian en el PTOL (puntos de inspección técnica de locomotoras), y esto sucede cada 72 horas para cada locomotora. La mayor parte de los controles en el PTOL es una inspección visual por parte del maestro de la parte externa del carro de la locomotora.



Plan para resolver el problema:

  1. Selección de equipamiento
  2. Recogida de datos
  3. Entrenamiento modelo
  4. Desarrollo de servidor con REST API
  5. Desarrollo de cliente de tableta Android
  6. Diseño y montaje de un rack para la colocación de cámaras y luces.
  7. Operación de prueba

Selección de equipamiento

Quizás una de las tareas más difíciles, si no la más difícil, fue elegir cámaras, lentes y luz con un presupuesto y tiempo limitados: el MVP debía hacerse en un mes y medio. En un par de días, Google me convirtió en un experto en hardware para visión artificial. La elección se hizo con cámaras Basler y una luz de fondo pulsada de 6k lúmenes, sincronizada con la cámara. A favor de Basler (70 cuadros / seg, resolución de hasta 1920x1024), su API Python habló, lo que facilitó en gran medida la integración de todos los componentes del sistema, el único inconveniente es el precio de las cámaras ~ 100 tr.

La elección de una lente para cámaras fue complicada por la falta de comprensión de la distancia focal y el ángulo de visión necesarios, tuve que correr riesgos, pero saqué una calculadora de lentes y una pizca de suerte.

Luz de fondo: se estableció experimentalmente el tiempo necesario para que los LED brillen, su tipo y los parámetros de la lente. Intenté 3 modificaciones de lentes diferentes para LED, con un ángulo de 30, 45, 60, finalmente elegí lentes mate con un ángulo de 45.





Ensamblar y probar la señal de control de pulso para la cámara



Para el hardware del servidor, tomé Intel Core i7-7740X Kaby Lake, 46 gb de RAM, 1 TB SSD y 3x1080 Ti - esto es suficiente para predecir dos locomotoras de 3 secciones en no más de 2 minutos.

El enfriamiento de la granja colectiva de un emparedado de tarjetas de video sopla 10 grados.



Recogida de datos

Crear un conjunto de datos es una canción separada, nadie puede confiar este evento y, por lo tanto, me enviaron a una ciudad distante y poco conocida en las profundidades de nuestra vasta patria. Fotografié unos 400 pads en mi teléfono (!!!) . Mirando hacia el futuro, diré que los valientes empleados del depósito, aparentemente asustados por el auditor de Moscú, cambiaron todas las pastillas de las locomotoras por unas completamente nuevas y las pintaron con una nueva capa de pintura, fue divertido y aterrador mirarlo. Estaba esperando lo peor, aunque todavía había alrededor de 400 fotos de bloques completamente diferentes que hice en el depósito de Moscú.

Solo quedaba creer en un milagro, acumular aumentos, proponer heurísticas para eliminar segmentos erróneos, de los cuales había muchos, ya que no pensaba en anti-ejemplos.

En espera:



Realidad:





Aquí hay que decir que no hubo un solo ejemplo de bloques muy desgastados.

Entrenamiento modelo

El modelo con el codificador se_resnext50 y el decodificador con el bloque scse de este repositorio se mostró mejor, pero scse (implementación para pytorch) tuvo que eliminarse por razones de acelerar el proceso de predicción, porque tuvo que ser predicho en un minuto. Para el entrenamiento de modelos, se usó el marco Pytorch 1.0.1 , con una gran cantidad de aumentos de albumentaciones y un aumento de Flip Horizontal autoescrito para cambiar la clase cuando se muestra.

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 función de pérdida, elegí la pérdida Lovász-Softmax , se comportó casi igual que bce + jaccard, pero mejor que BCE , que se ajusta demasiado en el marcado. La elección de un algoritmo para determinar el número de serie de un par de ruedas y bloques también fue un desafío, había opciones con el aprendizaje métrico , pero necesitaba mostrar rápidamente el resultado, y surgió la idea de marcar los bloques en las clases 1 y 2, donde 1 es la orientación hacia la derecha y 2 es a la izquierda La red comenzó a predecir no solo la máscara, sino la orientación. Utilizando heurística simple, fue posible determinar de manera confiable los números de serie de bloques y juegos de ruedas, luego promediar las predicciones, de hecho, usar TTA con un ligero desplazamiento del objeto durante el movimiento y diferentes ángulos de iluminación proporciona un buen resultado en la precisión de la máscara incluso con una resolución de 320x320.

Por separado, la tarea era determinar el defecto en forma de cuña de los bloques, había muchas ideas de la Transformación Huff , para marcar las esquinas / bordes del bloque con puntos / líneas de diferentes clases. Al final, la opción ganó cómo los trabajadores lo hacen: debe retroceder 5 cm del borde estrecho y medir el ancho, si está dentro del rango normal, luego omita el bloque.

La tubería de capacitación fue tomada desde aquí por la segmentación de instrumentos robóticos MICCAI 2017 . El proceso de capacitación consta de tres etapas: capacitación con un codificador congelado, capacitación de toda la red y capacitación con CosineAnnealingLR . Las dos primeras etapas usan ReduceLROnPlateau .

Programación de un servidor REST y un cliente en Android

Para el servidor REST, elegí el matraz: es más fácil no realizar un lanzamiento en 2 minutos. Decidí hacer una base de datos para el almacenamiento con mis propias manos en forma de una estructura de carpetas simple y un archivo de estado actual. La aplicación para la tableta en Android Studio, el beneficio de las últimas versiones es solo un paraíso para el desarrollador.

Diseño y montaje de un rack para la colocación de cámaras y luces.

Recordé los viejos tiempos cuando hacía estaciones de carga para vehículos eléctricos, y esta experiencia fue muy útil: decidimos hacerlo con bastidores de aluminio estructural impresos en una impresora 3D.





Llegando a la prueba!


El resultado superó todas las expectativas. Para los especialistas en visión artificial, la tarea puede parecer bastante sencilla y simple. Sin embargo, tuve cierto escepticismo debido a dos cosas: en primer lugar, el conjunto de entrenamiento era pequeño y no contenía casos límite, como bloques muy delgados; En segundo lugar, las pruebas se realizaron en condiciones de disparo e iluminación muy diferentes.





Jaccard en la validación alcanza 0,96, visualmente las almohadillas están segmentadas muy claramente, agregan promedios sobre varias fotos y obtienen una muy buena precisión al estimar el ancho de las almohadillas. Durante las pruebas, resultó que puedes trabajar con los carros de otras locomotoras, pero tomar cámaras más rápidas:





En conclusión, quiero decir que la tecnología se ha mostrado muy bien y, en mi opinión, tiene un gran potencial en términos de eliminar el factor humano, reducir el tiempo de inactividad de una locomotora y hacer pronósticos.

Agradecimientos

¡Gracias a la comunidad de ods.ai , sin su ayuda no podría hacer todo esto en tan poco tiempo! ¡Muchas gracias a n01z3 , DL, que deseaba que tomara DL, por su inestimable consejo y extraordinaria profesionalidad! Muchas gracias al cerebro ideológico Vasily Manko (CEO, compañía Aurorai), la mejor diseñadora Tatyana Brusova.

¡Nos vemos en el próximo episodio de la historia!

Aurorai, llc

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


All Articles