windows人脸识别与安防报警系统开发
原创
©著作权归作者所有:来自51CTO博客作者wx6568287447898的原创作品,请联系作者获取转载授权,否则将追究法律责任
源代码
1. 整体功能概述
这段 Python 代码实现了一个简单的人脸识别系统,利用facenet - pytorch包括对已知人脸的特征提取和存储,以及对摄像头捕获的人脸进行实时识别。如果识别出的人脸与已知人脸不匹配(超过设定阈值),则触发报警,虽然有专业安防摄像头,但是成本高,且如果这段不能在外网的情况下,也能用。
2. 所使用的技术和模块
(1) facenet - pytorch 模型
- 作用:用于人脸检测,从输入图像中定位人脸。代码中通过设置
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。
- 作用:用于获取人脸的特征向量。模型被预训练在
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. 程序流程
- 遍历
true文件夹中的图像文件,对每个图像使用MTCNN检测人脸,然后将检测到的人脸通过InceptionResnetV1模型转换为特征向量,并将特征向量保存为.npy文件到tz文件夹中,减少运行时候硬件消耗,和算力要求,增加实时性。
- 初始化摄像头,在一个无限循环中,不断从摄像头读取帧数据。对于每一帧,使用
MTCNN检测人脸,若检测到人脸,则获取其特征向量。接着,将该特征向量与tz文件夹中的所有已知人脸特征向量进行比较(通过计算欧式距离)。如果与所有已知人脸的距离都大于阈值,则判定为陌生人,并播放报警音频。
4. 打包成 exe 的相关内容
- 可以使用一些 Python 打包工具将代码打包成可执行文件(
.exe),例如PyInstaller。使用PyInstaller时,需要在命令行中执行类似pyinstaller --onefile your_script.py(your_script.py是实际的 Python 脚本文件名)的命令。PyInstaller会分析代码的依赖关系,并将 Python 解释器、代码以及所有依赖的库打包成一个独立的可执行文件,方便在没有安装 Python 环境的机器上运行。在打包过程中,需要注意处理一些潜在的问题,如资源文件(如alarm.wav、图像文件等)的路径问题,确保在打包后的可执行文件中这些资源能够被正确访问。同时,对于使用torch等深度学习库的情况,要确保打包后的可执行文件能够找到相应的模型权重文件和其他必要的配置文件。 - 我打包的时候,出了异常,找到等那三个文件所在的文件夹,pyinstaller --onefile --add-data "yourdata;facenet_pytorch\data" yourdocument\prepare.py ,把yourdat替换为a等那三个文件所在的文件夹,yourdocument替换为准备和运行监控py文件,打包可以让用户无需开发者复杂操作,让非开发人员能操作或者操作更简便