论文: Cascade R-CNN: Delving into High Quality Object Detection - CVPR2018

作者:Zhaowei Cai, Nuno Vasconcelos

团队:UC San Diego, UC San Diego

Github - zhaoweicai/cascade-rcnn(Caffe)

Github - zhaoweicai/Detectron-Cascade-RCNN

Github - open-mmlab/mmdetection(PyTorch)

Github - tensorpack/tensorpack(TensorFlow)

Cascade R-CNN 关于的是如何选择最佳 IoU.

目标检测任务中,IoU(intersection over union) 阈值往往被用于定义正样本和负样本的选取. 采用低 IoU 阈值训练的目标检测器,通常会产生很多冗余检测结果,如 IoU=0.5. 而增加 IoU 阈值,会导致检测器性能下降. 分析其原因在于:

[1] - 由于正样本的指数级衰减,导致训练的过拟合(正样本被过滤,导致样本数量过少).

[2] - 由于训练时采用的 IoU 和检测的最优 IoU 的不一致性,导致 mismatch.

Cascade R-CNN 方法是采用逐渐递增的 IoU 阈值训练的序列的检测器,其序列化地选择更优的正样本和负样本. 其训练是 stage-by-stage 的.

1. 问题描述

目标检测主要解决两个任务:

[1] - 目标检测器需要解决类别识别问题,以从背景中区分前景目标,并分配给目标物体以正确的类别标签.

[2] - 目标检测器需要解决物体定位问题,以分配给不同目标物体以精确的边界框.

由于目标检测面临着许多“很接近(close)” 的负样本,其对应着“接近但并不正确(close but not correct)” 边界框,导致目标检测器必须找到正确的正样本,同时过滤这些接近的负样本.

现阶段很多目标检测器是基于 two-stage R-CNN 框架的,其是一个 multi-task 问题,同时进行物体分类和边界框识别. 训练时,一般是首先提取 region proposals,然后再对 proposals 进行分类,同时将 proposals 回归到对应的 GT boxes. 其中,由于要对 proposals 进行分类以确定类别标签,首先就要确定对哪些 proposals 进行分类. 最普遍的做法是,利用 proposals 与 GT boxes 的 IoU 来选择,如 IoU=0.5. IoU 阈值是用于定义正样本和负样本选取的必要项.

关于 IoU 阈值的选择,如下图:

图(a)中,目标检测器常用 IoU 阈值为 0.5,其对于正样本是比较宽松的标准. 因此,结果中往往会包含很多冗余边界框. 普遍认为,接近假正样本(false positives) 一般都能通过 IoU >= 0.5 的测试. 虽然低于 IoU=0.5 阈值的样本也是丰富和多样化的,但它们会导致检测器难以有效的区分相似的假正样本(close false positives),难以进行训练.

图(b) 中,将 IoU 阈值设为 0.7,可以减少冗余检测框的数量,使检测器的输出中包含较少的接近假正样本(close false positives).

图(c) 中,横轴是 proposal boxes 与 GT boxes 的 IoU,纵轴为回归后所预测的 boxes 与 GT boxes 的 IoU,纵轴的值越大越好. 可以看出,相比于 baseline,其它的 IoU 表现都更好. IoU 越高,检测器的预测结果更好. 从该图可以看出,每个边界框回归器对于输入 IoU 与检测器训练时所采用的 IoU 阈值相接近时(设定IoU阈值的周围),性能表现最优. 目标检测器中回归器的输出 IoU 一般会优于输入 IoU,且随着 u 的增大,对于大于 IoU 阈值的 proposals 的优化效果有一定的提升作用.

图(d) 中,IoU 阈值设为 0.7 时,检测器的精度明显较低. 而在 0.5 和 0.6 时,精度相差不大,IoU=0.5 还有少许的提升. 也就是说,仅仅增大训练时所采用的 IoU 阈值是不可行的,并不能提升检测器的精度. 其原因在于:(1) IoU 阈值增大,导致正样本数量指数级减少,模型训练出现过拟合; (2) 在推断(inference)时,采用的 IoU 阈值与训练时采用的 IoU 阈值不匹配,也导致检测器精度下降.

Cascade R-CNN 的基本思想是,单一检测器只能是对单一 IoU 层次是最优的. Cascade R-CNN 考虑了对给定 IoU 阈值的优化. 即,采用级联的方式,首先利用 IoU=0.5 的网络,提升输入的 proposals;比如 IoU 提升到 0.6,再利用IoU=0.6的网络进一步的提升;比如 IoU 提升到 0.7,再利用IoU=0.7 的网络进行提升. 逐步的提升检测器的精度.

Cascade R-CNN is a multi-stage extension of the R-CNN, where detector stages deeper into the cascade are sequentially more selective against close false positives. The cascade of R-CNN stages are trained sequentially, using the output of one stage to train the next. This is motivated by the observation that the output IoU of a regressor is almost invariably better than the input IoU.

2. 目标检测

如下图:

图中,对于 Faster R-CNN,

[1] - first stage,H0 为 proposal sub-network,用于对整个输入图像进行处理,输出初步的检测结果,即:object proposals. 如 RPN.

[2] - second stage,H2 为 RoI 检测 sub-network,用于对 object proposals 进行处理,记为:detection head.

[3] - final stage,C 为 classification score;B 为 bounding box,分别对应到每个 RoI 的输出.

2.1. 边界框回归

边界框 b=(bx,by,bw,bh),表示了图片 x 的四个坐标.

边界框回归任务旨在,采用回归器 f(x,b) 将候选边界框 b 回归到目标边界框 g.

回归器 f(x,b) 可以描述为,基于训练样本 {gi,bi},最小化边界框损失函数:

Rloc[f]=i=1NLloc(f(xi,bi),gi)

其中,Lloc 在 R-CNN 中采用的是 L2 损失函数,而在 Fast R-CNN 采用的是 smoothed L1 损失函数.

为了进一步增强回归器关于尺度和位置(scale vs. location)的不变性,Lloc 是基于距离向量 Δ=(δx,δy,δw,δh) 进行的计算:

{δx=gxbxbwδy=gybybhδw=log(gwbw)δh=log(ghbh)

由于边界框回归往往是关于 b 的很小的调整,计算得到的 δ 的数值可能非常小,因此,边界框损失函数的 loss 值通常比分类任务的值小. 对此,为了提升 multi-task 学习的有效性,Δ 往往采用其均值和方差进行归一化,如:

{δx=δxμxσxδy=δyμyσyδw=δwμwσwδh=δhμhσh

2.2. 迭代边界框回归

在 Cascade R-CNN 之前,也有研究说明了,单一回归 f 处理不足以精确定位. 需要迭代的应用 f 进行处理,以逐渐精细化边界框 b

f(x,b)=ff...f(x,b)

这种方法被称为:迭代边界框回归(iterative bounding box regression),记为:iterative BBox. 如Figure3(b),其所有的 head 网络是相同的.

但是,迭代边界框回归忽略了两个问题:

[1] - 如图 Figure1 中所示,采用 IoU=0.5 训练的回归器 f ,其对于 IoU 更高的图像检测效果是非最优的. 实际上,对于 IoU 大于 0.85 的情况,其反而会对边界框有负影响.

[2] - 如下图 Figure2 所示,每次迭代后边界框的分布变化比较大. 尽管对于初始分布而言,回归器是最优的,但后面迭代后的可能非最优.

2.3. 边界框分类

分类器函数 h(x) 用于从 M+1(背景+物体类别) 个类别标签中选择一个进行分配.

h(x) 是 M+1 维的关于类别的后验分布估计:

hk(x)=p(y=k|x)

其中,y 是类别标签.

给定训练数据集 (xi,yi),分类的损失函数为:

Rcls[h]=i=1NLcls(h(xi),yi)

其中,Lcls 为经典交叉熵损失函数.

2.4. 检测质量

边界框往往包含目标物体和一些背景,其很难判断检测结果是正样本还是负样本.

这个问题一般是采用 IoU 度量来解决的. 如果 IoU 大于阈值 u,则认为是正样本. 因此,

x={gy IoU(x,g)u0otherwise 

其中,gy 是 GT g 的类别标签. IoU 阈值 u 定义了检测器的质量.

目标检测的挑战性在于,阈值等检测设置是高度对抗的. 当 IoU 阈值 u 增大,则正样本数量减少,导致训练样本不足. 当 IoU 阈值 u 减小,正样本的训练数据集更多更丰富,但是训练的检测器对于接近假正样本的处理能力不够. 一般来说,很难采用单个分类器能够对所有的 IoU 层级都有很好的结果.

推断阶段,由于采用 RPN 等 proposal detector 产生的大部分 proposals 都质量较低,检测器必须对于较低质量的 proposals 具有较好的判别能力.

一种直接的解决方案是,多个分类器的融合,如图 Figure3(c),在不同质量层级的优化损失函数:

Lcls(h(x),y)=uULcls(hu(x),yu)

其中,U 是 IoU 阈值集合.

这很类似于 integral loss,其 U={0.5,0.55,...,0.75},用于 COCO 竞赛的评测度量. 顾名思义,仅用于在推断阶段的分类器融合.

其难以处理的问题在于,公式(8) 中的不同损失函数对于不同数量正样本的处理.

如图 Figure4,随着 IoU 阈值 u 的增加,正样本数据集减少的很快,这就会容易导致训练的过拟合.

3. Cascade R-CNN

Cascade R-CNN 如图 Figure3(d).

3.1. Cascade R-CNN 的边界框回归

级联回归器:

f(x,b)=fTfT1...f1(x,b)

其中,T 是 cascade stages 的总数.

在同一阶段,每个回归器 ft 是关于相同的分布 {bt} 进行优化的,而不是初始分布 {b1}.

相比于 Figure3(b) 中的迭代边界框回归(iterative BBox) 结构,Cascade R-CNN 的区别在于:

[1] - iterative BBox 是用于提升边界框的后处理流程,而 Cascade R-CNN的回归是一种重采样流程,其会改变不同 stages 处理后的 proposals 的分布,训练时不同 stage 的输入数据分布是不同的.

[2] - Cascade R-CNN 在训练和推断是都要使用,因此不存在训练和推断间的差异性.

[3] - 回归器 {fT,fT1,...,f1} 是对于不同 stages 的重采样分布(resampled distributions) 进行优化的.

3.2. Cascaded 检测

如图 Figure4 的左图所示,初始 proposals 的分布,如 RPN proposals,往往是低质量的,不可避免的会引入对于分类器的无效学习.

根据 Figure 1(c) 中所有曲线都在对角线之上的事实,如,采用特定 IoU 阈值 u 训练的边界框回归器往往能够得到更高 IoU 的边界框. 对此,Cascade R-CNN 通过采用 cascade 回归作为一种重采样机制(resampling mechanism).

从样本集 (xi,bi) 开始,cascade 回归依次对更高 IoU 的样本分布 (xi,bi) 进行重采样. 这种方式有助于保持各 stages 的正样本数据集.

对于每个 stage t,Cascade R-CNN 包含一个关于 IoU 阈值 ut 的分类器 ht 和回归器 ft,其中,ut>ut1. 最小化损失函数:

L(xt,g)=Lcls(ht(xt),yt)+λ[yt1]Lloc(ft(xt,bt),g)

其中,bt=ft1(xt1,bt1). gxt 的 GT. λ=1 为惩罚系数. [] 表示指示器函数. yt 是给定 utxt 的类别标签,由公式(7) 计算得到.

## 4. Results

4.1. 实现细节

Cascade R-CNN 的所有 cascade detection stages 具有相同的结构,即 baseline detection network 的 head 网络.

Cascade R-CNn 包含 4 个 stages,第一个 stage 用于 RPN,其它三个 stages 采用的 IoU 阈值为 U={0.5,0.6,0.7}.

数据增强只有水平图片翻转.

推断阶段仅采用单一图片尺度.

4.2. 论文结果

5. 相关

[1] - 目标检测-Cascade R-CNN-论文笔记

[2] - Cascade R-CNN: Delving into High Quality Object Detection

[3] - Cascade R-CNN: Delving into High Quality Object Detection - 知乎

[4] - 一文带你读懂Cascade R-CNN,一个使你的检测更加准确的网络

Last modification:July 30th, 2019 at 02:40 pm