Présentation
Je veux vous présenter le résultat de mes expériences avec des algorithmes de reconnaissance d'image avec un premier apprentissage (ce que l'on appelle l'apprentissage en un coup). À la suite des expériences, certaines approches de la structuration d'images ont été développées et, par conséquent, elles ont été incorporées dans plusieurs algorithmes interconnectés et une application de test sur Android, avec laquelle vous pouvez vérifier la qualité et les performances des algorithmes.
Mon objectif était de créer un algorithme avec un principe de fonctionnement clair qui puisse trouver des dépendances abstraites dans une image la première fois (pour apprendre) et montrer une qualité de reconnaissance acceptable (rechercher de telles dépendances abstraites) dans les cycles de reconnaissance suivants. Dans le même temps, la logique de prise de décision devrait être transparente, susceptible d'analyse, plus proche d'un algorithme linéaire. À une échelle conditionnelle où à une extrémité le cerveau et à l'autre est une machine CNC, il est beaucoup plus proche de la machine que du réseau neuronal.
Pourquoi pas un réseau de neurones?
À l'heure actuelle, les réseaux de neurones règnent dans les tâches de reconnaissance, en particulier CNN est une sorte de norme pour la reconnaissance des formes. Cependant, à mon avis, leur application n'est pas illimitée et d'autres approches doivent être recherchées.
Je donnerai plusieurs raisons contre les réseaux de neurones:
- De grands ensembles de données sont nécessaires pour la formation, qui peuvent tout simplement ne pas être disponibles.
- Grande puissance d'apprentissage et grand temps d'apprentissage pour chaque image
- L'opacité de l'algorithme, l'impossibilité de déboguer et l'influence directe sur le résultat. Il est très difficile, voire impossible, de comprendre la logique de la distribution des poids. C'est à la fois force et faiblesse.
Comment ça marche
L'idée de base est la suivante: l'échantillon d'image doit être structuré, c'est-à-dire les informations qu'il contient doivent être réduites au minimum nécessaire, mais pour que le sens ne soit pas perdu. Par exemple, les artistes dessinent des croquis - en quelques lignes précises, un artiste peut représenter le visage ou un objet d'une personne et le spectateur comprendra ce qui est représenté. Une photographie contient une matrice de N * M pixels, chaque pixel contient quelques bits d'informations sur les couleurs, et si vous imaginez tout cela sous la forme de paramètres de ligne, la quantité d'informations diminue fortement et le traitement de ces informations est beaucoup plus simple. L'algorithme devrait faire à peu près la même chose. Il devrait mettre en évidence les principaux détails dans le cadre - celui qui porte les informations de base et jeter tous les inutiles.

L'algorithme trouve la structure des vecteurs le long des frontières des objets dans l'échantillon et la même structure dans l'image reconnue.

Pour obtenir un vecteur, une image passe par plusieurs étapes de traitement:
- Traduit en monochrome en utilisant la formule simple (Rouge + Vert + Bleu) / 3
- Le gradient est calculé pour chaque point de la matrice.
- Les régions de poids les plus importantes du gradient se trouvent
- Nous recherchons des chaînes de vecteurs couvrant ces zones
- Ensuite, les étapes sont bouclées pour obtenir le nombre minimum de vecteurs qui transportent le maximum d'informations.

La même chose se produit dans l'algorithme analysé. Ensuite, les tableaux de vecteurs résultants sont comparés:
- Premièrement, l'algorithme essaie de s'accrocher à certaines parties similaires (clusters locaux). Par exemple, il peut trouver un sourcil semblable à un sourcil dans un échantillon, puis trouver un nez qui ressemble à un nez.
- Et puis une relation similaire entre les clusters locaux est recherchée. Par exemple, un sourcil + nez + un autre sourcil. Déjà obtenu un cluster plus complexe.
- Etc. jusqu'à ce que vous obteniez une image des relations entre les clusters qui collectent tout ou presque tous les vecteurs d'image. C'est-à-dire par exemple, sourcils, yeux, nez, etc. le visage ne fonctionnera pas.
Ainsi, de petits détails sont inclus dans l'image globale et une reconnaissance de forme semblable à une avalanche se produit .
La classification elle-même est construite sur le principe de trouver l'image la plus similaire à partir du stocké. Le plus similaire est celui qui a le plus grand nombre de vecteurs correspondants avec le moins d'écarts par rapport au volume total de vecteurs dans l'échantillon.
Le schéma général du fonctionnement des algorithmes:

Formation en plusieurs étapes
Malgré le fait que l'algorithme peut fonctionner efficacement à partir d'un échantillon, il est possible d'augmenter la précision de reconnaissance en analysant plusieurs échantillons. Il n'est pas implémenté dans la version de démonstration, donc je vais juste parler de cette fonctionnalité, c'est très simple. Le principe de l'entraînement sur plusieurs échantillons est d'éliminer les vecteurs inutiles. Les autres sont ceux qui ne sont pas inclus dans un groupe de vecteurs mutuellement trouvé. Par exemple, il peut y avoir une ombre sur l'échantillon qui est reconnue comme une bordure, mais elle peut ne pas être sur l'échantillon suivant.
Ainsi, si le vecteur fait partie d'un cluster qui se trouve dans l'échantillon enregistré et dans celui analysé, il obtient +1 point, et sinon, il n'obtiendra rien. Après plusieurs formations, les vecteurs qui ont marqué peu de points sont supprimés de l'échantillon enregistré et ne sont plus utilisés pour l'analyse.
Vous pouvez également créer un éditeur visuel qui vous permet simplement de supprimer les vecteurs indésirables du cadre après la première formation.
Que peut-on utiliser
Honnêtement, j'ai concentré tous mes efforts sur l'algorithme lui-même. Bien que depuis Je travaille avec l'environnement des solutions commerciales et l'automatisation de la production, puis une application que je vois - la reconnaissance des produits dans les entrepôts et les lignes de production - il n'y a tout simplement pas de grands ensembles de données ici - puis l'échantillon doit être affiché 1 fois puis reconnu. En tant que liaison de codes-barres uniquement sans codes-barres. Mais en général, l'application est la même que pour tout autre algorithme de reconnaissance. L'application est due aux capacités et aux limites de l'algorithme.
Application de test

L'application fonctionne avec une matrice de 100 * 100 pixels, convertit l'image en une matrice monochrome de cette taille. L'algorithme ne se soucie pas de l'angle de l'échantillon et ses dimensions sont également dans certaines limites.
À gauche, le résultat de la mise en évidence de zones importantes de l'image actuelle et des vecteurs correspondants (vert) est affiché, et à droite la structure des vecteurs trouvés et le plus approprié des vecteurs enregistrés, et des vecteurs similaires sur la structure enregistrée sont mis en évidence en rouge. Ainsi, les structures vectorielles en surbrillance rouge et verte que l'algorithme considère comme similaires.
Vous pouvez enregistrer plusieurs échantillons. Et en montrant une nouvelle image, l'algorithme trouvera la plus appropriée et affichera des parties similaires.