¿Cuál es el mejor enfoque para reconocer patrones en los datos y cuál es la mejor manera de aprender más sobre el tema?

StackOverflow https://stackoverflow.com/questions/1441319

Pregunta

Un desarrollador con el que estoy trabajando está desarrollando un programa que analiza imágenes del pavimento para encontrar grietas en el pavimento. Por cada grieta que encuentra su programa, produce una entrada en un archivo que me dice qué píxeles forman esa grieta en particular. Sin embargo, hay dos problemas con su software:

1) Produce varios falsos positivos

2) Si encuentra una grieta, solo encuentra pequeñas secciones de ella y denota esas secciones como grietas separadas.

Mi trabajo es escribir software que lea estos datos, los analice y sepa la diferencia entre falsos positivos y grietas reales. También necesito determinar cómo agrupar todas las secciones pequeñas de una grieta como una sola.

He intentado varias formas de filtrar los datos para eliminar los falsos positivos, y he estado usando redes neuronales con un grado limitado de éxito para agrupar las grietas. Entiendo que habrá errores, pero a partir de ahora, hay demasiados errores. ¿Alguien tiene alguna idea para un experto que no sea AI sobre la mejor manera de cumplir mi tarea u obtener más información al respecto? ¿Qué tipo de libros debo leer o qué clases debo tomar?

EDITAR Mi pregunta es más sobre cómo notar patrones en los datos de mi compañero de trabajo e identificar esos patrones como grietas reales. Lo que me preocupa es la lógica de alto nivel, no tanto la lógica de bajo nivel.

EDITAR En realidad, se necesitarían AL MENOS 20 imágenes de muestra para dar una representación precisa de los datos con los que estoy trabajando. Varía mucho Pero sí tengo una muestra aquí , aquí , y aquí . Estas imágenes ya han sido procesadas por el proceso de mi compañero de trabajo. Los datos rojo, azul y verde es lo que tengo que clasificar (rojo significa grieta oscura, azul significa grieta clara y verde representa una grieta ancha / sellada).

¿Fue útil?

Solución

Además de los comentarios útiles sobre el procesamiento de imágenes, también parece que se trata de un agrupación problema .

Los algoritmos de agrupamiento provienen de la literatura aprendizaje automático , específicamente aprendizaje no supervisado . Como su nombre lo indica, la idea básica es tratar de identificar grupos naturales de puntos de datos dentro de un gran conjunto de datos.

Por ejemplo, la imagen a continuación muestra cómo un algoritmo de agrupamiento podría agrupar un grupo de puntos en 7 grupos (indicados por círculos y color):

 k-means
(fuente: natekohl.net )

En su caso, un algoritmo de agrupamiento intentaría fusionar repetidamente pequeñas grietas para formar grietas más grandes, hasta que se cumplan algunos criterios de detención. El resultado final sería un conjunto más pequeño de grietas unidas. Por supuesto, las grietas son un poco diferentes a los puntos bidimensionales: parte del truco para lograr que un algoritmo de agrupación funcione aquí será definir una métrica de distancia útil entre dos grietas.

Los algoritmos de agrupamiento populares incluyen k-significa agrupación ( demo ) y agrupamiento jerárquico . Ese segundo enlace también tiene una buena explicación paso a paso de cómo funciona k-means.

EDITAR : este documento de algunos ingenieros de Phillips parece relevante para lo que está tratando de hacer:

  • Chenn-Jung Huang, Chua-Chin Wang, Chi-Feng Wu, " Técnicas de procesamiento de imágenes para la identificación de grupos de defectos de obleas " IEEE Diseño y prueba de computadoras, vol. 19, no. 2, págs. 44-48, marzo / abril de 2002.

Están realizando una inspección visual para detectar defectos en las obleas de silicio, y utilizan un filtro mediano para eliminar el ruido antes de usar un algoritmo de agrupación del vecino más cercano para detectar los defectos.

Aquí hay algunos documentos / libros relacionados que citan que podrían ser útiles:

  • M. Taubenlatt y J. Batchelder, " Inspección de obleas modeladas utilizando filtrado espacial para el entorno de clúster ", Óptica aplicada, vol. 31, no. 17 de junio de 1992, págs. 3354-3362.
  • F.-L. Chen y S.-F. Liu, " Un enfoque de red neuronal para reconocer el patrón espacial de defectos en la fabricación de semiconductores. " IEEE Trans. Fabricación de semiconductores, vol. 13, no. 3, agosto de 2000, págs. 366-373.
  • G. Earl, R. Johnsonbaugh y S. Jost, Reconocimiento de patrones y análisis de imágenes , Prentice Hall, Upper Saddle River, N.J., 1996.

Otros consejos

Su problema recae en el campo muy amplio de clasificación de imágenes. Este tipo de problemas puede ser notoriamente difícil y, al final del día, resolverlos es un arte. Debe aprovechar cada conocimiento que tenga sobre el dominio del problema para hacerlo manejable.

Una cuestión fundamental es la normalización. Desea tener objetos clasificados de manera similar para que sean lo más similares posible en su representación de datos. Por ejemplo, si tiene una imagen de las grietas, ¿todas las imágenes tienen la misma orientación? De lo contrario, rotar la imagen puede ayudar en su clasificación. Del mismo modo, escala y traducción (consulte this )

También desea eliminar tantos datos irrelevantes como sea posible de sus conjuntos de entrenamiento. En lugar de trabajar directamente en la imagen, quizás podría usar extracción de bordes (por ejemplo, detección de bordes Canny ) Esto eliminará todo el 'ruido' de la imagen, dejando solo los bordes. El ejercicio se reduce a identificar qué bordes son las grietas y cuáles son el pavimento natural.

Si desea acceder rápidamente a una solución, le sugiero que primero pruebe su suerte con un Red neuronal convolucional , que puede realizar una clasificación de imagen bastante buena con un mínimo de preprocesamiento y noramlización. Es bastante conocido en el reconocimiento de escritura a mano, y puede ser justo para lo que estás haciendo.

Estoy un poco confundido por la forma en que elegiste resolver el problema. Si su compañero de trabajo no está identificando grietas completas, y esa es la especificación, entonces ese es su problema. Pero si logras unir todas las grietas y evitar sus falsos positivos, ¿no acabas de hacer su trabajo?

Aparte de eso, creo que este es un detección de bordes en lugar de un problema de clasificación. Si el detector de bordes es bueno, entonces sus problemas desaparecen.

Si todavía está establecido en la clasificación, necesitará un conjunto de entrenamiento con respuestas conocidas, ya que necesita una forma de cuantificar qué diferencia un falso positivo de un crack real. Sin embargo, sigo pensando que es poco probable que su clasificador pueda conectar las grietas, ya que son específicas para cada losa individual.

Tengo que estar de acuerdo con ire_and_curses, una vez que te sumerges en el ámbito de la detección de bordes para parchear la detección de grietas de tus co-desarrolladores y eliminar sus falsos positivos, parece que harías su trabajo. Si puede parchear lo que su software no detectó, y eliminar sus falsos positivos en torno a lo que le ha dado. Parece que podría hacer esto para la imagen completa.

Si la especificación es que él detecte las grietas y las clasifique, entonces es su trabajo hacer la detección de bordes y eliminar los falsos positivos. Y tu trabajo es tomar lo que te ha dado y clasificar qué tipo de crack es. Si tiene que hacer una detección de bordes para hacerlo, entonces parece que no está lejos de dejar a su co-desarrollador sin trabajo.

Hay algunas muy buenas respuestas aquí. Pero si no puede resolver el problema, puede considerar Mechanical Turk. En algunos casos, puede ser muy rentable para problemas difíciles. Conozco personas que lo usan para todo tipo de cosas como esta (verificación de que un humano puede hacer fácilmente pero resulta difícil de codificar).

https://www.mturk.com/mturk/welcome

No soy un experto de ninguna manera, pero intente mirar Haar Cascades . También es posible que desee experimentar con el kit de herramientas OpenCV. Estas dos cosas juntas hacen la detección de rostros y otras tareas de detección de objetos.

Puede que tenga que hacer " entrenamiento " desarrollar una cascada de Haar para grietas en el pavimento.

  

¿Cuál es el mejor enfoque para reconocer patrones en los datos y cuál es la mejor manera de aprender más sobre el tema?

El mejor enfoque es estudiar el reconocimiento de patrones y el aprendizaje automático. Comenzaría con la Clasificación de patrones de Duda y usaría la Reconocimiento de patrones y aprendizaje automático como referencia. Tomaría un buen tiempo para que el material se hunda, pero obtener un sentido básico de reconocimiento de patrones y enfoques importantes del problema de clasificación debería darle la dirección. Puedo sentarme aquí y hacer algunas suposiciones sobre sus datos, pero honestamente, probablemente tenga la mejor idea sobre el conjunto de datos, ya que lo ha estado tratando más que nadie. Algunas de las técnicas útiles, por ejemplo, podrían ser máquina de vectores de soporte y impulsar .

Editar : una aplicación interesante de refuerzo es la detección de rostros en tiempo real. Vea detección rápida de objetos de Viola / Jones con una cascada de objetos simple mejorada Características (pdf). Además, mirando las imágenes de muestra, diría que debería intentar mejorar un poco la detección de bordes. Quizás suavizar la imagen con Gauss y ejecutar una detección de bordes más agresiva puede aumentar la detección de grietas más pequeñas.

Te sugiero que recojas cualquier libro de texto de procesamiento de imágenes y leas sobre el tema. En particular, puede estar interesado en Morfológico Operaciones como Dilatación y Erosion , que complementa el trabajo de un detector de bordes . Un montón de materiales en la red ...

Este es un problema de procesamiento de imágenes. Hay muchos libros escritos sobre el tema, y ??gran parte del material de estos libros irá más allá de un problema de detección de líneas como este. Aquí está el resumen de una técnica que funcionaría para el problema.

  1. Cuando encuentras una grieta, encuentras algunos píxeles que forman la grieta. Para esto se pueden utilizar filtros de detección de bordes u otros métodos de detección de bordes.

  2. Comience con un (cualquier) píxel en una grieta, luego " siga " para hacer una línea multipunto de la grieta: guarde los puntos que forman la línea. Puede eliminar algunos puntos intermedios si se encuentran cerca de una línea recta. Haz esto con todos los píxeles de crack. Si tienes una grieta en forma de estrella, no te preocupes por eso. Simplemente siga los píxeles en una (o dos) direcciones para formar una línea, luego elimine estos píxeles del conjunto de píxeles de crack. Las otras patas de la estrella se reconocerán como líneas separadas (por ahora).

  3. Puede realizar un poco de adelgazamiento en los píxeles de crack antes del paso 1. En otras palabras, verifique los vecinos de los píxeles, y si hay demasiados, ignore ese píxel. (Esto es una simplificación: puede encontrar varios algoritmos para esto). Otro paso de preprocesamiento podría ser eliminar todas las líneas que son demasiado delgadas o dos débiles. Esto podría ayudar con los falsos positivos.

  4. Ahora tiene muchas líneas cortas y multipunto. Para los puntos finales de cada línea, encuentre la línea más cercana. Si las líneas están dentro de una tolerancia, entonces " connect " las líneas: vincúlelas o agréguelas a la misma estructura o matriz. De esta manera, puede conectar las grietas cercanas, que probablemente serían la misma grieta en el concreto.

Parece que no importa el algoritmo, será necesario algún ajuste de parámetros para un buen rendimiento. Escríbalo para que sea fácil hacer cambios menores en cosas como umbrales de intensidad, grosor mínimo y máximo, etc.

Dependiendo del entorno de uso, es posible que desee permitir que el criterio del usuario determine los casos cuestionables y / o permita que un usuario revise todas las grietas y haga clic para combinar, dividir o eliminar las grietas detectadas.

Tienes una muy buena respuesta, especialmente. @ Nate's, y todos los enlaces y libros sugeridos valen la pena. Sin embargo, me sorprende que nadie haya sugerido el único libro que habría sido mi primera elección: O'Reilly's Programación de inteligencia colectiva . El título puede no parecer pertinente a su pregunta, pero, créame, los contenidos son : una de las coberturas más prácticas y orientadas a los programadores de minería de datos y "aprendizaje automático". Que he visto ¡Dale una vuelta! -)

Suena un poco como un problema que hay en Rock Mechanics, donde hay uniones en una masa de roca y estas uniones deben agruparse en 'conjuntos' por orientación, longitud y otras propiedades. En este caso, un método que funciona bien es la agrupación, aunque los medios K clásicos parecen tener algunos problemas que he abordado en el pasado utilizando un algoritmo genético para ejecutar la solución interactiva.

En este caso, sospecho que podría no funcionar de la misma manera. En este caso, sospecho que necesita crear sus grupos para comenzar, es decir, longitudinal, transversal, etc. y definir exactamente cuál es el comportamiento de cada grupo, es decir, puede una sola rama longitudinal de grietas a lo largo de su longitud, y si lo hace, ¿qué hace? eso hace a su clasificación.

Una vez que tenga eso para cada grieta, generaría una grieta aleatoria o un patrón de grietas basado en la clasificación que ha creado. Luego puede usar algo como un enfoque de mínimos cuadrados para ver qué tan cerca se ajusta la grieta que está comprobando contra la grieta / grietas aleatorias que ha generado. Puede repetir este análisis muchas veces a la manera de un análisis de Monte-Carlo para identificar cuál de las grietas / grietas generadas aleatoriamente se ajusta mejor a la que está comprobando.

Para lidiar con los falsos positivos, deberá crear un patrón para cada uno de los diferentes tipos de falsos positivos, es decir, el borde de una acera es una línea recta. Entonces podrá ejecutar el análisis seleccionando cuál es el grupo más probable para cada grieta que analice.

Finalmente, necesitará 'ajustar' la definición de diferentes tipos de crack para intentar obtener un mejor resultado. Supongo que esto podría usar un enfoque automatizado o manual dependiendo de cómo defina sus diferentes tipos de crack.

Otra modificación que a veces ayuda cuando estoy haciendo problemas como este es tener un grupo aleatorio. Al ajustar la sensibilidad de un grupo aleatorio, es decir, cuán más o menos probable es que se incluya una grieta en el grupo aleatorio, a veces puede ajustar la sensibilidad del modelo a patrones complejos que realmente no encajan en ningún lado.

Buena suerte, me parece que tienes un verdadero desafío.

Debería leer sobre minería de datos , especialmente extracción de patrones .

  

La minería de datos es el proceso de extraer patrones de los datos. A medida que se recopilan más datos, y la cantidad de datos se duplica cada tres años, la minería de datos se está convirtiendo en una herramienta cada vez más importante para transformar estos datos en información. Se usa comúnmente en una amplia gama de prácticas de creación de perfiles, como marketing, vigilancia, detección de fraude y descubrimiento científico.

Un buen libro sobre el tema es Minería de datos: herramientas y técnicas prácticas de aprendizaje automático

 La minería de datos se puede comprar en Amazon.
(fuente: waikato.ac.nz ) ] ( http://www.amazon.com/Data-Mining -Ian-H-Witten / dp / 3446215336 " ISBN 0-12-088407-0 ")

Básicamente, lo que tiene que hacer es aplicar herramientas y metodologías estadísticas a sus conjuntos de datos. Las metodologías de comparación más utilizadas son la prueba t de Student y la , para ver si dos variables no relacionadas están relacionadas con cierta confianza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top