项目整体流程图:
简单简述一下你做的人脸识别项目的整个流程?
首先利用dlib进行人脸的数据集采集和建立
- 通过摄像头采集人脸图像
- 建立人脸图像的label信息
- 建立个人人脸数据库
数据库初始化
数据库的初始化具体执行的过程就是:
-
遍历数据库中所有的图片。
-
检测每个图片中的人脸位置。
-
利用mtcnn将人脸截取下载。
-
将获取到的人脸进行对齐。
-
利用facenet将人脸进行编码。
-
将所有人脸编码的结果放在一个列表中,同时也会将它们的名字放入列表中,这两个列表中的相同位置的元素都是对应的,
方便后面根据对应的编码的索引找到名字,然后实时显示在检测结果中。
第6步得到的列表就是【已知的所有人脸】的特征列表,在之后获得的实时图片中的人脸都需要与已知人脸进行比对,这样我们才能知道谁是谁。
实时图片的处理
- 人脸的截取与对齐
- 利用facenet对矫正后的人脸进行编码
- 将实时图片中的人脸特征与数据库中的进行比对
比对过程:
- 获取实时图片中的每一张人脸特征。
- 将每一张人脸特征和数据库中所有的人脸进行比较,计算距离。如果距离小于阈值,则认为其具有一定的相似度。
- 获得每一张人脸在数据库中最相似的人脸的序号。
- 判断这个序号对应的人脸距离是否小于阈值,是则认为人脸识别成功,他就是这个人。
请简述MTCNN的结构组成
分为P-Net,R-Net,O-Net
网络结构
P-Net,(Proposal Network ):该网络结构主要获得了人脸区域的候选窗口和边界框的回归向量。并用该边界框做回归,对候选窗口进行校准,然后通过非极大值抑制(NMS)来合并高度重叠的候选框。
R-Net,(Refine Network ):该网络结构还是通过边界框回归和NMS来去掉那些false-positive区域。只是由于该网络结构和P-Net网络结构有差异,多了一个全连接层,所以会取得更好的抑制false-positive的作用。
O-Net,(Output Network ):该层比R-Net层又多了一层卷基层,所以处理的结果会更加精细。作用和R-Net层作用一样。但是该层对人脸区域进行了更多的监督,同时还会输出5个地标(landmark)。
什么是在线挖掘困难样本?
即在训练时选择前K个loss较大的样本进行back propagate(bp),而loss较小的样本(easy samples)则认为分类正确不用bp(loss较小可认为学会了,既然学会了就没有必要再学,也就不需要bp了),这里的前K可以是一个百分比,即前K%的hard样本,如70%,这个是MTCNN OHSM 采用的方法,注意K不能太大否则不能达到hard sample mining的作用。
请简述FacNet网络计算流程
首先模型分为两个部分,一个是人脸检测流程,一个是人脸编码流程。
人脸检测流程
使用MTCNN模型检测人脸,整个模型一共是有三个网络,按顺序依次是P-net,R-net,O-net,流程如上。
人脸编码流程
输入一张人脸图片,一般是人脸检测之后通过位置信息抠出来的人脸,并且经过了仿射变换,变成正脸。
什么是仿射变换?
简单的来说,仿射变换就是:线性变换+ 平移
那么线性变换和仿射变换的区别是什么?
线性变换三个要点:
- 变换前是直线,变换后依然是直线
- 直线比例保持不变
- 变换前是原点的,变换后依然是原点
仿射变换的两个要点:
- 变换前是直线的,变换后依然是直线
- 直线比例保持不变
你还尝试过什么方案优化模型结构?
facenet它的主干网络就是Inception-ResNetV1,还有其他几个优化的网络为:Inception-resnet-A、Inception-resnet-B、Inception-resnet-C;三个模块其实都是Inception和resnet结合的变种残差网络。它们在Inception-ResNetV1中会作为一个block被使用多次,例如5个连续的Inception-resnet-A放在一块使用,因为是残差网络,所以输入和输出是可以直接相加的;因此可以连续使用5个Inception-resnet-A;同理后面两个会被连续调用10次和5次。最后再经过一个全连接dense层,输出128的特征向量,这个特征向量是进行人脸识别的关键,因为相似的人脸它们的特征向量在欧式空间的距离是非常小的,我们就可以通过这个距离小于某个阈值来判断人脸。对得到的128的特征向量进行L2标准化,得到最终的特征向量
Facenet的特点是什么?
与其他的深度学习方法在人脸上的应用不同,FaceNet并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式空间的编码方法(Euclidean embedding),然后基于这个编码在嵌入空间(embedding space)用(欧氏距离)L2 distance对比做人脸识别、人脸验证和人脸聚类等。
FaceNet算法有如下要点:
去掉了最后的softmax,而是用三元组计算距离的方式来进行模型的训练。使用这种方式学到的图像表示非常紧致,使用12维。
(特征向量的维度选择问题,维度约小计算越快,但是太小的话很难区分不同图片;维度越大越容易区分不同图片,但是太大训练模型不易收敛,且测试时计算慢,占用空间大。经过实验证明 128 维的特征能够较好的平衡这个问题)
三元组的选择非常重要,选的好可以很快的收敛
MTCNN里面的技术关键点包括
-
iou(交并比)
-
nms(非极大值抑制)
-
convert_to_square(转正方形)
-
偏移量计算(生成标签时)
-
图像金字塔(侦测时)
-
图像坐标反算(侦测时)
IOU是什么?
iou表示两个框重叠的比例,iou越大,表示两个框重叠部分越多,越有可能框的是同一个物体。
P_Net和R_Net:交集比并集
O_Net:交集比最小框
O_NET中更多的是出现大框套小框的情况,因此以交集比最小框的比值作为iou。
NMS
nms的作用是去除重复框,流程如下:
convert_to_square(转正方形)
在侦测的时候,P_NET的人脸预测框需要先转化为正方形,然后在原图上裁剪出对应的图片,resize为(24,24)之后才能把图片输入R_NET。同样,R_NET的人脸预测框也需要转化为正方形,然后裁剪原图,resize为(48,48),输入O_NET最终预测人脸区域。
如图,蓝色框为预测框,红色框为预测框转化成的正方形。
正方形框左上角的坐标值 = 左上角的坐标值+0.5框边长-0.5最大边长。
len_side = max(w, h)
_x1 = x1 + 0.5 * w - 0.5 * len_side
预测框和转化后的正方形框中心点不变。不过在特殊情况,如原图中人脸太靠近图片边缘,预测框转正方形后正方形的边可能超过图片边缘,此时中心点可略作调整,使正方形位于图片内部。
偏移率计算
生成标签的时候需要进行偏移率计算。
标签包括1个类别(正样本为1, 负样本为0,部分样本为2), 4个边框偏移率,10个人脸关键点的坐标值偏移率,即一个15维的向量。
偏移率代表的是真实框相对于建议框的偏移的比率。
offset =(真实框坐标值-建议框坐标值)/建议框的边长
P_NET,R_NET,O_NET的建议框分别为12*12, 24*24, 48*48的正方形
图像金字塔
侦测的时候,将原图输入P_NET,可以得到(1, C, H, W)形状的特征图,特征图上的每个点的感受野为1212。1212的区域是很小的,无法预测原图上比较大的人脸,因此可以把原图进行缩放,传入P_NRT,原图上的人脸变小之后,P_NET才能准确预测人脸框。
图像坐标反算
在侦测的时候进行做图像坐标反算,反算分为两个部分:
-
根据索引,计算出建议框在原图上的坐标值
如图有4个建议框,分别为红,绿,黄,蓝,每个建议框对应特征图上的一个点,比如红色框对应特征图上(0,0)这个点,绿色框对应特征图上(0,1)这个点。每个建议框和特征图上的点一一对应,因此,根据特征图上的索引,可以反算得到建议框在