模型仅有7M:轻量级高精度人脸检测方法DBFace

机器之心报道
参与:RacoonX
这个仅7M大小的人脸检测模型几乎检测出了世界最大自拍照中的所有人像!
模型仅有7M:轻量级高精度人脸检测方法DBFace
文章图片
项目简介
之前机器之心报道过一个跨平台人脸检测项目 , 在CPU上就能轻松跑出1000FPS 。 这次介绍的项目也是一个轻量级人脸检测项目 。 不同的是 , 该项目在保持较小参数量的前提下 , 检测精度要高很多 , 并且只需要OpenCV和PyTorch就能运行 。
DBFace是一个轻量级的实时人脸检测方法 , 其有着更快的检测速度与更高的精度 。 下图展示了多种人脸检测方法在WiderFace数据集上的测试效果 。 可以看到不仅DBFace模型的大小最小 , 其在Easy、medium、Hard三个测试任务中均取得了最高的检测精度 。
模型仅有7M:轻量级高精度人脸检测方法DBFace
文章图片
项目地址:https://github.com/dlunion/DBFace
WiderFace是一个关于人脸检测的基准跑分数据集 , 其中包含32,203张图片以及在各方面剧烈的393,703张人脸 , 数据集具有从简单到困难等不同难度的任务 。 下图是改数据集中一些样本的展示 , 可以看到 , 要想准确地检测出图中所有人脸还是很有挑战的 。 DBFace在该数据集的不同任务上分别取得0.925、0.920、0.847的准确率 , 实属不易 。
模型仅有7M:轻量级高精度人脸检测方法DBFace
文章图片
有关WiderFace的详细介绍请读者移步其官网:
http://shuoyang1213.me/WIDERFACE/
效果展示
下图展示了不同人脸检测方法在WiderFace数据集上的P-R曲线 。 P-R曲线可以较直观地展示二分类器的Precision和Recall 。 当需要对不同算法进行比较时 , 若某个二分类器的P-R曲线被另一个二分类器的P-R曲线完全包住 , 即表明后者的性能优于前者 。 从图中可以看到 , DBFace包围的面积在三个任务中均相对较大 。
模型仅有7M:轻量级高精度人脸检测方法DBFace
文章图片
当阈值设置为0.2时 , DBFace对这张世界最大的自拍照检测效果如下图所示:
模型仅有7M:轻量级高精度人脸检测方法DBFace
文章图片
可以看到 , DBFace的检测准确率非常高 , 图中很多人脸甚至放大后单凭肉眼也很难分辨 , DBFace却仍然能够检测出来 , 并且模型大小仅7M , 完全能够在边缘设备上实时运行 。 于是 , 机器之心也上手测试了一番 。
项目实测
项目作者提供的代码示例中包含对静态图片的检测 , 同时也有一个调用电脑摄像头的GUI 。 值得注意的是 , 该项目并不需要太多依赖项 , 只要有PyTorch、Numpy和OpenCV即可运行 。 由于以上依赖环境都是非常常用的扩展库 , 网上有大量相应安装教程 , 这里就略过其安装步骤 。
在main.py中 , image_demo()与camera_demo()分别对应静态图片检测与调用摄像头进行检测 。 静态图片检测代码为:
defimage_demo():
dbface=DBFace()
dbface.eval()
ifHAS_CUDA:
dbface.cuda()
dbface.load(''model/dbface.pth'')
detect_image(dbface,''datas/selfie.jpg'')
以上代码将会读取训练后的模型 , 对图片datas/selfie.jpg进行检测 , 并将结果保存到detect_result/selfie.draw.jpg 。
让我们来看一下检测效果:
模型仅有7M:轻量级高精度人脸检测方法DBFace
文章图片
从上图可以看到 , 即使在室内灯光颜色、明暗差别较大的环境下 , DBFace也检测出了图中几乎所有的人 , 甚至是中间那个一边画彩虹 , 一边指向闪耀灯球戴头盔的人也难逃其「魔掌」 。 当然 , 由于这里设置的检测阈值较低 , 存在一些误分类的现象 。 图中一些人的手和右上角的灯球就被误检测为了人脸 。 适当调高阈值即可消除此现象 。
调用电脑摄像头检测的代码为:
defcamera_demo():
dbface=DBFace()
dbface.eval()
ifHAS_CUDA:
dbface.cuda()
dbface.load(''model/dbface.pth'')
cap=cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,480)
ok,frame=cap.read()
whileok:
【模型仅有7M:轻量级高精度人脸检测方法DBFace】objs=detect(dbface,frame)
forobjinobjs:
common.drawbbox(frame,obj)
cv2.imshow(''demoDBFace'',frame)
key=cv2.waitKey(1)&0xFF
ifkey==ord('q'):
break
ok,frame=cap.read()
运行以上代码将会生成一个640x480的GUI界面 , 调用摄像头实时进行人脸检测 。
感兴趣的小伙伴赶快将本项目gitclone到本地测试一下吧!


    推荐阅读