Insightface是在人脸识别方向继facenet:https://github.com/davidsandberg/facenet后又一个比较完善的开源项目。
先给出论文地址:https://arxiv.org/pdf/1801.07698.pdf 项目源码地址:deepinsight/insightface
这里也提供一个如何运行该项目流程的链接,可以对齐进行参考:https://zhuanlan.zhihu.com/p/33750684
我也会将自己精简版和加注释和理解以及整理好后的训练和测试代码上传自己的Github代码仓库;链接:https://github.com/Danbinabo
InsightFace库是对我们上述论文中提出算法的开源实现. 其中不仅仅包括我们自己的算法, 也包括其他常见的人脸loss, 比如Softmax, SphereFace, AMSoftmax, CosFace, Triplet Loss等等. 除了代码实现以外, 我们还提供了打包对齐好的人脸训练数据供下载, 免除了一大堆数据准备的工作. 研究人员可以专注于人脸识别的算法实验, 工业界也可以方便的根据自己需求训练或者拿我们提供的高精度预训练模型产品化.目前暂列MegaFace榜单第一名。
环境要求
配置好训练环境后,先准备好人脸识别的数据集,这里我部分数据集是用的lfw数据集http://vis-www.cs.umass.edu/lfw/lfw.tgz,需要者去对应官网下载。
一般情况下人脸识别的注册库同一个id的人的图片应该不少于2-3张,越好的算法其训练数据应该尽可能的包含每个人不同年龄,不同环境,不同姿态等场景下的人脸图片。
这里因为lfw数据集里有很多人脸id文件夹只有一张或者两者图片,这里我采取的策略是去除这些数据:
# coding:utf-8
#将训练集中同一id但人脸图片数<=2的文件夹删除
import os
import shutil
src = '../lfw' #lfw数据集
folders_1 = os.listdir(src) # 所有人脸id文件夹
for folder in folders_1:
imgs = os.listdir(os.path.join(src,folder)) # 该人脸id文件夹下所有图片
if(len(imgs)<=2):#Aaron_Eckhart
new_path = os.path.join(src,folder)
#os.rmdir(new_path)
#os.remove(new_path)
shutil.rmtree(new_path)
整个流程/步奏大概分为以下:
########### part1:数据集准备 ##############
# 1:准备训练用到的数据集,这里用到了lfw数据集,放在data/train目录
########### part2:人脸检测及对齐 ###########
# 2:运行align文件下align_dataset_mtcnn.py进行人脸检测和人脸对齐(统一大小112*112),
检测和缩放后的人脸图像保存在lfw_112文件夹下,格式和以前一样;
########### part3:Insightface训练集准备 ###########
# 3:在命令行运行im2rec.py文件,生成图像列表lst文件,具体如下:
在与lfw_112同级的文件夹中打开命令行,
执行 python C:\Users\HP\Desktop\face_insighrface\get_mx_data\im2rec.py --list
--recursive train C:\Users\HP\Desktop\face_insighrface\data\lfw_112
# 这样就制作.lsh完成。
# 4:从列表生成rec文件和idx文件
在与lfw_112同级的文件夹中打开命令行,执行
python C:\Users\HP\Desktop\face_insighrface\get_mx_data\im2rec.py --pass-through train.lst C:\Users\HP\Desktop\face_insighrface\data
这样就生成了train.idx和train.rec用于训练的数据
# 5:自己建一个property,里面写入自己训练的数据量 112 112 ###图像数量及大小(N,112,112)
# end:至此,lst、rec、idx文件已全部生成
########### part4:Insightface验证集bin文件准备 ###########
# 1:运行get_pares.py 生成验证集的pares.txt#[类内和类间个数相同]
#:这里类内和类间交替写入[例如300对类内,300对类间],一共分别写入3000/6000对类内和类间作验证集,这里生成get_pares.py脚本在后面给出。
# 2:运行python lfw2pack.py --data-dir ../data/valid --image-size "112,112" --output ./val.bin
# 生成val.bin
########### part5:Insightface网络训练 ###########
# src-->运行train_softmax.py
完成上述工作后就完成了所有所有用于训练Insightface人脸识别模型的准备工作,运行train_softmax.py即开始训练模型,这里要说的是Insightface提供了多种人脸识别的loss函数,这里可以自己选择,训练过程中模型收敛很慢很慢,公司在训练这个模型时在几百万id的数据集上进行迭代,8张卡训练一个acc较高的模型花了半个月,后续还要进行不断的改进迭代,所以刚开始训练很长一段时间acc为0是再正常不过的事了。
########### part6:Insightface模型测试和验证 ###########
test_run-->1:1_align_face.py --- 对注册库进行人脸检测、裁剪和对齐:这里人脸注册库文件夹和训练时文件夹一样,一个文件夹人脸id注册时放至少>=2-3张人脸图像。
-->2:2_demo.py --- 调用摄像头进行测试
这里给出两张测试效果图:纳摩问题来了,在很多实际应用中,如测试图2所示的用手机图像进行人脸检测和识别是不能通过和识别的,那就引入了活体检测的概念,之前也做了一段时间这方面的研究,有兴趣的朋友可以去试试。