RCNN论文阅读笔记

R-CNN论文阅读

背景:R-CNN作为经典的目标检测网络算法,论文标题为:《Rich feature hierarchies for accurate object detection and semantic segmentation》即高准确度的目标检测与语义分割的一种神经网络。论文发布于2014年,是two-stage的开山经典之作。与ImageNet一同开启了计算机视觉人工智能第二个十年。后续的包括SPP-Net、Fast-RCNN等都是基于此。

一、前言与介绍

传统目标检测达到瓶颈: 

  1. 传统特征是像素级别的特征:低级特征、高级特征、上下文信息的集成(比如SIFT)。但是缺乏了语义信息;

  2. 传统的HOG特征可解释性好、直观而且简洁。但是它没有抽象,特征的提取是有限的。

  3. 精度低,RCNN提出的可扩展的目标检测算法在VOC2012上的性能相对提升了30%,达到53.3%;

  4. 传统的方法提升已经到了瓶颈,只是类似于V1细胞,没有像大脑皮层一样联系起来,而且都是微小的改动。

RCNN的与传统的优势:

  1. 训练了一个高表达能力的神经网络、自上而下地提取候选框的特征,并用它来定位或者分类、分割;

  2. 通过先在辅助任务上得到预训练模型、再到PASCAL-VOC上微调,使得其在小目标集上也有好的效果。(监督学习

  3. 加了回归头后、可以显著降低定位错误,也就是精调。

神经网络的发展:

  1. Fukushima : 神经认识机 -->类似于神经网络 (仿生的、分层的、平移不变的)但缺失监督训练算法

  2. LeCun : 填补缺失 -->随机梯度下降、反向传播算法

  3. Krizhevsky : AlexNet -->dropOut、CNN、ReLU....

但是RCNN是比较耗时的,在现在看来其实并不高效:它的selective Search花费了2s产生候选框、CNN是逐一去提取候选框的特征花费了50s,这里面存在大量的重复计算,而且它不是端到端的,它的组件是单独训练的。

图像分类和目标检测任务的区别:图像分类只是得到图像中的物体类别信息、而目标检测需要Localization.

二、结构与原理

2.1 Whole Construction:

  • 输入图像

  • 利用Select Search生成2000候选框

  • 将候选框缩放为227×277

  • 候选框逐一送到CNN提取特征

  • SVM线性向量机(20类每一个类都要)

 

2.2 Region proposals(提取候选框):

Selective Search:分块、把子块作为输入、送到目标识别的模型中、一种启发式方法。

主要思路:输入一张图片,首先通过图像分割的方法(如felzenszwalb算法)获得很多小的区域,然后对这些小的区域不断进行合并,一直到无法合并为止。此时这些原始的小区域和合并得到的区域的就是我们得到的bounding box.

算法的大致步骤:

(1)生成区域集R

(2)计算区域集相邻区域的相似度S

(3)找到相似度最高的两个区域合并添加进R

(4)移除子集合

(5)计算新子集的相似度

(6)重新计算循环、直到S为空,不能合并为止

def _sim_colour(r1, r2): #颜色
 """
     calculate the sum of histogram intersection of colour
 """
 return sum([min(a, b) for a, b in zip(r1["hist_c"], r2["hist_c"])])


def _sim_texture(r1, r2):#纹理直方图
 """
     calculate the sum of histogram intersection of texture
 """
 return sum([min(a, b) for a, b in zip(r1["hist_t"], r2["hist_t"])])


def _sim_size(r1, r2, imsize):#大小
 """
     calculate the size similarity over the image
 """
 return 1.0 - (r1["size"] + r2["size"]) / imsize  # 1-(s1+s2)/S


def _sim_fill(r1, r2, imsize):#交叠
 """
     calculate the fill similarity over the image
 """
 bbsize = (
     (max(r1["max_x"], r2["max_x"]) - min(r1["min_x"], r2["min_x"]))
        * (max(r1["max_y"], r2["max_y"]) - min(r1["min_y"], r2["min_y"]))
    )               #delta x * delta y 交叠区域的面积
    return 1.0 - (bbsize - r1["size"] - r2["size"]) / imsize


def _calc_sim(r1, r2, imsize):
    return (_sim_colour(r1, r2) + _sim_texture(r1, r2)
            + _sim_size(r1, r2, imsize) + _sim_fill(r1, r2, imsize))

2.3 Feature extraction :

利用AlexNet作为特征提取网络,由Caffe实现。在输入到网络之前先进行强行的缩放,缩放到227×227,然后减去图像均值。此网络包含5个Convolutional layers和2个 Fully connected layers

AlexNet:分为上下两层网络,只有到了特定的层才会进行GPU交互,否则都是分别在不同GPU上运行。该网络有8层,包括5个卷积层3个全连接层。

第一层:卷积层1,输入为 224 × 224 × 3的图像,卷积核的数量为96,论文中两片GPU分别计算48个核; 卷积核的大小为 11 × 11 × 3 ; stride = 4, stride表示的是步长, 之后跟着最大池化层padding = 2; 第二层:卷积层2,卷积的个数为256个,卷积核的大小为:5 × 5 × 48; padding = 2, stride = 1;先卷积之后接着LRN(局部归一化层),再进行Pool池化;

第三层:卷积层3,卷积的个数为384个,卷积核的大小为:3 × 3 × 256; padding = 1;

第四层:卷积层4,卷积的个数为384个,卷积核的大小为:3 × 3 × 192; padding = 1,也没有LRN和pool;

第五层:卷积层5,卷积的个数为256个,卷积核的大小为:3 × 3 × 192; padding = 1,之后最大池化,pool_size=(3,3),步长为2;

全连接层: 第6,7,8层。每一层的神经元的个数为4096,由于类别是1000类,故最终输出softmax为1000。全连接层中使用了RELU和Dropout。

conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding='VALID')
pool2 = tf.nn.max_pool(conv2,
                         ksize=[1, 3, 3, 1],
                         strides=[1, 2, 2, 1],
                         padding='VALID',
                         name='pool2')

可以从论文对比看出,这里RCNN是没有最后一个全连接层的,因为它后面回到CNN读取的向量维度是4096维。然后对每一个类别单独训练一个线性的SVM、之后采用NMS进行剔除,剔除置信度底的一些框。

分析:

  • 所有类别共享一套特征,4096维向量。4096本身比较低维度,区别于空间金字塔的一些方法,维度还要高两个级别,他们的内存占用大,效果不好;

  • 网络得到的是2000*4096的一个矩阵 × SVM(4096×N)的矩阵,得到的就是某一个候选框在每一个类别上的概率;

2000:候选框数目

   N:类别数

  • RCNN可扩展

  • 正负样本选取策略:IOU≥0.5为正样本,否则为负样本

训练SVM分类器

正样本:GroundTruth

负样本:IOU<0.3的候选框

每一个类别优化出一个支持向量机,采用难倒挖掘,使得错误被记录并且被学习, 这里回顾支持向量机:

SVM是一种二分类的模型,是用来对样本进行分割的一种求解方法,原理是使得间隔最大化,转化为一个凸的规划问题来求解。

RCNN所用到的即一种线性的SVM,线性:也就是当训练样本近似线性可分时,通过软间隔最大化学习一个线性支持向量机的方式。

  • 当训练样本线性可分时,通过硬间隔最大化,学习一个线性可分支持向量机;

  • 当训练样本近似线性可分时,通过软间隔最大化,学习一个线性支持向量机;

  • 当训练样本线性不可分时,通过核技巧和软间隔最大化,学习一个非线性支持向量机

(2条消息) 支持向量机(SVM)入门理解与推导CongliYin的博客-CSDN博客支持向量机

支持向量机的基本形式是一个优化问题凸的二次规划问题,解决的办法是拉格朗日乘除法

 

三、技巧与评估

3.1 可视化与对照消融实验 :

Q:卷积层的第一层的特征是很好可视化的,比如颜色、边缘;但是想可视化更深层是很难的。如何可视化呢?也就是使得网络可解释化

A:把一个数据集的所有候选框输入到网络中,找到使得某一个feature map中的值最大激活的候选框,也就是某单次卷积,单个神经元产生的最大激活。(从而找到原图的候选框)

feature map :来自于某候选框输入卷积后的一个结果、不对map求平均,看看这个神经元对哪个候选框反应最大,那就是提取的这个候选框的特征。

(分别提取出了‘上半身’、‘点阵’,‘红色圈’、‘圆形孔洞’...特征)

Q:如何观察每一层对于结果的影响?

A:在不进行微调下,逐层切除,对于网络进行分析发现:预训练模型大部分特征来自于卷积层而不是全连接层

在进行微调后,在加入fc5、fc6、fc7作用后效果相比没有进行fine tuning有显著提升。加了bounding box后效果更好,得出结论:微调将全连接层的作用凸显出来

3.2 Bounding Box Regression :

提出:RCNN的误差主要是定位误差。

BBR:作者提出一种线性模型也就是预测框回归模型,输出新框相比候选框的偏移量。根据这个偏移量的参数来修正原先的预测框,从而得到修正后的新的框。这样的方法能够提高mAP 3%~4%。

(P:候选框,G:标注框,dx,dy,dw,dp:回归器输出的预测结果,Pw,Ph:图像尺度因子)

这样就把这个bbr变成了一个回归问题:构造一个L2正则化的最小二乘损失函数。

lamda设置为:1000.

训练策略是只保留IOU>0.6的进行回归训练。即G和P的IOU。且P至少要在一个G的附近

参考:【精读AI论文】R-CNN深度学习目标检测算法

四、总结

  • R-CNN 采用 AlexNet

  • R-CNN 采用 Selective Search 技术生成 Region Proposal.

  • R-CNN 在 ImageNet 上先进行预训练,然后利用成熟的权重参数在 PASCAL VOC 数据集上进行 fine-tune

  • R-CNN 用 CNN 抽取特征,然后用一系列的的 SVM 做类别预测。

  • R-CNN 的 bbox 位置回归基于 DPM 的灵感,自己训练了一个线性回归模型。

  • R-CNN 的语义分割采用 CPMC 生成 Region

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值