C/C++教程

RCNN系列目标检测算法详解

本文主要是介绍RCNN系列目标检测算法详解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录

  • 前言
  • 一、两阶段检测算法发展历程
    • R-CNN
    • Fast R-CNN
    • Faster R-CNN
  • 二、Faster R-CNN原理解析
  • 总结

前言

本博文会好好再次整理一下排版和细节问题。

一、两阶段检测算法发展历程

R-CNN

在这里插入图片描述
如何将深度学习分类算法应用到目标检测?
用深度学习分类模型提取特征方法代替传统图像特征提取算法。

R-CNN核心思想
对每张图片选取多个区域,然后每个区域作为一个样本进入一个卷积神经网络来抽取特征。

R-CNN网络结构
在这里插入图片描述

R-CNN网络效果在这里插入图片描述

Fast R-CNN

核心思想: 简化R-CNN计算复杂度
在这里插入图片描述
在这里插入图片描述
Fast R-CNN 网络效果
在这里插入图片描述

Faster R-CNN

CNN:backbone
在这里插入图片描述

二、Faster R-CNN原理解析
  1. Faster R-CNN网络结构
    在这里插入图片描述
    CNN也成为backbone,骨干网络。
    通过cnn得到一些特征图作为输出,提取候选区域,而faster r-cnn对应部分就是RPN,RPN是上图虚线框的部分。
    首先我们会把输出的特征图的每一个点作为中心点,提前生成大小比例不同的框,这些框成为anchor。对于每一个anchor又会生成两个分支:第一个是分类分支,负责判断这张图上有木有东西,而并不关心框出来的这个物体是什么 ,比如是狗还是猫。第二个分支是回归分支,表示的是anchor离真实框有多远,期望的是我最后提取出来的候选框向真实框靠拢。接下来,我们会把RPN输出的候选框做一定的处理进入RoI pooling,也就是进入第二阶段的计算。第二阶段同样有两个分支,一个是分类分支,一个回归分支。在分类分支中,这里就需要判断这个物体是什么类别了,比如说框出来的物体是猫还是狗;回归分支,这里就会对预测框做进一步的微调,向真实框靠近。整体上,就真正实现了端到端的训练。

    简言之
    第一个阶段:产生候选区域

    1. 使用anchor替代Selective Search选取候选区域
    2. 选出包含物体的anchor进入ROI Pooling提取特征

    第二个阶段:对候选区域进行分类并预测目标物体位置

  2. Anchor
    在这里插入图片描述
    期望就是这些边界框包含所有的真实框,因此就会看到右边的图。
    在这里插入图片描述
    conv feature map,也就是上图的红色框,他就是CNN(骨干网络)输出的特征图,作为整体RPN的输入。首先它会经过一个33的卷积,然后分为两个分支,分别使用一个11的卷积得到一个分类分支和回归分支。通常我们会在每个像素点生成9种anchor,所以我们这里的K就是9。在分类分支中,就需要2维度来判断anchor中包不包含物体,而在回归分支中就需要4维来判断anchor与真实框的位置。接下来我们再将RPN部分中的输出与anchor进行结合,最终得到RPN网络的一个输出,也就是这个最终的候选框proposals,我们也叫RoI,去进入到后续的网络计算。为了更好的说明左边的图,右边的图分部分更好举例说明来一下。输入为15126040的特征图,经过一个33的卷积得到一个12566040的特征图,也就在这个图上开始生成anchor,每个特征点有9个anchor,这是就有21600个anchor了(18=29,36=4*9)。最后呢,根据RPN的输出与21600个anchor来生成N个proposals,作为最终RPN的输出。

带着"RPN网络怎么训练?"与“如何根据RPN网络得到Proposals?”的两个问题来研究一下。
RPN网络训练策略:
a) 向RPN网络输入一个监督信息,判断Anchor是否包含物体
- Anchor包含物体 – 正样本
- Anchor不包含物体 – 负样本

b) 根据Anchor和真实框IOU取值,判断正or负样本

  • 正样本:
    • 与某一个真实框IoU最大的Anchor
    • 与任意真实框IoU>0.7的Anchor
  • 负样本:
    • 与所有真实框的IOU< 0.3的Anchor

c) 采样规则:
- 共采样256个样本
- 从正样本中随机采样,采样个数不超过128个
- 从负样本中随机采样,补齐256

正样本
这样就会出现一个真实框会对应多个正样本的anchor,但我们使用“与任意真实框IoU>0.7的anchor”就足够来确定正样本来。但是就会有一个特殊情况,有一个真实框与所有的anchor都小于0.7的话,我们就用第一个条件“与某一个真实框IoU最大的anchor”作为正样本。
负样本
大于0.3小于0.7我们就忽略。如下图所示。
在这里插入图片描述
橙色为正样本,蓝色为负样本,白色忽略不及为样本。
有21600个anchor,虽然忽略来不上样本,但是数量依旧很多,那么我们就采用一些规则来涮选一些样本出来。
在这里插入图片描述
得到来一些anchor之后,我们干什么呢?那么我们就需要明白RPN网络我们想要得到什么?
RPN网络监督信息
在这里插入图片描述
在这里插入图片描述
回归分支,如上图:
偏移量是什么呢?红色框是真实的框,黄色框是anchor,而我们要学的偏移量就是这四个黄色箭头,要是我们偏移量学的足够好的话,我们就可以用anchor和偏移量得到我们的预测框了,那么我们的预测框就能够和真实框足够地接近。
监督信息也就是上图两个红色箭头的过程,去计算这个偏移量,计算的方式就是上面的公式,(中心点和宽高)这样我们就可以生成四个监督信息来,也就是tx,ty,tw,th,也就是我们要学的偏移量了,也就是我们真实框离acnhor到底有多远。

现在我们有来RPN的输出以及RPN的监督信息,下面就可以计算RPN的损失函数loss了。
先看下图的计算公式,是分类分支和回归分支的加权和。
RPN网络Loss
在这里插入图片描述
注意上的p*,分类监督信息,只可能取值1或者0,只会作用于回归分支,也就是说回归分支只对正样本进行回归。
下面看一下具体的损失函数,分类分支采用二值分类交叉熵,回归分支采用smooth L1 loss。
在这里插入图片描述
看一下回归分支loss,看下面的函数表达式,是L1和L2loss的集合体。为什么要用这个函数呢?主要想法是,当预测框与监督信息差别过大时,我们不希望梯度值过大,当预测框监督信息差别很小时,我们希望梯度足够小,看下面loss的梯度,我们就知道“当预测框与监督信息差别过大时,我们梯度值不至于过大,当预测框监督信息差别很小时,梯度足够小
RPN网络回归分支Loss
在这里插入图片描述
在这里插入图片描述
以上,我们就完成来RPN的训练了,接下来呢,我们就将RPN的输出和anchor得到proposals,也就是RoI,来进入到后续的网络中。怎么做呢?首先,将RPN的输出和anchor进行解码来得到预测框,这个解码是干啥的呢?其实先前再将偏移量和监督信息的时候,有提到过,就是下图的过程,也就是要将偏移量应用到anchor上,去形成这个预测框,其实它是跟我们的真实框与anchor生成偏移量相反的逻辑。接下来呢,就会对这些预测框进行一个chip,也就是将预测框的位置限制在图片的范围之内,目前呢,还是保留了全量的预测结果。下面我们就会对这些预测框一系列地过滤。首先会将面积太小的过滤掉,接下来又会对他们的分数进行排序,将那些分数低的过滤掉,再接下来,我们又会进入到一个NMS的操作(目的去掉一些非常接近的目标框),NMS结束之后,又会对分数进行一个排序,将分数低的过滤掉。最终我们就会得到Proposals,通常我们会选择2000个框进入到后续网络计算。
在这里插入图片描述
在完成RPN之后,我们就得到了候选框了,接下来希望的是对这些候选框提取对用的特征。这个时候就会说到RoI Pooling这个操作了,之前在Fast R-CNN也提到过。这个RoI Pooling最早是在spp-Net中提出的,它的核心思想就是,所有的候选框都能共享一个特征图,并且保持最终的输出大小是一致的。那它具体做的事情呢,就是将候选框分为若干子区域,每个区域对应到原来的输入特征图上,取每个区域内的最大值作为该区域的输出。
RoI Pooling
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
RoI Pooling不足
在这里插入图片描述
每个子区域面积不对等的,也就存在信息不对等的。
RoI Align
核心思想:
消除RoI Pooling中产生的误差

在这里插入图片描述
看上图,我们就去除来RoI pooling两次取证的过程了。这是我们就需要解决下一个问题:如何通过子区域得到RoI对应的特征输出呢?我们看上图最右边,蓝色的网格,它每个交叉点,都可以理解为特征图上每个特征点的位置,在RoI pooling当中,其实每一个子区域都可以用蓝色交叉点的位置来表示的。在RoI Align当中,它是怎么做的呢?如下图所示:

在这里插入图片描述
在完成RoI pooling或者说RoI Align之后,我们就得到了RoI的特征来了,我们就可以进入第二阶段,也就是BBox Head了。
BBox Head
在这里插入图片描述
首先我们看一下BBox Head网络结构,输入也就是RoI的输出[512, 1024, 14, 14],经过一系列的卷积和pool,会得到Head Feature(512, 2048, 1, 1),然后这个特征图会经过两个FC,会得到两个分支,一个分类分支,一个回归分支。第二阶段,就需要对物体的类别进行分类了,同时,还需要对候选框的位置做进一步的微调,81是类别数,324是类别数乘以4的结果,最后再去计算一个loss。
预测部分,和fast rcnn很类似的,就是对head部分的输出做一个解码,得到一些预测框,然后再经过后处理,也就是NMS,也就得到来最终的预测结果了。

下面看一下BBox的训练过程:
为了保证正样本的数量,在采样的过程中,RoI是和真实框共同参与采样的,这样在采样的过程当中,就可能直接包含我们的真实框。
在这里插入图片描述
BBox Head中的监督信息
分类监督信息为2,我们会用一维度的向量「0, 0, 1, 0」来表示。
回归分支:16就表示有4个类别,如下所示
在这里插入图片描述
在这里插入图片描述
BBox Head Loss
在这里插入图片描述
Faster R-CNN效果
在这里插入图片描述

总结

下面继续更新关于两阶段的优化策略。

这篇关于RCNN系列目标检测算法详解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!