1. Projeto
O sistema de reconhecimento facial projeto. Item idéia básica é a seguinte: Para a imagem de entrada, primeiro, detecção de face por rede MTCNN, a imagem do rosto adquiriu, em seguida, insightface para extração de características facial, comparação de dados no banco de dados, identificar o rosto. estrutura do item, como mostrado:
Sistema de reconhecimento de face FIG configuração 1
Primeiro precisa treinar rede mtcnn, identificar a detecção de rosto. rede de formação MTCNN no " algoritmo para compreender e implementar MTCNN foi alcançado" neste modelo pode ser usado diretamente treinados. Para insightface, a necessidade de treinamento insightface.
Este ambiente usos do projeto: ubuntu16.04 + RTX2070S.
2. processo de implementação do projeto
2.1 Processamento de Dados
2.1.1 formação de processamento de dados
Utilizado no projeto CASIA-Webface dados, os dados baixar os seguintes arquivos:
Que, train.idx e dados train.rec é usado para treinamento, eo resto dos arquivos bin são testes conjuntos de dados.
Primeiro, crie uma pasta utils, componentes comuns são armazenados dentro dos usos do projeto, que no arquivo de configuração global config.py, o código é a seguinte:
1 importação OS 2 3 4 # prepare_data parâmetros 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 # parâmetros do modelo 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 # parâmetros de formação 25 s = 64,0 26 m = 0,5 27 class_num = 85742 28 lr_steps = [40000, 60000, 80000 ] 29 lr_values = [0,004, 0,002, 0,0012, 0,0004 ] 30 impulso = 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 nome_do_modelo = " Arcface " 37 train_step 1000001 = 38 model_path = " ../model/Arcface_model " 39 gpu_num = 2 40 model_save_gap = 30000 41 42 43 # parâmetros de avaliação 44 eval_dropout_flag =Falsa 45 eval_bn_flag = falsos 46 47 48 # parâmetros de banco de dados cara 49 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 "
Porque os dados são armazenados formato mxnet, para que você primeiro precisa converter os dados em um formato TFrecord criar o arquivo gen_tfrecord_mxdata.py no diretório raiz do projeto, o código é a seguinte:
1 importação tensorflow como tf 2 importação mxnet como mx 3 importação SO 4 importação io 5 importação numpy como np 6 importação cv2 7 importação tempo 8 de scipy importação variado 9 importação argparse 10 de utils importar config- 11 12 13 def arg_parse (): 14 15 analisador = argparse.ArgumentParser () 16 parser.add_argument ( " --read_dir " , default = config.mxdata_dir, type = str, help = ' diretório para ler dados ' ) 17 parser.add_argument ( " --save_dir " , default = config.tfrecord_dir, type = str, help = ' caminho para guardar o ficheiro TFRecord ' ) 18 19 de retorno parser.parse_args () 20 21 22 def principal (): 23, 24 com tf.python_io.TFRecordWriter (save_dir) como escritor: 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 cabeçalho, _ = mx .recordio.unpack (s) 30 imgidx = lista (gama (1 , int (header.label [0]))) 31 etiquetas = [] 32 para i em imgidx: 33 img_info = imgrec.read_idx (i) 34 cabeçalho, img =mx.recordio.unpack (img_info) 35 rótulo = int (header.label) 36 labels.append (etiqueta) 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 exemplo = tf.train.Example (características = tf.train.Features (funcionalidade = { 43 " img " : tf.train. característica (bytes_list = tf.train.BytesList (valor = [img_raw])), 44 "rótulo " : tf.train.Feature (int64_list = tf.train.Int64List (valor = [rótulo])), 45 })) 46 47 writer.write (example.SerializeToString ()) 48 49 se i% 10000 == 0 : 50 de impressão ( ' % d fotos processado ' % i, " tempo: " , time.time () - começar a) 51 52 53 se __name__ == " __main__ " : 54 55 analisador = arg_parse () 56 57 save_dir = parser.save_dir 58 read_dir = parser.read_dir 59 60 começam = time.time () 61 62 principal ()
Pelo código acima, os dados de treinamento é convertido em formato de dados mxnet formato TFRecord.
ArcFace análise de perda e de código ver insightface introdução,