[PYTHON] Créer un outil de reconnaissance de visage à l'aide de TensorFlow

introduction

s_スクリーンショット 2016-07-27 12.37.01.png

Bonjour, c'est Hironsan.

La reconnaissance faciale est une technologie qui détecte une personne dans une image et l'identifie. La reconnaissance faciale peut être intégrée aux systèmes de caméras de surveillance pour améliorer la sécurité, ou intégrée aux robots pour reconnaître les visages de la famille.

Cette fois, je vais créer un réseau de neurones convolutifs à l'aide de TensorFlow et créer un dispositif de reconnaissance de visage à l'aide d'un ensemble de données existant.

Public cible

Vous pouvez voir la théorie de CNN en regardant ce qui suit.

Préparation

Installez TensorFlow

Veuillez vous référer au site officiel pour l'installation de TensorFlow.

Télécharger les données

Tout d'abord, préparez l'ensemble de données. Cette fois, nous utiliserons l'ensemble de données d'image de visage suivant.

Cet ensemble de données contient 10 images pour chacune de 40 personnes. Chaque taille d'image est de 64x64 et est une image en échelle de gris. スクリーンショット 2016-07-25 22.30.04.png

Chargement des images

Après avoir préparé l'ensemble de données, chargez l'image. PyFaceRecognizer/example/input_data.py

import input_data
dataset = input_data.read_data_sets('data/olivettifaces.mat')

Ici, l'ensemble de données contient des données d'entraînement, des données de validation et des données de test. En outre, la taille de l'image est réduite à 32x32 lorsqu'elle est lue.

Construire un réseau neuronal convolutif

La reconnaissance faciale est effectuée à l'aide du réseau neuronal convolutif (CNN). L'image globale est la suivante.

スクリーンショット 2016-07-27 13.19.06.png

Les convolution, pool et fc de chaque couche représentent respectivement la couche de convolution, la couche de pooling et la couche entièrement connectée. ReL dans la colonne de fonction représente une fonction linéaire normalisée. Le tableau ci-dessous montre les paramètres.

Type / nom du calque pièce foulée Taille de la carte de sortie une fonction
data - - 32 x 32 x 1 -
conv1 5 x 5 1 32 x 32 x 32 ReL
pool1 2 x 2 2 16 x 16 x 32 -
conv2 5 x 5 1 16 x 16 x 64 ReL
pool2 2 x 2 2 8 x 8 x 64 -
fc3 - - 1 x 1 x 1024 ReL
fc4 - - 1 x 1 x 40 softmax

Si vous l'écrivez dans le code, ce sera comme suit. C'est presque pareil. PyFaceRecognizer/example/run.py

def inference(input_placeholder, keep_prob):
    W_conv1 = weight_variable([5, 5, 1, 32])  #Les deux premiers sont des tailles de patch. Le reste est le nombre de canaux d'entrée et de sortie
    b_conv1 = bias_variable([32])

    x_image = tf.reshape(input_placeholder, [-1, 32, 32, 1])  #Les deuxième et troisième dimensions sont la largeur et la hauteur de l'image, et la dernière dimension est le nombre de canaux de couleur.

    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)  #Pliant
    h_pool1 = max_pool_2x2(h_conv1)  #mise en commun maximale

    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])

    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)

    W_fc1 = weight_variable([8 * 8 * 64, 1024])
    b_fc1 = bias_variable([1024])

    h_pool2_flat = tf.reshape(h_pool2, [-1, 8 * 8 * 64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

    W_fc2 = weight_variable([1024, 40])
    b_fc2 = bias_variable([40])

    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)  #Sortie donc

    return y_conv

Formation et évaluation de modèles

J'ai écrit le code du modèle par inférence. Ensuite, nous écrirons le code pour entraîner le modèle. C'est la perte et la formation. En perte, l'entropie croisée est calculée et en entraînement, l'optimiseur Adam est utilisé pour mettre à jour les paramètres. Le code est comme suit.

def loss(output, supervisor_labels_placeholder):
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(supervisor_labels_placeholder * tf.log(output), reduction_indices=[1]))
    return cross_entropy


def training(loss):
    train_step = tf.train.AdamOptimizer(1e-4).minimize(loss)
    return train_step

La reconnaissance faciale est effectuée en utilisant l'inférence, la perte et l'entraînement définis ci-dessus. Génère un journal toutes les 100 itérations du processus de formation. J'ai mis keep_peob à 1.0 pour qu'il ne disparaisse pas lors des tests.

with tf.Session() as sess:
    output = inference(x, keep_prob)
    loss = loss(output, y_)
    training_op = training(loss)

    init = tf.initialize_all_variables()
    sess.run(init)

    for step in range(1000):
        batch = dataset.train.next_batch(40)
        sess.run(training_op, feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
        if step % 100 == 0:
            print(sess.run(loss, feed_dict={x: batch[0], y_: batch[1], keep_prob: 1.0}))

    correct_prediction = tf.equal(tf.argmax(output, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    print('test accuracy %g' % accuracy.eval(feed_dict={x: dataset.test.images, y_: dataset.test.labels, keep_prob: 1.0}))

Courir

Le résultat de l'exécution ressemble à celui ci-dessous. Vous pouvez voir comment l'entropie croisée diminue.

9.8893
1.68918
0.602403
0.261183
0.0490791
0.0525591
0.0133087
0.0121071
0.00673524
0.00580989

Code source

Vous pouvez télécharger et exécuter le code source à partir des référentiels suivants.

en conclusion

J'ai essayé la reconnaissance faciale sur un ensemble de données de visage existant à l'aide d'un réseau neuronal convolutif. Ensuite, j'aimerais essayer la détection de visage et la reconnaissance de visage à l'aide d'images acquises en temps réel depuis la caméra.

Matériel de référence

Recommended Posts

Créer un outil de reconnaissance de visage à l'aide de TensorFlow
J'ai créé un jeu ○ ✕ avec TensorFlow
Créer un discriminateur Sato Yohei en utilisant OpenCV et TensorFlow
Détection de visage à l'aide d'un classificateur en cascade
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - (1) Introduction
J'ai créé un classificateur de visage Dir en gray en utilisant l'extraction de visage TensorFlow-④
J'ai essayé de jouer au jeu ○ ✕ en utilisant TensorFlow
Inférence d'image de visage à l'aide de Flask et TensorFlow
Faisons un site multilingue en utilisant flask-babel
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - Test de classification de visage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑥ Programme d'apprentissage
J'ai essayé de faire un classificateur de visage Dir en gris en utilisant TensorFlow --⑬ Jouer (final)
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑧ Exécution d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑫ Version Web
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --⑦ Modèle d'apprentissage
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow --② Construction de l'environnement
Une histoire addictive lors de l'utilisation de tensorflow sur Android
Une histoire sur l'apprentissage automatique simple avec TensorFlow
[Chat De Tornado] Créez un chat en utilisant WebSocket dans Tornado
Faisons un module pour Python en utilisant SWIG
J'ai créé un classificateur de visage Dir en gray en utilisant TensorFlow - Préparation de la version Web
Faisons un jeu de squash
Faire un décorateur de fonction
Je suis tombé sur l'utilisation de MoviePy, alors prenez note
Faire une matrice de distance
Comment créer un package Python à l'aide de VS Code
Essayez la détection des visages en temps réel à l'aide d'une webcam
Je vais créer un mot de passe!
Créer un bouton Nyan
Créons facilement un gif mathématique en utilisant Google Colaboratory
Créez un jeu à la Tetris!
Créer un décodeur Base64
J'ai essayé d'héberger un modèle d'apprentissage en profondeur de TensorFlow à l'aide de TensorFlow Serving
J'ai fait un modèle VGG16 en utilisant TensorFlow (en chemin)
J'ai fait un chronomètre en utilisant tkinter avec python
[Introduction à Tensorflow] Comprendre correctement Tensorflow et essayer de créer un modèle
J'ai créé un éditeur de texte simple en utilisant PyQt
Créons un bot LINE en utilisant divers services [ngrok edition]
Faisons un robot Discord.
Créer un backend Blueqat ~ Partie 1
Créer un backend Blueqat ~ Partie 2
Mesure du temps à l'aide d'une horloge
J'ai essayé la reconnaissance faciale avec Face ++
[Django] Créer un menu déroulant
Créer un LINE BOT (chat)
Tutoriel Pepper (5): Utilisation d'une tablette
Créer un bookmarklet en Python
Utiliser une imprimante avec Debian 10
Faites une loterie avec Python
Faire de Responder un démon (service)
Une note sur TensorFlow Introduction
J'ai essayé d'utiliser magenta / TensorFlow
Décrivez le visage avec Dlib (1)
Faire un feu avec kdeplot
Un mémorandum d'utilisation de eigen3
Faire une impression de forage de calcul
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
Fabriquez un incubateur à CO2 simple à l'aide de Raspberry PI et d'un capteur de CO2 (MH-Z14A)
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python