LFFD: A Light and Fast Face Detector for Edge Devices

摘要

从微信推文中得知此人脸识别算法可以在跑2K图片90fps,仔细一看是在RTX2070下使用tensorrt下才能达到。最近刚好有个目标检测的任务,检测的目的其实差不多,我们篮球组比赛中需要检测篮球和排球,传统方法的鲁棒性不好,因此拟打算用自己写个神经网络结构在nuc x86 cpu下能够取得不错的推理速度和准确率。所以准备参考这篇论文复现并修改实现篮球、排球的实时目标检测任务。

本文提出了轻量级的人脸检测算法,可以达到2K图片90FPS(广告),本文的大体框架是借鉴SSD目标检测框架的,但是却是一个anchor free的人脸检测框架,因为作者认为感受野本身就是天然的anchor,所以作者通过精细设计感受野完成了本篇的人脸检测任务。认为浅层layer的有效感受野应该与小目标size比值较大,这样可以充分利用周围特征对人脸检测的贡献;深层layer由于其感受野比较大,检测大目标,大目标人脸本身有足够的鼻子、眼镜等信息可以帮助判别人脸,所以不需要太大的有效感受野与人脸比例。根据这些想法,作者设计了本文的人脸检测网络结构。

感受野和有效感受野

感受野通俗讲就是feature map上一个点对应原图的一片pixel区域,计算方法也比较简单,我自己简单写了一下。

总结起来公式就是
\[
RF_{i} = RF_{i-1} + (k-1)S\\
其中k为i-1层到i层的kernel size,S为全局stride
\]
其实对于感受野而言,并不是感受野内的所有点都对后面结果起到决定性作用,而是以感受野中心呈高斯分布的区域内的点对后面结果起到关键作用,这区域称为有效感受野ERF。

据此作者得出下面三个对人脸识别很有帮助的结论:

  1. 对于人脸小目标来说,ERF最好能尽可能覆盖context information
  2. 对于中等人脸,ERF只需要覆盖一部分context information
  3. 对于大人脸目标,ERF甚至不需要覆盖其他额外的context information

网络结构

作者认为RF就是天然的anchor,由于人脸目标一般是方的,所以不需要考虑各种比例的box。在box匹配的时候,作者认为rf中心落在gt内的box为正样本,同时落在多个gt中的box为负样本、其他没有落在任何gt中的box也为负样本。此外,作者定义的gray scale,后面再提。

对于这样的网络设计,作者是这么想的:

100 pixels的RF的有效感受野为20-40pixels,所以作者就分了四个part,tiny part的c8 RF SIZE为55,去检测10-15pixels的人脸,c10检测15-20,以此类推。其中rf与avg face scale的比值随着层数加深而减少,高层大感受野预测大目标就不需要太多的context information,前面讲了。

网络实现中全用的3*3和1*1的卷积核,实现起来很简单。data augmentation用了 color distort、Random sampling for each scale和Randomly horizontal flip。

loss是regression loss和classification loss加权和。

regression loss直接简单粗暴L2loss,预测相对值:

classification loss是crossentropy loss。

box匹配的时候定义了gray scale,认为处于gray scale的box也应该为负样本。

对c13出的box而言,其检测的人脸像素为20-40pixels,认为[18,20]以及[40,44]像素的人脸不被c13预测,这是因为这些人脸属于hard目标,网络往往只能看到局部特征,很难判别,所以c13这个brach不预测他,让别的branch预测,对训练有好处。

此外还用了负样本挖掘(sort负样本的loss,选择loss比较大的一部分训练,其他不参与梯度反传,加速收敛)。

训练参数:

xavier初始化、图像标准化x-127.5/127.5、sgd 0.9 momentum,0weight decay,init lr0.1.

1080ti训练了5天。

后续

复现并修改后的BasketNet:https://github.com/aoru45/BasketNet

论文:https://arxiv.org/pdf/1904.10633.pdf

最新文章

  1. C# Dictionary和Dynamic类型
  2. gcc与g++
  3. [Everyday Mathematics]20150225
  4. using System.Threading.Tasks;
  5. CF Spreadsheets (数学)
  6. CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
  7. MySQL 指定数据库字符集的 3 种方法。
  8. Replace是替代 Split分割字符串
  9. Python核心编程笔记--动态属性
  10. java web 项目中获取当前路径的几种方法
  11. ElasticSearch-6.2安装head插件
  12. ArcGIS Server服务器监控
  13. 简单的异步函数async/await例子
  14. [PHP]自定义session存储机制的两种方案
  15. 42-2017蓝桥杯b java
  16. VMware Linux虚拟机与WIN7操作系统共享无线网络上网配置
  17. s3c2440——按键中断
  18. 【安全开发】Perl安全编码规范
  19. Python: 字符串搜索和匹配,re.compile() 编译正则表达式字符串,然后使用match() , findall() 或者finditer() 等方法
  20. c++11 stl 学习之 pair

热门文章

  1. java CAS和AQS
  2. Servlet监听器——实现在线登录人数统计小例子
  3. 新手 vim常用命令总结 (转)
  4. python打开文件的方式
  5. 基于python的知乎开源爬虫 zhihu
  6. Puppet利用Nginx多端口实现负载均衡
  7. 《Head First 软件开发》阅读四
  8. 工作流学习之入门demo
  9. 【NOIP2012模拟10.31】掷骰子
  10. 【leetcode】1213.Intersection of Three Sorted Arrays