首先利用dlib进行人脸的数据集采集和建立
数据库初始化
数据库的初始化具体执行的过程就是:
遍历数据库中所有的图片。
检测每个图片中的人脸位置。
利用mtcnn将人脸截取下载。
将获取到的人脸进行对齐。
利用facenet将人脸进行编码。
将所有人脸编码的结果放在一个列表中,同时也会将它们的名字放入列表中,这两个列表中的相同位置的元素都是对应的,
方便后面根据对应的编码的索引找到名字,然后实时显示在检测结果中。
第6步得到的列表就是【已知的所有人脸】的特征列表,在之后获得的实时图片中的人脸都需要与已知人脸进行比对,这样我们才能知道谁是谁。
实时图片的处理
比对过程:
分为网络结构
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的作用。
首先模型分为两个部分,一个是人脸检测流程,一个是人脸编码流程。
人脸检测流程
使用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并没有用传统的softmax的方式去进行分类学习,然后抽取其中某一层作为特征,而是直接进行端对端学习一个从图像到欧式空间的编码方法(Euclidean embedding),然后基于这个编码在嵌入空间(embedding space)用(欧氏距离)L2 distance对比做人脸识别、人脸验证和人脸聚类等。
FaceNet算法有如下要点:
去掉了最后的softmax,而是用三元组计算距离的方式来进行模型的训练。使用这种方式学到的图像表示非常紧致,使用12维。
(特征向量的维度选择问题,维度约小计算越快,但是太小的话很难区分不同图片;维度越大越容易区分不同图片,但是太大训练模型不易收敛,且测试时计算慢,占用空间大。经过实验证明 128 维的特征能够较好的平衡这个问题)
三元组的选择非常重要,选的好可以很快的收敛
iou(交并比)
nms(非极大值抑制)
convert_to_square(转正方形)
偏移量计算(生成标签时)
图像金字塔(侦测时)
图像坐标反算(侦测时)
iou表示两个框重叠的比例,iou越大,表示两个框重叠部分越多,越有可能框的是同一个物体。
O_NET中更多的是出现大框套小框的情况,因此以交集比最小框的比值作为iou。
在侦测的时候,P_NET的人脸预测框需要先转化为正方形,然后在原图上裁剪出对应的图片,resize为(24,24)之后才能把图片输入R_NET。同样,R_NET的人脸预测框也需要转化为正方形,然后裁剪原图,resize为(48,48),输入O_NET最终预测人脸区域。
如图,蓝色框为预测框,红色框为预测框转化成的正方形。 正方形框左上角的坐标值 = 左上角的坐标值+0.5框边长-0.5最大边长。
预测框和转化后的正方形框中心点不变。不过在特殊情况,如原图中人脸太靠近图片边缘,预测框转正方形后正方形的边可能超过图片边缘,此时中心点可略作调整,使正方形位于图片内部。
生成标签的时候需要进行偏移率计算。
标签包括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才能准确预测人脸框。
在侦测的时候进行做图像坐标反算,反算分为两个部分:
根据索引,计算出建议框在原图上的坐标值
本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕,E-mail:975644476@qq.com
本文链接:http://chink.83seo.com/news/600.html