赞
踩
滑动窗口是最开始用的一种目标检测的方法,是一种比较暴力的方法
过程:输入一张图片,设置多种尺度的BBox,对输入图片从左到右、从上到下进行滑动BBox,裁剪出BBox_img,然后输入到CNN中进行识别判断。
缺点:暴力搜索,非常耗时
整体描述:①输入图片首先经过 Region proposal ,使用 selective search 方法得到2000 ROIs;生成的ROIs可能大小不一样,然后resize成相同大小ROI;②接着将相同尺寸的ROIs输入到CNN网络进行特征提取;③最后将特征送入每一类的SVM 分类器,判别是否属于该类;④并且进行位置精修,即使用回归器(边框回归)精细修正候选框位置。注意:为什么要进行边框回归,因为Selective search得到的ROIs应该是不准确的,所以需要回归!
具体说:
区域候选框的生成: Selective Search 的前期工作就是利用Graph-Based Image Segmentation的分割算法产生初始的分割区域,然后使用相似度计算方法合并一些小的区域,参考
(CNN)特征提取:采用的是AlexNet,由五个卷积层,两个全连接层组成,输出的特征是4096维的向量。由于这个网络要求的输入格式是227x227的RGB图像,所以将候选区域全部resize成227x227(最简单的变换方法),然后减均值输入到网络中。注意,resize前,在边框四周填充16个像素,再进行 各向异性 缩放, 这种形变使得mAp提高了3到5个百分点。
关于ROI缩放到固定尺寸的方法: 主要分为各向异性和各向同性两种方法,参考。结合下图讲,其中各向异性就是最简单的变换,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了(D)。因为图片扭曲后,估计会对后续CNN的训练精度有影响,作者也测试了“各向同性缩放”方案,有两种办法:①先扩充后裁剪(B);②先裁剪后扩充(C)。文献还有个padding处理,下面的示意图中,每个例子,上面的行采用padding=0,下面一行采用padding=16。经过最后的试验,作者发现采用各向异性缩放、padding=16的精度最高。
边框回归怎么做(重点,目标检测中都用)
R-CNN很明显还是比较慢,检测一张图片大概20s的时间,Fast R-CNN直接在feature map上生成ROIs,而不是在输入图片上Selective 2000个ROIs。
要解决的问题:
Fast RCNN直接改进:
整体框架
最直接的改进: Faster-RCNN 引入了RPN网络(region proposal network)来代替 selective-search,这使得整个网络实现了端到端。
Faster R-CNN算是RCNN系列算法的最杰出产物,也是two-stage中最为经典的物体检测算法。
整体框架
整体描述: ①输入图片经过CNN进行特征提取得到Feature map;②Feature map 经过RPN网络得到Feature map中的ROIs;③将Feature map中的ROIs进行ROI pooling 得到固定尺寸;④最后将固定尺寸的ROIs输入到后续FC中进行分类和边框回归。
具体说:
CNN特征提取: Faster RCNN 只使用了VGG16的前30层作为特征提取器,所以每一张图片在经过特征提取后,尺寸会变为原来的1/16,根据前文的假设,一张800x600的图片变为50x37的 Feature map,而且通道数从原来的3变为512。
Anchor的概念: 将FeatureMap中的每一点按照视野域找到原图中对应的位置,称为Anchor;每个Anchor生成不同大小不同长宽比的多个候选区域。Selective-search方法的候选区域生成方式,它是按照颜色和纹理不断合并得到候选区域的,候选区域的产生没有规律,而RPN是每个Anchor都有对应的固定数量的候选区域,规律很明显。
结合Faster R-CNN深刻理解 Anchor: 预测阶段(预测阶段的anchor都是训练好的,用来直接预测物体BBox),例如下图左边,是特征图上的一个特征点,这个特征点对应有9个训练好的Anchor,不同尺度,可以看出这个特征点对应原图片的人这个类别,而且anchor也覆盖了原图片人的区域,见下图中间,如果将所有特征点的所有Anchor绘制出来,可以看出完全覆盖整幅图片,见下图右边。训练阶段:训练阶段每个特征点会有初始的生成的9个Anchor,然后通过训练对其进行微调,例如:如果这个特征点的类别是一个人,然后将9个Anchor与人的GT BBox算IOU,选择IOU最大的那个Anchor来预测人的BBox,从而对选中的Anchor计算回归损失,完成训练。
在原图中生成anchor主要分为三步:参考
RPN网络: RPN网络是Faster RCNN的精髓所在,将传统的候选区域生成方法使用卷积运算来代替,而且根据原文作者所说,使用卷积来生成候选区域使得RPN具有一定注意力机制,效果与前几代的RCNN相比,提升明显。首先,RPN网络接受任意尺寸大小的 Feature map 作为输入,然后会生成9K个anchor,并且RPN有两个输出,一个是anchor的类别信息,也就是该anchor是背景还是前景(只要有要识别的物体就属于前景),还有一个输出是该anchor的位置偏移信息(如果该anchor是背景,则该输出不重要),下图是RPN网络结构:
RPN网络从接入vgg 提取的特征,到RPN网络如何识别每一个anchor的类别,注意这边进行的是二分类,即判断anchor的内容是背景还是前景;到RPN网络是如何对anchor位置进行修正的,详细过程参考:参考1,参考2,RPN网络详细结构如下(红色部分):
对Anchor的筛选工作: 现在我们已经有一堆经过修正后的anchor,并且也知道了每一个anchor属于前景的概率,但我们细想一下,现在anchor的数量是不是太多了,我们只用了一张800x600的图像作为输入就生成了16650个anchor,如果全部作为RoI(Region of Intererst,也就是感兴趣区域或者说候选区域)输入到后续网络中,这计算量属实有点大,所以就需要进行一些筛选工作,这其实也就是 RPN 网络中Proposal层所做的工作。
首先 ,现在我们的anchor有许多因为是在边缘生成的,所以它们的坐标可能是负值,或者简单来说就是超出了图片的范围,那么就需要对这些anchor进行裁剪,把它们统一裁剪到图片范围内,也就是将anchor左上角坐标小于0的值用0代替,右下角坐标的X轴数值大于W就用W代替,Y轴数值大于H的用H代替。经过上一步的裁剪工作,就会有许多anchor会变得很小,这里我们设定一个阈值,凡是小于16*16的anchor,我们都把它丢弃掉。
接着 ,因为我们已经有了每一个anchor属于前景的概率,那么很明显如果一个anchor属于前景的概率太小,那么也没有留着的必要性,所以对这些anchor的前景概率从大到小进行argsort,得到每一个anchor的排序索引,只取前6000个,到这一步anchor还是很多,但此时不能再鲁莽的去除anchor,因为有可能会有误判(毕竟这个前景概率只是rpn的预测,并不是真实的),此时需要用NMS方法把IoU大于0.7的进行合并,对于合并完的anchor再取前300个,这样就把输入到RoI网络的anchor的数量大大减少了。
注:需要注意的是,此处的6000以及300是测试阶段的配置,训练与此处不一样。
RPN总结: RPN部分内容比较多,第一次了解可能会被绕晕,做一个简单的小结如下图。在作者代码中,主要把RPN主要分成了两部分,一个是RPN Head,另一个是Proposal,RPN Head主要负责anchor的生成、anchor位置偏移量预测以及anchor的类别判断;Proposal负责对生成的anchor进行进一步的筛选,将筛选后的anchor作为RoI输入到后续的网络中。需要注意的是,因为不管是anchor的类别预测还是位置偏移量预测,这些都是在channel里面的,所以对这两个输出都需要使用 pytorch 的 permute 函数来将维度进行换位。
ROI Head 部分: 与Fast RCNN 类似,固定ROI尺寸的方法也是使用ROI Pooling 的方法。
训练部分: Faster RCNN 有三个部分需要训练,分别是特征提取器VGG16,RPN以及RoIHead。其中特征提取器一般是采用预训练模型进行微调,重点是 RPN 的训练以及 RoI 的训练,虽然原论文中Faster RCNN是将这两部分分开训练的,但现在大多数实现都是进行联合训练的方式。具体训练过程参考:参考
思考一个问题? 为什么要生成一堆anchor,再对它们进行修正,而不是一开始直接预测候选区域的坐标?其实 YOLO v1 就是没有使用anchor,直接对候选区域的坐标进行预测,但作者发现,效果并不好,主要是因为网络很难收敛,训练难度较大,所以 YOLO 的作者后来就将 Faster RCC 的 RPN 进行了相关的修改,将 anchor 加入到了YOLO v2中,效果有了显著的提高。
比Fast rcnn 快在哪里: 容易想到,现在RPN网络可以与其他3个阶段共用同一个特征提取结果了,省掉了 selective-search 的时间。而事实上,selective-search是非常慢的,所以叫Faster。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。