¿Qué tienen en común una sala de máquinas y una residencia de ancianos? La respuesta: ambas zonas se benefician de una solución que detecta charcos en el suelo y puede evitar así accidentes.
En este artículo presentamos un proyecto de investigación en el que estamos trabajando en esta tarea. Podrás hacerte una idea de nuestro papel como consultoría de ciencia de datos, nuestros retos en el proyecto, las decisiones importantes y, por último, el resultado.
Inhaltsverzeichnis
Los objetivos empresariales y el papel de los proyectos de investigación en [en].
La consultoría se orienta a las necesidades específicas del cliente. Los proyectos habituales incluyen la aplicación de tecnologías punteras existentes a casos de uso o mostrar al cliente la mentalidad de un empresa digital más cerca. Pero, ¿eso es todo lo que hay que hacer en consultoría? Afortunadamente, en [at] tenemos la oportunidad de apoyar la investigación sobre IA en varios proyectos innovadores. Uno de nuestros proyectos actuales se llama S³.
S³ - abreviatura de "Safety Sensor Technology for Service Robots in Production Logistics and Inpatient Care" - es un proyecto de cooperación en el que socios de los ámbitos de la logística, la asistencia sanitaria y la robótica, así como de universidades, se unen para dar un paso adelante en la investigación aplicada (Investigación electrónica del Ministerio Federal de Educación e Investigación). El proyecto está financiado por el Ministerio Federal de Educación e Investigación y colaboramos con los siguientes socios:
- Instituto de Manipulación de Materiales y Logística (IFT), Universidad de Stuttgart
- Instituto Fraunhofer de Ingeniería de Fabricación y Automatización (IPA), Departamento de Robótica y Sistemas de Asistencia
- Pilz GmbH
- Bruderhaus Diaconia
El objetivo a largo plazo de S³ es derivar la asistencia robótica al contexto industrial, así como a los centros sanitarios. Conociendo este amplio campo de investigación, ¿qué papel desempeña [at] como asesor en esta cooperación? Según nuestra experiencia, la cooperación funciona sin problemas cuando cada participante tiene su propia área de responsabilidad. Para nosotros, esto significa la aplicación de Casos prácticos de aprendizaje automático:
- Detección automática de líquidos derramados en el suelo (para industria y sanidad)
- Detección de nivel de tarros y botellas (para sanidad)
- Detección de anomalías en objetos y personas (para la industria y la sanidad)
A continuación describimos el procedimiento, desde el modelo inicial hasta el modelo entrenado.
Ventajas y retos de la detección de vertidos
A alto nivel, el objetivo del caso de uso es "Detección de vertidos para diseñar un modelo que detecte automáticamente líquidos industriales en el suelo, así como derrames en centros sanitarios (por ejemplo, residencias de ancianos). En el futuro, los robots irán equipados con esta tecnología, que les permitirá localizar charcos en el suelo y evitar así accidentes alertando al personal de mantenimiento. Además, el propio robot no debería verse obstaculizado por el líquido.
Los líquidos derramados en el suelo son una peligro potencial para los sistemas autónomos y las personas. La electrónica puede fallar y las personas pueden resbalar y lesionarse. Además, el líquido del suelo puede tener componentes químicos, biológicos o peligrosos que no deben seguir esparciéndose. Los robots que se utilizan actualmente en la industria y la sanidad suelen limitarse a detectar una anomalía en el suelo, detenerse y esperar a que un humano atienda la situación. Por eso, un modelo capaz de detectar con precisión el charco, enviar una alarma y evitarlo con seguridad puede ahorrar mucho tiempo, reducir posibles incidentes y mejorar el flujo operativo. suave diseño. No obstante, la necesidad de detectar vertidos en distintos entornos interiores plantea el reto de desarrollar un modelo que tenga una amplia aplicación.
El campo del reconocimiento de objetos en imágenes mediante técnicas de ML está muy desarrollado. ¿Qué hace que nuestro caso de uso sea tan difícil? ¿Por qué los modelos preentrenados no pueden resolver este problema de forma inherente? Empecemos por el general Dificultad comenzar. Los charcos varían en forma y color y su textura depende en gran medida del entorno. Además, el reflejo de la superficie del charco dificulta el aprendizaje correcto de los algoritmos de reconocimiento de objetos. Un reto aún más grave (y muy extendido en la investigación del ML) es el hecho de que todavía no existe un Registros etiquetados para la detección de líquidos en interiores.
Los datos: Un primer punto de partida en los proyectos de ML
La investigación de los enfoques más avanzados para nuestro caso de uso apunta directamente a los conjuntos de datos para la conducción autónoma, ya que los coches autoconducidos también necesitan detectar líquidos en el suelo. El sitio Disco Puddle 1000 y el modelo desarrollado por investigadores australianos (https://github.com/Cow911/SingleImageWaterHazardDetectionWithRAU) han demostrado que los enfoques de segmentación de imágenes son prometedores para la detección de charcos de agua en exteriores. El modelo utilizado en este proyecto se basó en unidades de atención a la reflexión con una configuración de TensorFlow en segundo plano. Implementamos una UNET dinámica de fast.ai en el conjunto de datos Puddle-100 como primera aproximación a esto. Además de los resultados rápidos, un resultado valioso de este enfoque fue un mejor sentido y comprensión de la Naturaleza de los charcosEl entorno (por ejemplo, a través de los reflejos), la perspectiva desde la que se tomaron las imágenes y, sobre todo, la exposición a la luz influyen enormemente en los charcos. Como todas estas propiedades son enormemente diferentes en escenarios exteriores e interiores, decidimos que era necesario un conjunto de datos nuevo y de producción propia, adaptado a nuestro caso de uso en interiores.
Tras tomar esta decisión, surgieron muchas preguntas: ¿Qué datos necesitamos? ¿Cómo recopilarlos? ¿Qué metadatos son valiosos? Como punto de partida, elaboramos una lista de Factores que influyenque deben tenerse en cuenta al grabar vídeo:
- Luz (eléctrica frente a natural, clara frente a oscura, sombra, posición de la fuente de luz)
- Fondo de la escena interior (color y textura del suelo, reflejos naturales en el suelo seco, número y movilidad de los objetos en la escena).
- Tamaño/cantidad del vertido (sin vertido, mancha pequeña frente a suelo entero, una mancha frente a muchas manchas).
- Orientación de la cámara (horizontal, vista hacia arriba frente a vista hacia abajo)
- Movimiento en la escena (de pie frente a la conducción, cambio de dirección)
- Tipo de charco (agua, café, agua coloreada para imitar líquidos peligrosos).
Por lo tanto, decidimos, Cree vídeos que imitan a los robots en sus movimientos y utilizan un fondo médico e industrial distribuido uniformemente. El resultado fueron 51 vídeos, de 30-60 segundos cada uno, junto con una hoja de cálculo Excel que comprime los metadatos de cada vídeo.
Centro: Charco de agua en nave industrial, derecha: Charco de café sobre baldosas
Un importante Lección era que la distribución de las variables ambientales debía aclararse antes de empezar a grabar, a fin de crear un conjunto de datos valioso para entrenar un modelo para nuestro caso de uso específico.
El etiquetado de los datos: Elaborado, pero indispensable
Ahora que ya tenemos nuestro propio conjunto de datos, nos espera la siguiente gran tarea del aprendizaje supervisado: el etiquetado de los datos Para las tareas de segmentación, ésta es la parte más importante y elaborada para que un conjunto de datos sea valioso. Dado que el requisito en nuestro caso de uso de la segmentación es detectar con precisión los límites del charco, en cada imagen tuvimos que polígonos muy complejos dibujar. Debido al gran esfuerzo que supone el etiquetado, vimos la necesidad de una plataforma adecuada en la que muchas personas (no necesariamente con profundos conocimientos del dominio, por ejemplo, estudiantes en activo) puedan trabajar juntas.
El resultado fue la creación de una herramienta altamente automatizada denominada CVAT (Herramienta de anotación de visión por ordenadordesarrollado por Intel y OpenCV) con conexión a un servidor en la nube y almacenamiento. Una ventaja de esta solución es que puede desplegarse en la web y, por tanto, tener una interfaz fácil de usar (puede ejecutarse en un navegador) para todos los usuarios. Además, permite automatizar tareas fácilmente mediante el uso de una API Rest. Obtenga más información sobre esta aplicación en una de nuestras futuras entradas del blog sobre mejores prácticas de etiquetado.
Cómo encontrar el modelo adecuado
El primer paso antes de empezar con la codificación ML es configurar un Entorno de desarrolloque apoya el trabajo en colaboración en iteraciones rápidas permite y proporciona la base para una escalable y reproducible. En aras de la simplicidad, hemos optado por desarrollar en cuadernos Jupyter, que se ejecutan en un Clúster de GPU local alojada con cuatro nodos de GPU, cada uno con ~12 GB de memoria. La solución local tenía dos grandes ventajas para nosotros: menores costes en términos de precios en la nube y ahorro de tiempo en la incorporación de nuevo personal al proyecto. Para garantizar un trabajo en equipo fluido, introdujimos directrices de codificación. En ellas se especifica que cada función lista para usar se almacena en un módulo de Python con seguimiento Git y se mantiene actualizado un archivo de entorno compartido para corregir las distintas versiones de los paquetes.
Pasando al desarrollo del modelo, nos centraremos en dos aspectos principales: la Selección del modelo y el Ajuste de modelos (aunque hay muchos más pasos que deben tenerse en cuenta pero que quedan fuera del alcance de esta entrada de blog).
Desde el Enfoque Fast.ai nos dio resultados rápidos y buenos en el conjunto de datos Puddle 100, decidimos iniciar este caso de uso también en nuestro propio conjunto de datos e implementar algunos desarrollos adicionales en él. Nos gustaría presentar aquí algunos retos importantes y nuestros resultados:
- Pensar en una Distribución del tren de pruebas es importante para poder confiar en los resultados del entrenamiento del modelo. Decidimos distribuir los fondos uniformemente entre las divisiones de prueba y de entrenamiento y también añadimos una función (como la función Factor de bloqueo del paquete MLR), que distribuye uniformemente las imágenes extraídas de un vídeo.
- En el caso de las funciones de pérdida para tareas de segmentación, se recomienda utilizar Pérdida focal y Pérdida de dados (como lectura informativa: Cómo segmentar edificios en imágenes de drones ... ). Resulta muy interesante que el uso de las dos funciones de pérdida más conocidas, a saber. Pérdida de entropía cruzada y Pérdida de entropía binaria - nos dio un resultado disperso (es decir, se detectó el charco pero no de forma coherente).
- La elección correcta de Métricas es crucial a la hora de evaluar. Hemos definido varias funciones métricas, como dice_iou, precisión, recuerdo, valor_predicho_negativo, especificidad y f1_score. Todas las métricas se aplican por píxel y por imagen, por ejemplo, la proporción de píxeles de charcos detectados que eran realmente charcos frente a la proporción de imágenes de charcos previstas que eran realmente imágenes de charcos. Para nosotros, lo más sensato era fijarnos en la métrica dice_iou.
- Además de la medición numérica, nos pareció útil utilizar un método menos automatizado, pero función de validación adaptada a tienen. Aquí descubrimos que una comparación de las máscaras reales y las predichas agrupadas por metadatos (por ejemplo, fondo, industrial o no, enterrado o no) puede ser particularmente útil para clasificar el rendimiento de nuestro entrenamiento.
Una de las cosas que más hemos aprendido al trabajar con el paquete fast.ai es que es fácil de usar desde el principio, pero cuando se trata de personalizarlo y modificarlo, puede complicarse rápidamente.
Se ha emitido la función para el fondo de grupo 'Hall' (campo izquierdo: verdad vestida, campo derecho: predicción
Cuando estuvimos listos para entrenar el modelo, hubo que tomar decisiones importantes sobre la Arquitectura modelo se cumplan. Jugamos con diferentes configuraciones, pero rápidamente nos decidimos por una arquitectura U-Net que se basa en el codificador preentrenado resnet18. Las redes en U se han hecho populares en los últimos años para tareas de segmentación de imágenes. La idea procede del artículo "U-Net: redes convolucionales para segmentación de imágenes biomédicas"En resumen, la idea de esta arquitectura es llevar a cabo una rutina de reducción de muestreo en la imagen de entrada, seguida de un posterior aumento de muestreo para restaurar el tamaño de entrada original. Esto permite la localización precisa de objetos en la imagen. Además, la arquitectura consta de una ruta de contratación para capturar el contexto.
Ajuste de modelos
Nuestro siguiente paso fue la Ajuste de los hiperparámetros. Esta tarea tiene dos partes: probar la extensión de los datos y los parámetros del modelo. El mayor reto era encontrar una forma automatizada de establecer correctamente el parámetro de la tasa de aprendizaje. En algunas muestras de curvas de aprendizaje, descubrimos muchas formas diferentes y un gran impacto de la elección de la tasa de aprendizaje en la precisión de la predicción. Por lo tanto, implementamos tres formas de encontrar una tasa de aprendizaje "óptima" y la incluimos como parámetro en el ajuste:
- Gradiente mínimoSeleccione la tasa de aprendizaje que tenga el gradiente mínimo. Este valor puede tomarse directamente de la función lr_find ser tomado por fast.ai.
- Pérdida mínima desplazadaLa tasa de aprendizaje se determina así: Encuentra el valor mínimo y muévelo una décima hacia la izquierda. Este enfoque se basa en una especie de regla empírica que se remonta a Jeremy Howard (cofundador de fast.ai). Este valor se puede determinar (con un poco de esfuerzo extra) a partir de la función lr_find extraerse de fast.ai.
- Ritmo de aprendizaje adecuadoComo las formas directas mencionadas anteriormente para determinar el ritmo de aprendizaje no funcionan correctamente en algunos casos, introducimos un tercer enfoque basado en un debate en un Foro fast.ai basada. La idea es construir una rejilla que se desplace desde el borde derecho del diagrama de la curva de aprendizaje hacia la izquierda hasta que se cumpla una condición de terminación. El objetivo es obtener una tasa de aprendizaje que tenga un gradiente de pérdida mínimo antes de que la pérdida aumente bruscamente. Hay que tener en cuenta que con este enfoque hay que definir de antemano umbrales únicos para cada función de pérdida utilizada.
Una vez configurado todo, realizamos una búsqueda de cuadrícula típica en el espacio de parámetros que se muestra en la figura siguiente. Por razones de tiempo de ejecución, realizamos este ajuste en imágenes redimensionadas a 25 %.
En cada paso, guardamos el gráfico de la tasa de aprendizaje, el gráfico de pérdidas para los datos de prueba y validación, los gráficos de métricas (la más importante para nosotros, la medida dice_iou) y las imágenes de validación que definimos en la función inspeccionar resultados descrita anteriormente. Tras ejecutar el entrenamiento de hiperparámetros durante un fin de semana, podemos concluir con los siguientes resultados:
- No se reconocen claramente los "mejores valores" para el ajuste de los parámetros.
- El valor de "dice_iou" podría incrementarse en aproximadamente 5 % en comparación con los parámetros estándar.
- El "f1_score" podría ser elevado por 2% a la parametrización estándar al mismo tiempo.
- Resulta difícil comparar los resultados de diferentes ejecuciones de pérdidas simplemente observando las medidas de validación. Por lo tanto, en algunos de los gráficos/medidas guardados, realizamos una selección de muestras para los parámetros con las precisiones más altas. Para ello, elegimos el siguiente conjunto de hiperparámetros (todos los demás parámetros se establecen en su valor predeterminado):
Max_rotate=0,
max_zoom=1.4,
kind_of_lr='min_grade',
loss='dice_loss',
longitud_ciclo=48
En resumen, este laborioso ajuste de hiperparámetros no nos proporcionó la mejora deseada en el rendimiento del modelo, pero sí nos ayudó a comprender mejor el modelo y a sentar las bases para el entrenamiento automatizado en un pipeline. Como experimento final de nuestro Proceso de formación hemos desarrollado un procedimiento con entrenamiento iterativo con Cambiar el tamaño de las imágenes implementado. La idea procede de Jeremy Howard (cofundador de fast.ai) del curso fast.ai, que puede seguirse en línea de forma gratuita (https://course.fast.ai/). La idea detrás de este enfoque es que el modelo aprenda el comportamiento general de las formas de segmentación en las primeras ejecuciones (entrenamiento del modelo en un tamaño de imagen pequeño). Esto permite al modelo centrarse cada vez más en los límites precisos de los objetos a reconocer en cada bucle. En nuestro experimento, empezamos con imágenes reducidas de 25 %, escaladas a 50 %, y luego escaladas a 75 % para terminar el entrenamiento con los tamaños de imagen originales. En cada iteración, ajustamos manualmente la tasa de aprendizaje dos veces (cada vez después de ver la curva de la tasa de aprendizaje). Para poder transferir este proceso de entrenamiento a un pipeline final, también implementamos un buscador automático de la tasa de aprendizaje, donde el usuario puede elegir entre las tres opciones de búsqueda automática de la tasa de aprendizaje descritas anteriormente (Gradiente mínimo, Pérdida mínima desplazada y Tasa de aprendizaje adecuada). El resultado de la medida dice_iou es el siguiente:
Tamaño de la imagen | 0.25 | 0.5 | 0.75 | 1.0 |
---|---|---|---|---|
Evaluado en imágenes reducidas | 53,9% | 67,9% | 78,8% | 76,8% |
Evaluado en imágenes a tamaño completo | 22,6% | 55,6% | 73,2% | 76,8% |
Este aumento de la precisión también se observa en las imágenes de validación. Por lo tanto, este método parece ser muy útil en nuestra configuración.
Resumen y perspectivas
Para nosotros, como científicos de datos, siempre hay una pregunta de fondo: ¿Cómo podemos medir si un modelo es bueno? ¿Qué nos dice el Valor de precisión ¿De verdad? ¿Estamos viendo las cosas correctas? Por supuesto, una precisión de 77 % en nuestro conjunto de validación nos dice que el modelo está aprendiendo algo. Pero, ¿es suficiente? En este punto es bueno volver a nuestra motivación inicial y a la Aplicación real volvamos a la tarea para la que se utilizará nuestro modelo: el reconocimiento de charcos en el suelo mediante robots de asistencia en contextos asistenciales e industriales. El charco debe reconocerse y los límites de la forma general deben estar claros, pero no es necesario que la forma se reconozca 100 % correctamente, como ocurriría en una tarea como la de un robot que agarra un objeto. Como implementación intermedia, el robot podría detenerse y enviar una alarma cuando detecte un charco. Evidentemente, en nuestro caso de uso, un falso positivo (detectar un charco cuando no lo hay) es menos fatal que no detectar el charco y seguir esparciendo el líquido no deseado.
Para evaluar si nuestro modelo funcionaba "bien", una respuesta fue que escogiéramos selectivamente algunas imágenes de forma inteligente. En primer lugar, observamos las imágenes agrupadas por los metadatos que habíamos recopilado y, en segundo lugar, nos pareció útil fusionar las imágenes con los vídeos originales para ver el comportamiento predictivo cuando se reproducía el vídeo. Dejamos que sea el lector quien juzgue este resultado:
En resumen, podemos decir que los primeros resultados de nuestro caso de uso parecen muy prometedores. Se detectan charcos en la mayoría de los casos y en los vídeos se aprecia una tendencia comprensible. Por supuesto, como siempre, hay margen de mejora que puede abordarse en el futuro. Nuestros próximos pasos son probar el modelo con datos adicionales (que se están grabando actualmente) y comprobar hasta qué punto se puede generalizar nuestro modelo, y después implantar el modelo en el sistema robótico y probarlo en el mundo real.
0 comentarios