本专栏将从论文的角度解读一下CV方向的一些经典神经网络模型及其贡献与意义,以期加深自己的印象,后续可以随时翻看并且学习其中好的tricks。上一期讲的SPPNet基于R-CNN最大的改进,其实就是对整张图而不是对2000个候选框进行特征提取,加快了速度,这一期来看看Fast R-CNN又做出了哪些改进。
论文相关信息
《Fast R-CNN》(论文链接),于2015年发表在CVPR上,相关信息如下:
论文所使用数据集为PASCAL VOC 2007、2010、2012数据集。
网络架构
从上图可以看出Fast R-CNN的架构,其实和SPPNet非常相似。首先在图像上使用选择性搜索抽取2000个推荐区域,然后把整张待检测的图片输入到CNN(Fast R-CNN论文中使用的是VGG,而R-CNN使用的是AlexNet)中,进行一次特征提取,得到feature map,然后在feature map中通过映射关系找到各个候选框对应的区域,再对各个候选框利用RoI池化(Region of Interest,由Selective Search算法提取的一系列可能含有object的bounding box,通常称为region proposals或者region of interest;RoI池化其实就是SPP池化的单尺度简化版本,具体可看这里)提取出固定长度的特征向量,到此都和之前说的SPPNet步骤一模一样。
在最后一步稍有差别,也是最大的改进:R-CNN和SPPNet都是拿得到的特征向量再去训练SVM分类和BBox回归,而Fast R-CNN 则是直接放入并行的bbox回归与softmax分类的多任务全连接层(图转自这里):
损失函数具体公式为:
训练过程(图转自这里):
测试过程(图也转自这里):
tricks
这篇文章有一个特别好的点,在论文中直接通过清晰的实验来评估他们的各个tricks改进是否有效:
1、multi-task training(多任务训练)是否有效
首先多任务训练这种端到端的方式改进了Multiple-stage pipeline的方式,无疑是方便的,但是它对精度有什么影响呢?
如下图,S、M、L的第一列是只使用分类损失Lcls训练的模型,第二列则是使用上面提到的公式(1)多任务损失训练的模型,但测试时禁用了检测框回归,可以看到多任务损失确实能提高精度。第三列则是分段训练,在第一列训练好的模型基础上添加了检测框回归层,使用Lloc训练同时保持其他层参数冻结,第四列是正常的多任务训练和测试。第一列和第三列作为对照实验,证明了多任务训练确实能提高分类和回归的精度。
其中S、M、L:
即3个预训练ImageNet模型。第一个是来自R-CNN的CaffeNet(本质上是AlexNet),称为模型S。第二个网络是VGG_CNN_M_1024,该网络具有与模型S相同的深度,但是更广阔,称为模型M。最后一个网络是VGG16,称该网络为模型L。
2、RoI池化 or SPP池化
因为RoI池化是单尺度的,而SPP池化是多尺度的。作者们使用了指定的相同的五个尺度(s∈{480,576,688,864,1200})来与SPPNet做比较:
令人惊讶的是,单尺度检测几乎与多尺度检测一样好,多尺度方法消耗大量的计算时间仅带来了很小的mAP增加,作者们认为这是因为深度卷积网络擅长直接学习尺度不变性。
3、更多的训练数据是否有用
显然…
4、SVM分类 or Softmax分类
Fast R-CNN在微调训练期间使用Softmax分类器,而在R-CNN和SPPNet中训练的是线性SVM:
本组对比实验说明,SVM略次于Softmax.
5、更多的候选框是否有用
SS产生的是候选区域的稀疏集合,那么使用密集集合效果如何呢?如果候选框只是纯粹扮演一个可能被选择的角色,增加每个图像的候选框数量应该不会使得mAP降低。
这个实验表明,用更多的候选区域没有帮助,甚至会起一点反效果。此外,使用平均召回率AR并不像mAP那样起到好的度量效果。
总结
Fast R-CNN 是针对 R-CNN 和 SPPNet 的改进,实现了端到端的多任务训练,也不再需要额外将特征保存在磁盘上,加快了速度的同时还节省了所需存储空间。
另外还有值得一提的一点,后续有学者在Fast R-CNN中使用EdgeBoxes算法(介绍)来代替SS算法,对于SS的优化也提高了Fast R-CNN很大一部分性能,相关论文给出的数据是Selective Search:2s/张,EdgeBoxes:0.2s/张,也就是提高了十倍的速度,在区域质量和速度之间取得了比较好的平衡。
但是即使Fast R-CNN用EdgeBoxes产生区域推荐,这一步仍然和整个检测网络花费了一样的时间,能不能针对这点改进呢?