目标检测算法复习:R-CNN算法

一,前言

出于加深目标检测的理解,计划从R-CNN开始,将代表性的目标检测模型都学习一遍。先说说R-CNN,目标检测领域,R-CNN是公认的开创性的模型,看完SSD、YOLO再来看R-CNN会感觉它很原始。但其中很多细节,后面的目标检测模型都有继承和发扬,如 NMS,难例挖掘、bbox公式等等。其中最鲜明的特点是引入了CNN对模型性能进行改善,使得最终效果明显,也给后来模型发展提供了方向。
本来是想自己写篇博客了,查阅大神们的佳作时,发现基本都写的蛮不错,就没想重写一篇了,所以本篇只做第一篇链接博客的补充。下面贴出大神博客,建议先看看他们再去看论文(大神当我没说过),这样事半功倍:
讲的很详细了: https://blog.csdn.net/WoPawn/article/details/52133338 ;
这篇是论文翻译: https://blog.csdn.net/v1_vivian/article/details/78599229 。

二、测试阶段

为什么先说测试呢?因为觉得R-CNN检测流程其实蛮繁琐的,一开始直接讲训练,容易晕。所以先说说测试,对R-CNN检测流程有个初步了解后再深入探讨。附上R-CNN的模型架构,可见大体采用AlexNet模型,R-CNN作者对神经网络结构没什么改进:
在这里插入图片描述

1.单张图片检测步骤

(1)输入一张图片,经 selective search 算法提取约2000个候选区域(Region Proposal);
注:selective search 算法 :https://blog.csdn.net/mao_kun/article/details/50576003 ,一种物体识别算法,不说它了,目标检测不用它了。

(2)将所有候选区域进行图片处理后(图片缩放至相应尺寸,图片预处理——减均值),依次输入模型进行特征提取;
注:原文是 :A pilot set of experiments showed that warping with context padding (p = 16 pixels) outperformed the alternatives by a large margin (3-5 mAP points)。
我理解是在每个候选区域的上下左右四个方向,都填充16个像素,然后再粗暴拉伸至 227X227 的尺寸。 填充的像素值有两种情况:
① 如果填充区域(即外围一圈填充16个像素的区域)没超出图片范围,则采用原图上的像素值做填充;
② 如果填充区域出界了,则采用图片均值(image mean)做填充。
在喂入模型之前,还要做预处理,即统一减去图片均值 [ image mean (which is then subtracted before inputing the image into the CNN ]。

(3)每个候选区域经CNN后生成4096维数据(上图数字10处),2000个建议框的CNN特征组合成2000×4096维矩阵;

(4) 将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘【20种分类,SVM是二分类器,则有20个SVM】,获得2000×20维矩阵表示每个建议框是某个物体类别的得分;
注:每一行是某个候选框特征经 20 个SVM分类器计算后的结果,输入哪一类的可能性越高,结果越大,如果分类器性能优秀的话,应该有一个是个较大的正值,其他都是小于 0 的负数。

(5) 分别对上述2000×20维矩阵中每一列即每一类进行非极大值抑制剔除重叠建议框,得到该列即该类中得分最高的一些建议框;

(6) 分别用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别的修正后的得分最高的bounding box。
注:文中说是 Pool 5 的特征,即上图第8层的特征,将其reshape成(1, 9216)的数据再与对应类别的线性回归器做计算,注意回归器也是每类训练一个,共20个分类器。每个候选框只有一组 Pool 5 特征,一张图片约有 2000组 Pool 5 特征。

由上可见,可知RCNN很笨重,20个分类器、20个回归器,训练起来都很费劲。

三、训练阶段

训练阶段第一篇博客讲的很好了,在此不赘叙了。说说他没给出的难例挖掘定义吧(Hard negative mining)。老套路,给出链接吧 https://www.zhihu.com/question/46292829/answer/235112564 。R-CNN的难例挖掘方法叫 bootstrapping,代码是用 MATLAB 实现的,回答下面也有链接,有需要可以看下。总结起来就一段话:

“在bootstrapping方法中,我们先用初始的正负样本(一般是正样本 + 与正样本同规模的负样本的一个子集)训练分类器,然后再用训练出的分类器对样本进行分类,把其中错误分类的那些样本(hard negative)放入负样本集合,再继续训练分类器,如此反复,直到达到停止条件(比如分类器性能不再提升).

作者:R2D2
链接:https://www.zhihu.com/question/46292829/answer/235112564
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。”

看其他回答,都是第一次训练时采用 正:负 = 1 : 3 的数量比例来训练,这样的话难例样本不断进来,到后面正负之比肯定不是 1:3 ,这样训练出来的模型泛化能力还是不会太好。所以看了这个答主的回答,觉得说的很好就拿来学习引用了。

四、总结

R-CNN缺点真的是一箩筐 :
1、 训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;
2、 训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;
3、 测试速度慢:每个候选区域需要运行整个前向CNN计算;
4、 SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.
不过好歹开一派之先河,很多思路后续跟着用,证明其还是成功的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值