经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等

  本博客针对目标检测方面的经典论文,参考现有博客等资料和自己的感想,进行一点总结,方便自己以后看笔记。
  首先要明确以下几个术语,方面我们理解:IoU、NMS、One-Stage、Two-Stage

IoU是什么?

  如下图所示,IoU即表示(A∩B)/(A∪B),交并比(可以理解为目标框和锚框的重合度)
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第1张图片

NMS是什么?

  NMS是非极大值抑制,为了减少选框(region proposals)的数量。例如一个物体可能有多个选框,但是我们需要一个物体只有一个最优框,于是使用NMS来抑制冗余的框。
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第2张图片
  举一个例子:某个物体最终得到了A,B,C,D,E,F六个框,按照打分从高到低刚好也是A,B,C,D,E,F。挑选出得分最高的A,然后遍历剩下的候选集,依次计算相对于A的IOU,如果IOU>阈值,则抛弃对应的框(例如:IOU(A,B)>阈值,则抛弃B),否则放回候选集。遍历完后,如果候选集还有元素且元素个数大于1,继续挑选出候选集中得分最高的(例如上一轮只抛弃了B,候选集中是C,D,E,F,那么现在得分最高的的是C),然后遍历候选集,再依次计算(同上),知道候选集中没有元素,或者只剩一个元素。那么留下的就是最优的框。(直观上理解还是会有多个框,我的理解是IOU>阈值就抛弃,杜绝了在同一个区域内重复出现多个框,但是一幅图中可能有多个同类型的目标,例如上图就有两张脸,剩下的多个框一定程度上是标注的多个目标)

One-Stage、Two-Stage 是什么

经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第3张图片
  One-Stage比Two-Stage少了一步候选框选取(即少了一个RPN网络,Region Proposals Networks),RPN网络的作用主要是判断当前锚框是前景还是背景。少了一个RPN网络,肯定运算速度变快了,但是由于缺少对前景、背景的判断,导致样本中负例太多了,因此准确度会有所下降。如下图所示,其实只是少了一个RPN网络相关东西。可参考https://blog.csdn.net/JNingWei/article/details/80039079
https://blog.csdn.net/weixin_55775980/article/details/116055272
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第4张图片
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第5张图片

R-CNN

经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第6张图片

R-CNN是目标检测的开山之作,将CNN、深度学习引入了目标检测中。它的流程如下:

  • 首先是原在原图上使用一定的方法产生一些感兴趣的区域(Selective Search算法,选择性搜索),也就是可能含有目标的区域(region proposals),然后将这些目标区域保存到本地磁盘;
  • 将产生的候选区域resize到一个固定大小(因为神经网络的输入是固定的,其实卷积操作的输入可以不固定,全连接层的输入大小才是固定的,这也是后面几个模型会改进的);
  • 将resize后的图像输入到一个CNN网络(这个网络可以是现成的模型,backbone,然后微调即可)提取出固定维度的特征向量(原文中使用了AlexNet);
  • 再将提取到的特征输入给预先训练好的一组SVM分类器(训练SVM来对目标和背景进行分类,一共有k个,k即是类别总数,每个都是二分类器),识别出区域中的目标是什么(同时也就大致定位了目标的位置,后面的内容会对该位置精修,使其更准确),结合NMS算法去除一些目标框;
  • 边界框回归(Bounding boxes Regression)。训练将输出一些校正因子的线性回归分类器(用20个回归器对上述20个类别中剩余的建议框进行回归操作)。

R-CNN的不足:

  • 重复计算。通过selective search 提取近2000左右的候选框,即今2000个ROI,R-CNN对每个ROI,都跑一遍CNN,计算量很大,而且其实这些ROI之间是有overlap,显然有大量计算是重复的。(所以SPP-Net和Fast-RCNN对其进行改进)
  • multiple-stage pipeline:训练分为多个阶段,region proposals、ConvNet、SVM、BB Regression。(这已经不是二阶段了,而是多阶段)
  • 训练耗时,占有磁盘空间大。卷积出来的特征数据还要保持至本地磁盘。

参考链接:https://zhuanlan.zhihu.com/p/38946391

Fast R-CNN

经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第7张图片
  在Fast R-CNN中,CNN的输入不是来自图像的候选(Region Proposals)区域,而是来自(完整的)实际图像本身;输出不是最后一个扁平层,而是之前的卷积(映射)层。如此生成的卷积映射,使用RoI Pooling (RoI=Regions of interests)来生成对应于每个候选区域的扁平固定长度的Rol,然后传递给一些全连接(FC)层。
  ROI pooling:ROI Pooling的作用是对不同大小的region proposal,从最后卷积层输出的feature map提取大小固定的feature map。简单讲可以看做是SPPNet的简化版本,因为全连接层的输入需要尺寸大小一样,所以不能直接将不同大小的region proposal映射到feature map作为输出,需要做尺寸变换。
  因此可以看出Fast RCNN主要有3个改进:

  • 卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。现在是对一整张图做计算,然后因为SS算法选择出了2000个候选框,根据比例,将候选框的比例映射在卷积层上,然后将卷积层上的比例拿出来,就得到一个比例一致的小卷积(小候选框),因为小候选框的尺寸不一致,没法直接输入FC中,因此执行第二步,如下
  • 用ROI pooling进行特征的尺寸变换(ROI pooling见上面的解释),因为全连接层的输入要求尺寸大小一样,因此不能直接把region proposal作为输入。Fast RCNN在数据的输入上并不对其有什么限制,而实现这一没有限制的关键所在正是ROI Pooling层
  • 将regressor放进网络一起训练,每个类别对应一个regressor,同时用softmax代替原来的SVM分类器。
    经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第8张图片
      注意:在训练数据采样(正负样本)中,对于每个图片根据IOU>=0.5来挑选64个预测框,训练时候不需要NMS了;在测试时最后对每个类别用NMS。
      Fast RCNN将RCNN众多步骤整合在一起,不仅大大提高了检测速度,也提高了检测准确率。其中,对整张图像卷积而不是对每个region proposal卷积,ROI Pooling,分类和回归都放在网络一起训练的multi-task loss是算法的三个核心。
      当然Fast RCNN的主要缺点在于region proposal的提取使用selective search,目标检测时间大多消耗在这上面(提region proposal 2~3s,而提特征分类只需0.32s),这也是后续Faster RCNN的改进方向之一。

Faster R-CNN

  Faster R-CNN主要引进了一个RPN网络,代替了前者(Rcnn 和 Fast Rcnn)的SS选择性搜索算法。主要步骤如下:

  • Conv layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的conv+relu+pooling层提取image的feature maps。该feature maps被共享用于后续RPN层和全连接层。
  • Region Proposal Networks。RPN网络用于生成region proposals。该层通过softmax判断anchors属于positive或者negative,再利用bounding box regression修正anchors获得精确的proposals。
  • Roi Pooling。该层收集输入的feature maps和proposals,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  • Classification。利用proposal feature maps计算proposal的类别,同时再次bounding box regression获得检测框最终的精确位置。

  主要是第二步不太一样,其他步骤都差不多。Faster RCNN抛弃了传统的滑动窗口和SS方法,直接使用RPN生成检测框,这也是Faster R-CNN的巨大优势,能极大提升检测框的生成速度。
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第9张图片
  如上图,可以看到RPN网络实际分为2条线,上面一条通过softmax分类anchors获得positive和negative分类(softmax判定positive与negative,背景与前景),下面一条用于计算对于anchors的bounding box regression偏移量,以获得精确的proposal。而最后的Proposal层则负责综合positive anchors和对应bounding box regression偏移量获取proposals,同时剔除太小和超出边界的proposals。其实整个网络到了Proposal Layer这里,就完成了相当于目标定位的功能。

  提到Faster R-CNN,就不得不提到Anchor,其实RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor(原论文中设置了9个anchors)。然后用cnn/softmax去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor,所以,仅仅是个二分类而已!

   anchors英文翻译为锚点、锚框,是用于在feature maps的像素点上产生一系列的框,各个框的大小由scale和ratio这两个参数来确定的,比如scale =[128],ratio=[0.5,1,1.5] ,则每个像素点可以产生3个不同大小的框。这个三个框是由保持框的面积不变,来通过ratio的值来改变其长宽比,从而产生不同大小的框。

经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第10张图片
可以参考该知乎博客:https://zhuanlan.zhihu.com/p/31426458

Mask R-CNN

  Mask R-CNN 是凯明大神提出的,主要用于“目标检测”、“目标实例分割”、“目标关键点检测”等。
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第11张图片
  整个Mask R-CNN算法的思路很简单,就是在原始Faster-rcnn算法的基础上面增加了FCN (Fully conv networks,用于语义分割的经典算法)来产生对应的MASK分支。即Faster-rcnn + FCN,更细致的是 RPN + ROIAlign + Fast-rcnn + FCN。Mask R-CNN算法步骤:

  • 首先,输入一幅你想处理的图片,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;
  • 接着,对这个feature map中的每一点设定预定个ROI,从而获得多个候选ROI;
  • 接着,将这些候选的ROI送入RPN网络进行二值分类(前景或背景)和BB回归,过滤掉一部分候选的ROI;
  • 接着,对这些剩下的ROI进行ROIAlign操作(即先将原图和feature map的pixel对应起来,然后将feature map和固定的feature对应起来);
  • 最后,对这些ROI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。

  其实只有第四步和第五步不同。
  将ROI Pooling 替换成了ROI Ailgn而已。因为ROI Pooling 是量化操作,四舍五入的那种,在目标检测中没有影响,但是在实例分割中影响很大,具体解释可以参考https://blog.csdn.net/WZZ18191171661/article/details/79453780
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第12张图片
  最后再加一个Mask branch分支。
  Mask R-CNN可参考https://blog.csdn.net/remanented/article/details/79564045

YOLO V1

  YOLO是One-Stage算法,去掉了RPN网络,即去掉了前景和背景的分类层,速度变快了,但是负样本增多了。

  • YOLO首先将图像分为S×S的格子。如果一个目标的中心落入格子,该格子就负责检测该目标。每一个网格中预测B个Bounding box 和置信值(confidence score)。这些置信度分数反映了该模型对盒子是否包含目标的信心,以及它预测盒子的准确程度。如果没有目标,置信值为零。另外,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU)。
  • 每一个bounding box包含5个值:x,y,w,h和confidence。(x,y)坐标表示边界框相对于网格单元边界框的中心。宽度和高度是相对于整张图像预测的。confidence表示预测的box与实际边界框之间的IOU。每个网格单元还预测C个条件类别概率,在PASCAL VOC数据集上评价时,我们采用S=7,B=2,C=20(该数据集包含20个类别),最终预测结果为7×7×30(B*5+C)的tensor。
  • 这样,我们的系统将检测建模为回归问题。它将图像分成SxS的网络,并且每个网格单元预测B个边界框,这些边界框的置信度以及C个类别概率,这些预测被编码为SxSx(B*5+C)的张量。
  • 训练的时候:输入N个图像,每个图像包含M个objec,每个object包含4个坐标(x,y,w,h)和1个label。然后通过网络得到7730大小的三维矩阵。每个1*30的向量前5个元素表示第一个bounding box的4个坐标和1个confidence,第6到10元素表示第二个bounding box的4个坐标和1个confidence。最后20个表示这个grid cell所属类别。注意这30个都是预测的结果。然后就可以计算损失函数,真实的confidence是0或1值,即有object则为1,没有object则为0。

  结合下面这张图,就比较好理解了
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第13张图片
  YOLO算法的缺点:
1、位置精确性差,且对于小目标物体以及物体比较密集的也检测不好,比如一群小鸟(因为它是划分网格的嘛,划分为7*7)。
2、YOLO虽然可以降低将背景检测为物体的概率,但同时导致召回率较低(这就是没有RPN网络的缺点了,背景图太多了)。

参考链接:
https://blog.csdn.net/xiaohu2022/article/details/79211732
https://blog.csdn.net/u014380165/article/details/72616238
https://www.cnblogs.com/smiorboy/p/11880903.html

SSD

   SSD网络是继YOLO之后的one-stage目标检测网络,是为了改善YOLO网络设置的anchor设计的太过于粗糙而提出的,其设计思想主要是多尺度多长宽比的密集锚点设计和特征金字塔(Pyramidal Feature Hierarchy),对小目标的检测有较好的效果。先看SSD的网络结构:
经典论文阅读笔记——R-CNN、Fsst R-CNN、Faster R-CNN、Mask R-CNN、YOLO、SSD 等_第14张图片

  • 输入一幅图片,让图片经过卷积神经网络(CNN)提取特征,并生成 feature map;
  • 抽取其中六层的feature map,然后再 feature map 的每个点上生成 default box(各层的个数不同,但每个点都有);
  • 将不同feature map获得的BB结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的BB,生成最终的BB集合(即检测结果)

Defalut box生成规则:
   为提高目标的识别准确度,该网络预设了多种尺度的目标检测框(Defalut box),每个目标检测框获得的feature map通过softmax分类+bounding box regression获得真实目标的位置。Defalut box是以feature map上每个点的中点为中心(offset=0.5),生成一系列同心的Defalut box(然后中心点的坐标会乘以step,相当于从feature map位置映射回原图位置),使用m(SSD300中m=6)个不同大小的feature map 来做预测,最底层的 feature map 的 scale 值为 Smin=0.2,最高层的为Smax=0.95,其它层有公式计算。

LOSS:
   最后,将经过NMS后的BB,计算相应的default box与目标类别的confidence loss以及相应的位置回归。
Hard Negative Mining技术:
   一般情况下negative default boxes数量是远大于positive default boxes数量,如果随机选取样本训练会导致网络过于重视负样本(因为抽取到负样本的概率值更大一些),这会使得loss不稳定。因此需要平衡正负样本的个数,我们常用的方法就是Hard Ngative Mining,即依据confidience score对default box进行排序,挑选其中confidience高的box进行训练,将正负样本的比例控制在positive:negative=1:3,这样会取得更好的效果。如果我们不加控制的话,很可能会出现Sample到的所有样本都是负样本(即让网络从这些负样本中找正确目标,这显然是不可以的),这样就会使得网络的性能变差。

参考博客:
https://www.cnblogs.com/MY0213/p/9858383.html
https://blog.csdn.net/qq_42732137/article/details/106120464
https://blog.csdn.net/weixin_39749553/article/details/88086486

你可能感兴趣的:(深度学习,深度学习)