Pytorch下Facenet Evolve的人脸识别和匹配
Pytorch下Facenet Evolve的人脸识别和匹配

Pytorch下Facenet Evolve的人脸识别和匹配

人脸识别(FacenetEvo → 支持Cuda的高性能FacenetEvo)

通过过MTCNN的三个子网络(Pnet, Rnet和Onet)进行人脸的精细识别

  • Pnet——粗选得到候选框
  • Rnet——筛选Pnet候选框, 微调Bounding Box
  • Onet——最后的判定, 微调Bounding Box并加入Landmarks

FacenetEvo提供了两个方法来实现人脸的识别和定点以及最后的展示

boundingBoxes, landmarks = detect_faces(img)
boxedImage = show_results(img,boundingBoxes,landmarks)

该内置方法经分析不支持CUDA运算, 在480P下只能达到15帧的摄像头检测帧率(CPU为至强E2276M), 故经过改动代码使其支持显卡加速, 在480P下可以达到40左右的帧率(CUDA占用率为15%), 但帧率波动情况仍然存在,可能需要继续优化代码(问题可能出现在重复加载模型上)

面部匹配

在面部匹配中,我选择了IRSE50模型,使用了FacenetEvolve中的特征提取方法(同样性能不佳)

emb1 = extract_feature(img, backbone, device, True, 1)
#backbone is the backbone network, True for test time augmentation
#1 is for original(1 if the img needs to read from disk)

将两个图片的L2范数相减再平方即可得到两张图片的距离(From CSDN, Unverified)

使用这种方法的明显缺陷是在每次更新时需要对模型进行重新加载,极大降低效率,故修改代码使其支持CUDA加速,并将模型加载从方法中移除,直接作为参数传入。

相比于未经修改的代码,速度提升了一倍以上(仍待进一步优化)

此为多目标识别时成功识别Bill的示例

在多目标识别中,由于要对每一个目标进行特征提取,将大幅降低性能,故仍在寻找解决方法。

在对示例视频进行匹配时,如果使用同人物的不相干图片则无法进行匹配,而如果使用该场景中的图片作为源图片则可以成功匹配。

仍需要解决的问题

在面部识别中,可能会在特殊环境下出现误判现象,需要修改代码对Bounding Box的大小进行限制,且可以使用帧平滑的方法使Bounding Box的位置和出现更加稳定。

在特征提取中,我的方法是使用模型计算两张图片的距离,而在实际应用人脸匹配的环境下,源图片应该是在多种环境下的不同面部,而现在该方法只能用于源图片为一张时的简单情况,难以在亮度、面部角度等多种环境下进行良好的迁移。后期可能需要对多张源图片投射之高维空间,再将目标图片在空间中进行分类,在这种情况下,对代码性能的要求将变得更高,所以之前的代码仍有较大的优化空间和需求。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据