这几天学习了目标检测/R-CNN/SPP-Net/Fast R-CNN/Faster-R CNN这几个框架,
想做点笔记加深印象,如有理解错误,请指出,Thanks!
目标检测主要有两个任务:
故目标检测是一个定位 + 分类的任务,比图像分类更有难度。
传统的目标检测大体流程可以表示如下:
随着深度学习的兴起,以及CNN所表现出的强大的视觉处理性能,目标检测也有传统方法想深度学习方向进化。
1.首先是原图,然后在原图上使用一定的方法产生一些感兴趣的区域,也就是可能含有目标的区域(region proposals),有2k个左右。
其中R-CNN 产生region proposals 的方法是ss 方法,步骤如下:
(1)按照一定的规则生成区域集R
(2)计算区域集R中每个相邻区域的相似度S={s1, s2, …}
(3)找出相似度最高的两个区域,将其合并并添加进R
(4)从S中移除所有与3中有关的子集
(5)计算新集与所有子集的相似度
(6)跳至3,直至S为空。
(个人觉得这部分不重要,虽然这个算法会伴随着后面几个模型,自己也没太看懂。。。)
2.将产生的候选区域resize到一个固定大小。至于原因,是为了后面能输入固定尺寸的feature map给全连接层,这也是后面可以改进的一个地方。
3.将resize后的图像输入到一个CNN网络(这个网络可以是现成的模型,比如VGG、AlexNet,然后微调即可,原文使用的是AlexNet),CNN网络会提取出固定维度的特征向量(图片经过AlexNet,缩放比例是固定的,而输入图片大小也是固定的,所以输出当然也是固定的了。。刚好满足全连接层固定大小输入的需求。。)
4.再将提取到的特征输入给预先训练好的一组SVM分类器(一共有k个,k即是类别总数,每个都是二分类器),识别出区域中的目标是什么,随后做box regression,修正物体的box位置。
其中要注意用于分类和回归是两套不同的特征,分类的特征来源于fc7层,回归的特征来源于cov5层,这里的fc7层和cov5层都是AlexNet中的层。
给出R-CNN具体的结构如下图:
图中看出,选取2000个region proposals并warp/crop后,需要对每个region proposal 进行特征提取,这就需要2000次CNN,这是很耗费时间的(后面有改进)。
M - 在ImageNet上对CNN模型进行pre-train(比如AlexNet、VGG,现成的可以直接拿来用)
M’ - 在SS生成的所有区域对M进行fine-tune(目的是为了后面分类,使模型分类性能在该目标检测下有较好的泛化能力,毕竟AlexNet是现成训练好的,而这种在图片里面识别物体比较特殊,AlexNet对此不一定有很好的泛化能力,所以需要fine-tune)
fine-tune注意:
训练流程:
在M’的fc7特征上训练线性SVM分类器。
注意SVM的训练是单独的,需要先训练好CNN来提取特征,并作为SVM的输入。
CNN已经具备分类的能力,为什么还要用SVM:要重新构造数据集,单独来训练,同时还要用训练好的CNN来提取特征作为输入????
在M’的fc7特征上训练Bounding box回归模型
1、每个类别(N类)训练一个回归模型。
2、测试阶段
其中SPP层替代了cov5后的池化层。
为什么会得固定大小的输出?
注意我们上面曾提到使用多个窗口(pooling窗口,上图中蓝色,青绿,银灰的窗口, 然后对feature maps 进行pooling,将分别得到的结果进行合并就会得到固定长度的输出),这也相当于引入了多尺度特征,使融合后的特征信息更全面。
注意需要对~2000区域的feature map做SPP,一张图片经过Spp后就得到2000 * 固定尺寸的特征矩阵。图片conv5的feature map中的某个区域做SPP如下,跟上图差不多。。
在cov5 feature map上怎么找到原始图像中~2000区域的在feature map上的对应区域呢
对卷积层发现:输入图片的某个位置的特征反应在feature map上也是在相同位置,基于此,对于某个RIO区域的特征提取只需要在特征图上的相应位置提取就可以了。
SPP-Net的训练流程
这里要注意跟R-CNN的区别:
(1)SPP特征 - Pool5特征
(2)只fine-tune全连接层(为什么呢?R-CNN fine-tune所有层?)
继承R-CNN的问题:
带来新问题:
改进
从网络结构可以看出,网路有两个同级输出:分类和回归,这样举不需要分开训练分类器和回归器,但是也涉及到了多任务训练,两个任务需要共享输入和底层参数,在根据各自任务进行不同的输出。
网络的损失函数包含分类器损失和回归L1 loss。
就Fast R-CNN而言,RoI池化层后的全连接层需要进行约2k次,因此在Fast R-CNN中可以采用SVD分解加速全连接层的计算。
设全连接层输入是X,输出数据为Y,全连接层权值矩阵为W,尺寸为u * v,那么全连接层的计算为Y = W * X。
其中
SVD分解如下:
改进:
Faster R-CNN = Fast R-CNN + RPN
前面的Fast R-CNN的region proposals依然是SS算法产生的,跑在CPU上,消耗大量的时间。故Faster R-CNN使用神经网络的方式生成region proposals,使其都能能跑在GPU上。Faster R-CNN引入RPN网络产生region proposals。
Faster R-CNN的结构图如下:
红色框部分是RPN网络。
Region Proposal Network(RPN)网络
Anchor box
Anchor box 类型 k = 9
包含:
Faster R-CNN的训练流程
参考:
https://www.zhihu.com/people/lhc-90-53/posts
https://zhuanlan.zhihu.com/qianxiaosi
https://zhuanlan.zhihu.com/p/30720870
https://zhuanlan.zhihu.com/p/30368989
https://blog.csdn.net/v1_vivian/article/details/73275259
https://blog.csdn.net/xjz18298268521/article/details/52681966
https://zhuanlan.zhihu.com/p/30316608