在小分辨率下人脸检测速度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帧/秒。
在树莓派3上的速度如下表所示,,在小分辨率下可以达到116FPS。
于老师将代码升级了三次,v2版本将模型参数量升级,并用8位量化加速,v3版本增加了五个关键点的检测,昨晚,于老师又将训练代码开源了。下面是于老师的三个版本的介绍以及开源训练代码的官网文章的链接:
libfacedetection的PyTorch训练程序开源
通过查看于老师开源的训练代码,我们可以看到该模型是一个SSD类型的目标检测模型,一共有四个检测分支,Backbone网络共16层,模型非常轻量级,可以说与我们前几天开源的人脸口罩检测模型有异曲同工之妙呀。不过该模型使用一个PriorBox层生成anchor,可以做到任意大小的输入。这点我们在后面也会借鉴过去。
网络结构如下图所示,该模型是在下降8、16、32、64倍后的四个尺度的特征图上接入分类定位层,四个层每个点的anchor数目分别为3、2、2、3,所有anchor的长宽比都是1:1。
定位层参数
整体网络结构如下:
libfacedetection网络结构
该网络共有参数232万,可以说比较轻量级了。在RetinaFace中,作者也同样对每个人脸同时回归了五个关键点。于老师这里的做法与RetinaNet一样,也是对每个anchor在回归cx、cy、dw、dh四个bounding box偏移量时,额外再增加10个节点的输出,分别对应五个关键点的cx、cy偏移量。
另外,模型在推理的时候,也将Batch Norm层的参数融合进了卷积层,从而实现一定量的网络加速。关于BN层融合,笔者后面会写一篇文章简单介绍一下。
对于训练代码的解析,后面再补上。(欢迎在公众号AIZOO关注我们)