zoukankan      html  css  js  c++  java
  • (二)目标检测算法之R-CNN

     

    系列博客链接:

    (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html

    概述:

    1、目标检测-Overfeat模型

    2、目标检测-R-CNN模型

      2.1 完整R-CNN结构(R-CNN的完整步骤)

      2.2 R-CNN训练过程

      2.3 R-CNN测试过程

      2.4 总结(缺点即存在的问题)

    PS: 因为手敲,因此目录稍微出入,请见谅。

    引言:

    对于一张图片当中多个目标,多个类别的时候。前面的输出结果是不定的,有可能是以下有四个类别输出这种情况。或者N个结果,这样的话,网络模型输出结构不定

    所以需要一些他的方法解决目标检测(多个目标)的问题,试图将一个检测问题简化成分类问题

    1、目标检测-Overfeat模型

    1.1 滑动窗口

    目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。如下图所示:

     这样就变成每张子图片输出类别以及位置,变成分类问题。但是滑动窗口需要初始设定一个固定大小的窗口,这就遇到了一个问题,有些物体适应的框不一样,

    所以需要提前设定K个窗口,每个窗口滑动提取M个,总共K x M 个图片,通常会直接将图像变形转换成固定大小的图像,变形图像块被输入 CNN 分类器中,

    提取特征后,我们使用一些分类器识别类别该边界框的另一个线性回归器

    简而言之,当一张图片中存在多个目标时,我们需要想办法将其转变成多张固定大小的子图片,然后通过CNN提取特征,再进行类别分类(识别)和边框回归(后面会说)

    这样,一个多目标的检测问题,就转变成了机器学习常见的多分类问题

     

    那这种方法是怎么去利用数据训练的?

    1.2 训练数据集

    首先我们会准备所需要的训练集数据,每张图片的若干个子图片以及每张图片的类别位置,如下我们从某张图片中滑动出的若干的图片。

    1.3 Overfeat模型总结

    这种方法类似一种暴力穷举的方式,会消耗大量的计算力量,并且由于窗口大小问题可能会造成效果不准确

    。但是提供了一种解决目标检测问题的思路。

    2 目标检测-R-CNN模型

    在CVPR 2014年中Ross Girshick提出R-CNN。

    2.1 完整R-CNN结构

    不使用暴力方法,而是用候选区域方法(region proposal method),创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型 ,R-CNN在当时以优异的性能令世人瞩目,以R-CNN为基点,后续的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路。

     

    步骤(以AlexNet网络为基准)

    • 1.找出图片中可能存在目标的侯选区域region proposal
    • 2.进行图片大小调整为了适应AlexNet网络的输入图像的大小227×227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成2000×4096维矩阵
    • 3.将2000×4096维特征与20个SVM组成的权值矩阵4096×20相乘(20种分类,SVM是二分类器,则有20个SVM),获得2000×20维矩阵
    • 4.分别对2000×20维矩阵中每一列即每一类进行非极大值抑制(NMS:non-maximum suppression)剔除重叠建议框,得到该列即该类中得分最高的一些建议框
    • 5.修正bbox,对bbox做回归微调

    2.2 候选区域

     选择性搜索(SelectiveSearch,SS)中,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。

    SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。

    2.3 Crop+Warp

    传统的CNN限制了输入必须固定大小,所以在实际使用中往往需要对原图片进行crop或者warp的操作

    • crop:截取原图片的一个固定大小的patch
    • warp:将原图片的ROI缩放到一个固定大小的patch

    无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。会使用一些方法尽量让图片保持最小的变形。

    • 1.各向异性缩放:即直接缩放到指定大小,这可能会造成不必要的图像失真

    • 2.各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色

     

    2.4 CNN网络提取特征

    在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据。

     

    提取的这些特征将会保存在磁盘当中(这些提取的特征才是真正的要训练的数据

    2.5 特征向量训练分类器SVM

    假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。那么最后需要对这些特征进行分类,R-CNN选用SVM进行二分类。假设检测N个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,如下图所示

     

    更通俗的解释:

      假设原图片有2000个候选区,将其输入进一个CNN中(进行卷积、池化...得到各种抽象的特征),输出2000x4096的特征向量。此时找到N个(需要分类多少个找多少个,如分为20类)SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,即2000x4094的特征向量分别与N个不同类的SVM分类器,然后再得到最终的得分矩阵,矩阵默认N行(代表N类),2000列(2000个候选区),其中一共是2000N个"数",这些"数"即该候选区属于某一类的概率。

    每个SVM分类器做的事情

    • 判断2000个候选区域是某类别,还是背景

     

    2.6 非最大抑制(NMS)

    • 目的
      • 筛选候选区域,得到最终候选区域结果
    • 迭代过程
      • 对于所有的2000个候选区域得分进行概率筛选
      • 然后对剩余的候选框,每个类别进行IoU(交并比)>= 0.5 筛选

    假设现在滑动窗口有:A、B、C、D、E 5个候选框,

    • 第一轮:假设B是得分最高的,与B的IoU>0.5删除。现在与B计算IoU,DE结果>0.5,剔除DE,B作为一个预测结果
    • 第二轮:AC中,A的得分最高,与A计算IoU,C的结果>0.5,剔除C,A作为一个结果

    最终结果为在这个5个中检测出了两个目标为A和B

    2.7 修正候选区域(边框回归)

    那么通过非最大抑制筛选出来的候选框不一定就非常准确怎么办?R-CNN提供了这样的方法,建立一个bbox regressor

    • 回归用于修正筛选后的候选区域,使之回归于ground-truth,默认认为这两个框之间是线性关系,因为在最后筛选出来的候选区域和ground-truth很接近了

    修正过程(线性回归)

    • 给定:anchor A=(A_{x}, A_{y}, A_{w}, A_{h}) 和 GT=[G_{x}, G_{y}, G_{w}, G_{h}]
    • 寻找一种变换F,使得:F(A_{x}, A_{y}, A_{w}, A_{h})=(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'}),其中(G_{x}^{'}, G_{y}^{'}, G_{w}^{'}, G_{h}^{'})≈(G_{x}, G_{y}, G_{w}, G_{h})

    解释:这里我们经过2.6步NMS预测得到的bbox是A筐,再经过2.7步,边框回归,进行修正,得到G',减少了原A与真实边框G的误差。

    2.3 R-CNN训练过程

     步骤:正负样本准备+预训练+微调网络+训练SVM+训练边框回归器

    2.3.1 正负样本准备

    对于训练集中的所有图像,采用selective search方式来获取,最后每个图像得到2000个region proposal。但是每个图像不是所有的候选区域都会拿去训练。保证正负样本比例1:3。

    样本描述
    正样本 某个region proposal和当前图像上的所有ground truth中重叠面积最大的那个的IOU大于等于0.5,则该region proposal作为这个ground truth类别的正样本
    负样本 某个region proposal和当前图像上的所有ground truth中重叠面积最大的那个的IOU都小于0.5,则该region proposal作为这个ground truth类别的负样本

    这样得出若干个候选区域以及对应的标记结果。

    2.3.2 预训练(pre-training)

    CNN模型层数多,模型的容量大,通常会采用2012年的著名网络AlexNet来学习特征,包含5个卷积层和2个全连接层,利用大数据集训练一个分类器,比如著名的ImageNet比赛的数据集,来训练AlexNet,保存其中的模型参数。

    所谓预训练,其实就是拿别人训练好的模型来用,但是还没有真的开始训练。

    2.3.3 微调(fine-tuning)

    AlexNet是针对ImageNet训练出来的模型,卷积部分可以作为一个好的特征提取器,后面的全连接层可以理解为一个好的分类器。R-CNN需要在现有的模型上微调卷积参数

    • 将第一步中得到的样本进行尺寸变换,使得大小一致,然后作为预训练好的网络的输入,继续训练网络(迁移学习)

     所谓微调,就是预训练拿来用的model1,给model1输入我们的数据(固定尺寸的图像),然后训练得到model2,model2就是我们微调后的模型,本质就是迁移学习,不同于预训练的是,这是真的训练了。

    2.3.4 SVM分类器

    针对每个类别训练一个SVM的二分类器。举例:猫的SVM分类器,输入维度是2000x4096,目标还是之前第一步标记是否属于该类别猫,训练结果是得到SVM的权重矩阵W,W的维度是4096x20。

    2.3.5 bbox回归器训练(边框回归)

    只对那些跟ground truth的IoU超过某个阈值且IOU最大的region proposal回归,其余的region proposal不参与。

    2.4 R-CNN测试过程

    • 输入一张图像,利用selective search得到2000个region proposal。

    • 对所有region proposal变换到固定尺寸并作为已训练好的CNN网络的输入,每个候选框得到的4096维特征

    • 采用已训练好的每个类别的svm分类器对提取到的特征打分,所以SVM的weight matrix(权重矩阵)是4096xN,N是类别数,这里一共有20个SVM,得分矩阵是2000x20
    • 采用non-maximun suppression(NMS)去掉候选框

    • 得到region proposal(oU超过某个阈值且IOU最大)进行边框回归。

    2.5 R-CNN总结

    2.5.1 流程总结

     

    • 表现
      • 在VOC2007数据集上的平均精确度达到66%

    2.5.2 缺点

    • 1、训练阶段多:步骤繁琐: 微调网络+训练SVM+训练边框回归器。

    • 2、训练耗时:占用磁盘空间大:5000张图像产生几百G的特征文件。(VOC数据集的检测结果,因为SVM的存在)

    • 3、处理速度慢: 使用GPU, VGG16模型处理一张图像需要47s。

    • 4、图片形状变化:候选区域要经过crop/warp进行固定大小,无法保证图片不变形
  • 相关阅读:
    SQLMAP注入教程-11种常见SQLMAP使用方法详解
    VS2012/2013/2015/Visual Studio 2017 关闭单击文件进行预览的功能
    解决 IIS 反向代理ARR URLREWRITE 设置后,不能跨域跳转 return Redirect 问题
    Spring Data JPA one to one 共享主键关联
    JHipster 问题集中
    Spring Data JPA 定义超类
    Spring Data JPA查询关联数据
    maven命名
    maven仓库
    Jackson读取列表
  • 原文地址:https://www.cnblogs.com/kongweisi/p/10895055.html
Copyright © 2011-2022 走看看