非常严谨,非常美观,非常清楚(重点和细节全讲了,观看人数多,有指正)。
RCNN理论合集:https://www.bilibili.com/video/BV1af4y1m7iL?from=search&seid=4520391483531272743
(包括RCNN系列、YOLO系列、以及源码讲解,非常精良成体系)
2012年AlexNet在ImageNet举办的ILSVRC中大放异彩,R-CNN作者受此启发,尝试将AlexNet在图像分类上的能力迁移到PASCAL VOC(1万图像,20类,标定类别和位置)的目标检测上。这就要解决两个问题:
针对问题1,R-CNN利用候选区域的方法(Region Proposal),这也是该网络被称为R-CNN的原因:Regions with CNN features。
针对问题2,R-CNN使用了微调的方法,利用AlexNet在ImageNet上预训练好的模型。
疑问:为什么用SVM分类而不使用CNN全连接之后的softmax直接把分类做了?
原因:主要是基于CNN阶段和SVM阶段对正样本的IOU阈值标准需要不一样,单独再训练SVM去分类,对正样本IOU阈值可以定的更高,从而带来分类精度提升。见知乎:https://www.zhihu.com/question/54117650
R-CNN的目标检测过程:
用什么方法提取框:Region Proposal是一类传统的区域提取方法,可以看作不同宽高的滑动窗口,通过窗口滑动获得潜在的目标图像。
提取多少个框:具体是使用了Selective Search方法从一张图像生成约2000-3000个候选区域。
提取框后干什么:根据Proposal提取的目标图像进行归一化,作为CNN的标准输入。
对生成的2000个候选区域,使用预训练好的AlexNet网络进行特征提取。
利用上面提取到的候选区域的特征向量,通过SVM分类器来判断是哪个目标类别。而SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。SVM多分类有两种方式,这里作者使用的是:有多少个目标类,就单独训练多少个SVM分类器。
比如,下图针对狗的SVM分类器:
狗的SVM分类器,就要能判断出某个候选区域是不是包含狗,包含狗了那就是Positive;不包含就是Negative.
对于候选区域只是框出来了某个类的一部分图像问题,在R-CNN中,设定一个0.3的IOU阈值,如果该区域与Ground truth的IOU低于该阈值,就将给区域设置为Negative。
主要参考:https://blog.csdn.net/zijin0802034/article/details/77685438
边界框回归怎么做的?
对于窗口一般使用四维向量(x,y,w,h)来表示, 分别表示窗口的中心点坐标和宽高。 对于下图2,红色的框 P 代表原始的Proposal, 绿色的框 G 代表目标的 Ground Truth, 我们的目标是寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G 更接近的回归窗口G^。
边框回归的目的既是:给定(Px,Py,Pw,Ph)寻找一种映射ff, 使得f(Px,Py,Pw,Ph) = (Gx^,Gy^,Gw^,Gh^) 并且(Gx^,Gy^,Gw^,Gh^) ≈ (Gx,Gy,Gw,Gh)。
具体算法见参考文献,大概意思如下:
从一张图片中提取2000个候选区域,将每个区域按照训练时候的方式进行处理,输入到SVM中进行正负样本的识别,并使用候选框回归器,计算出每个候选区域的分数。针对每个类,通过计算IOU,采取非最大值抑制的方法,以最高分的区域为基础,删掉重叠的区域。
RCNN作为第一篇目标检测领域的深度学习文章,大幅提升了目标检测的识别精度,在PASCAL VOC2012数据集上将mAP从35.1%提升至53.7%。使得CNN在目标检测领域成为常态,也使得大家开始探索CNN在其他计算机视觉领域的巨大潜力。
何凯明等发明。
智者善于提出疑问,既然CNN的特征提取过程如此耗时(大量的卷积计算),为什么要对每一个候选区域独立计算,而不是先提取图像的整体特征,然后仅在分类之前做一次Region截取呢?立即付诸实践,于是SPP-Net诞生了。
SPP-Net整个过程:
首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。这一步和R-CNN一样。
特征提取阶段。这一步就是和R-CNN最大的区别了,这一步骤的具体操作如下:把整张待检测的图片,输入CNN中,进行一次性特征提取,得到feature maps,然后在feature maps中找到各个候选框的区域,再对各个候选框采用金字塔空间池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
最后一步也是和R-CNN一样,采用SVM算法进行特征向量分类识别。
RCNN过程:
SPP-Net过程:
SPP-net与R-CNN的对比:RCNN输入原图像的proposal,SPP-Net输入特征的proposal.
SPP-Net在RCNN的基础上做了实质性的改进:
为了适应不同分辨率的特征图,定义一种可伸缩的池化层,不管输入分辨率是多大,都可以划分成m*n个部分。这是SPP-net的第一个显著特征,它的输入是conv5特征图 以及特征图候选框(原图候选框 通过stride映射得到),输出是固定尺寸(m*n)特征;
还有金字塔呢?通过多尺度增加所提取特征的鲁棒性,这并不关键,在后面的Fast-RCNN改进中该特征已经被舍弃;
最关键的是SPP的位置,它放在所有的卷积层之后,有效解决了卷积层的重复计算问题(测试速度提高了24~102倍),这是论文的核心贡献。
RCNN原作者Ross Girshick2015年推出。
Fast-RCNN主要贡献在于对RCNN进行加速:训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。
将分类和边框回归进行合并(又一个开创性的思路),通过多任务Loss层进一步整合深度网络,统一了训练过程,从而提高了算法准确度。
作者:任少卿、何凯明、Ross Girshick, 孙剑
在Fast R-CNN中使用的目标检测识别网络,在速度和精度上都有了不错的结果。不足的是,其候选区域提取方法耗时较长,而且和目标检测网络是分离的,并不是end-to-end的。在Faster R-CNN中提出了区域检测网络(Region Proposal Network,RPN),将候选区域的提取和Fast R-CNN中的目标检测网络融合到一起,这样可以在同一个网络中实现目标检测。
Faster R-CNN的网络有4部分组成:
其整个工作流程如下:
下面这张图的目的是为了显示训练是分阶段的,即像之前的方法一样,先产生建议框,然后拿建议框去分类,只不过这里建议框的生成方式换成了RPN网络。
之前的Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。 解决方法:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了,即Region Proposal Network(RPN)。
Faster R-CNN解决的是,“为什么还要用selective search呢?”----将选择性搜索候选框的方法换成Region Proposal Network(RPN)。
RPN的最终结果是用CNN来生成候选窗口,通过得分排序等方式挑出量少质优的框(~300)
让生成候选窗口的CNN和分类的CNN共享卷积层
其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的foreground anchor,哪些是没目标的backgroud。所以,仅仅是个二分类而已!)
RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。
目标分类只需要区分候选框内特征为前景或者背景。
边框回归确定更精确的目标位置,基本网络结构如下图所示:
训练过程中,涉及到的候选框选取,选取依据:
对于每一个位置,通过两个全连接层(目标分类+边框回归)对每个候选框(anchor)进行判断,并且结合概率值进行舍弃(仅保留约300个anchor), 没有显式地提取任何候选窗口 ,完全使用网络自身完成判断和修正。
从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为:
RCNN网络的演进:
RCNN网络的速度和精度:
RCNN到Faster R-CNN笔记 https://www.jianshu.com/p/4064de5499d5
RCNN介绍 https://blog.csdn.net/xyfengbo/article/details/70227173?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242
目标检测之R-CNN系列 https://www.cnblogs.com/wangguchangqing/p/10384058.html