感谢同济子豪兄的分享-关于RCNN论文的学习(二)

https://www.bilibili.com/video/BV1d64y1W74E?p=4https://www.bilibili.com/video/BV1d64y1W74E?p=4https://www.bilibili.com/video/BV1d64y1W74E?p=4感谢子豪兄

 

RCNN之前的目标检测方案的缺陷在于,只能提取像素级别的特征,这些特征只是简单地与邻域特征有一点关系,丢失了语义层面的抽象特征

RCNN = rigion with CNN features

这句不好理解,朝向直方图发展的团块???意思就是上一条解释的意思,特征表征能力很差,丢失了很多信息 

RCNN的创新有两点:

1.我们可以将高容量(高表征能力)的卷积神经网络应用于自下而上的区域建议,以便对物体进行定位和分割。

从目前我的理解上,应该是先区域建议再神经网络,但这里说是神经网络用于区域建议,这说明有个机制,让区域建议变得有点像神经网络的训练过程

2.预训练 + fine tuning

 RCNN = regions with CNN features

论文开篇就写道:

garbage in, garbage out.记得YOLO就是充分利用提取的卷积特征,实现了从特征计算出类别和定位

传统的像素级特征提取方法:SIFT 尺度不变变换特征  HOG  方向梯度直方图

ensemble system: 集成系统,大概意思就是类似于拼积木

SIFT 以及 HOG提取的是底层的特征,维度空间太低

福岛老爷子这篇介绍神经感知机的论文其实早就介绍了怎么对图像使用卷积操作

 但老爷子的算法里边没有涉及到监督学习算法,是不是那时候还没有涉及到利用loss function来使模型收敛

 杨乐昆的研究就补完了卷积神经网络所需要的最后拼图,算法+优化

90年代,CNN流行过,但是因为缺乏大量数据和足够的算力,应用逐渐收缩

之后就是SVM的天下

直到2012年,Alexnet横空出世

 紧接着,大家就提出了新的问题:如何将高效的、用于分类任务的Alexnet泛化到目标检测任务??

大家真的是非常活跃 

到了2013年,他们就给出了RCNN的方案

当时他们就遇到了两个问题:一个是如何用DBN来定位目标,另一个是如何在相对较少的数据上提取到足够数量的特征以至于训练出能够进行有效分类的模型

从这里就基本可以看出RCNN和YOLO的两种技术思路:YOLO就认为我们可以直接从提取出的卷积特征去定位目标。

RCNN利用rigion proposal来提取预测框,其实在特征提取上存在很多重复

当时他们尝试过YOLO这种回归的思路,但是并不顺利。不顺利的原因不是很清楚。使用回归思路的只有30多的mAP

过去的20年,一直使用的是滑动窗口检测+SIFT特征,在2000年初就已经实现实时人脸检测

但是这个方法有着很大的局限性,只能应用于人脸识别,文字识别,行人识别 

这里提到,那时候就在使用CNN来提取卷积特征,这里可能会使人迷惑??

杨乐昆在1989年就完善了CNN,但问题在于那时候不能将CNN做到很深、很宽。最多两层

直到Alexnet的出现,CNN才可以被设计成又深又宽的结构。他的创新在于:

1.ReLU线性修正单元

2.Dropout机制

3.max pooling 的应用

4.LRN层的设计

5.数据增强。这也是RCNN设计者要解决的问题之一 

这里就显示出跟YOLO在策略上的区别,通过rigion proposal来解决卷积网络的定位问题。

很有意思的地方在于,RCNN跟YOLO都先在论文中提到test time时是怎么做的,YOLO在论文前部花了大量篇幅教你怎么进行预测后处理

 测试阶段,对于每张输入会产生2000个rigion proposal,然后对每一个rigion proposal提取4096维的卷积特征,然后送到类别个的SVM里面进行分类 

这就解决了RCNN的第一个问题:如何利用DBN来定位目标

rigion proposal的尺寸是不一定的,因此需要通过仿射变形将其统一到一个尺寸。因为CNN有尺寸要求

接下来要解决数据少的问题

传统方法是用无监督预训练,然后监督式微调 

RCNN采用大型数据集上的监督式预训练,紧接着在小数据集上进行特定领域的微调。

特定领域???

 怎么理解各组件需要单独训练??

YOLO有两个部分CNN+FC,两部分就像一个整体,每个样本都能训练到。而RCNN,比如像SVM这样的分类器,对于输入是有要求的,卷积特征不能直接送到里面。但我对这个不太了解

这???还是子豪说得对??

最初的RCNN就是低效但准确,推理速度太慢

 这里提到每个rigion proposal提取的4096维特征是所有的SVM共享的,结果就是在计算量上比其他方法低两个数量级,为什么? 

不理解的原因在于我不知道SVM是如何进行训练的,一个SVM就是一个01分类器,只能识别一个类。我不知道卷积特征无法共享的话是怎样的?

 RCNN还统计了各种类型错误的数量

RCNN天然地就可用在语义分割上,这不就相当于抠图了吗

并且性能上直接达到当时的最好水平

 SVM是需要进行单独训练的

Module Design

first one: region proposals

 选择搜索算法就是一种与类别无关的region proposal方法

RCNN选择SS只是因为其他的目标检测算法大多数采用的是SS

 看起来还是有点魔幻

second one: Features Extraction

使用的是Alexnet  CNN部分的caffe实现

 alexnet的输入就是227*227

tight bounding box:标注框

测试阶段

这里又提到了每个SVM都是针对某一类别训练的,那么最终他也就能识别一个类 

使用NMS非极大值抑制来剔除冗余框,这一点跟YOLO很像,到底是谁跟谁像呢??

 

 

比xx高两个数量级。这个magnitude的使用也太过于抽象了吧!!是个名词

这里很明确,是将2000个卷积特征一起送进整个SVM模块,SVM模块包含类别个数 个SVM。直接做矩阵运算就能得到分类结果

 可以看到SVM和FC的区别,感觉上就一层的FC,但规模比FC的一层要大

对于RCNN,要扩展其分类总数,只需要增加针对某类别训练好的SVM即可

而YOLO要扩展类别,更加简单,不需要单独去训练对应的SVM,只要改相应的配置以及加上类别的名称即可

这里提到RCNN存储特征所需占用的内存空间,大概是1.5G,像我本地使用的笔电的3060,有6G内存。学会推算一个batchsize或者是subbatchsize所占用的内存空间是很有必要的

训练的流程

监督预训练:

  

具体是怎么训练的不清楚,套用之前的想法,是不是就是先不做检测框的回归,先冻结检测框回归的相关部件

 迁移学习微调:

 这里子豪也提到,究竟是只训练CNN部分,还是说整个网络的参数在这个阶段都需要得到训练。他倾向于后者。我基于前面的判断,也认为属于后者

 这里提到迁移学习时网络结构上的改进,只需要改SVM的个数即可,整个CNN的结构是不需要动的,像输入的特征的维度都已经定好了。

其实,我们在使用相关模型训练自己的数据的时候,基本也是这样,把cfg的配置改了,把类别名进行删改,网络结构是不需要改动的

RCNN中正负样本的定义,之前也讲了,正负样本中的正负是个相对的概念,基于提出的目标,满足的是正样本,不满足就是负样本

这里讲到微调阶段的学习率的设置,预训练阶段是大踏步地前进,但也是使用SGD,也有Adam优化,到了迁移微调阶段,就开始走小碎步了。学习率只有预训练阶段的1/10

这里的设定是第一次见,在YOLO都没有见过这样的设定。进行优化的时候,正负样本比例是

1:3,VOC数据集本身属于正负样本比例严重失调,所以要增加训练集中正样本的数量。对正样本进行过采样,对负样本进行下采样

我们知道处理了一个batchsize 的样本之后才会进行一次参数的调优,但这里讲到要使用32正样本+96负样本 的batchsize结构,怎么理解??

难道是说从一开始训练的时候就要分好正负样本??但如果不这样,难道是等到计算出loss之后再分??

我觉得只能是一开始就分好

object category classfier: 目标类别分类器,也就是SVM

一说到这儿,我想到一个问题:包括YOLO在内,目标检测任务是不是对检测框进行分类??

似乎正是如此,比如说YOLO中CNN的部分输出是7*7*30的一个tensor, 对于每个30维的向量,包含某个grid cell两个候选框的位置信息和置信度,以及这个grid cell在所有类别上的条件类别概率。

这里用到了tightly enclosing, 这个行为怎么量化??IoU!

 这里提到设定一个0.3的IoU阈值,注意,这个阈值也是通过试验确定下来的,属于超参。

这个阈值对于我们本地的另外一些类别的目标检测需要重新实验吗??

我认为是不需要的,因为这个阈值跟类别没有关系,他只是为了定义什么叫tightly enclosing

阈值的选择很重要,实验表明,太高太低都不行,有5个点左右的差距

 我又想到,为什么这里反复提到正负样本的定义,在YOLO中似乎没怎么说过这事

正负样本主要是用于mAP的计算,他应该是从样本中采样才对。

这里怎么说正样本就被简单定义为每个类的标注框?? ground-truth就是真实数据的意思

这里提到的叫难例挖掘,其实就是难样本挖掘hard example mining

说是因为训练数据太大,无法放进内存才需要采取这种措施。但是在之前的商品识别项目上,难样本挖掘的作用是深化类内的差异,处理类间差异小,类内差异大的问题.选择的是triplet loss,这是一种常用于处理差异小的样本训练的loss, 因为其可以放大差异

还有一种叫做focal loss的loss function, 是何凯明大佬提出的,主要用于处理one-stage目标检测模型样本不均衡的问题,降低大量存在的负样本的权重,也可以被视作一种难样本挖掘

这是不是说明了之前提的问题,我认为是在训练之前就要将训练集的正负样本分好,但是这里说明是在分类器完成分类之后才做这件事,我们的优化就是从正负样本集中凑出一组batch size

 这里没有理解,一个epoch之后mAP就停止增长??模型训练完成??

附录中会详细解释上述两个问题。说实话,不论是神经网络还是在CNN阶段,我都没有听说过要进行正负样本的界定。关键是这里还说训练的不同阶段还要进行不同的正负样本界定,我就很迷惑了。其实去除冗余可能就是在做这件事,因为去冗余的判据就是置信度,也要给置信度指定阈值

测试了CNN结构和FC结构的作用

 从最终的效果来看,卷积网络和全连接网络都是必不可少的,在他们的合力之下,能够提取维度更高、信息密度更大的网络。

较之DPM,RCNN的定位性能就要差一些。论文就总结道,卷积特征的分类性能是要明显优于传统的像素级别的特征。

那YOLO怎么说,这里确实有点把人说懵了,卷积特征最终是要进入分类器的,YOLO是送到FC中,既要提取类别,又要提取定位

RCNN是送到SVM中以及回归网络

 定位性能差的原因,一方面来自于region proposal的选择,另一方面是因为卷积特征带有的平移不变性。 

预测框回归可以有效减轻定位上的错误

 

 这是另一篇论文提出的叫做normalized AP方法,他们将VOC数据集标注中的标注框进行了分类

这个图反映了sensitivity to object characteristics,竖条的长度就是这个sensitivity的程度,两端的数字一个是上限一个是下限

 

 从图的title 上可以看到,他逐步增加了网络的复杂性,最开始只是预训练,然后网络经过了fine tunning, 之后又加上了预测框回归

sensitivity在度量上是越高越好,我们也可以看到,随着网络结构逐步完整,整体的、部分的sensitivity都有提升

 这里有依据结论性质的话,就是说,对于不同的预测框的尺寸和长宽比,我们还能看到性能提升,那就说明FC层提取出了更有用的特征。我们在将预测框输入CNN网络之前,对所有预测框限制了尺寸,227 * 227

 这个神秘的预测框回归,在DPM中使用过。他是一个线性回归模型,返回的是相对于输入线性回归模型的特征所属的检测框的偏移量。

这个结构其实相当简单啊,那这个部分的loss function怎么设计呢??

这个操作确实能带来性能上的提升

那么,是否可以说,他其实可以不用做这个BB regression的。也就是说生成的这2000个region proposals本来就可以相当充分地定位目标了

YOLO就不同了,到了FC的输出层这一步,他会输出这98个bounding box的尺寸和位置,通过设计好的loss function来收敛bounding box的尺寸和位置

将RCNN用于语义分割

 为了便于和当时领先的语义分割系统进行比较,RCNN采用了同样的算法,二阶池化,second-order pooling, 这个词很形象

这篇文章并不是将语义分割的,二阶池化最终输出的也是一个4096维的向量,这个向量最终是如何去拟合目标的非线性轮廓这里并没有讲

论文提到,作语义分割有三种策略,总体来讲,是在我们的预测框内部再次做目标检测。

首先一点,网络得到的预测框的尺寸是不固定的,它是通过region proposal得到的,因此要去做二次池化还得对得到的预测框进行缩放至227 * 227,送进Alexnet

有个显而易见的问题,内部的目标你肯定不能再使用规则预测框,在这里就是矩形框

  

 第一个策略就完全忽略了目标的非线性轮廓,那么最终分割的效果是不言而喻的

 第二个策略就做了前后景的分离。我们要检测的目标就是前景,其余的都为背景。这种方式就能够留下像素粒度的信息

这里子豪解释说,将前景抠出来,把背景的像素值都设为图像像素值的均值。但是,你都把前景抠出来了,不就已经相当于完成图像分割了吗???这里没有理解

这个前景怎么抠??

第三种策略就是结合前两种策略的优点

QUESTIONMARK:前面不是说RCNN作者专门测试了without fc, fc6, fc7, pool5的作用吗,当时我还不太清楚这个fc6, fc7到底从何而来,我突然想到这应该是Alexnet的结构才对,结果一查果然如此

 也就是说RCNN提取卷积特征用的是完整的Alexnet, 之前的惯性思维是提取卷积特征只是用卷积网络,没想到还是用了FC

而且通过实验还证明,卷积网络提取通用特征,FC可以用来提取某些特定领域的特征,两者缺一不可

以上三个策略的结果差别其实都不大,我以为忽略目标的非线性轮廓性能会特别差,主要是没有看到效果 

 

 通过二次池化以及full+fg策略得到的特征叫做full+fg特征

利用这个特征训练支持向量分类器的速度是 直接使用二次池化特征法的10倍以上

总结

作者做了一个预言

 一种新的范式将会在计算机视觉领域被广泛使用:监督训练集上进行预训练,然后再在特有领域进行微调

比如说RCNN,先针对图像分类任务进行预训练,然后再对完整的目标检测网络结构进行微调

钢轨伤损,刀片伤损

计算机视觉和深度学习并非矛盾的两方,相反,他俩不可避免地天生就是伴侣

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值