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 las 'latas' de Coca-Cola (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 el rectángulo verde con escala y rotación.
Algunas limitaciones en el proyecto:
- El fondo puede ser muy ruidoso.
- La lata 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 la lata !
- El brillo de la imagen puede variar mucho (por lo que no puede confiar "demasiado" en la detección de color).
- La lata podría estar parcialmente oculta en los lados o en el medio y posiblemente parcialmente oculta detrás de una botella.
- No podría haber ninguna lata en la imagen, en cuyo caso no tenía que encontrar nada y escribir un mensaje que lo dijera.
Así que podrías terminar con cosas difíciles como esta (que en este caso mi algoritmo falló por completo):
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:
Lenguaje : Hecho en C ++ usando la biblioteca OpenCV .
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 el filtrado basado en el tono "rojo", la saturación por encima de cierto umbral para evitar colores naranjas y el 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 tiene que trabajar.
- Filtrado de ruido utilizando el filtrado medio (tomando el valor de píxel medio de todos los vecinos y reemplazando el píxel por este valor) para reducir el ruido.
- Uso del filtro de detección de bordes Canny para obtener los contornos de todos los elementos después de 2 pasos precedentes.
Algoritmo : el algoritmo en sí que elegí para esta tarea fue tomado de este impresionante libro sobre extracción de características y se llamó Transformación Hough Generalizada (bastante diferente de la Transformación 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 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 gravitacional, por lo que tendrás muchos votos en el mismo píxel correspondiente al centro, y verá un pico en el mapa de calor de la siguiente manera:
Una vez que tenga eso, una simple heurística basada en el umbral puede darle la ubicación del píxel central, desde el 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, carecía severamente en algunas áreas:
- ¡Es extremadamente lento ! No estoy haciendo suficiente hincapié en esto. 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 encontró 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, lo que terminó con un mapa de calor muy ruidoso.
- Se logró una variación 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 orientada al objetivo de la cámara.
¿Pueden ayudarme a mejorar mi algoritmo específico , utilizando exclusivamente las funciones de OpenCV , para resolver los cuatro problemas específicos mencionados?
Espero que algunas personas también aprendan algo de eso, después de todo, creo que no solo las personas que hacen preguntas deberían aprender. :)
fuente
Respuestas:
Un enfoque alternativo sería extraer características (puntos clave) utilizando la transformación de características invariantes de escala (SIFT) o características robustas aceleradas (SURF).
Está implementado en OpenCV 2.3.1.
Puede encontrar un buen ejemplo de código utilizando las funciones de Características2D + Homografía para encontrar un objeto conocido
Ambos algoritmos son invariables para la escala y la rotación. Dado que funcionan con funciones, también puede manejar la oclusión (siempre que haya suficientes puntos clave visibles).
Fuente de la imagen: ejemplo 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
fuente
Para acelerar las cosas, aprovecharía 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 característica, invariante de escala en el dominio de frecuencia, particularmente en el canal rojo de RGB. Es decir, el patrón alternativo 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 a través del eje central del logotipo. Ese ritmo se "acelerará" o "disminuirá" en diferentes escalas y orientaciones, pero seguirá siendo proporcionalmente equivalente. Puede identificar / definir unas pocas docenas de líneas de exploración, tanto horizontal como verticalmente a través del logotipo y varias más en diagonal, en un patrón de estallido estelar. Llame a estas "líneas de escaneo de firmas".
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 encontrada, 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 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 desde allí es trivial.
Me sorprendería si este no fuera un algoritmo linealmente eficiente, o casi. Obviamente no aborda la discriminación de la lata de botella, pero al menos tendrá sus logotipos.
(Actualización: para el reconocimiento de la botella, buscaría Coca-Cola (el líquido marrón) adyacente al logotipo, es decir, dentro de la botella. O, en el caso de una botella vacía, buscaría una tapa que siempre tenga el 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 debería estar una gorra , en relación con el logotipo. No es infalible, por supuesto, pero su objetivo aquí debería ser encontrar los sencillos los rápidos .)
(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 ligeramente a cómo podría funcionar un ojo humano, ¡o al menos cómo funciona mi cerebro!)
fuente
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 distinguir las latas y las botellas, ¿qué tal simplemente escanear las botellas primero? Si encuentra uno, oculte la etiqueta antes de buscar latas.
No es demasiado difícil de implementar si ya estás haciendo latas. El verdadero inconveniente es que duplica su tiempo de procesamiento. (Pero pensando en las aplicaciones del mundo real, terminará queriendo hacer botellas de todos modos ;-)
fuente
¿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 la envoltura de la botella es del mismo ancho en todo, pero un cambio menor, ¿verdad?)
Lo primero que me vino a la mente fue comprobar la tapa roja 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 sobre la transparencia de la botella. OpenCV tiene algunos trabajos para encontrar objetos transparentes en una imagen. Revise los siguientes enlaces.
OpenCV Meeting Notes Minutes 2012-03-19
OpenCV Meeting Notes Minutes 2012-02-28
Mire particularmente esto para ver con qué precisión detectan el vidrio:
Ver el resultado de su implementación:
Dicen que es la implementación del documento "Un marco de contorno activo geodésico para encontrar vidrio" por K. McHenry y J. Ponce, CVPR 2006 .
Puede ser útil en su caso un poco, pero el problema surge nuevamente si la botella está llena.
Entonces, creo que aquí, puede buscar primero el cuerpo transparente de las botellas o una región roja conectada a dos objetos transparentes lateralmente, que obviamente es la botella. (Cuando se trabaja 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.
Pero de todos modos, si no hay ninguno de los problemas anteriores en las imágenes, esto parece ser una mejor manera.
fuente
Realmente me gustan las respuestas de Darren Cook y Stacker a este problema. Estaba a punto de poner mis pensamientos en un comentario al respecto, pero creo que mi enfoque tiene demasiada respuesta para no salir de aquí.
En resumen, ha identificado un algoritmo para determinar que un logotipo de Coca-Cola está presente en una ubicación particular en el espacio. Ahora está tratando de determinar, por orientaciones arbitrarias y factores de escala arbitrarios, una heurística adecuada para distinguir las latas de Coca-Cola de otros objetos, incluidos: botellas , vallas publicitarias , anuncios y parafernalia de Coca-Cola, todos asociados con este logotipo icónico. No mencionó muchos de estos casos adicionales en su enunciado del problema, pero creo que son vitales para el éxito de su algoritmo.
El secreto aquí es determinar qué características visuales contiene una lata o, a través del espacio negativo, qué características están presentes para otros productos de Coca-Cola que no están presentes para las latas. Con ese fin, la respuesta principal actual esboza un enfoque básico para seleccionar "lata" si y solo si "botella" no se identifica, 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 presencia de una tapa, lo que lleva a un falso positivo. O bien, 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 es efectivo para nuestros propósitos.
Con este fin, los criterios de selección más correctos para las latas parecen ser los siguientes:
Su clasificación podría verse así:
Esto resalta visualmente al usuario lo que se detectó, enfatizando los positivos débiles que, correctamente, pueden 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 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 de candidatos no es la solución más sólida o efectiva para este problema, e idealmente, debe tomar las medidas apropiadas en consecuencia.
Y oye, ¡felicidades por la publicación de Hacker News! En general, esta es una pregunta bastante excelente, digna de la publicidad que recibió. :)
fuente
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 la misma.
Mirando lo más destacado
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 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 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, debería poder detectar la presencia de la botella transparente / translúcida.
fuente
Por favor, eche un vistazo al rastreador Predator de Zdenek Kalal . Requiere algo de entrenamiento, ¡pero puede aprender activamente cómo el objeto rastreado se ve en diferentes orientaciones y escalas y lo hace en tiempo real!
El código fuente está disponible en su sitio. Está en MATLAB , pero quizás 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 no recuerdo mal, TLD está usando Ferns como el detector de punto clave. En su lugar, uso SURF o SIFT (ya sugerido por @stacker) para volver a adquirir el objeto si el rastreador lo perdió. Los comentarios del rastreador facilitan la creación con tiempo de una lista dinámica de plantillas de exploración / navegación que con el tiempo permiten recuperar el objeto con una precisión muy alta.
Si está interesado en mi implementación de C # del rastreador, no dude en preguntar.
fuente
Si no está limitado a una cámara que no estaba en una de sus limitaciones, quizás pueda usar un sensor de alcance como el Xbox Kinect . Con esto, puede realizar una segmentación coincidente basada en profundidad y color de la imagen. Esto permite una separación más rápida de los objetos en la imagen. A continuación, puede usar la coincidencia de 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 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, podría usar una red neuronal entrenada en su imagen segmentada de tonos para identificar la forma de la lata. Estos son muy rápidos y a menudo pueden tener una precisión de hasta 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.
fuente
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 (suponiendo que las proporciones de la botella sean constantes, el rectángulo más pequeño sería una tapa de botella).
Esto te dejaría con rectángulos rojos, entonces necesitarás detectar de alguna manera los logotipos para saber si son un rectángulo rojo o una lata de coca cola. ¿Como OCR, pero con un logotipo conocido?
fuente
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. Entonces, 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 información de profundidad utilizando imágenes estéreo y luego recuperar el tamaño original.
fuente
Hmm, en realidad creo que estoy en algo (esta es la pregunta más interesante de la historia, así que sería una pena no seguir tratando de encontrar la respuesta "perfecta", a pesar de que se haya encontrado una respuesta aceptable). .
Una vez que encuentre el logotipo, sus problemas estarán a medias. Entonces solo tiene que descubrir las diferencias entre lo que hay alrededor del logotipo. Además, queremos hacer la menor cantidad adicional posible. Creo que esta es realmente esta parte fácil ...
¿Qué hay alrededor del logo? Para una lata, podemos ver el metal, que a pesar de los efectos de la iluminación, no cambia en absoluto en su color básico. Mientras sepamos el ángulo de la etiqueta, podemos saber qué hay directamente encima de ella, por lo que estamos viendo la diferencia entre estos:
Aquí, lo que está arriba y debajo del logotipo es completamente oscuro, de color consistente. Relativamente fácil a ese respecto.
Aquí, lo que está arriba y abajo es claro, pero sigue siendo de color constante. 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 ha identificado para que pueda trazar su forma en toda su longitud para calcular un porcentaje de lo que puede considerarse el anillo de metal de la lata. Realmente, solo necesita una pequeña fracción de eso en cualquier lugar a lo largo de la lata para decir que es parte de ella, pero aún necesita encontrar un equilibrio que garantice que no sea solo una botella vacía con algo de metal detrás.
Y finalmente, el complicado. Pero no es tan complicado, una vez que solo veamos lo que podemos ver directamente arriba (y debajo) del envoltorio rojo. Es transparente, lo que significa que mostrará lo que haya 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. Podría 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 consistente, lo que podría significar que está llena 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,
(esa última fue la mejor que pude encontrar de una botella de coca cola grande y vacía; curiosamente, la tapa Y el anillo son amarillos, lo que indica que probablemente no se debe confiar en el enrojecimiento de la tapa)
En la rara circunstancia de que haya un tono similar de plata detrás de la botella, incluso después de la extracción del plástico, o si la botella se llena de alguna manera 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 me falta cierto conocimiento en el procesamiento de imágenes, eso suena lento. Mejor aún, ¿por qué no deducir esto comprobando por una vez los lados del logotipo para asegurarse de que no haya nada del mismo color plateado? Ah, pero ¿y si hay el mismo tono de plata detrás de una lata? Entonces, de hecho, debemos prestar más atención a las formas, mirando de nuevo la parte superior e inferior de la lata.
Dependiendo de cuán impecable sea todo esto, puede ser muy lento, pero supongo que mi concepto básico es verificar primero las cosas más fáciles y cercanas. Ve por las diferencias de color alrededor de la forma ya emparejada (que de todos modos parece ser la parte más trivial de esto) antes de esforzarte por resolver la forma de los otros elementos. Para enumerarlo, va:
En el caso de que no pueda hacer esto, probablemente significa que la parte superior e inferior de la lata están cubiertas, y las únicas cosas posibles que un humano podría haber utilizado para distinguir de manera confiable entre la lata y la botella es la oclusión y la reflexión. de la lata, que sería una batalla mucho 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 las botellas, utilizando las técnicas de escaneo semitransparente mencionadas en las otras respuestas.
Las pesadillas adicionales interesantes podrían incluir una lata convenientemente sentada detrás de la botella a una distancia tal que el metal se muestre por encima y por debajo de la etiqueta, lo que aún fallaría mientras escanee a lo largo de todo el rojo etiqueta, que en realidad es más un problema porque no está detectando una lata donde podría haber, en lugar de considerar que realmente 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 en ello, y después de leer todas las otras respuestas, considero que esto posiblemente sea La forma más fácil y eficiente de hacerlo. En lo personal, estoy contento de que no realmente que pensar en la programación de este!
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 necesita para molestarse en escanear. Cuando miras esa forma distintiva y combinación de colores tan cercanos, ¿qué más podría ser? La parte que no pinté, el fondo blanco, debe considerarse "algo inconsistente". Si tuviera un fondo transparente, podría pasar sobre casi cualquier otra imagen y aún así podría verla.
fuente
No conozco OpenCV, pero mirando el problema lógicamente, creo que podría diferenciar entre la botella y la 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 es visible la porción de botella / lata de coca cola)
fuente
Me gusta el desafío y quería dar una respuesta, lo que resuelve el problema, creo.
La detección del límite es otro problema. Puede ser complicado o simple. Si yo fuera usted, simplemente verificaría el histograma de color en el ROI para una decisión simple.
Por favor, envíe sus comentarios si me equivoco. Gracias.
fuente
Llevo unos años tarde en responder 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 las funciones de OpenCv en la pregunta ) Creo 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 funciones de OpenCV. Si tuviera que resolver este problema ahora (¡después de 6 años!) Definitivamente usaría Faster-RCNN .
fuente
Me gusta su pregunta, independientemente de si está fuera de tema o no: P
Un interesante aparte; Acabo de completar una asignatura en mi carrera en la que cubrimos robótica y visión por computadora. Nuestro proyecto para el semestre fue increíblemente similar al que usted describe.
Tuvimos que desarrollar un robot que utilizara un Xbox Kinect para detectar botellas y latas de coca en cualquier orientación en una variedad de condiciones de iluminación y ambientales. Nuestra solución implicó el uso de un filtro de paso de banda en el canal Hue en combinación con la transformación de círculo de hough. Pudimos restringir un poco el entorno (pudimos elegir dónde y cómo colocar el robot y el sensor Kinect), de lo contrario, íbamos a utilizar las transformaciones SIFT o SURF.
Puedes leer sobre nuestro enfoque en mi blog en el tema :)
fuente
Hay un montón de descriptores de color que se utilizan para reconocer objetos, el siguiente documento compara muchos de ellos. Son especialmente potentes cuando se combinan con SIFT o SURF. SURF o SIFT por sí 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. Utilizo BIC (Border / Interior Pixel Classi fi cation) 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
fuente
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, rotúlelos como clases negativas, así como objetos aleatorios.
A menos que recopile un conjunto de datos muy grande, realice el truco de utilizar las funciones de aprendizaje profundo para un conjunto de datos pequeño. Idealmente usando una combinación de Máquinas de vectores de soporte (SVM) con redes neuronales profundas.
Una vez que alimente 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 a su clasificador.
OpenCV y Google Net: 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
fuente
Necesita un programa que aprenda y mejore la precisión de clasificación orgánicamente a partir de la experiencia.
Sugeriré el aprendizaje profundo, con el aprendizaje profundo esto se convierte en un problema trivial.
Puede volver a entrenar el modelo de inicio v3 en Tensorflow:
Cómo volver a entrenar la capa final del inicio para nuevas categorías .
En este caso, entrenará una red neuronal convolucional para clasificar un objeto como una lata de coca-cola o no.
fuente
Como alternativa a todas estas buenas soluciones, puede entrenar su propio clasificador y hacer que su aplicación sea robusta a los errores. Como ejemplo, puede usar Haar Training , que proporciona una buena cantidad de imágenes positivas y negativas de su objetivo.
Puede ser útil extraer solo latas y puede combinarse con la detección de objetos transparentes.
fuente
Hay un paquete de visión por computadora llamado HALCON de MVTec cuyas demostraciones pueden darle buenas ideas de algoritmos. Hay muchos ejemplos similares a su problema que podría ejecutar en modo de demostración y luego mirar a los operadores en el código y ver cómo implementarlos desde los operadores OpenCV existentes.
He usado este paquete para crear rápidamente prototipos de algoritmos complejos para problemas como este y luego encontrar cómo implementarlos utilizando las funciones existentes de OpenCV. En particular, para su caso, podría intentar implementar en OpenCV la funcionalidad incorporada en el operador find_scaled_shape_model . 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. Espero que esto ayude...
fuente
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 el material pesado. Un buen filtro de preprocesamiento rápido y en tiempo real que le permitirá escanear cosas que tienen más probabilidades de ser una lata de coca que 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
sqrt(pow(red,2) + pow(blue,2) + pow(green,2))
de su lata de coca-cola. Comience con una tolerancia de color muy estricta y avance hasta obtener tolerancias de color más indulgentes. Luego, cuando su robot se queda sin un tiempo asignado para procesar el marco actual, utiliza las botellas encontradas actualmente para sus propósitos. Tenga en cuenta que tendrá que ajustar los colores RGB en elsqrt(pow(red,2) + pow(blue,2) + pow(green,2))
para obtenerlos a la perfección.Además, esto parece muy tonto, pero ¿se aseguró de activar
-oFast
las optimizaciones del compilador cuando compiló su código C?fuente
Tal vez muchos años tarde, pero sin embargo, una teoría para probar.
La relación entre el rectángulo delimitador de la región del logotipo rojo y la dimensión general de la botella / lata es diferente. En el caso de Can, debe 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 su respectiva diferencia de tamaño. Esto podría ser específicamente útil si su robot necesita recoger la lata / botella, y usted decide el agarre en consecuencia.
fuente
Lo primero que buscaría es el color, como ROJO, cuando detecto los ojos rojos en una imagen; hay un cierto rango de color para detectar, algunas características al respecto considerando el área circundante y, por ejemplo, la distancia del otro ojo si 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 para hacer una determinación de una lata verdadera o no? 10 píxeles probablemente no sean suficientes), 1B: ¿Contiene El color de la etiqueta - "Coca-Cola" u ola. 1B1: ¿Hay suficiente para considerar una alta probabilidad de que sea una etiqueta?
El ítem 1 es una especie de atajo - preprocesar si eso no existe en la imagen - seguir adelante.
Entonces, si ese es el caso, entonces puedo utilizar ese segmento de mi imagen y comenzar a mirar un poco más el área en cuestión, básicamente mira la región / bordes circundantes ...
2: Dada la ID de área de imagen anterior identificada en 1, verifique los puntos circundantes [bordes] del elemento en cuestión. R: ¿Existe lo que parece ser una lata superior o inferior: plata? B: Una botella puede parecer transparente, pero también puede ser una mesa de vidrio, por lo que hay una mesa / estante de vidrio o un área transparente, de ser así, hay varias salidas posibles. Una botella PUEDE tener una tapa roja, puede que no, pero debe tener la forma de la tapa de la botella / tornillos de rosca, o una tapa. C: Incluso si esto falla A y B, todavía puede ser una lata parcial. Esto es más complejo cuando es parcial porque una botella parcial / una lata parcial puede verse igual, por lo que un poco más de procesamiento de la medición del borde de la región roja al borde ... la botella pequeña puede ser similar en tamaño ...
3: Después del análisis anterior, es cuando miraría las letras y el logotipo de la onda, porque puedo orientar mi búsqueda de algunas de las letras en las palabras, ya que es posible que no tenga todo el texto debido a que no tiene todos los puede, la onda se alinearía en ciertos puntos del texto (en lo que respecta a la distancia) para poder buscar esa probabilidad y saber qué letras deberían existir en ese punto de la onda a la distancia x.
fuente
Este es un viejo proyecto en el que trabajé. Las imágenes MAP son muy fáciles de usar con javascript. Te ofrezco el objeto, lo lees y sabes cómo usarlo. No necesitamos JQuery y otros sistemas para usar imágenes MAP.
fuente