前言
先放出Ross大神的履历链接, 以此镇楼!祝愿各位读者能早发paper, 一切顺利,少有bug~~
2014 年R-CNN
单位署名还是 UC Berkeley
.
那个时候的作品还是从传统图像识别世界向深度学习转变的萌芽过程(毕竟AlexNet 夺冠时候才2012年)/带着明显的学术探究和实验氛围.(哇, 19页的paper写的是真的详细)
R-CNN
也还是并存着传统图像识别(SS/SVM
) + 深度学习分类(AlexNet
)的初步探索.
但是进入了2015年之后, Ross大神已经进入微软开始工作. 已经从开始的R-CNN
的处女秀, 到必须要在投入使用性(运行时间/ 精度 / 转化效率)等多方面进行进一步的发展了.
于是第二年有了Ross大神的的续作, Fast R-CNN
.
参见 [官方相关链接] Fast R-CNN
| [ICCV' 15
] | [pdf] | [official code - caffe] | [tutorial-slides] | [[fast-rcnn-slides]]
1 简介
建议在了解Fast R-CNN之前, 最好先了解一下其前身RCNN以便于有更深体会和了解.
参见 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表
1.1 摘要
这个也许就解释了名字的由来了, 为啥叫做Fast R-CNN
?
因为他真的快啊!
- backbone换成VGG16的话, 相比于
RCNN
训练时间提升9倍/测试时间提升213倍/并且精度还提升了, 相比于一些新的框架SPPNet
等,也是更快更准更强~~ - 并且采用了
caffe框架
和python
来实现,比较亲民了.毕竟正版的matlab
还是要收费的. - 单张图片的检测时间0.3s, PASCAL VOC 2012 mAP 提升到了66% (RCNN 最高是62%)
1.2 paper自述的主要贡献
看到了没, 更快更高更强更省空间!
以前RCNN
又是单独训练SVM
+ bounding box regression
, 又是fine-tuning AlexNet
的, 多个流程的训练往往是比较繁琐(先固定这个在训练那个, 然后固定那个在训练这个, 看看效果在反复一下)
现在把除了提取ROI的部分(SS method
), 其他全都是用深度学习的方式表示出来了(resize img -> back bone for feature map -> classfication + bounding box), (除了SS
)全部都变成single-stage
—一条流水线上的过程了!!
那深度学习的反向传播大法就有了大用场了!!他可以自动更新权重参数了!
2 Fast R-CNN网络结构
2.1 网络结构概览
为了方便表示和理解, 使用一张ross大神slides上的图来说明:
训练过程说明:
->输入一张大小固定
的图像(227 x 227)
-> 使用selective search
在原始图像上提取ROI区域 、将原始图像送入VGG16
主干网络提取整体的图像特征(feature map
)
-> 将ROI (即初始的目标的bounding box)映射到提取的图像特征中, 即在feature map 中找到对应的bounding box
-> 将bounding box
送入ROI pooling layer
提取成固定尺寸的图像特征
-> 送入FC layer
-> 使用softmax
进行分类计算,使用线性回归
拟合bounding box
-> 计算总的损失函数(分类、回归)、并使用SGD优化器
反向传播从而更新整个网络权重
PS: 再简化的流程图
2.2 提取img ROI候选框
提取初始的候选框的方法, 还是选择了selective search method
tips:
此处还是残留的一点传统图像处理的痕迹, 也是后续Faster R-CNN提升的关键点。
主体思想:
输入一张图片,首先通过图像分割的方法(大名鼎鼎的felzenszwalb算法)获得很多小的区域,然后对这些小的区域不断进行合并(通过相似性公式计算, 相邻区域相似度最高的合并),一直到无法合并为止。
此时这些原始的小区域和合并得到的区域的就是我们得到的bounding box.
具体可以参见
[论文解读] 图像分割 & 目标识别 | Selective Search和python实现| <Selective Search for Object Recognition>
2.3 获取feature map ROI
2.3.1 从整张图提取整体图像特征(feature map)
提取整体图像特征的话, 这次选择的back-bone的话有3个版本 。依据网络深度和参数数量,可以分为如下:
- S - 轻量级的网络,
CaffeNet (也就是AlexNet)
- M - 中量级级的网络,
VGG_CNN_M_1024
- L - 重量级的网络,
VGG16
在VOC上相关准确度也是逐渐上升的。
2.1的图中的ConvNet, 也就是Fast R-CNN
中采用了、用来提取整张图片的feature map的结构,是这些网络结构的卷基层(即在max pooling
之前的全部结构)。
为了方便了解, 我大致画了一下主干网络的网络结构图、标注了使用的结构:
VGG16
AlexNet
详细的结构层次, 可以参见ross大神
的caffe模型结构定义
2.3.1 从img ROI映射到feature map ROI
Fast R-CNN
相比与R-CNN
, 最大的时间节省在提取卷基层的时间。
因为 Selective Search
提取出来ROI的框后, R-CNN
是将这2k个框住的图片resize之后送入主干网络, 然后再每一个都提取feature map;
而 Fast R-CNN
是Selective Search
提取出来ROI的框后, 只提取了整张图的feature map
(只是提取了1张), 然后将img ROI
(bounding box)映射成为feature map ROI
(bounding box)!
所以, 所需时间是大大缩短了的!
当然这个映射的方法是参考了何恺明 - SPPNet
的影响的, 包括后面的ROI Pooling 也是。
SPP-net
是把img ROI
的左上角和右下角 映射到 feature map
上的两个对应点。 有了feature map
上的两对角点就确定了 对应的 feature map
区域(下图中橙色)。
tips:
Si -> 第i层的stride
⌊⌋ -> 地板函数,或取整函数,表示小于 x 的最大整数;
⌈⌉ -> 天花板函数,表示大于 x 的最小整数
当然, 这样img ROI
-> feature map ROI
的映射, 是一种近似,并不是100%完全一致。
2.4 ROI pooling
上面的过程, 提取feature map
、并且还映射img ROI
-> feature map ROI
了,但是这些feature map ROI
是大小各异的。所以, 提出了ROI Pooling
, 将这些图像特征的区域变成统一大小的feature vector
, 然后在送入后续的过程。
关于ROI Pooling, paper中是这样描述的:
我觉得可能还是动图比较有说服力:
关于 普通的 max pooling
vs roi max pooling
,可以参看一下这个 ROI Pooling和ROI Align
双线性插值(Bilinear Interpolation)
注意: roi max pooling的某一些元素,因为可能有多个ROI候选框重叠,多次计算,所以计算反向传播的时候,是各个求导累加的。
2.5 Truncated SVD for FC
2.5.1 什么要进行SVD?
提取了,固定大小的图像特征,之后就是经过Full Connected Layer
.
以VGG16
为例,他最后的FC6,FC7
,这2层在前向传播的时间就占据了快一半时间,可想而知如果想要提升检测速度,必须要对于FC Layer
进行优化。
进行SVD 与不进行SVD的前向传播时间对比:
哎哟,不错哦~~ 这时间降低了100ms,精度还没怎么下降,真是可以!
2.5.2 怎么进行SVD分解?
2.5.2 为什么会极大减少运行时间?
简单来说,就是将原来硕大的矩阵, 进行奇异值分解,变成3个稀疏矩阵相乘,这样运算量会大大减少。
举例来说:
以前W
维度是u * v;
现在进行SVD
分解, W
= U
* T
* V
, 其中维度 U
-> u * t, T
-> t * t, V
-> t * v, 当然 t 的维度会取得非常小。
这样, 以前的计算量是 u * v, 现在使用U
* T
* V
近似代替W
,那计算量是 u * t+t * v = t * (u+v), 当t非常小的时候,整体的计算量是会减少非常多的。
2.6 softmax & bbox regression
-
说明
在上一步feature map ROI
经过FC Layer
之后, 就形成了ROI feature vector
,之后就会经过一个兄弟fc层, 一个通过softmax
计算分类的概率, 另一个通过regressor
计算bounding box
. -
计算最终多任务总损失(分类损失+回归损失)
3 实验和评估
3.1 不同VOC数据的mAP表现
3.2 训练和预测时间对比
3.3 muti-task与否的对比
3.4 softmax 影响对比
Reference
- 1 【论文解读】深度学习目标检测的开山鼻祖 |R-CNN详解 | 两阶段目标检测代表
- 2 [官方相关链接]
Fast R-CNN
| [ICCV' 15
] | [pdf] | [official code - caffe] | [tutorial-slides] | [fast-rcnn-slides] - 3 [论文解读] 图像分割 & 目标识别 | Selective Search和python实现| <Selective Search for Object Recognition>
- 4 fast rcnn 参考1 | 参考2
- 5 caffesvd |svd加速全连接
- 6 SPPNet