目标检测(一)——R-CNN

简介

R-CNN作为经典目标检测算法,由Ross Girshick在CVPR 2014提出,获得了当时VOC2007,VOC2010等目标检测任务最优的成绩。


原理

完整R-CNN结构

不使用滑动窗口方法(候选框多,费时间)。
使用滑动窗口

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

测试步骤(以AlexNet网络为基准)

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

候选区域

选择性搜索(SelectiveSearch,SS)中,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。
选择性搜索
SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。 而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。

Crop+Warp

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

  • crop:截取原图片的一个固定大小的patch
  • warp:将原图片的ROI缩放到一个固定大小的patch
    无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。会使用一些方法尽量让图片保持最小的变形。
  • 各向异性缩放:即直接缩放到指定大小,这可能会造成不必要的图像失真。
  • 各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色。

最左边为原始目标,B为有上下文最紧方形,C为没有上下文的最紧方形,D为直接缩放为方形(可以看到有明显失真)。上排位0像素填充,下排位16像素填充。

CNN网络提取特征

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

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

特征向量训练分类器SVM

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

非极大抑制(NMS)

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

假设现在滑动窗口有: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

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

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

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

    修正过程(线性回归)

目标是为了找到最优的 w*

目标 t 如下


R-CNN训练过程

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

正负样本准备

对于训练集中的所有图像,采用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类别的负样本

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

预训练(pre-training)

CNN模型层数多,模型的容量大,通常会采用2012年的著名网络AlexNet来学习特征,包含5个卷积层和2个全连接层,利用大数据集训练一个分类器,比如著名的ImageNet比赛的数据集,来训练AlexNet,保存其中的模型参数。
所谓预训练,其实就是拿别人训练好的模型来用,但是还没有真的开始训练。

微调(fine-tuning)

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

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

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

SVM分类器

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

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

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

整个流程如下图所示


思考

R-CNN的缺点

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

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

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

  • 图片形状变化:候选区域要经过crop/warp进行固定大小,无法保证图片不变形

R-CNN分类为什么使用SVM而不是使用Softmax

究其原因最重要的还是在mAP的提升上,在VOC2007上采用Softmax而不是SVM会使mAP从54.2%下降到50.9%mAP。可见采用Softmax不是很合适。论文中提到可能的原因是因为,Softmax使用的图片定位都不是很精确(因为0.5IoU就作为正样本了,使用0.5IoU才能保证样本足够多去训练深度网络),但是SVM不需要特别多的数据,所以采用的是0.7IoU作为正样本,并且还可以使用 “hard negative” 加速收敛(因为SVM只关注支持向量)。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测是计算机视觉领域的重要任务,而Faster R-CNN作为目标检测领域的经典算法之一,具有较高的检测精度和鲁棒性。在睿智的目标检测系列中,我们将使用PyTorch搭建一个基于Faster R-CNN目标检测平台。 首先,我们将使用PyTorch构建一个深度学习模型的基础框架。PyTorch是一个开源的机器学习库,具有灵活的设计和易于使用的特点,因此非常适合用于搭建目标检测平台。我们将利用PyTorch提供的模块和工具,构建一个包含RPN模块、ROI pooling模块和分类回归模块的Faster R-CNN模型。 其次,我们将使用标记好的目标检测数据集,如COCO或PASCAL VOC数据集,对我们搭建的目标检测平台进行训练和验证。我们将利用PyTorch内置的数据加载和预处理工具,以及优化器和损失函数,对Faster R-CNN模型进行端到端的训练,以提高检测精度和泛化能力。 最后,我们将通过在真实场景下的目标检测任务中的应用,来验证我们搭建的Faster R-CNN目标检测平台的性能。我们将评估其在目标定位、多目标检测、不同尺寸目标检测等方面的表现,并对可能的改进和优化进行进一步的研究和实验。 通过这样一个基于PyTorch搭建的Faster R-CNN目标检测平台,我们将能够深入理解目标检测算法的原理和实现细节,提高对深度学习框架的应用能力,并为未来的研究和应用奠定基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值