快如闪电的人脸检测——Tengine+libfacedetection

Author Avatar
YaHei 3月 21, 2019

前几天,深圳大学于仕琪老师突然开源了libfacedetection——号称最快的人脸检测项目(超越OpenCV,史上最快人脸检测系统开源 | 新智元)吸引了一大波人脸检测应用开发者围观,紧接着Tengine也立马对libfacedetection模型增加了支持,让我们一起来看看,在Tengine加持下的libfacedetection能快到什么程度吧!

libfacedetection

github项目:https://github.com/ShiqiYu/libfacedetection

模型结构

本次开源的库是基于卷积神经网络实现的,320x240模型如下图所示:
model

其整体框架参照SSD,并由若干组类似VGG的卷积层组合堆叠而成——

  • 和VGG一样,大部分降采样都由2x2最大池化完成,不过libfacedetction的入口部分则与InceptionResNet类似——由卷积层完成降采样(Inception、ResNet这种大网络喜欢一上来先来一层7x7/s2的卷积下采样,改进版则用三层3x3卷积替换7x7;像Mobilenet这些小网络就直接一层3x3/s2的下采样,这里的libfacedetection也是如此);
  • 与VGG类似的卷积层组合,两到三个带激活的卷积层一组,不同的是,VGG用若干3x3卷积堆叠作为一组,而libfacedetection则是采用【3x3 + 1x1】或【3x3 + 1x1 + 3x3】的组合,将其中一个3x3卷积层替换为1x1不仅降低了MAC而且避免了im2col
  • 比较特别的是,每一组卷积之后送去回归和分类之前都经过一个Normilization层对特征图进行归一化操作;
  • libfacedetection设置了四组锚框,总计$3600+600+140+45=4385$;
  • 参数数量约660K,乘加次数约80M(作为参照:MobileNet-v1-1.00约4.25M参数和570M次乘加运算)
    没细算,参数数量用caffemodel的文件大小简单除了个4;乘加次数则是用gluon随手搭了个主干(实际应该比这个数字更大一些),然后调mxop测算了一下MAC,粗糙数据,仅供参考。

检测效果

原图:
test

FP32精度输出:
test

INT8精度输出:
test

性能表现

至于速度,于老师的github上已经有了与OpenCV Haar+AdaBoost的比较数据,引用至此而不再赘述:
experiment

加持Tengine的libfacedetection

用开发者版的Tengine分别在EAIDK-610(RK3399,4A53@1.4GHz+2A72@1.8GHz)和树莓派3B(BCM2837,4A53@1.2GHz)、树莓派3B+(BCM2837,4A53@1.4Hz)平台上测试libfacedetection——
使用于老师github上的caffe模型,输入大小为320x240。

EAIDK-610

CPU-Core Time(fp32) FPS(fp32) Time(int8) FPS(int8) FPS(int8)/FPS(fp32)
1A53 68.26ms 14.65 59.25ms 16.88 1.1520
2A53 50.66ms 19.74 49.61ms 20.16 1.0213
3A53 45.97ms 21.75 47.90ms 20.88 0.9598
4A53 42.97ms 23.27 46.03ms 21.73 0.9335
1A72 34.70ms 28.82 24.56ms 40.71 1.4126
2A72 26.41ms 37.86 20.59ms 48.57 1.2828

由于大小核共同运算时速度比单个大核还慢,所以此处不列出大小核测试的数据。

  • 最快可以达到48.57FPS
  • 2A53相对于1A53有相对可观的提升,3A53、4A53就只有少量的提升了;
  • 相比于A53,大核的A72量化后能有比较明显的提升

树莓派3B

CPU-Core Time(fp32) FPS(fp32) Time(int8) FPS(int8) FPS(int8)/FPS(fp32)
1A53 93.96ms 10.64 104.11ms 9.61 0.9025
2A53 66.74ms 14.98 62.90ms 15.90 1.0611
3A53 58.03ms 17.23 50.73ms 19.71 1.1438
4A53 56.57ms 17.68 43.69ms 22.89 1.2947

树莓派3B+

CPU-Core Time(fp32) FPS(fp32) Time(int8) FPS(int8) FPS(int8)/FPS(fp32)
1A53 89.90ms 11.12 94.61ms 10.57 0.9502
2A53 65.87ms 15.18 58.34ms 17.14 1.1290
3A53 59.76ms 16.73 47.99ms 20.84 1.2451
4A53 58.22ms 17.18 41.26ms 24.24 1.4111