【计算机视觉】目标检测 |滑动窗口算法、YOLO、RCNN系列算法

一、概述

首先通过前面对计算机视觉领域中的卷积神经网络进行了解和学习,我们知道,可以通过卷积神经网络对图像进行分类。
在这里插入图片描述

如果还想继续深入,会涉及到目标定位(object location)的问题。在图像分类的基础上(Image classification)的基础上,除了判断图像中的物体类别是什么,还需要给出其在图像中的位置,我们成为分类和定位的问题(Classification and localization)。但是相信你对目标检测问题也有一定了解,对于目标检测,它和前面两个问题就不是一个level了,目标检测需要识别图像中所有待识别的物体,给出其类别和位置。最大的不同点在于,目标分类和定位问题在于图像中仅仅只有一个物体,而目标检测并不是。

在这里插入图片描述
但是图像分类和目标定位的知识也会对目标检测问题有帮助。所以接下来我们再看一下分类问题和定位问题,它们也是学习目标检测的基础。

1.1:图像分类和定位

我们看到下面标准的图像分类的流程

  • 输入具有单个目标的图像
  • 通过卷积神经网络,得到特征向量
  • 输送给softmax进行分类
    在这里插入图片描述

当需要对图像中的物体在分类基础上,预测其位置时,直接在全连接的输出层加上一个预测bounding box预测层就行。
在这里插入图片描述

不看分类的话,也就是相当于预测四个连续值的回归问题,理论上肯定行得通。当然我们知道,卷积神经网络学习到的是图片的局部特征,为什么能预测位置呢?好像有些牵强。我自己的理解是,虽然卷积神经网络好像只是学习到了一些局部的纹理特征,它肯定还是学习到了或者说保存了特征的位置信息(比如你想一想,特征的位置不一样,图像中那个位置的响应也不一样)所以我个人目前的理解来说,我可以理解。

💐后来我仔细查找资料的印证:

  • 特征图的生成: CNN通过一系列的卷积和池化操作,从原始图像中提取有用的特征,并生成一个称为特征图的输出。特征图实际上是源图像的一个缩小版本,其中每个单元包含对应于源图像某一窗口的特征信息。这个特征图可以用于定位,因为每个特征单元的位置信息可以映射回源图像的相应位置
  • 全连接层: 尽管卷积层和池化层能有效提取并保留空间信息,但通常我们在网络的最后几层会使用全连接层来进行精确的定位。全连接层能从前层提取的所有特征中命中目标,这有利于精准的定位。全连接层中的每一个神经元与前一层的所有神经元都有连接。这意味着全连接层接收到的信息是全局的,每个神经元能看到整个图像,而不仅仅是像卷积层那样看到图像的一小部分。

接下来我们看一下,在这种问题背景下,我们该如何对图像进行标记呢?或者说,我们对训练过程中的真实值该如何表示呢?
在这里插入图片描述

  • Pc:表示的其实就是置信度,在标记中就只有0,1两种,表示有无了(实际上对Pc为0的我们也没有进行标记)。预测的结果就是0~1之间
  • bx,by,bh,bw:就是物体位置
  • c1,c2,c3其实也是分类预测softmax确定的,表示属于哪一类(Pc也是softmax那一层决定的,表示确定的这个类的置信度)

根据标签中pc是否为1,对于损失函数也有讲究

  • 如果pc1,那么就对其正常使用均方差或者设定好的的损失函数
  • 如果pc0,那么算均方差时我们只算(y预测-0)^2,其他7个值我们并不关心,我只看pc的预测有多准

同时,对于损失函数的选择,你可以对dx,dy,w,h选择均方差的损失函数,对c1c2,c3选择log形式的损失函数,这样搭配使用,也是完全OK的。

👉🏻总结一下:
图像分类是最基础的任务,它的目标是确定图像中的主要内容。例如,一个图像分类模型可能需要确定一个图像是猫、狗还是车。

单目标定位在图像分类的基础上增加了空间信息,即不仅需要确定图片中的主要内容,还需要定位出这个主要内容在图片中的位置。这通常通过在图像上放置一个边界框来完成

  • 特征提取:CNN架构主体通常由交替的卷积层和池化层构成,可以自动地从输入图片中学习并提取有用的特征。
  • 分类:在特征提取之后,最后一层通常是一个全连接层,用于分类任务。这些特征送入全连接神经网络作为输入,进行最终的分类处理。
  • 单目标定位:在单目标定位任务中,CNN不仅进行分类,还需要定位主要目标的位置。在输出层中,除了类别概率,还会添加4个单元来预测物体的边界框(中心点坐标以及宽和高)。

1.2:关键特征点检测

其实上文中,识别物体类别,并且定位到四个关键点(方框的四个角点)可以推广到更普遍的情况。

在这里插入图片描述

1.3:我的困惑和解决

不论可解释性的情况下,目标检测为什么不能一次性输入图片,然后像图像分类那样通过一个卷积层,直接输出所有预测结果?

首先我其实是没有真正理解神经网络的本质!我们目前学习到的神经网络,或者说一般的、用于预测的神经网络,它的输出都被设计为固定的,或者说我们期待的预测结果的格式就是固定的,我们已经知道只可能是有或者没有物体!比如,上面图像分类和定位,就只有8个输出,表示类别、置信度和位置。这也是为什么对于目标检测这种,输出结果不完全确定的,具体来说,目标的个数以及位置不确定,不能用简单的卷积神经网络来设计从而解决。

  • Q:如果不考虑可行性,真的下设计一个用简单神经网络输出目标检测,它的根本的不可行性在哪里,请说的更直白透彻一些,结合卷积神经网络

  • A:确实,我们可以理论上设计一个简单的卷积神经网络用于目标检测,但是会遇到一些根本的问题,这是由卷积神经网络的固有属性决定的。我将基于卷积神经网络(CNN)的工作原理和目标检测问题的特性来说明这个问题。

    • 输出空间的固定性 vs 输出空间的动态变化性: 卷积神经网络一般被设计用于解 决具有固定大小输出空间的问题,如分类、回归等。对于分类任务,CNN的最后一层通常是全连接层,输出空间的大小等于类别的数量,这是固定的。然而,目标检测问题的输出空间大小是不确定的,因为每张图片中的目标数量是变化的,每个目标需要一个边界框和一个类别标签作为输出,所以输出空间大小是动态的。
    • 欠拟合和过拟合问题: 简单的网络模型在复杂任务上可能会出现“欠拟合”问题。如果我们设计一个简单的CNN进行目标检测,可能会损失太多细节信息导致不足以检测出所有目标。相反,如果我们使模型变得更复杂,可能会导致"过拟合"问题,使模型不能有效地泛化到新的未见过的数据。
    • 位置不变性 vs 识别精度: CNN具有位置不变性,意味着无论目标在图像中的位置如何变化,网络都可以检测到。这在许多任务中是有用的,如图像分类。但在目标检测中,我们不仅要识别目标的类别,还要准确地判断出其在图像中的位置。简单的卷积神经网络可能在保持较高的识别精度的同时,无法保证较高的定位精度。
    • 尺度问题: CNN的另一个特性是它对于较大的尺度变化不敏感,这意味着同样的模型对于不同尺度的目标可能会失效。在目标检测中,一个图像中的目标可能会有不同的尺度,且尺度的变化可能很大,简单的CNN由于其固有的尺度不变性,会很难在所有尺度上都检测到目标。

    综上所述,虽然我们可以尝试用简单的卷积神经网络来进行目标检测,但由于上述的一些限制,仅用一个简单的CNN很难有效地处理目标检测问题。这就是为什么我们通常需要用到更复杂的、专门设计用于处理目标检测问题的网络模型,如Faster-RCNN, YOLO, SSD等。

所以为什么讲到锚框,也就是说,让先生成一些大差不差的边界框,然后把这些边界框(或者理解成由边界框裁剪后的图片)输入神经网络,向上文讲的图像分类和定位那样,进行分类和位置预测。

所以到这里,我们可以把单目标分类和预测,看作目标检测的一个子任务。事实上在二阶段目标检测中用到的正是这种思想(当然具体实现细节还需要探讨,但大致思想是这样)。
在这里插入图片描述

🌸总结,目标检测网络的主要任务,可以分解为两个部分:

  • 一个是提议或生成潜在边界框(称为候选框或区域提议)
  • 另一个部分就是单目标定位,将每个候选区域分类并矫正其边界框。所以,你看,目标定位实际上就是嵌套在目标检测这个更复杂问题中的一个关键子任务。

在更具体的视觉,例如YOLO(You Only Look Once)或者Faster R-CNN等目标检测框架,单目标定位就更显其重要性。在YOLO中,整个图像被划分为SxS个格子,每个格子负责预测一个包含对象中心的边界框;在Faster R-CNN中,RPN(Region Proposal Network,区域提议网络)输出的各种候选框,会进入ROI Pooling等一系列处理后,通过全连接层进行边界框回归和类别分类,这就是单目标定位的部分。
因此,我们可以说,单目标定位确实是目标检测中的一个子模块。而目标检测可以理解为对单目标定位的一种扩展,它能够处理任意数目和类别的对象。

当然这只是一个宏观上的理解,我们差不多搞清楚了单目标定位和分类和目标检测的区别和联系,也知道目标检测要比前者复杂很多,当然部署一两段话可以具体解释清楚,下面就详细来看把!

我个人学习后觉得核心在于两点

  • bounding box的生成方式
  • 子任务 (单目标分类和检测) 是如何和目标检测问题相链接或者说组合的

二、目标检测

2.1:滑动窗口算法

滑动窗口是模板检测过程中锚框生成的一种方式。

  • 首先,我们定义一个固定尺寸的窗口,这个窗口的尺寸应该与我们期望检测的目标的尺寸大致相同。
  • 初始时,我们将窗口放置在图像的左上角,然后得到锚框窗口内的图像。将其用送入卷积神经网络进行分类,判断是否包含我们关注的目标。
  • 然后,我们将窗口向右或者向下移动一定的步长,这个步长可以是窗口宽度或者高度的一半,也可以是更小的值。然后再对新窗口位置的图像进行同样的分类操作。
  • 我们重复上面的步骤,直到窗口滑过整张图像。
  • 然后调整锚框尺寸,重复上述步骤。

在这里插入图片描述

但是这种滑动锚框,获得图像,送入卷积神经网络的方法有一个很大的问题。我们可以看到,对于同一张图像,用这种暴力的方法可以生成上百万甚至更多的锚框,将其锚框内剪裁得到的图像,一个个单独地送入卷积神经网络进行预测,计算机成本和存储成本相当之大! 你可能会想减少滑动窗口滑动的stride,但是这样也会失去精准性。
在这里插入图片描述

滑动窗口在神经网络兴起之前也有被应用,那个时候,是将裁剪后的图像送入一个简单的线性分类器,这样的成本会相对较小。但是我们都知道,卷积神经网络的精准度肯定是要高于人工手动设计特征的分类器。

我们可以看到,先用锚框滑动窗口,让后裁剪图片送入卷积神经网络。注意到,锚框滑动窗口和卷积核滑动窗口的过程十分类似。实际上,可以把这个过程合二为一,减少一些计算量:

这个将滑动窗口思想和卷积神经网络相融合从而进行目标检测,由Pierre Sermanet等人于2013年发表的论文,题为"Overfeat: Integrated Recognition, Localization and Detection using Convolutional Networks"所运用。

首先,我们需要把得到全连接层也看成卷积的过程(在全连接层和卷积层之间加入适当的卷积核):
在这里插入图片描述
于是,如下图,对于原图像进行适当的填充,我们可以看到最后结果为2x2x4,其实就是代表有2x2个锚框得到的结果。这样将滑动窗口思想和卷积稍微结合,从而通过一次向前传播(端到端),而不是截取四个锚框分别向前传播四次,就节省了很大的计算成本。
在这里插入图片描述
这个方法虽然提高了检测效率,但是也有一些限制。例如,滑动窗口通常是固定大小的(因为锚框的得到其实是间接的,取决于最后一层输出层映射到原图像的大小,而这个映射关系是由网络决定),这就意味着如果物体的尺度变化很大,那么滑动窗口就很难覆盖到所有物体。但是总的来说,滑动窗口的思想开启了物体检测的新篇章,并且对后续的YOLO,SSD等一系列算法产生了深远影响。

2.2:YOLO算法

2.2.1:边界框的预测——YOLOv1概述

YOLOv1是属于One Stage:端到端目标检测。下面我们对其如何生成bounding box 以及大致思路进行了解。

🌸 思路

  • 首先将一幅图像分成 SxS 个网格(grid cell)(相当于将原图像进行SxS的裁剪,得到SxS个子图像,每个子图像进行单目标检测,不过这里的所有子图像是并行处理)。哪个 目标物体的中心落在这个网格中,则这个网格负责预测这个目标。更具体来说,一张图片,对应有7×7lables7x7表示有7x7个子区域,每个lables包括:有无物体、物体类别、位置、置信度等,这些值的按照物体被分配到哪个子区域进行填写!一个物体可能横跨了多个子区域,但是它只在它的中心所在的那个子区域/网格的那个lable进行标记。

  • 但是实际每个子区域输入网络时,它还是按照单目标定位进行预测,也就是说,预测结果可能其他子区域也会认为存在物体,即使该物体的中心点不在此区域!

    在这里插入图片描述

  • 网络的最终输出是 7×7×30。还是以这个狗为例,7x7 很好理解,图像分为 7x7 个区域进行预测.最终输出 tensor 的前五个数值,分别是 bbox 的 x,y,w,h,c,即 bbox 的中心坐标 x,y,bbox 的宽高 w,h,bbox 的置信度。

  • 可以看到,虽然在逻辑上是分成7x7个区域“独立”完成目标定位的,但是整个过程是一次卷积,也就是onstage,端到端!
    在这里插入图片描述

  • 一个中心点,会检测 2 个 bbox ,这个操作可以减少漏检,因为可以适应不同形状的 bbox,进而提高bbox 的准确率。2 个 bbox 都会保留,最后通过 NMS 选择出最佳的 bbox
    在这里插入图片描述

  • 后面的 20 个,就是类别的概率,YOLO v1 是在 VOC 数据集上训练的,因此一共 20 个类。
    在这里插入图片描述

2.2.2:交并比(IOU)

交并比是衡量定位框是否准确的一种方法:
在这里插入图片描述

一般会把阈值设置为0.5,当然为了提高准确性,也可以将阈值设置为更高。

在这里插入图片描述

2.2.3:非极大值抑制(NMS)

作用:保证一个对象只对应一个且是最优的bounding box。

看下面这个例子,物体的中心点只存在于一个网格,但是其他网格(子区域)在进行预测时也有可能认为物体的中心在其中,或者说预测到同一物体。这个时候,同一个物体会得到多个bounding box

在这里插入图片描述

而NMS做的就是,去除冗余框,得到最优预测框。

在这里插入图片描述

那我们下面具体看看NMS是如何发挥作用的:

  • 首先看每个框所给出的置信度Pc,现在有5个bounding box,记为A、B、C、D、E。并将其按照置信度,从大到小排序:A、D、C、E、B
    在这里插入图片描述

  • 取出现在所有的bounding box置信度最大的那个框:A

  • 遍历剩下所有的bounding box:B、C、D、E,计算其与当前置信度最高的那个bounding box之间的IOU。B、C与A的IOU超过阈值,那么就扔掉B、C;并标记第一个矩形框A,是我们保留下来的。

  • 从剩下的矩形框D、E中,选择概率最大的D,然后判断E与D的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记D是我们保留下来的第二个矩形框。

    就这样一直重复,找到所有被保留下来的矩形框。
    在这里插入图片描述

上面示例中,因为图像中只有一个类别,所有运行一次NMS就找出来最后的所有边框。实际中,若有多个类别,如n个类别,则需要独立的运行n次NMS。

最后,了解了过程,让我们对非极大值抑制进行总结:非极大值抑制,即找到最大可能的边框,而抑制那些非最大值的边框,固称为非极大值抑制(non-max suppression)

2.2.4:锚框(anchor box)

我们上文讲到yolov1算法存在一个局限:一个子区域限定预测一个物体。如果物体很小,一个子区域存在多个物体呢?通过对子区域添加锚框,可以解决这个问题。这也是YOLOv2对v1的改进之处。

可以看到,下面的两个物体:people和car同时落在了一个网格/子区域中,上文我们知道,一个网格只能预测一个物体,那么此时就出现物体了。于是,为了改进这一点,对于一个网格我们提出2个(其实实际实现中不知2个)锚框(anchor box),同时lables和输出向量的通道数也要随之改变(如下图y的两个表示所示)。通过这种方式,一个网格(子区域)就可以预测多个物体了
在这里插入图片描述
在这里插入图片描述

下面是对有无锚框前后的对比总结:
在这里插入图片描述

2.2.5:整合:YOLO算法全流程

1、构建训练集:Training
  • 首先,将原图像划分为SxS网格
  • 对于每个子区域进行标记(原则是根据我们手动打的标签,代表真实物体的位置,从而判断物体的中心落在了这个网格,且在这个网格中的某个锚框的IOU最大,则将其归属于这个网格的这个锚框)
  • 比如在下面示例中,对于左上角蓝色方框,没有物体存在,所以两个锚框的Pc都标记为0表示没有一个锚框于物体相关联;对于绿色的网格,有物体存在,且在第二个锚框中的IOU最大,于是将第二个锚框的Pc标记为1,将bx,by,bh,bw赋值为物体真实位置。
    在这里插入图片描述
2、预测

根据物体真实位置构建好训练集后,训练好模型,即可进行预测。

在这里插入图片描述

3、非极大值抑制

得到预测结果会如下图所示(这里每个网格会有2个bounding box),我们还需要进行处理得到最终的结果。
在这里插入图片描述

  • 首先,我们去掉Pc小于IOU阈值的那些低置信度bounding box
    在这里插入图片描述
  • 然后,使用NMS非极大值抑制,去除冗余的bounding box。这里有2个类别,我们需要对每个类别分别运行一次NMS,得到最终结果
    在这里插入图片描述

2.3:区域推荐网络——RCNN算法

在这里插入图片描述

R-CNN算法最早在2013年被提出,它的出现打开了运用深度学习进行目标检测的大门,从此之后,目标检测的精准度与实时性被不断刷新。R-CNN系列算法自提出之际,就非常引人注目,以至于在之后的很多经典算法中,如SSD、YOLO系列、Mask R-CNN中都能看到它的影子。

R-CNN、Fast R-CNN采用的还是传统的SS(selective search)算法生成推荐区域,计算非常耗时,达不到实时检测的效果。直到Faster R-CNN才使用 RPN(region proposal network) 代替了原来的SS算法,才使得目标检测的时间大大缩短,达到实时性的效果。

2.3.0:Selective Search

来源于传统的计算机视觉技术。在深度学习流行起来之前,传统的计算机视觉技术(例如图像分割、特征提取和局部普适性)常常被用来处理图像识别的问题。

下面是Selective Search的基本思路:

  • 多尺度分割: 首先,基于不同的尺度进行图像分割,产生初始的区域。导出的每一个区域都被看作是潜在的目标对象。

  • 区域合并: 然后,对这些区域进行合并,根据颜色相似性、纹理相似性、尺寸相似性和形状相兼容性等特征,逐渐将相似的区域进行合并。将合并生成的新区域也视为对象的候选区域。

  • 利用多种策略: 在这个过程中,Selective Search会使用多种不同的搜索策略,包括颜色空间、相似度度量、起始区域等,以尽可能多地覆盖到各种类型的对象。

  • 最后,这个步骤会生成大约2000个区域建议。然后,这些区域建议将作为RCNN模型的输入,进行深度学习目标检测。

    但需要注意的是,虽然Selective Search方法提出了很多候选区域来增加检测到物体的机会,但这也增大了计算开销,并且合并过程中可能会过度合并,导致目标物体丢失。因此,后来的Fast R-CNN和Faster R-CNN都尝试优化这个步骤,提高检测效率。

2.3.1:R-CNN

R-CNN(全称Regions with CNN features) ,是R-CNN系列的第一代算法,其实没有过多的使用“深度学习”思想,而是将“深度学习”和传统的“计算机视觉”的知识相结合。比如R-CNN pipeline中的第二步和第四步其实就属于传统的“计算机视觉”技术。使用selective search提取region proposals,使用SVM实现分类。

在这里插入图片描述

🌸 思路

  • 首先用SS算法提出1000~2000多个候选区域(region proposal)
  • 每一个候选区域进行wrap,送入CNN,进行特征提取得到1*4096的特征向量。
  • 将特征向量送入每一类的SVM,进行分类,判断是否属于这一类
  • 对已经分好类的region proposal进行线性回归分类,得到更精细的bounding box

R-CNN算法的检测效果很好,但是检测速度很慢,因此总体效率不高。其主要原因在于:
🦆 缺点

  1. 首先我们看到,生成的每一个候选区域都需要单独的送入CNN进行分类和回归,一张图片有1000~2000个region proposal,那么就需要进行1000~2000次向前传播。
  2. 要单独的训练3个模型,分开训练,耗时耗力
    • CNN:提取图像特征
    • SVM预测类别
    • 回归器来修正bounding box
  3. selective search属于传统计算机视觉,这个过程耗时,大约需要2s

2.3.2:Fast R-CNN

2015年,Ross Girshick等人在R-CNN的基础上进行了改进,解决了上述影响R-CNN效率的前两个问题。与R-CNN相比,训练速度快了9倍;测试速度快了213倍;在Pascal VOC数据集上,准确率从62%提升到了66%。
在这里插入图片描述

🌸 思路

  • 依然首先用SS算法提出1000~2000多个候选区域(region proposal)
  • 但是不是候选区域单独输入进CNN,而是一次性将整个图片输入进CNN,得到整张图片的特征图。
  • 将region proposal对应的区域和特征图区域进行映射,获得每个候选区域在特征图上的相应特征矩阵
  • 每个特征矩阵进行池化,到7x7独立的输入进全连接层,单独的进行分类和回归

🦆 Fast R-CNN的改进点:

  • ROI Pooling层。 这个方法是针对R-CNN的第一个问题提出来的,用来解决提取特征操作冗余的问题,避免每个推荐区域都要送入CNN进行前向计算。核心思路是:将图像只输入CNN提取特征,只进行一次前向计算。得到的特征图由全部推荐区域共享。然后再将推荐区域(SS算法得到)投影到特征图上,获得每个推荐区域对应的特征图区域。最后使用ROI Pooling层将每个特征图区域下采样到7*7大小。
  • 将原来三个模型整合到一个网络,易与训练。R-CNN算法使用三个不同的模型,需要分别训练,训练过程非常复杂。在Fast R-CNN中,直接将CNN、分类器、边界框回归器整合到一个网络,便于训练,极大地提高了训练的速度。

🔺 Fast R-CNN的瓶颈:

虽然Fast R-CNN算法在检测速度和精确度上了很大的提升。但是它仍然不能满足实时目标检测,最大的原因在于:采用SS算法生成推荐区域的方法很耗时,处理每张图像大约需要消耗2秒,大大限制了目标检测的速度。

2.3.3:Faster R-CNN

2015年,由任少卿、何凯明、Ross Girshick、孙剑组成的微软研究团队,提出了Region Proposal Networks取代了原来的SS算法,几乎不消耗计算时间,使得生成推荐区域过程变得非常高效,解决了Fast R-CNN的瓶颈问题。

Faster R-CNN算法将Region Proposal Networks与Fast R-CNN进一步合并为一个单个网络。当采用非常深的VGG-16模型作为骨干网络时,基于该方法的检测系统在GPU上的帧速率为5fps,基本达到实时检测的水平。同时在PASCAL VOC2007、2012和MS COCO数据集上,其检测精度也达到了最好的水平。
在这里插入图片描述

如上图所示,Faster R-CNN算法流程主要有以下4个步骤:
🌸 思路

  • Conv layers。首先将图像输入到CNN(VGG-16)提取图像特征,得到的feature maps 将被共享用于后面的RPN和ROI Pooling。
  • Region Proposal Networks。RPN用于生成推荐区域。该网络通过softmax判断anchors属于positive还是negative,再利用边界框回归修正anchors获得精确的推荐框proposals。
  • ROI Pooling。该层以feature maps和proposals同时作为输入,综合这些信息后提取proposal feature maps,送入后续全连接层判定目标类别。
  • Classifer。将proposal feature maps输入全连接层与预测proposals的类别;同时再次进行边界框回归,获得检测框最终的精确位置。

RPN的工作过程如下:

  • 特征提取: RPN首先接收一个输入图像,并通过一个共享的卷积神经网络(如VGG或ResNet)提取特征图。这一特征提取过程与之前的R-CNN和Fast R-CNN相同。提取的特征图包含了图像的形状和纹理信息。
  • 生成一定数量的-锚框(Anchors): 在特征图上的每个位置(对应原图的多个像素区域),RPN生成一系列预设尺度和比例的锚框。比如,可以在每个位置上生成3种尺度和3种宽高比的锚框,共9个锚框。这个步骤用于尝试覆盖到各种尺度和形状的目标。
  • 预测候选区域: 对于每个锚框,RPN使用一个小网络结构(通常包含几个卷积层和全连接层)独立地预测两个内容:一个二元分类判断(即“是否含有目标”),以及一个边界框回归(具体地调整位置和尺寸)。如果分类预测为正(即含有目标),则此锚框作为一个候选区域。
  • NMS筛选: 由于生成的候选区域可能有大量的重叠,RPN会通过非极大值抑制(Non-Maximum Suppression,NMS)来消除冗余的候选区域。在NMS中,对所有候选区域按照分类预测的分数排序,取最高分的区域,并移除与其重叠度过高(如IoU超过0.7)的其他候选区域。然后重复这个过程,直到所有候选区域都判断完毕。
  • 输出候选区域: 最终,RPN输出经过筛选的一定数量(如2000个)的候选区域,限制输出的候选区域数量,得到一定数量的候选框用于后续的对象检测过程。

总的来说,RPN生成的锚框数量是固定的,但是通过分类预测和NMS筛选后,输出的候选区域数量是不固定的,依赖于具体的图像和对象。

2.3.4:对比YOLO

Faster R-CNN和YOLO(You Only Look Once)是两种不同的目标检测框架,而他们主要的时间成本差异在于处理候选区域的方式。

Faster R-CNN首先使用Region Proposal Network(RPN)生成候选区域(或称为Region of Interest, ROI),然后每个ROI都经过ROI Pooling变为统一大小的特征图,再输入到全连接层进行分类和边界框回归。因此,Faster R-CNN必须对每个ROI进行单独处理,这就涉及一定数量的逐个操作,因此相对来说会稍慢一些。
而YOLO则采用了一种全图预测的策略:它将输入图像划分为一个个格子,每个格子预测一定数量的边界框和分类概率。这个过程是全图矩阵操作可以并行计算,因此相对于Faster R-CNN会快一些。

但是值得注意的是,这两种方法在准确率和召回率上可能存在差异。由于Faster R-CNN使用了RPN来生成候选区域,所以有可能在复杂背景和遮挡严重的情况下获得更好的结果。而YOLO由于其对整个图像的一次性处理,可能在处理小对象和大量对象时有更好的效果。具体使用哪种方法,可能需要根据具体任务和数据进行选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统化学习】进程等待

目录 进程等待 进程等待的必要性 进程等待的方法 wait方法 等待一个进程(阻塞等待) waitpid方法 任意等待多个进程(阻塞等待) 父进程获取子进程的退出信息 非阻塞轮询等待 进程等待 进程等待的必要性 之前讲过,子进程退…

【深入浅出Java性能调优】「底层技术原理体系」详细分析探索Java服务器性能监控Metrics框架的实现原理分析(Dropwizard度量基础案例指南)

深入探索Java服务器性能监控Metrics框架的实现原理分析 前提介绍Dropwizard MetricsDropwizard的特点Dropwizard的开发案例需要引入Maven依赖常用度量类型Meter(每秒请求数为单位测量请求率)定义度量核心MetricRegistry构建对应的Meter指标对象请求标记采样业务方法控制报告器…

chisel 语法

// TODO: find out the new way to have a reset signal class KnightRider(resetSignal: Bool null, frequ: Int)//extends Module(_reset resetSignal) {extends Module {val io IO(new Bundle {val led Output(Bits(6.W))})//定义了一个枚举类型,包含两个状态…

【Linux Day15 TCP网络通讯】

TCP网络通讯 TCP编程流程 接口介绍 socket()方法是用来创建一个套接字,有了套接字就可以通过网络进行数据的收发。创建套接字时要指定使用的服务类型,使用 TCP 协议选择流式服务(SOCK_STREAM)。 **bind()方法是用来指定套接字使…

Quppy wise 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号

Quppy 注册教程,轻松通过欧洲银行同名转账绑定个人IBAN账号 官网下载APP或者去香港区下载APP使用, 按照官方APP里的邮箱注册就行,成功后添加电话和个人信息;需要说明的是:网站所填内容请全部用真实身份填写;名在前,姓…

蓝桥杯每日一题-----数位dp

前言 今天浅谈一下数位dp的板子,我最初接触到数位dp的时候,感觉数位dp老难了,一直不敢写,最近重新看了一些数位dp,发现没有想象中那么难,把板子搞会了,变通也会变的灵活的多! 引入…

列式数据库、行式数据库简介

列式数据库、行式数据库简介 1、数据准备2、行式数据库3、列式数据库4、行式、列式存储对比 常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常…

2024/1/30 dfs与bfs

想要了解dfs与bfs,就得了解队列和栈。 一、栈与队列 1.栈 栈说白了就是先入后出。把栈类比为一个容器。只有一个口,所以如果我们想要取出最底层也就是最先放入的元素,只能最后取出它。 栈基础操作有如下几种: push 放入pop 拿…

python 爬虫安装http请求库

我的是window环境,安装的python3,如果再linux环境:pip install requests 开始: 上面我们成功发送请求并获取到响应,现在需要解析html或xml获取数据,因此我使用现成的工具库Beautiful Soup

leetcode刷题(剑指offer) 297.二叉树的序列化和反序列化

297.二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现…

图论练习3

内容:过程中视条件改变边权,利用树状数组区间加处理 卯酉东海道 题目链接 题目大意 个点,条有向边,每条边有颜色和费用总共有种颜色若当前颜色与要走的边颜色相同,则花费为若当前颜色与要走的边颜色不同,…

shell脚本中的变量,运算符

1.脚本格式 我们一般将shell脚本写在xxx.sh文件中,执行的时候bash/sh xxx.sh 注意文件路径 xxx.sh文件中的第一行为 #!/usr/bin/bash 注代表我们使用的是bin文件夹下的bash解释器(此条为注释语句,不写也可以) 2.echo用法 相当与print 示例1&…

ASP.NET Core 自定义解压缩提供程序

写在前面 在了解ASP.NET Core 自定义请求解压缩中间件的应用时,依据官方文档操作下来碰到了几个问题,这边做个记录。 关键点就是配置 Content-Encoding,参数需要和代码中添加的提供程序的Key保持一致; builder.Services.AddRequ…

9、C语言复习

目录 1、位操作 2、define宏定义关键词 3、ifdef条件编译 4、extern变量申明 5、typedef类别别名 6、结构体 7、static关键字 1、位操作 &&#xff1a;按位与 |&#xff1a;按位或 ^&#xff1a;按位异或 ~&#xff1a;取反 <<&#xff1a;左移 >>…

【实战知识】使用Github Action + Nginx实现自动化部署

大家好啊,我是独立开发豆小匠。 先说一下背景~ 我的小程序:豆流便签,目前使用云托管部署后端服务,使用轻量级服务器部署数据库和一些中间件。 因此服务器成本:云托管 + 云服务器 云托管每周花费5元,一个月就是50,一年就是500啊,所以这期准备把云托管优化掉! 1. 需…

x-shell安装、使用以及配置cuda、cudnn和conda

x-shell安装、使用以及安装最新版本conda x-shell安装远程连接服务器conda安装和环境配置 x-shell安装 x-shell是一款终端模拟软件&#xff0c;用于在Windows界面下远程访问和使用不同系统下的服务器。免费版本下载地址&#xff1a; https://www.xshell.com/zh/free-for-home-…

【Django】如何设置支持多语种网站,中文/英文网站

首先&#xff0c;需要明确一点&#xff1a;我们要实现的中英对照翻译&#xff0c;这个翻译不是浏览器翻译的&#xff0c;也不是Django帮你翻译。这个需要你自己事先手动翻译好&#xff0c;存放在专门翻译文件中&#xff0c;Django只是事后调用而已。 第一步 新建项目后&#x…

[职场] 英语面试自我介绍 #微信#笔记#媒体

英语面试自我介绍 英语面试自我介绍1 I am very happy to introduce myself here.I was born in Liaoning Province.I graduated from Nankai University and majored in International Trade.I like music and reaing books,especially economical books.It is my honor to ap…

测试人员的自我修养

QAS:是负责检查和评估软件产品质量的专业人员&#xff0c;他们通过执行一系列测试来确保软件产品的功能、性能和安全性符合设计要求。 当产品上线后&#xff0c;有 bug&#xff1a; “测试为什么没有测试发现这个问题&#xff1f;肯定是测试的责任&#xff01;” 当产品上线…

LabVIEW CVT离合器性能测试

介绍了CVT&#xff08;连续变速器&#xff09;离合器的性能测试的一个应用。完成了一个基于LabVIEW软件平台开发的CVT离合器检测与控制系统&#xff0c;通过高效、准确的测试方法&#xff0c;确保离合器性能达到最优。 系统采用先进的硬件配合LabVIEW软件&#xff0c;实现了对…