• R-CNN


    测试过程:

    1. 输入图像,采用Selective Search 从原始图片中提取2000个左右区域候选框;
    2. 将所有候选框变为固定大小的(227*227)区域;(归一化)
    3. 使用CNN网络提取每个建议框的特征(pool5层);
    4. 用SVM作分类,作非极大值抑制;
    5. bounding-box回归得到物体的种类以及位置信息。

    训练过程(不连续):

    1. ILSVRC 2012上预训练CNN
    2. PASCAL VOC 2007上微调CNN
    3. 做20类SVM分类器的训练
    4. 20类bounding-box回归器的训练

    1、测试

    1、建议框归一化方法

    经过作者一系列实验表明采用padding=16的各向异性变形即下图第二行第三列效果最好,能使mAP提升3-5%。 

    2、CNN(alexnet)提取特征

    AlexNet不用最后的全连接层,提取出1*1*4096维的特征向量。

    3、训练分类器SVM

    每一类对应一个分类器。训练SVM的正负样本:采用IOU阈值样本,计算每一个region proposal与标准框的IOU,当大于阈值0.3时则为正样本,小于阈值0.3时为负样本。

    CNN提取的区域特征2000*4096  X  SVM权值矩阵 4096*20 == 最后得到2000个边界框对应20个类的概率值(得分)。

    由于负样本太多了,所以采用hard negative mining,将特别容易分错的负样本(类似于错题集)放入负样本集中再训练,对网络的分类性能有很大帮助。

    4、bounding box回归:

    对分类好的区域做边框回归。CNN生成每个region proposal 固定长度的特征向量,svm计算每个region特征向量的score,并进行排序。然后利用NMS得到最终的概率最大的一些区域。

    知乎上有人说R-CNN需要两次前向计算,第一次得到建议框特征给svm分类识别,第二次对非极大抑制后的建议框再次进行CNN前向计算获得Pool5特征,以便对建议框进行回归得到更精确的bounding-box,这里文中并没有说是怎么做的,博主认为也可能在计算2k个建议框的CNN特征时,在硬盘上保留了2k个建议框的Pool5特征,虽然这样做只需要一次CNN前向网络运算,但是耗费大量磁盘空间。

    2、训练

    1、预训练CNN

    大样本进行预训练网络,得到最后一层的1000x4096特征;

    2、微调网络

    小样本进行fine tune。

    样本来源
    正样本 Ground Truth+与Ground Truth相交IoU>0.5的建议框【由于Ground Truth太少了】
    负样本 与Ground Truth相交IoU≤0.5的建议框

    PASCAL VOC 2007样本集上既有图像中物体类别标签,也有图像中物体位置标签; 

    采用训练好的AlexNet CNN网络进行PASCAL VOC 2007样本集下的微调,学习率=0.001【0.01/10为了在学习新东西时不至于忘记之前的记忆】; 

    该网络输入为建议框【由selective search而来】变形后的227×227的图像,修改了原来的1000为类别输出,改为21维【20类+背景】输出,训练的是网络参数。

    3、svm训练

    样本来源
    正样本 Ground Truth
    负样本 与Ground Truth相交IoU<0.3的建议框

    SVM训练时输入正负样本在AlexNet CNN网络计算下的4096维特征,输出为该类的得分,训练的是SVM权重向量。由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本。

    4、bounding box回归训练

    输入

    其实真正的输入是这个窗口对应的CNN特征,也就是R-CNN中的AlexNet Pool5 feature(特征向量)。(注:训练阶段输入还包括 Ground Truth,也就是下边提到的)

    输出:

    需要进行的平移变换和尺度缩放,或者说是

    我们的最终输出不应该是Ground Truth吗?是的,但是有了这四个变换我们就可以直接得到Ground Truth。

    这四个值应该是经过 Ground Truth 和Proposal计算得到的真正需要的平移量和尺度缩放

    这也就是R-CNN中的:

    目标函数

    我们要让预测值跟真实值差距最小,得到损失函数为:

    • 是输入Proposal的特征向量
    • 是要学习的参数   (*表示,也就是每一个变换对应一个目标函数,就是所需要学习的回归参数)
    • 是得到的预测值。

    函数优化目标

    损失函数中加入正则项是为了避免归回参数过大。

    利用梯度下降法或者最小二乘法就可以得到。 

    注意:只有当Proposal和Ground Truth比较接近时(线性问题),我们才能将其作为训练样本训练我们的线性回归模型,否则会导致训练的回归模型不work(当Proposal跟GT离得较远,就是复杂的非线性问题了,此时用线性回归建模显然不合理)。

    例如:

    上图是同一目标,只是尺度不同,由于CCN具有尺度不变性,所以实际上这两个偏移程度是相同,但是偏移量是不同的,所以要做尺度归一化,这样得到的便宜量以相同了。

    Log函数明显不满足线性函数,但是为什么当Proposal 和Ground Truth相差较小的时候,就可以认为是一种线性变换呢?高数知识:

    当且仅当Gw−Pw=0的时候,才会是线性函数,也就是宽度和高度必须近似相等。

    3、缺点

    1. 速度慢;
    2. 复杂
    3. 费空间、时间
  • 相关阅读:
    五种提高 SQL 性能的方法
    join 使用详解方式
    关于MagicAjax的用法
    收藏几段SQL Server语句和存储过程
    ubuntu nfs配置 以及mount.nfs:access denied by server while mounting问题解决
    Hisi开发板上 SQLite3.3.8移植
    父进程非阻塞回收子进程(适用LINUX下C语言的clientserver模型)
    busybox asm/page.h: No such find.
    ubuntu11.10 samba服务器配置
    errno定义
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11404945.html
Copyright © 2020-2023  润新知