目标检测之R-CNN Fast R-CNN Faster R-CNN

Object Detection,在给定的图像中,找到目标图像的位置,并标注出来。 或者是,图像中有那些目标,目标的位置在那。这个目标,是限定在数据集中包含的目标种类,比如数据集中有两种目标:狗,猫。 就在图像找出来猫,狗的位置,并标注出来 是狗还是猫。

这就涉及到两个问题:

  1. 目标识别,识别出来目标是猫还是狗,Image Classification解决了图像的识别问题。
  2. 定位,找出来猫狗的位置。

R-CNN

2012年AlexNet在ImageNet举办的ILSVRC中大放异彩,R-CNN作者受此启发,尝试将AlexNet在图像分类上的能力迁移到PASCAL VOC的目标检测上。这就要解决两个问题:

  • 如何利用卷积网络去目标定位
  • 如何在小规模的数据集上训练出较好的网络模型。

对于问题,R-CNN利用候选区域的方法(Region Proposal),这也是该网络被称为R-CNN的原因:Regions with CNN features。对于小规模数据集的问题,R-CNN使用了微调的方法,利用AlexNet在ImageNet上预训练好的模型。

R-CNN目标检测的思路:

  • 给定一张图片,从图片中选出2000个独立的候选区域(Region Proposal)
  • 将每个候选区域输入到预训练好的AlexNet中,提取一个固定长度(4096)的特征向量
  • 对每个目标(类别)训练一SVM分类器,识别该区域是否包含目标
  • 训练一个回归器,修正候选区域中目标的位置:对于每个类,训练一个线性回归模型判断当前框是不是很完美。

下图给出了,R-CNN的目标检测过程
在这里插入图片描述

训练

R-CNN进行目标检测的训练流程:

  • 使用区域生成算法,生成2000个候选区域,这里使用的是Selective search.
  • 对生成的2000个候选区域,使用预训练好的AlexNet网络进行特征提取。
    • 将候选区域变换到网络需要的尺寸( 227 × 227 227 \times 227 227×227)。 在进行变换的时候,在每个区域的边缘添加 p p p个像素,也就是手工的添加个边框,设置 p = 16 p = 16 p=16
    • 改造预训练好的AlexNet网络,将其最后的全连接层去掉,并将类别设置为21(20个类别,另外一个类别代表背景).
      在这里插入图片描述
      这样一个候选区域输入到网络中,最终得到一个 4096 × 21 4096 \times 21 4096×21的特征。
  • 利用上面提取到的候选区域的特征,对每个类别训练一个SVM分类器(而分类)来判断,候选框里物体的类别,是给类别就是positive,不是就是negative。比如,下图针对狗的SVM分类器
    在这里插入图片描述
    狗的SVM分类器,就要能判断出某个候选区域是不是包含狗,包含狗了那就是Positive;不包含就是Negative.这里有个问题是,假如候选区域只是框出来了某个类的一部分,那要怎么来标注这个区域呢。在R-CNN中,设定一个IOU的阈值,如果该区域与Ground truth的IOU低于该阈值,就将给区域设置为Negative。阈值设置为0.3。
  • 对于面只是得到了每个候选框是不是包含某个目标,其得到的区域位置不是很准确。这里需要再训练一个线性回归模型判断,候选区域框出的目标是不是完美。对于某个类别的SVM是Positive的候选区域,来判断其框的目标区域是不是很完美。
    在这里插入图片描述

测试

从一张图片中提取2000个候选区域,将每个区域按照训练时候的方式进行处理,输入到SVM中进行正负样本的识别,并使用候选框回归器,计算出每个候选区域的分数。
候选区域较多,有2000个,所有很多重叠的部分,就需要剔除掉重叠的部分。
针对每个类,通过计算IOU,采取非最大值抑制的方法,以最高分的区域为基础,删掉重叠的区域。

缺点

  • 训练分为多个步骤,比较繁琐。 需要微调CNN网络提取特征,训练SVM进行正负样本分类,训练边框回归器得到正确的预测位置。
  • 训练耗时,中间要保持候选区域的特征,5000张的图片会生成几百G的特征文件。
  • 速度慢
  • SVM分类器和边框回归器的训练过程,和CNN提取特征的过程是分开的,并不能进行特征的学些更新。

Fast R-CNN

R-CNN虽然取得了不错的成绩,但是其缺点也很明显。Ross Girshick在15年推出Fast RCNN,构思精巧,流程更为紧凑,大幅提升了目标检测的速度。同样使用最大规模的网络,Fast RCNN和RCNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在PASCAL VOC 2007上的准确率相差不大约在66%-67%之间。

Fast RCNN主要是解决RCNN的问题的

  • 测试训练速度慢,主要是提取候选区域的特征慢
    R-CNN首先从测试图中提取2000个候选区域,然后将这2000个候选区域分别输入到预训练好的CNN中提取特征。由于候选区域有大量的重叠,这种提取特征的方法,就会重复的计算重叠区域的特征。在Fast-RCNN中,将整张图输入到CNN中提取特征,在邻接时在映射到每一个候选区域,这样只需要在末尾的少数层单独的处理每个候选框。
  • 训练需要额外的空间保存提取到的特征信息
    RCNN中需要将提取到的特征保存下来,用于为每个类训练单独的SVM分类器和边框回归器。在Fast-RCNN中,将类别判断和边框回归统一的使用CNN实现,不需要在额外的存储特征。

Fast R-CNN的结构

在这里插入图片描述
输入是整幅图像和多个感兴趣区域(ROI)的位置信息,在前面的网络层中并不会处理ROI信息,在后面的RoI pooling layer中,将每个RoI池化到固定大小的特征图中,然后通过全连接层提取特征。最后通过将提取的每个RoI特征输入到SoftMax分类器已经边框回归器中,完成目标定位的端到端的训练。
Fast R-CNN网络将整个图像和一组候选框作为输入。网络首先使用几个卷积层(conv)和最大池化层来处理整个图像,以产生卷积特征图。然后,对于每个候选框,RoI池化层从特征图中提取固定长度的特征向量。每个特征向量被送入一系列全连接(fc)层中,其最终分支成两个同级输出层 :一个输出个类别加上1个背景类别的Softmax概率估计,另一个为个类别的每一个类别输出四个实数值。每组4个值表示个类别的一个类别的检测框位置的修正。

ROI 池化层

ROI池化层前面的网络层是对整幅图像提取特征得到多个Feature Map。ROI池化层的输入就是这多个Feature Map以及多个ROI(候选区域),这里的ROI是一个矩形框,由其左上角的坐标以及宽高组成的四元组 ( r , c , h , w ) (r,c,h,w) (r,c,h,w)定义。

ROI池化层使用最大池化将输入的Feature Map中的任意区域(ROI对应的区域)内的特征转化为固定的 H × W H \times W H×W的特征图,其中 H H H W W W是超参数。 对于任意输入的 h × w h \times w h×w的ROI,将其分割为 H × W H \times W H×W的子网格,每个子网格的大小为 h H × w W \frac{h}{H} \times \frac{w}{W} Hh×Ww。如下,取得 2 × 2 2\times 2 2×2的特征图

  1. 输入的Feature Map
    在这里插入图片描述
  2. ROI投影到Feature Map上的左上角的坐标为 ( 0 , 3 ) (0,3) (0,3),宽高为 ( 7 , 5 ) (7,5) (7,5),在Feature Map上位置如下
    在这里插入图片描述
  3. 对每个子网格做最大池化操作
    在这里插入图片描述

ROI池化层的池化操作同标准的池化操作是一样的,每个通道都单独执行。

预训练网络

通过ROI池化层可以从整幅图像的特征图中得到每个ROI的特征图(固定大小),而整幅图像的特征图则使用预训练的网络提取得到。对于预训练完成的网络要做如下的修改:

  • 使用ROI池化层代替预训练网络的最后的池化层,并将超参 H , W H,W H,W设置为和网络第一个全连接兼容的值,例如VGG16,设 H = W = 7 H = W = 7 H=W=7
  • 原网络的最后一个全连接层替换为两个同级层: K + 1 K + 1 K+1个类别的SoftMax分类层和类别的边框回归层。
  • 网络的输入修改为两个:图像的列表以及相对应的ROI的列表

训练微调

R-CNN中的特征提取和检测部分是分开进行的,使用检测样本进行训练的时候无法更新特征提取部分的参数。SPPnet也不能更新金字塔层前面的卷积层权重,这是因为当批量训练的样本来自不同的图片时,,反向传播通过SPP层时十分低效。Fast R-CNN则可以使用反向传播的方法更新整个网络的参数。

Fast R-CNN提出一个高效的训练方法,可以在训练过程中发挥特征共享的优势。在Fast R-CNN训练过程中随机梯度下降(SGD)的mini-batch是分层采样的,首先取 N N N张图像,然后从每张图片采样 R N \frac{R}{N} NR个RoI。来自同一张图片的RoI在前向和后向传播中共享计算和内存。这样就可以减少mini-batch的计算量。例如 N = 2 , R = 128 N=2,R=128 N=2R=128,这个训练模式大概比从128个不同的图像采样1个RoI(这就是R-CNN和SPPnet的训练方式)要快64倍。

该策略一个问题是会导致收敛起来比较慢,因为来自同一张图片的RoI是相关的。但它在实际中并没有成为一个问题,我们的使用 N = 2 , R = 128 N=2,R=128 N=2,R=128达到了很好的成绩,只用了比R-CNN还少的SGD迭代。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值