查看: 43|回复: 0

[经验] 基于米尔全志T527开发板的FacenetPytorch人脸识别方案

[复制链接]
  • TA的每日心情

    2019-10-15 10:48
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2024-11-29 19:21:29 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 swiftman 于 2024-12-2 09:06 编辑

    本篇测评由优秀测评者“小火苗”提供。

    本文将介绍基于米尔电子MYD-LT527开发板(米尔基于全志 T527开发板)的FacenetPytorch人脸识别方案测试。

    一、facenet_pytorch算法实现人脸识别

    深度神经网络

    1.简介
    Facenet-PyTorch 是一个基于 PyTorch 框架实现的人脸识别库。它提供了 FaceNet 模型的 PyTorch 实现,可以用于训练自己的人脸识别模型。FaceNet 是由 Google 研究人员提出的一种深度学习模型,专门用于人脸识别任务。
    在利用PyTorch神经网络算法进行人脸图像对比的实验设置中,我们专注于对比环节,而不涉及实际项目的完整实现细节。但55555贴近实际应用,我们可以构想以下流程:
    1)捕捉新人脸图像:首先,我们使用摄像头或其他图像采集设备捕捉一张新的人脸照片。
    2)加载存储的人脸图像:接着,从数据库中加载所有已存储的人脸图像。这些图像是之前采集并存储的,用于与新捕捉到的人脸照片进行对比。
    3)构建神经网络模型:为了实现对比功能,我们需要一个预先训练好或自定义的神经网络模型。这个模型能够提取人脸图像中的关键特征,使得相似的图像在特征空间中具有相近的表示。
    4)特征提取:利用神经网络模型,对新捕捉到的人脸照片和存储的每一张人脸图像进行特征提取。这些特征向量将用于后续的对比计算。
    5)计算相似度:采用合适的相似度度量方法(如余弦相似度、欧氏距离等),计算新照片特征向量与存储图像特征向量之间的相似度。
    6)确定匹配图像:根据相似度计算结果,找到与新照片相似度最高的存储图像,即认为这两张图像匹配成功。
    7)输出匹配结果:最后,输出匹配成功的图像信息或相关标识,以完成人脸对比的实验任务。

    2.核心组件
    MTCNN:Multi-task Cascaded Convolutional Networks,即多任务级联卷积网络,专门设计用于同时进行人脸检测和对齐。它在处理速度和准确性上都有出色的表现,是当前人脸检测领域的主流算法之一。
    FaceNet:由Google研究人员提出的一种深度学习模型,专门用于人脸识别任务。FaceNet通过将人脸图像映射到一个高维空间,使得同一个人的不同图像在这个空间中的距离尽可能小,而不同人的图像距离尽可能大。这种嵌入表示可以直接用于人脸验证、识别和聚类。

    3.功能
        支持人脸检测:使用MTCNN算法进行人脸检测,能够准确识别出图像中的人脸位置。
        支持人脸识别:使用FaceNet算法进行人脸识别,能够提取人脸特征并进行相似度计算,实现人脸验证和识别功能。

    二、安装facenet_pytorch库
    1.更新系统
    更新ubuntu系统,详情查看米尔提供的资料文件

    2.更新系统软件
    1. apt-get update
    复制代码

    3.安装git等支持软件
    1. sudo apt-get install -y python3-dev python3-pip libopenblas-dev libssl-dev libffi-dev git cmake
    复制代码


    4.安装Pytorch支持工具
    1. # 克隆 PyTorch 源代码
    2. git clone --recursive https://github.com/pytorch/pytorch
    3. # 进入 PyTorch 目录
    4. cd pytorch
    5. # 安装 PyTorch (需要根据你的需求选择 CUDA 版本,如果不需要 GPU 支持则不需要 --cuda 参数)
    6. pip3 install --no-cache-dir torch -f https://download.pytorch.org/whl/torch_stable.html
    7. # 测试 PyTorch 安装
    8. python3 -c "import torch; print(torch.__version__)"
    复制代码

    5.安装facenet_pytorch
    1. pip3 install facenet_pytorch
    复制代码


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

    此代码是使用训练后的模型程序进行使用,在程序中需要标明人脸识别对比的图像。

    2.实践过程

    第一次运行时系统需要下载预训练的vggface模型,下载过程较长,后面就不需要在下载了运行会很快。如图所示:
    3.程序运行异常被终止
    运行程序,提示killed,系统杀死了本程序的运行,经过多方面的测试,最终发现是识别的图片过大,使得程序对内存消耗过大导致。后将图片缩小可以正常运行了。
    以下是对比图像和对比结果。


    四、gitHub开源代码
    1.首先下载代码文件
    代码库中,大致的介绍了facenet算法的训练步骤等。

    2.代码实现
    以下是facenet的python代码,注意需要更改下面的一条程序"cuda" False,因为t527使用的是cpu,芯片到时自带gpu但是cuda用不了,因为cuda是英伟达退出的一种计算机架构。
    1. import matplotlib.pyplot as plt
    2. import numpy as np
    3. import torchimport torch.backends.cudnn as cudnn
    4. from nets.facenet import Facenet as facenet
    5. from utils.utils import preprocess_input, resize_image, show_config
    6. #--------------------------------------------#
    7. # 使用自己训练好的模型预测需要修改2个参数
    8. # model_path和backbone需要修改!
    9. #--------------------------------------------#
    10. class Facenet(object):
    11. _defaults = {
    12. #--------------------------------------------------------------------------#
    13. # 使用自己训练好的模型进行预测要修改model_path,指向logs文件夹下的权值文件
    14. # 训练好后logs文件夹下存在多个权值文件,选择验证集损失较低的即可。
    15. # 验证集损失较低不代表准确度较高,仅代表该权值在验证集上泛化性能较好。
    16. #--------------------------------------------------------------------------#
    17. "model_path" : "model_data/facenet_mobilenet.pth",
    18. #--------------------------------------------------------------------------#
    19. # 输入图片的大小。
    20. #--------------------------------------------------------------------------#
    21. "input_shape" : [160, 160, 3],
    22. #--------------------------------------------------------------------------#
    23. # 所使用到的主干特征提取网络
    24. #--------------------------------------------------------------------------#
    25. "backbone" : "mobilenet",
    26. #-------------------------------------------#
    27. # 是否进行不失真的resize
    28. #-------------------------------------------#
    29. "letterbox_image" : True,
    30. #-------------------------------------------#
    31. # 是否使用Cuda# 没有GPU可以设置成False
    32. #-------------------------------------------#
    33. "cuda" : False,
    34. }
    35. @classmethod
    36. def get_defaults(cls, n):
    37. if n in cls._defaults:
    38. return cls._defaults[n]
    39. else:
    40. return "Unrecognized attribute name '" + n + "'"
    41. #---------------------------------------------------#
    42. # 初始化Facenet
    43. #---------------------------------------------------#
    44. def __init__(self, **kwargs):
    45. self.__dict__.update(self._defaults)
    46. for name, value in kwargs.items():
    47. setattr(self, name, value)
    48. self.generate()
    49. show_config(**self._defaults)
    50. def generate(self):
    51. #---------------------------------------------------#
    52. # 载入模型与权值
    53. #---------------------------------------------------#
    54. print('Loading weights into state dict...')
    55. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    56. self.net = facenet(backbone=self.backbone, mode="predict").eval()
    57. self.net.load_state_dict(torch.load(self.model_path, map_location=device), strict=False)
    58. print('{} model loaded.'.format(self.model_path))
    59. if self.cuda:
    60. self.net = torch.nn.DataParallel(self.net)
    61. cudnn.benchmark = True
    62. self.net = self.net.cuda()
    63. #---------------------------------------------------#
    64. # 检测图片
    65. #---------------------------------------------------#
    66. def detect_image(self, image_1, image_2):
    67. #---------------------------------------------------#
    68. # 图片预处理,归一化
    69. #---------------------------------------------------#
    70. with torch.no_grad():
    71. image_1 = resize_image(image_1, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
    72. image_2 = resize_image(image_2, [self.input_shape[1], self.input_shape[0]], letterbox_image=self.letterbox_image)
    73. photo_1 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_1, np.float32)), (2, 0, 1)), 0))
    74. photo_2 = torch.from_numpy(np.expand_dims(np.transpose(preprocess_input(np.array(image_2, np.float32)), (2, 0, 1)), 0))
    75. if self.cuda:
    76. photo_1 = photo_1.cuda()
    77. photo_2 = photo_2.cuda()
    78. #---------------------------------------------------#
    79. # 图片传入网络进行预测
    80. #---------------------------------------------------#
    81. output1 = self.net(photo_1).cpu().numpy()
    82. output2 = self.net(photo_2).cpu().numpy()
    83. #---------------------------------------------------#
    84. # 计算二者之间的距离
    85. #---------------------------------------------------#
    86. l1 = np.linalg.norm(output1 - output2, axis=1)
    87. plt.subplot(1, 2, 1)
    88. plt.imshow(np.array(image_1))
    89. plt.subplot(1, 2, 2)
    90. plt.imshow(np.array(image_2))
    91. plt.text(-12, -12, 'Distance:%.3f' % l1, ha='center', va= 'bottom',fontsize=11)
    92. plt.show()
    93. return l1
    复制代码

    3.代码实现
    此代码调用的签名的代码,但其可以直接的去调用图片进行人脸识别。
    1. from PIL import Image
    2. from facenet import Facenet
    3. if __name__ == "__main__":
    4. model = Facenet()
    5. while True:
    6. image_1 = input('Input image_1 filename:')
    7. try:
    8. image_1 = Image.open(image_1)
    9. except:
    10. print('Image_1 Open Error! Try again!')
    11. continue
    12. image_2 = input('Input image_2 filename:')
    13. try:
    14. image_2 = Image.open(image_2)
    15. except:
    16. print('Image_2 Open Error! Try again!')
    17. continue
    18. probability = model.detect_image(image_1,image_2)
    19. print(probability)
    复制代码

    4.程序运行
    运行程序后首先显示的是程序的配置信息,然后可以输入图像对比检测的内容。以下是图像识别的效果和对比的准确率。

    五、参考文献
    CSDN博客
    https://blog.csdn.net/weixin_45939929/article/details/124789487?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-1-124789487-blog-142987324.235^v43^pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.2&utm_relevant_index=4
    官方源码来源
    https://gitcode.com/gh_mirrors/fac/facenet-pytorch/overview
    *部分图片来源于网络,如有版权问题请联系删除

    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-12 05:18 , Processed in 0.128688 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.