转载:https://zhuanlan.zhihu.com/p/36095768

Cascade R-CNN: Delving into High Quality Object Detection

论文链接:https://arxiv.org/abs/1712.00726
代码链接:https://github.com/zhaoweicai/cascade-rcnn
CVPR2018的文章,最早是在知乎上看到https://zhuanlan.zhihu.com/p/35882192的介绍,大致读了下感觉是非常有趣的工作,想要了解大致的设计思想的可以看这篇文章。
本文主要针对的是检测问题中的IoU阈值选取问题,众所周知,阈值选取越高就越容易得到高质量的样本,但是一味选取高阈值会引发两个问题:

  • 样本减少引发的过拟合
  • 在train和inference使用不一样的阈值很容易导致mismatch(这一点在下面会有解释)

作者为了解决上述问题就提出了一种muti-stage的architecture,核心就是利用不断提高的阈值,在保证样本数不减少的情况下训练出高质量的检测器
以下是论文的核心内容和一些实验,当然是按照我自己的理解组织的。

1.思想简介

我们知道,检测问题和分类问题有很大的不同,检测问题通过IoU来判断样本是否是正确的,因此IoU的选取对train和inference的影响都很大,来看作者做的一组实验:

先看左图,横轴的是proposal的IoU,纵轴的是经过box reg得到的新的IoU,不同的线条代表不同阈值训练出来的detector,显然新的IoU越高,说明detector进行回归的性能越好。可以看到在0.55~0.6的范围内阈值为0.5的detector性能最好,在0.6~0.75阈值为0.6的detector性能最佳,而到了0.75之后就是阈值为0.7的detector了……
这就说明了,只有proposal自身的阈值和训练器训练用的阈值较为接近的时候,训练器的性能才最好,如果两个阈值相距比较远,就是我们之前说的mismatch问题了
从图中我们可以意识到,单一阈值训练出的检测器效果非常有限,以现在最常见的阈值0.5为例,由于所有IoU大于0.5的proposal都会被选中,那么对于IoU0.6~0.95的proposal来说,detector的表现就很差了。那么,我能不能直接选用0.7的高阈值呢?毕竟这样子0.5~0.7的proposal都被排除了,横轴0.7~0.95之间,红色线条的表现似乎不差啊?但是看到右图你就会发现,实际上detector的性能反而是最低的,原因是这样子大IoU训练样本大大减少,过拟合问题非常严重。
如何能保证proposal的高质量又不减少训练样本?采用cascade R-CNN stages,用一个stage的输出去训练下一个stage,就是作者给出的答案。留意到左图大部分线条都是在y=x的灰色线条之上的,这就说明某个proposal在经过detector后的IoU几乎必然是增加的,那么再经过一个更大阈值训练的detector,它的IoU就会更好。
举个例子,有三个串联起来的用0.5/0.6/0.7的阈值训练出来的detector,有一个IoU约为0.55的proposal,经过0.5的detector,IoU变为0.75;再经过0.6的detector,IoU变为0.82;再经过0.7的detector,最终IoU变为0.87……比任何一个单独的detector的结果都要好。不仅仅只有IoU改善的好处,因为每经过detector,proposal的IoU都更高,样本质量更好了,那么即使我下一个detector阈值设置得比较高,也不会有太多的样本被刷掉,这样就可以保证样本数量避免过拟合问题。

2.相关工作及一些证明

作者还把他的工作和类似的几种工作做了实验比较,在论文中是分开的,我这里统一列出来方便大家对比。先来看一张图:

Iterative BBox及对比

这是目前几个非常典型的工作。图(b)的Iterative BBox为了定位准确,采用了级联结构来对Box进行回归,使用的是完全相同的级联结构。但是这样以来,第一个问题:单一阈值0.5是无法对所有proposal取得良好效果的,如第1部分的图所示,proposal经过0.5阈值的detector后IoU都在0.75以上,再使用这一阈值并不明智;第二个,detector会改变样本的分布,这时候再使用同一个结构效果也不好,看下图:

第一行横纵轴分别是回归目标中的box的x方向和y方向偏移量;第二行横纵轴分别是回归目标中的box的宽、高偏差量,由于比较基础这里不贴公式了。我们可以看到,从1st stage到2nd stage,proposal的分布其实已经发生很大变化了,因为很多噪声经过box reg实际上也提高了IoU,2nd和3rd中的那些红色点已经属于outliers,如果不提高阈值来去掉它们,就会引入大量噪声干扰,对结果很不利。从这里也可以看出,阈值的重新选取本质上是一个resample的过程,它保证了样本的质量。
当然,这里会有另一个问题,我们这样子真的不会减少样本数量么?虽然第1部分给了比较直观感性的解释,但是似乎还不够……作者给出了更加详细的实验证明:

从这张图,我们可以看到,1st stage大于0.5的,到2nd stage大于0.6的,到3rd stage大于0.7的……在这一个过程中proposal的样本数量确实没有特别大的改变,甚至还有稍许提升,和2图结合起来看,应该可以说是非常强有力的证明了。
总结起来,就是:

  • cascaded regression不断改变了proposal的分布,并且通过调整阈值的方式重采样
  • cascaded在train和inference时都会使用,并没有偏差问题
  • cascaded重采样后的每个检测器,都对重采样后的样本是最优的,没有mismatch问题

Iterative Loss

Iterative Loss实际上没有级联结构,从c图可以看出来,它只是使用了不同的阈值来进行分类,然后融合他们的结果进行分类推理,并没有同时进行Box reg。作者认为,从图4中的第一个图可以看出来,当IoU提高的时候,proposal的比重下降非常迅速,这种方法没有从根本上克服overfit问题;另外,这种结构使用了多个高阈值的分类器,训练阈值却只能有一个,必然会导致mismatch问题而影响性能。

3.Cascade R-CNN的实现与结果

Cascade R-CNN的结构图在第2部分的(d)图已经给出了……
最后总结一下,作者最终确定的结构一共是4个stages: 1个RPN+3个检测器(阈值设定分别为0.5/0.6/0.7)……其中RPN的实现想必大家都很清楚了,而后面三个检测器,则按照之前介绍的那样,每个检测器的输入都是上一个检测器进行了边框回归后的结果,实现思路应该类似于Faster RCNN等二阶段检测器的第二阶段。
贴一下结果吧:

个人认为,这个提升还是相当惊艳的。特别需要说明的一点是,对于目前流行的检测结构来说,特征提取是耗时最多的,因此尽管Cascade R-CNN增加了比较多的参数,但是速度的影响并没有想象中的大,具体可以参考下表:

实际上,论文中还有相当多的部分没有提及。这篇文章还做了大量的对比实验,例如通过添加ground truth来提高proposal的质量从而验证mismatch问题;通过添加stages来分析适合的级联阶段数等等;包括一些和第2部分中提到的两种思路的对比等等,可以说是有理有据……再加上不俗的效果和晓畅通俗的语言,还是非常值得阅读的,另外作者的code也已经发布,有兴趣的同学可以前去观摩~

4.总结

其实像我这样的入门者是很难准确说出这篇文章好在哪里的,这里引用Naiyan Wang大神的评论吧:Detection其实并不是一个很合适的分类问题,没有一个明确的离散的正负样本的定义,而是通过IoU来连续定义的。但是IoU这个指标很难通过gradient descent来优化,虽然之前也有一些IoU loss的工作,但是效果并不理想。Cascade RCNN便是一个在这个方向上很好的尝试。

目标检测-Cascade-RCNN的更多相关文章

  1. 目标检测系列 --- RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation Tech report

    目标检测系列 --- RCNN: Rich feature hierarchies for accurate object detection and semantic segmentation Te ...

  2. 目标检测--之RCNN

    目标检测--之RCNN 前言,最近接触到的一个项目要用到目标检测,还有我的科研方向caption,都用到这个,最近电脑在windows下下载数据集,估计要一两天,也不能切换到ubuntu下撸代码~.所 ...

  3. 目标检测之R-CNN系列

    Object Detection,在给定的图像中,找到目标图像的位置,并标注出来. 或者是,图像中有那些目标,目标的位置在那.这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫. ...

  4. 目标检测(一) R-CNN

    R-CNN全称为 Region-CNN,它是第一个成功地将深度学习应用到目标检测的算法,后续的改进算法 Fast R-CNN.Faster R-CNN都是基于该算法. 传统方法 VS R-CNN 传统 ...

  5. 目标检测-Faster R-CNN

    [目标检测]Faster RCNN算法详解 Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with r ...

  6. 【目标检测】R-CNN系列与SPP-Net总结

    目录 1. 前言 2. R-CNN 2.0 论文链接 2.1 概述 2.2 pre-training 2.3 不同阶段正负样本的IOU阈值 2.4 关于fine-tuning 2.5 对文章的一些思考 ...

  7. 基于候选区域的深度学习目标检测算法R-CNN,Fast R-CNN,Faster R-CNN

    参考文献 [1]Rich feature hierarchies for accurate object detection and semantic segmentation [2]Fast R-C ...

  8. 多目标检测分类 RCNN到Mask R-CNN

    最近做目标检测需要用到Mask R-CNN,之前研究过CNN,R-CNN:通过论文的阅读以及下边三篇博客大概弄懂了Mask R-CNN神经网络.想要改进还得努力啊... 目标检测的经典网络结构,顺序大 ...

  9. [目标检测] 从 R-CNN 到 Faster R-CNN

    R-CNN 创新点 经典的目标检测算法使用滑动窗法依次判断所有可能的区域,提取人工设定的特征(HOG,SIFT).本文则预先提取一系列较可能是物体的候选区域,之后仅在这些候选区域上用深度网络提取特征, ...

  10. paper 111:图像分类物体目标检测 from RCNN to YOLO

    参考列表 Selective Search for Object Recognition Selective Search for Object Recognition(菜菜鸟小Q的专栏) Selec ...

随机推荐

  1. maven jar 包不在项目中

    maven  update project maven build

  2. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP)

    2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 J Beautiful Numbers (数位DP) 链接:https://ac.nowcoder.com/acm/contest/163/ ...

  3. curl、fopen和file_get_contents区别

    curl多用于互联网网页之间的抓取,fopen多用于读取文件,而file_get_contents多用于获取静态页面的内容. 1. fopen /file_get_contents 每次请求都会重新做 ...

  4. linux下禁止root远程登录

    一.添加和root权限一样的用户 1. adduser admin passwd  admin (修改密码) 2.修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示 ...

  5. SqlHelper发布—比Pagehelper更好用的分页插件

    SqlHelper发布-比PageHelper性能更高 起源 前段时间开启了一个新的项目,在选择分页插件时,发现github上很流行的一个是pagehelper,在百度上搜索了一下,使用量.由于项目紧 ...

  6. jmeter+ant+jenkins搭建自动化测试环境(基于linux)

    安装CentOS7操作系统 关闭系统防火墙 [root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# syste ...

  7. OSS - 有关于OSSClient的单例化

    之前在每个控制层OSSClient都是通过新new的方式创建OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret)进行创建 后期我 ...

  8. Consul概述

    环境安装 1.下载consul 官网https://www.consul.io/downloads.html下载对应版本的consul:本文以Windows-64版本为例 2.配置到系统环境变量 C: ...

  9. eclipse-jee-luna安装ADT-23.0.6出现的问题,以及解决办法

    刚安装好ADT-23.0.6,然后配置sdk路径(最新的版本android-22),然后创建一个新的Android Project; 对于布局界面会出现如下错误,导致无法显示布局界面: java.la ...

  10. tree/pstree

    tree yum install tree 不指定路径的话直接显示当前目录的结构 加上-L 表示只显示到指定的目录层级 tree -L 2 ./