论文链接:arxiv
论文目录
AutoFocus: Efficient Multi-Scale Inference
文章提出了AutoFocus,一种高效的多尺度目标检测算法。相较于以前对整个图像金字塔进行处理,该方法以一种由表及里的姿态,仅处理哪些整体上看来很有可能存在小物体的区域。这个可以通过预测一张类别未知的分割图FocusPixels来得到。为了高效利用FocusPixels,另外一个算法用于产生包含FocusPixels的FocusChips,这样可以减少计算量并处理更更精细的尺度。在不同尺度上FocusChips所得到的检测结果综合时,会出现问题,我们也提供了解决问题的方案。AutoFocus在COCO上的结果有49.7%mAP(50%重叠下68.3%),与多尺度baseline相仿但是快了2.5倍。金字塔中处理的像素数量减少了5倍mAP只下降1%,在与RetinaNet采用相同的ResNet-101结构且速度相同时,高了10%mAP。
引言
人类寻找物体是一个动态的过程,且寻找时间与场景的复杂度是直接相关的。当我们的眼神在不同的点之间漂移时,其他的区域会被我们有意忽视。
然而,现在的检测算法是一种静态的推理过程且图像金字塔中的每个像素都受到了一样的对待,这使得过程变得没有效率。现在许多的应用都不强调实时性,而计算上的节省其实可以产生很大收益。
在COCO数据集中,虽然40%的物体都是小物体,但是它们一共只占了全图的0.3%。如果金字塔是3倍关系,则在高分辨率层要进行9倍的运算。XXX 。那么有没有办法在低分辨率下找出可能含有这些物体的区域呢?
以人眼方案类比,我们可以从低分辨率图像开始,找出有可能存在物体的区域再“聚集”到高分辨率。我们的AutoFocus会在一层中计算小物体的分割图FocusPixels,而在每一个FocusPixels上会用一个算法产生下一层所需要关注的chips。在COCO的最大分辨率层上我们可以只处理**20%的像素而性能不下降,如果只处理5%**也只下降1%而已。
相关研究
图像金字塔与卷积神经网络对CV十分重要。然而卷积神经网络无法做到对尺度不敏感,所以为了不同大小的物体需要依赖图像金字塔。虽然训练已经有了高效的方法,但是其推断时间依然远离实际使用标准。
目标检测加速有很长历史了。常用的有特征近似以减少尺度、级联、特征金字塔,且最后一个最近很多人研究。
AutoFocus为速度与精度之间提供了一个平滑的折衷,指出可以在低分辨率下看出小物体的所在,从而节约计算。FocusPixels的计算较为容易。
背景
先简单介绍一下SNIP,是一种多尺度的训练、推断算法。主要思想是训练针对某个特定scale的检测器而不是scale-invariant检测器。这样训练样本就局限于在某个尺度范围内,以适于这个检测器处理。比如在高分辨率仅处理小物体而高分辨率仅处理大物体,其优势在于训练时不用考虑尺度的变化。
由于训练时物体大小是已知的,我们在图像金字塔中可以忽略大量区域而只处理物体周围的区域。SNIPER说明这样低分辨率的训练与全图训练相比并不会降低性能。同样,在推断过程中如果可以在大分辨率图像上预测可能出现小物体的chip,我们也就不用处理整张高分辨率图片。在训练时,许多物体会被裁剪、扭曲,这可以当作是一种数据扩增,然而当这个情况在推断时出现,则会产生错误,所以我们还需要一个算法来整合不同尺度上的检测结果。
AutoFocus框架
如SIFT、SURF等传统分类特征包含两个组件,一个detector和一个descriptor。detector只包含轻量级的操作如DoG、LoG,用于在整张图片上找到感兴趣的区域;descriptor,一般来说计算量比较大,则只需要关注那些咸兴趣的区域。这个级联结构保障了图片处理的效率。
同样,AutoFocus框架也是用于预测感兴趣的区域,并丢弃在下一尺度不可能存在物体的区域,并将裁剪和缩放后的区域传递给下一尺度。AutoFocus由三个部分组成:FocusPixels,FocusChips和focus stacking。
FocusPixels
FocusPixels定义在卷积网络特征图的粒度之上(如conv5),如果特征图上某个像素与小物体有重叠则标注为一个FocusPixel。(小物体:面积处于一个网络的输入范围之内)。训练过程中,FocusPixels标注为正,某些与不在面积范围内的物体有重叠的像素标注为无效,其他像素标注为负。AutoFocus的训练目标是使在FocusPixels区域产生较大的激活值。
给定一个
X
×
Y
X\times Y
X×Y的图片,以及一个步长为s全总卷积网络,则特征图标签为
X
′
×
Y
′
,
X
′
=
⌈
X
s
⌉
,
Y
′
=
⌈
Y
s
⌉
X'\times Y', X'=\lceil\frac{X}{s}\rceil, Y'=\lceil\frac{Y}{s}\rceil
X′×Y′,X′=⌈sX⌉,Y′=⌈sY⌉。其标签的标注方法如下:
l
=
{
1
I
o
U
(
G
T
,
l
)
>
0
,
a
<
G
T
A
r
e
a
<
b
−
1
I
o
U
(
G
T
,
l
)
>
0
,
G
T
A
r
e
a
<
a
−
1
I
o
U
(
G
T
,
l
)
>
0
,
b
<
G
T
A
r
e
a
<
c
0
o
t
h
e
r
w
i
s
e
l= \begin{cases} 1&IoU(GT,l)>0, a<\sqrt{GT Area}<b\\ -1&IoU(GT,l)>0,\sqrt{GT Area}<a\\ -1&IoU(GT,l)>0,b<\sqrt{GT Area}<c\\ 0&otherwise \end{cases}
l=⎩⎪⎪⎪⎨⎪⎪⎪⎧1−1−10IoU(GT,l)>0,a<GTArea<bIoU(GT,l)>0,GTArea<aIoU(GT,l)>0,b<GTArea<cotherwise
如果同时多个物体与同一像素重叠,优先给正标注。我们的网络输入是512x512,然后a,b,c取值分别是5,64,90。对于太大或太小的物体,我们认为当前尺度上没有足够人信息进行判断,所以会标定为无效。整个网络结构如下图。训练时加两层带ReLU的卷积(3x3和1x1)以及一个二分类softmax来预测FocusPixels。
FocusChip生成
推断过程中,我们标注输出概率大于阈值t的像素(这个参数可以控制加速比),得到一些连通域。对于每一个域,我们做一次膨胀使其包含一些有助于识别的周围信息,膨胀后相连的部分要合并。然后,我们生成一些包含连通域的chips(不同chips可能重叠,如有重叠则合并)。有些chip可能太小缺少必要信息,并使chip的大小变化很大,为了效率我们要求保证一个最小的chip size。算法流程如下:
级联推断过程
我们的过程类似于图片金字塔的推断过程但是在过程中一步步去除不关注的图片区域。我们在最低分辨率上进行检测并生成chips,然后在这些chips再进行检测和生成chips。
Focus Stacking
这种级联分类器的一个问题是在chip边缘本来的大物体可能生成一些被剪裁的检测目标。在下一个尺度上,由于剪裁过了,所以会检测到小的、错误的正例False Positive。之前算法中的第二步膨胀其实就是为了保证没有物体会出现在chip的边缘。这样,当我们在局部图片chip的边缘检测到物体时,就可以把这个检测结果丢弃,即使其在SNIP的范围内。
也有一些物体在图片边缘的特殊情况。如果chip和图片共享一条边的话,我们会检查检测结果的其他边是否完全在里面,如果在,则保留它,否则丢弃。
在每一尺度得到有效检测结果后,我们可以将不同尺度上的结果进行整合,将这些结果映射到原图坐标系上。最后,非极大值抑制NMS用于聚集。网络结构如之前的图片所示。
数据集与实验测试
我们在COCO数据集上验证了我们的算法。COCO2017包含了118,000张训练图片、5000张验证图片与20288张测试图片。SNIPER是我们的baseline,而我们仅仅在结构上加了一个全卷积头用于预测FocusPixels,结构与训练计划没有其他更改。测试时我们在Focus Stacking上采用了Soft-NMS( σ = 0.55 \sigma=0.55 σ=0.55)。与SNIPER类似,三种分辨率分别是(480,512)、(800,1280)、(1400,2000)。
由于FocusChips会有不同尺寸的,我们把相似大小与长宽比的chips当作一个batch来提高效率。有时候,我们在批量训练时会进行padding,可能会细微改变处理像素的数量。大数据上处理时,这些花费可以忽略不计,因为可以在不减少batch size的情况下增加分批数。
FocusPixels与FocusChips的统计
在最高分辨率图片中,FocusPixels比率非常低(约4%),所以非常小的像素需要在那个尺度下处理。考虑到上采样,FocusPixels在图片上的映射大概只平均占据632区域(最高分辨率16022)。低一层的话,虽然FocusPixels的比例增至~11%,但是也只在9402中占据1022。在使用了3x3的膨胀之后,在第3和第2层的比例分别增加至7%和18%。
生成chip的算法中,我们曾提到chip的最小大小问题,我们也计算了这个加速比的上限。这是基于FocusPixel预测是没有误差的前提下的。可以看出,chip最小大小
k
k
k越小处理的像素越少,从512谈到64可以理论上加速10倍,但是因为周围信息减少会影响检测效果。
FocusPixels预测
两条标准。一,在两个不同分辨率下FocusPixels的召回率,这个可以给一个用低分辨率来小物体精确定位的上限;然而,不是所有FocusPixels内的GT都能被检测出来,所以另一个是被成功检测出来的物体的GT boxs(有一个0.5以上IoU的检测得分高于0.5)内的Focus Pixel准确度。
两个标准下我们的得分都更高一些。在scale2上FocusPixels仅占了5%面积就覆盖了所有confident detections,而在scale1上仅占了25%。
FocusChips质量
虽然FP已经足够生成需要处理的区域,但目前的软件要求输入图像是一个矩形。我们的标准与前一节类似,一个是被Chips包含的GT boxes的召回率,另一个是被Chips包含的GT boxes被正确检测的召回率。为了在scale2上得到更好结果,FocusChip比FocusPixels多占了5%面积,而在scale1上则多占了10%。
速度-精度 折衷
在不同的参数选择上进行网格式遍历:膨胀参数、最小chip大小以及阈值,在验证集中100张图片子集上进行实验。对于一给定平均数量的像素,我们看哪种参数配置能得到更高的mAP。既然有两层,我们先找到适合最高分辨率的参数,然后固定之再找到适合scale2的参数。
首先用了scale1-3的baseline是47.5%(68.3%@0.5IoU),而只用scale1-2则只有45.4%,只用scale2则37%。主要原因是我们的检测器只训练了特定尺度的物体识别,所以只用一个尺度测试结果不好。在效果不变差的情况下少处理2.8倍的像素量;而下降2%精度就可以少处理5倍像素量。
我们还在scale2上进行了部分实验。在用scale1-2的情况下,scale3只用1/5就可以达到47.5%,仅损失0.5%就可在高分辨率中减少11倍的像素量。损失1%减少20倍,但依然比只用scale1-2要好1.5%。
在COCO测试集上的结果:以SNIPER的47.9%(68.3%@0.5IoU)为标准,AUtoFocus可以在Titan X Pascal GPU上每秒处理6.4张图片(SNIPER2.5张)。以ResNet-101为基准的RetinaNet则是6.3张,精度只有37.8%。我们同时给出了不同检测器处理的像素数。比SNIPER好的检测器(MegDet、PANet)会更慢,而我们则是在这个精度下最快的检测器。如果我们以后用cascade-RCNN的话效果会更好。
展望
目前的结果是基于Faster RCNN结构的,我们可以将AutoFocus与YOLOv2或者RetinaNet相结合;一些其他的任务如姿态估计、实例分割也可以应用。与追踪再结合的话还可以得到视频处理的加速算法。