Reconnaissance faciale des membres Momokuro par TensorFlow (deuxième partie)

Cliquez ici pour la première partie http://qiita.com/kenmaz/items/4b60ea00b159b3e00100

Ceci est une continuation de l'histoire d'un ingénieur logiciel qui est complètement nouveau dans l'apprentissage automatique et l'apprentissage profond, et a créé une application qui utilise un réseau de neurones convolutifs pour identifier les visages des membres de "Momoiro Clover Z".

deeplearning Dans la première partie, nous avons expliqué comment extraire des images de visage à partir des images collectées par le robot d'exploration et générer des données d'entraînement. À partir de là, nous allons enfin commencer à apprendre.

Le code de la partie apprentissage automatique est attaché à Tensorflow Deep MNIST for Experts et CIFAR. -10 Classification J'ai recommandé l'implémentation basée sur le code.

Générer et lire CSV

gen_testdata.py https://github.com/kenmaz/momo_mind/blob/master/deeplearning/gen_testdata.py

Tout d'abord, c'est la partie qui alimente les données d'apprentissage de Tensorflow, mais comme l'exemple de code de MNIST, j'ai décidé de générer un CSV et de le charger. Dans la première partie, les images des membres de la cuisse d'apprentissage ont été divisées en dossiers sur le Finder Mac, mais en fonction de la structure des dossiers / fichiers,

Chemin du fichier image de formation,Nom du membre 0-Valeur numérique correspondant à 4

J'ai écrit un petit script qui crache CSV au format.

À propos, dans Tensorflow, les données d'entraînement sont sérialisées avec le tampon de protocole comme celui-ci et [TFRecords] Il semble recommandé d'exporter au format de fichier (https://www.tensorflow.org/versions/r0.8/how_tos/reading_data/index.html#standard-tensorflow-format). C'était un peu gênant, alors j'ai abandonné cette fois.

Saisie des données d'entraînement

Ce qui suit est un script qui lit CSV et construit Tensor qui est les données d'entrée du modèle décrit plus loin. mcz_input.py https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_input.py

Lisez un fichier texte dans TensorFlow tf.TextLineReader ou décodez les données lues en csv Des classes et des fonctions pratiques telles que tf.decode_csv function sont préparées à l'avance. Si vous lisez les données d'entrée à l'aide de celles-ci, il s'agit du format de données d'entrée de TensorFlow tel qu'il est [tf.Tensor](https://www.tensorflow.org/versions/r0.8/api_docs/python/framework.html# Tensor) sera construit automatiquement.

De plus, en tant que technique d'apprentissage automatique, l'image de l'échantillon d'apprentissage est «gonflée» en la retournant à gauche et à droite, en la tournant un peu, en l'agrandissant et en modifiant le contraste de manière aléatoire (appelée «expansion des données»). Il semble y en avoir), mais la plupart de ces processus sont également préparés par TensorFlow.

Retournez aléatoirement à gauche et à droite tf.image.random_flip_up_down (), changez la luminosité au hasard tf .image.random_brightness (), modifiez également le contraste [tf.image.random_contrast](https: / /www.tensorflow.org/versions/r0.8/api_docs/python/image.html#random_contrast) etc.

Au début, je n'ai pas remarqué l'existence de ces fonctions et j'ai essayé d'utiliser openCV par moi-même, mais il semble préférable d'utiliser celle de TensorFlow avec obéissance.

Entrée par lots

Cette fois, en tant que données d'entraînement, nous avons préparé un total de 750 images faciales, 150 pour chaque membre. ** 120 ** images sont extraites aléatoirement de celles-ci, et une fois les données développées et randomisées comme décrit ci-dessus, elles sont insérées collectivement comme entrée du modèle d'apprentissage. Ce travail est défini comme une étape et l'apprentissage est répété pendant 1 000 à 30 000 étapes.

Modèle d'apprentissage

Probablement le code le plus important que j'ai écrit cette fois, c'est un script qui construit un modèle d'apprentissage / d'inférence. mcz_model.py https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py

Examen du modèle 1

J'ai d'abord essayé de définir le modèle suivant du réseau neuronal convolutif. https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py#L6

-contribution(28x28 3ch couleur)
-Pliage couche 1
-Mise en commun de la couche 1
-Pliage couche 2
-Mise en commun de la couche 2
-Couche 1 entièrement connectée
-Couche 2 entièrement connectée

C'est presque le même que l'échantillon CIFAR-10. Avec ce modèle, la précision de la classification n'était que d'environ ** 65 ~ 70% **.

En premier lieu, l'entrée est 28x28 car j'ai apporté l'échantillon de CIFAR-10 tel quel, mais 28x28 est, par exemple, une image 28x28. スクリーンショット 2016-05-24 3.19.59.png Hmm, qui est-ce? (** Je comprends **)

Cela semble être très difficile pour les humains de le faire car nous devons découvrir les caractéristiques de cette image approximative. Je veux faire une résolution plus élevée.

Examen de la partie modèle 2

Cela dit, je voulais améliorer la précision, j'ai donc doublé la résolution de l'image d'entrée et ajouté plus de couches de convolution et de mise en commun une par une. https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py#L53

-contribution(56x56 3ch couleur)
-Pliage couche 1
-Mise en commun de la couche 1
-Pliage couche 2
-Mise en commun de la couche 2
-Pliage couche 3
-Mise en commun de la couche 3
-Couche 1 entièrement connectée
-Couche 2 entièrement connectée

J'ai défini un modèle du réseau de neurones convolutif. Ensuite, la précision a finalement augmenté à environ ** 85% **.

En parlant d'images 56x56, ça ressemble à ça. スクリーンショット 2016-05-24 3.19.36.png Vous savez qui cette fois, non?

Ce n'est qu'à ce niveau de résolution que les ** bosses peuvent être reconnues **. Après tout, je veux ça.

Eh bien, j'ai pensé que si nous augmentions la résolution et ajoutions plus de couches, nous pourrions améliorer encore plus la précision. En fait, j'ai essayé de créer une version avec plus de couches et une résolution d'entrée plus élevée, mais cela n'a pas fonctionné car l'entropie croisée ne convergeait pas. La cause n'est pas bien comprise. Selon le blog de M. Sugiyan, il était possible d'atteindre 90-95% en saisissant 112x112. D'où vient la différence? ..

Graphique modèle

TensorFlow a une fonction pour afficher le modèle d'apprentissage sous forme de graphique, je le posterai donc ci-dessous avec une explication approximative.

スクリーンショット 2016-05-24 3.09.13.png

C'est une image de données circulant de bas en haut.

La fin de la deuxième partie

J'ai bientôt sommeil, alors je vais continuer à une date ultérieure.

Recommended Posts

Reconnaissance faciale des membres Momokuro par TensorFlow (deuxième partie)
Reconnaissance faciale des membres Momokuro par TensorFlow (partie 2)
Reconnaissance faciale des membres Momokuro par TensorFlow (partie 2)
Reconnaissance faciale des membres Momokuro par TensorFlow (deuxième partie)
Tutoriel TensorFlow - Reconnaissance d'image (traduction)
Reconnaissance faciale en temps réel avec vidéo acquise par getUserMedia [HTML5, openCV]