目标检测 从古典走进R-CNN

作者: pdnbplus | 发布时间: 2024/06/18 | 阅读量: 145

# 目标检测 从古典走进R-CNN--潘登同学的深度学习笔记

古典目标检测

图像识别的一般流程是: 目标检测(将整张图片分为很多个object) --> 图像分类(将object分成特定类别)

目标检测是回归还是分类?

目标检测其实就是就是给Obj打框框的过程,就像我们自配的时候,会有一个框框住人脸,

回归任务

  • 对一个Obj打框

在一个平面确定一个矩形往往需要四个数据,矩形左上角坐标(两个值) 矩形框的长宽(两个值)

  • 对n个Obj打框

根据上面的说法,自然就需要4n个数据

如果把他作为一个回归任务的话,那么结果就会有4n个输出...(况且图片中有几个Obj还不确定,那么网络输出就不能确定)

分类任务

采用活动窗口的形式,扫描整张图片,对每个窗口的图像进行二分类,判断他是不是一个Obj,但是这种方法也有缺陷,就是滑动窗口的大小难以确定,如果采用暴力循环的方式来操作,那么运算量会特别大

Region Proposals

Region Proposals是候选提示框,是通过SS算法,作出的一些提示框,直接对这些候选提示框中的图像做二分类就可以做好目标检测...

Selective Search算法

SS算法是最为熟知的图像bouding boxes提取算法,由KoenE.A于2011年提出

选择搜索算法的主要观点:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes候选边界框。

首先,对输入图像进行分割算法产生许多小的子区域。其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框

Selective Search策略其实是借助了层次聚类的思想将层次聚类的思想应用到区域的合并上面

[外在这里插入图片描述

其实还有其他的算法能实现这样的功能,比如概率图模型中的二值切图法,

古典目标检测流程

  • 第一部分:训练集构造
    • 负样本: 使用SS方法对区域进行融合--> 计算每个候选区域与真实标记区域GT之间的重合,如果区域A与GT的重合度在20-50%之间,而且A与其他的任何一个已生成的负样本之间的重合度不大于70%,则A被采纳为负样本;
    • 正样本: 就是那些手工标记的GT区域作为正样本

当然这个训练集的构造就是人工打标签,采取的是labelImg的工具;而尊贵的算法攻城狮在做模型训练的时候,万一需要测试集,那么也得花上一天自己打一份测试样本...

在这里插入图片描述

  • 第二部分: 提取每个正/负样本的特征
    • HOG特征+ bag-of-words特征,同时辅助性地增加了SIFT,two colour SIFT,ExtendedOpponentSIFT,RGB-SIFT这四种特征,这样特征加起来的维度达到了惊人的360,000(这都是古典的方法,不知道也没事)
  • 第三部分: 分类器SVM训练
    • 因为以前SVM对二分类很稳健,而且当时还是很好用的,所以用SVM进行训练
  • 第四部分: 反馈False Positive
    • 把这些"False Positives"(实际为负例,但预测为正例的)收集起来,以刚才训练得到的SVM的权值作为其初始权值,对SVM进行二次训练,经过二次训练的SVM的分类准确度一般会有一定的提升;
  • 测试过程
    • 首先用SS方法得到测试图像上候选区域--> 然后提取每个区域的特征向量--> 送入已训练好的SVM进行软分类--> 将这些区域按照概率值进行排序--> 把概率值小于0.5的区域去除--> 对那些概率值大于0.5的,计算每个区域与比它分数更高的区域之间的重叠程度IoU,如果重叠程度大于30%,则把这个区域也去除了--> 最后剩下的区域为目标区域.

IoU(Intersection over Union)

  • Intersection over Union是一种测量在特定数据集中检测相应物体准确度的一个标准

在这里插入图片描述

在这里插入图片描述

  • 代码实现

在这里插入图片描述

R-CNN

受 AlexNet 启发,论文作者尝试将 AlexNet 在 ImageNet 目标识别的能力泛化到 PASCAL VOC 目标检测上面来

在这里插入图片描述

简单描述一下R-CNN的架构(从下往上)

  • 还是采用SS算法对图片进行分割
  • 对分割出来的图片进行强制缩放(因为CNN要求确定的输入大小)
  • 进CNN(这里用的是Alexnet)

然后这里就分为三步了

  1. 第一步, 先用正常的Softmax层训练,得到图片的分类(比如是cat,dog,background等), 目的是训练CNN
  2. 第二步,去掉softmax层,把CNN中softmax的输入拿出来,当做SVM的输入,然后得到SVM的多分类结果(比如是cat,dog,background等), 目的是训练SVM
  3. 第三步,还是用CNN中softmax的输入,做回归任务,得到分割区域的该变量(如: △x,△y,△w,△h 表示分割区域的改变量), 目的是训练回归

注意 这3步是分别执行的,而且要把每次训练的特征进行保存;

SVM与回归任务的训练样本构造方法: SS提出的候选框与人工手打的区域计算IOU,如果IOU>70%,那么就判断为正例,且给出(△x,△y,△w,△h)

缺点: inference is slow(正向传播速度非常慢)

SPP-net

Spatial Pyramid Pooling layer 空间金字塔池化

SSP-net是由何凯明大神与2015年首先发表的

SPP-net主要是在R-CNN的基础上进行改进的,但是它仍旧继承了R-CNN的多阶段的处理过程

  1. Extract region proposal,使用selective search的方法提取2000个候选区域
  2. Compute CNN features,使用CNN网络提取feature map
  3. Classify regions,将提取到的feature输入到SVM中进行分类
  4. Non-maximum suppression,用于去除掉重复的box
  5. Bounding box regression,位置精修,使用回归器精细修正候选框的位置

但它同时也指出了R-CNN存在的一些不足之处:

  • R-CNN对于每个region proposal都重复的使用CNN提取特征,这是非常消耗时间的
  • 对于不同size的region proposal的feature map,都需要resize到固定大小才能输入到FC layer或SVM分类器,resize会导致图片形变,影响最终的结果

改进方法

在这里插入图片描述

  • 直接一整张图输入CNN网络,提取整个图片的特征,然后再根据region proposal的位置来在整个feature map上截取出对应的feature就好啦,这样就避免了重复性用CNN对每个region proposal单独提取特征
  • 在原来的CNN网络的conv5层后加入了SPP layer,这样就可以不需要warp region proposal了,因为SPP layer可以接受不同size的输入,并可以得到相同尺寸的输出

关键点

  • 根据CNN的特点, 原图中region proposal在feature map的相对位置保持不变,那么就可以构造一个公式,使得原图中框出来的部分,映射为featrue map中的部分
  • 卷积与池化层可以接受不同大小的图片,但是全连接层不行,所以通过SPP layer可以将不同大小的region proposal(当然这个框在feature中)转化为固定大小的输出,如上图,就能转化为(44+22+1=21的输出)

Fast R-CNN

相比R-CNN最大的区别,在于RoI池化层(只有一个池化核)和全连接层中目标分类与检测框回归微调的统一

在这里插入图片描述

受到SPP-net的借鉴,Fast R-CNN也把整张图传进去,通过region proposal在feature map中的映射,再经过一个ROI池化层。

ROI池化是SPP的一个特例

RoI Pooling的过程就是将一个个大小不同的box矩形框,都映射成大小固定$w * h$的矩形框

如果region proposal不能被池化核整除,那么会做适当调节

在这里插入图片描述

Loss构成

Fast R-CNN舍弃了原本的SVM进行分类任务,转而选择了可以整合在网络中的softmax层,并且将分类的log loss与回归的regression loss加和起来一起训练

训练集的构成

如果在一个min-batch中用了多张图片,那就会有很多乱七八糟的region proposal可能在一张图片当中的背景是另外一张图片的obj,训练效率就不高

所以Fast R-CNN的一次min-batch采用了两张完整的图片, 每张图片选出64个region proposal,25%的正样本,75%的负样本

Faster R-CNN

相较于Fast R-CNN来说,Faster R-CNN抛弃了SS算法,加入了RPN(Region proposal Network),使得网络可以作出Region proposal; 也就是说,Faster R-CNN先做CNN,再自己做Region proposal,最后再接Fast R-CNN, 简单来说Faster R-CNN = RPN + Fast R-CNN

在这里插入图片描述

下图展示了了Faster R-CNN的网络结构(主干网络用VGG)

  • 首先缩放至固定大小MxN,然后将MxN图像送入网络
  • Conv layers中包含了13个conv层+13个relu层+4个pooling层
  • RPN网络首先经过3x3卷积,再分别生成positive anchors和对应bounding box regression偏移量,然后计算出proposals
  • 而Roi Pooling层则利用proposals从feature maps中提取proposal feature送入后续全连接和softmax网络作classification(即分类proposal到底是什么object)

4个loss

由上图可以看出在RPN处有两个loss,分别是一个二分类的loss和一个回归的loss,二分类的目的是划分出是否为obj,回归的目的是调整Region框的位置

还有两个时在ROI后面的loss就跟之前的类似啦,一个是多分类,一个是回归(调框位置的)

值得注意的是, Faster R-CNN采用的是2 steps的方式训练的,先训练RPN,再训练最终分类

RPN部分

在训练Faster R-CNN的时候有两种方式

  • 交替训练--训练RPN,训练Fast R-CNN
  • 先训练RPN,训练好了RPN,再训练Fast R-CNN

无论哪种方式都是要先训练RPN,RPN的过程如下

  • 共享卷积(论文用的是ZF,ImageNet大赛中Alexnet的改进)得到Feature map, 再用一个n*n的window(这里是3)做卷积,其中心为anchor 在这里插入图片描述

RPN最终就是在原图尺度上,设置了密密麻麻的候选Anchor。然后用cnn去判断哪些Anchor是里面有目标的positive anchor,哪些是没目标的negative anchor。所以,仅仅是个二分类而已!

  • 根据anchor定出k个大小不同的框(这里是9) 在这里插入图片描述

框的尺寸与大小分别是(${1:1,1:2,2:1}$与${128,256,512}$)的排列组合而成

  • 计算loss,包括是否为object与框的位置
    • 正例样本 在这里插入图片描述
  • 负例样本 在这里插入图片描述

  • Loss函数 在这里插入图片描述

    调整Anchor boxes的位置,bounding box regression过程 在这里插入图片描述

    • bounding box regression原理(借用知乎的理解) 对于窗口一般使用四维向量 $(x,y,w,h)$ 表示,分别表示窗口的中心点坐标和宽高。对于下图 ,红色的框A代表原始的positive Anchors,绿色的框G代表目标的GT,我们的目标是寻找一种关系,使得输入原始的anchor A经过映射得到一个跟真实窗口G更接近的回归窗口G' 其实只要训练一组$W$参数(其loss即为上面的后一项loss,后一项loss之所以有λ是因为要平衡两项loss,不让某一项主导训练),使得原候选框经过线性变换,达到ground truth的位置

NMS(非极大值抑制,Non maximum suppression)

因为在生成Region proposals会生成很多,很多个重叠的框没啥用,此时就要用NMS来减少框的数量

非极大值抑制的方法是:先假设有6个矩形框,根据分类器的类别分类概率做排序,假设从小到大概率分别为A、B、C、D、E、F

  1. 从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
  2. 假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
  3. 从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
  4. 就这样一直重复,找到所有被保留下来的矩形框。

在这里插入图片描述

mAP评价指标

mAP(平均precision),常用于评价图片分类的评估指标,ImageNet大赛都是用这个来评估

在这里插入图片描述

precision与Recall是一个trade off的过程,Recall高,那么precision就会低;

所以论文在选取IOU阈值的时候,不是选取Recall最高的那个IOU值而是选择中规中矩的0.7

在这里插入图片描述

最后,Faster R-CNN还是比较难理解,看完论文有很多地方也是不太懂,后面详细看看代码应该就能理解了...