文章目录
1 标准数据集----ImageNet
- ImageNet是李飞飞团队创建的一个用于图像识别的大型数据库,里面包含了超过1400万张带标记的图片。
- 2010年以来,ImageNet每年举办一次图片分类和物体检测的比赛----ILSVRC(大规模视觉识别挑战赛,Imagenet Large Scale Visual Recognition Challenge)。图片分类比赛中有1000个不同类别的图片,每个类别大约有200~1000张来自不同源的图片,后续很多优秀的神经网络结构都是从该比赛中诞生的。
2 潜在物体候选框(ROI, regions of interest)获取方法
2.1 选择性搜索(selective search)
首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。
为了避免单个区域吞噬其他区域,需要先对较小的组进行分组。
SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。
2.3 区域预测网络(RPN, region proposal network)
- 1、用n×n(默认3×3=9)大小的窗口去扫描特征图的每个像素点,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors)
- 2、这个n×n的滑动窗口经过整个特征层,并且每次计算都将经过这低维特征向量输入并最终输出2个结果:
- 输出每个anchor位置对应的4个值(用于回归网络,修正位置)
- 输出每个anchor位置是否为物体(是否为前景或背景概率,二分类网络)
- 其中anchors:
3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors,三种尺度{ 128,256,512 }, 三种长宽比{1:1,1:2,2:1},特征图中的每个像素点有9种框 - 3、区域预测网络的训练
- 标记anchor,用于训练
anchors与任何ground-truth box的交并比(IoU)- IoU大于0.7记为正样本
- IoU小于0.3,记为负样本
- 剩下的样本全部忽略
- 正负样本比例为1:3
- 训练损失
可以直接使用“分类+定位”的模型进行“head”修改
注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价
- 标记anchor,用于训练
- 4、候选区域的训练是为了让得出来的 正确的候选区域, 并且候选区域经过了回归微调。最终得到一定数量的潜在物体候选框(ROI)。
- 注:在这基础之上做Fast RCNN训练是得到特征向量做分类预测和回归预测。
3 候选框缩放
3.1 Crop+Warp
传统的CNN限制了输入必须固定大小,所以在实际使用中往往需要对原候选框(ROI)进行crop或者warp的操作,来保证输入大小一致。
- crop:截取原图片的一个固定大小的patch
- warp:将原图片的ROI缩放到一个固定大小的patch
无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。会使用一些方法尽量让图片保持最小的变形。
原候选框(ROI)调整效果
- 各向异性缩放(不使用):即直接缩放到指定大小,这可能会造成不必要的图像失真
- 各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色
3.2 空间金字塔池化(SPP,spatial pyramid pooling)
通过SPP将任意大小的特征图转换成固定大小的特征向量
示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。接着在这个特征图中找到每一个候选区域映射的区域,spp layer会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如下图:
3.3 RoI Pooling
首先RoI pooling只是一个简单版本的SPP,目的是为了减少计算时间并且得出固定长度的向量。
RoI池层使用最大池化将任何有效的RoI区域内的特征转换成具有H×W的固定空间范围的小feature map,其中H和W是超参数 它们独立于任何特定的RoI。
例如:VGG16 的第一个 FC 层的输入是 7 x 7 x 512,其中 512 表示 feature map 的层数。在经过 pooling 操作后,其特征输出维度满足 H x W。假设输出的结果与FC层要求大小不一致,对原本 max pooling 的单位网格进行调整,使得 pooling 的每个网格大小动态调整为 h/H,w/W, 最终得到的特征维度都是 HxWxD。
它要求 Pooling 后的特征为 7 x 7 x512,如果碰巧 ROI 区域只有 6 x 6 大小怎么办?每个网格的大小取 6/7=0.85 , 6/7=0.85,以长宽为例,按照这样的间隔取网格:[0,0.85,1.7,2.55,3.4,4.25,5.1,5.95],取整后,每个网格对应的起始坐标为:[0,1,2,3,3,4,5]
为什么要设计单个尺度呢?这要涉及到single scale与multi scale两者的优缺点
single scale,直接将image定为某种scale,直接输入网络来训练即可。(Fast R-CNN)
multi scal,也就是要生成一个金字塔,然后对于object,在金字塔上找到一个大小比较接近227x227的投影版本
后者比前者更加准确些,没有突更多,但是第一种时间要省很多,所以实际采用的是第一个策略,因此Fast R-CNN要比SPPNet快很多也是因为这里的原因。
4 非最大值抑制(NMS,non-maximum suppression)
- 目的:对最终所有的候选区域得分,进行概率筛选,得到最终候选区域结果
- 迭代过程:
假设现在滑动窗口有:A、B、C、D、E 5个候选框,- 第一轮:假设B是得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,剔除DE,B作为一个预测结果
- 第二轮:AC中,A的得分最高,与A计算IoU,C的结果>0.5,剔除C,A作为一个结果
- 最终结果为在这个5个中检测出了两个目标为A和B