1.RCNN
(1)候选区域选择
https://blog.csdn.net/guoyunfei20/article/details/78723646
RegionProposal是一类传统的区域提取方法(selective search),可以看做不同宽高的滑动窗口(1-2k)个,通过窗口滑动获得潜在的目标图像。然后进行归一化,作为CNN的标准输入。
step0:生成区域集R
step1:计算区域集R里每个相邻区域的相似度S={s1,s2...}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:调至step2,直至S为空
(2)CNN特征提取(标准CNN过程,得到固定维度的输出)
对于每个区域,修正大小以适合CNN的输入,将第五个池化层的输出(对候选框提取到的特征)存到硬盘。
(3)分类与边界回归
实际包含两个子步骤,一是对上一步的输出进行分类(SVM),二是通过边界回归得到精确的目标区域。
问题:
(1)多个候选区域对应的图像需要预先提取,占用较大的磁盘空间;
(2)针对传统CNN需要固定尺寸的输入图像,crop/warp( 归一化)产生物体截断或拉伸,会导致输入CNN的信息丢失;
(3)每一个Proposal Region都需要进入CNN网络计算,上千个Region存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。
2.SPP网络
(1)为了解决RCNN中区域图片归一化的问题:
在RCNN中,候选区域需要经过变形缩放,以此适应CNN输入。CNN需要固定输入大小。卷积层和池化层的输出尺寸都是和输入尺寸相关的,它们的输入是不需要固定图片尺寸的,真正需要固定尺寸的是最后的全连接层。
由于FC层的存在,普通的CNN通过固定输入图片的大小来使得全连接层输入固定。既然卷积层可以适应任何尺寸,那么只需要在卷积层的最后加入某种结构,使得后面全连接层得到的输入为固定长度就可以了,这个结构就是spatial pyramid pooling layer。
在最后的卷积层和全连接层之间加入SPP层。具体做法是,在conv5层得到的特征图是256层,每层都做一次spatial pyramid pooling。先把每个特征图分割成多个不同尺寸的网格,比如网格分别是4*4,2*2,1*1,然后每个网格做max pooling,这样256层特征图就形成了16*256,4*256,1*256维特征,他们连起来就形成了一个固定长度的特征向量,将这个向量输入到后面的全连接层。
(2)检测:
对卷积层可视化发现:输入图片的某个位置的特征反应在特征图上也是在相同位置。基于这一事实,对某个ROI区域的特征提取只需要在特征图上的相应位置提取就可以了。
一张任意尺寸的图片,在最后的卷积层conv5可以得到特征图。根据Region proposal步骤可以得到很多候选区域,这个候选区域可以在特征图上找到相同位置对应的窗口,然后使用SPP,每个窗口都可以得到一个固定长度的输出。将这个输出输入到全连接层里面。这样,图片值只需要经过一次CNN,候选区域特征直接从整张图片特征图上提取。在训练这个特征提取网络的时候,使用分类任务得到的网络,固定全面的卷积层,只微调后面的全连接层。
在检测的后面模块,仍然和RCNN一样,使用SVM和边框回归。SVM的特征输入是FC层,边框回归特征使用SPP层。
SPP-net对R-CNN最大的改动就是特征提取步骤做了修改,其他模块仍然和RCNN一样。特征提取不再需要每个候选框都经过CNN,只需要将整张图输入到CNN就可以了,ROI特征直接从特征图获取。和RCNN相比,速度提高了百倍。
问题:
(1)和RCNN一样,训练过程仍然是隔离的,提取候选框,计算CNN特征,SVM分类,BoundingBox回归独立训练,大量的中间结果需要转存,无法整体训练参数。
(2)在整个过程中,Proposal Region仍然很耗时。
3.Fast RCNN
思路:
(1)生成region proposal(通过selective search),每张图片大约2000个候选框
(2)Fast-RCNN把整张图片送入CNN,进行特征提取
(3)Fast-RCNN把region proposal映射到CNN的最后一层卷积feature map上
(4)通过Rol pooling层(其实是单层的SPPlayer)使得每个建议窗口生成固定大小的featuremap
(5)继续经过两个全连接层(FC)得到特征向量,得到两个输出向量。第一个是分类,使用softmax(比SVM效果好),第二个是每一类的boundingbox回归。利用softmaxloss和smooth L1 Loss对分类和边框回归联合训练。
cls_score层用于分类,输出K+1维数组p,表示属于K类和背景的概率。
bbox_predict层用于调整候选区域位置,输出4×K维数组t,表示分别属于K类时,应该平移缩放的参数。
优点:
(1)平均准确率mAP高于R_CNN,SPPnet
(2) 训练可以更新所有网络层
(3) 不需要缓存特征
缺点:
(1)Fast-RCNN中采用selective search算法提取候选区域,而且目标检测大多数时间都消耗在这里了
(2)Fast-RCNN并没有实现真正意义上的端到端的训练模式。
4.Faster RCNN
RPN:RPN负责寻找proposal,Fast-RCNN负责对RPN的结果进一步优化。RPN可以找到图片中每个物体的种类和位置,如果更注重速度而不是精度的话完全可以只使用RPN。RPN是一个FCN,可以输入任意分辨率的图像,经过网络后就得到一个feature map
通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度,不同宽高),提取对应9个候选窗口(anchor)特征,用于目标分类和边框回归,与FastRCNN类似。
对RPN的改进:SSD。RPN对小物体检测效果很差,假设输入为512*512,经过网络后得到的feature map是32*32,那么feature map上的一个点就要负责周围至少是16*16的一个区域的特征表达,那么对于在原图上很小的物体它的特征就难以得到充分的表示,因此检测效果比较差,那么对于在原图上很小的物体它的特征就难以得到充分的表示,因此检测效果比较差。2016年的SSD允许从CNN各个level的featuremap预测检测结果,这样就能很好的适应不同scale的物体,对于小物体可以由更底层的feature map做预测。
小结:
4 YOLOV1
YOLO将输入图像分成S×S个格子,每个格子负责检测落入该格子的物体。若某个物体的中心位置的坐标落入到某个格子,那么这个格子就负责检测出这个物体。在训练和测试时,每个网络预测B个bounding boxes,每个bounding box 对应5个预测参数,即bounding box的中心点坐标(x,y),宽高(w,h),和置信度评分。这里的置信度评分(Pr(Object)*IOU(pred|truth))综合反反映当前模型bounding box内存在目标的可能性Pr(Object)和bounding box预测目标位置的准确性IOU。如果bounding box 内不存在物体,则Pr(Object)=0.
假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率Pr,每一个网格预测B个boundingbox的位置。即这B个boundingbox共享一套条件类概率Pr。
如果将输入图像划分为7*7网格(S=7),每个网格预测2个boundingbox,有20类待检测的目标,则相当于最终预测一个长度为S×S×(B×5+C)=7*7*30的向量,从而完成检测+识别任务。
5.YOLOv2
(1)CNN在训练过程中网络每层输入的分布一直在改变,会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。新的YOLO网络在每一个卷积层后添加batch normalization,通过这一方法,mAP获得了2%的提升。batch normalization也有助与规范化的模型,可以在舍弃dorpout优化后依然不会过拟合。
(2)high resolution classifier
目前的检测方法中,ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256*256,导致分辨率不高,给检测带来困难。为此,YOLO网络把分辨率提升到了448*448,,这也意味着原有的网络模型必须进行某种调整以适应新的分辨率输入。
(3)convolutional with anchor boxes
之前的YOLO利用全连接层的数据完成边框的预测,导致丢失较多的空间信息,定位不准。作者在这一版本中借鉴了Faster R-CNN中的anchor思想,