论文名称:CornerNet: Detecting Objects as Paired Keypoints
论文链接:
CornerNet
简介
这篇文章是ECCV2018的一篇目标检测论文,该论文的创新之处在于使用Keypoints代替原来的anchor思想进行目标检测,提出检测目标左上点和右下点来确定一个边界框,提出一个新的池化方法:corner pooling,在mscoco数据集上达到42.2%的ap,精度上是当时的单阶段目标检测器的state of the art,但是速度略慢,大约1fps(论文为Titan X 244ms/f),无法满足工程需求。
相对于基于anchor检测器创新意义有:
-
anchor数量巨大,造成训练正负样本不均衡(anchor机制解决方式为难例挖掘,比如ohem,focal loss)
-
anchor超参巨多,数量,大小,宽高比等等(比如yolo多尺度聚类anchor,ssd的多尺度aspect ratio)
(一) Overview
目标检测主流有One-Stage系列与Two-Stage系列。Two-Stage先由算法生成一系列作为样本的候选框(Region Proposal),再通过卷积神经网络对候选框进行分类回归,典型代表有R-CNN系列;而One-Stage系列则不用产生候选框,直接将目标边框定位的问题转化为回归问题处理 ,典型的代表有YOLO系列、SSD系列。正是由于两种方法的差异,在性能上也有不同,前者在检测准确率上占优,后者在算法速度上占优。
上述所讲的两者,都有用anchor这个概念,但是本文的作者认为使用anchor来做目标检测有缺点:anchor的数量太大,参数太多,也就是anchor的设置太讲究了 。本文引入了新的单阶段检测方法,其并未依赖于anchor box。本文将框的左上角及右下角两个角点看作一组关键点。用一个卷积网络预测所有同一类别的样本的左上角点的heatmap,及右下角点的heatmap,及一个检测到角点的embeding vector。embeding用于组合属于同一个目标的一对角点,网络预测其相似的embedings。本模型简化了模型的输出,同时移除了anchor的设计步骤。本文受人体关键点检测思想启发,整个思路图如下:
Detecting Objects as Paired Keypoints,Keypoints,作者把目标检测问题当作关键点检测问题来解决,检测目标的两个关键点——左上角(Top-left)和右下角( Bottom-right ),有了两个点之后,就能确定框了。
Cornernet的另一个创新点是corner pooling,有利于卷积网络定位边界框的角点。如下图所示,一个边界框的角点经常在目标物的外边。这种情况下,一个角点无法根据局部特征进行定位。为了确定一个像素点处是否存在左上角的角点,需要从右侧观察边界框其顶部水平方向,同时,从下观察边界框的最左边。
Corner pooling受上述启发,如下图,输入两个feature maps,对第一个Feature map的所有向量的左侧进行max pool操作,对第二个feature map所有向量的顶部进行max pool,最后将二者的结果进行相加处理:
本文认为基于Corner 的目标检测要优于proposals的检测方法主要有两点:
- 由于框的中心依赖于四个边很难进行定位。而定位角点只需要定位两条边,同时引入了coner pool的先验,因此,定位更加简单。
- 角点高效的离散了框的解空间,只需要 O ( w h ) O(wh) O(wh)的角点可以表示 O ( w 2 h 2 ) O(w^2h^2) O(w2h2)的anchor box的数量。
(二) CornerNet
算法的一个流程:
- 基础网络也就是Backbone使用的是Hourglass网络,这也是从人体姿态估计处借用来的灵感。顾名思义,这个网络的形状非常像沙漏,网络前半部分通过下采样不断减少feature map,后面则通过上采样增大feature map,并且中间还有类似fpn那样将前后网络相加的操作。沙漏网络在关键点检测上已经证明了其有效性。
- 网络有两个分支,一个分支预测Top-left Corners,另一个预测Bottom-right corners。
- 每个分支有三个线路,heatmaps预测哪些点最有可能是Corners点,embeddings主要预测每个点所属的目标,最后的offsets用于对点的位置进行修正。
整体流程:将检测框的左上及右下的点作为一组角点。一个单一结构的卷积网络用于预测两组不同目标类别的heatmaps,一组heatmaps用于预测左上角的点,另一组用于预测右下角的点,同时预测一个embedings向量,比如来自同一目标类别的两个角点之间的距离很小。为了得到更加紧密的边框,网络同时预测一个偏差用于调整角点的位置。有了,两个角点的heatmaps,embeding vectors,及Offset,后面通过使用一个后处理的方法来获得最终的边框。如下图所示,使用hourglass 网络作为backbone,其后接着两个预测模型,一个用于预测左上角的点,另一个用于预测右下角的点。每个模型都有自己的corner pool层,在进行预测heatmaps,embeding vector,offset之前pool hourglass 网络的feature maps.本文并使用不同的尺寸检测目标物,只借助模型的两个输出角点进行目标检测。
输入图片经过Hourglass主干网络后,得到特征图,然后将该特征图作为两个Prediction模块的输入,分别是Top-left corners和Bottom-right corners。在每个预测模块里面,先经过Corner Pooling,然后输出Heatmaps, Embeddings, Offsets三个分支。
heatmaps预测哪些点最有可能是Corners点,embeddings的作用是分清哪些点是一组,最后的offsets用于对点的位置进行修正,因为原图到特征图分辨率已经降低了。
2.1 Hourglass Network
CornerNet将Hourglass 网络作为backbone,Hourglass网络被首次用于人体姿态估计任务,包含多个hourglass模型,hourglass模型首先会对输入图片通过一系列卷积池化操作进行降采样,然后通过一系列上采样,反卷积等操作恢复至输入的分辨率。为了弥补最大池化过程中丢失的细节信息,增加了跳跃结构,来恢复上采样的细节信息。hourglass在单一结构中同时捕捉了局部及全局特征信息。当多个hourglass模型组合在一起时可以获得更高级别的特征信息。本文的hourglass网络包含两个hourglass模块,并对其结构做了适当的更改。使用stride 2的卷积操作替换max pooling进行尺寸缩小,本文将分辨率减小5倍,通道数为{256,384,384,384,512},在对特征进行上采样时,在最近的相邻上采样块中添加了两个残差模型。每个跳跃连接也由两个残差模型组成。在一个hourglass模型的中间存在四个残差模型,通道数为512,在hourglass模型之前,使用7x7x128,stride=2的卷积将输入分辨率降4倍。同时接一个stride 为2通道数为256的残差模块。在训练过程中增加了中间监督,但其预测结果并未返回网络,因为对最终结果产生不良影响。在hourglass模型的输入及输出使用1x1的conv-BN模型,对结果通过后接ReLU及通道数为256的残差块进行像素级相加进行特征融合作为下一个hourglass的输入。hourglass网络的深度为104,只用网络的最后一层特征作预测。原始hourglass网络如下:
原始图片的大小为511×511×3,但这并不是主干网络的输入,主干网络的输入是128×128×256,为什么呢?因为作者是先将512的原图进行缩小四倍,缩小四倍用的操作是先用7×7的卷积核卷积,并且步长为2,通道数为128,这样就缩小两倍了,还有两倍是用了一个残差块,并且步长为2,通道数为256.所以,主干网络真正的的输入是128×128×256,主干网络的输出是128×128×512,为什么分辨率没有变化呢?因为这个主干网络叫做沙漏网络,样子像沙漏,他是先下采样后又上采样,连续堆叠了两个这样的沙漏,过程中经过了特征融合等等,这里总共用了104层,有兴趣的同学看这里:Hourglass,所以,从输入128×128×256,到主干网络的输出就是128×128×512。
主干网络出来后,面对的就是两个Module,一个用于预测左上角点,一个用于预测右下角点。
2.2 角点的检测
预测两组heatmaps,每组heatmaps的尺寸为HxWxC。C代表目标物的类别。没有背景这个类别,每个通道的feature map为二值型的mask,代表是否为该类别。对于每个角点,存在一个ground truth positive location,其余的位置为negative.本文降低了对正样本附近圆周位置的负样本的惩罚,因为,一对距离对应ground truth很近的负样本角点也可以产生一个较好的边界框,包围目标物。如下图所示 本文通过确保半径内的一对点将生成与ground truth box重叠度至少为0.3的框来确定对象大小的半径。有了半径,惩罚度由unnormalized的高斯分布生成。等式如下
已知
P
c
i
j
Pcij
Pcij代表第(i,j)类别为c的概率,
y
c
i
j
ycij
ycij代表对应的经过unnormalized 高斯分布增强过的ground truth 标签,定义了新的Focal Loss如下:
在下采样阶段中,(x,y)位置的像素被映射为(x/n,y/n),而对其还原时,会存在一定精度上的损失,对IOU造成影响,因此,在对其remap到输入尺寸之前,预测位置偏移对角点的位置进行微调:
2.3 角点组合(embedings)
一张图中可能会存在多个目标,因此,可能会检测到多组角点。这里需要确定,一组左上角及右下角的点是否是来自同一个边界框的。本文借鉴人体关键点检测中基于一组embeding 向量来确定是否将关键点进行组合,本文也预测了embeding vectors。通过,基于左上角点的embeding vectors及右下角点embeding vectors的距离来决定是否将两个点进行组合。重要的是二者之间的距离,而向量中的具体数值却不是很重要。本文使用1-D的embeding 向量,etk代表目标k左上角点的embeding ,ebk代表其右下角点的embeding。定义"pull"损失用于组合角点,“push”损失用于分离角点。如下
2.4 Offsets
ornerNet的第三个输出是offset,这个值和目标检测算法中预测的offset类似却完全不一样,说类似是因为都是偏置信息,说不一样是因为在目标检测算法中预测的offset是表示预测框和anchor之间的偏置,而这里的offset是表示在取整计算时丢失的精度信息,如上式(2),其中(xk,yk)表示第k个角点的原图坐标值,n代表下采样因子,ok表示特征图缩放回原图后与原gt框的精度损失。然后通过公式(3)的smooth L1损失函数监督学习该参数,和常见的目标检测算法中的回归支路类似。
2.5 Corner Pooling
角点的表示没有任何局部视觉信息,因此要确定一个像素是否为左上角的点,需要从框的顶部水平的向右观察,同时,在框的左边从下观察。提出了corner pooling基于先验以更好的对框进行定位。
假设判断(i,j)位置的像素是否为左上角的点,ft,fl为两个输入corner pooling 的feature maps,
f
t
i
j
ftij
ftij,
f
l
i
j
flij
flij分别为feature map上(i,j)位置的向量。对于一个HxW的feature map,corner pool首先max pool,ft中(i,j)到(i,H)之间所有的特征向量得到向量tij,同理,max pool fl中(i,j)至(W,j)之间所有的特征向量得到向量
l
i
j
lij
lij,最后,将
t
i
j
tij
tij与
l
i
j
lij
lij进行相加操作。表达式如下,基于elementwise max 操作,右下角的定义同理,处理(0,j)->(i,j),(i,0)->(i,j)之间的特征向量。
预测模型结构如下,模型的第一部分为修改的残差块,将第一个3x3的卷积替换为corner pooing,首先通过2个3x3x128的卷积核来处理来自backbone的feature map,后接一个corner pool层,将Pooled后的feature map送入3x3x256的conv-BN层中,同时增加了一个映射短链接,修正的残差块后接一个3x3x256的卷积及三个conv-BN-ReLU模块用于预测heatmaps,embedings,offsets。
(三)Loss function
损失函数如下图所示,三个输出分别对应三部分损失,每部分损失有着对应的权重:
Headmaps loss
设
p
c
i
j
p_{cij}
pcij为预测的heatmap在类别(即通道)c 位置 (i,j) 的值,
y
c
i
j
y_{cij}
ycij 为相应的ground-truth的经过非标准的高斯分布增强的heatmap在类别(即通道)c 位置 (i,j)的值。作者设计了一个focal loss的变体损失函数:其中, N是图片中目标的数量,
α
,
β
\alpha ,\beta
α,β 是超参数用来控制每个点的分布(作者在实验中设置
α
,
β
\alpha ,\beta
α,β 分别为2,4),
1
−
p
c
i
j
1 - p_{cij}
1−pcij这项减少了ground-truth周围点的惩罚。
Offset loss:
由于采用降采样(downsampling)使得网络的输出相比原图片小了很多,图片像素位置(x,y) 会被映射到heatmap中的 ( ⌊ x n ⌋ , ⌊ y n ⌋ ) (\left \lfloor \frac{x}{n} \right \rfloor,\left \lfloor \frac{y}{n} \right \rfloor) (⌊nx⌋,⌊ny⌋) ,其中n 是降采样因子,这样就发生了错位。为了解决这个问题,作者预测位置偏移(offset),以微调角位置,然后再将它们重新映射到输入分辨率。 设偏移offset为 o k o_{k} ok:
其中,
(
x
k
,
y
k
)
(x_{k},y_{k})
(xk,yk) 为角 k 的位置坐标
模型预测两个offsets集,分别由左上角点和右下角点共享,训练的时候在ground-truth角的位置使用平滑的L1损失(smooth L1 Loss):
Grouping Corners:
我们需要判断一对点(左上角、右下角)是不是来自同一个bounding box,作者用到的方法来源于Associative Embedding那篇论文,从前面的介绍可以知道,网络为每个角预测了一个embedding vector,使得属于同一个bounding box的两个角的embedding vector距离会很近,所以我们可以通过embedding之间的距离来组合左上角点和右下角点。
和之前一样,作者还是使用一维的embedding,设
e
t
k
e_{tk}
etk对象 k左上角点的embedding,
e
b
k
e_{bk}
ebk为对象k右下角点的embedding,作者使用"pull" loss训练网络将点“合”在一起,使用"push" loss来将点“拉”开
其中, $e_{k}
为
为
为e_{tk}$和
e
b
k
e_{bk}
ebk的平均值,实验中
Δ
=
1
\Delta=1
Δ=1 ,和offset loss一样,group loss也只在ground-truth的角的位置使用。
Final loss:
最终,总的损失为
作者在实验中设置
α
,
β
,
γ
\alpha ,\beta ,\gamma
α,β,γ分别为0.1,0.1,1。
**
**
在MS COCO数据集上的测试结果如下所示: