当前位置:   article > 正文

经典目标检测算法详解(R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN、YOLO、SSD)_目标分类算法结构

目标分类算法结构

1 目标检测算法分类

两步走的目标检测:先进行区域推荐,而后进行目标分类
代表:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN
端到端的目标检测:采用一个网络一步到位
代表:YOLO、SSD
在这里插入图片描述

2 目标检测的过渡——定位+分类

  • 定位+分类:图片当中仅有一个目标,检测出 该目标所处位置 及 该目标的类别
  • 定位+分类的实现思路:
    (1)训练 / 下载一个分类模型,例如,AlexNet、VGGNet、ResNet等;
    (2)在原分类网络最后一个卷积层之后,添加 “regression head”
    (3)同时训练原有的 “classification head” (用于分类,分类问题)和 “regression head” (用于定位,回归问题),最终损失函数是分类和定位各自损失的加权和;
    (4)预测时,同时使用分类和回归“head”,得到分类+定位的结果。这里需要强调一下的是,分类预测的结果 就是C个类别的概率;回归预测的结果 有两种可能: 类别无关,输出4个值, 类别相关,输出4*C个值。
  • 假设有10个类别,输出[p1,p2,p3,…,p10],然后输出这一个对象的四个位置信息[x,y,w,h]。同理知道要网络输出什么,如果衡量整个网络的损失
    对于分类的概率,还是使用交叉熵损失
    位置信息具体的数值,可使用MSE均方误差损失(L2损失)
    在这里插入图片描述

3 R-CNN

Ross Girshick在2014年计算机视觉和模式识别大会(CVPR,Computer Vision and Pattern Recognition)中提出R-CNN。

3.1 R-CNN训练过程

(1)选取 正负样本

  • 每张训练图片,采用SS方法来获取2000个ROI(候选区域)。
  • 在所有训练图片的所有候选区域中选取正负样本,正负样本的筛选方法如下:
正样本候选区域和该图片中所有真实矩形框的交并比, I O U ≥ 0.5 IOU\geq 0.5 IOU0.5,则该候选区域作为这个真实矩形框内物体类别的正样本
负样本候选区域和该图片中所有真实矩形框的交并比, I O U < 0.5 IOU<0.5 IOU<0.5,则该候选区域作为这个真实矩形框内物体类别的负样本
  • 这样得出若干个候选区域以及对应的类别标记,不是所有的候选区域都会拿去训练,保证正负样本比例 1 : 3 1:3 1:3
  • 得到的正负样本进行图像尺寸变换,使得大小一致(为了适应AlexNet网络的输入图像的大小227×227)

(2)选取 预训练模型:R-CNN采用AlexNet来学习特征,包含5个卷积层和3个全连接层(可直接下载预训练模型AlexNet)

(3)训练 特征提取器(对AlexNet模型进行微调)

  • AlexNet模型:卷积部分可以作为一个好的特征提取器,后面的全连接层可以理解为一个好的分类器
  • 需要在AlexNet模型上微调卷积参数:修改全连接最后一层,1000个类别输出,改为C+1个类别输出(其中C是真实需要预测的类别个数,1是背景类),利用(1)步中准备的正负样本进行AlexNet微调(迁移学习)。

(4)训练 SVM分类器

  • SVM模型的输入:将AlexNet微调模型第五个池化层的输出(即候选区域提取到的特征向量,维度 2000 ∗ 4096 2000*4096 20004096存到硬盘,其作为输入进行SVM分类器训练。(R-CNN当中默认CNN层输出4096特征向量)
  • 针对每个类别训练一个SVM的二分类器,举例:猫的SVM分类器,输入维度是 2000 ∗ 4096 2000*4096 20004096,目标还是之前第一步标记是否属于该类别猫
  • 训练结果:得到SVM的权重矩阵 W,W的维度是 4096 ∗ 20 4096*20 409620(20个SVM分类器)。

(5)训练 候选框回归器

  • 训练样本:与ground truth的IOU超过某个阈值 而且 IOU最大的region proposal,其余的region proposal不参与,目标即为ground truth(真实矩形框)
  • 需要训练N个候选框回归器,N为类别数

3.2 R-CNN预测过程

(1)获取候选区域ROI: 输入一张图像,利用SS方法得到2000个ROI;

(2)特征提取: 所有ROI变换到固定尺寸227×227,作为特征提取器(AlexNet微调)的输入,进行特征提取,得到的 2000 ∗ 4096 2000*4096 20004096维特征向量;

(3)用svm分类器对ROI进行类别预测: SVM的权重矩阵是4096*N,N是类别数/SVM分类器个数,这里一共有20个SVM, 得分矩阵 2000 ∗ 20 2000*20 200020,进而得到每个ROI预测的类别;

(4)采用非最大抑制方法NMS,过滤ROI

(5)微调ROI的位置:使用回归器,对第(4)步得分最高的ROI,进行位置修正。

3.3 R-CNN知识点汇总

3.3.1 选择性搜索(SS,selective search)
  • 侯选区域ROIbounding box /// regions of interest /// region proposal /// anchor /// default boxes ):即可能存在目标物体的区域
  • 原理: 利用图像中的纹理、边缘、颜色等信息,可以保证在选取较少ROI(几千甚至几百)的情况下保持较高的召回率(Recall)
  • 实现: 首先将每个像素作为一组,然后,计算每一组的纹理,并将两个最接近的组结合起来。为了避免单个区域吞噬其他区域,需要先对较小的组进行分组。
    ss
3.3.2 交并比(IOU,Intersection Over Union)

两个区域的重叠程度评价指标:交并比IoU值
在这里插入图片描述

3.3.3 Crop+Warp候选框缩放

经典的CNN网络限制了输入必须固定大小,所以在实际使用中往往需要对原候选框(ROI)进行crop或者warp的操作,来保证输入大小一致。

  • crop:截取ROI的一个固定大小的patch,物体可能会被截断,尤其是长宽比大的图片
  • warp:缩放ROI到一个固定大小的patch,物体可能会被拉伸,失去“原形”,尤其是长宽比大的图片

无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。一般会使用一些方法尽量让图片保持最小的变形,方法如下:
(1)各向异性缩放(不使用):即直接缩放到指定大小,这可能会造成不必要的图像失真
(2)各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色
Crop+Warp

3.3.4 非最大值抑制(NMS,non-maximum suppression)(预测过程才会用)
  • 目的:对最终所有的候选区域得分,进行筛选,得到最终候选区域结果
  • 迭代过程:
    假设现在滑动窗口有:A、B、C、D、E 5个候选框,
    1. 第一轮:假设B是得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,剔除DE,B作为一个预测结果
    2. 第二轮:AC中,A的得分最高,与A计算IoU,C的结果>0.5,剔除C,A作为一个结果
    3. 最终结果为在这个5个中检测出了两个目标为A和B
      NMS

3.4 附:R-CNN训练流程图

在这里插入图片描述
在这里插入图片描述

3.5 R-CNN模型 总结

  • 表现: 在VOC2007数据集上的平均精度mAP达到66%(mAP,mean Average Precision, 就是所有类别AP的平均值)
  • R-CNN模型 存在的问题
    (1)训练阶段多: 微调网络(获取特征提取器)+训练SVM+训练边框回归器;
    (2)训练各个阶段是分裂的: SVMs分类器和回归器的训练,无法更新特征提取器的权重。特征提取器通过Softmax分类获得;最终的分类结果有SVMs获得;矩形框的位置则是通过回归方式获得;
    (3)训练占用磁盘空间大: 5000张图像产生几百G的特征文件;(VOC数据集的检测结果,因为SVM的存在)
    (4)训练耗时: 不论是训练还是预测,都需要对SS出来的2000个ROI全部通过CNN的Forward过程来获取特征,这个过程非常耗时;
    (5)预测速度慢: 使用GPU的情况下, 基于VGG16的R-CNN模型预测一张图片需要47s;
    (6)图片形状变化: 候选区域要经过crop/warp进行固定大小,无法保证图片不变形

4 SPPNet

SPPNet主要的两点改进:

(1)减少卷积计算——候选区域映射

  • 把原图直接通过CNN网络Forward过程,得到整张图片的feature map,用SS方法在原图得到的候选区域,直接映射到整张图片的feature map 中对应的位置 。

(2)防止图片内容变形——提出了SPP层

  • 候选区域映射过来的特征向量,经过SPP层(空间金字塔变换层),输出固定大小的特征向量给FC层

4.1 候选区域映射

原图经过CNN变成了feature map,原图通过SS得到了候选区域。基于原图的候选区域映射到feature map中,映射过程图参考如下:
在这里插入图片描述
整个映射过程有具体的公式,如下
假设坐标点 ( x , y ) (x,y) (x,y)表示原图上的点, ( x ′ , y ′ ) (x′,y′) (x,y)表示特征图上的坐标点,那么它们之间有如下转换关系,这种映射关心与网络结构有关: ( x , y ) = ( S ∗ x ′ , S ∗ y ′ ) (x,y)=(S∗x′,S∗y′) (x,y)=(Sx,Sy),即

  • 左上角的点: x ′ = [ x / S ] + 1 , y ′ = [ y / S ] + 1 x′=[x/S] +1,y′=[y/S]+1 x=[x/S]+1y=[y/S]+1
  • 右下角的点: x ′ = [ x / S ] − 1 , y ′ = [ y / S ] − 1 x′=[x/S] -1,y′=[y/S]-1 x=[x/S]1y=[y/S]1
  • 其中 S S S 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为2x2x2x2=16
    拓展:如果关注这个公式怎么计算出来,请参考:原论文

4.2 空间金字塔变换层(SPP,Spatial Pyramid Pooling)

  • 通过SPP层将任意大小的候选区域特征图转换成固定大小的特征向量
  • 示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。接着在这个特征图中找到每一个候选区域映射的区域,SPP层会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如下图:
    在这里插入图片描述

4.3 SPPNet总结

  • SPPNet与R-CNN对比
    在这里插入图片描述
  • SPPNet的完整结构
    在这里插入图片描述
  • SPPNet优点
    SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间, 后面的Fast R-CNN等也是受SPPNet的启发
  • SPPNet缺点
    (1)训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)
    (2)分阶段训练网络: 选取候选区域、训练CNN、训练SVM、训练候选框回归器,SVMs分类器和回归器的训练无法更新SPP-Layer前面的Conv层权重参数。

5 Fast R-CNN

  • Fast R-CNN的改进:
    (1)提出RoI pooling(替代了SPPNet的SPP层)
    (2)使用了Softmax分类器(废弃了SPPNet的SVM分类器)
    (3)整合整个模型,把CNN、RoI pooling层、Softmax分类器、bbox回归器几个模块合并一起训练

5.1 RoI pooling

  • RoI pooling只是一个简单版本的SPP层目的为了减少计算时间 并且 得出固定长度的特征向量
  • RoI pooling的实现 使用max pooling将任何有效的RoI区域内的特征转换成具有 H × W H×W H×W 的固定空间范围的小feature map,其中 H H H W W W 是超参数,它们独立于任何特定的RoI。

例: VGG16 的第一个 FC 层的输入是 7 x 7 x 512,其中 512 表示 feature map 的层数。在经过 pooling 操作后,其特征输出维度满足 H x W。假设输出的结果与FC层要求大小不一致,对原本 max pooling 的单位网格进行调整,使得 pooling 的每个网格大小动态调整为 h/H,w/W, 最终得到的特征维度都是 HxWxD。
(它要求RoI Pooling 后的特征为 7 x 7 x512,如果碰巧 ROI 区域只有 6 x 6 大小怎么办?每个网格的大小取 6/7=0.85 , 6/7=0.85,以长宽为例,按照这样的间隔取网格:[0,0.85,1.7,2.55,3.4,4.25,5.1,5.95],四舍五入取整后,每个网格对应的起始坐标为:[0,1,2,3,3,4,5])

  • 为什么要设计单个尺度呢?这要涉及到single scale与multi scale两者的优缺点
    (1)single scale,直接将image定为某一种scale,直接输入网络来训练即可。(Fast R-CNN)
    (2)multi scale,也就是要生成一个金字塔,然后对于object,在金字塔上找到一个大小比较接近227x227的投影版本(SPPNet)
    (3)对比:后者比前者更加准确些,优势并不明显,但前者要省很多时间,所以实际采用的是前者,因此Fast R-CNN要比SPPNet快很多。
    在这里插入图片描述
    在这里插入图片描述

5.2 多任务损失(Multi-task loss)

  • 为什么 SS后面 的整个网络,能进行统一多任务损失训练?
    (1)在SPPNet网络中,特征提取器和SVMs分类器的训练,在时间上是先后顺序,两者的训练方式独立,而且SVM分类训练特征存储在磁盘当中,因此SVMs的训练无法更新SPP-Layer之前的卷积层参数。
    (2)Fast R-CNN中废弃了SPPNet的SVM分类器,使用了softmax分类,所有特征都存储在内存中,不占用磁盘空间,而且RoI pooling能进行反向传播,SPP层不适合,形成了一个End-to-End模型的雏形(SS方法获取ROI除外)
  • 多任务损失
    (1)softmax分类器:N+1类别的softmax输出,使用交叉熵损失
    (2)线性回归器:输出4xN的回归器,即对每个类别都会训练一个单独的regressor的意思,使用平均绝对误差(MAE)损失(即L1损失)
    (3)多任务损失训练:CNN + RoI pooling + softmax + bbox regressor合并损失训练

5.3 Fast R-CNN总结

  • 缺点:使用Selective Search提取Region Proposals,没有实现真正意义上的端对端(End-to-End),SS操作也十分耗时。
  • Fast R-CNN网络结构图
    在这里插入图片描述
    在这里插入图片描述

6 Faster R-CNN

Faster R-CNN的改进:区域生成网络RPN 来代替Fast R-CNN中的选择性搜索方法获取候选区域ROI。(SS方法比较耗时)

6.1 Faster R-CNN训练过程

(1)首先向CNN网络(VGG-16)输入任意大小图片
(2)Faster RCNN使用一组基础的conv+relu+pooling层提取feature map。该feature map被共享用于后续RPN层和全连接层。
(3)RPN网络用于生成region proposals。该层通过softmax判断anchors属于foreground或者background,再利用bounding box regression修正anchors获得精确的proposals,输出其Top-N(默认为300)的区域给RoI pooling
生成anchors -> softmax分类器提取foreground anchors -> bbox reg回归foreground anchors -> Proposal Layer生成proposals

(4)第2步得到的高维特征图和第3步输出的区域建合并输入RoI池化层(类), 该输出到全连接层判定目标类别。
(5)利用proposal feature maps计算每个proposal的不同类别概率,同时bounding box regression获得检测框最终的精确位置

6.2 区域生成网络(RPN,Region Proposal Network)

RPN网络的主要作用是得出比较准确的候选区域。整个过程分为两步
(1)生成anchors

  • 用n×n(默认3×3)卷积核对 共享feature map 做卷积运算,相当于每个点又融合了周围3x3的空间信息(猜测这样做也许更鲁棒?反正我没测试)
  • 接下来在feature map每个像素位置考虑k(3x3=9)种可能的参考窗口(论文中称为anchors),anchors的中心点对应每个像素位置,对应着在原图中框出多尺度、多种长宽比的anchors(三种尺度{ 128,256,512 }, 三种长宽比{1:1,1:2,2:1})。
    在这里插入图片描述

(2)RPN网络的训练——用于筛选出精确的anchors

  • 选取anchors正负样本:
    IoU大于0.7标记为正样本;
    IoU小于0.3标记为负样本;
    剩下的样本全部忽略;
    正负样本比例为 1 : 3 1:3 1:3
  • 训练损失: 同时最小化两种代价
    RPN classification (anchor fg / bg) ,二分类,是否有物体,是、否
    RPN regression (anchor -> proposal) ,回归微调候选区域
  • RPN网络训练的作用: 为了让得出来的 正确的候选区域, 并且候选区域经过了回归微调。

6.3 Faster R-CNN总结

  • 从R-CNN到Faster R-CNN,有一个共同的思路:先生成候选区域,然后进行图像检测,两个步骤,这样可以得到相对较好的精度,但缺点是速度较慢。
    在这里插入图片描述
    | 参数 | R-CNN | SPPNet | Fast R-CNN|Faster R-CNN|
    |–|--|–|--|–|
    | 训练时间(h) | 84 |25 |9.5/8.75 |
    | 测试时间(s) | 49 / 47 | 2.3| 2.3 / 0.32 | 0.2|
    | mAP (VOC2007)| 66.0 |63.1 | 66.9 |66.9 |
    在这里插入图片描述
  • 缺点: 训练参数过大,对于真实训练使用来说还是依然过于耗时
  • 可以改进的需求: 改进RPN,对于小目标选择利用多尺度(更多种类的anchor)特征信息进行RPN
  • 速度提升方法: 如YOLO系列算法,删去了RPN,直接对proposal进行分类和回归,极大的提升了网络的速度

7 YOLO(You Only Look Once)

  • 在R-CNN系列算法中,需要先获取大量的ROI,但是ROI之间又有很大的重叠,会带来很多重复的工作。YOLO一改基于ROI的预测思路,将输入图片划分为SxS个单元格,在每个单元格中做预测,最终将结果合并。
    在这里插入图片描述

7.1 网格(grid cell)输出筛选

  • 最后网络输出的 7x7x30 的特征图可以理解成49个网格,每个网格可以代表原图的一个方块。
  • 其中30=4+1+4+1+20,2个bbox(每个bbox预测4个坐标信息,1个置信度), 20代表置信度大的那个bbox的20个类别的预测概率(在训练时每个网格只有一个bbox专门负责(一个Bbox 一个Object ))
  • 输出位置结果理解
    其中(x,y,w,h):以 x,y 为中心相对于单元格的offset,以 w,h 为bbox的宽高相对整张图片的占比
  • 置信度confidence
    每个bbox都对应一个confidence score,如果grid cell里面没有object,confidence就是0;如果有,则confidence score等于预测的bbox和ground truth的IOU值
  • 如何理解类别概率?
    这个概率可以理解为不属于任何一个bbox,而是属于这个单元格所预测的类别。
    在这里插入图片描述

7.2 YOLO总结

  • 损失: 三部分损失 bbox损失+confidence损失+classfication损失
    在这里插入图片描述
  • 缺点: 准确率会打折扣。YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框
  • 与Faster R-CNN比较
    Faster R-CNN利用RPN网络与真实值调整了候选区域,然后再进行候选区域和卷积特征结果映射的特征向量的处理来通过与真实值优化网络预测结果。而这两步在YOLO当中合并成了一个步骤,直接网络输出预测结果进行优化。所以经常也会称之为YOLO算法为 直接回归法 代表。YOLO的特点就是快
    在这里插入图片描述

8 SSD(Single Shot MultiBox Detector)

  • SSD算法源于2016年发表的算法论文:论文网址。SSD结合了YOLO中的 回归思想 和Faster-RCNN中的 anchor机制,使用 多尺度特征图 进行回归,既保持了YOLO 预测速度快 的特性,也保证了跟Faster-RCNN差不多的 目标位置预测 精准度。
  • SSD的核心: 引入defalut box,与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是 在不同尺度feature map所有特征点上是使用不同的prior boxes

8.1 Detector & classifier(default box机制)

  • 关于三种boxes的解释区别:
    (1)ground truth boxes: 训练集中标注好的目标位置,即真实的位置(目标的左下角和右上角坐标)
    (2)default boxes: feature map每个特征点生成4或6个boxes(数量事先指定),格式为转换过后的(x, y, w, h)
    (3)prior boxes: 经过置信度阈值筛选后,剩下的可能性高的boxes。这个box才会被真正去做回归
  • Detector & classifier的三个部分:
    (1)default boxes: 默认候选框
    (2)localization:4个位置偏移
    (3)confidence:21个类别置信度(要区分出背景)
  • default box机制,不需要再像RPN那种筛选调整,而是直接经过prior boxes之后做回归操作(因为confidence中提供了21个类别概率可以筛选出背景)
  • 使用多尺度特征层共同生成default boxes进行预测(SSD从conv6开始,conv7,…conv10都生成boxes),这些特征层大小依次递减,使得SSD可以检测不同尺度的目标。可以理解为 靠前的特征层用于检测小目标,而靠后的特征层用来检测大目标。

8.2 训练流程

  • 输入->输出->结果与ground truth标记样本回归损失计算->反向传播, 更新权值
  1. 样本标记:利用default boxes与对应的ground truth进行标记正负样本
    每次并不是训练全部8732个计算好的default boxes, 而是先进行置信度筛选,并且训练指定的正样本和负样本, 如下规则:
    (1)正样本:物体GT与anchor iou满足大于0.5(与GT的IOU最高的boxes, 其输出对应label设为对应物体)
    (2)负样本:其它的样本标记为负样本
    (3)在训练时, default boxes按照正负样本控制 p o s i t i v e : n e g a t i v e = 1 : 3 positive:negative=1:3 positive:negative=1:3
  2. 损失
    网络输出预测的predict box与ground truth回归变换之间的损失计算
    置信度是采用 Softmax Loss(Faster R-CNN是log loss)
    位置回归则是采用 Smooth L1 loss (与Faster R-CNN一样)
  3. 测试流程: 输 入 − − > 输 出 − − > N M S − − > 输 出 输入-->输出-->NMS-->输出 >>NMS>

8.3 SSD总结

  • SSD算法有较高的准确率和性能,兼顾了速度和精度
    在这里插入图片描述
  • SSD网络结构
    在这里插入图片描述
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/222454
推荐阅读
相关标签
  

闽ICP备14008679号