源代码链接

1. 整体功能概述

这段 Python 代码实现了一个简单的人脸识别系统,利用facenet_pytorch 对已知人脸的特征向量提取和存储,以及对摄像头捕获的人脸进行实时识别。如果识别出的人脸与已知人脸不匹配(超过设定阈值),则触发报警。虽然有专业安防摄像头,但是成本高,且如果这段不能在外网的情况下,也能用

2. 所使用的技术和模块

(1) facenet - pytorch 模型

  • MTCNN(多任务卷积神经网络):
    • 作用:用于人脸检测,从输入图像中定位人脸。代码中通过设置min_face_size = 12指定了最小人脸尺寸,thresholds=[0.2, 0.2, 0.3]设定了检测人脸的置信度阈值,keep_all=False表示只保留置信度最高的人脸。
    • 示例代码:mtcnn = MTCNN(min_face_size=12, thresholds=[0.2, 0.2, 0.3], keep_all=False, device=device)。在遍历输入文件夹中的图像以及处理摄像头捕获的帧时,使用mtcnn(img)或mtcnn(frame)来检测人脸。如果检测到人脸,会返回人脸的张量表示,否则返回None。
  • InceptionResnetV1:
    • 作用:用于获取人脸的特征向量。模型被预训练在vggface2数据集上,并设置为评估模式(.eval()),将其移动到指定的计算设备(cuda或cpu)上。
    • 示例代码:resnet = InceptionResnetV1(pretrained='vggface2').eval().to(device)。在检测到人脸后,将人脸张量输入到resnet模型中获取其特征向量,用于后续的人脸识别对比。
(2) 设备选择

  • 使用torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')来自动选择使用NVIDIA GPU(如果可用)进行计算,以加速模型的运行速度,否则使用CPU。
(3) 文件和文件夹操作

  • 使用os模块来处理文件和文件夹。例如,通过os.listdir()遍历指定文件夹中的所有文件,os.path.exists()检查文件夹是否存在,os.makedirs()创建不存在的文件夹,os.path.join()构建文件的完整路径。
(4) 图像处理和视频捕获

  • 使用cv2(OpenCV)库来读取图像(cv2.imread())和捕获视频(cv2.VideoCapture())。在视频捕获部分,先尝试使用外置摄像头(索引为 1),如果不可用则使用内置摄像头(索引为 0)。同时,通过cv2.waitKey()检测用户按下的键,实现按'q'键退出程序的功能。
(5) 距离度量和人脸识别

  • 欧式距离在人脸识别中的应用:在识别摄像头捕获的人脸时,将其特征向量与存储在tz文件夹中的已知人脸特征向量(以.npy文件形式存储)进行比较。通过计算当前人脸特征向量与已知特征向量的欧式距离((face_emb.to(device) - known_emb_tensor).norm().item()),并与设定的阈值(threshold = 0.8)进行比较,来判断是否为陌生人。如果距离小于阈值,则认为是已知人脸;否则,判定为陌生人,不一定要设置0.8,依据房间大小,调大或者调小。
  • 余弦相似度(代码未使用,但可提及):在人脸识别领域,余弦相似度也是一种常用的度量方式,用于衡量两个向量的相似程度。它与欧式距离的区别在于,余弦相似度更关注向量的方向,而欧式距离考虑向量的长度和方向。在某些情况下,余弦相似度可能更适合于处理特征向量之间的相似性比较,特别是当向量的长度受到数据归一化等因素影响时。
(6) 音频播放

  • 使用pygame库来实现音频播放功能。通过pygame.init()和pygame.mixer.init()初始化音频播放器,当识别到陌生人时,加载并播放报警音频(alarm.wav),并且设置为循环播放(play(-1))。在程序结束时,停止播放音频(pygame.mixer.music.stop())。

3. 程序流程

  • prepare.py文件 特征提取和存储阶段:
    • 提取把主人或者客人照片放到true文件夹,遍历true文件夹中的图像文件,对每个图像使用MTCNN检测人脸,然后将检测到的人脸通过InceptionResnetV1模型转换为特征向量,并将特征向量保存为.npy文件到tz文件夹中,以节省运行监测时候的算力和硬件消耗,增强实时性。
  • run.py文件实时识别阶段:
    • 初始化摄像头,在一个无限循环中,不断从摄像头读取帧数据。对于每一帧,使用MTCNN检测人脸,若检测到人脸,则获取其特征向量。接着,将该特征向量与tz文件夹中的所有已知人脸特征向量进行比较(通过计算欧式距离)。如果与所有已知人脸的距离都大于阈值,则判定为陌生人,并播放报警音频。

4. 打包成 exe 的相关内容

  打包目的,让用户无需开发者操作直接运行,更方便

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐