Light-Head R-CNN

论文信息

原文地址:Light-Head R-CNN: In Defense of Two-Stage Object Detector

代码实现:地址

作者:Zeming Li,Chao Peng,Gang Yu,Xiangyu Zhang,Yangdong Deng,Jian Sun

two-stage 检测器的速度瓶颈

目标检测(detection)主要分为两个流派,one-stage(SSD,YOLO系列等)和 two-stage(R-CNN系列等),前者速度快,后者精度高。

two-stage的检测框架一般将任务分为两步:

  • 第一步:产生足够多的候选框(proposal),作者称之为Body(检测器体)

  • 第二步:对候选框进行识别,作者称为Head(检测器头)

通常,想要取得最好的准确率,Head的设计一般比较 Heavy,就是计算量参数较多,计算量比较大。作者发现,像 Faster RCNN 和 R-FCN 都有共同点,就是有一个非常 Heavy 的 Head 接到主体框架上:

  • Faster RCNN 在对 ResNet 的 conv5 进行 ROI Pooling 后,接了两个全连接层。由于 ROI Pooling 后的特征非常大,所以第一个 fc 层非常耗内存,并且影响速度。每个 Region Proposal 都要经过两个 fc 层也导致计算量非常大。

    扫描二维码关注公众号,回复: 4476226 查看本文章
  • 在 R-FCN中,虽然少了两个全连接层,但是需要构建一个 C l a s s e s × p × p Classes×p×p 大小的Score Map( p p 为后接的池化层的大小),也是需要非常大的内存和计算量。

由于Faster R-CNN 和 R-FCN 的重头设计,即使换用小的主干网络,速度也很难有较大的提升,于是作者结合两者优点,提出如下两点改进:

  • 使用 Large Separable Convolution 来生成一个 “Thin” 的Score Map,Score Map只有 α × p × p \alpha×p×p 通道。在论文中,作者用了 α = 10 \alpha=10

  • 在 ROI Pooling 后接上一个全连接层。为什么要接上这个全连接层呢?因为原来的 R-FCN 的 Score Map 是 C l a s s e s × p × p Classes×p×p 通道,正好对应 Classes 的预测,现在没有这么多个通道了,没办法用原来的投票方法了,所以接上一个全连接层也是为了后面能够接上 Faster R-CNN 的回归和分类。

Light-Head R-CNN 与其他网络的速度对比如下图,主干网络分别使用 (a small Xception like network,Resnet-50,Resnet-101):

网络架构对比

作者将Light-Head R-CNN 与 Faster R-CNN 和 R-FCN 的架构进行了对比:

  • Faster R-CNN

Faster R-CNN 在 ROI Pooling 以后要对每个 ROI 进行计算,也就是 R-CNN subnet,这部分包括两个 fc 层,且第一个 fc 层要全连接上一层的全部channel,使用 ResNet101 作为主干网络时,在上一层有 2048 个channel,这个计算量就很大了,所以说 ROI-wise 部分的计算太重了。

  • R-FCN

R-FCN 为了对 ROI-wise subnet 进行加速,就采用了一种全卷积的策略。R-FCN 首先为每个 region 预测一个score maps,通道数是 c l a s s e s × p × p classes × p × p (p是接下来的pooling形状),接着是沿着每个 ROI 做pool,然后 average vote 最后的预测。

采用这种方式,R-CNN subnet 其实是没有计算量的(但是效果上不如有 ROI-wise 的 Faster R-CNN),但是要为ROI pooling生成一个大的score map, 还是挺耗时的。

(图中 C C 表示物体检测的类别数, + 1 +1 表示背景类。)

  • Light-Head R-CNN

Light-Head R-CNN结合了Faster R-CNN和R-FCN的优点:

  1. 对 ResNet 卷积层中 conv5 的 2048 通道输出,使用large separable convolution 降低特征图(feature maps)厚度并简化计算量,生成 “薄”的 thin feature map( α × p × p \alpha×p×p α = 10 \alpha=10 ),避免了 R-FCN feature map 太大,且随类别数 C C 增加而增大的问题。

  2. 在 thin feature map 后面接 ROI Pooling,此时得到的 ROI-wise feature map 也薄,这样后面再接 fc 层,此时的计算量就小了,避免了Faster R-CNN 在 R-CNN subnet 的第一个 fc 层计算量过大的问题。

Light-Head R-CNN 将原来 R-FCN 的 score map 的职责两步化了:thin score map 主攻位置信息,R-CNN子网络中的 fc 主攻分类信息。另外,global average pool 的操作被去掉,用于保持精度。

主干网络 Backbone

在Head小了以后,Light-Head R-CNN就可以在速度和精度之间做权衡,可以选择性地使用大的或者小的backbone网络了。文章中给出了两种设置:

  • “ L” 表示使用大的 backbone network,更注重精度。这里用的 L 网络是resnet101。

  • “S” 表示使用小的 backbone network,更注重速度。这里用的 S 网络是Xception-like model。

Thin feature maps for RoI warping

使用 large separable convolution,应该是借鉴了 Inception 3 的思想,用 1 × k 1×k k × 1 k×1 的两层卷积来代替 k × k k×k 的卷积核,其结构如下:

其中 kernel 大小: k = 15 k=15 ,很大,所以叫 large conv,这主要是为了保证不丢失太多精度。因为这一层之前的 feature map 有2048 channel,这一层只有 490 channel,这么多channel数的减少要通过 large conv 进行一定的补偿。

另外,separate conv 能够减少计算量, C m i d = 64 ( f o r S ) / 256 ( f o r L ) Cmid=64 (for S) / 256 (for L) C o u t = 10 × p × p Cout=10×p×p ,远小于 R-FCN 的 c l a s s e s p p classes*p*p

RPN

RPN 网络用于生成候选区域(region proposals)。通过 softmax 判断 anchors 属于前景(foreground)或者背景(background),同时利用bounding box regression 修正 anchors 的偏移和缩放,获得精确的proposals。

Light-head R-CNN中使用RPN网络生成候选区域,具体过程如下:

  • 3 × 3 3×3 卷积以及生成候选框(RoI):

    在Light-head R-CNN中,使用 Resnet 的 conv4 的输出作为 RPN 的输入特征图,其维度是 14 × 14 × 1024 14×14×1024 。对特征图进行 3 × 3 3×3 卷积,并对feature map 进行滑窗操作。

    当前滑窗的中心在原像素空间的映射点称为 anchor,以此 anchor 为中心,可以得到 15 个候选框(proposals):

    • 使用 5 种面积尺寸(scales),即{ 3 2 2 , 6 4 2 , 12 8 2 , 25 6 2 , 51 2 2 32^2, 64^2, 128^2, 256^2, 512^2 }

    • 在每个面积尺寸下,取 3 种不同的纵横比(Aspect Ratios): { 1 : 1 1 : 2 2 : 1 1:1、1:2、2:1 }。

  • 以3×3卷积核的中心点,作为 anchor 的中心点,通过滑动窗口和 anchor 机制得到图像的多尺度候选框。

  • 使用1×1卷积核,基于 anchor 种类数量进行卷积,得到所有 anchors 的foreground softmax scores 和 bounding box regression 偏移量。

  • 根据 bounding box regression 偏移量,获取位置修正后的 anchors。

  • 按照 foreground softmax scores 由大到小排序 anchors,提取前 6000 个 foreground anchors。

  • 限定超出图像边界的 foreground anchors 为图像边界,防止后续 RoI Pooling 时 proposal 超出图像边界

  • 剔除非常小(width < threshold or height < threshold)的 foreground anchors。

  • 进行非最大抑制(non maximum suppression,NMS),其中 I O U t h r e s h = 0.7 IOU thresh=0.7

  • 再次按照 NMS 后的 foreground softmax scores 由大到小排序foreground anchors,提取前 1000 个结果作为 proposal 输出。

Light-Head R-CNN 精度提升技巧

为了提升算法精度,作者又加入了其他 trick,分别是:

  • 在 PSRoI pooling 中加入RoIAlign ( Mask-RCNN ) 中的插值技术,提升了1.7%.

  • 将NMS threshold从 0.3 改成 0.5 之后,提升了0.6%.

  • 使用 multi-scale 进行training,提升1%.

Light-Head R-CNN 速度提升技巧

为了平衡精度与速度,作者做了如下一些改变:

  • 用 tiny Xception 代替 Resnet-101.

  • 弃用 atrous algorithm.

  • 将 RPN channel 减少一半到256.

  • Large separable convolution: k e r n e l s i z e = 15 , C m i d = 64 , C o u t = 490 10 × 7 × 7 kernel size = 15, Cmid = 64, Cout = 490(10×7×7) .

  • 采用 PSPooling + RoI-align. 用 alignment 技术做了 RoI warping,它能减少被 pool 的 feature map通道[ k × k k × k 倍,k是 pooling size],RoI-align能提升结果。

采用上述trick之后,能够在COCO上达到102FPS,同时达到30.7% mmAP的精度:

作者的测试环境:The code is tested on a server with 8 Pascal Titian XP gpu, 188.00 GB memory, and 40 core cpu.

猜你喜欢

转载自blog.csdn.net/lk3030/article/details/84934566