背景:R-CNN作为经典的目标检测网络算法,论文标题为:《Rich feature hierarchies for accurate object detection and semantic segmentation》即高准确度的目标检测与语义分割的一种神经网络。论文发布于2014年,是two-stage的开山经典之作。与ImageNet一同开启了计算机视觉人工智能第二个十年。后续的包括SPP-Net、Fast-RCNN等都是基于此。
传统目标检测达到瓶颈:
传统特征是像素级别的特征:低级特征、高级特征、上下文信息的集成(比如SIFT)。但是缺乏了语义信息;
传统的HOG特征可解释性好、直观而且简洁。但是它没有抽象,特征的提取是有限的。
精度低,RCNN提出的可扩展的目标检测算法在VOC2012上的性能相对提升了30%,达到53.3%;
传统的方法提升已经到了瓶颈,只是类似于V1细胞,没有像大脑皮层一样联系起来,而且都是微小的改动。
RCNN的与传统的优势:
训练了一个高表达能力的神经网络、自上而下地提取候选框的特征,并用它来定位或者分类、分割;
通过先在辅助任务上得到预训练模型、再到PASCAL-VOC上微调,使得其在小目标集上也有好的效果。(监督学习)
加了回归头后、可以显著降低定位错误,也就是精调。
神经网络的发展:
Fukushima : 神经认识机 -->类似于神经网络 (仿生的、分层的、平移不变的)但缺失监督训练算法
LeCun : 填补缺失 -->随机梯度下降、反向传播算法
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