Una red neuronal puede identificar a un gato en una fotografía, encontrar un sofá, mejorar la grabación de video, dibujar una imagen de cachorros o un simple boceto. Ya estamos acostumbrados. Las noticias sobre redes neuronales aparecen casi todos los días y se han convertido en un lugar común. Las compañías de Grid Dynamics establecen la tarea no ordinaria, sino difícil: enseñar a la red neuronal a encontrar un tornillo o perno específico en un gran catálogo de una tienda en línea a partir de una fotografía. La tarea es más difícil que encontrar un gato.

El problema de la tienda en línea de tornillos está en stock. Miles o decenas de miles de modelos. Cada tornillo tiene su propia descripción y características, por lo que no hay esperanza para los filtros. Que hacer ¿Buscar manualmente o buscar en el hipermercado en los estantes? En ambos casos, es una pérdida de tiempo. Como resultado, el cliente se cansa y va a clavar un clavo. Para ayudarlo, utilizaremos una red neuronal. Si puede encontrar sellos o sofás, entonces déjala hacer algo útil: recoge tornillos y pernos. En la transcripción del informe de
Maria Matskevichus , quien en
Grid Dynamics se dedica al análisis de datos y al aprendizaje automático, le diremos cómo enseñar a una red neuronal a seleccionar tornillos de forma rápida y precisa para un usuario.
Una breve demostración de lo que sucedió. Problemas del comprador
Imagínese: compramos una mesa, pero se perdió un tornillo pequeño y no se puede ensamblar una mesa sin él. Vamos a la tienda en línea en busca, y vemos 15,000 posiciones únicas, cada una de las cuales es posiblemente nuestro tornillo.
Vamos a los filtros: hay aproximadamente 10 de ellos, cada uno de los cuales tiene de 5 a 100 atributos. Elija el tipo de sombrero y color: sombrero plano - Cobre plano y amarillo - Latón. Recibimos el problema.

Que es esto No estábamos buscando esto. ¡Despida a la persona responsable de la extradición!
Después de un tiempo, seleccionamos 2 tornillos de mesa adecuados.

Lo más simple que queda es descifrar la descripción y las características. Cada fabricante describe los tornillos a su manera. No hay requisitos específicos para describir los parámetros de un modelo en particular.
Todo lo que crea dificultades para el cliente. Tiempo perdido, nervios y mano de obra de soporte técnico, lo que ayuda al cliente a encontrar el modelo deseado. Al darse cuenta de estos problemas del comprador, nuestro cliente, una gran empresa estadounidense, decidió proporcionar al cliente una búsqueda rápida, precisa y simple por foto, en lugar de una búsqueda semántica lenta y no siempre exitosa.

Dificultades de implementación
Asumimos la tarea y nos dimos cuenta de que hay varios problemas.
Los tornillos se parecen. Mira las fotos.

Estos son diferentes tornillos. Si voltea las fotos, puede ver que la característica importante es diferente: la cabeza.

¿Y en esta foto?

Aquí los modelos son iguales. La iluminación es diferente, pero en ambas fotos hay un modelo de tornillo.
Hay especies raras que requieren clasificación. Por ejemplo, con "orejas" o un anillo.
Requisitos mínimos para usar la aplicación. El usuario puede cargar una foto con cualquier fondo, con objetos extraños, con sombras, con poca iluminación, y la aplicación debe dar el resultado. Un tornillo o perno sobre un fondo blanco es una rareza.
La aplicación debería funcionar en tiempo real. El usuario está esperando el resultado aquí y ahora.
Competidores Recientemente Amazon, un competidor de nuestro cliente, lanzó su
Buscador de piezas . Esta es una aplicación que busca tornillos y pernos de una fotografía.

Además de Amazona, teníamos dos competidores nuevos con sus propias soluciones para el cliente. Necesitábamos vencer no solo a Amazon, sino también a las startups, lo que no fue difícil. Uno de los competidores sugirió la idea de usar los 20 tornillos más populares y la
detección de objetos de entrenamiento. Pero ante la pregunta de qué sucederá cuando las redes neuronales den 100, 1000 o los 15 000 tornillos del sitio del cliente, cómo funcionará la detección de objetos y dónde obtener tanta información, el competidor no encontró qué responder.
Solución
Debe ser escalable y no depender de la cantidad de variedades de tornillos y el tamaño del catálogo. Para resolver el problema, decidimos considerar un tornillo como un conjunto de características o atributos. Cada atributo es un conjunto de atributos.

Seleccionó las siguientes características:
- sombrero - cabeza (32 atributos);
- revestimiento externo - acabado (15 atributos);
- punta - punta (12 atributos);
- cobertura de hilo - cobertura de hilo (4 atributos).
Examinamos el mapa de todos los signos y nos dimos cuenta de que para describir 15,000 tornillos diferentes, solo necesitan 50. Formarán una combinación de diferentes signos con diferentes atributos. Se necesitan 50 tornillos y una moneda para medir la escala del tornillo en la foto.
Entonces ellos decidieron. Nos decidimos por la idea. Se requieren más datos.
Datos
Recibimos datos del cliente y estábamos un poco molestos. Datos del catálogo: fotografías de objetos sobre un fondo blanco.

Pero no se corresponden exactamente con los datos que procesará la aplicación. El usuario querrá usar cualquier fondo, tomará fotos en la palma de su mano o sujetará un tornillo con los dedos. Los datos sobre los que se entrena la red no coincidirán con la imagen real.
Luego decidimos seguir los consejos de
Richard Soker .
En lugar de un mes aprendiendo el método de enseñanza sin un maestro, es más fácil tomar una semana, marcar los datos y capacitar al clasificador.
Así que lo hicimos: imprimimos muchos fondos de colores en la impresora, compramos estos 50 tornillos y fotografiamos los datos de capacitación sobre los fondos. Entonces obtuvimos todas las opciones posibles para las superficies de mesas y alfombras.

Después de recopilar los datos, el siguiente paso es comprender en qué parte de la imagen se encuentra el perno, si es que lo hace.
Localización
Examinamos dos enfoques para la localización:
detección de objetos y
segmentación semántica .
La detección de objetos devuelve el cuadro del área mínima alrededor del objeto.
La segmentación semántica devuelve la máscara. En nuestro caso, la máscara es más adecuada. Conserva su forma, elimina el fondo, el exceso de sombras y le permite clasificar mejor los tornillos mejor que la detección de objetos.

La tarea de la segmentación semántica es devolver la probabilidad de pertenecer a una clase para cada píxel. Para entrenar tal modelo, se requieren datos etiquetados. Utilizamos la aplicación
"labelme" , con la que marcamos la muestra. Tenemos alrededor de mil máscaras con una moneda y un tornillo.

Modelo
Tomamos
U-Net . Esta red es muy aficionada a Kaggle, y nosotros también.

U-Net es una implementación exitosa de codificador-decodificador.
- Una ruta de construcción o codificador . Esta es la parte de U-Net, que está tratando de representar todo el conjunto de datos, presente como una representación vectorial en un espacio más comprimido. Ella aprende estos signos y encuentra los más significativos.
- Un camino o decodificador en expansión . Intenta decodificar un mapa de características y comprender dónde está el objeto en la imagen.
Nos decidimos por el modelo. Ahora seleccionamos la función de pérdida, cuyo valor minimizaremos en el proceso de aprendizaje.
Función de pérdida
La opción clásica para la segmentación es el
coeficiente de dados :
Esta es la media armónica entre precisión y recuperación. La media armónica significa que sopesamos igualmente el error del primer tipo y el error del segundo tipo. Nuestros datos no están equilibrados, y esto no es muy adecuado para nosotros.

Siempre hay mucho fondo y el objeto en sí no es suficiente. Por lo tanto, el modelo siempre ofrecerá una precisión muy alta y un retiro muy bajo. Para sopesar los errores del primer y segundo tipo de diferentes maneras, decidimos tomar el
índice de Tversky :
$$ display $$ S (P, G, α, β) = \ frac {| P \ cdot G |} {| P \ cdot G | + α | P / G | + β | G / P |} $$ mostrar $$
El índice de Tversky tiene dos coeficientes, α y β, pesan los dos errores de manera diferente. Si tomamos α = β = 0.5, obtenemos el mismo coeficiente de dados. Si seleccionamos otros parámetros, obtenemos el
índice Jaccard , una de las medidas de similitud de objetos. Para α = β = 1 - el índice de Tversky es igual al índice de Jaccard.
También puede obtener la puntuación Fβ. Para α + β = 1, el índice de Tversky corresponde a la puntuación Fβ.
Para seleccionar α y β, realizamos varios experimentos. Ellos plantearon la hipótesis de que el
modelo sería multado más por los errores del segundo tipo . No es tan malo cuando un modelo clasifica un píxel de fondo como un píxel de objeto. Si hay un pequeño marco de fondo alrededor del objeto, esto es normal. Pero cuando el modelo clasifica un píxel de tornillo como un píxel de fondo: aparecen agujeros en el tornillo, se vuelve irregular y esto interfiere con nuestra clasificación.
Por lo tanto, decidimos aumentar el parámetro β y acercarlo a 1, y el parámetro α a 0.

La imagen muestra que la mejor máscara se obtuvo con β = 0.7 y α = 0.3. Decidimos detenernos en esto y entrenar el modelo en todos nuestros datos.
Entrenamiento
La estrategia de aprendizaje es bastante complicada. Dado que marcamos manualmente los datos en tiempo personal, decidimos usar una función de U-Net. Segmenta cada nueva clase en un nuevo canal: agrega un nuevo canal y un objeto se localiza en él.
Por lo tanto, en nuestro entrenamiento no había una sola imagen que contuviera tanto una moneda como un perno. Todas las imágenes contenían una clase: 10% - monedas, 90% - tornillos.

Esto permitió distribuir correctamente los esfuerzos y ahorrar tiempo en una moneda, es una, pero la forma es simple. Aprendimos fácilmente a segmentarlo, lo que nos permitió transferir el 90% de nuestros esfuerzos a los tornillos. Tienen diferentes formas y colores, y es importante aprender a segmentarlos.
Nuestra red ha aprendido a segmentar incluso aquellas instancias que no estaban en nuestra muestra. Por ejemplo, los pernos de una forma inusual estaban ausentes, pero el modelo también los segmentaba bien. Aprendió a generalizar los signos de tornillos y pernos y usar esto para obtener nuevos datos, lo cual es genial.

Clasificación
Esta es la siguiente etapa después de la localización del objeto. Pocas personas entrenan redes neuronales convolucionales para clasificar objetos; a menudo usan el
aprendizaje de transferencia . Veamos la arquitectura de una red neuronal convolucional, y luego recordemos brevemente qué es el aprendizaje de transferencia.

En las primeras capas, la red aprende a reconocer límites y ángulos. Más tarde reconoce formas simples: rectángulos, círculos, cuadrados. Cuanto más cerca de la cima, más reconoce los rasgos característicos de los datos en los que está entrenado. En la parte superior, el modelo reconoce las clases.
La mayoría de los objetos del mundo consisten en formas simples y tienen características comunes. Puede formar parte de una red que está capacitada en una gran cantidad de datos y utilizar estos atributos para nuestra clasificación. La red se capacitará en un pequeño conjunto de datos sin el gran gasto de recursos. Esto es lo que hicimos.

Una vez que haya decidido sobre la tecnología general del aprendizaje de transferencia, debe seleccionar un modelo pre-entrenado.
Selección de modelo
Nuestra aplicación funciona en tiempo real. El modelo debe ser ligero y móvil; debe tener pocos parámetros, pero ser preciso. Para tener en cuenta estos dos factores, sacrificamos un poco de precisión en favor de la ligereza. Por lo tanto, elegimos no el modelo más preciso, sino liviano:
Xception .

En Xception, en lugar de la convolución habitual -
Convolución - Se usa
convolución separable . Por lo tanto, Xception es más ligero que otras redes, por ejemplo, con VGG.

La convolución ordinaria hace tanto la convolución intercanal como la interdimensional. Y acciones de convolución separable: primero, convolución interdimensional -
Profundamente , y luego entre
canales . Los resultados se combinan.
Xception ejecuta una convolución separable, mientras que produce el mismo buen resultado que la convolución ordinaria, pero hay menos parámetros.

Sustituimos los valores en las fórmulas para calcular los parámetros, por ejemplo, para 16 filtros. Para la convolución ordinaria, debe calcular los parámetros 7 veces más que para la convolución separable. Debido a esto, Xception es más preciso y menos.

Entrenamiento
Primero, decidimos construir una línea de base y capacitamos al modelo en la imagen original. Teníamos 4 clasificadores y cada uno era responsable de un atributo específico. El resultado fue insatisfactorio.

Luego entrenaron al modelo en la caja, que devolvió la detección de objetos. Obtuve un buen aumento en la precisión de la cobertura de subprocesos. Pero para el resto de los clasificadores, el resultado también es insatisfactorio.

Luego decidieron dar a los clasificadores solo la parte del tornillo que desean y clasificarán. La cabeza solo da sombreros, Consejo, solo una punta de lanza. Para hacer esto, tomamos máscaras, obtuvimos un contorno alrededor del cual se encerró un rectángulo del área mínima y calculamos el ángulo de rotación.

En este momento, todavía no sabemos de qué lado está la punta del tornillo y la punta. Para averiguarlo, cortaron la caja por la mitad y miraron la plaza.

El área que contiene la cabeza siempre es más grande que el área que contiene la punta. Comparando el área, determinamos en qué parte, qué parte del tornillo. Funcionó, pero no para todos los casos.

Cuando la longitud del tornillo es comparable al diámetro de la tapa, en lugar de un rectángulo, se obtiene un cuadrado. Cuando lo giramos, obtenemos una imagen, como en el número 3. El modelo no clasifica bien esta opción.
Luego tomamos todos los tornillos largos, calculamos los ángulos de rotación para ellos y construimos la
red neuronal superficial
Rotation Net , que toma el tornillo y predice el ángulo de rotación.

Luego, este modelo auxiliar se usó para pequeños tornillos y pernos cortos. Obtuvimos un buen resultado: todo funciona, los tornillos pequeños también giran. En esta etapa, el error se reduce prácticamente a cero. Tomamos estos datos, capacitamos a los clasificadores y vimos que para cada uno de los clasificadores, excepto Finish, la precisión aumentó significativamente. Esto es genial, trabajamos más.

Pero por alguna razón, Finish no despegó. Estudiamos los errores y vimos la imagen.

El mismo par de tornillos bajo diferentes condiciones de iluminación y diferentes configuraciones de cámara difieren en color. Esto puede confundir no solo al modelo, sino también a la persona. El gris puede volverse rosado, el amarillo puede volverse anaranjado. Recordemos el vestido azul dorado: la misma historia. La superficie reflectante del tornillo es engañosa.
Estudiamos casos similares en Internet y encontramos científicos chinos que intentaron clasificar los automóviles por colores y
enfrentaron el mismo problema para los automóviles.

Como solución, los científicos chinos han creado una red poco profunda. Su característica está en dos ramas que se concatenan al final. Esta arquitectura se llama
ColorNet .

Implementamos una solución para nuestra tarea, y obtuvimos un aumento en la precisión de casi 2 veces. Con tales resultados y modelos, puede trabajar y buscar el mismo tornillo de la tabla en el catálogo de la tienda en línea.

Teníamos solo 4 clasificadores para 4 atributos, y hay muchos otros. Por lo tanto, debe crear algún tipo de filtro que tome los datos del catálogo y los filtre de cierta manera.
Filtrado
Cada clasificador devuelve una etiqueta suave y una clase. Tomamos los valores de las etiquetas blandas y nuestra base de datos, contamos algunos
puntajes , multiplicando todas las etiquetas para cada función.

El puntaje muestra la confianza de todos los clasificadores de que esta combinación de características probablemente aparecerá. Cuanto más alto sea el puntaje, más probable es que el tornillo del catálogo y el tornillo de la imagen sean similares.
Tubería
Resultó tal aplicación.

- Entrada : comience con una imagen en bruto.
- Localización : determine dónde se encuentra el perno o tornillo y dónde está la moneda.
- Transformación y rotación .
- Clasificación : recortamos cuidadosamente todo, clasificamos y determinamos el tamaño.
- Filtrado
- Salir a una posición específica de SKU.
Cómo implementar un proyecto complejo
Come el elefante en partes . Divide el gran problema en partes.
Etiquete los datos que reflejarán la realidad. No tenga miedo al marcado de datos: esta es la forma más segura, que garantizará la máxima calidad del modelo rápidamente. Los métodos de síntesis de datos generalmente producen peores resultados que el uso de datos reales.
Pruébalo Antes de construir muchos modelos, tomamos pequeños fragmentos de datos, los etiquetamos con nuestras manos y probamos el funcionamiento de cada hipótesis. Solo después de eso entrenaron U-Net, clasificadores, Rotación.
No reinventar la rueda . A menudo, el problema que enfrenta ya tiene una solución. Mire en Internet, lea artículos, ¡asegúrese de encontrar algo!
La historia sobre nuestra aplicación Visual Search no solo trata sobre la clasificación de tornillos. Se trata de cómo hacer un proyecto complejo, que no tiene análogos, pero incluso si los hay, no cumplen con los requisitos que establecemos para la aplicación.
Para obtener más información sobre los proyectos de Grid Dynamics y otros desafíos que enfrenta el equipo de Data Science, consulte el
blog de tecnología de la compañía.
Informes con ese sesgo, el uso de algoritmos de aprendizaje automático en proyectos reales no estándar, solo estamos buscando UseData Conf . Aquí hay más información sobre las áreas que más nos interesan.
Envíe aplicaciones si sabe cómo bromear con los modelos para que vuelen. Si sabe que la convergencia no garantiza la velocidad y está listo para decirle a qué es más importante prestarle atención, lo estamos esperando el 16 de septiembre.