• R-CNN 原理详解


    R-CNN 原理详解

     最近开始学习物体检测的知识,就读了一下R-CNN的论文原文 Rich feature hierarchies for accurate object detection and semantic segmentation。R-CNN的GitHub:repo地址 (PS:全部代码都是用Matlab写的,目前已经停止更新维护了)。
     这篇博客主要写了这篇论文整体的Contributions和R-CNN构建的整个思路流程,并且尽可能地介绍了我感觉比较重要的细节,如果想详细了解所有细节的话,还是需要阅读原论文。

    1. Contributions

     本篇论文作为将CNN引入目标检测的开山之作,主要的Contributions有两点:

    1. 将CNN引入了目标检测之中,并在PASCAL VOC 2010-12数据集中取得了较好的成绩。
    2. 目标训练集标签数据较少的时候,可以通过在一个较大的辅助训练集中进行pre-training然后到目标训练集进行fine-tuning,这样也能得到一个较好的结果。

    2. 流程详解

    2.1 总体流程

    在这里插入图片描述

     R-CNN总体流程如上图所示,主要是四个步骤:

    1. 提取候选区域region proposals(本文的做法是利用Selective Search在每张图片中提取2000个区域)。
    2. 由于SelectiveSearch每一个候选区域大小不确定,所以会将每个候选区域变换到固定尺度(本文用的是AlexNet网络提取特征,并且使用了各向异性缩放各向同性缩放两种方式进行放缩)。
      PS 各向异性缩放不考虑图片的长宽比例,不考虑图片是否扭曲,直接缩放到CNN输入的大小227*227。各向同性缩放可以先扩充后裁剪或者先裁剪后扩充,前者就是先把候选区域padding成一个正方形放缩后又把padding的剪掉,后者就是先将候选区域裁剪成一个正方形然后在放缩到中指定大小。
    3. 针对每一个候选区域,用CNN提取特征(本文利用AlexNet从每个候选区域中提取一个维度为4096 的向量)。
    4. 使用OneVsAll的技巧,针对每个类别训练一个SVM就得到了一个多分类的SVM。

    2.2 提取候选区域

     本文利用Selective Search进行候选区域的提取,我稍微看了一下Selective Search的论文,所以这里大概介绍一下这个算法的主要思路。

    Selective Search整体的分割工作是建立在图像的图表示方法之上的,也就是用图这个数据结构去表示图像。大概思想就是针对图像中出现的可以划分为一个整体的物体,用一个像素点作为图的节点。两个相连像素的差值(也可以是描述像素差异的函数)作为边的权重,也就是说两个像素点差异越小其连接起来的边权重就越小。
    PS:具体理解就是例如一副图像里面有一个人和一匹马,我们通过一系列的算法将整个图像分割为:背景、人、马三个部分。从图像的图表示的角度去理解,也就是这幅图像可以用三个互不连通的子图去表示。

     上面介绍了一个图像分割的例子,那么我们如何利用算法得到这三个互不连通的子图呢?这就是Selective Search要做的事情了,算法如下图所示:
    在这里插入图片描述

    1. 将每个像素点一开始都视为一个图(也就是一个节点一个子图),得到初始分割区域 R = { r 1 , r 2 , … , r n } R = { r_1,r_2,…,r_n } R={r1,r2,,rn}
    2. 初始化相似度集合S = ∅;
    3. 计算两两相邻区域 r i , r j r_i, r_j ri,rj之间的相似度,将其添加到相似度集合S中;
    4. 从集合S中找出,相似度最大的两个区域 r i 和 r j r_i 和r_j rirj将其合并成为一个区域 r t r_t rt,从集合中删去原先与 r i 和 r j r_i 和r_j rirj相邻区域之间计算的相似度,计算 r t r_t rt与其相邻区域的相似度,将其结果加入到相似度集合S中。同时将新区域 r t r_t rt添加到区域集合R中

    2.3 训练CNN

     本文训练CNN主要分为两个阶段:

    1. 第一个是Pre-training阶段:由于目标训练集标签数据较少,所以本文选择ILSVC 2012来训练AlexNet得到一个Pre-trained模型。
    2. 第二个阶段就是Fine-tuning阶段:使用候选区域对Pre-trained模型进行fine-tuning。首先将原来预训练模型最后的1000维输出的全连接层(分类层)换成21输出的全连接层(20类物体+背景),然后计算每个region proposal和ground truth(可以理解为数据集中每个类别的标识和bbox)的IoU,对于IoU>0.5的region proposal被视为该ground truth的正样本(也就是说给这个候选区域打上这个ground truth的类别标签),否则为负样本(即背景)。在每次迭代的过程中,选取32个正样本和96个负样本组成一个mini-batch(128,正负比:1:3)。论文中使用0.001的学习率和SGD来进行训练。

    2.4 训练SVM

     训练SVM的时候features和labels如下:

    • features:features就是用CNN从每个warp后的region proposal中提取的4096维的向量。
    • labels:SVM训练时候,给每个region proposal赋ground truth标签的时候是以IoU > 0.3来赋标签的,这里较之CNN训练的时候是将条件放宽松了。

    3. 总结

     以上便是R-CNN的主要思路流程和部分细节的讲解。论文中还用到了其他很多细节,例如: Hard negative mining methodNon-maximum suppressionBounding box regression(边界回归在文章的附件中有详细的讲解,好像只有这篇论文是将边界回归的全部细节讲了一遍,其他YOLO这些的都只是提了一下)等等细节的东西,要想全部了解这些细节还需要看看原论文。

  • 相关阅读:
    Bootstrap+Angularjs自制弹框
    【2019年04月22日】A股最便宜的股票
    沪深300指数的跟踪基金排名
    【2019年04月10日】股票的滚动市盈率PE最低排名
    【2019年04月09日】A股净资产收益率ROE最高排名
    基金 、社保和QFII等机构的重仓股排名评测
    【2019年04月04日】股市指数估值排名
    【2019年04月03日】A股最便宜的股票
    净资产收益率ROE连续3年超过15%的股票排名
    A股滚动净利润增速最高排名
  • 原文地址:https://www.cnblogs.com/lsl1229840757/p/14122592.html
Copyright © 2020-2023  润新知