前言
本系统基于SSD模型和dlib库,SSD模型用于人脸检测,dlib用于人脸识别。为了便于在CPU服务器上运行,都用了最小的模型,所有权重文件共34MB。 git地址:/JavisPeng/FaceRecognitionWithMask
人脸检测
人脸检测:找到图片中人脸的位置,并用方框标出
dlib已经提供了完整的人脸识别API,但dlib提供的2个人脸检测模型存在如下2个问题
get_frontal_face_detector
get_frontal_face_detector基于机器学习,速度快但是准确度不高,有时离摄像头较远或戴口罩,会检测不到人脸
detector = dlib.get_frontal_face_detector()
cnn_face_detection_model_v1
get_frontal_face_detector基于cnn网络,准确度高,但无GPU运行速度实在太慢
detector = n_face_detection_model_v1('mmod_human_face_detector.dat')
为了兼顾准确度和速度,本文使用了SSD模型(mini版,仅3.9MB)进行人脸检测。
人脸检测
人脸识别:对给定的人脸和目标人脸数据库进行对比,找到该人脸
dlib使用landmark(人的五官关键点)和resnet网络提前人脸的特征(128维向量),从face_recognition_demo使用landmark对齐人脸并重采样,而resnet网络则用于提取人脸特征。
sp = dlib.shape_predictor('shape_predictor_5_face_landmarks.dat')
目标库构建
经测试,若只采用不戴口罩的图片作为目标库,对戴口罩的人脸虽可以检测,但准确度较低,因此我们把不戴口罩和戴裤子的人员图片都纳入到了目标库中(截图时加了马赛克)
所有目标图片只需放到一个文件夹下,然后调用create_known_faces即可构建目标库人脸特征。
@app.post("/update")def update():face_rec.create_known_faces('data/mask_nomask')return {"result": 'ok'}
性能测试
测试环境:
win10 Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz,3408 Mhz 16G内存
由于项目需要,只识别视频中最靠近摄像头的人脸
目标库10张,对1张640x480的图片进行100次识别,耗时39.96秒(2.5fps?)
目标库1280张,对1张640x480的图片进行100次识别,耗时89秒(1.2fps?)
本文还搭建了一个fastapi服务器,服务器返回参数依次是【用户名称,box的坐标,是否戴了口罩】
有待改进之处
1.对较大目标库,线性人脸相似度比较耗时,可以考虑使用ElasticSearch搭建一个数据库
2.模型部署可使用TVM或Openvino等自带优化的工具进行部署
参考:
ssd训练:/sgrvinod/a-PyTorch-Tutorial-to-Object-Detection
人脸数据库:/AIZOOTech/FaceMaskDetection
如果觉得《人脸识别:01)快速搭建一个人脸门禁打卡系统 支持戴口罩识别》对你有帮助,请点赞、收藏,并留下你的观点哦!