R-CNN缺点
- 训练是个multi-stage pipeline(CNN提取特征、通过log loss 微调网络、训练SVMs、bounding-box regression)
- 训练费时间和空间
- 目标检测很慢
SPPnet 缺点
- 训练是个multi-stage pipeline(CNN提取特征、通过log loss 微调网络、训练SVMs、bounding-box regression)
- 不同于R-CNN,微调算法不能更新空间金字塔池化层前面的卷积层
Fast R-CNN优点
- 高的监测质量(准确率+速度)
- 训练是single-stage,采用一个多任务损失multi-task loss
- 训练可以更新网络的所有层
- 不需要将提取的特征写入硬盘中,节省空间
Fast R-CNN算法流程
- 任意size图片输入CNN网络,经过若干卷积层与池化层,得到特征图;
- 在任意size图片上采用selective search算法提取约2k个候选框;
- 根据原图中候选框到特征图映射关系,在特征图中找到每个候选框对应的特征框【深度和特征图一致】,并在RoI池化层中将每个特征框池化到H×W【VGG-16网络是7×7】的size;
- 固定H×W【VGG-16网络是7×7】大小的特征框经过全连接层得到固定大小的特征向量;
- 第4步所得特征向量经由各自的全连接层【由SVD分解实现】,分别得到两个输出向量:一个是softmax的分类得分,一个是Bounding-box窗口回归;
- 利用窗口得分分别对每一类物体进行非极大值抑制剔除重叠候选框,最终得到每个类别中回归修正后的得分最高的窗口。
一些细节说明
- RoI pooling layer 其实是 spatial pyramid pooling layer的特例,即只采用一层金字塔等级。
- RoI pooling 输出的尺寸H*W是个超参数,与RoI(候选区域)的大小无关。H和W的数值根据所用CNN网络的第一层全连接层确定,(如VGG16采用H=W=7)
- bounding box regression输出是四元元组(r,c,h,w),其中(r,c)为左上角点坐标,h,w为长和宽,共输出4*K个数值(K为类别数)
- softmax输出K+1个概率值(K个类别+背景)
用预训练好网络初始化Fast R-CNN(迁移学习)方法
-
用RoI pooling layer代替原网络最后一层最大池化层
-
原网络最后一层全连接层和softmax层被上述的softmax和BB Regression代替
-
将原网络调整为接受两种输入:batch个图片以及这些图片的RoIs
训练Fast R-CNN其他细节说明
- multi-task loss。 训练过程是单管道的,因为将分类loss和定位loss合并在一起训练了。其中定位loss采用smooth L1,而不是R-CNN中的L2。每个RoI的第一个输出是离散概率分布为
, 第二个输出是bb regression offsets
(对每一个k类别)。每个 RoI的两个label分别是真实类别u和bb regression目标值v。
-
-
- 训练采用minibatch sampling,batch size=128(每次从N=2个图片中构建,每个图片提取64个RoI)。其中 RoIs中的25%作为正样本,标签为u>=1(要检测的物体,IoU>=0.5),RoIs的剩下75%作为负样本,标签为u=0(背景,IoU属于[0.1,0.5),),这里IoU属于超参数。注:在图像分类中,当我们说batch_size=32时,是指的是32个图片,在Fast R-CNN中并不是这样,因为一个图片含有很多RoIs,每个batch使用的图片非常少(内存限制),所以有时候你会看到Fast R-CNN训练时直接从一个图片中构建batch,这实现起来更容易一些。
和rcnn的不同之处:
- rcnn是在原始input图片上采用selective search搜索约2千个候选区域 ,然后对每一个候选区域经过warp成相同大小后送入CNN网络中提取特征。即需要经过约2k个CNN处理
- fast-rcnns也是在原始input图片上采用selective search搜索约2千个候选区域,然后将原始图片和候选区域的位置信息一起输入CNN中。但是注意:只对原始图片采用CNN网络处理,得到feature map,然后根据input图片和feature map之间的线性映射关系,找到候选区域在feature map上对应的特征框(示意图中的RoIs),然后对特征框进行RoI Pooling处理。即只经过一次CNN处理
参考资料: