以下链接是个人关于insightFace所有见解,如有错误欢迎大家指出,我会第一时间纠正,如有兴趣可以加QQ:17575010159 相互讨论技术。 人脸识别0-00:insightFace目录:https://blog.csdn.net/weixin_43013761/article/details/99646731: 这是本人项目的源码:https://github.com/944284742/1.FaceRecognition 其中script目录下的文件为本人编写,主要用于适应自己的项目,可以查看该目录下的redeme文件。
数据制作为了简单,已经还是拿LWF数据来做讲解,制作bin文件之前,我们需要一个pairs.txt文件,那么这个文件给干嘛的?为什么需要一个这样的文件?首先我们来看看,该文件的内容格式:
Jane_Pauley 0002 0001
Andre_Agassi 0017 0007
Blythe_Hartley 0001 0002
Natalie_Cole 0003 0002
......
......
Mary_Catherine_Correll 0001 Hilda_Fortune 0001
Ronnie_Jagday 0001 Christopher_Conyers 0001
Bob_Stoops 0001 Steve_Coterill 0001
Gillian_Anderson 0001 Mike_Flanagan 0001
可以看到该文件主要有两种格式,第一种为每行3个内容(相同图片),第二种为每行4个内容(不相同图片)主要解释如下:
Jane_Pauley 0002 0001
#在Jane_Pauley目录下的Jane_Pauley_0002.jpg与Jane_Pauley_0001.jpg为相同的一个人
Ronnie_Jagday 0001 Christopher_Conyers 0001
#在Ronnie_Jagday目录下的Ronnie_Jagday_0001.jpg
#与Christopher_Conyers_0001目录下Christopher_Conyers_0001.jpg不是相同的一个人
在源码中没有生成pairs.txt文件的脚本,在这里为大家提供一分,负责粘贴即可,insightface-master\script\generate_pairs_txt.py:
# coding:utf-8
import glob
import os.path
import numpy as np
import os
import re
'''
创建验证集bin的pairs.txt
'''
import random
# 图片数据文件夹
INPUT_DATA = '/data/zwh/1.FaceRecognition/2.Dataset/2.PaidOnData/2.Dataset_divi/1.ShunDe/4.dataset_divi/pack2/test'
pairs_file_path = '/data/zwh/1.FaceRecognition/2.Dataset/2.PaidOnData/2.Dataset_divi/1.ShunDe/4.dataset_divi/pack2/test/pairs.txt'
rootdir_list = os.listdir(INPUT_DATA)
idsdir_list = [name for name in rootdir_list if os.path.isdir(os.path.join(INPUT_DATA, name))]
id_nums = len(idsdir_list)
def produce_same_pairs():
matched_result = [] # 不同类的匹配对
for j in range(6000):
id_int= random.randint(0,id_nums-1)
id_dir = os.path.join(INPUT_DATA, '%08d'% id_int)
id_imgs_list = os.listdir(id_dir)
id_list_len = len(id_imgs_list)
id1_img_file = id_imgs_list[random.randint(0,id_list_len-1)]
id2_img_file = id_imgs_list[random.randint(0,id_list_len-1)]
id1_path = os.path.join(id_dir, id1_img_file)
id2_path = os.path.join(id_dir, id2_img_file)
same = 1
#print([id1_path + '\t' + id2_path + '\t',same])
matched_result.append((id1_path + '\t' + id2_path + '\t',same))
return matched_result
def produce_unsame_pairs():
unmatched_result = [] # 不同类的匹配对
for j in range(6000):
id1_int = random.randint(0,id_nums-1)
id2_int = random.randint(0,id_nums-1)
while id1_int == id2_int:
id1_int = random.randint(0,id_nums-1)
id2_int = random.randint(0,id_nums-1)
id1_dir = os.path.join(INPUT_DATA, '%08d'% id1_int)
id2_dir = os.path.join(INPUT_DATA, '%08d'% id2_int)
id1_imgs_list = os.listdir(id1_dir)
id2_imgs_list = os.listdir(id2_dir)
id1_list_len = len(id1_imgs_list)
id2_list_len = len(id2_imgs_list)
id1_img_file = id1_imgs_list[random.randint(0, id1_list_len-1)]
id2_img_file = id2_imgs_list[random.randint(0, id2_list_len-1)]
id1_path = os.path.join(id1_dir, id1_img_file)
id2_path = os.path.join(id2_dir, id2_img_file)
same = 0
unmatched_result.append((id1_path + '\t' + id2_path + '\t',same))
return unmatched_result
same_result = produce_same_pairs()
unsame_result = produce_unsame_pairs()
all_result = same_result + unsame_result
random.shuffle(all_result)
#print(all_result)
file = open(pairs_file_path, 'w')
for line in all_result:
file.write(line[0] + str(line[1]) + '\n')
file.close()
运行时,只需要设定src以及dst即可,就能生成pairs.txt文件,然后运行script/mydata2pack.py(该文件是本人自己编写)
import mxnet as mx
from mxnet import ndarray as nd
import argparse
import pickle
import sys
import os
import numpy as np
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'eval'))
parser = argparse.ArgumentParser(description='Package LFW images')
# general
parser.add_argument('--data-dir', default='/data/zwh/1.FaceRecognition/2.Dataset/2.PaidOnData/2.DataDivi/1.Shunde/5.dataset_divi/pack3/test', help='')
parser.add_argument('--image-size', type=str, default='112,112', help='')
parser.add_argument('--output', default='/data/zwh/1.FaceRecognition/2.Dataset/2.PaidOnData/2.DataDivi/1.Shunde/5.dataset_divi/pack3/test/shunde.bin', help='path to save.')
args = parser.parse_args()
lfw_dir = args.data_dir
image_size = [int(x) for x in args.image_size.split(',')]
def read_pairs(pairs_filename):
pairs = []
with open(pairs_filename, 'r') as f:
for line in f.readlines():
pair = line.strip().split()
pairs.append(pair)
return np.array(pairs)
def get_paths(data_dir, pairs, file_ext):
nrof_skipped_pairs = 0
path_list = []
issame_list = []
for pair in pairs:
if len(pair) == 3:
path0 = os.path.join(data_dir, pair[0])
path1 = os.path.join(data_dir, pair[1])
if int(pair[2]) == 1:
issame = True
else:
issame = False
elif len(pair) == 4:
path0 = os.path.join(data_dir, pair[0], pair[0] + '_' + '%04d' % int(pair[1]) + '.' + file_ext)
path1 = os.path.join(data_dir, pair[2], pair[2] + '_' + '%04d' % int(pair[3]) + '.' + file_ext)
issame = False
if os.path.exists(path0) and os.path.exists(path1): # Only add the pair if both paths exist
path_list += (path0, path1)
issame_list.append(issame)
else:
print('not exists', path0, path1)
nrof_skipped_pairs += 1
if nrof_skipped_pairs > 0:
print('Skipped %d image pairs' % nrof_skipped_pairs)
return path_list, issame_list
data_pairs = read_pairs(os.path.join(lfw_dir, 'pairs.txt'))
data_paths, issame_list = get_paths(lfw_dir, data_pairs, 'jpg')
print(len(data_paths))
print(len(issame_list))
lfw_bins = []
#lfw_data = nd.empty((len(lfw_paths), 3, image_size[0], image_size[1]))
i = 0
for path in data_paths:
with open(path, 'rb') as fin:
_bin = fin.read()
lfw_bins.append(_bin)
#img = mx.image.imdecode(_bin)
#img = nd.transpose(img, axes=(2, 0, 1))
#lfw_data[i][:] = img
i+=1
if i%1000==0:
print('loading data', i)
with open(args.output, 'wb') as f:
pickle.dump((lfw_bins, issame_list), f, protocol=pickle.HIGHEST_PROTOCOL)
指定输入以及输出目录即可就能生成.bin文件。bin文件的测试可以参考之前的链接: 人脸识别0-1:insightFace-模型复现-史上最全:(https://blog.csdn.net/weixin_43013761/article/details/99647292
在测试之前,我们需要配置insightface-master\recognition\config.py文件,
dataset.retina.val_targets = ['lfw', 'cfp_fp', 'agedb_30']
dataset.emore.val_targets = ['lfw', 'cfp_fp', 'agedb_30']
只需要在其中添加你自己的.bin文件,训练时,会以其为目标进行测试。现在对于源码的操作流程基本弄明白了,接下来开始分析源码的每一个细节。如果大家觉得不错,希望可以给个赞,你的赞是我的动力。