浅读R-CNN
(注:本文借鉴自:https://blog.youkuaiyun.com/hjimce/article/details/50187029)
文章目录
思路
首先输入一张图片,我们先定位出2000个物体候选框,然后采用CNN提取每个候选框中图片的特征向量,特征向量的维度为4096维,接着采用svm算法对各个候选框中的物体进行分类识别。也就是总个过程分为三个程序:a、找出候选框;b、利用CNN提取特征向量;c、利用SVM进行特征向量分类。具体的流程如下图片所示:
一、候选框搜索
输入一张图片,搜索所有可能是物体的区域,该算法采用传统文献:《search for object recognition》。通过该算法找出2000个候选框,由于搜索出的候选框大小各异,因为CNN的输入都是固定大小的,如果不进行处理直接进入CNN是无法使用的,因此需要对搜索到的矩形选框进行处理。处理方法如下:
各向异性缩放:
不管图片的长宽比例,管它是否扭曲,直接进行缩放。缩放到与CNN输入大小相同。
各向同性缩放:
因为图片扭曲后,估计会对后续CNN的训练精度有影响,所以对该问题有两个解决方案:
1.直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
2.先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值),如下图©所示;
对异性、同性缩放时还需要做padding的处理,上图1、3行结合padding=0的情况,2、4行是采用padding=16的结果。经检验:采用各向异性缩放、padding=16的精度最高。
由于还要使用这2000个bounding box图片继续训练CNN、SVM。我们通过IOU对2000个候选框与人工标注的候选框进行比对,若IOU大于0.5,将该候选框标注成物体类别,否则将它当做背景类别。
二、CNN特征提取
1.网络结构设计
方案:
- Alexnet(精度58.5%,计算量小)
- VGG16(精度66%,计算量为Alexnet的7倍)
此处采用Alexnet。Alexnet特征提取包含了5个卷积层,2个全连接层,p5层神经元个数为9216、 f6、f7的神经元个数都是4096。通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
2.网络有监督预训练
直接采用Alexnet的参数作为初始化参数。采用梯度下降法,学习速率大小为0.001.
3.fine-tuning阶段
采用selective search 搜索出来的候选框,处理到指定大小的图片,对上面预处理的CNN模型进行fine-tuning训练。并将上面预训练的CNN模型的最后一层替换成我们要检测的物体类别(N)+1(除了物体类别N种,还有一个背景特征)。最后一层数据随机初始化,其它层参数不变,接着训练SGD,刚开始SGD的learning rate采用0.001,在每次训练的时候,batch size大小选择128,其中32个正样本,96个负样本。(正负样本详见三、SVM训练、测试)
三、SVM训练、测试
当bounding box将我们希望检测的物体包含在内时,我们将该数据称为正样本,将未将检测对象包含在内的称为负样本,经测试IOU阈值为0.3时效果最好。为每个待检测对象训练一个SVM分类器(N个对象,即有N个SVM分类器)。当用CNN提取2000个候选框后,就可以得到2000x4096个特征向量矩阵,再将这样的矩阵点乘4096xN的SVN权值矩阵(weight),就可以得到对应结果。
注释
- bounding box(边框)
- Rol(Regions of interest)感兴趣区域
- SS(Selective Search)选择性搜索
- SVM(Support Vector Machine)支持向量机
尾声
R-CNN为目标检测提供了一个方向,但在运行速度方面仍有缺陷:
- 对于每一张图片都产生2000个ROI。
- 对于每一张图片都进行一次Selective Search获取ROI pooling,根据图片数量呈线性增长。
- 调用了CNN提取特征,,SVM识别物体,以及调整bounding box的回归模型。
详情可入群询问283266234。
若本人对文章解读有所误解与不足处,还望斧正。