Búsqueda de códigos de barras burlonamente precisa, rápida y ligera a través de la segmentación semántica

¿Buscar objetos en imágenes? Con una muestra de entrenamiento y un conjunto mínimo de conocimientos sobre redes neuronales, cualquier estudiante de hoy puede obtener una solución de cierta precisión. Sin embargo, la mayoría de las redes neuronales utilizadas para resolver este problema son bastante profundas y, por lo tanto, requieren muchos datos para el entrenamiento, funcionan relativamente lentamente en la etapa de inferencia (especialmente si no hay una GPU en el dispositivo), pesan mucho y consumen mucha energía. Todo lo anterior puede ser muy crítico en ciertos casos, principalmente para aplicaciones móviles.


Los códigos de barras son objetos con una estructura bastante simple. En el curso de la investigación, pudimos, utilizando un enfoque relativamente original, buscar objetos tan simples con mucha precisión (superamos el estado de la técnica) y lo suficientemente rápido (en tiempo real en una CPU promedio). Además, nuestro detector es muy liviano y solo tiene 30,000 pesos. Hablaremos sobre los resultados de nuestra investigación en este artículo.


Pero antes de hablar sobre la solución, todavía vale la pena profundizar un poco en el área temática, y tal vez valga la pena comenzar con los códigos de barras.


¿Qué es un código de barras y por qué buscarlo?


Códigos de barras es un nombre genérico para un grupo de formatos de datos legibles por máquina. Probablemente haya escuchado sobre códigos de barras y códigos QR, estos son solo casos especiales de códigos de barras. En el mundo moderno, se pueden encontrar en boletos, en productos en tiendas, en documentos oficiales y en muchos otros lugares.



Los códigos de barras generalmente se dividen en unidimensionales, representados por un conjunto de rayas en blanco y negro, y bidimensionales, que consisten en pequeños bloques cuadrados o rectangulares. Como puede ver en la figura, en general, los distintos tipos son muy similares entre sí.


La complejidad puede estar representada por algunos tipos de códigos de barras para los que no se especifica la longitud. Dichos códigos de barras pueden ser arbitrariamente largos y al mismo tiempo muy delgados.



El ejemplo anterior es artificial, pero los códigos de barras con proporciones similares se encuentran en documentos reales, en particular en las facturas.


Y dado que estos son formatos legibles por máquina, el hardware debería reconocerlos con relativa facilidad. Sin embargo, el primer paso en el camino hacia el reconocimiento es la búsqueda, y se discutirá en este artículo.


Vale la pena señalar que los escáneres láser y muchas aplicaciones implican la participación activa de una persona: es necesario apuntar explícitamente la cámara / escáner al código de barras para que sea reconocido, en cuyo caso la necesidad de una búsqueda desaparece naturalmente. Sin embargo, en este escenario, los usuarios se ven obligados a realizar esfuerzos adicionales de su parte, lo que no es bueno. Este enfoque tampoco permite el reconocimiento de varios objetos en la imagen, limitado a solo uno.


Declaración del problema y métricas de calidad.


¿Qué nos gustaría del detector de código de barras creado?


  1. Encontrar todos los códigos de barras en la imagen es lo suficientemente preciso *
  2. Encuentra códigos de barras largos y muy estrechos
  3. En tiempo real en la CPU

* Se propone utilizar la medida f para objetos con un umbral de IoU = 0.5 como la métrica principal de precisión. También veremos la precisión, la recuperación y la tasa de detección.


Definición formal de métricas

Primero, presentamos el concepto de IoU - Intersección sobre Unión (también conocido como el Índice Jaccard). Tener verdad ( G) y predicho ( F) la máscara del objeto, IoU se calcula como el área de intersección dividida por el área de la unión.

J(G,F)= frac|G capF||G cupF|



Es fácil ver que IoU toma valores de 0 a 1. Ahora, en base a esta medida, presentamos los conceptos de precisión, recuperación, medida f y tasa de detección.


Deje que haya N objetos en la muestra. Establecemos el umbral IoU igual a un número fijo t(por ejemplo, 0,5). Para algún objeto Gy detección Fcree que si J(G,F) get, se encontró el objeto (1), de lo contrario creemos que no se encontró el objeto (0). Entonces retiro(t)definido como la proporción de objetos de muestra encontrados, precisión(t)- la proporción de detecciones correspondientes a al menos un objeto de muestra. La medida f se define de manera estándar como media armónica 2precisión(t)recuperación(t)/(precisión(t)+recuperación(t)).


Queda por entender qué es una tasa de detección. Deje que haya M imágenes con objetos en la muestra. Calculamos el IoU entre las máscaras verdaderas y pronosticadas en la imagen , de manera similar cortamos el umbral de la imagen. La tasa de detección es la fracción de imágenes por la cual el IoU total de todos los objetos verdaderos con el IoU total de todos los objetos predichos es mayor que un umbral t dado.


En estudios anteriores (sobre la detección de códigos de barras), es habitual utilizar la tasa de detección para evaluar la calidad. Sin embargo, consideremos esta situación: que haya un objeto muy grande y uno muy pequeño en la imagen, pero el detector se encontró grande y no se encontró pequeño. En este caso, la tasa de detección solo indicará un error si el umbral es muy grande. tcerca de 1. mientras recordarno será más de 0.5 para valores umbral arbitrarios t, que también hará que la medida f sea inferior a 1. Es decir, para tal ejemplo, la medida f puede indicar un error antes (en el sentido de un umbral inferior t) que la tasa de detección.


Por lo tanto, en nuestros experimentos, confiamos en la medida f y utilizamos la tasa de detección para compararla con el trabajo de años anteriores.


Inspirado en detectores de texto


Quizás el detector de objetos más famoso y popular cuando la velocidad es importante es YOLO (solo se mira una vez). También hay versiones posteriores de YOLOv2 y YOLOv3, pero en general este enfoque es bueno para objetos más o menos cuadrados, pero al encontrar objetos estrechos, pero muy alargados, este enfoque no es tan fuerte.


Así que decidimos ir por el otro lado. Como puede ver fácilmente, las líneas con texto en la imagen también son muy alargadas y estrechas, y la tarea de encontrar texto en imágenes en la comunidad científica es bastante popular (ciertamente más popular que buscar códigos de barras) y se inventaron varias arquitecturas interesantes basadas en la estructura gráfica. Nuestra decisión está motivada por solo uno de los trabajos de búsqueda de texto en los que se propone la arquitectura PixelLink.



La esencia del enfoque es la siguiente: resolvamos el problema de la segmentación de instancias de esta manera:


  1. Para cada píxel, resolveremos el problema de clasificación binaria (texto / no texto).
  2. Para cada píxel, predeciremos 8 enlaces (enlaces) con sus vecinos. La comunicación significa que este par de píxeles pertenece a un objeto (instancia).
  3. Habiendo recibido un mapa de segmentación de texto / no texto y mapas con enlaces de la imagen, armamos un gráfico en el que los vértices serán píxeles cuya clase de texto se predice y los bordes son enlaces.
  4. Encontramos componentes conectados en este gráfico.
  5. Alrededor de cada componente conectado, seleccione el rectángulo mínimo envolvente (por ejemplo, usando OpenCV), que será la detección final.

Este proceso se ilustra gráficamente, la figura está tomada del artículo original .



Este enfoque para la búsqueda de texto ofrece resultados bastante decentes comparables a los más modernos.



Volvemos ahora a los códigos de barras. Nos preguntamos: ¿realmente necesitamos estos enlaces? Después de todo, los códigos de barras, en contraste con el texto, en la gran mayoría de los casos están lejos el uno del otro. Y de hecho, de acuerdo con la especificación, muchos tipos de códigos de barras deben tener un cierto espacio para los objetos vecinos más cercanos.
En general, decidimos que no necesitábamos enlaces en particular y modificamos el enfoque de la siguiente manera:


  1. Resolvemos el problema de la segmentación semántica: para cada píxel determinamos la clase de código de barras / sin código de barras.
  2. Construimos un gráfico con vértices en píxeles para el que se determina el tipo de código de barras. Como bordes, en lugar de buscar enlaces, consideramos que hay un enlace entre cualquier par de píxeles adyacentes del tipo de código de barras.
  3. Encontramos componentes conectados en este gráfico.
  4. Alrededor de cada componente conectado, seleccione el rectángulo mínimo envolvente, que será la detección final.

Entonces, decidimos el esquema de solución general. Los párrafos 2 a 4 pueden considerarse triviales, pero analicemos exactamente cómo lidiar con la segmentación semántica.


Arquitectura de red para segmentación semántica


Un poco de historia que se usa comúnmente


En general, la segmentación semántica utilizando redes neuronales ha estado ocurriendo desde aproximadamente 2013 desde la llegada de U-Net. En U-Net, la resolución espacial se redujo primero gradualmente en el codificador, luego se incrementó gradualmente en el decodificador, también hubo saltos de conexiones de las características intermedias del codificador a las características intermedias del decodificador. Un poco más tarde, aparecieron convoluciones dilatadas (ver la figura a continuación), que produjeron una mejor calidad, pero requirieron más memoria y cálculos para el procesamiento. Bueno, al final, hubo un enfoque conocido como Deeplabv3 +, que combina ambos enfoques y es el estado del arte entre las arquitecturas de diseño humano en el momento de escribir este artículo (de hecho, gracias a Neural Architecture Search, soluciones más efectivas, por ejemplo ).


Detengámonos un poco más en la convolución dilatada, porque En la decisión final, confiaremos en sus propiedades.


La convolución normal funciona así



Mientras que la convolución dilatada se muestra a continuación (en la imagen, el factor dilatado es 2)



Puede notar que la convolución convencional es en realidad un caso especial de convolución dilatada (con factor de dilatación 1).


En general, una discusión de soluciones para la segmentación semántica es un tema para un artículo separado bastante grande, solo quería hacer un pequeño recordatorio en el que lo más importante es tratar con el dispositivo de convolución dilatada. Si eres nuevo en la segmentación semántica, aquí está la mejor revisión conocida por el autor, sin embargo, para comprender lo que sucederá a continuación, no es necesario familiarizarse con ella.


Si todo fuera tan simple ...


El requisito principal para nuestra red neuronal, además de la calidad, es la velocidad. En nuestros datos, hay códigos de barras tan pequeños en relación con el tamaño de la imagen que la resolución mínima a la que tiene sentido ejecutar una red neuronal debe ser de al menos 512x512, y preferiblemente 1024x1024. Al mismo tiempo, hay un requisito para trabajar en la CPU durante no más de 100 ms en la imagen (¡y también en un núcleo!). En términos del conjunto de requisitos para la resolución de entrada y el tiempo operativo total, la tarea no es muy trivial. Con restricciones tan severas, el uso de arquitecturas fuertes y profundas no es posible. Para ser justos, aún no hemos cumplido el requisito de 100 ms en un núcleo, pero la solución final funciona 40 ms en 4 núcleos (Intel Core i5, 3.2 GHz).


Desafortunadamente, todas las arquitecturas que conocemos para la segmentación semántica categóricamente no encajan en estas restricciones. Así que teníamos una opción: o no se sabe cómo llegar a algo completamente nuevo, o tratar de simplificar lo más posible una de las arquitecturas populares. No teníamos ideas brillantes, así que elegimos la última.


Inspirado por la red de agregación de contexto


Las convoluciones dilatadas tienen la siguiente propiedad útil: si las aplica secuencialmente con un factor dilatado que aumenta exponencialmente, el campo receptivo crecerá exponencialmente (mientras que en el caso de las convoluciones ordinarias crece linealmente).



La figura ( fuente ) muestra el aumento exponencial en el campo receptivo de la red neuronal cuando se aplica secuencialmente una convolución dilatada. (a) F1 se obtiene de F0 por convolución con dilatación = 1, campo receptivo = 3x3 para cada elemento en F1 (b) F2 se obtiene de F1 por convolución con dilatación = 2, campo receptivo = 7x7 para cada elemento en F2 (c) F3 obtenido de F2 usando convolución con dilatación = 4, campo receptivo = 15x15 para cada elemento en F3


En el artículo "Agregación de contexto de múltiples escalas por convoluciones dilatadas" basado en esta propiedad, se inventó un bloque especial (llamado por los autores del Módulo de contexto), que se utiliza para recopilar información del contexto del píxel actual. En el artículo, este bloque se usa en la parte superior de una red que ya sabe cómo resolver el problema de segmentación para refinar estas predicciones utilizando información de contexto.


Decidimos tomar este módulo de contexto, pero no lo usamos para mejorar las predicciones de un buen modelo existente, sino como la parte principal de la red de convolución, que resolverá este problema. En general, nuestra arquitectura está organizada de la siguiente manera (ver tabla):


  1. Módulo de reducción de escala: convolución inicial para extraer las características más simples y reducir la resolución.
  2. El módulo de contexto es esencialmente un conjunto de convoluciones dilatadas que aumentará rápidamente el campo receptivo, reuniendo atributos de un contexto más amplio.
  3. La capa final (convolución 1x1), que recibe un mapa de probabilidad para la segmentación semántica de código de barras / sin código de barras. Además, si queremos distinguir entre el tipo de códigos de barras detectados, también se predicen N canales (ver más abajo).


Es decir, en la arquitectura resultante, se utiliza un número pequeño constante de C = 24 canales en cada capa, las primeras 3 circunvoluciones reducen la resolución, las convoluciones posteriores (Módulo de contexto) aumentan el campo receptivo de cada elemento del mapa de características.


La tabla de hiperparámetros de arquitectura, entre otras cosas, indica si la convolución en la capa actual es separable. Las convoluciones separables teóricamente dan una aceleración del orden de k ^ 2 veces en comparación con una convolución convencional, donde k es el tamaño del filtro. En la práctica, la aceleración puede ser mucho menor (todo depende de la resolución de la imagen, el número de filtros de entrada y salida).


Inicialmente, intentamos hacer que todas las circunvoluciones fueran separables, pero esto hizo que la calidad cayera mucho. Luego decidimos hacer separables solo las 3 primeras circunvoluciones, que funcionan con resoluciones de imagen más altas y, en consecuencia, requieren más cálculos que las convoluciones posteriores. Al mismo tiempo, la calidad de tal reemplazo ya ha disminuido bastante. Total debido a la separabilidad, la red neuronal se aceleró en otro 20%.


Queda el último momento inexplicable: ¿qué significa el número N en la última capa? N es responsable de la cantidad de diferentes tipos de objetos (en nuestro caso, códigos de barras) que queremos distinguir. Si consideramos el caso más simple, cuando solo necesita encontrar objetos y no necesita determinar su tipo (esto es un código de barras y no importa qué), puede considerar N = 0. Si aún queremos distinguir entre los tipos de códigos de barras (este es un código de barras de tipo [tal y tal]), en la última capa se agregan N canales en los que se predicen las probabilidades de ser de cierto tipo. Ahora, después de haber recibido la detección en forma de rectángulo en el que se encuentra el código de barras, podemos promediar las probabilidades de las clases dentro de este rectángulo encontrado, desde el cual podemos averiguar el tipo de código de barras encontrado.


Resultados


Habiendo recibido una solución, siempre debe mirar alrededor y comparar la calidad de la solución con estudios anteriores. En general, la tarea de buscar códigos de barras no es muy popular, durante los últimos 10 años solo se publicaron 1-2 artículos por año (como saben, la forma más sencilla de superar el estado de la técnica es encontrar la tarea impopular, que al final hicimos. .). La siguiente tabla se compara con otros enfoques en dos conjuntos de datos, en uno de los cuales obtuvimos mejores resultados.



La excelencia, por supuesto, no es súper impresionante, pero aún está presente. Sin embargo, la característica principal de la solución encontrada no es exactamente, sino en velocidad, en comparación con el mismo YOLO en la misma GPU (GTX 1080), y con una resolución de imagen más alta, nuestro método funciona ~ 3.5 veces más rápido.



Además de la ventaja de velocidad, hay una ventaja en peso del modelo final. El detector tiene ~ 30 mil escalas, mientras que la gran mayoría de las redes de convolución modernas (incluso mejoradas para dispositivos móviles) tienen millones de parámetros. La solución final pesa incluso menos que LeNet, que tenía ~ 60 mil parámetros.


Conclusión


De hecho, este trabajo se basa en dos ideas simples:


  1. Detección mediante segmentación semántica.
  2. Usando una secuencia de convolución dilatada con un pequeño número de canales para el crecimiento más rápido posible del campo receptivo.

El resultado fue una arquitectura muy ligera y rápida, que sin embargo mostró resultados bastante decentes (e incluso superó a SOTA en la tarea impopular de encontrar códigos de barras). Además, la aplicación de este enfoque no se limita a los códigos de barras. Utilizamos la misma arquitectura para buscar texto, buscar tarjetas de visita y pasaportes, obteniendo buenos resultados para estas tareas.


Sin embargo, vale la pena señalar que este enfoque en esta forma tiene limitaciones. Si 2 objetos del mismo tipo se encuentran muy cerca, se unirán en uno. Quizás en la próxima serie, le diremos cómo lidiar con tal problema.


En base a los resultados de los experimentos con códigos de barras, escribimos un artículo que se presentará en ICDAR2019 en Sydney.


Literatura


  1. Un artículo con los resultados de nuestros experimentos y una gran cantidad de detalles. Detector de código de barras universal mediante segmentación semántica
  2. Un excelente artículo de revisión sobre el desarrollo de arquitecturas para la segmentación semántica. enlace
  3. PixelLink: detección de texto de escena mediante segmentación de instancias
  4. Este artículo trata sobre el uso de convolución dilatada para mejorar las predicciones mediante la recopilación de información del contexto. Contexto de agregación multiescala por convoluciones dilatadas

Grupo de Investigación de Visión por Computadora

Source: https://habr.com/ru/post/455764/


All Articles