当前位置:   article > 正文

【人脸识别】基于facenet_pytorch实现人脸识别_pytorch人脸识别

pytorch人脸识别

        该代码可以在Pycharm、Jupyter、Python等Python编译器中运行,本文我使用的是Pycharm。

一、安装

(一)安装pytorch(cpu)

        首先在Pycharm中新建一个名为facenet_test的项目,并创建一个名为fp.py的Python文件

        打开PyTorch官网Start Locally | PyTorch,在主页中根据自己的电脑选择Linux、Mac或Windows,其余如下图所示,系统将给出对应的安装语句,如我这里为“pip3 install torch torchvision torchaudio”。

        由于不加镜像下载速度比较慢,所以我们加上清华镜像在pycharm的terminal终端中输入以下命令:

pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

        稍等片刻后,系统显示“successfully installed……”。之后在终端中输入以下命令,来测试是否安装成功。

  1. python # 进入Python环境
  2. import torch # 导入torch模块,若没有报错说明安装成功
  3. torch.__version__ # 查看版本号

         效果如下所示,说明安装成功了。

(二)安装facenet_pytorch库

        在终端中键入如下命令:(在此之前先按Ctrl+Z并回车退出Python环境)

pip install facenet_pytorch

        安装好之后到“C:\Users\用户名\”路径下查看是否有“.cache”文件夹。如果没有,可以在终端的python环境下,运行以下两句命令:

  1. import torchvision.models as models
  2. alexnet=models.alexnet(pretrained=True)

        安装好之后重新查看“C:\Users\用户名\”路径,发现已经有了“.cache”文件夹。接着我们需要到如下网盘链接中下载InceptionResnetV1预训练模型,并将压缩包解压放置在“C:\Users\用户名\.cache\torch\hub\checkpoints”或“C:\Users\用户名\.cache\torch\checkpoints”路径下。如图所示。

链接:https://pan.baidu.com/s/1UrnggoOLL8lv2Nj4odBfWw?pwd=w6x8 
提取码:w6x8 

 

 二、代码实现

        首先选择两张图片作为待识别的图片,并将它们与fp.py放置在同一目录中。在这里我选择以下两张图片,分别命名为“zj.jpg”和“zj2.jpg”。

        接着在fp.py中输入以下代码:

  1. import cv2
  2. import torch
  3. from facenet_pytorch import MTCNN, InceptionResnetV1
  4. # 获得人脸特征向量
  5. def load_known_faces(dstImgPath, mtcnn, resnet):
  6. aligned = []
  7. knownImg = cv2.imread(dstImgPath) # 读取图片
  8. face = mtcnn(knownImg) # 使用mtcnn检测人脸,返回【人脸数组】
  9. if face is not None:
  10. aligned.append(face[0])
  11. aligned = torch.stack(aligned).to(device)
  12. with torch.no_grad():
  13. known_faces_emb = resnet(aligned).detach().cpu() # 使用resnet模型获取人脸对应的特征向量
  14. print("\n人脸对应的特征向量为:\n", known_faces_emb)
  15. return known_faces_emb, knownImg
  16. # 计算人脸特征向量间的欧氏距离,设置阈值,判断是否为同一个人脸
  17. def match_faces(faces_emb, known_faces_emb, threshold):
  18. isExistDst = False
  19. distance = (known_faces_emb[0] - faces_emb[0]).norm().item()
  20. print("\n两张人脸的欧式距离为:%.2f" % distance)
  21. if(distance < threshold):
  22. isExistDst = True
  23. return isExistDst
  24. if __name__ == '__main__':
  25. # help(MTCNN)
  26. # help(InceptionResnetV1)
  27. # 获取设备
  28. device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
  29. print(device)
  30. # mtcnn模型加载【设置网络参数,进行人脸检测】
  31. mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3], keep_all=True, device=device)
  32. # InceptionResnetV1模型加载【用于获取人脸特征向量】
  33. resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)
  34. MatchThreshold = 0.8 # 人脸特征向量匹配阈值设置
  35. known_faces_emb, _ = load_known_faces('zj.jpg', mtcnn, resnet) # 已知人物图
  36. # bFaceThin.png lyf2.jpg
  37. faces_emb, img = load_known_faces('zj2.jpg', mtcnn, resnet) # 待检测人物图
  38. isExistDst = match_faces(faces_emb, known_faces_emb, MatchThreshold) # 人脸匹配
  39. print("设置的人脸特征向量匹配阈值为:", MatchThreshold)
  40. if isExistDst:
  41. boxes, prob, landmarks = mtcnn.detect(img, landmarks=True) # 返回人脸框,概率,5个人脸关键点
  42. print('由于欧氏距离小于匹配阈值,故匹配')
  43. else:
  44. print('由于欧氏距离大于匹配阈值,故不匹配')

        第一次运行时系统需要下载预训练的vggface模型,时间会比较久,耐心等待下载好之后程序便可以运行。

        

        程序的输出结果包括运行设备、两张图片中人脸对应的特征向量、两张人脸的欧式距离、设置的人脸特征向量匹配阈值和两张人脸是否匹配。

        部分运行结果如下所示:

         根据运行结果,两张图片中人脸的欧氏距离小于设定的匹配阈值,故匹配,也就是说两张人脸是同一个人。下面,我们尝试将zj2.jpg替换为周杰伦的照片zjl.jpg,来看看会有什么结果。

         结果显示,两张图片中人脸的欧氏距离大于设定的匹配阈值,故不匹配,也就是说两张人脸不是同一个人。

        这样的话,我们的代码就能实现简单的人脸识别啦。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/101022
推荐阅读
相关标签
  

闽ICP备14008679号