R-CNN算法学习(步骤一:候选区域生成)

R-CNN算法学习(步骤一:候选区域生成)

论文链接:https://arxiv.org/abs/1311.2524
源码链接:https://github.com/rbgirshick/rcnn

算法整体思想

总体分为 四个步骤(下文讲逐步骤分析):
1.候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
2.特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
3.类别判断: 特征送入每一类的SVM 分类器,判别是否属于该类
4.位置精修: 使用回归器精细修正候选框位置

网络结构

在这里插入图片描述

分析

一、候选区域生成
滑窗法(Sliding Window)

产生候选区域最直接的方法就是滑窗法
在这里插入图片描述
基本思想:
1、对输入图像进行不同窗口大小的滑窗(方式:从左往右、从上到下)
2、每次滑动时对当前窗口执行分类器(分类器是事先训练好的),如果当前窗口得到较高的分类概率,则认为检测到了物体。
3、对每个不同窗口大小的滑窗都进行检测后,会得到不同窗口检测到的物体标记,这些窗口大小会存在重复较高的部分
4、最后采用非极大值抑制(Non-Maximum Suppression, NMS)的方法进行筛选
缺点:
显然这种方法简单暴力,穷举所有可能的窗口,当然面临计算复杂度高的问题、效率低下。

选择性搜索(Selective Search)

Selective Search 的前期工作就是利用Graph-Based Image Segmentation的分割算法,所以我们先来了解一下Graph-Based Image Segmentation

基于图的图像分割(Graph-Based Image Segmentation)

论文和代码都在这:http://cs.brown.edu/people/pfelzens/segment/
两篇很详细的博客:https://blog.csdn.net/surgewong/article/details/39008861
https://www.jianshu.com/p/788ce0b18f00
大概思想:
1、将图像上的各个像素点都看成“图”上的一个顶点,像素点相互连接构成“边”,“边”-“边”之间有权值,权值可以是根据欧式距离、RGB颜色…来定义,最后形成“图”。
2、然后使用最小生成树方法(MST,minimum spanning tree)合并像素点,然后构成一个个区域。
3、对2中生成的一个个区域进行合并,合并的标准根据MintDif 之间的关系(可看博客更加详细),Mint表示同一颗树下权重最大的边(最不相似的两个点),Dif 表示链接两个树的最小权重边。
在这里插入图片描述
4、最后进行迭代,确定合适的分割阈值

选择性搜索(Selective Search)主角出场

大部分是这篇博客内容:https://blog.csdn.net/yuanlulu/article/details/82157071

Selective Search 主要思想:
参考知乎:https://zhuanlan.zhihu.com/p/23006190
1.使用一种过分割手段,将图像分割成小区域 (1k~2k 个)
2.查看现有小区域,按照合并规则合并可能性最高的相邻两个区域。重复直到整张图像合并成一个区域位置
3.输出所有曾经存在过的区域,所谓候选区域
其中合并规则如下: 优先合并以下四种区域:

  • 颜色(颜色直方图)相近的
  • 纹理(梯度直方图)相近的
  • 合并后总面积小的: 保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域 (例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh)
  • 合并后,总面积在其BBOX中所占比例大的: 保证合并后形状规则。

候选区域算法用分割不同区域的办法来识别潜在的物体。在分割的时候,我们要合并那些在某些方面(如颜色、纹理)类似的小区域。相比滑窗法在不同位置和大小的穷举,候选区域算法将像素分配到少数的分割区域中。所以最终候选区域算法产生的数量比滑窗法少的多,从而大大减少运行物体识别算法的次数。同时候选区域算法所选定的范围天然兼顾了不同的大小和长宽比。

候选区域算法比较重要的特征就是要有较高的召回率。我们要通过这种方法保证拥有物体的区域就在候选区域列表里。所以我们不介意有很多区域什么都有,这都没关系,物体检测算法会过滤掉他们,虽然会浪费一点时间。

目前已有不少成熟的候选区域产生算法:
1.Objectness
2.Constrained Parametric Min-Cuts for Automatic Object Segmentation
3.Category Independent Object Proposals
4.Selective Search

由于Selective Search又快召回率又高,这个方法是最常用的。说了这么多,终于牵出本文的主角了。

选择性搜索算法用于为物体检测算法提供候选区域,它速度快,召回率高。(回答了为什么要用选择性搜索方法)

选择性搜索算法需要先使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域,然后使用相似度计算方法合并一些小的区域。

下列两张图分别是原图和原始分割图:
在这里插入图片描述
在这里插入图片描述
但是,我们不能使用原始分割图的区域作为候选区域,原因如下:

  1. 大部分物体在原始分割图里都被分为多个区域
  2. 原始分割图无法体现物体之间的遮挡和包含。

如果我们试图通过进一步合并相邻的区域来解决第一个问题,我们最终会得到一个包含两个对象的分段区域。

我们不要需要完美的的分割区域,我们只想要和实际物体高度重合的区域就行了。

选择性搜索算法使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域作为输入,通过下面的步骤进行合并:

  1. 首先将所有分割区域的外框加到候选区域列表中
  2. 基于相似度合并一些区域
  3. 将合并后的分割区域作为一个整体,跳到步骤1

通过不停的迭代,候选区域列表中的区域越来越大。可以说,我们通过自底向下的方法创建了越来越大的候选区域。表示效果如下:
在这里插入图片描述

其中的相似度主要是通过以下四个方面:颜色、纹理、大小和形状交叠确定,最终的相似度是这四个值取不同的权重相加。
效果:
opencv实现了选择性搜索算法,可以给出上千个根据有物体的可能性降序排列的候选区域。
下图是画出了前面200-250个候选区域的效果。一般来说。1000~1200个候选区域基本能胜任物体检测的任务了。
在这里插入图片描述
在这里插入图片描述

以下摘自知乎:https://zhuanlan.zhihu.com/p/23006190

从上图可以看出通过Selective Search算法搜索出2000个候选框,且是大小各异的矩形

但是,CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小。那具体怎么做呢?

下面我们讲解要怎么进行缩放处理,为了简单起见我们假设下一阶段CNN所需要的输入图片大小是个正方形图片227*227。因为我们经过selective search 得到的是矩形框,paper试验了两种不同的处理方法:

(1)各向异性缩放

这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示:
在这里插入图片描述

(2)各向同性缩放

因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。有两种办法

A、先扩充后裁剪: 直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如上图(B)所示;

B、先裁剪后扩充:先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如上图©所示;

对于上面的异性、同性缩放,文献还有个padding处理,上面的示意图中第1、3行就是结合了padding=0,第2、4行结果图采用padding=16的结果。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。

(备注:候选框的搜索策略作者也考虑过使用一个滑动窗口的方法,然而由于更深的网络,更大的输入图片和滑动步长,使得使用滑动窗口来定位的方法充满了挑战。)

这篇博客也有提到:https://blog.csdn.net/WoPawn/article/details/52133338

步骤一就这样先告一段落,知识点还是比较多的,大部分都是借鉴大神的博客,如果有理解不到位,或者写错了的请大家批评指正!

补充:非极大值抑制(NMS)

RCNN会从一张图片中找出n个可能是物体的矩形框,然后为每个矩形框为做类别分类概率:
在这里插入图片描述

就像上面的图片一样,定位一个车辆,最后算法就找出了一堆的方框,我们需要判别哪些矩形框是没用的。非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大属于车辆的概率 分别为A、B、C、D、E、F。

(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;

(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。

(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。

就这样一直重复,找到所有被保留下来的矩形框。

非极大值抑制(NMS)顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里不讨论通用的NMS算法,而是用于在目标检测中用于提取分数最高的窗口的。例如在行人检测中,滑动窗口经提取特征,经分类器分类识别后,每个窗口都会得到一个分数。但是滑动窗口会导致很多窗口与其他窗口存在包含或者大部分交叉的情况。这时就需要用到NMS来选取那些邻域里分数最高(是行人的概率最大),并且抑制那些分数低的窗口。

补充:超详细的select search(选择性搜索方法及实现!)

https://www.cnblogs.com/zyly/p/9259392.html
认为有必要看完,写下来加深印象!

(Question)抛出问题:
一张图片框出几个类别的bbox,越接近ground truth越好!
How to do?
思路一:你说越接近越好(没有说100%一样),行,那我来穷举!暴力穷举,不同尺寸的滑窗,总有最接近的!
弊端:你这也太暴力了,复杂度太高了(搞死计算机)

能不能温柔一点,用点脑子!
好好观察图片,其实问题可以简化一点的,看下面
发现:
a图:盘子、杯子、勺子是包含在桌子上的,且大小是不一样的,告诉我们目标检测的层级关系以及尺度关系。

我们就思考说,能不能根据图片的某个特征来大致区别这些目标物呢?

b图:两只猫咪纹理都一样,如果用纹理来区分很难,但是用颜色就容易多啦~

c图:变色龙就不这么认为了,用颜色来区分我,不可能。这时候边缘特征、纹理特征又显得比较有用。

d图:我们很容易把车和轮胎看作是一个整体,但是其实这两者的特征差距真的很明显啊,无论是颜色还是纹理或是边缘都差的太远了
在这里插入图片描述
大千世界,无奇不有!那我们通过什么特征去区分?应该区分到什么尺度?
是啊!

通过什么特征来区分呢?
答:我有那么多的特征(颜色、纹理、边缘等…),用谁好哇,不如都用吧

应该区分到什么尺度?
答:不如我们把它分成很多小尺度的区域,然后再来合并相似度高的,这样合并就有很多不尺度咯

那我们的策略有啦,just do it!
ok,那其实就是分三步走:
input:一张图片
function:生成很多小区域,多样性策略合并区域
output:生成的框框

问题来啦,你生成的框框好不好呢?
下一步要做的就是给生成的区域打分~
这边的一个原则就是:
1、给予最先合并的图片块较大的权重,比如最后一块完整图像权重为1,倒数第二次合并的区域权重为2以此类推
2、对于相同的区域多次出现的也叠加下权重,毕竟多个方法都说你是目标,也是有理由的嘛

这样我们就得到一张分数表啦,那看你要取几个啦~

这样就完成了吗,不,还有一个疑问就是我不同的策略(就是选取的特征)得到的框框肯定都不一样哇,那有好有坏,肿么来评价咯?

非常直观的想法就是重叠率!
我们就说一个类别,某策略算法生成的框框跟该类别的真实框重叠率越高且很多框框都和ground truth叠,当然这就很perfect啦~

公式长这样,我理解的不是很清楚,so sad~

原话是这样:
通过算法计算得到的包含物体的Bounding Boxes与真实情况(ground truth)的窗口重叠越多,那么算法性能就越好。这是使用的指标是平均最高重叠率ABO(Average Best Overlap)。对于每个固定的类别 c,每个真实情况(ground truth)表示为 ,令计算得到的位置假设L中的每个值lj,那么 ABO的公式表达为:
在这里插入图片描述
重叠率的计算方式:
在这里插入图片描述
上面结果给出的是一个类别的ABO,对于所有类别下的性能评价,很自然就是使用所有类别的ABO的平均值MABO(Mean Average Best Overlap)来评价

overlap我是知道,就是IOU,那这个max是啥?每个框框与该类别IOU最高的那个?

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚大龙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值