⼈脸识别⾯试常见题⽬总结
项⽬整体流程图:
简单简述⼀下你做的⼈脸识别项⽬的整个流程?
⾸先利⽤dlib进⾏⼈脸的数据集采集和建⽴
1.通过摄像头采集⼈脸图像
2.建⽴⼈脸图像的label信息
3.建⽴个⼈⼈脸数据库
数据库初始化
数据库的初始化具体执⾏的过程就是:
1.遍历数据库中所有的图⽚。
2.检测每个图⽚中的⼈脸位置。
3.利⽤mtcnn将⼈脸截取下载。
4.将获取到的⼈脸进⾏对齐。
5.利⽤facenet将⼈脸进⾏编码。
6.将所有⼈脸编码的结果放在⼀个列表中,同时也会将它们的名字放⼊列表中,这两个列表中的相同位置的元素都是对应的,
⽅便后⾯根据对应的编码的索引找到名字,然后实时显⽰在检测结果中。
第6步得到的列表就是【已知的所有⼈脸】的特征列表,在之后获得的实时图⽚中的⼈脸都需要与已知⼈脸进⾏⽐对,这样我们才能知
道谁是谁。
实时图⽚的处理
1.⼈脸的截取与对齐
2.利⽤facenet对矫正后的⼈脸进⾏编码
3.将实时图⽚中的⼈脸特征与数据库中的进⾏⽐对
⽐对过程:
1.获取实时图⽚中的每⼀张⼈脸特征。
2.将每⼀张⼈脸特征和数据库中所有的⼈脸进⾏⽐较,计算距离。如果距离⼩于阈值,则认为其具有⼀定的相似度。
3.获得每⼀张⼈脸在数据库中最相似的⼈脸的序号。
4.判断这个序号对应的⼈脸距离是否⼩于阈值,是则认为⼈脸识别成功,他就是这个⼈。
请简述MTCNN的结构组成
分为P-Net,R-Net,O-Net⽹络结构
P-Net,(ProposalNetwork):该⽹络结构主要获得了⼈脸区域的候选窗⼝和边界框的回归向量。并⽤该边界框做回归,对候选窗⼝进
⾏校准,然后通过⾮极⼤值抑制(NMS)来合并⾼度重叠的候选框。
R-Net,(RefineNetwork):该⽹络结构还是通过边界框回归和NMS来去掉那些fal-positive区域。只是由于该⽹络结构和P-Net⽹
络结构有差异,多了⼀个全连接层,所以会取得更好的抑制fal-positive的作⽤。
O-Net,(OutputNetwork):该层⽐R-Net层⼜多了⼀层卷基层,所以处理的结果会更加精细。作⽤和R-Net层作⽤⼀样。但是该层对
⼈脸区域进⾏了更多的监督,同时还会输出5个地标(landmark)。
什么是在线挖掘困难样本?
即在训练时选择前K个loss较⼤的样本进⾏backpropagate(bp),⽽loss较⼩的样本(easysamples)则认为分类正确不⽤bp(loss较⼩可
认为学会了,既然学会了就没有必要再学,也就不需要bp了),这⾥的前K可以是⼀个百分⽐,即前K%的hard样本,如70%,这个是
MTCNNOHSM采⽤的⽅法,注意K不能太⼤否则不能达到hardsamplemining的作⽤。
请简述FacNet⽹络计算流程
⾸先模型分为两个部分,⼀个是⼈脸检测流程,⼀个是⼈脸编码流程。
⼈脸检测流程
使⽤MTCNN模型检测⼈脸,整个模型⼀共是有三个⽹络,按顺序依次是P-net,R-net,O-net,流程如上。
⼈脸编码流程
输⼊⼀张⼈脸图⽚,⼀般是⼈脸检测之后通过位置信息抠出来的⼈脸,并且经过了仿射变换,变成正脸。
什么是仿射变换?
简单的来说,仿射变换就是:线性变换+平移
那么线性变换和仿射变换的区别是什么?
线性变换三个要点:
1.变换前是直线,变换后依然是直线
2.直线⽐例保持不变
3.变换前是原点的,变换后依然是原点
仿射变换的两个要点:
1.变换前是直线的,变换后依然是直线
2.直线⽐例保持不变
你还尝试过什么⽅案优化模型结构?
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次。最后再经过⼀个全连接den层,输出128的特征向量,这个特征向量是进⾏⼈脸识
别的关键,因为相似的⼈脸它们的特征向量在欧式空间的距离是⾮常⼩的,我们就可以通过这个距离⼩于某个阈值来判断⼈脸。对得到的
128的特征向量进⾏L2标准化,得到最终的特征向量
Facenet的特点是什么?
与其他的深度学习⽅法在⼈脸上的应⽤不同,FaceNet并没有⽤传统的softmax的⽅式去进⾏分类学习,然后抽取其中某⼀层作为特征,⽽
是直接进⾏端对端学习⼀个从图像到欧式空间的编码⽅法(Euclideanembedding),然后基于这个编码在嵌⼊空间(embedding
space)⽤(欧⽒距离)L2distance对⽐做⼈脸识别、⼈脸验证和⼈脸聚类等。
FaceNet算法有如下要点:
去掉了最后的softmax,⽽是⽤三元组计算距离的⽅式来进⾏模型的训练。使⽤这种⽅式学到的图像表⽰⾮常紧致,使⽤12维。
(特征向量的维度选择问题,维度约⼩计算越快,但是太⼩的话很难区分不同图⽚;维度越⼤越容易区分不同图⽚,但是太⼤训练模型不易
收敛,且测试时计算慢,占⽤空间⼤。经过实验证明128维的特征能够较好的平衡这个问题)
三元组的选择⾮常重要,选的好可以很快的收敛
MTCNN⾥⾯的技术关键点包括
(交并⽐)
(⾮极⼤值抑制)
t_to_square(转正⽅形)
4.偏移量计算(⽣成标签时)
5.图像⾦字塔(侦测时)
6.图像坐标反算(侦测时)
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维的向量。
偏移率代表的是真实框相对于建议框的偏移的⽐率。
offt=(真实框坐标值-建议框坐标值)/建议框的边长
P_NET,R_NET,O_NET的建议框分别为12*12,24*24,48*48的正⽅形
图像⾦字塔
侦测的时候,将原图输⼊P_NET,可以得到(1,C,H,W)形状的特征图,特征图上的每个点的感受野为1212。1212的区域是很⼩的,
⽆法预测原图上⽐较⼤的⼈脸,因此可以把原图进⾏缩放,传⼊P_NRT,原图上的⼈脸变⼩之后,P_NET才能准确预测⼈脸框。
图像坐标反算
在侦测的时候进⾏做图像坐标反算,反算分为两个部分:
1.根据索引,计算出建议框在原图上的坐标值
如图有4个建议框,分别为红,绿,黄,蓝,每个建议框对应特征图上的⼀个点,⽐如红⾊框对应特征图上(0,0)这个点,绿⾊框对
应特征图上(0,1)这个点。每个建议框和特征图上的点⼀⼀对应,因此,根据特征图上的索引,可以反算得到建议框在原图上的坐
标。
特征图共有5个通道,分别为:
置信度:模型预测出的建议框内含有⼈脸的概率
预测框相对于建议框左上⾓X1的偏移率:offt_x1
预测框相对于建议框左上⾓y1的偏移率:offt_y1
预测框相对于建议框右下⾓X2的偏移率:offt_x2
预测框相对于建议框右下⾓y2的偏移率:offt_y2
[外链图⽚转存失败,源站可能有防盗链机制,建议将图⽚保存下来直接上传(img-RGr6eQI9-16)(images/)]
2.根据偏移率,计算实际预测框在原图上的坐标值
⽹络输出实际预测框相对于建议框的偏移率,因此可以根据建议框在原图上的坐标,加上建议框边长乘以对应的偏移率,得到实际预
测框在原图上的坐标值
FaceNet模型的计算流程
MTCNN的优缺点总结
优点
1.设备要求低:使⽤了级联思想,将复杂问题分解,使得模型能够在⼩型设备上运⾏,⽐如⼈脸监测模型可以在没有GPU的设备上运
⾏。
2.容易训练:三个级联⽹络都较⼩,训练模型时容易收敛。
3.精度较⾼:使⽤了级联思想,逐步提⾼精度。
缺点
1.误检率较⾼:因为采⽤了级联的思想,使得模型在训练过程中的负样本偏少,学到的模型不够100%准确。
2.改进空间⼤:MTCN原论⽂模型在发表时距今已过去好⼏年了,随着技术的不断进步,对于原模型可以做出很多优化。
3.难以检测出倾斜度过⼤的⼈脸
FaceNet模型的优缺点总结
优点
1.直接训练很深的神经⽹络来获得embedding
2.三元组(anchor、pos、neg)设计、筛选、训练⽅法
3.对每张⼈脸产⽣128bytes的特征
faceNet不采⽤landmark,直接⽤CNN来学对齐的那套(facedetection->featureextraction)其他⾛facedetection->face
alignment->featureextraction。
FaceNet并没有像DeepFace和DeepID那样需要对齐。
FaceNet得到最终表⽰后不⽤像DeepID那样需要再训练模型进⾏分类,直接计算距离就好了,简单⽽有效。
提取特征直接计算距离,⽐之前的使⽤PCA+SVM更加简单,训练的损失函数直接针对实际误差,end-to-end⽅式训练都能提⾼精度
只要有个⼈脸的boundingbox就⾏
缺点
针对倾斜度过⼤的⼈脸识别不了,或者效果⽐较差
如下代码是什么意思?
PNet能处理的最⼩图⽚⼤⼩是12×12的,minsize设为20,即要求的最⼩⼈脸图⽚的⼤⼩是20×20的,根据这两个值定义了⼀个
detection_window_size_ratio的值m=12.0/minsize。然后定义了⼀组图⽚的scales公式:Scale=m*factor的N次⽅
factor在这⾥取0.709。输⼊图⽚按照这些scales进⾏缩放,直到最短边的值⼩于12为⽌。从⽽得到了⼀组内容相同,⼤⼩不同的
imagepyramid。注意,这⾥对图⽚进⾏的是resample,并不是crop。
举例:
我们算⼀下:输⼊图⽚的⼤⼩是250×250×3,⾸先要scale,这⾥
,实际输⼊pnet的第⼀张图⽚的⼤⼩是
,经过第⼀层
,输出为
;第⼆层
,输出为
;第三层
,输出为
;第四层
,输出为
,所以输出的featuremap应该形如
。
第⼀次resample后如果最⼩变没有<12,也能输⼊pnet进⾏训练吗?为什么?
这⾥PNet能处理的最⼩图⽚⼤⼩是12×12的,⼤于12也可以计算,但是会消耗很多时间和计算成本,理论上设置为12最为合适。项⽬
⼯程讲究选择最合适的值来⽤。
如下代码中的函数是什么意思?
minsize=20,m=12/minsize=3/5
250×3/5=150
(3×3/s:1/p:valid)conv
(150−3+1)/1=148
(2×2/s:2/p:same)maxpool
148/2=74
(3×3/s:1/p:valid)conv
(74−3+1)/1=72
(3×3/s:1/p:valid)conv
(72−3+1)/1=70
(70,70)
detect_face_24net和detect_face两个函数的区别是什么?分别在什么情况下⽤到?
detect_face_24net是⽤于数据预处理图像⼤⼩为24的函数,和detect_face_12相同;⾄于detect_face相当于的是主函数,也就是说是主函数
下⾯写的⼦函数功能。
上图中的三个阶段分别都完成了什么功能?
以上图detect_face_24net为例:
这⾥检测图像中的⼈脸,并为其返回包围框和点。
img:输⼊图像
minsize:最⼩尺⼨20
Pnet,Rnet,Onet:源于caffemodel(原始论⽂出处)
threshold:阈值=[th1,th2,th3],th1-3是三个步骤的阈值[0.6,0.7,0.7]
factor:⽤于创建⽤于在图像中检测的脸(图像⾦字塔)⼤⼩的缩放⾦字塔的因⼦。0.709
代码中:
第⼀阶段⽤于PNet模型预测
第⼆阶段⽤于RNet模型预测
第三阶段⽤于ONet模型预测
onet是如何找到五个landmark的,后续过程中是如何利⽤landmark去对齐⼈脸的?
onet通过数据集中的landmark学习得到的五个landmark点。后续利⽤检测到的Landmarks和模板的Landmarks,计算仿射矩阵结果;
然后利⽤计算出来的结果,直接计算得到对齐后的图像。
模型训练完成后,在预测阶段,⼤尺⼨的图像(如1080)经过⾦字塔后会不会过度resize,影响其检测效果。
会出现这种情况,将⾦字塔少建⼏层就可以解决这种问题。
FACENET
⼤部分是拓展功能和测试代码,项⽬中没⽤使⽤到,图⽚中标出来的代码程序是softmax,celebA的相关训练的程序
完成训练后,在检测阶段,⾯对新输⼊的样本,没有其他类来构成neg,要如何使⽤tripletloss。
⼀般情况下,模型⾯对新输⼊样本⼀般有两种解决办法:
1.加⼊新数据,从新训练模型,以此达到训练识别的⽬的。
2.第⼆种是直接通过Tripletloss学到的是⼀个好的embedding,相似的图像在embedding空间⾥是相近的,可以判断是否是同⼀个⼈
脸。
对于Tripletloss是深度学习中的⼀种损失函数,可以通过训练得到也可以使⽤已经训练好的Tripletloss。⽤于训练差异性较⼩的样本,如⼈
脸等,数据包括锚(Anchor)⽰例、正(Positive)⽰例、负(Negative)⽰例,通过优化锚⽰例与正⽰例的距离⼩于锚⽰例与负⽰例的
距离,实现样本的相似性计算。具体可以参考课程(CSDN视觉应⽤⼯程师),课程中有详细讲解含义。
facenet⽹络有什么改进的⽅法,或者更好⽤的替代⽹络:
还可以改变⽹络内部结构,⽐如使⽤:Inception-resnet-A、Inception-resnet-B、Inception-resnet-C;
三个模块其实都是Inception和resnet结合的变种残差⽹络。
它们在Inception-ResNetV1中会作为⼀个block被使⽤多次,例如5个连续的Inception-resnet-A放在⼀块使⽤,因为是残差⽹络,所以
输⼊和输出是可以直接相加的。因此可以连续使⽤5个Inception-resnet-A;同理后⾯两个会被连续调⽤10次和5次。最后再经过⼀个全连
接den层,输出128的特征向量,这个特征向量是进⾏⼈脸识别的关键。因为相似的⼈脸它们的特征向量在欧式空间的距离是⾮常⼩的,
我们就可以通过这个距离⼩于某个阈值来判断⼈脸。对得到的128的特征向量进⾏L2标准化,得到最终的特征向量。
替代⽹络可以⽤⼀些新出来⽹络模型,⽐如VarGFaceNet。OpenFace等模型
VarGFaceNet模型知识点拓展,可以简单简述⼀下
作者采⽤可变组卷积(varg)作为⽹络的基础block,其主要想法和原因是,以往轻量型模型采⽤深度可分离卷积来实现轻量化⽬的,但是
深度可分离卷积存在块内计算强度不平衡的问题,⽽且它的轻量化是在舍弃空间结构的基础上实现的,这使得模型在嵌⼊式设备中效率低下
以及模型精度下降。为此,作者在深度可分离卷积的基础上提出了可变组卷积varg。
OpenFace模型知识点拓展,可以简单简述⼀下
1.使⽤HOG算法给图⽚编码,以创建图⽚的简化版本。使⽤这个简化的图像,找到其中看起来最像通⽤HOG⾯部编码的部分。
2.通过找到脸上的主要特征点,找出脸部的姿势。⼀旦我们找到这些特征点,就利⽤它们把图像扭曲,使眼睛和嘴巴居中。
3.把上⼀步得到的⾯部图像放⼊神经⽹络中,神经⽹络知道如何找到128个特征测量值。保存这128个测量值。
4.看看我们过去已经测量过的所有脸部,找出哪个⼈的测量值和我们要测量的⾯部最接近。从⽽得到要找的⼈结果
备注:以上总结的知识点,可以考虑背下来,⾯试⼤概率会问相关内容,由于⼈脸识别已经属于单独的⼀个研究领域,所涉及的知识点和项
⽬经验⾮常之多,⾯试时注意⼀定要学会灵活变通,学完知识点需要学会总结和对⽐分析。
述⼀下
1.使⽤HOG算法给图⽚编码,以创建图⽚的简化版本。使⽤这个简化的图像,找到其中看起来最像通⽤HOG⾯部编码的部分。
2.通过找到脸上的主要特征点,找出脸部的姿势。⼀旦我们找到这些特征点,就利⽤它们把图像扭曲,使眼睛和嘴巴居中。
3.把上⼀步得到的⾯部图像放⼊神经⽹络中,神经⽹络知道如何找到128个特征测量值。保存这128个测量值。
4.看看我们过去已经测量过的所有脸部,找出哪个⼈的测量值和我们要测量的⾯部最接近。从⽽得到要找的⼈结果
备注:以上总结的知识点,可以考虑背下来,⾯试⼤概率会问相关内容,由于⼈脸识别已经属于单独的⼀个研究领域,所涉及的知识点和项
⽬经验⾮常之多,⾯试时注意⼀定要学会灵活变通,学完知识点需要学会总结和对⽐分析。
本文发布于:2022-11-25 03:34:59,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/16045.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |