1. projet
Le projet de système de reconnaissance faciale. Point idée de base est la suivante: Pour l'image d'entrée, d'abord, la détection des visages par le réseau MTCNN, l'image de visage acquise, puis insightface pour l'extraction de traits du visage, la comparaison des données dans la base de données, identifier le visage. Structure d'objet comme indiqué:
Système de reconnaissance de visage configuration figure 1
Tout d' abord besoin de former le réseau mtcnn, identifier la détection de visage. réseau de formation MTCNN dans le « algorithme pour comprendre et mettre en œuvre MTCNN a été atteint » dans ce modèle peut être utilisé directement formé. Pour insightface, la nécessité d' une formation de insightface.
Ce projet utilise l'environnement: ubuntu16.04 + RTX2070S.
2. Processus de mise en œuvre du projet
2.1 Traitement des données
2.1.1 Formation de traitement de données
Utilisé dans le projet CASIA-Webface données, données télécharger les fichiers suivants:
Ce qui, train.idx et les données train.rec est utilisé pour la formation, et le reste des fichiers bin sont des ensembles de données de test.
Tout d'abord, créez un dossier utils, des composants communs sont stockés dans les utilisations du projet, qui dans le fichier de configuration globale config.py, le code est le suivant:
1 import os 2 3 4 # paramètres prepare_data 5 mxdata_dir = " ./data " 6 tfrecord_dir = " ./data/CASIA.tfrecords " 7 lfw_dir = ' ./data/lfw ' 8 lfw_save_dir = ' ./data/lfw_face ' 9 eval_dir = ' ./data/lfw_face.db ' 10 eval_datasets_self = [ ' ./data/lfw_face.db ' ] 11 eval_datasets = [ " ./data/lfw.bin ", " ./Data/agedb_30.bin " , " ./data/calfw.bin " , 12 " ./data/cfp_ff.bin " , " ./data/cfp_fp.bin " , " ./data/cplfw.bin " ' ./data/lfw_face.db ' ] 13 14 15 # de paramètres de modèle 16 model_params = { " backbone_type " : " resnet_v2_m_50 " 17 " out_type " :" E " 18 " bn_decay " : 0,9 , 19 " weight_decay " : 0,0005 , 20 " keep_prob " : 0,4 , 21 " embd_size " : 512 } 22 23 24 # paramètres d'entraînement 25 s = 64,0 26 m = 0,5 27 class_num = 85742 28 de lr_steps = [40000, 60000, 80000 ] 29 lr_values = [0,004, 0,002, 0,0012, 0,0004 ] 30 impulsion = 0,9 31 addrt = " ./data/CASIA.tfrecords " 32 model_patht = " ./model/Arcface_model " 33 img_size = 112 34 batch_size = 128 35 addr = " ../data/CASIA.tfrecords " 36 model_name = " Arcface " 37 train_step = 1000001 38 model_path = " ../model/Arcface_model " 39 gpu_num = 2 40 model_save_gap = 30000 41 42 43 # paramètres d'évaluation 44 eval_dropout_flag =Faux 45 eval_bn_flag = False 46 47 48 # paramètres de base de données de la face 49 de custom_dir = ' ../data/custom ' 50 arc_model_name = ' Arcface-330000 ' 51 arc_model_path = ' ./model/Arcface_model/Arcface-330000 ' 52 53 base_dir = ' ./model/MTCNN_model ' 54 mtcnn_model_path = [os.path.join (base_dir, " Pnet_model / Pnet_model.ckpt-20000 " ), 55 os.path.join (base_dir," Rnet_model / Rnet_model.ckpt-40000 " ), 56 os.path.join (base_dir, " Onet_model / Onet_model.ckpt-40000 " )] 57 embds_save_dir = " ../data/face_db "
Étant donné que les données sont stockées format mxnet, vous devez d'abord convertir les données dans un format TFrecord créer un fichier gen_tfrecord_mxdata.py dans le répertoire racine du projet, le code est le suivant:
1 import tensorflow comme tf 2 import mxnet que mx 3 import os 4 import io 5 import numpy comme np 6 import CV2 7 import temps 8 de scipy import misc 9 import argparse 10 de utils importent config 11 12 13 def arg_parse (): 14 15 analyseur = argparse.ArgumentParser () 16 parser.add_argument ( " --read_dir " , par défaut = config.mxdata_dir, type = str, help = ' répertoire pour lire les données ' ) 17 parser.add_argument ( " --save_dir " , par défaut = config.tfrecord_dir, type = str, aide = ' chemin d'enregistrer le fichier TFRecord ' ) 18 19 retour parser.parse_args () 20 21 22 def main (): 23 24 avec tf.python_io.TFRecordWriter (save_dir) comme écrivain: 25 idx_path = os.path.join (read_dir , ' train.idx ') 26 bin_path = os.path.join (read_dir, ' train.rec ' ) 27 imgrec = mx.recordio.MXIndexedRecordIO (idx_path, bin_path, ' r ' ) 28 s = imgrec.read_idx (0) 29 l' en- tête, _ = mx .recordio.unpack (s) 30 imgidx = liste (portée (1 , int (header.label [0]))) 31 étiquettes = [] 32 pour i dans imgidx: 33 img_info = imgrec.read_idx (i) 34 en- tête, img =mx.recordio.unpack (img_info) 35 label = int (header.label) 36 labels.append (label) 37 img = io.BytesIO (img) 38 img = misc.imread (img) .astype (np.uint8) 39 img = cv2.cvtColor (img, cv2.COLOR_RGB2BGR) 40 img_raw = img.tobytes () 41 42 exemple = tf.train.Example (= caractéristiques tf.train.Features (feature = { 43 " img " : tf.train. caractéristique (bytes_list = tf.train.BytesList (value = [img_raw])), 44 "étiquette " : tf.train.Feature (int64_list = tf.train.Int64List (value = [label])), 45 })) 46 47 writer.write (example.SerializeToString ()) 48 49 si i% 10 000 == 0 : 50 impression ( ' % d images traitées ' % i, " temps: " , time.time () - commencer) 51 52 53 si __name__ == " __main__ " : 54 55 parser = arg_parse () 56 57 save_dir = parser.save_dir 58 read_dir = parser.read_dir 59 60 begin = time.time () 61 62 main ()
Par le code ci-dessus, les données de formation est converti en format de données mxnet le format TFRecord.
analyse des pertes ArcFace et le code , voir insightface introduction,