简要

Deepface可以识别人脸,对比,分析情绪性别种族年纪等,比较万能,支持stream视频流检测。比较轻量,引入到现有开发比较快。


安装

使用DeepFace这个库,第一次使用需要下载他的模型,默认没有代理,下不下来(或者速度慢)可以根据报错找到原下载链接(在作者另外一个库中)手动下载保存到c盘用户文件夹的.deepface文件夹下面(第一次调用这个库会自动创建这个文件夹),ssd的文件在opencv仓库,也可以通过下载失败报错的提示直接去原仓库手动复制和下载,应该是有加proxy的参数的地方但是我看readme没找到。


部分功能的使用&注意

DeepFace提供了几种识别人脸的后端(backend参数),测试感觉ssd速度可行(默认的OpenCV在我这里检测不到人脸,其余两个比较慢帧率很低,我是视频检测),ssd后端需要下载的文件下载方法可以看上方说明。
这里截取一小段project代码,识别画面中的情绪使用,注意他给的img_path(第一个参数)的文档其实是这样的:

exact image path, numpy array (BGR) or base64 encoded image could be passed.

也就是可以传入路径,BGR格式的数组(cv默认读出来的,不需要做image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))或者base64编码的图像。silent可以让它少输出一些内容。还有一个enforce_detection默认为True,意思是检测到人脸他才做actions(表情、年龄、性别等的分析)否则会抛出valueError。

try:
    res = DeepFace.analyze(numpy.array(frame), actions=['emotion'], silent=True, detector_backend='ssd')
    self.update_result(res[0]['emotion'])
except ValueError as e:
    # Face not found
    pass
except Exception as e:
    print(e)

这里就可以不用库本身自带的stream(有些功能可能并不需要,anyway),但是把视频流的每一帧都放进来分析,速度还是很不错,精度个人觉得一般但是说得过去,可以自己练完替换模型权重。
数据返回的格式是一个数组,分别对应画面中检测到的某个人脸(没测试,但是推理应该是这样不然没道理这么返回数据)。每一个item包含指定的actions的数据(表情、年龄、性别等的分析数据)以及人脸在画面中的位置,可以通过这个数据绘制选框框住人脸。


可能的报错和解决方案

接下来是遇到的报错

error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’

同时还有一个小坑:lib/site-packages/cv2/data/haarcascade_eye.xml这个文件,虚拟路径也不能有中文否则也会报错(我的路径一开始有“作业”两个字报错说无法以read mode打开这个xml文件,路径改为英文就成功了),注意看最开始的报错。
检测不到人脸的时候也会报ValueError,注意try except。