基础:
R-CNN。简单来说,R-CNN使用以下四步实现目标检测:
a. 在图像中确定约1000-2000个候选框
b. 对于每个候选框内图像块,使用深度网络提取特征
c. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
d. 对于属于某一特征的候选框,用回归器进一步调整其位置
R - CNN 存在的问题
有多种训练对象,训练时间过长,测试所需时间较长
改进方案:
以下三段文字来自作者:知乎 - 魏晋
R-CNN存在着重复计算的问题:proposal的region有几千个,多数都是互相重叠,重叠部分会被多次重复提取feature。
Fast-R CNN,跟R CNN最大区别是:Fast-R CNN将proposal的region,映射到CNN的最后一层conv layer的feature map上,这样一张图片只需要提取一次feature,大大提高了速度。
Faster-R CNN:考虑到Fast-R CNN的速度瓶颈在Region proposal上,于是RBG和Kaiming He一帮人将Region proposal也交给CNN来做,提出了Faster-R CNN。Faster-R CNN中的region proposal network实质是一个Fast-R CNN,这个Fast-R CNN输入的region proposal的是固定的(把一张图片划分成n*n个区域,每个区域给出9个不同ratio和scale的proposal),输出的是对输入-固定的proposal,是属于背景还是前景的判断和对齐位置的修正(regression)。Region proposal network的输出再输入第二个Fast-R CNN,做更精细的分类和Bounding box的位置修正。
Fast R-CNN
Training过程:
1. 对训练集中所有的图片,用selective search提取出各图片对应的2000个proposal,并保存。(图片路径+bounding box信息)
2. 对每张图片,根据图片中bounding box的ground truth信息,给该图片的2000个proposal赋类标签,并保存。(这2000个proposal,如果跟ground truth中的proposal的IoU值超过了阈值(IOU>=0.5),则把ground truth中的proposal对应的类标签赋给原始产生的这个proposal,其余的proposal(IOU [0.1, 0.5))都标为background)
3. 使用mini-batch=128,25%来自有非背景标签的proposal,其余来自标记为背景的proposal(最开始的理解:具体在这个过程中,mini-batch有两个层次,一个是对于同一张图片,64个proposal组成的mini-batch,另一个是完成单张图片的导数计算后,两张图片是一个mini-batch,更新的时候对两张图片求得的值取平均来更新权重),其实,就是ROI pooling layer以前,batch size=2,ROI pooling layer之后,batch size=128
4. 训练CNN,最后一层的结果包含类信息和位置修正信息,所以用多任务的loss,一个是分类的损失函数,一个是位置的损失函数
Fast R-CNN方法解决了R-CNN方法三个问题:
问题一:测试时速度慢,47s/ image
R-CNN一张图像内候选框之间大量重叠,提取特征操作冗余。
Fast R-CNN 将整张图像归一化后直接送入深度网络。在邻接时,才加入候选框信息,在末尾的少数几层处理每个候选框。
问题二:训练时速度慢
原因同上。 在训练时,Fast R-CNN先将一张图像送入网络,紧接着送入从这幅图像上提取出的候选区域。这些候选区域的前几层特征不需要再重复计算。
问题三:训练所需空间大
RCNN中独立的分类器和回归器需要大量特征作为训练样本。
Fast R-CNN 将类别判断和位置精调统一用深度网络实现,不再需要额外存储。