Tic商业评论

关注微信公众号【站长自定义模块】,定时推送前沿、专业、深度的商业资讯。

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

  • QQ空间
  • 回复
  • 收藏

基于区域的目标检测(Faster R-CNN, R-FCN, FPN)原理

lijingle 目标检测 2021-12-13 15:15 2780人围观

在本文中,我们将讨论基于区域的object detectors,包括Fast R-CNN、FasterR-CNN、R-FCN和FPN。

1.滑动窗检测器
自AlexNet赢得2012年ILSVRC的挑战以来,CNN的分类一直占据着主导地位。一种用于目标检测的蛮力方法是从左、右滑动窗口,并从上到下使用分类识别对象。为了在不同的观察距离上检测不同的对象类型,我们使用不同大小和纵横比的窗口。

我们根据滑动的窗户从图片上剪出小片区域小片区域是扭曲的,因为许多分类器只采取固定大小的图像。然而,这不应影响分类的准确性,因为分类器是训练来处理扭曲的图像。

将扭曲后的图像块输入CNN分类器,提取4096个特征。然后利用支持向量机分类器进行分类,并对边界盒进行线性回归。

滑动窗口检测器的系统流程。

下面是伪代码。我们创建了许多窗口来检测不同位置的不同对象形状。要提高性能,一个明显的解决方案是减少窗口的数量。
for window in windows

    patch = get_patch(image, window)

    results = detector(patch)
复制代码2.选择性搜索
我们使用区域提议方法来创建感兴趣区域(ROIS)来检测目标,而不是蛮力方法。在选择搜索(selective search)中,我们从每个像素作为自己的组开始。接下来,我们计算每个组的纹理,并将最接近的两个纹理组合起来。但是,为了避免在吞食其他区域时出现单一区域,我们更倾向于先将较小的群体分组。我们继续合并各地区,直到一切都合并在一起。在下面的第一行中,我们展示了如何增长区域,第二行中的蓝色矩形显示了在合并过程中生成的所有可能的ROIs。

3.R-CNN
R-CNN利用一种区域提案方法创建了大约2000 Rois(regions of interest)。这些区域被扭曲成固定大小的图像,并分别输入CNN网络。然后是完全连接的层,以分类对象和细化边界框。

以下是系统流程图。


使用更少但质量更高的ROIS,R-CNN运行速度更快,比滑动窗口更精确.
#伪代码

ROIs = region_proposal(image)

for ROI in ROIs

    patch = get_patch(image, ROI)

    results = detector(patch)
复制代码

4.Boundary box regressor

区域建议方法计算量大。为了加快这一过程,我们通常选择一个比较便宜的区域建议方法来创建ROIS,然后是一个线性回归器(使用完全连接的层)来进一步细化边界框。



5.Fast R-CNN
R-CNN需要许多proposals才能准确,而且许多区域相互重叠。R-CNN在训练和推理方面也比较慢.如果我们有2,000项proposals,每一项都由CNN单独处理,即我们对不同的ROI重复2,000次特征提取。
我们使用一个特征提取器(CNN)来首先提取整个图像的特征,而不是从零开始提取每个图像小区域的特征。我们还使用外部区域建议方法,如选择性搜索,创建ROIS,该方法随后与相应的特征映射相结合,形成用于对象检测的小区域。我们使用ROI池将小区域扭曲到固定大小,并将它们提供给完全连接的层进行分类和定位(检测对象的位置)。通过不重复的特征提取,快速R-CNN大大缩短了处理时间.


以下是网络流程图:


在下面的伪代码中,代价大的特征提取从for-循环中移出,这是一个显著的速度改进,因为它是对所有2000 rois执行的。快速R-CNN比R-CNN训练快10倍,推理速度快150倍。
feature_maps = process(image)

ROIs = region_proposal(image)

for ROI in ROIs

     patch = roi_pooling(feature_maps, ROI)

     results = detector2(patch)
复制代码Fast R-CNN的一个主要特点是对整个网络(特征提取器、分类器和边界盒回归器)进行端到端多任务损失(分类损失和定位损失)的训练。这提高了准确性。


6.ROI Pooling
因为FastR-CNN使用ROI pooling层,所以我们应用ROI池将可变大小的ROIS扭曲成一个预定义的大小形状。
让我们简化讨论,将8×8特征映射转换为预定义的2×2形状。
  • 左上角:我们的特征图。
  • 右上角:我们将ROI(蓝色)与特征图重叠。
  • 左下角:我们将Rois分割成目标维度。例如,对于我们的2×2目标,我们将ROIS分成4个部分,大小相似或相等。
  • 右下角:找到每个部分的最大值,结果是我们扭曲的特征图



因此,我们得到了一个2×2特征区域,可以输入到分类器和盒回归器中。

7.Faster R-CNN

Faster R-CNN依赖于外部区域建议方法,如选择性搜索。然而,这些算法运行在CPU上,而且速度很慢。在测试中,Fast R-CNN需要2.3秒才能做出预测,其中2秒用于生成2000 Rois.
feature_maps = process(image)

ROIs = region_proposal(image)         # Expensive!

for ROI in ROIs

    patch = roi_pooling(feature_maps, ROI)

    results = detector2(patch)
复制代码Faster R-CNN采用了与FastR-CNN相似的设计,除了用内部深网络代替区域建议方法外,ROIS是从特征映射中得到的。新的区域提议网络(RPN)在产生ROI时效率更高,每幅图像运行10 ms。

网络流程是相似的,但区域方案现在被卷积网络(RPN)所取代。



8.Region proposal network
区域提议网络(RPN)以来自第一卷积网络的输出特征映射作为输入。它在特征图上使用3×3滤波器,使用ZF网络这样的卷积网络(如下面),提出与类无关的区域建议。其他深网络,如VGG或ResNet,可以以速度为代价进行更全面的特征提取。ZF网络输出256个值,输入两个独立的全连接层来预测边界框和2个objectness分数。框是否包含一个对象。我们可以使用一个回归器来计算单个对象的得分,但为了简单起见,R-CNN使用了一个带有两类的分类器:一个用于“有一个对象”类别,另一个没有(即背景类)。


对于特征映射中的每个位置,RPN进行k个猜测。因此,RPN每个位置输出4×k坐标和2×k scores。下图显示带3×3滤波器的8×8特征图,共输出8×8×3 ROI(k=3)。右边的图表显示了由一个地点提出的3项proposals


在这里,我们得到三个猜测,我们将在稍后完善我们的猜测。因为我们只需要一个是正确的,如果我们的最初猜测有不同的形状和大小,这样会更好。因此,Faster  R-CNN不会提出随机的边界框proposals.相反,它预测了相对于一些称为anchors的参考框左上角的偏移量,如果我们的最初猜测有不同的形状和大小,这样会更好。因此,Faster  R-CNN不会提出随机的边界框.相反,它预测了相对于一些称为锚的参考框左上角的偏移量。

为了对每个位置进行k个预测,我们需要在每个位置都以k个anchors为中心。每个预测都与特定的anchors相关联,但不同的位置共享相同的anchors形状。

这些锚是精心预选的,因此它们是多样化的,并涵盖不同尺度和纵横比的现实生活对象,是比较合理的。这指引了最初的训练,更好的预测,并允许每一个预测专门在一个特定的形状上。这一策略使早期训练更加稳定和容易
Faster R-CNN使用更多的anchors。它配置9个anchors箱:3种不同的尺度,3种不同的纵横比。每个位置使用9个锚,每个位置产生2×9 scores 和4×9坐标。

anchors在不同的文件中也被称为先验或默认边界框。


9.R-CNN方法的性能
如下图所示,R-CNN的速度更快.



10.基于区域的全卷积网络(R-FCN)
让我们假设我们只有一个特征图检测右眼的脸。我们能用它来定位脸部吗?应该是的。因为右眼应该在面部图片的左上角,所以我们可以用它来定位脸部。

如果我们有专门用于检测左眼、鼻子或嘴巴的特征图,我们可以将结果结合在一起,以便更好地定位面部。
在速度更快的Faster R-CNN中,探测器使用多个完全连接层来进行预测.有了2000ROIs,它可能会使用更多的资源。
feature_maps = process(image)

ROIs = region_proposal(feature_maps)

for ROI in ROIs

    patch = roi_pooling(feature_maps, ROI)

    class_scores, box = detector(patch)         # Expensive!

    class_probabilities = softmax(class_scores)
复制代码通过减少每个ROI所需的工作量,R-FCN提高了速度。以上基于区域的特征映射独立于ROI,可以在每个ROI之外进行计算。剩下的工作要简单得多,因此R-FCN比R-CNN快得多.
feature_maps = process(image)

ROIs = region_proposal(feature_maps)         

score_maps = compute_score_map(feature_maps)

for ROI in ROIs

     V = region_roi_pool(score_maps, ROI)     

    class_scores, box = average(V)                   # Much simpler!

    class_probabilities = softmax(class_scores)
复制代码让我们考虑一个5×5的特征映射M,里面有一个蓝色的方形对象。我们将正方形物体等分为3×3区域。现在,我们从M创建一个新的特征映射,仅检测正方形的左上角(TL)。新的特征图看起来像下面右边的那张。只有黄色网格单元[2,2]被激活。

由于我们将正方形划分为9个部分,因此我们可以创建9个特征映射,每个特征映射分别检测到对象的相应区域。这些特征映射被称为position-sensitive score maps ,因为每个map检测对象的一个子区域(scores)。


假设下面的红色矩形是ROI proposals 。我们将其划分为3×3区域,并询问每个区域包含对象的对应部分的可能性。例如,左上角ROI区域包含左眼的可能性有多大.我们将结果存储到右图中的3×3投票数组中。例如,表决数组[0][0]包含我们是否找到正方形对象左上角区域的分数。

Apply ROI onto the feature maps to output a 3 x 3 array.


将分数映射和ROIS映射到投票数组的过程称为position-sensitive ROI-pool。这个过程非常接近我们之前讨论过的ROI-pool。我们将不进一步讨论它,但您可以参考我其他博客。

Overlay a portion of the ROI onto the corresponding score map to calculate V[j]
在计算位position-sensitive ROI-pool的所有值之后,类得分是其所有元素的平均值。



假设我们有C类要检测。我们将其扩展到C+1类,因此我们为背景(非对象)添加了一个新类。每个类别都有自己的3×3分数图,因此总共有(C+1)×3×3分数图。使用它自己的一组分数图,我们预测每个类的类别分数。然后,我们对这些分数应用一个软件最大值来计算每个类的概率。

以下是数据流图。对于我们的例子,我们有以下k=3。


至此结束





路过

雷人

握手

鲜花

鸡蛋
原作者: lijingle
我有话说......

TA还没有介绍自己。

电话咨询: 135xxxxxxx
关注微信