Dans cet article, je vais vous expliquer comment nous automatisons le processus de vérification du véhicule de l'utilisateur. Je vais partager avec vous les composants que nous utilisons et comment nous organisons le processus.
Chez inDrive, nous utilisons beaucoup de contenu visuel. Nous sommes présents dans un large éventail de régions différentes marquées par des mentalités différentes où une abondance de documents différents est utilisée : passeports, certificats et documents de véhicules.
En dehors de cela, il y a les chauffeurs eux-mêmes et leurs véhicules à gérer.
Lorsqu'il est question de confort de voyage et d'amélioration de la qualité de service pour nos usagers, la sécurité et l'élimination des imprévus sont des impératifs absolus. Par exemple, lorsque la voiture qui s'arrête n'est pas celle que vous avez réservée.
Vous découvrirez comment nous, chez inDrive, gérons actuellement les vérifications régulières des véhicules. Une fois cela fait, nos modérateurs vérifient manuellement les photos avant et après. Bien sûr, le processus de vérification implique également d'autres choses, mais ici nous nous concentrerons uniquement sur cet aspect.
Le problème avec l'approche actuelle est qu'il est plus difficile d'augmenter le nombre de modérateurs que de faire évoluer l'infrastructure. Surtout lorsqu'il s'agit de traiter les données personnelles des utilisateurs.
Posons le problème très simplement, comme pour un enfant : nous avons deux photos d'une voiture — sont-elles toutes les deux de la même voiture ? Évidemment, n'importe qui pourrait traiter cette question, mais les choses se compliquent beaucoup une fois qu'on ajoute un critère de comparaison.
Par exemple, assurez-vous qu'il ne s'agit pas d'une capture d'écran d'un téléphone portable ou que les numéros de plaque d'immatriculation correspondent parfaitement.
Globalement, ce problème peut être résolu de plusieurs manières : En utilisant des modèles E2E et des ensembles de ces modèles.
Le modèle E2E implique d'impliquer un grand modèle (probablement un réseau de neurones) qui peut répondre à nos questions basées sur une paire d'images, telles que "Est-ce le même véhicule sur la photo ou non ?", "Les numéros de plaque d'immatriculation correspondent-ils levé ou pas ? », etc.
Le problème avec ces modèles est qu'ils nécessitent beaucoup de données pour en tirer des enseignements et qu'ils ne comprennent pas pourquoi la réponse est ce qu'elle est.
Par exemple, si nous entraînons un modèle à répondre "oui"/"non" sur la base d'une paire de photos, il n'est plus possible de comprendre les raisons de la réponse.
Les utilisateurs ne pourront donc pas comprendre ce que nous attendons d'eux et nous devrons faire appel à des modérateurs.
Cette approche de bout en bout ne nous convient pas. Nous voulons donner à l'utilisateur des indices sur les raisons pour lesquelles la photo fournie ne "fait pas l'affaire" : "Il est préférable de prendre la photo dans un endroit bien éclairé", "On dirait que nous ne voyons pas toute la voiture dans l'image" ou "Le numéro de plaque d'immatriculation ne correspond pas aux informations fournies."
Il est très important pour nous que le modèle ne réponde pas "oui" lorsqu'il y a différents véhicules. Appelons cette métrique le "FPR" (taux de faux positifs) et utilisons-la pour montrer le pourcentage de réponses "oui" par rapport à tous les exemples négatifs (où les véhicules ne correspondent pas).
Maintenant, introduisons une autre métrique - TPR - pour mesurer le rapport des réponses "oui" à toutes les réponses affirmatives.
En gros, ces deux métriques suffisent déjà à décrire notre tâche lors de l'optimisation du modèle : Minimiser le FPR et s'assurer que le TPR n'est pas trop dégradé.
Nous avons adopté l'approche des ensembles de modèles. Par conséquent, nous pouvons ajouter toutes nos idées au squelette de la solution finie (ce squelette sera appelé le « baseline »). Explorons à quoi cela ressemble et décomposons-le en plusieurs parties.
En fait, il se compose de plusieurs modèles qui traitent indépendamment deux images en entrée, et donnent en sortie le numéro d'immatriculation du véhicule et son vecteur. En conséquence, sur la base des détails comparés, une décision de vérification est prise concernant les deux photos examinées.
C'est le squelette de l'algorithme que nous utilisons pour ajouter plusieurs autres modèles, en les plaçant dans différents nœuds de notre modèle. Par exemple, lors de l'évaluation de la qualité d'une photo, de ses niveaux de clarté, de lumière et de saturation.
Parfois, nous devons détecter les tentatives de soumission de photos qui ne sont pas authentiques. Pour ce faire, nous ajoutons un préprocesseur qui vérifie la photo pour les attaques d'usurpation.
Lorsque vous utilisez une telle approche, il est crucial d'avoir des cycles d'itération de produit clairs et de générer un bon ensemble de données de test. Nous ajoutons un nouveau modèle pour évaluer ces deux facteurs, « Résout-il le problème assigné ? et "Dans quelle mesure cela modifie-t-il les métriques de la solution précédente ?"
Parlons maintenant des éléments de base de la solution.
Passons à la terminologie. Ci-dessous, j'expliquerai la signification des termes tels que "boîte englobante" et "masque de segmentation".
Une boîte englobante est une forme rectangulaire utilisée pour enfermer un objet d'intérêt spécifique. Par exemple, si nous voulons identifier le visage du chat, nous définirions une boîte englobante en la délimitant en rouge. Il est défini par les coordonnées de ses points inférieur gauche et supérieur droit dans l'image.
La segmentation fait référence à la tâche consistant à attribuer une étiquette de classe à chaque pixel individuel dans une image d'entrée. Dans le cadre de notre discussion, nous avons isolé le chat en le segmentant de l'arrière-plan.
Dans notre modèle, l'arrière-plan du véhicule ne nous intéresse pas car il ne fournit aucune information pertinente pour façonner notre solution cible. Mais cela ne signifie pas que nous n'avons aucune idée sur la façon d'améliorer nos modèles en utilisant des arrière-plans.
Pour relever le défi de séparer les véhicules de l'arrière-plan, nous allons prendre un modèle de la famille YOLO (You Only Look Once) et l'entraîner à segmenter les images de voitures. Le problème ici est que nous avons un grand nombre de photos d'utilisateurs avec plus d'une voiture sur la photo.
Pour surmonter ce problème, nous pouvons utiliser l'approche suivante :
Super, nous avons notre première entrée.
L'étape suivante consiste à trouver le numéro de plaque d'immatriculation du véhicule. Dans presque tous les pays, la plaque d'immatriculation est située à l'avant. Les rares cas où les plaques d'immatriculation des véhicules sont situées dans des endroits inhabituels sortent du cadre de cet article.
L'approche la plus courante pour établir le numéro de plaque d'immatriculation consiste à détecter la zone de délimitation et à appliquer l'OCR au patch résultant.
Mais comme nos expériences l'ont montré, l'OCR est beaucoup moins efficace (et prend plus de temps dans certains modèles) si la plaque d'immatriculation du véhicule n'est pas parallèle à l'horizon.
Ceci est particulièrement pertinent pour nos données, où nous demandons aux conducteurs de prendre des photos en biais.
La solution que nous avons retenue a été de segmenter le nombre puis de lisser la courbe de niveau obtenue. Dans notre cas, la tâche de segmentation a été abordée de la même manière que la segmentation des véhicules, avec le résultat suivant :
Ensuite, nous avons tracé une ligne de contour à l'aide du masque et appliqué ConvexHull pour la lisser. Cet algorithme simple lisse (redresse) les concavités de notre ligne de contour, la rendant plus droite. Cela peut être décrit comme un plus petit nombre d'angles dans un polygone de contour.
Dans un monde idéal, cette opération nous donnerait un rectangle défini par quatre points.
Une fois que nous avons aligné les bordures, nous répétons le même exercice avec la perspective, afin que le numéro d'enregistrement soit lisse, bien présenté et clairement visible. Cette approche est particulièrement utile lorsqu'une voiture est photographiée sous un angle où la plaque d'immatriculation est à peine visible.
Qu'est-ce qu'une correction de perspective ? Je me souviens de mon cours d'algèbre comment fonctionne une matrice de rotation. Si vous prenez un carré dans le système de coordonnées cartésien et que vous multipliez chaque coordonnée par une matrice de rotation de 30 degrés, votre carré dans le nouveau système de coordonnées subira une rotation de 30 degrés.
Ici, nous avons affaire à une tâche similaire - prenons la courbe de niveau et déplaçons tous les points vers le nouveau système de coordonnées. Le problème est de trouver une matrice de transformation appropriée.
Tous ces algorithmes sont déjà bien établis, donc la seule chose que nous devons faire est de nous assurer qu'ils sont correctement configurés pour la tâche à accomplir.
Le résultat était tout simplement génial. Cela a augmenté le TPR de près de 15 points de pourcentage. Ensuite, nous appliquons un logiciel OCR léger et de haute qualité, tel que l'architecture PARSeq.
À l'heure actuelle, il s'agit de la dernière technologie de réseau neuronal pour le traitement des photos de véhicules. Les intégrations sont une technique largement adoptée dans divers domaines de l'apprentissage automatique, notamment la recherche, les recommandations et la compression des données.
Dans le cadre de notre tâche, les plongements sont utilisés pour évaluer la similarité entre les véhicules.
Regardons un exemple où j'ai pris une photo de ma voiture d'abord du côté droit, puis du côté gauche. Maintenant, je peux calculer les plongements (vecteurs) pour ces images, et si ces vecteurs sont proches dans l'espace, cela indique qu'il s'agit du même véhicule.
Mais les intégrations fournissent une autre propriété utile qui peut être utilisée dans le produit : si votre modèle d'intégration fonctionne bien, vous pouvez rechercher ce qui est le plus proche parmi les échantillons d'intégration. Par exemple, pour trouver des véhicules non uniques dans le système.
Lors de la formation de notre modèle d'incorporations à l'aide des données inDrive, nous avons pris des précautions méticuleuses. Nous avons soigneusement supprimé toutes les données personnelles des photos et nous nous sommes assurés que l'ensemble de données était normalisé, englobant des images de tous les pays dans lesquels nous opérons et des niveaux de qualité variables.
Cette approche vise à prévenir la discrimination à l'encontre des personnes qui n'ont peut-être pas accès à des smartphones coûteux pour capturer des photos de haute qualité.
Par conséquent, obtenu un ensemble de données regroupées par marque et marque de véhicule. Après plusieurs expérimentations, nous nous sommes rendus compte que nous devions pour l'instant nous passer de comparer les couleurs des véhicules.
Lors de la sélection de l'architecture de notre modèle, nous avons recherché une colonne vertébrale qui établit un équilibre entre performances et efficacité de calcul. Il était crucial d'éviter d'utiliser un backbone trop grand, car cela pourrait considérablement ralentir le temps d'exécution de la ligne de base.
Après mûre réflexion, nous avons opté pour efficientnet_b2 comme architecture dorsale, complétée par l'utilisation de la perte de marge angulaire additive à des fins d'apprentissage automatique.
L'objectif de notre modèle est d'apprendre les représentations vectorielles où les véhicules de la même marque et du même modèle, comme toutes les Audi A4, sont positionnés étroitement ensemble dans l'espace vectoriel.
En revanche, les Audi A5 seraient positionnées un peu plus loin des Audi A4 mais toujours plus proches par rapport, par exemple, à une Toyota Camry.
Passons maintenant à quelques exemples de comparaisons de véhicules :
En haut, nous avons deux voitures identiques, tandis qu'en bas, nous en avons deux différentes. Revoyons les scores de similarité : la paire supérieure a un score de 0,989, tandis que la paire inférieure a un score de 0,697. En fixant une valeur seuil de 0,98, nous pouvons classer les véhicules comme identiques.
Cependant, il est important de noter que notre modèle ne fonctionne pas encore parfaitement. Nous avons un biais dans le facteur concerné :
Le modèle produit un résultat de 0,751, alors que nous voulons idéalement une valeur proche de zéro pour différents véhicules.
Le principal problème ici découle de la formation de notre modèle sur des ensembles de données principalement axés sur les modèles et les marques de véhicules. Par conséquent, le modèle est devenu compétent pour distinguer les différents véhicules, mais il a du mal à évaluer les différences au sein des classes de véhicules.
Le deuxième problème que nous avons rencontré est que le véhicule peut être montré sous différents angles, ce qui affecte négativement la qualité de nos incrustations en raison du jeu de données limité.
Dans un premier temps, côté client, nous ajoutons des masques et indiquons au conducteur comment prendre une photo de sa voiture. La deuxième étape consistera à détecter différentes parties du véhicule pour le positionner dans l'espace et estimer sa rotation.
De nombreuses heuristiques peuvent être développées ici pour choisir le bon angle de rotation. Et surtout, ces modèles peuvent être réutilisés ultérieurement pour évaluer l'état du véhicule. Mais c'est une histoire pour une autre fois.
Posté par Ilya Kaftanov .