paint-brush
Cómo automatizamos la verificación de fotos de autospor@indrivetech
6,810 lecturas
6,810 lecturas

Cómo automatizamos la verificación de fotos de autos

por inDrive.Tech9m2023/07/05
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

inDrive pide a los usuarios que tomen una foto de su automóvil todos los meses. Nuestros moderadores revisan manualmente las fotos de antes y después. El problema con el enfoque actual es que es más difícil aumentar el número de moderadores que escalar la infraestructura. Queremos dar pistas al usuario de por qué la foto proporcionada no "se ajusta a los requisitos"

People Mentioned

Mention Thumbnail
featured image - Cómo automatizamos la verificación de fotos de autos
inDrive.Tech HackerNoon profile picture

En este artículo, te contaré cómo automatizamos el proceso de verificación del vehículo del usuario. Compartiré con ustedes los componentes que usamos y cómo organizamos el proceso.


En inDrive, utilizamos una gran cantidad de contenido visual. Estamos presentes en una amplia gama de diferentes regiones marcadas por diferentes mentalidades donde se utiliza una gran cantidad de documentación diferente: pasaportes, certificados y documentos de vehículos.


Aparte de eso, hay que tratar con los propios conductores y sus vehículos.


Cuando se habla de comodidad de viaje y mejora de la calidad del servicio para nuestros usuarios, la seguridad y la eliminación de imprevistos son elementos absolutamente esenciales. Por ejemplo, cuando el coche que te detiene no es el que reservaste.


Descubrirá cómo manejamos actualmente en inDrive las verificaciones periódicas de vehículos. Una vez hecho esto, nuestros moderadores revisan manualmente las fotos de antes y después. Por supuesto, el proceso de verificación también implica otras cosas, pero aquí nos centraremos solo en este aspecto.


El problema con el enfoque actual es que es más difícil aumentar el número de moderadores que escalar la infraestructura. Especialmente cuando se trata de tratar los datos personales de los usuarios.

Acerca de la tarea en cuestión

Pongamos el problema de manera muy simple, como si fuera un niño: tenemos dos fotos de un automóvil, ¿son ambas del mismo automóvil? Obviamente, cualquiera podría manejar esta pregunta, pero las cosas se vuelven mucho más complicadas una vez que agregamos un criterio de comparación.


Por ejemplo, asegurarse de que no sea una captura de pantalla de un teléfono celular o que los números de matrícula coincidan perfectamente.



Globalmente, este problema se puede resolver de varias formas: Utilizando modelos E2E y conjuntos de estos modelos.


El modelo E2E implica la participación de un modelo grande (muy probablemente una red neuronal) que puede responder a nuestras preguntas en función de un par de imágenes, como "¿Es el mismo vehículo en la foto o no?", "¿Coinciden los números de matrícula?" arriba o no?”, etc.


El problema con tales modelos es que requieren una gran cantidad de datos para aprender y que no comprenden por qué la respuesta es la que es.


Por ejemplo, si entrenamos a un modelo para que responda "sí"/"no" en función de un par de fotos, ya no es posible averiguar los motivos de la respuesta.


Entonces los usuarios no podrán entender lo que queremos de ellos y tendremos que traer moderadores.


Este enfoque de extremo a extremo no nos conviene. Queremos dar pistas al usuario sobre por qué la foto proporcionada no "se ajusta a la factura": "Es mejor tomar la foto en un lugar bien iluminado", "Parece que no vemos el automóvil completo en la imagen", o "El número de matrícula no coincide con la información proporcionada".

Calidad del modelo y base

Para nosotros es muy importante que el modelo no responda "sí" cuando hay diferentes vehículos. Llamemos a esta métrica "FPR" (tasa de falsos positivos) y usémosla para mostrar el porcentaje de respuestas "sí" frente a todos los ejemplos negativos (donde los vehículos no coinciden).


Ahora, introduzcamos otra métrica, TPR, para medir la proporción de respuestas "sí" a todas las respuestas afirmativas.


Básicamente, estas dos métricas ya son suficientes para describir nuestra tarea al optimizar el modelo: minimizar el FPR y garantizar que el TPR no se degrade demasiado.


Adoptamos el enfoque de conjunto de modelos. Por lo tanto, podemos agregar todas nuestras ideas al esqueleto de la solución terminada (este esqueleto se denominará "línea de base"). Exploremos cómo se ve y dividámoslo en partes.



De hecho, consta de varios modelos que procesan de forma independiente dos imágenes en la entrada, y dan a la salida la matrícula del vehículo y su vector. Como resultado, en función de los detalles comparados, se toma una decisión de verificación sobre las dos fotos que se revisan.


Este es el esqueleto del algoritmo que usamos para agregar muchos otros modelos, colocándolos en diferentes nodos de nuestro modelo. Por ejemplo, al evaluar la calidad de una foto, su claridad, luz y niveles de saturación.


A veces, necesitamos detectar intentos de enviar fotos que no son genuinas. Para hacer esto, agregamos un preprocesador que verifica la foto en busca de ataques de suplantación de identidad.


Cuando se utiliza un enfoque de este tipo, es crucial tener ciclos de iteración de productos claros y generar un buen conjunto de datos de prueba. Agregamos un nuevo modelo para evaluar estos dos factores, "¿Resuelve el problema asignado?" y “¿Cuánto modifica las métricas de la solución anterior?”


Ahora hablemos de los componentes básicos de la solución.

La detección y la segmentación son todo lo que necesita

Pasemos a echar un vistazo a la terminología. A continuación, explicaré el significado de términos como "cuadro delimitador" y "máscara de segmentación".


Un cuadro delimitador es una forma rectangular que se utiliza para encerrar un objeto de interés específico. Por ejemplo, si queremos identificar la cara del gato, definiríamos un cuadro delimitador delineándolo en rojo. Se define por las coordenadas de sus puntos inferior izquierdo y superior derecho dentro de la imagen.


La segmentación se refiere a la tarea de asignar una etiqueta de clase a cada píxel individual en una imagen de entrada. En el contexto de nuestra discusión, aislamos al gato segmentándolo del fondo.



En nuestro modelo, el fondo del vehículo no nos interesa porque no proporciona información relevante para dar forma a nuestra solución objetivo. Pero eso no significa que no tengamos ideas sobre cómo mejorar nuestros modelos usando fondos.


Para abordar el desafío de separar los vehículos del fondo, tomaremos un modelo de la familia YOLO (You Only Look Once) y lo entrenaremos para segmentar imágenes de automóviles. El problema aquí es que tenemos una gran cantidad de fotos de usuarios con más de un automóvil en la imagen.


Para superar este problema, podemos emplear el siguiente enfoque:


  • Calcule la distancia entre el centro de masa del cuadro delimitador y el centro de la foto.


  • Determine el tamaño del cuadro delimitador.


  • Ordene los cuadros delimitadores en orden ascendente según la distancia desde el centro y en orden descendente según el tamaño del cuadro.


  • Seleccione el primer objeto en la lista ordenada. En consecuencia, obtenemos el cuadro delimitador que está más cerca del centro de la imagen y es el más grande.


Genial, tenemos nuestra primera entrada.



El siguiente paso es encontrar el número de placa del vehículo. En casi todos los países, la matrícula se encuentra en la parte delantera. Esos casos raros en los que las placas de matrícula de los vehículos están ubicadas en lugares inusuales están fuera del alcance de este artículo.


El enfoque más común para establecer el número de matrícula es detectar el cuadro delimitador y aplicar OCR al parche resultante.


Pero como han demostrado nuestros experimentos, el OCR es mucho menos eficaz (y lleva más tiempo en algunos modelos) si la matrícula del vehículo no está paralela al horizonte.


Esto es especialmente relevante para nuestros datos, donde les pedimos a los conductores que tomen fotos en ángulo.



La solución que decidimos fue segmentar el número y luego suavizar la línea de contorno obtenida. En nuestro caso, la tarea de segmentación se abordó de manera similar a como se segmentan los vehículos, con el siguiente resultado:



A continuación, dibujamos una línea de contorno usando la máscara y aplicamos ConvexHull para suavizarla. Este sencillo algoritmo suaviza (endereza) las concavidades de nuestra línea de contorno, haciéndola más recta. Esto se puede describir como un número menor de ángulos en un polígono de contorno.


En un mundo ideal, esta operación nos daría un rectángulo definido por cuatro puntos.



Una vez que hayamos alineado los bordes, repetimos el mismo ejercicio con la perspectiva, para que el número de registro quede suave, bien presentado y claramente visible. Este enfoque es especialmente útil cuando se fotografía un automóvil en un ángulo en el que la matrícula apenas se ve.


¿Qué es una corrección de perspectiva? Recuerdo de mi clase de álgebra cómo funciona una matriz de rotación. Si toma un cuadrado en el sistema de coordenadas cartesianas y multiplica cada coordenada por una matriz de rotación de 30 grados, entonces su cuadrado en el nuevo sistema de coordenadas girará 30 grados.



Aquí, nos enfrentamos a una tarea similar: tomemos la línea de contorno y movamos todos los puntos al nuevo sistema de coordenadas. El problema es encontrar una matriz de transformación adecuada.


Todos estos algoritmos ya están bien establecidos, por lo que lo único que tenemos que hacer es asegurarnos de que estén configurados correctamente para la tarea en cuestión.



El resultado fue genial. Esto aumentó la TPR en casi 15 puntos porcentuales. A continuación, aplicamos un software de OCR liviano y de alta calidad, como la arquitectura PARSeq.

Codificador de coche

A partir de ahora, esta es la última tecnología de redes neuronales para procesar fotos de vehículos. Las incrustaciones son una técnica ampliamente adoptada en varios campos de aprendizaje automático, incluidas la búsqueda, las recomendaciones y la compresión de datos.


En el contexto de nuestra tarea, las incrustaciones se emplean para evaluar la similitud entre vehículos.


Veamos un ejemplo en el que tomé una foto de mi automóvil primero desde el lado derecho y luego desde el lado izquierdo. Ahora, puedo calcular las incorporaciones (vectores) para estas imágenes, y si estos vectores están cerca en el espacio, esto indica que es el mismo vehículo.


Pero las incrustaciones brindan otra propiedad útil que se puede usar en el producto: si su modelo de incrustación funciona bien, puede realizar una búsqueda de lo más cercano entre las muestras de incrustación. Por ejemplo, para encontrar vehículos no únicos en el sistema.


Al entrenar nuestro modelo de incrustaciones con datos de inDrive, tomamos precauciones meticulosas. Eliminamos diligentemente cualquier dato personal de las fotos y nos aseguramos de que el conjunto de datos se normalizara, abarcando imágenes de todos los países en los que operamos y con diferentes niveles de calidad.


Este enfoque tiene como objetivo evitar la discriminación contra las personas que pueden no tener acceso a teléfonos inteligentes costosos para capturar fotos de alta calidad.


En consecuencia, se obtuvo un conjunto de datos agrupados por marca y modelo de vehículo. Después de realizar varios experimentos, nos dimos cuenta de que tendríamos que prescindir de comparar los colores de los vehículos por el momento.


Al seleccionar la arquitectura para nuestro modelo, buscamos una columna vertebral que logre un equilibrio entre el rendimiento y la eficiencia computacional. Era crucial evitar el uso de una red troncal excesivamente grande, ya que podría ralentizar significativamente el tiempo de ejecución de la línea de base.


Después de una cuidadosa consideración, optamos por la arquitectura de red troncal de la red troncal, complementada con la utilización de la pérdida de margen angular aditivo para fines de aprendizaje automático.


El objetivo de nuestro modelo es aprender representaciones vectoriales donde los vehículos de la misma marca y modelo, como todos los Audi A4, se colocan muy juntos en el espacio vectorial.


Por el contrario, los Audi A5 estarían algo más alejados de los Audi A4, pero aún más cerca en comparación con, por ejemplo, un Toyota Camry.


Ahora, profundicemos en algunos ejemplos de comparaciones de vehículos:



En la parte superior tenemos dos coches idénticos, mientras que en la parte inferior tenemos dos diferentes. Repasemos las puntuaciones de similitud: el par superior tiene una puntuación de 0,989, mientras que el par inferior tiene una puntuación de 0,697. Al establecer un valor de umbral de 0,98, podemos clasificar los vehículos como idénticos.


Sin embargo, es importante tener en cuenta que nuestro modelo aún no funciona a la perfección. Tenemos un sesgo en el factor en cuestión:




El modelo produce un resultado de 0.751, mientras que idealmente queremos un valor cercano a cero para diferentes vehículos.


El principal problema aquí surge de entrenar nuestro modelo en conjuntos de datos enfocados principalmente en modelos y marcas de vehículos. En consecuencia, el modelo se hizo competente para distinguir entre diferentes vehículos, pero tiene dificultades para evaluar las diferencias dentro de las clases de vehículos.


El segundo problema con el que nos hemos encontrado es que el vehículo puede mostrarse en diferentes ángulos, lo que afecta negativamente a la calidad de nuestras incrustaciones debido al conjunto de datos limitado.


Como primer paso, en el lado del cliente, agregamos máscaras y le indicamos al conductor cómo tomar una foto de su automóvil. El segundo paso será detectar diferentes partes del vehículo para posicionarlo en el espacio y estimar su rotación.



Aquí se pueden desarrollar muchas heurísticas para elegir el ángulo de rotación correcto. Y lo más importante, estos modelos se pueden reutilizar posteriormente para evaluar el estado del vehículo. Pero esa es una historia para otro momento.


Publicado por Ilya Kaftanov .