本文转载自: https://blog.csdn.net/shuzfan/article/details/52625449
本次介绍一篇来自旷视科技的人脸检测文章:
《2016 ACM MM UnitBox: An Advanced Object Detection Network》.
代码应该是不会放出来了,但好在实现比较简单。(插播一句,论文里面说速度可以达到12fps,我有点慌,大家看看科学不)
—————————— 分割线 ——————————
Introduction
目标检测可以视作两个任务:目标定位 + 视觉识别。
基于深度学习的目标检测大致又可以分为三个部分:
(1)Region Proposal
这一步主要是为了寻找人脸候选区域,常见的方法有Selective Search、 EdgeBoxes 和stages of cascade detectors。这一步往往是算法的瓶颈所在,与性能和速度关联紧密。
(2)Recognition and Categorization
这一步就是为了对窗口进行分类,二分类(人脸非人脸),或者多分类(多目标检测)。
(3)Bounding Box Regression
进一步调整检测框,使之更加精准。(可以看做由粗到细的refine过程)
对比两种方法:
Faster R-CNN: 使用region proposal network(RPN)来预测框,但是由于anchor box的尺寸和长宽比都是预先设定的,因此很难处理大的形状变化,特别是小的目标。
Densebox: 直接预测当前点与ground truth的四条边的距离,并且使用L2 Loss。但是为了检测不同尺度的目标,Densebox使用了图像金字塔,所以计算量很大。
上述两种方法都使用了L2_Loss,这也就意味着把四个坐标当成了独立变量,这显然是与实际不符的,这也是为什么框不准的原因。
因此
为了方便灵活灵活地处理各种角度的目标,作者提出了一种新的IOU_Loss,将四个回归值当做一个整体来处理,不仅提高了准确率而且加速了收敛。
—————————— 分割线 ——————————
IOU Loss Layer
这部分就进入正题了,首先说明一下,预测的四个值并不是人脸框的坐标,而是坐标差值,如下图:
从上图出发,我们来认识几点:
L2 Loss Layer
L2 Loss可以看做是欧氏距离,很明显这里面四个坐标是被当做独立变量来优化的。这可能导致下面的问题:
左边的人脸框明显比右边的要准一点,但是脸太大,则导致loss最终反而比右边的大,然后我们就去惩罚这个loss,结果最后检测器对小人脸效果就不好了。
IOU Loss Layer:Forward
IOU Loss的定义在第一张图里面其实已经给出来了,这里给出计算一整个人脸的Loss的流程图:
补充说明:
(1)UnitBox是一个端到端的网络,即输出和输入尺寸一致(后面会讲),因此上面是在循环计算每一个像素的loss;
(2)在输出四个坐标的前一层是一个ReLU层,以此来保证四个预测距离都是正值;
(3)IOU∈[0,1]IOU∈[0,1],因此可以直接忽略bounding box的尺度问题。因此UnitBox可以在多尺度上训练而直接在但尺度上测试。
IOU Loss Layer:Backward
这一部分正常求导即可,有兴趣可以自己导一下,或者参看原文。这里直接给出最后的导数定义:
由上式可以看出,IOU Loss的目的就是使重叠区域越大越好。
—————————— 分割线 ——————————
UnitBox Network
网络结构如下图:
使用VGG-16模型finetune,只不过去掉了全连接层,然后又搞成了带有两个分支的全卷积网络:一个分支是pixel级别的bounding box差值坐标,一个是分类得分。
显然输入应该有3个:原始图片,分类得分图(来描述一个像素是否落入ground truth),包围框误差坐标图(来描述与ground truth四条边的距离)
上图中的虚线表示线性插值和crop操作,以保证输出和输入大小一致。
分类得分使用的是sigmoid交叉熵loss,该loss既可以和IOU Loss分开训练也可以联合训练。
如何最终定位人脸:
选定一定阈值,用一个椭圆在分类得分图上框出一个人脸,,然后选择中心坐标,找到其对应的bounding box。
—————————— 分割线 ——————————
Experiments
使用汤晓鸥的WiderFace数据集,这个数据集比较难。
结论:收敛更快,对尺度更鲁棒。