上次谈到了使用arcface处理普通分类,今天补充一下注册集的制作;
一般在人脸识别中,注册集中的图片会选择清晰的正脸样本或者各种姿态的脸部图片,但是在一般分类问题中图片会存在一些背景,然后可以使用kmeans聚类产生一个中心样本特征,将这个样本特征记录在json文件中,使用时,直接读取出来和抓拍图片的特征计算余弦距离,步骤如下:
step1:提取主干网络提取图像特征;代码参考:使用arcface+CrossEntropyLoss处理普通分类
step2.使用kmeans对某类所有训练样本提取中心特征,并将中心特征存储到json文件中;
# define criteria and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
ret, label, center = cv2.kmeans(regfeat, 1, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
center = center.squeeze().tolist()
with open("1.json", "w") as f:
json.dump(center, f)
print("写入文件完成...")
step3.当提取完所有类别的中心特征后,加载json文件,和抓拍的图像特征做对比,并通过已知的中心特征类别来划分抓拍图像特征的类别;
加载json代码:
dir_json = 'center_json_dir'
json_names = os.listdir(dir_json) #所有中心特征名
regidlist = []#保存对应标签名,json文件命名使用了标签名
regfeat = torch.FloatTensor(10, 512)#10个类别,每个中心特征为512维
for i,json_name in enumerate(json_names):
json_path = os.path.join(dir_json, json_name)
regidlist.append(json_name[:-5])
with open(json_path, 'r') as load_f:
feat_tensor = torch.tensor(np.array(json.load(load_f)))
regfeat[i, :] = feat_tensor
step4.将提取的抓拍图像特征和中心特征计算余弦距离;具体还是参考:
使用arcface+CrossEntropyLoss处理普通分类
最终效果:还是很勉强,具体还是要求分类的训练样本越丰富越好;训练样本太单一容易被错分;