Comment nous avons formé un réseau de neurones pour classer les vis

Un réseau de neurones peut identifier un chat sur une photo, trouver un canapé, améliorer l'enregistrement vidéo, dessiner une image de chiots ou un simple croquis. Nous y sommes déjà habitués. Des nouvelles sur les réseaux de neurones apparaissent presque tous les jours et sont devenues monnaie courante. Les entreprises de Grid Dynamics ont défini la tâche non pas ordinaire, mais difficile - apprendre au réseau neuronal à trouver une vis ou un boulon spécifique dans un immense catalogue d'une boutique en ligne à partir d'une seule photographie. La tâche est plus difficile que de trouver un chat.



Le problème de la boutique en ligne de vis est en stock. Des milliers ou des dizaines de milliers de modèles. Chaque vis a sa propre description et ses propres caractéristiques, il n'y a donc aucun espoir pour les filtres. Que faire Rechercher manuellement ou rechercher dans l'hypermarché sur les étagères? Dans les deux cas, c'est une perte de temps. En conséquence, le client se fatigue et va enfoncer un clou. Pour l'aider, nous utiliserons un réseau de neurones. Si elle peut trouver des joints ou des canapés, alors laissez-la faire quelque chose d'utile - ramasser des vis et des boulons. Comment apprendre à un réseau de neurones à sélectionner des vis rapidement et avec précision pour un utilisateur, nous vous le dirons dans la transcription du rapport de Maria Matskevichus , qui chez Grid Dynamics est engagée dans l'analyse de données et l'apprentissage automatique.

Une courte démo de ce qui s'est passé

Problèmes d'acheteur


Imaginez - nous avons acheté une table, mais une petite vis a été perdue et une table ne peut pas être assemblée sans elle. Nous allons dans la boutique en ligne à la recherche et nous voyons 15 000 positions uniques, dont chacune est peut-être notre vis.

Nous passons aux filtres - il y en a environ 10, chacun ayant 5 à 100 attributs. Choisissez le type de chapeau et sa couleur: chapeau plat - Cuivre plat et jaune - Laiton. Nous recevons le problème.



Qu'est ce que c'est Nous ne cherchions pas cela. Renvoyez la personne responsable de l'extradition!

Après un certain temps, nous sélectionnons néanmoins 2 vis de table adaptées.



Il ne reste plus qu'à déchiffrer la description et les caractéristiques. Chaque fabricant décrit les vis à sa manière. Il n'y a pas d'exigences spécifiques pour décrire les paramètres d'un modèle particulier.

Tout ce qui crée des difficultés pour le client. Perte de temps, de nerfs et de travail de support technique, ce qui aide le client à trouver le modèle souhaité. Ayant réalisé ces problèmes de l'acheteur, notre client - une grande entreprise américaine - a décidé de fournir au client une recherche rapide, précise et simple par photo, au lieu d'une recherche sémantique lente et pas toujours réussie.



Difficultés de mise en œuvre


Nous avons entrepris la tâche et nous sommes rendu compte qu'il y avait plusieurs problèmes.

Les vis se ressemblent. Regardez les photos.



Ce sont des vis différentes. Si vous retournez les photos, vous pouvez voir que la caractéristique importante est différente - la tête.



Et sur cette photo?



Ici, les modèles sont les mêmes. L'éclairage est différent, mais sur les deux photos, il y a un modèle à vis.

Il existe des espèces rares qui nécessitent une classification. Par exemple, avec des "oreilles" ou une bague.



Exigences minimales pour l'utilisation de l'application. L'utilisateur peut télécharger une photo avec n'importe quel fond, avec des objets étrangers, avec des ombres, avec un mauvais éclairage, et l'application doit donner le résultat. Une vis ou un boulon sur fond blanc est une rareté.



L'application devrait fonctionner en temps réel. L'utilisateur attend le résultat ici et maintenant.

Concurrents. Amazon - un concurrent de notre client - a récemment lancé son outil de recherche de pièces . Il s'agit d'une application qui recherche des vis et des boulons à partir d'une photographie.



En plus d'Amazona, nous avions deux concurrents en démarrage avec leurs propres solutions pour le client. Nous devions battre non seulement Amazon, mais aussi les startups, ce qui n'était pas difficile. L'un des concurrents a suggéré l'idée de prendre les 20 boulons les plus populaires et de détecter les objets d' entraînement sur eux. Mais à la question de savoir ce qui se passera lorsque les réseaux de neurones fourniront 100, 1000 ou les 15000 vis du site du client, comment la détection d'objets fonctionnera et où obtenir autant de données, le concurrent n'a pas trouvé de réponse.

Solution


Il doit être évolutif et ne pas dépendre du nombre de variétés de vis et de la taille du catalogue. Pour résoudre le problème, nous avons décidé de considérer une vis comme un ensemble de caractéristiques ou d'attributs. Chaque attribut est un ensemble d'attributs.



Sélection des caractéristiques suivantes:

  • tête de chapeau (32 attributs);
  • revêtement extérieur - finition (15 attributs);
  • pointe - pointe (12 attributs);
  • couverture des fils - couverture des fils (4 attributs).

Nous avons examiné la carte de tous les panneaux et réalisé que pour décrire 15 000 vis différentes, il n'en fallait que 50. Ils constitueront une combinaison de panneaux différents avec des attributs différents. Il faut 50 vis et une pièce pour mesurer l'échelle de la vis sur la photo.

Ils ont donc décidé. Nous avons décidé de l'idée. Des données supplémentaires sont nécessaires.

Les données


Nous avons reçu des données du client et étions un peu contrariés. Données du catalogue - photographies d'objets sur fond blanc.



Mais ils ne correspondent pas tout à fait aux données que l'application va traiter. L'utilisateur voudra utiliser n'importe quel arrière-plan, prendra des photos dans la paume de sa main ou tiendra un boulon avec ses doigts. Les données sur lesquelles le réseau est formé ne coïncideront pas avec l'image réelle.

Ensuite, nous avons décidé de suivre les conseils de Richard Soker .

Au lieu d'apprendre une méthode d'enseignement sans enseignant pendant un mois, il est plus facile de prendre une semaine, d'annoter les données et de former le classificateur.

Nous avons donc fait - imprimé beaucoup d'arrière-plans colorés sur l'imprimante, acheté ces 50 boulons et photographié les données d'entraînement sur les arrière-plans. Nous avons donc obtenu toutes les options possibles pour les surfaces des tables et des tapis.



Après avoir collecté les données, l'étape suivante consiste à comprendre où dans l'image le boulon se trouve, le cas échéant.

Localisation


Nous avons examiné deux approches de localisation: la détection d'objets et la segmentation sémantique .



La détection d'objet renvoie la boîte de la zone minimale autour de l'objet. La segmentation sémantique renvoie le masque. Dans notre cas, le masque est plus adapté. Il conserve sa forme, supprime l'arrière-plan, les ombres en excès et vous permet de mieux classer les vis que la détection d'objets.



La tâche de la segmentation sémantique est de renvoyer la probabilité de son appartenance à une classe pour chaque pixel. Pour former un tel modèle, des données étiquetées sont nécessaires. Nous avons utilisé l'application «labelme» , avec laquelle nous avons marqué l'échantillon. Nous avons obtenu environ un millier de masques avec une pièce de monnaie et une vis.



Modèle


Nous avons pris U-Net . Ce réseau est très apprécié de Kaggle, et nous le sommes aussi maintenant.



U-Net est une implémentation réussie de codeur-décodeur.

  • Un chemin de construction ou un encodeur . C'est la partie de U-Net, qui essaie de représenter l'ensemble des données, présentes sous forme de représentation vectorielle dans un espace plus compressé. Elle apprend ces signes et trouve les plus significatifs.
  • Un chemin ou décodeur en expansion . Tente de décoder une carte d'entités et de comprendre où se trouve l'objet dans l'image.

Nous avons décidé du modèle. Maintenant, nous sélectionnons la fonction de perte, dont nous minimiserons la valeur dans le processus d'apprentissage.

Fonction de perte


L'option classique de segmentation est le coefficient de dés :

D(P,G)= frac2|P cdotG||P|+|G|



Il s'agit de la moyenne harmonique entre précision et rappel. La moyenne harmonique signifie que nous pesons également l'erreur du premier type et l'erreur du deuxième type. Nos données ne sont pas équilibrées, et cela ne nous convient pas très bien.



Il y a toujours beaucoup de fond et l'objet lui-même ne suffit pas. Par conséquent, le modèle donnera toujours une très haute précision et un rappel très faible. Pour peser les erreurs du premier et du deuxième type de différentes manières, nous avons décidé de prendre l' indice Tversky :

$$ afficher $$ S (P, G, α, β) = \ frac {| P \ cdot G |} {| P \ cdot G | + α | P / G | + β | G / P |} $$ afficher $$



L'indice Tversky a deux coefficients, α et β, pondèrent les deux erreurs différemment. Si nous prenons α = β = 0,5, nous obtenons le même coefficient de dés. Si nous sélectionnons d'autres paramètres, nous obtenons l' indice de Jaccard - l'une des mesures de similitude des objets. Pour α = β = 1 - l'indice Tversky est égal à l'indice Jaccard.

Vous pouvez également obtenir un score Fβ. Pour α + β = 1, l'indice Tversky correspond au score Fβ.

Pour sélectionner α et β, nous avons mené plusieurs expériences. Ils ont émis l'hypothèse que le modèle serait condamné à une amende plus sévère pour les erreurs du deuxième type . Ce n'est pas si mal quand un modèle classe un pixel d'arrière-plan comme pixel d'objet. S'il y a un petit cadre d'arrière-plan autour de l'objet, c'est normal. Mais lorsque le modèle classe un pixel de vis comme pixel d'arrière-plan - des trous apparaissent sur la vis, il devient inégal, et cela interfère avec notre classification.

Par conséquent, nous avons décidé d'augmenter le paramètre β et de le rapprocher de 1, et du paramètre α à 0.



L'image montre que le meilleur masque a été obtenu avec β = 0,7 et α = 0,3. Nous avons décidé de nous arrêter là-dessus et de former le modèle sur toutes nos données.

La formation


La stratégie d'apprentissage est assez délicate. Puisque nous avons annoté manuellement les données dans le temps personnel, nous avons décidé d'utiliser une fonction de U-Net. Il segmente chaque nouvelle classe sur un nouveau canal - ajoute un nouveau canal et un objet est localisé dessus.

Par conséquent, dans notre formation, il n'y avait pas une seule image contenant à la fois une pièce et un verrou. Toutes les images contenaient une classe: 10% - pièces, 90% - vis.



Cela a permis de répartir correctement les efforts et de gagner du temps sur une pièce - c'est un, mais la forme est simple. Nous avons facilement appris à le segmenter, ce qui nous a permis de transférer 90% de nos efforts aux vis. Ils ont des formes et des couleurs différentes, et il est important d'apprendre à les segmenter.

Notre réseau a appris à segmenter même les instances qui ne faisaient pas partie de notre échantillon. Par exemple, des boulons d'une forme inhabituelle étaient absents, mais le modèle les a également bien segmentés. Elle a appris à généraliser les signes de vis et boulons et à l'utiliser pour de nouvelles données, ce qui est formidable.



Classification


Il s'agit de l'étape suivante après la localisation de l'objet. Peu de gens forment des réseaux de neurones convolutifs pour classer les objets; ils utilisent souvent l' apprentissage par transfert . Examinons l'architecture d'un réseau neuronal convolutif, puis rappelons brièvement ce qu'est l'apprentissage par transfert.



Dans les premières couches, le réseau apprend à reconnaître les limites et les angles. Plus tard, il reconnaît des formes simples: rectangles, cercles, carrés. Plus il est proche du sommet, plus il reconnaît les traits caractéristiques des données sur lesquelles il est formé. Tout en haut, le modèle reconnaît les classes.

La plupart des objets du monde se composent de formes simples et ont des caractéristiques communes. Vous pouvez faire partie d'un réseau formé à une énorme quantité de données et utiliser ces attributs pour notre classification. Le réseau sera formé sur un petit ensemble de données sans grandes dépenses de ressources. C'est ce que nous avons fait.



Une fois que vous avez décidé de la technologie générale de l'apprentissage par transfert, vous devez sélectionner un modèle pré-formé.

Sélection du modèle


Notre application fonctionne en temps réel. Le modèle doit être léger et mobile - avoir peu de paramètres, mais être précis. Pour tenir compte de ces deux facteurs, nous avons sacrifié un peu de précision au profit de la légèreté. Par conséquent, nous n'avons pas choisi le modèle le plus précis mais le plus léger - Xception .



Dans Xception, au lieu de la convolution habituelle - Convolution - Convolution séparable est utilisée. Par conséquent, Xception est plus léger que d'autres réseaux, par exemple avec VGG.



La convolution ordinaire effectue à la fois la convolution intercanale et interdimensionnelle. Et partages de convolution séparables: d'abord, convolution interdimensionnelle - en profondeur , puis interchannel. Les résultats se combinent.

Xception exécute une convolution séparable, alors qu'elle produit le même bon résultat que la convolution ordinaire, mais il y a moins de paramètres.



Nous substituons les valeurs dans les formules pour calculer les paramètres, par exemple, pour 16 filtres. Pour la convolution ordinaire, vous devez calculer les paramètres 7 fois plus que pour la convolution séparable. Pour cette raison, Xception est plus précis et moins.



La formation


Tout d'abord, nous avons décidé de construire une base de référence et formé le modèle dans l'image originale. Nous avions 4 classificateurs et chacun était responsable d'un attribut spécifique. Le résultat n'était pas satisfaisant.



Ensuite, ils ont formé le modèle sur la boîte, qui a renvoyé la détection d'objet. Vous avez une bonne augmentation de la précision de la couverture des threads. Mais pour le reste des classificateurs, le résultat est également insatisfaisant.



Ensuite, ils ont décidé de ne donner aux classificateurs que la partie de la vis qu'ils voulaient et classeraient. La tête ne donne que des chapeaux, Astuce - seulement un fer de lance. Pour ce faire, nous avons pris des masques, obtenu un contour autour duquel un rectangle de la zone minimale a été encerclé et calculé l'angle de rotation.



À ce moment, nous ne savons toujours pas de quel côté la tête de vis et la pointe. Pour le savoir, ils ont coupé la boîte en deux et ont regardé le carré.



La zone qui contient la tête est toujours plus grande que la zone qui contient la pointe. En comparant la zone, nous déterminons dans quelle partie, quelle partie de la vis. Cela a fonctionné, mais pas pour tous les cas.



Lorsque la longueur de la vis est comparable au diamètre du capuchon, au lieu d'un rectangle, un carré est obtenu. Lorsque nous la tournons, nous obtenons une image, comme au numéro 3. Le modèle ne classe pas bien cette option.

Ensuite, nous avons pris toutes les vis longues, calculé les angles de rotation pour elles et construit le réseau neuronal peu profond Rotation Net , qui prend la vis et prédit l'angle de rotation.



Ensuite, ce modèle auxiliaire a été utilisé pour les petites vis et boulons courts. Nous avons obtenu un bon résultat - tout fonctionne, les petites vis tournent aussi. À ce stade, l'erreur est pratiquement réduite à zéro. Nous avons pris ces données, formé les classificateurs et constaté que pour chacun des classificateurs, à l'exception de Fini, la précision augmentait considérablement. C'est formidable - nous travaillons plus loin.



Mais pour une raison quelconque, Finish n'a pas décollé. Nous avons étudié les erreurs et vu l'image.



La même paire de vis dans différentes conditions d'éclairage et différents réglages de caméra diffèrent en couleur. Cela peut confondre non seulement le modèle, mais aussi la personne. Le gris peut devenir rose, le jaune peut devenir orange. Rappelez-vous la robe bleu-or - la même histoire. La surface réfléchissante de la vis est trompeuse.

Nous avons étudié des cas similaires sur Internet et trouvé des scientifiques chinois qui ont essayé de classer les voitures par couleurs et ont rencontré le même problème pour les voitures.



Comme solution, les scientifiques chinois ont créé un réseau peu profond. Sa caractéristique est en deux branches qui sont concaténées à la fin. Cette architecture est appelée ColorNet .



Nous avons implémenté une solution pour notre tâche, et nous avons obtenu une augmentation de la précision de près de 2 fois. Avec de tels résultats et modèles, vous pouvez travailler et rechercher la vis même du tableau dans le catalogue de la boutique en ligne.



Nous n'avions que 4 classificateurs pour 4 attributs, et il y en a beaucoup d'autres. Donc, vous devez créer une sorte de filtre qui prendra les données du catalogue et les filtrera d'une certaine manière.

Filtrage


Chaque classificateur renvoie une étiquette souple et une classe. Nous avons pris les valeurs des balises logicielles et de notre base de données, compté un certain score - en multipliant toutes les balises pour chaque fonctionnalité.



Le score montre la confiance de tous les classificateurs que cette combinaison de fonctionnalités apparaîtra très probablement. Plus le score est élevé, plus la vis du catalogue et la vis de l'image sont similaires.

Pipeline


Il s'est avéré une telle application.



  • Entrée : commencez par une image brute.
  • Localisation : déterminez où se trouve le boulon ou la vis et où se trouve la pièce.
  • Transformation et rotation .
  • Classification : nous découpons soigneusement tout, classons et déterminons la taille.
  • Filtrage .
  • Quittez vers une position SKU spécifique.

Comment mettre en œuvre un projet complexe


Mangez l'éléphant en morceaux . Divisez le gros problème en plusieurs parties.

Étiquetez les données qui refléteront la réalité. N'ayez pas peur du balisage des données - c'est le moyen le plus sûr, qui garantira rapidement la qualité maximale du modèle. Les méthodes de synthèse des données produisent généralement des résultats moins bons que l'utilisation de données réelles.

Testez-le . Avant de construire de nombreux modèles, nous avons pris de petits morceaux de données, les avons étiquetés avec nos mains et testé le fonctionnement de chaque hypothèse. Ce n'est qu'après cela qu'ils ont formé U-Net, classificateurs, Rotation.

Ne réinventez pas la roue . Souvent, le problème auquel vous êtes confronté a déjà une solution. Regardez sur Internet, lisez des articles - assurez-vous de trouver quelque chose!

L'histoire de notre application Visual Search ne concerne pas seulement la classification des vis. Il s'agit de savoir comment réaliser un projet complexe, qui n'a pas d'analogues, mais même s'il y en a, ils ne répondent pas aux exigences que nous avons fixées pour l'application.

Pour plus d'informations sur les projets Grid Dynamics et les autres défis rencontrés par l'équipe Data Science, consultez le blog technologique de l'entreprise.

Des rapports avec un tel biais - l'utilisation d'algorithmes d'apprentissage automatique dans de vrais projets non standard - nous recherchons simplement UseData Conf . Voici plus sur les domaines qui nous intéressent le plus.

Envoyez des applications si vous savez comment farcir les modèles pour qu'ils volent. Si vous savez que la convergence ne garantit pas la vitesse et êtes prêt à vous dire ce qui est le plus important à surveiller, nous vous attendons le 16 septembre.

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


All Articles