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.
Vous pouvez voir la théorie de CNN en regardant ce qui suit.
Veuillez vous référer au site officiel pour l'installation de TensorFlow.
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.
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.
La reconnaissance faciale est effectuée à l'aide du réseau neuronal convolutif (CNN). L'image globale est la suivante.
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
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}))
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
Vous pouvez télécharger et exécuter le code source à partir des référentiels suivants.
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.