zoukankan      html  css  js  c++  java
  • R-CNN

    R-CNN

    R-CNN是CNN处理目标检测问题的开山之作,其中的区域提议,难例挖掘,非极大值抑制等等方法沿用至今。整个打下了two-stage模型的框架。但我并不推荐研究R-CNN的实现,因为选择性搜索部分与现在的方法差距太大了,还是计算机视觉“特征工程”时代的产物。

    flowchart LR 1[R-CNN] 2[RCNN]-->2i["selective search<br>根据颜色、边缘、纹理等<br>快速找到可能存在的目标候选框"]-->2a[47S每张<br>mAP 66%] 2i-->2b["proposal归一化到227*227<br>CNN只对一个图片ROI(region of interest)提取特征<br>分类还是SVM,最终对分类好的proposal进行回归"] 2i-->2c["问题在于每一个图像块进来都要用CNN算一下特征<br>但是整张图算一次就可以了"] 3[Fast RCNN]-->3i["加入SPPnet<br>end to end 训练<br>使用回归"]-->3a[3S每张<br>mAP 70%<br>仍然是网络外部给proposal] 3i-->3b["ROI pooling<br>类似于SPP,但是只有一种7*7网格<br>下采样得到49*512维度的特征(只有全连接层才对size有要求)"] 3i-->3c["loss function使用了多任务损失函数(multi-task loss)<br>将边框回归直接加到CNN网络中训练"] 3i-->3d["SPP对任意输入的Feature Map做了金字塔pooling<br>把map划为4*4,2*2,1*1三种网格,然后做pooling<br>得到固定FC输入(16+4+1)*chanels维度"] 4[Faster RCNN]-->4i["使用网络直接产生召回率高的proposals<br>RPN网络"]-->4a["5FPS<br>AP 73.2%"] 4i-->4b["加入了9中anchors(3种尺度,3种比例)"] 4i-->4c[输入的特征proposal接入到ROI pooling] 5[YOLO]-->5i[变为回归问题来做]-->5a[45FPS<br>mAP 57.9%] 5i-->5b["整张图划为7*7网格<br>每一个格子预测两个目标<br>输出结果有置信度和坐标"] 5i-->5c["并没有使用region proposal<br>7*7比较粗糙,小目标效果差"] 6[SSD]-->6i[yolo+proposal+多尺度]-->6a[58FPS<br>mAP 57.9%] 6i-->6b[整张图8*8网格+anchors+FCN] 6i-->6c[不同层的feature map 3*3滑窗感受野不同<b>作为不同尺度的检测] 1-->2 1-->3 1-->4 1-->5 1-->6

    matlab实现

    浓缩版本

    R-CNN首先对图像选取若干提议区域Region Proposal(如锚框Anchor也是一种选取方法)并标注它们的类别和边界框(如偏移量)。然后,用卷积神经网络对每个提议区域做前向计算抽取特征。之后,我们用每个提议区域的特征预测类别和边界框。

    graph LR 选择性搜索-->a 选择性搜索-->b subgraph 待检测图像 a b end a-->1[cnn] 1-->3[类别预测] 1-->4[边界框预测] b-->2[cnn] 2-->5[类别预测] 2-->6[边界框预测]

    具体来说,R-CNN主要由以下4步构成:

    1. 提议区域:对输入图像使用选择性搜索(selective search)来选取多个高质量的提议区域 。这些提议区域通常是在多个尺度下选取的(FPN提到的图像金字塔),并具有不同的形状和大小。每个提议区域将被标注类别和真实边界框。
    2. 提取特征:选取一个预训练的CNN,并将其在输出层之前截断。将每个提议区域变形为网络需要的输入尺寸,并通过前向计算给提议区域抽取特征
    3. 目标分类:将每个提议区域的特征连同其标注的类别作为一个样本,训练多个支持向量机对目标分类。其中每个支持向量机用来判断样本是否属于某一个类别。
    4. 回归边框:将每个提议区域的特征连同其标注的边界框作为一个样本,训练线性回归模型来预测真实边界框

    R-CNN虽然通过预训练的卷积神经网络有效抽取了图像特征,但它的主要缺点是速度慢。想象一下,我们可能从一张图像中选出上千个提议区域,对该图像做目标检测将导致上千次的卷积神经网络的前向计算。这个巨大的计算量令R-CNN难以在实际应用中被广泛采用。

    Introduction

    开始之前,注意这是14年的论文,不能苛求其有多么高大上。虽然我们现在觉得R-CNN非常笨重低效,但在R-CNN之前,是更加黑暗的时代,这体现在:

    1. 速度超慢:在R-CNN之前,目标检测多用滑动窗口检测法,约等于有多少个像素点,就要做多少次检测。R-CNN至少提前定好了提议区域。
    2. 计算超复杂:检测特征多为人工提取(Haar,HOG,SIFT…等等许多没学过数字图像处理的同学听都没听说过的算法)。R-CNN使用CNN提取特征,这至少在提取特征上做到了多快好省。

    相比传统办法,因为RCNN的CNN在各个类别中共享特征所以内存占比和计算时间都贼低,和类别数量有关(随种类数量增大而增大)的部分只有非极大值抑制和线性SVM。R-CNN的贡献在于极大地缩短了监督学习(与Ground-Truth有关)的时间,涉及的运算只有CNN/svm/线性回归的矩阵运算与非极大值抑制(NMS)。当然,现在看来其最需要优化的地方,就是所谓“类别无关”的部分了(提议区域)。第二个贡献在于将在ImageNet上训练好的CNN作为“黑箱”特征提取,无需fine-tune省时省力。当然,现在看来,仅仅作为无需fine-tune的特征提取器也是其局限之一。

    模型详解

    流程:

    1. 图像分割(不是语义分割,属于数字图像处理中比较“低级”的手段) 成若干小区域。
    2. 按规则反复融合小区域,直到整张图片只剩一个区域为止。
    3. 输出所有曾经存在过的区域,即提议区域。

    合并规则:

    优先合并以下四种区域:

    1. 颜色(颜色直方图)相近的
    2. 纹理(梯度直方图)相近的
    3. 合并后总面积小的(使得合并均匀,避免出现过大的区域逐个吃掉剩下的小区域。比如你手里有斗地主里面的5连飞机,也不能一次性打出去,而是拆成三带二。)
    4. 合并后,总面积在其所属Ground-Truth边界框bounding box中所占比例大的。

    img

    如上图所示,左边区域适合合并,右边则不适合

    可见第1,2条规则是合并的基本原则,而第3条保证了区域大小分布均匀,第4条保证了区域形状规则

    为尽可能不遗漏候选区域,上述操作在多个颜色空间中同时进行(RGB,HSV,Lab等)。在一个颜色空间中,使用上述四条规则的不同组合进行合并。所有颜色空间与所有规则的全部结果,在去除重复后,都作为候选区域输出。

    预处理和特征提取

    众所周知,CNN只能接受特定大小的输入,因此需要对输入图片进行变形,使每个region proposal的大小都是227*227。

    作者关于“如何变形”给出了大量讨论实验。比如直接先裁剪后变形,还是裁剪后零填充等等,但其实问题不大。

    img

    取得提取特征的模型的过程分为两步:

    1. 有监督预训练
    2. 调优训练

    有监督预训练(Supervised pre-training)的过程:现在我们喜欢管这个过程叫迁移学习(transfer-learning),即使用别的数据集训练好模型(这里是ImageNet训练的CNN)。(稍加修改后)用于其他任务(这里是去掉最后一个用于输出的FC层,用于提取提议区域的特征)。

    调优训练(fine-tune):使用选择性搜索得到的提议区域训练。设目标检测数据集中N类物体,就在上一步预训练的模型最后加上N+1个输出的神经元(还有一类背景类,比如VOC有20个类别,就有21个输出)。训练的batch size=128(32个正样本+96个负样本)

    这里就已经体现出平衡数据的思想了,这也是目标检测的老大难问题之一。

    正样本&负样本

    正负样本选择

    对一张图片进行选择性搜索,即使以上述组合规则的办法,搜索出2000个候选框;出现一个和Ground Truth的边界框完全一致的概率也约等于0。

    因此在一切开始之前,就需要先用IoU为2000个候选框打分。若其与Ground-Truth的边界框的IoU>0.5,那么我们就把这个候选框标注成物体类别(正样本),否则我们就把它当做背景类别(负样本)。

    注:由上一部分的分析,通常情况下,正样本数量远远小于负样本,因此引出了后续的难例挖掘。(和后来的Focal Loss)

    IoU

    衡量边界框位置,常用交并比指标,交并比(Injection Over Union,IOU)发展于集合论的雅卡尔指数(Jaccard Index),被用于计算真实边界框Bgt(数据集的标注)以及预测边界框Bp(模型预测结果)的重叠程度。

    具体来说,它是两边界框相交部分面积与相并部分面积之比,如下所示:

    img

    SVM分类

    对每一类目标,使用一个线性SVM二类分类器进行判别。输入为CNN输出的4096维特征,输出是否属于此类。 由于负样本很多,使用难例挖掘(hard negative mining)方法。

    正样本:本类的Ground-Truth标定框。

    负样本:遍历所有的提议区域,如果和本类所有标定框的重叠都小于0.3,则认为其为负样本。

    好的,问题又来了:

    • Fine-tune时已经有CNN的分类输出了,为什么还要再训练一堆SVM?

      SVM与CNN的正负样本定义不同,导致CNN输出的精度差。这主要由于CNN的IoU只要高于0.5就算正样本,但SVM的正样本则是需要将整个物体包括在内。

    • 0.3这个阈值是哪里来的?

      试出来的,事实上,每个物体的正样本通常只有一个。负样本太多了就要筛选,IoU阈值选的太大了会让模型产生困惑,太小了呢负样本又太多了。反复实验对比才确定了0.3这个阈值。

    • 什么是难例挖掘?

      博客链接

    回归边框

    之前的区域提议只是大致的选出了物体在哪,本身也是一个无监督的过程。某种意义上框不框得准完全是玄学。因此需要额外的回归器进行边框回归(精修)。

    回归器:

    对每一类目标,使用一个线性岭回归器进行精修。正则项(lambda=10000)。 输入为深度网络pool5层的4096维特征,输出为(x,y)方向的缩放和平移。

    训练样本:

    判定为本类中和Ground Truth的IoU大于0.6的区域提议框。

    测试阶段

    在描述Object Detection算法时,测试阶段也是需要单独拎出来的,因为从训练过程可以看出,即使在训练时,我们也无法得到百分百准确的区域提议,需要经过繁琐的过程预处理数据。更别提被区域提议不知所措的测试阶段了。

    • 测试阶段流程:
    1. 首先使用选择性搜索提取测试图片的区域提议(和训练时一样,2000+个)。
    2. 将所有区域提议变形为227*227(用和训练时一致的变形方法),并使用CNN获得特征。
    3. 所有特征用SVM进行分类
    4. 对每个类,用非极大值抑制(NMS)筛选出最终的待回归的框
    5. 对NMS选出的边界框进行回归

    本文来自博客园,作者:甫生,转载请注明原文链接:https://www.cnblogs.com/fusheng-rextimmy/p/15469718.html

  • 相关阅读:
    将图片制作数据拒
    python中PIL.Image,OpenCV,Numpy图像格式相互转换
    9、【Hive】初始化元数据库时失败,遇到org.apache.hadoop.hive.metastore.HiveMetaException: Schema initialization FAILED! Metastore state would be inconsistent
    8、【Hive Mysql】MySQL8 提示Public Key Retrieval is not allowed错误解决方法
    7.【Hive】hive启动出现权限错误 /tmp/hive on HDFS should be writable
    一、Zookeeper简明笔记
    6、System times on machines may be out of sync. Check system time and time zones
    5、利用搭建的hadoop集群计算wordcount时出现内存问题
    4、利用hadoop自带的mr 示例测试运行任务失败: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster
    3、hadoop运行jar包报错 : "/bin/bash: /bin/java: No such file or directory"
  • 原文地址:https://www.cnblogs.com/fusheng-rextimmy/p/15469718.html
Copyright © 2011-2022 走看看