2838198e6f60d81265f0921e0d61acc2.png
在小分辨率下人脸检测速度1929.6FPS,支持5个人脸关键点,支持导出为纯C++代码,不需要任何依赖库,这位南方科技大学的于仕琪老师刚刚把他的训练代码开源了!
Github训练代码链接:https://github.com/ShiqiYu/libfacedetection.train
Github推理代码:https://github.com/ShiqiYu/libfacedetection
来源:AIZOO

南方科技大学的于仕琪老师在19年开源了一个C++版本的人脸检测工程libfacedetection,该项目不依赖任何库,可以在CPU上达到实时。在VGA分辨率(640x480)下,在i7的CPU上可以达到72帧/秒,在128x96的输入分辨率下,速度更是高达1929帧/秒。下面是在i7 CPU上的速度:

ad9830c7953908e9c6e68f986273b0c6.png
酷睿i7 CPU 推理速度

在树莓派3上的速度如下表所示,在小分辨率下可以达到116FPS。

6f99777feb38db8c24c5c3460f13c97d.png
树莓派3 推理速度

于老师将代码升级了三次,v2版本将模型参数量增加一倍,但用8位量化加速,所以速度没有降低,v3版本增加了五个人脸关键点的检测,昨晚,于老师又将训练代码开源了。下面是于老师的三个版本的介绍以及开源训练代码的官网文章的链接:

  1. 开源啦,一个极快速的CNN人脸检测算法
  2. 算法升级!一个开源的极快速CNN人脸检测算法
  3. 算法升级!开源极快速CNN人脸检测新增人脸关键点功能
  4. libfacedetection的PyTorch训练程序开源

通过查看于老师开源的训练代码,我们可以看到该模型是一个SSD类型的目标检测模型,一共有四个检测分支,Backbone网络共16层,模型非常轻量级,可以说与我们前几天开源的人脸口罩检测模型有异曲同工之妙呀。不过该模型使用一个PriorBox层生成anchor,可以做到任意大小的输入。这点我们在后面也会借鉴过去。

网络结构如下图所示,该模型是在下降8、16、32、64倍后的四个尺度的特征图上接入分类定位层,四个层每个点的anchor数目分别为3、2、2、3,所有anchor的长宽比都是1:1。

32c052895f1fa98a5ef69f5960adfcc7.png
定位层参数

整体网络结构如下:

529c23e8949da9f4690282146a3f1de9.png
libfacedetection网络结构

该网络共有参数232万,可以说比较轻量级了。在RetinaFace中,作者对每个人脸同时回归了五个关键点。于老师这里的做法与RetinaNet一样,也是对每个anchor在回归cx、cy、dw、dh四个bounding box偏移量时,额外再增加10个节点的输出,分别对应五个关键点的cx、cy偏移量。

另外,模型在推理的时候,也将Batch Norm层的参数融合进了卷积层,从而实现一定量的网络加速。关于BN层融合,笔者后面会写一篇文章简单介绍一下。

对于训练代码的解析,后面再补上。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐