人脸识别0-03:insightFace-测试集数据制作-史上最全

以下链接是个人关于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文件,训练时,会以其为目标进行测试。现在对于源码的操作流程基本弄明白了,接下来开始分析源码的每一个细节。如果大家觉得不错,希望可以给个赞,你的赞是我的动力。

  • 35
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南才尽,年少无知!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值