Comment le réseau neuronal reconnaît-il les images?

25

J'essaie d'apprendre comment Neural Network fonctionne sur la reconnaissance d'image. J'ai vu quelques exemples et je suis devenu encore plus confus. Dans l'exemple de reconnaissance de lettres d'une image 20x20, les valeurs de chaque pixel deviennent la couche d'entrée. Donc 400 neurones. Puis une couche cachée de neurones et 26 neurones de sortie. Ensuite, entraînez le réseau, puis ça fonctionne, pas parfait.

Ce qui m'a dérouté dans le réseau neuronal, c'est comment il apprend ce qu'il y a dans une image. Vous n'avez pas besoin de faire de seuillage, de segmentation ou de mesure, le réseau apprend en quelque sorte à comparer les images et à les reconnaître. C'est comme de la magie pour moi maintenant. Par où commencer pour apprendre le réseau neuronal?

user1731927
la source
1
Si je comprends bien, un réseau de neurones n'est qu'une surface multidimensionnelle dans un espace abstrait, dont les extrêmes locaux conduisent à des choix possibles. Enseigner un réseau de neurones, c'est simplement ajuster cette surface abstraite à sa tâche. C'est ma compréhension noobish.
Vous voulez donc des explications OU des ressources pour commencer à travailler avec les NN? Ce serait bien de clarifier.
2
Il y a (actuellement) un joli cours gratuit sur coursera qui est dédié à votre question. coursera.org/course/neuralnets
pat
La classe Coursera NN semble être avancée, pas aussi bonne qu'une introduction. Andrew Ng a quelques introductions plus douces que vous pouvez trouver, par exemple, sur Youtube.
Douglas Zare
En fait, le cours Coursera avance, mais il s'accumule certainement et répondrait assez bien à la question du PO. Il contient également de nombreux exemples de reconnaissance numérique.
Chris A.

Réponses:

24

Un aperçu important de la façon dont un réseau de neurones peut apprendre à classer quelque chose d'aussi complexe que des données d'image à partir d'exemples et de réponses correctes m'est venu en étudiant les travaux du professeur Kunihiko Fukushima sur la néocognitrion dans les années 1980. Au lieu de simplement montrer à son réseau un tas d'images et d'utiliser la rétropropagation pour lui permettre de comprendre les choses par lui-même, il a adopté une approche différente et a formé son réseau couche par couche, et même nœud par nœud. Il a analysé les performances et le fonctionnement de chaque nœud individuel du réseau et a intentionnellement modifié ces parties pour les faire réagir de la manière voulue.

Par exemple, il savait qu'il voulait que le réseau soit capable de reconnaître les lignes, il a donc formé des couches et des nœuds spécifiques pour reconnaître les lignes horizontales de trois pixels, les lignes verticales de 3 pixels et les variations spécifiques des lignes diagonales sous tous les angles. Ce faisant, il savait exactement sur quelles parties du réseau on pouvait compter pour tirer lorsque les schémas souhaités existaient. Ensuite, chaque couche étant fortement connectée, le néocognitron dans son ensemble pourrait identifier chacune des parties composites présentes dans l'image, peu importe où elles existaient physiquement. Ainsi, lorsqu'un segment de ligne spécifique existait quelque part dans l'image, il y aurait toujours un nœud spécifique qui se déclencherait.

En gardant cette image toujours présente, envisagez une régression linéaire qui consiste simplement à trouver une formule (ou une ligne) via la somme des erreurs au carré, qui passe le plus près dans vos données, c'est assez facile à comprendre. Pour trouver des "lignes" courbes, nous pouvons faire la même somme de calcul de produits, sauf que maintenant nous ajoutons quelques paramètres de x ^ 2 ou x ^ 3 ou même des polynômes d'ordre supérieur. Vous disposez maintenant d'un classificateur de régression logistique. Ce classificateur peut trouver des relations qui ne sont pas de nature linéaire. En fait, la régression logistique peut exprimer des relations arbitrairement complexes, mais vous devez toujours choisir manuellement le nombre correct de fonctions d'alimentation pour bien prédire les données.

Une façon de penser au réseau de neurones est de considérer la dernière couche comme un classifieur de régression logistique , puis les couches cachées peuvent être considérées comme des "sélecteurs de caractéristiques" automatiques . Cela élimine le travail de sélection manuelle du nombre correct et de la puissance des fonctions d'entrée. Ainsi, le NN devient un sélecteur automatique de caractéristiques de puissance et peut trouver n'importe quelle relation linéaire ou non linéaire ou servir de classificateur d'ensembles arbitrairement complexes ** (ceci, suppose seulement, qu'il y a suffisamment de couches et de connexions cachées pour représenter la complexité de le modèle dont il a besoin pour apprendre). En fin de compte, un NN qui fonctionne bien devrait apprendre non seulement "la relation" entre les entrées et les sorties, mais plutôt nous recherchons une abstraction ou un modèle quise généralise bien.

En règle générale, le réseau de neurones ne peut rien apprendre qu'un humain raisonnablement intelligent ne pourrait théoriquement apprendre avec suffisamment de temps à partir des mêmes données, cependant,

  • il peut être capable d'apprendre quelque chose que personne n'a encore compris
  • pour les gros problèmes, une banque d'ordinateurs traitant des réseaux de neurones peut trouver de très bonnes solutions beaucoup plus rapidement qu'une équipe de personnes (à un coût beaucoup plus faible)
  • une fois que les NN formés produiront des résultats cohérents avec les intrants sur lesquels ils ont été formés et devraient bien se généraliser s'ils sont ajustés correctement
  • Les NN ne s'ennuient jamais ou ne sont pas distraits
mcstar
la source
1
+1 pour le paragraphe sur la façon dont la dernière couche effectue une régression logistique au-dessus de la sélection d'entités de la couche cachée. C'est une belle façon de penser aux NN.
jlund3
Merci, mais je dois préciser que je ne dis pas exactement que la dernière couche de chaque ANN est en fait une couche de régression logistique, mais seulement que c'est une configuration possible qui pourrait résoudre de nombreux problèmes. En raison de la manière principalement aléatoire, nous formons généralement le plus probable d'ANN, toute régression résultante est répartie sur de nombreux nœuds et couches de manière très aléatoire. On pourrait former des sous-réseaux à répondre de manière spécifique, puis pomper la sortie de ceux-ci dans une couche de régression pour fabriquer des réseaux spécialisés artisanaux pour des problèmes particuliers. Rendre un ANN très efficace en mémoire et en vitesse.
mcstar
1
Cette réponse ne cesse de recevoir des vues, j'ai donc pensé que je soulignerais qu'elle a plus de 5 ans maintenant et ne considère que les réseaux entièrement connectés. Bien que les idées conceptuelles ici soient toujours valables, elles ne donnent pas au praticien suffisamment de connaissances pour comprendre les concepts NN profonds qui sont devenus la norme au cours de la dernière décennie. Le CNN (réseau de neurones à convolution) est une adaptation moderne très importante qui donne des super pouvoirs aux réseaux profonds en leur permettant de localiser les bords, le contraste, la netteté, les espaces colorimétriques, les ombres et plus encore et de l'utiliser pour déterminer le contexte des caractéristiques de bas niveau.
mcstar
10

Vous avez peut-être entendu dire que les réseaux de neurones sont des " approximateurs de fonctions universelles ". En substance, le théorème de Cybenko dit que pour toute fonction mappant des réels aux réels, vous pouvez l'approcher avec un réseau neuronal avec des fonctions d'activation sigmoïdes. En fait, il s'avère que les réseaux de neurones vous permettent de calculer n'importe quelle fonction calculable par une machine de Turing (c'est-à-dire tout ce que vous pouvez écrire un algorithme à calculer). Malheureusement, ces preuves indiquent seulement que pour une configuration finie de neurones et de poids, vous pouvez approximer n'importe quelle fonction.

La théorie est toute belle et dandy, mais votre question semble être plus sur la façon de coder réellement le calcul d'une fonction en un ensemble de neurones et de poids. Pour illustrer, considérons un exemple simple - l'exclusif ou. Le XOR prend deux entrées, passe ces entrées. Lorsqu'une et une seule des entrées sont activées, le nœud de sortie est activé. Lorsque les deux entrées ou aucune d'entre elles ne sont activées, le nœud de sortie n'est pas activé.

Un filet Perceptron à trois couches capable de calculer XOR emprunté à wikipedia.

Notez que les trois nœuds cachés font des choses différentes. Les nœuds les plus à gauche et à droite passent simplement par les activations de respect des nœuds d'entrée. Le neurone central prend les deux entrées et les annule d'une manière ou d'une autre si elles sont toutes les deux activées. Cette combinaison et recombinaison intelligentes d'entrées est essentiellement la façon dont le travail dans un réseau neuronal est effectué.

Évidemment, pour les fonctions plus complexes, la combinaison et la recombinaison doivent être effectuées de manière plus intelligente et compliquée, mais c'est essentiellement ce qui se passe à un niveau bas. Ce qui est fou, c'est que c'est vraiment tout ce dont vous avez besoin pour calculer n'importe quelle fonction calculable! Là encore, les machines de turing se révèlent également être d'une simplicité trompeuse ...

Le problème est que nous n'avons pas vraiment de moyen de générer comme par magie le réseau neuronal qui calcule une fonction arbitraire. Les preuves nous disent seulement qu'il existe un réseau qui pourrait le faire. Lorsque nous formons nos réseaux de neurones, nous essayons simplement de trouver un réseau assez proche.

Dans le contexte de la reconnaissance d'image, vous pourriez imaginer des modèles d'encodage dans le réseau. Par exemple, pour reconnaître le nombre «1», vous pourriez imaginer des nœuds cachés qui s'attendent à ce qu'une colonne de pixels soit principalement ou entièrement activée, avec des pixels voisins éteints. Ce nœud caché pourrait être assez bon pour reconnaître une ligne droite dans cette colonne particulière. Rassemblez assez de ceux-ci et très bientôt vous avez un tas de nœuds qui le font à suffisamment d'endroits de votre image que si j'en montre un au réseau, suffisamment de nœuds cachés en ligne droite seront activés, indiquant un '1'. Le problème devient bien sûr de généraliser le réseau pour qu'il puisse reconnaître un ensemble varié d'entrées.

J'espère que cela vous aidera à comprendre plus ou moins les concepts de la façon dont un réseau de neurones peut effectuer des calculs. Cependant, vous avez atteint un point assez important sur les réseaux de neurones: en général, il est difficile au mieux de comprendre pourquoi le réseau crache une sortie particulière, surtout quand vous considérez que pour quelque chose comme la reconnaissance d'image, les réseaux sont généralement suffisamment grand pour que les humains aient du mal à comprendre chacune des pièces mobiles de la machine. Pour compliquer davantage le problème, en général, la plupart des réseaux de neurones n'ont en fait pas un seul nœud caché pour chaque petite fonctionnalité que le réseau pourrait découvrir sur les données. Au lieu de cela, la détection de quelque chose comme une ligne droite pour classer le nombre «1» aurait lieu de manière non centralisée sur de nombreux nœuds cachés. Autres algorithmes,

Si vous recherchez plus de lecture, je vous recommande fortement de lire ce tutoriel sur ai junkie. Il vous guide à travers les bases du fonctionnement d'un réseau de neurones et donne même un exemple de code simple permettant aux réseaux de neurones de conduire un réservoir vers un objectif. Le tutoriel ne couvre cependant pas la rétropropagation, qui est de loin le moyen le plus courant de former des réseaux de neurones, et utilise plutôt un algorithme génétique simple. Une fois qu'il commence à parler de génétique, je suppose que vous pouvez arrêter de lire ...

jlund3
la source
Merci pour tout le temps et les efforts déployés pour rassembler tous ces mots et pensées. Je suis particulièrement intéressé par Convolutional NN pour la reconnaissance d'image. J'ai essayé l'exemple de détection de visage dans la bibliothèque OpenCV, mais j'ai trouvé qu'il n'était bon que pour les objets rigides. Le réseau de neurones a-t-il une limite similaire sur la reconnaissance des créatures, c'est-à-dire, seulement bon pour les objets rigides?
user1731927
Il n'y a aucune raison théorique pour laquelle le NN (ou le CNN d'ailleurs) aurait une limite à sa reconnaissance de formes, mais comme vous l'avez déjà découvert, certains problèmes sont plus faciles à apprendre que d'autres. Comme pour de nombreux problèmes d'apprentissage automatique, vous devrez probablement modifier un peu votre modèle afin qu'il puisse bien fonctionner sur le type de problème spécifique que vous essayez de résoudre, et les NN ne font pas exception à la règle.
jlund3
1
Voici un article intéressant sur la façon de mieux structurer les NN ensemble pour résoudre les problèmes de grille 2D comme la classification d'images. axon.cs.byu.edu/~martinez/classes/678/Papers/science.pdf
jlund3
1
Tangentiellement, la difficulté de classer correctement les objets visuels "non rigides", ou autrement dit, les objets dont les bords n'ont pas de lignes épurées, est exactement la raison pour laquelle même la nature a déterminé que le camouflage est une excellente stratégie d'évasion. Nourriture pour la pensée.
mcstar
2

C'est ce qui vous a dérouté

comment il apprend ce qu'il y a dans une image.

Ce qui se trouve dans une image est représenté numériquement par les valeurs en pixels de l'image. Si vous prenez un exemple de couleur dans l'image. Le pixel peut avoir trois valeurs, chacune pour les trois couleurs principales - Rouge, Vert et Bleu ( RGB). Un pixel avec ( 10,50,100) signifie qu'il a «moins» d'éléments de couleur bleue qu'un pixel avec ( 40,50,100). Ainsi, dans l'image, le premier pixel représente une région avec moins de couleur bleue. Ce sont les informations que le réseau neuronal apprend, d'un endroit / d'une région de l'image à l'autre et finit par «savoir» ce qui est dans l'image. Le même principe est appliqué pour d'autres caractéristiques d'image (en plus de la couleur) qui peuvent être utilisées comme entrée pour le réseau neuronal. Voir ceci et cela pour les concepts d'image de base, puis passer à ce pour apprendre comment fonctionne le réseau neuronal.

Gathide
la source
1

Tous les problèmes d'apprentissage automatique sont les mêmes. Vous avez des données de train, apprenez un modèle qui représente ces données et avez la capacité de généraliser ces connaissances de cette façon que vous regroupez, classifiez, apprenez avec différents algorithmes.

Dans Reconnaissance d'images, vous disposez à nouveau d'un ensemble d'images que vous souhaitez découvrir.

  1. Ces images sont d'abord traitées et certaines fonctionnalités sont extraites des images (beaucoup de schémas de fonctionnalités d'image possibles comme SIFT, Bag of WORDS) comme si vous utilisez des pixels et leurs valeurs.
  2. Donnez ces images avec des vecteurs de fonctionnalités correspondants à votre algorithme ML (Neural Net, SVM ou autres).
  3. Apprenez un modèle
  4. Utilisez ce modèle pour reconnaître les objets qui sont suffisamment visibles sur les données d'apprentissage.

Si vous souhaitez reconnaître plusieurs éléments, utilisez plusieurs classificateurs pour chacun.

erogol
la source
1

Je voudrais également mentionner très populaire pour les réseaux de neurones convolutifs de reconnaissance d'image. Voici un lien vers une explication simplifiée d'un CNN .

En bref, dans l'image CNN est d'abord divisé en fonctionnalités, comme les bords, les formes, les collections de formes. Ensuite, ces caractéristiques sont «introduites» dans un réseau neuronal multicouche «régulier» entièrement connecté (perceptron multicouche).

Plus en détail, un ensemble de filtres est appliqué pour extraire des entités sous la forme d'une carte d'entités. Un filtre est juste une matrice (aléatoire au début) qui est appliquée à l'image d'origine afin que le produit scalaire de la matrice d'image d'origine et de la matrice de filtre soit calculé et que le résultat soit résumé. Le filtre se déplace le long de l'image d'origine d'un pixel (l'étape) à la fois et la matrice de la carte d'entités est en cours de remplissage. Une carte d'entités est créée pour chaque filtre. Ensuite, la non-linéarité a été introduite avec RELU (Rectified Linear Unit) pour chaque pixel de chaque carte d'entités. La mise en commun, par l'application de max (), sum () ou average (), se fait après convolution. Enfin, les fonctionnalités extraites de cette façon ressemblent à des morceaux «agrandis» de l'image d'origine. Ces caractéristiques sont entrées dans un réseau neuronal entièrement connecté (toutes les unités sont connectées) et les probabilités pour chaque image (disons que nous avons formé notre réseau sur des images de voitures, d'arbres et de bateaux) sont calculées après chaque passage à travers le réseau. Le réseau est formé, ce qui signifie que les paramètres (poids) et les matrices de filtres sont optimisés par rétropropagation (minimisation des erreurs de classification erronée). Lorsqu'une nouvelle image est entrée dans le réseau formé, seule la rétroaction est nécessaire pour identifier l'image (à condition que le réseau soit suffisamment précis, c'est-à-dire que nous l'avons formée avec suffisamment d'exemples, etc.) ce qui signifie que les paramètres (poids) et les matrices de filtres sont optimisés par rétropropagation (minimisation des erreurs de classification erronée). Lorsqu'une nouvelle image est entrée dans le réseau formé, seule la rétroaction est nécessaire pour identifier l'image (à condition que le réseau soit suffisamment précis, c'est-à-dire que nous l'avons formée avec suffisamment d'exemples, etc.) ce qui signifie que les paramètres (poids) et les matrices de filtres sont optimisés par rétropropagation (minimisation des erreurs de classification erronée). Lorsqu'une nouvelle image est entrée dans le réseau formé, seule la rétroaction est nécessaire pour identifier l'image (à condition que le réseau soit suffisamment précis, c'est-à-dire que nous l'avons formée avec suffisamment d'exemples, etc.)

Leo Skhrnkv
la source
0

Il est bon de savoir que ANN peut créer n'importe quelle fonction f (x) ou f (x, y, z, ..) ou n'importe quelle multifonction d'ailleurs. Mais il est également important de savoir que les fonctions ont des limites dans la façon dont elles peuvent classer les données ... il existe des relations plus complexes des sous-ensembles de jeux de puissance d'objets, qui sont importants dans la classification et ceux-ci ne sont pas décrits par ces fonctions de manière élégante ou naturelle, mais sont importants dans le langage et la classification des objets. ANN peut cependant le faire également.

zach
la source