Pregunta Procesamiento de imágenes: mejora de algoritmos para el reconocimiento de 'Coca-Cola Can'


Uno de los proyectos más interesantes en los que he trabajado en los últimos años fue un proyecto sobre procesamiento de imágenes. El objetivo era desarrollar un sistema para poder reconocer Coca-Cola 'latas' (Tenga en cuenta que estoy haciendo hincapié en la palabra 'latas', verá por qué en un minuto). Puede ver una muestra a continuación, con la lata reconocida en rectángulo verde con escala y rotación.

Template matching

Algunas limitaciones en el proyecto:

  • El fondo puede ser muy ruidoso.
  • los poder podría tener cualquier escala o rotación o incluso orientación (dentro de límites razonables).
  • La imagen podría tener cierto grado de borrosidad (los contornos podrían no ser completamente rectos).
  • Podría haber botellas de Coca-Cola en la imagen, y el algoritmo solo debería detectar el poder!
  • El brillo de la imagen puede variar mucho (por lo que no puede confiar "demasiado" en la detección del color).
  • los poder podría estar parcialmente oculto en los lados o en el medio y posiblemente parcialmente oculto detrás de una botella.
  • No podría haber poder en absoluto en la imagen, en cuyo caso no tenía que encontrar nada y escribir un mensaje diciéndolo.

Entonces podrías terminar con cosas complicadas como esta (que en este caso mi algoritmo falló totalmente):

Total fail

Hice este proyecto hace un tiempo, y me divertí mucho haciéndolo, y tuve una implementación decente. Aquí hay algunos detalles sobre mi implementación:

Idioma: Hecho en C ++ usando OpenCV biblioteca.

Preprocesamiento: Para el procesamiento previo de la imagen, es decir, la transformación de la imagen en una forma más cruda para dar al algoritmo, utilicé 2 métodos:

  1. Cambiar el dominio de color de RGB a HSV y el filtrado basado en el tono "rojo", la saturación por encima de un cierto umbral para evitar los colores similares a los de la naranja y el filtrado de bajo valor para evitar los tonos oscuros. El resultado final fue una imagen binaria en blanco y negro, donde todos los píxeles blancos representarían los píxeles que coinciden con este umbral. Obviamente, todavía hay mucha basura en la imagen, pero esto reduce la cantidad de dimensiones con las que debe trabajar. Binarized image 
  2. Filtrado de ruido utilizando filtrado mediano (tomando el valor medio de píxeles de todos los vecinos y reemplazando el píxel por este valor) para reducir el ruido.
  3. Utilizando Canny Edge Detection Filter para obtener los contornos de todos los elementos después de 2 pasos precedentes. Contour detection

Algoritmo: El algoritmo que elegí para esta tarea fue tomado de esta libro impresionante sobre la extracción de características y llamado Transformada de Hough generalizada (bastante diferente de la Transformada Hough normal). Básicamente dice algunas cosas:

  • Puede describir un objeto en el espacio sin conocer su ecuación analítica (que es el caso aquí).
  • Es resistente a las deformaciones de la imagen, como la escala y la rotación, ya que básicamente probará su imagen para cada combinación de factor de escala y factor de rotación.
  • Utiliza un modelo base (una plantilla) que el algoritmo "aprenderá".
  • Cada píxel restante en la imagen de contorno votará por otro píxel que supuestamente será el centro (en términos de gravedad) de su objeto, en función de lo que aprendió del modelo.

Al final, terminas con un mapa de calor de los votos, por ejemplo, aquí todos los píxeles del contorno de la lata votarán por su centro gravitatorio, por lo que tendrás muchos votos en el mismo píxel correspondiente al centro, y verá un pico en el mapa de calor como se muestra a continuación:

GHT

Una vez que tenga eso, una simple heurística basada en umbrales puede darle la ubicación del píxel central, desde la cual puede derivar la escala y la rotación y luego trazar su pequeño rectángulo a su alrededor (la escala final y el factor de rotación obviamente serán relativos a su plantilla original). En teoría, al menos ...

Resultados: Ahora, aunque este enfoque funcionó en los casos básicos, en algunas áreas faltaba mucho:

  • Es extremadamente lento! No estoy enfatizando esto lo suficiente. Se necesitó casi un día completo para procesar las 30 imágenes de prueba, obviamente porque tenía un factor de escala muy alto para la rotación y la traducción, ya que algunas de las latas eran muy pequeñas.
  • Se perdió por completo cuando las botellas estaban en la imagen, y por alguna razón casi siempre encontraron la botella en lugar de la lata (tal vez porque las botellas eran más grandes, por lo tanto tenían más píxeles, por lo tanto, más votos)
  • Las imágenes borrosas tampoco fueron buenas, ya que los votos terminaron en píxeles en ubicaciones aleatorias alrededor del centro, terminando con un mapa de calor muy ruidoso.
  • Se logró una variación en la traducción y la rotación, pero no en la orientación, lo que significa que no se reconoció una lata que no se enfrentaba directamente al objetivo de la cámara.

¿Puedes ayudarme a mejorar mi específico algoritmo, utilizando exclusivamente OpenCV características, para resolver el cuatro específicos problemas mencionados?

Espero que algunas personas también aprendan algo al respecto, después de todo, creo que no solo las personas que hacen preguntas deberían aprender. :)


1390
2018-04-16 04:23


origen


Respuestas:


Un enfoque alternativo sería extraer características (puntos clave) utilizando el transformación de característica invariante de escala (SIFT) o Funciones robustas y aceleradas (NAVEGAR).

Se implementa en OpenCV 2.3.1.

Puede encontrar un buen ejemplo de código usando las funciones en Features2D + Homography para encontrar un objeto conocido

Ambos algoritmos son invariantes para escala y rotación. Como trabajan con funciones, también puedes manejar oclusión (siempre que suficientes puntos clave sean visibles).

Enter image description here

Fuente de la imagen: ejemplo tutorial

El procesamiento lleva unos pocos cientos de ms para SIFT, SURF es un poco más rápido, pero no es adecuado para aplicaciones en tiempo real. ORB usa FAST, que es más débil con respecto a la invarianza de rotación.

Los papeles originales


563
2018-04-16 05:17



Para acelerar las cosas, me gustaría aprovechar el hecho de que no se le pide que encuentre una imagen / objeto arbitrario, sino específicamente uno con el logotipo de Coca-Cola. Esto es significativo porque este logotipo es muy distintivo, y debe tener una firma invariante de escala característica en el dominio de frecuencia, particularmente en el canal rojo de RGB. Es decir, el patrón alterno de rojo a blanco a rojo que se encuentra en una línea de escaneo horizontal (entrenado en un logotipo alineado horizontalmente) tendrá un "ritmo" distintivo a medida que pasa por el eje central del logotipo. Ese ritmo se "acelerará" o "disminuirá" a diferentes escalas y orientaciones, pero seguirá siendo proporcionalmente equivalente. Podrías identificar / definir unas pocas docenas de líneas de exploración, tanto horizontal como verticalmente a través del logotipo y varias más diagonalmente, en un patrón estelar. Llámalos las "líneas de escaneo de firmas".

Signature scan line

La búsqueda de esta firma en la imagen de destino es una simple cuestión de escanear la imagen en franjas horizontales. Busque una frecuencia alta en el canal rojo (que indica pasar de una región roja a una blanca), y una vez que la encuentre, vea si está seguida de uno de los ritmos de frecuencia identificados en la sesión de entrenamiento. Una vez que encuentre una coincidencia, sabrá instantáneamente la orientación y la ubicación de la línea de escaneo en el logotipo (si realiza un seguimiento de esas cosas durante el entrenamiento), por lo que es trivial identificar los límites del logotipo desde allí.

Me sorprendería que este no fuera un algoritmo de eficacia lineal, o casi. Obviamente, no aborda su discriminación de botella, pero al menos tendrá su logotipo.

(Actualización: para el reconocimiento de botella, buscaría coque (el líquido marrón) adyacente al logotipo, es decir, dentro la botella. O, en el caso de una botella vacía, buscaría un gorra que siempre tendrá la misma forma, tamaño y distancia básicos del logotipo y, por lo general, será de color blanco o rojo. Busque una forma elíptica de color sólido donde una tapa debería ser, en relación con el logotipo. No es infalible, por supuesto, pero su objetivo aquí debería ser encontrar el fácil unos rápido.)

(Han pasado algunos años desde mis días de procesamiento de imágenes, así que guardé esta sugerencia de alto nivel y conceptual. Creo que podría aproximarse ligeramente a cómo funcionaría un ojo humano, ¡o al menos cómo funciona mi cerebro!)


331
2018-04-17 21:06



Problema divertido: cuando eché un vistazo a la imagen de tu botella pensé que también era una lata. Pero, como ser humano, lo que hice para notar la diferencia es que noté que también era una botella ...

Entonces, para distinguir las latas y las botellas, ¿qué hay de simplemente buscar botellas primero? Si encuentra uno, enmascare la etiqueta antes de buscar latas.

No es demasiado difícil de implementar si ya está haciendo latas. El verdadero inconveniente es que duplica el tiempo de procesamiento. (Pero pensando en las aplicaciones del mundo real, terminarás deseando hacer botellas de todos modos ;-)


132
2018-04-16 05:03



¿No es difícil incluso para los humanos distinguir entre una botella y una lata en la segunda imagen (siempre que la región transparente de la botella esté oculta)?

Son casi iguales a excepción de una región muy pequeña (es decir, el ancho en la parte superior de la lata es un poco pequeño, mientras que la envoltura de la botella tiene el mismo ancho, pero es un cambio menor ¿no?)

Lo primero que se me vino a la mente fue buscar la tapa roja de la botella. Pero sigue siendo un problema, si no hay una tapa para la botella, o si está parcialmente oculta (como se mencionó anteriormente).

Lo segundo que pensé fue sobre la transparencia de la botella. OpenCV tiene algunos trabajos para encontrar objetos transparentes en una imagen. Verifique los enlaces a continuación.

En particular, mire esto para ver con qué precisión detectan el vidrio:

Ver su resultado de implementación:

Enter image description here

Dicen que es la implementación del papel "Un marco de contorno activo geodésico para encontrar vidrio" por K. McHenry y J. Ponce, CVPR 2006.

Puede ser útil en tu caso un poco, pero el problema surge nuevamente si la botella está llena.

Así que creo que aquí, puedes buscar el cuerpo transparente de las botellas primero o para una región roja conectada lateralmente a dos objetos transparentes que obviamente es la botella. (Cuando se trabaja idealmente, una imagen de la siguiente manera).

Enter image description here

Ahora puede eliminar la región amarilla, es decir, la etiqueta de la botella y ejecutar su algoritmo para encontrar la lata.

De todos modos, esta solución también tiene problemas diferentes, como en las otras soluciones.

  1. Funciona solo si su botella está vacía. En ese caso, tendrá que buscar la región roja entre los dos colores negros (si el líquido de Coca Cola es negro).
  2. Otro problema si la parte transparente está cubierta.

Pero de todos modos, si no hay ninguno de los problemas anteriores en las imágenes, esto parece ser una mejor manera.


101
2018-04-18 23:02



de verdad me gusta Darren Cook's y respuestas del apilador a este problema Estaba en medio de lanzar mis pensamientos en un comentario sobre ellos, pero creo que mi enfoque es demasiado en forma de respuesta para no salir de aquí.

En resumen, ha identificado un algoritmo para determinar que un logotipo de Coca-Cola está presente en un lugar particular en el espacio. Ahora está tratando de determinar, por orientaciones arbitrarias y factores de escala arbitrarios, una heurística adecuada para distinguir Coca-Cola latas de otros objetos, incluyendo: botellas, vallas publicitarias, anunciosy Parafernalia de Coca-Cola todos asociados con este logotipo icónico. No mencionó muchos de estos casos adicionales en su declaración del problema, pero creo que son vitales para el éxito de su algoritmo.

El secreto aquí es determinar qué características visuales poder contiene o, a través del espacio negativo, qué características están presentes para otros productos de Coke que no están presentes en las latas. Con ese fin, la respuesta superior actual esboza un enfoque básico para seleccionar "lata" si y solo si no se identifica "botella", ya sea por la presencia de una tapa de botella, líquido u otra heurística visual similar.

El problema es que esto se rompe. Una botella podría, por ejemplo, estar vacía y carecer de la tapa, lo que daría lugar a un falso positivo. O bien, podría ser una botella parcial con características adicionales mutiladas, lo que lleva de nuevo a la detección falsa. Huelga decir que esto no es elegante, ni es efectivo para nuestros propósitos.

Con este fin, los criterios de selección más correctos para las latas parecen ser los siguientes:

  • Es la forma de la silueta del objeto, como esbozaste en tu pregunta¿correcto? Si es así, +1.
  • Si asumimos la presencia de luz natural o artificial, ¿detectamos un contorno de cromo en la botella que indique si está hecho de aluminio? Si es así, +1.
  • ¿Determinamos que el propiedades especulares del objeto son correctos, en relación con nuestras fuentes de luz (enlace de video ilustrativo en detección de fuente de luz)? Si es así, +1.
  • ¿Podemos determinar otras propiedades del objeto que lo identifiquen como una lata, incluidos, entre otros, el sesgo de la imagen topológica del logotipo, la orientación del objeto, la yuxtaposición del objeto (por ejemplo, sobre una superficie plana)? como una mesa o en el contexto de otras latas), y la presencia de una pestaña de extracción? Si es así, para cada uno, +1.

Su clasificación podría verse así:

  • Para cada partido candidato, si se detectó la presencia de un logotipo de Coca Cola, dibuje un borde gris.
  • Para cada partido sobre +2, dibuje un borde rojo.

Esto resalta visualmente al usuario lo que se detectó, enfatizando los positivos débiles que pueden, correctamente, detectarse como latas destrozadas.

La detección de cada propiedad conlleva una complejidad de tiempo y espacio muy diferente, y para cada enfoque, un pase rápido a través de http://dsp.stackexchange.com es más que razonable para determinar el algoritmo más correcto y más eficiente para sus propósitos. Mi intención aquí es, pura y simplemente, enfatizar que detectar si algo es una lata al invalidar una pequeña porción del espacio de detección del candidato no es la solución más robusta o efectiva para este problema, e idealmente, debería tomar las medidas apropiadas en consecuencia.

Y oye, felicidades por la publicación Hacker News! En general, esta es una pregunta bastante buena digna de la publicidad que recibió. :)


41
2018-04-22 22:56



Mirando la forma

Eche un vistazo a la forma de la porción roja de la lata / botella. Observe cómo la lata se estrecha ligeramente en la parte superior, mientras que la etiqueta de la botella es recta. Puede distinguir entre estos dos comparando el ancho de la porción roja a lo largo de él.

Mirando los aspectos más destacados

Una forma de distinguir entre botellas y latas es el material. Una botella está hecha de plástico, mientras que una lata está hecha de aluminio. En situaciones suficientemente iluminadas, observar la especularidad sería una forma de distinguir una etiqueta de botella de una etiqueta de lata.

Por lo que puedo decir, así es como un humano diría la diferencia entre los dos tipos de etiquetas. Si las condiciones de iluminación son deficientes, es probable que exista cierta incertidumbre al distinguir las dos de todas formas. En ese caso, debería ser capaz de detectar la presencia de la botella transparente / translúcida.


35
2018-04-16 08:31



Por favor, eche un vistazo a Zdenek Kalal's Rastreador depredador. Requiere algo de entrenamiento, pero puede aprender activamente cómo el objeto rastreado observa diferentes orientaciones y escalas y lo hace en tiempo real.

El código fuente está disponible en su sitio. Está dentro MATLAB, pero tal vez haya una implementación de Java ya realizada por un miembro de la comunidad. He vuelto a implementar con éxito la parte de seguimiento de TLD en C #. Si mal no recuerdo, TLD está usando helechos como el detector de punto clave. Yo uso SURF o SIFT en su lugar (ya sugerido por @stacker) para readquirir el objeto si el rastreador lo perdió. Los comentarios del rastreador facilitan la creación con el tiempo de una lista dinámica de plantillas de tamizado / navegación que con el tiempo permiten volver a adquirir el objeto con gran precisión.

Si está interesado en mi implementación de C # del rastreador, no dude en preguntar.


31
2018-04-17 20:56



Si no está limitado a una cámara que no estaba en una de sus limitaciones, tal vez pueda pasar a usar un sensor de rango como Xbox. Kinect. Con esto puede realizar una segmentación de profundidad de la imagen basada en la profundidad y el color. Esto permite una separación más rápida de objetos en la imagen. Luego puede usar igualación ICP o técnicas similares para igualar la forma de la lata en lugar de solo su contorno o color, y dado que es cilíndrica, esta puede ser una opción válida para cualquier orientación si tiene un escaneo 3D previo del objetivo. Estas técnicas a menudo son bastante rápidas, especialmente cuando se usan para un propósito específico que debería resolver su problema de velocidad.

También podría sugerir, no necesariamente por precisión o velocidad, pero para divertirse, podría usar una red neuronal entrenada en su imagen segmentada de tono para identificar la forma de la lata. Estos son muy rápidos y a menudo pueden tener hasta 80/90% de precisión. El entrenamiento sería un proceso un poco largo, ya que tendría que identificar manualmente la lata en cada imagen.


25
2018-04-16 04:54