[PYTHON] Reconnaissance faciale des membres Momokuro par TensorFlow (partie 2)

Partie 1: http://qiita.com/kenmaz/items/4b60ea00b159b3e00100 Partie 2: http://qiita.com/kenmaz/items/ef0a1308582fe0fc5ea1

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 neuronal convolutif pour identifier les visages des membres de "Momoiro Clover Z".

Processus d'apprentissage

La dernière fois J'ai pu faire un modèle avec une précision de 85%, mais comme je suis parti d'un état ignorant, je ne pouvais pas du tout obtenir de précision au début. fait. Notez le processus d'essais et d'erreurs car il peut être utile à quelqu'un.

Première version

Amélioration des données d'entraînement

Amélioration des données d'entraînement 2

De longues heures d'apprentissage

Jusqu'à présent, j'ai réussi à arrêter de m'entraîner avec mon MacBook Pro en quelques centaines d'étapes. ――Cependant, si vous regardez l'exemple de code, etc., max_step = 100 000, donc je pense que l'apprentissage n'est pas suffisant en premier lieu. «J'ai décidé de créer un environnement sur ec2, d'emprunter diverses instances et de les faire pivoter.

Examen des données de test

En regardant la précision pour chaque membre, c'était comme suit.

member précision
Reni 77%
Natsunako 44%
Shiori 73%
Ahrin 58%
Kyouka 88%

Ce n'est pas que je ne pensais pas que "Ouais, je veux être recommandé parce que j'ai un visage distinctif ... Il y a une histoire selon laquelle un bel homme et une belle femme sont plus proches du visage moyen ...", mais je suis calme. Quand j'y pense, j'ai eu l'idée que la variation dans les données d'entraînement elles-mêmes serait trop grande. (Angle de cuisse, et je suis convaincu que Kyouka est relativement précis. ・)

Les données d'entraînement que j'ai utilisées jusqu'à présent sont une collection des résultats de leur recréation plusieurs fois, de sorte que les programmes qui les génèrent sont également légèrement différents, ce qui semble avoir conduit à des variations dans les données d'entraînement.

Nous nous préparons également à le publier en tant que service web en parallèle, et nous avons dû faire quelque chose sur la partie reconnaissance faciale, donc une logique de reconnaissance faciale stable pour qu'il n'y ait pas de variation entre chaque membre. Le résultat de l'ajustement a été expliqué dans la première partie Code actuel. Recréez toutes les données d'entraînement avec ce gars et entraînez-vous à nouveau.

=> ** Précision 77% **

Pliez et ajoutez une couche de regroupement

`` J'ai senti que des données d'entraînement stables avaient été créées, j'ai donc ajouté une couche au modèle ici pour l'approfondir. C'était le [code du modèle actuel] expliqué la dernière fois (https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_model.py)

Donc, tout en faisant diverses erreurs stupides, je suis passé par essais et erreurs. .. ** J'ai réalisé du fond du cœur que la qualité des données d'entraînement et des entraînements répétitifs sont importants **.

ec2 pratique

Soit dit en passant, dans un cas comme celui-ci où vous avez besoin d'une machine haute performance sur place, un environnement comme aws est vraiment pratique. C'est cher cependant. Depuis que j'ai touché chaque instance de manière variée pendant l'apprentissage, la performance approximative est comme ça.

Lorsque j'essaie de créer un réseau neuronal très profond (16 couches) et d'exécuter un entraînement.

Type d'instance Performances approximatives
t2.micor N/A (Ne peut pas être exécuté en raison d'un manque de ressources)
MacBook Pro à portée de main 3.4 examples/sec; 34.967 sec/batch)
c4.4xlarge 3.9 examples/sec; 31.142 sec/batch
c4.8xlarge 8.6 examples/sec; 14.025 sec/batch

c4.4xlarge, 2 $ par heure, mais rapide. c4.4xlarge est à peu près identique à MBP. Cependant, tous sont le résultat de l'utilisation de la version CPU de TensorFlow, je voudrais donc essayer la construction GPU à l'avenir pour voir à quelle vitesse elle est.

De plus, au début, j'essayais de faire diverses choses avec mon VPS, mais avec CentOS6, la combinaison de la version Glibc et de numpy n'est pas bonne (CentOS6 ne prend en charge que la glibc v2.12, numpy prend en charge Glibc 2.15 Request => CentOS7 est requis), donc c'était ennuyeux, donc ec2 est pratique car vous pouvez créer un environnement et le détruire. C'est cher cependant.

Pour que les résultats de la formation puissent être frappés de l'extérieur

Les modèles entraînés peuvent désormais utiliser tf.train.Saver pour générer et charger des instantanés de poids et de valeurs de biais ajustés à plusieurs reprises sous forme de fichier modèle.

Cette fois, le fichier de modèle est sorti chaque fois que 1000 étapes sont exécutées. https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_main.py

Si vous souhaitez créer un service Web à l'aide des résultats d'apprentissage, vous pouvez écrire du code qui lit ce fichier de modèle, exécute l'inférence et renvoie les résultats côté Web.

J'ai donc préparé un code qui, après avoir passé le chemin du fichier image, exécute l'inférence sur l'image et renvoie le résultat de la classification des membres. https://github.com/kenmaz/momo_mind/blob/master/deeplearning/mcz_eval.py

result = mcz_eval.execute([imgfile1], '.', ckpt_path)

Vous pouvez exécuter du code tel que lire le fichier de modèle dans le chemin d'accès de ckpt_path et renvoyer le résultat de l'inférence sur imgfile1.

Terminer en tant qu'application Web

Maintenant que mcz_eval.py est créé, tout ce que vous avez à faire est de procéder à une programmation Web familière. Cependant, je n'ai jamais écrit d'application Web en Python, donc après de nombreuses recherches, la combinaison de Flask + uWSGI + Nginx semble avoir du sens. En passant, il est implémenté discrètement en référence aux pages suivantes.

Résumé et avenir

Cela s'est avéré être un article assez grossier, mais pour le moment, c'était une histoire selon laquelle quelque chose comme ça a été fait par essais et erreurs.

Ce que je veux faire dans le futur

――Je souhaite améliorer la précision (twango Merci pour vos conseils) ――Je voudrais visualiser "à quel type de fonctionnalité avez-vous réagi et produit le résultat de l'inférence". Par exemple, "il y a une rangée de pixels bosselés = Natsunako" et "les yeux ont tendance à être séparés = Kyouka". En fait, je l'ai essayé une fois dans GW, mais cela n'a pas fonctionné. Je veux réessayer. --Je veux essayer la construction GPU ――Je veux jouer avec d'autres types, tels que les réseaux neuronaux récursifs.

c'est tout!

Recommended Posts

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