前言
在RCNN提出后,马上又提出了fast-rcnn,主要是在RCNN的基础上对训练和测试速度进行了优化。
由于它和RCNN有许多共同之处,并且网上大多数的程序是基于caffe,cython等其他一些环境,单纯的tensorflow版本的比较少,所以对于fast-rcnn的程序,我就只做了粗略的阅读,没有调试,准备把主要的精力还是放在之后的faster-rcnn上,毕竟现在faster-rcnn刚出来不久,比fast-rcnn性能更强,研究的人更多,代码资源更丰富。
fast-rcnn详解
RCNN存在的问题
- 训练分多布。需要经过预训练网络、finetune微调、训练svm分类器、训练boudingbox回归4个步骤,比较繁琐。
- 内存资源消耗大。svm分类器训练和boundingbox回归训练之前,不要保存网络训练得到的特征向量。
- 时间消耗比较大,测试比较慢。每张图片的每个region proposal都要进行一次卷积,重复操作太多。
fast-rcnn的创新点
针对以上RCNN存在的问题,fast-rcnn提出了以下创新点:
- 对整张图片卷积,减少重复卷积。
- 采用roi-pooling,使得不同region proposal得到固定尺寸的特征
- 用softmax代替svm分类器,把softmax和boundingbox放入网络一起训练,使用多任务损失。
- 采用SVD分解改进全连接层。
网络架构
- 通过选择搜索(selective search)得到图像中roi列表,和图像列表一起作为输入,经过卷积神经网络得到整张图片的卷积特征图。
- 通过roipooling把其中的roi都变成尺寸固定的roi特征向量,经过两个全连接层,最后输出softmax分类预测和boundingbox回归预测。
训练过程
- 预训练卷积神经网络。在大数据集上预训练alexnet。
- 更新网络结构。在原先alexnet的基础上,把alexnet最后一个卷积层conv5后面的最大池化层用roi-pooling代替,最后一个全连接层fc8改成两个同级层(softmax和bbox)。
- 微调与训练。
(1)用预训练的alexnet网络结构参数来恢复新网络roi-pooling层之前的网络层参数。
(2)获得一个batch的训练数据(2张图,每张600个roi)。每个batch图的数量要较少,这样可以尽可能的共享内存和计算,减少重复卷积。
(3)根据多任务损失函数,训练roi-pooling层之后的网络参数。
测试过程
- 获得测试数据(images,roises,labels)
- 根据images和roises,经过网络,获得所有roi的分类和定位预测。
- 保存预测为某目标(非背景)的概率>0.5的roi。
- 对保存下来的roi进行非极大抑制。
参考
论文的翻译可以参考:
https://blog.youkuaiyun.com/ghw15221836342/article/details/79549500
算法的总结和解释,可以参考:
https://blog.youkuaiyun.com/u014380165/article/details/72851319
github项目参考:
https://github.com/Liu-Yicheng/Fast-RCNN