Procesamiento de imágenes: mejora del algoritmo para el reconocimiento de 'latas de Coca-Cola'
Frecuentes
Visto 215,771 veces
1790
Uno de los proyectos más interesantes en los que he trabajado en los últimos dos 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 enfatizando la palabra 'latas', verá por qué en un minuto). Puede ver una muestra a continuación, con la lata reconocida en el rectángulo verde con escala y rotación.
Algunas limitaciones del proyecto:
- El fondo puede ser muy ruidoso.
- EL pueden podría tener cualquier escala or rotación o incluso orientación (dentro de límites razonables).
- La imagen podría tener cierto grado de borrosidad (es posible que los contornos no sean completamente rectos).
- Podría haber botellas de Coca-Cola en la imagen, y el algoritmo solo debería detectar la pueden!
- El brillo de la imagen puede variar mucho (por lo que no puede confiar "demasiado" en la detección de color).
- EL pueden 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 pueden en absoluto en la imagen, en cuyo caso no tenías que encontrar nada y escribir un mensaje diciendo eso.
Así que podrías terminar con cosas complicadas como esta (que en este caso hizo que mi algoritmo fallara por completo):
Hice este proyecto hace un tiempo, 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 preprocesamiento de la imagen, es decir, transformar la imagen en una forma más cruda para darle al algoritmo, utilicé 2 métodos:
- Cambiar el dominio de color de RGB a HSV y filtrado basado en el tono "rojo", saturación por encima de cierto umbral para evitar colores similares al naranja y filtrado de bajo valor para evitar 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 tienes que trabajar.
- Filtrado de ruido mediante filtrado mediano (tomando el valor de píxel mediano de todos los vecinos y reemplazando el píxel por este valor) para reducir el ruido.
- Usar Filtro de detección Canny Edge para obtener los contornos de todos los elementos después de 2 pasos anteriores.
Algoritmo: El algoritmo en sí que elegí para esta tarea fue tomado de este impresionante libro sobre extracción de características y llamado Transformada de Hough generalizada (bastante diferente de la Transformada de Hough regular). 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 el escalado 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, según 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 de gravedad, 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:
Una vez que tenga eso, una simple heurística basada en el umbral puede brindarle la ubicación del píxel central, a partir del 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 bien, si bien este enfoque funcionó en los casos básicos, faltó gravemente en algunas áreas:
- Para los propietarios de Istanbul E-pass el Museo de Madame Tussauds de Estambul 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 traslación, ya que algunas de las latas eran muy pequeñas.
- Se perdía por completo cuando había botellas en la imagen y, por alguna razón, casi siempre encontraba la botella en lugar de la lata (tal vez porque las botellas eran más grandes, por lo que tenían más píxeles y, 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, lo que terminó con un mapa de calor muy ruidoso.
- Se logró la invariancia en la traslación y la rotación, pero no en la orientación, lo que significa que no se reconoció una lata que no estaba directamente frente al objetivo de la cámara.
¿Puedes ayudarme a mejorar mi soluciones algoritmo, utilizando exclusivamente OpenCV características, para resolver el cuatro específicos problemas mencionados?
Espero que algunas personas también aprendan algo de esto, después de todo, creo que no solo las personas que hacen preguntas deberían aprender. :)
23 Respuestas
730
Un enfoque alternativo sería extraer características (puntos clave) usando el transformación de características invariante de escala (TAMIZAR) o Funciones robustas aceleradas (NAVEGAR).
Puedes encontrar un buen OpenCV
ejemplo de código en Java
, C++
y Python
en esta página: Características Homografía 2D + para encontrar un objeto conocido
Ambos algoritmos son invariantes al escalado y la rotación. Dado que trabajan con características, también puede manejar oclusión (siempre que haya suficientes puntos clave visibles).
Fuente de la imagen: ejemplo de tutorial
El procesamiento tarda unos 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 invariancia de rotación.
los papeles originales
Respondido el 25 de Septiembre de 20 a las 18:09
Estoy de acuerdo con @stacker: SIFT es una excelente opción. Es muy robusto contra las operaciones de escala y rotación. Es algo robusto contra la deformación de la perspectiva (esto se puede mejorar como sugiere el apilador: una base de datos de plantillas con diferentes vistas en perspectiva del objeto deseado). Según mi experiencia, su talón de Aquiles serían fuertes variaciones de iluminación y cálculos muy costosos. No conozco ninguna implementación de Java. Soy consciente de una implementación de OpenCV y he usado una GPU c++/Windows (SiftGPU) implementación adecuada para el rendimiento en tiempo real. - usuario1222021
Una nota de advertencia: por mucho que amo a SIFT/SURF y lo que me han hecho, están gravados por patentes. Esta podría ser un problema, dependiendo de una serie de condiciones, incluida la ubicación geográfica AFAIK. - Agos
Así que prueba ORB o FREAK de OpenCV, que no tienen problemas de patentes. ORB es mucho más rápido que SIFT. ORB es un poco pobre con variaciones de escala y luz en mi experiencia, pero pruébelo usted mismo. - Rui Marqués
¿Cómo puede aceptar esto como una respuesta? Ninguno de los descriptores de características puede diferenciar las botellas de las latas. Todos solo ven descriptores de patrones locales invariantes. Estoy de acuerdo en que SIFT, SURF, ORB, FREAK, etc. pueden ayudarlo en la combinación de funciones, pero... ¿Qué pasa con sus otras partes de la pregunta, como oclusiones, Bottle vs Can, etc. Espero que esta no sea una solución completa? ha buscado en Google su problema, probablemente el primer resultado sería solo esta respuesta. - G453
@ G453 ¡Tienes toda la razón! Probablemente estaba fascinado por el desempeño de SHIFT y olvidó que la extracción y coincidencia de características NO ERA EL PROBLEMA... - sepdek
419
Para agilizar las cosas, aprovecharía que no se te pide que busques una imagen/objeto arbitrario, sino específicamente uno con el logo de Coca-Cola. Esto es importante porque este logotipo es muy distintivo y debe tener una firma característica, invariable en escala, en el dominio de la frecuencia, particularmente en el canal rojo de RGB. Es decir, el patrón alterno de rojo a blanco a rojo encontrado por una línea de exploración horizontal (entrenada en un logotipo alineado horizontalmente) tendrá un "ritmo" distintivo a medida que pasa por el eje central del logotipo. Ese ritmo se "acelerará" o "desacelerará" en diferentes escalas y orientaciones, pero seguirá siendo proporcionalmente equivalente. Podría identificar/definir unas pocas docenas de líneas de exploración de este tipo, tanto horizontal como verticalmente a través del logotipo y varias más en diagonal, en un patrón de estrella. Llámelos "líneas de escaneo de firma".
Buscar esta firma en la imagen de destino es una simple cuestión de escanear la imagen en tiras 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 le sigue uno de los ritmos de frecuencia identificados en la sesión de entrenamiento. Una vez que se encuentra 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 identificar los límites del logotipo a partir de ahí es trivial.
Me sorprendería si este no fuera un algoritmo linealmente eficiente, o casi. Obviamente, no aborda su discriminación lata-botella, pero al menos tendrá sus logotipos.
(Actualización: para el reconocimiento de botellas, buscaría coca cola (el líquido marrón) junto al logotipo, es decir, dentro la botella. O, en el caso de una botella vacía, buscaría una tapa que siempre tendrá la misma forma básica, tamaño y distancia del logotipo y, por lo general, será todo blanco o rojo. Busque una forma elíptica de color sólido donde una gorra debe ser, en relación con el logotipo. No es infalible, por supuesto, pero su objetivo aquí debería ser encontrar el fácil las rápido.)
(Han pasado algunos años desde mis días de procesamiento de imágenes, así que mantuve esta sugerencia de alto nivel y conceptual. Creo que podría aproximarse un poco a cómo podría funcionar un ojo humano, ¡o al menos cómo funciona mi cerebro!)
contestado el 19 de mayo de 12 a las 21:05
Esa es una gran sugerencia, me gusta especialmente el hecho de que este algoritmo debería ser bastante rápido, incluso si probablemente tendrá muchos falsos negativos. Uno de mis objetivos ocultos es utilizar esta detección en tiempo real para la robótica, ¡así que podría ser un buen compromiso! - Carlos Menguy
Sí, a menudo se olvida (en un campo caracterizado por la precisión) que aproximación los algoritmos son esenciales para la mayoría de las tareas de modelado del mundo real en tiempo real. (basé mi tesis en este concepto). Guarde sus algoritmos que requieren mucho tiempo para regiones limitadas (para eliminar los falsos positivos). Y recuerda: en robótica, por lo general, no estás limitado a una sola imagen. Suponiendo un robot móvil, un algoritmo rápido puede buscar docenas de imágenes desde diferentes ángulos en menos tiempo que el que dedican los algoritmos sofisticados a uno, lo que reduce significativamente los falsos negativos. - kmote
Me gusta la idea de usar lo que equivale a un escáner de código de barras para extremadamente rápido detección de logotipos de Coca-Cola. +1! - Li Aung Yip
El problema de buscar firmas en este caso es que si giramos la lata hacia el otro lado, es decir ocultando la firma, el algoritmo fallará en detectar la lata. - karlphillip
@karlphillip: Si oculta la firma, es decir, el logotipo, entonces cualquier método basado en buscar el logo va a fallar. - Li Aung Yip
174
Problema divertido: cuando miré la imagen de tu botella pensé que también era una lata. Pero, como humano, lo que hice para notar la diferencia es que luego noté que también era una botella...
Entonces, para diferenciar las latas de las botellas, ¿qué tal simplemente escanear las botellas primero? Si encuentra uno, cubra la etiqueta antes de buscar las latas.
No es demasiado difícil de implementar si ya estás haciendo latas. El verdadero inconveniente es que duplica el tiempo de procesamiento. (Pero pensando en las aplicaciones del mundo real, vas a terminar queriendo hacer botellas de todos modos ;-)
Respondido 16 Abr '12, 06:04
Sí, también he pensado en eso, pero no tuve mucho tiempo para hacerlo. ¿Cómo reconocerías una botella, ya que su parte principal parecerá una lata escamada? También estaba pensando en buscar el tapón rojo y ver si está alineado con el centro embotellado, pero eso no parece muy sólido. - Carlos Menguy
Si hay una tapa (o anillo) roja paralela a la "Coca cola", lo más probable es que sea una botella. - lukasz madon
La fuerza de este algoritmo es que solo necesitas . plantilla para entrenar, y luego aplica todas las transformaciones para que coincida con otras latas potenciales. Estaba usando una versión binarizada y basada en contornos de esta plantilla para entrenar, por lo que la única diferencia entre la lata y la botella sería el tapón, pero me temo que traería más falsos positivos ya que el centro de gravedad estaría en algún lugar del borde. o fuera de la botella. Vale la pena darle una oportunidad, supongo. Pero eso duplicará mi tiempo de procesamiento y voy a llorar ;) - Carlos Menguy
Esencialmente, esta es una dirección razonable. Lo expresaría un poco diferente: primero encuentre todos los candidatos y luego, para cada candidato, determine si se trata de una botella, una lata o cualquier otra cosa. - MSalters
¡Realmente me gusta este enfoque! Desafortunadamente, carece de suficiente generalización, como las botellas no son los únicos falsos positivos plausibles que pueden detectarse. me he adelantado y convirtió esto en una respuesta, porque era demasiado para comentar aquí. :) - Mr Gomez
142
¿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 excepto por una región muy pequeña (es decir, el ancho en la parte superior de la lata es un poco pequeño mientras que el envoltorio de la botella tiene el mismo ancho en todas partes, pero un cambio menor, ¿verdad?)
Lo primero que me vino a la mente fue buscar el tapón rojo de la botella. Pero sigue siendo un problema, si no hay tapa para la botella, o si está parcialmente oculta (como se mencionó anteriormente).
Lo segundo que pensé fue en la transparencia de la botella. OpenCV tiene algunos trabajos para encontrar objetos transparentes en una imagen. Consulte los enlaces a continuación.
Mire esto en particular para ver con qué precisión detectan el vidrio:
Vea el resultado de su implementación:
Dicen que es la aplicación del papel. "Un marco de contorno activo geodésico para encontrar vidrio" por K. McHenry y J. Ponce, CVPR 2006.
Podría ser útil en su caso un poco, pero el problema vuelve a surgir si se llena la botella.
Así que creo que aquí puedes buscar primero el cuerpo transparente de las botellas o una región roja conectada lateralmente a dos objetos transparentes que obviamente es la botella. (Cuando funciona idealmente, una imagen de la siguiente manera).
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 diferentes problemas como en las otras soluciones.
- Funciona sólo si su botella está vacía. En ese caso, tendrás que buscar la región roja entre los dos colores negros (si el líquido de Coca Cola es negro).
- Otro problema si se cubre la parte transparente.
Pero de todos modos, si no hay ninguno de los problemas anteriores en las imágenes, esto parece ser una mejor manera.
contestado el 20 de mayo de 19 a las 16:05
+1 Pensé en esto y estaba en camino de implementar este enfoque. Sin embargo, @linker debería compartir su conjunto de imágenes para que podamos intentar hacer conjeturas más informadas. - karlphillip
sí... yo también estoy pensando que sería bueno si hubiera más imágenes. - Abid Rahman K.
Teniendo en cuenta si solo tenemos las etiquetas para botellas/latas y ninguno de los otros factores distintivos de tapa de botella o transparencia o tapa/fondo de lata - El ancho de la botella es diferente al ancho de la lata. - Conocido
¿Qué sucede si se coloca una lata frente al logotipo de la botella? - algoritmo
54
de verdad me gusta de Darren Cook y respuestas del apilador a este problema Estaba en medio de expresar mis pensamientos en un comentario sobre eso, pero creo que mi enfoque tiene demasiada forma de respuesta para no dejarlo aquí.
En resumen, ha identificado un algoritmo para determinar que un logotipo de Coca-Cola está presente en un lugar particular del espacio. Ahora está tratando de determinar, para orientaciones arbitrarias y factores de escala arbitrarios, una heurística adecuada para distinguir Coca-Cola latas de otros objetos, incluidos: botellas, vallas, anuncios y 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 pueden contiene o, a través del espacio negativo, qué características están presentes en otros productos de Coca-Cola que no están presentes en las latas. Con ese fin, la mejor respuesta 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 sin tapa, lo que daría lugar a un falso positivo. O podría ser una botella parcial con características adicionales destrozadas, lo que lleva nuevamente a una detección falsa. No hace falta decir que esto no es elegante ni efectivo para nuestros propósitos.
En este sentido, los criterios de selección de latas más correctos 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 cromado en la botella que indica si esta es 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 on detección de fuente de luz)? Si es así, +1.
- ¿Podemos determinar otras propiedades sobre el objeto que lo identifiquen como una lata, incluidos, entre otros, el sesgo topológico de la imagen del logotipo, la orientación del objeto, la yuxtaposición del objeto (por ejemplo, en una superficie plana como una mesa o en el contexto de otras latas), y la presencia de una lengüeta? Si es así, para cada uno, +1.
Entonces, su clasificación podría ser similar a la siguiente:
- Para cada coincidencia de candidatos, si se detectó la presencia de un logotipo de Coca Cola, dibuje un borde gris.
- Para cada coincidencia superior a +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 paso rápido 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 de candidatos no es la solución más robusta o efectiva para este problema e, idealmente, debe tomar las medidas adecuadas en consecuencia.
Y oye, felicidades por la publicación de Hacker News! En general, esta es una pregunta bastante buena, digna de la publicidad que recibió. :)
contestado el 23 de mayo de 17 a las 12:05
Ese es un enfoque interesante que al menos vale la pena intentarlo, realmente me gusta tu razonamiento sobre el problema: Carlos Menguy
Esto es algo de lo que estaba pensando: no descarte tipos particulares de falsos positivos. Regla en más características de lo que hace una lata de coca cola. Pero me pregunto: ¿qué haces con una lata aplastada? Quiero decir, si pisas una lata de coca cola, sigue siendo una lata de coca cola. Pero ya no tendrá la misma forma. ¿O es ese problema AI-Complete? - Ian
42
mirando la forma
Observe la forma de la parte roja de la lata/botella. Observe cómo la lata se estrecha ligeramente en la parte superior, mientras que la etiqueta de la botella está recta. Puede distinguir entre estos dos comparando el ancho de la parte roja a lo largo de la misma.
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 metal de aluminio. En situaciones suficientemente bien iluminadas, mirar la especularidad sería una forma de distinguir la etiqueta de una botella de la etiqueta de una lata.
Por lo que puedo decir, así es como un humano notaría la diferencia entre los dos tipos de etiquetas. Si las condiciones de iluminación son malas, seguramente habrá cierta incertidumbre al distinguir los dos de todos modos. En ese caso, tendría que poder detectar la presencia de la botella transparente/translúcida.
Respondido 20 Abr '12, 11:04
Me gusta la idea, pero parece que necesitarías muy buenas condiciones de iluminación. En la imagen de ejemplo donde hay lata y botella, por ejemplo, parece un poco difícil hacer la distinción. - Carlos Menguy
En su ejemplo, observe cómo la especularidad de la etiqueta de plástico es mucho más difusa que los puntos muy brillantes de la lata. Así es como puedes saberlo. - tkuzzy
Ya veo, ¿qué tipo de representación de espacio de color usaría en este caso para capturar la especularidad en su algoritmo? Esto parece bastante difícil de conseguir en RGB o HSV: Carlos Menguy
¿Qué pasaría si la fuente de luz estuviera detrás de la lata? Creo que no verías lo más destacado. - Rui Marqués
38
Por favor, eche un vistazo a Zdenek Kalal Rastreador de depredadores. Requiere algo de entrenamiento, pero puede aprender activamente cómo se ve el objeto rastreado en diferentes orientaciones y escalas, ¡y lo hace en tiempo real!
El código fuente está disponible en su sitio. Está dentro MATLAB, pero quizás ya haya una implementación de Java realizada por un miembro de la comunidad. He vuelto a implementar con éxito la parte del rastreador de TLD en C#. Si no recuerdo mal, TLD está usando Ferns como detector de puntos clave. Utilizo SURF o SIFT en su lugar (ya sugerido por @stacker) para volver a adquirir 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 una precisión muy alta.
Si está interesado en mi implementación C# del rastreador, no dude en preguntar.
Respondido el 30 de junio de 21 a las 21:06
Gracias por el enlace que parece interesante. Con respecto al entrenamiento, ¿cuál es el tamaño del conjunto de entrenamiento que sería razonable para lograr resultados razonables? Si tiene una implementación incluso en C #, ¡también sería muy útil! - Carlos Menguy
Mientras investigaba TLD, encontré a otro usuario que buscaba una implementación de C# --- ¿hay alguna razón para no poner su trabajo en Github? stackoverflow.com/questions/29436719/… - derramador
NB Años, después, el enlace ahora está muerto - j evans
36
Si no está limitado solo 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 la imagen basada en la profundidad y el color. Esto permite una separación más rápida de los objetos en la imagen. A continuación, puede utilizar la coincidencia de ICP o técnicas similares para igualar incluso la forma de la lata en lugar de solo su contorno o color y, dado que es cilíndrico, esta puede ser una opción válida para cualquier orientación si tiene un escaneo 3D anterior del objetivo. Estas técnicas a menudo son bastante rápidas, especialmente cuando se usan para un propósito tan específico que debería resolver su problema de velocidad.
También podría sugerir, no necesariamente por precisión o velocidad, sino por diversión, que 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 una precisión de hasta el 80/90%. Sin embargo, la capacitación sería un proceso un poco largo, ya que tendría que identificar manualmente la lata en cada imagen.
Respondido 20 Oct 15, 16:10
En realidad, no expliqué eso en la publicación, pero para esta tarea me dieron un conjunto de aproximadamente 30 imágenes y tuve que hacer un algoritmo que las emparejara en varias situaciones como se describe. Por supuesto, se mostraron algunas imágenes para probar el algoritmo al final. Pero me gusta la idea de los sensores Kinect, ¡y me encantaría leer más sobre el tema! - Carlos Menguy
¿Cuál sería aproximadamente el tamaño del conjunto de entrenamiento con una red neuronal para tener resultados satisfactorios? Lo bueno de este método también es que solo necesito una plantilla para que coincida con casi todo. - Carlos Menguy
Si su conjunto de imágenes está predefinido y limitado, simplemente obtenga resultados perfectos en su programa;) - sne11ius
Sí, si entreno en el conjunto de datos con el que voy a ejecutar el algoritmo, seguro que obtendré resultados perfectos :) Pero, por ejemplo, para esta tarea, el maestro probó el programa al final en un conjunto de imágenes retenidas . Me gustaría hacer algo que sea sólido y que no se ajuste demasiado a los datos de entrenamiento. - Carlos Menguy
La cantidad de conjuntos de entrenamiento varía, sin embargo, debe tener cuidado con algunas cosas: no entrene en exceso, probablemente desee un conjunto de prueba para mostrar cómo va su precisión. Además, la cantidad de conjuntos de entrenamiento dependerá de la cantidad de capas que usará. - Fantástico señor Fox
25
Detectaría rectángulos rojos: RGB -> HSV, filtro rojo -> imagen binaria, Cerrar (dilatar y luego erosionar, conocido como imclose
en matlab)
Luego mira a través de los rectángulos de mayor a menor. Los rectángulos que tienen rectángulos más pequeños en una posición/escala conocida se pueden eliminar (asumiendo que las proporciones de las botellas son constantes, el rectángulo más pequeño sería una tapa de botella).
Esto lo dejaría con rectángulos rojos, luego deberá detectar los logotipos de alguna manera para saber si son un rectángulo rojo o una lata de coca cola. ¿Como OCR, pero con un logo conocido?
Respondido 16 Abr '12, 09:04
Como esto se estaba discutiendo en DSP en el corto tiempo en que se movió, algunas botellas pueden no tener tapones;) o el tapón podría estar parcialmente oculto. - Carlos Menguy
25
Esta puede ser una idea muy ingenua (o puede que no funcione en absoluto), pero las dimensiones de todas las latas de coca cola son fijas. Por lo tanto, si la misma imagen contiene una lata y una botella, puede distinguirlas por consideraciones de tamaño (las botellas serán más grandes). Ahora, debido a la falta de profundidad (es decir, mapeo 3D a mapeo 2D), es posible que una botella parezca encogida y no haya una diferencia de tamaño. Puede recuperar alguna información de profundidad usando imágenes estereoscópicas y luego recuperar el tamaño original.
Respondido 16 Abr '12, 21:04
En realidad, no: no hay restricciones de tamaño u orientación (u orientación, pero realmente no manejé eso), por lo que puede tener una botella muy lejos en el fondo y una lata en primer plano, y la lata sería mucho más grande que la botella. - Carlos Menguy
También verifiqué que la relación entre el ancho y el alto es bastante similar para la botella y la lata, por lo que tampoco es una opción. - Carlos Menguy
La relación de la etiqueta (siendo una marca comercial) es la misma. Entonces, si la botella (más grande) está un poco más lejos en la imagen, su tamaño será exactamente el mismo que el de la lata. - pequeñoadv
Sí, exactamente por eso sugiero imágenes estéreo para recuperar la profundidad primero. Al usar imágenes estéreo, puede obtener la profundidad y luego evaluar el tamaño real agregando la información de profundidad. - Sharad
Para explicar un poco más. Supongamos que la lata está en z=0 y la botella en z=-100. Como la botella está muy atrás, parecerá más pequeña. Pero si sé que la botella está en z=-100 y la lata en z=0, entonces puedo calcular el tamaño esperado de la lata/botella si ambos se traducen a z=0. Ahora están a la misma profundidad y, por lo tanto, puedo tomar decisiones en función del tamaño. - Sharad
23
Hmm, en realidad creo que estoy en algo (Esta es como la pregunta más interesante de todas, por lo que sería una pena no seguir tratando de encontrar la respuesta "perfecta", aunque se haya encontrado una aceptable)...
Una vez que encuentre el logotipo, sus problemas estarán a la mitad. Entonces solo tienes que descubrir las diferencias entre lo que está en el logo. Además, queremos hacer el mínimo extra posible. Creo que esta es en realidad esta parte fácil...
Qué is alrededor del logo? Para una lata, podemos ver el metal, que a pesar de los efectos de la iluminación, no cambia nada en su color básico. Siempre que sepamos el ángulo de la etiqueta, podemos decir qué está directamente encima de ella, así que estamos viendo la diferencia entre estos:
Aquí, lo que está arriba y abajo del logotipo es completamente oscuro, de color uniforme. Relativamente fácil en ese sentido.
Aquí, lo que está arriba y abajo es ligero, pero sigue teniendo un color uniforme. Es totalmente plateado, y el metal totalmente plateado en realidad parece bastante raro, así como los colores plateados en general. Además, está en un deslizamiento delgado y lo suficientemente cerca del rojo que ya se identificó para que pueda rastrear su forma en toda su longitud para calcular un porcentaje de lo que se puede considerar el anillo de metal de la lata. Realmente, solo necesita una pequeña fracción de eso en cualquier parte de la lata para saber que es parte de ella, pero aún necesita encontrar un equilibrio que asegure que no es solo una botella vacía con algo de metal detrás.
Y por último, el complicado. Pero no es tan complicado, una vez que solo nos guiamos por lo que podemos ver directamente arriba (y debajo) del envoltorio rojo. Es transparente, lo que significa que mostrará todo lo que hay detrás. Eso es bueno, porque es probable que las cosas que están detrás no sean tan consistentes en color como el metal circular plateado de la lata. Puede haber muchas cosas diferentes detrás de él, lo que nos diría que es una botella vacía (o llena de líquido transparente), o un color uniforme, lo que podría significar que está lleno de líquido o que la botella está simplemente frente a un color solido. Estamos trabajando con lo que está más cerca de la parte superior e inferior, y las posibilidades de que los colores correctos estén en el lugar correcto son relativamente escasas. Sabemos que es una botella porque no tiene ese elemento visual clave de la lata, que es relativamente simple en comparación con lo que podría haber detrás de una botella.
(Ese último fue lo mejor que pude encontrar de una botella grande de coca cola vacía; curiosamente, la tapa Y el anillo son amarillos, lo que indica que probablemente no se deba confiar en el enrojecimiento de la tapa)
En la rara circunstancia de que detrás de la botella haya un tono plateado similar, incluso después de la abstracción del plástico, o si la botella se llena de algún modo con el mismo tono de líquido plateado, podemos recurrir a lo que podemos estimar aproximadamente como el forma de la plata - que como mencioné, es circular y sigue la forma de la lata. Pero aunque carezco de cierto conocimiento en el procesamiento de imágenes, eso suena lento. Mejor aún, ¿por qué no deducir esto revisando por una vez el efectos secundarios del logotipo para asegurarse de que no haya nada del mismo color plateado allí? Ah, pero ¿y si hay el mismo tono plateado detrás de una lata? Entonces, tenemos que prestar más atención a las formas, mirando de nuevo la parte superior e inferior de la lata.
Dependiendo de cuán impecable deba ser todo esto, podría ser muy lento, pero supongo que mi concepto básico es verificar primero las cosas más fáciles y cercanas. Vaya por las diferencias de color alrededor de la forma ya emparejada (que parece la parte más trivial de esto de todos modos) antes de hacer el esfuerzo de trabajar en la forma de los otros elementos. Para enumerarlo, va:
- Encuentre la atracción principal (el fondo rojo del logotipo y posiblemente el logotipo en sí mismo para orientarse, aunque en caso de que la lata esté alejada, debe concentrarse solo en el rojo)
- Verifique la forma y la orientación, una vez más a través del enrojecimiento muy distintivo
- Verifique los colores alrededor de la forma (ya que es rápido e indoloro)
- Finalmente, si es necesario, verifique que la forma de esos colores alrededor de la atracción principal tenga la redondez correcta.
En caso de que no pueda hacer esto, probablemente signifique que la parte superior e inferior de la lata están cubiertas, y las únicas cosas posibles que un humano podría haber usado para hacer una distinción confiable entre la lata y la botella es la oclusión y la reflexión. de la lata, que sería un mucho más batalla más difícil de procesar. Sin embargo, para ir aún más lejos, puede seguir el ángulo de la lata/botella para verificar si hay más rasgos similares a los de una botella, utilizando las técnicas de escaneo semitransparentes mencionadas en las otras respuestas.
Pesadillas adicionales interesantes podrían incluir una lata colocada convenientemente detrás de la botella a una distancia tal que el metal de la misma se muestra por encima y por debajo de la etiqueta, que aún fallaría siempre que esté escaneando a lo largo de todo el rojo. etiqueta, que en realidad es un problema mayor porque no está detectando una lata donde podría haberlo hecho, en lugar de considerar que en realidad está detectando una botella, incluida la lata por accidente. ¡El vaso está medio vacío, en ese caso!
Como descargo de responsabilidad, no tengo experiencia ni he pensado en el procesamiento de imágenes fuera de esta pregunta, pero es tan interesante que me hizo pensar bastante al respecto, y después de leer todas las otras respuestas, considero que esto posiblemente sea Lo más fácil y manera más eficiente de hacerlo. Personalmente, me alegro de no realmente ¡Tengo que pensar en programar esto!
EDITAR
Además, mira este dibujo que hice en MS Paint... Es absolutamente horrible y bastante incompleto, pero basándote solo en la forma y los colores, puedes adivinar lo que probablemente será. En esencia, estas son las únicas cosas que uno debe molestarse en buscar. Cuando miras esa forma tan distintiva y esa combinación de colores tan de cerca, ¿qué otra cosa podría ser? La parte que no pinté, el fondo blanco, debe considerarse "algo inconsistente". Si tuviera un fondo transparente, podría pasar por encima de casi cualquier otra imagen y aún podrías verla.
Respondido 12 Jul 14, 17:07
El tono particular de rojo es principalmente subjetivo y está fuertemente influenciado por consideraciones de iluminación y balance de blancos. Es posible que se sorprenda de cuánto pueden cambiar. Consideremos, por ejemplo, este ilusión de tablero de ajedrez. - Pulpo
Una actualización del enlace que publicó @Octopus: persci.mit.edu/gallery/checkershadow - Sombrero
Una ilusión de percepción no afecta lo que ve su cámara web, es decir, lo que obtiene su código, solo cómo un ojo humano engaña al cerebro. - DecepcionadoPorIncontableMod
18
No conozco OpenCV, pero mirando el problema lógicamente, creo que podría diferenciar entre botella y lata cambiando la imagen que está buscando, es decir, Coca Cola. Debe incorporar hasta la parte superior de la lata, ya que en el caso de la lata hay un revestimiento plateado en la parte superior de la coca cola y en el caso de la botella no habrá tal revestimiento plateado.
Pero, obviamente, este algoritmo fallará en los casos en que la parte superior de la lata esté oculta, pero en tal caso, incluso los humanos no podrán diferenciar entre los dos (si solo se ve la porción de coca cola de la botella / lata)
Respondido 19 Abr '12, 08:04
Pensé lo mismo, pero creo que el revestimiento plateado en la parte superior de la lata cambia drásticamente según el ángulo de la lata en la imagen. Puede ser una línea recta o un círculo. ¿Tal vez podría usar ambos como referencia? - Alexis Dufrenoy
17
Tengo unos años de retraso en responder a esta pregunta. Con el estado del arte llevado al límite por las CNN en los últimos 5 años, ¡no usaría OpenCV para hacer esta tarea ahora! (Sé que quería específicamente funciones de OpenCv en la pregunta) Siento que los algoritmos de detección de objetos como Faster-RCNN, YOLO, SSD, etc. resolverían este problema con un margen significativo en comparación con las características de OpenCV. Si tuviera que abordar este problema ahora (¡después de 6 años!) Definitivamente usaría Más rápido-RCNN.
respondido 16 mar '18, 04:03
OP dijo que había 30 imágenes de alta resolución, lo que probablemente no sea el mejor escenario para entrenar ConvNets. No solo son muy pocos (incluso aumentados), la parte de alta resolución destruiría ConvNets. - Kostas Mouratidis
16
Me gusta el desafío y quería dar una respuesta, que resuelve el problema, creo.
- Extraer características (puntos clave, descriptores como SIFT, SURF) del logotipo
- Haga coincidir los puntos con una imagen modelo del logotipo (usando Matcher como Brute Force)
- Estimar las coordenadas del cuerpo rígido (problema PnP - SolvePnP)
- Estimar la posición de la tapa según el cuerpo rígido
- Realice una retroproyección y calcule la posición de píxel de la imagen (ROI) de la tapa de la botella (supongo que tiene los parámetros intrínsecos de la cámara)
- Verifique con un método si la tapa está ahí o no. Si está ahí, entonces esta es la botella.
La detección de la tapa es otra cuestión. Puede ser complicado o simple. Si yo fuera usted, simplemente verificaría el histograma de color en el ROI para tomar una decisión simple.
Por favor, dé su opinión si me equivoco. Gracias.
Respondido el 24 de Septiembre de 13 a las 15:09
13
Me gusta tu pregunta, independientemente de si está fuera de tema o no: P
Un aparte interesante; Acabo de terminar una materia en mi carrera donde cubrimos robótica y visión por computadora. Nuestro proyecto para el semestre fue increíblemente similar al que describes.
Tuvimos que desarrollar un robot que usara Xbox Kinect para detectar botellas y latas de coca cola en cualquier orientación en una variedad de condiciones ambientales y de iluminación. Nuestra solución involucró el uso de un filtro de paso de banda en el canal Hue en combinación con la transformación del círculo de Hough. Pudimos restringir un poco el entorno (podíamos elegir dónde y cómo colocar el robot y el sensor Kinect); de lo contrario, usaríamos las transformaciones SIFT o SURF.
Puede leer sobre nuestro enfoque en mi publicación de blog sobre el tema :)
Respondido el 04 de enero de 13 a las 06:01
Proyecto interesante, pero solo se aplica a su configuración muy específica. - Rui Marqués
12
Aprendizaje profundo
Reúna al menos unos cientos de imágenes que contengan latas de cola, anote el cuadro delimitador a su alrededor como clases positivas, incluya botellas de cola y otros productos de cola, etiquételos como clases negativas y como objetos aleatorios.
A menos que recopile un conjunto de datos muy grande, utilice funciones de aprendizaje profundo para conjuntos de datos pequeños. Lo ideal es utilizar una combinación de máquinas de vectores de soporte (SVM) con redes neuronales profundas.
Una vez que alimenta las imágenes a un modelo de aprendizaje profundo previamente entrenado (por ejemplo, GoogleNet), en lugar de usar la capa de decisión (final) de la red neuronal para hacer clasificaciones, use los datos de las capas anteriores como características para entrenar su clasificador.
OpenCV y GoogleNet: http://docs.opencv.org/trunk/d5/de7/tutorial_dnn_googlenet.html
OpenCV y SVM: http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
Respondido el 20 de junio de 20 a las 10:06
11
Hay un montón de descriptores de color que se utilizan para reconocer objetos, el documento a continuación compara muchos de ellos. Son especialmente potentes cuando se combinan con SIFT o SURF. SURF o SIFT solos no son muy útiles en una imagen de lata de coca cola porque no reconocen muchos puntos de interés, necesita la información de color para ayudar. Utilicé BIC (Border/Interior Pixel Classification) con SURF en un proyecto y funcionó muy bien para reconocer objetos.
Descriptores de color para la recuperación de imágenes web: un estudio comparativo
Respondido el 03 de enero de 13 a las 15:01
11
Necesita un programa que aprenda y mejore la precisión de la clasificación orgánicamente a partir de la experiencia.
Sugeriré el aprendizaje profundo, con el aprendizaje profundo esto se convierte en un problema trivial.
Puedes volver a entrenar el modelo inception v3 en Tensorflow:
Cómo volver a entrenar la capa final de Inception para nuevas categorías.
En este caso, entrenará una red neuronal convolucional para clasificar un objeto como una lata de coca-cola o no.
respondido 18 mar '18, 01:03
7
Como alternativa a todas estas buenas soluciones, puede entrenar su propio clasificador y hacer que su aplicación sea resistente a los errores. Como ejemplo, puedes usar Entrenamiento Haar, proporcionando un buen número de imágenes positivas y negativas de tu target.
Puede ser útil para extraer solo latas y se puede combinar con la detección de objetos transparentes.
Respondido el 05 de diciembre de 14 a las 08:12
5
Hay un paquete de visión por computadora llamado HALCON de MVTec cuyas demostraciones podrían darte buenas ideas de algoritmos. Hay muchos ejemplos similares a su problema que podría ejecutar en modo de demostración y luego mirar los operadores en el código y ver cómo implementarlos desde los operadores OpenCV existentes.
He usado este paquete para generar rápidamente prototipos de algoritmos complejos para problemas como este y luego descubrí cómo implementarlos usando las características existentes de OpenCV. En particular, para su caso, podría intentar implementar en OpenCV la funcionalidad integrada en el operador encontrar_modelo_de_forma_escala. Algunos operadores señalan el artículo científico sobre la implementación de algoritmos que puede ayudar a descubrir cómo hacer algo similar en OpenCV.
Respondido 01 Oct 21, 09:10
HALCON es un software propietario, ¿hay algún paquete de código abierto que proporcione soluciones similares a opencv? - Shaik Ahmad
Si lo hubiera, MVTec ya estaría fuera del negocio. ¡Su software es realmente caro! - Darién Pardinas
2
Tal vez demasiados años tarde, pero sin embargo es una teoría para probar.
La relación entre el rectángulo delimitador de la región del logotipo rojo y la dimensión total de la botella/lata es diferente. En el caso de Lata, deberá ser 1:1, mientras que será diferente en el de botella (con o sin tapón). Esto debería facilitar la distinción entre los dos.
Actualización: la curvatura horizontal de la región del logotipo será diferente entre la lata y la botella debido a la diferencia de tamaño respectiva. Esto podría ser especialmente útil si su robot necesita recoger latas/botellas y usted decide el agarre en consecuencia.
Respondido 05 Feb 18, 19:02
1
Si está interesado en que sea en tiempo real, entonces lo que necesita es agregar un filtro de preprocesamiento para determinar qué se escanea con las cosas pesadas. Un buen filtro de preprocesamiento rápido y en tiempo muy real que le permitirá escanear cosas que probablemente sean una lata de coca-cola antes de pasar a cosas más dudosas es algo como esto: busque en la imagen los parches más grandes de color que son una cierta tolerancia lejos de la sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
de tu lata de coca-cola. Comience con una tolerancia de color muy estricta y avance hacia tolerancias de color más indulgentes. Luego, cuando su robot se queda sin tiempo asignado para procesar el cuadro actual, utiliza las botellas encontradas actualmente para sus propósitos. Tenga en cuenta que tendrá que ajustar los colores RGB en el sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
para hacerlos bien.
Además, esto va a parecer muy tonto, pero ¿te aseguraste de encender -oFast
optimizaciones del compilador cuando compilaste tu código C?
contestado el 12 de mayo de 17 a las 23:05
1
Lo primero que buscaría es el color, como el ROJO, al realizar la detección de ojos rojos en una imagen, hay un cierto rango de color para detectar, algunas características al respecto teniendo en cuenta el área circundante y, como la distancia que lo separa del otro ojo. es de hecho visible en la imagen.
1: La primera característica es el color y el rojo es muy dominante. Después de detectar Coca Cola Red, hay varios elementos de interés 1A: ¿Qué tan grande es esta área roja (es suficiente cantidad para hacer una determinación de una lata verdadera o no? el color de la Etiqueta - "Coca-Cola" u onda. 10B1: ¿Hay suficiente para considerar una alta probabilidad de que sea una etiqueta?
El elemento 1 es una especie de atajo: preprocesar si eso no existe en la imagen, continuar.
Entonces, si ese es el caso, puedo utilizar ese segmento de mi imagen y comenzar a mirar más lejos del área en cuestión un poco, básicamente mirar la región / los bordes circundantes ...
2: Dada la identificación del área de la imagen anterior en 1, verifique los puntos circundantes [bordes] del elemento en cuestión. A: ¿Hay lo que parece ser la parte superior o inferior de una lata, plateada? B: Una botella puede parecer transparente, pero también lo puede ser una mesa de vidrio; también hay una mesa/estante de vidrio o un área transparente; si es así, hay múltiples resultados posibles. Una botella PUEDE tener una tapa roja, puede que no, pero debe tener la forma de la tapa de la botella/tornillos roscados, o una tapa. C: Incluso si esto falla en A y B, todavía puede ser una lata - parcial. Esto es más complejo cuando es parcial porque una botella parcial / lata parcial puede verse igual, por lo que se procesa más la medición del borde de la región roja. al borde... la botella pequeña puede tener un tamaño similar...
3: Después del análisis anterior, es cuando miraría las letras y el logotipo de la ola, porque puedo orientar mi búsqueda de algunas de las letras en las palabras Como es posible que no tenga todo el texto debido a que no tiene todo el puede, la onda se alinearía en ciertos puntos con el texto (en cuanto a la distancia) para que pudiera buscar esa probabilidad y saber qué letras deberían existir en ese punto de la onda a la distancia x.
Respondido el 04 de Septiembre de 17 a las 12:09
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ algorithm image-processing opencv or haz tu propia pregunta.
Se podría decir que esta pregunta es más apropiada en dsp.stackexchange.com o stats.stackexchange.com, y ciertamente debería considerar volver a preguntar en esos sitios también. - ely
Lo primero que hay que hacer aquí es analizar el porqué los diferentes casos de falla están sucediendo. Por ejemplo, aísle ejemplos de lugares donde las botellas ganan, donde las imágenes son borrosas, etc., y realice un análisis estadístico para conocer la diferencia entre sus representaciones Hough y las que desea que detecte. Algunos buenos lugares para aprender sobre enfoques alternativos son aquí y aquí - ely
@stacker hace un buen punto. Para obtener velocidad, desea obtener funciones de cálculo económico, como histogramas de gradientes orientados. Un primer enfoque realmente ingenuo sería etiquetar manualmente un montón de rectángulos de latas en algunas imágenes de entrenamiento, y usar estos más ejemplos negativos aleatorios para entrenar un SVM o un clasificador de árbol de decisión. El entrenamiento llevará más tiempo, pero la ejecución en imágenes nuevas será mucho más rápida. Planeo escribir este método cuando tenga más tiempo libre para incluir las referencias correctas. - ely
¿Qué tal un enfoque similar a reCAPTCHA? ;) - George Duckett
¿Por qué se movió esto de dsp.stackexchange.com? Parece que ese sitio encajaría aún mejor que stackoverflow o_O - BlueRaja - Danny Pflughoeft