跳转至

Object Detectors

约 4580 个字 18 张图片 预计阅读时间 31 分钟

前文:Obejct Detection

碎碎念

又是一门自己研究的课哈哈哈

从这章开始就不怎么放英文内容了

然后Ai辅助学习(_ _)

Fast R-CNN

因为R-CNN 实在是太慢了,可以称为 Slow R-CNN,所以研究者提出了一种新的方法,可以更快的完成目标检测任务,并且实现端到端的学习,也就是 Fast R-CNN

可以看到,在训练耗时上,二者相差十倍,在推理耗时上二者差距更大

alt text

其相比 R-CNN 的改进就是,改变了卷积处理和扭曲图像的顺序,在扭曲图像之前进行卷积操作,大大减小了计算量,提高了检测效率,同时引入多任务损失来实现联合学习,当然这种方法的候选区域仍然是使用选择性搜索算法在原始图像上提出的。

alt text

我们先使用一张卷积网络对整张图进行处理,提取特征得到特征图,这会为我们提供高分辨率图像的卷积特征,然后在特征图上进行候选区域法提取候选区域,进行变换,变换到指定大小,然后使用区域网络(Per-Region Network) 完成分类

这会使得计算快很多,因为计算主要发生在骨干网络(Backbone) 中,也就是直接对原始图像输入提取特征图的地方,不过注意一下,这通常是通过预训练好的卷积神经网络(例如VGG16, ResNet等)来完成的,这样的网络通常包含多个卷积层和池化层,能够提取出图像的丰富特征,而且可以降低训练成本。

然后我们得到了特征图,然后我们在原始图像上再进行选择性搜索选择出一些感兴趣区域(Regions of Interest,RoIs),然后对其进行裁剪(Crop)和变换(Resize)得到特征图上的对应区域,并调整到统一大小,然后使用区域网络输出边界框和类别,这里发生的计算很少,所以会很轻量化

以 AlexNet 为例,骨干网路就是其所有的卷积层,而区域网络就是其最后两个全连接层。

至于残差网络 ResNet,我们使用最后一个卷积块作为区域网络,而使用其余卷积块作为骨干网络。

在后面的逐区域网络中,我们对每个 RoI 进行分类和边界框的回归操作,以识别物体的类别和位置,我们在每个 RoI 上预测物体的类别(class) 和精确位置(Bounding Box),输出的是每个候选框的类别标签和边界框坐标调整。

Crop Features

现在有一个问题,如何裁剪特征区域呢?

alt text

回忆起我们的感受野,我们在输入图像和特征图之间建立起了一个坐标系的映射关系,从而能够在特征图上定位到输入图像中的特定区域。这种办法可以高效地处理不同分辨率地特征,尤其适用于边界框的检测和定位任务。

我们使用骨干网络进行特征提取的时候,会将区域投射到特征图上,不过特征图的长宽比保持不变(如下图所示,640x480的图像,特征图大小为20x15),因为这个网络是全卷积的,所以这个卷积特征图中的每个点都对应于输入图像中的点,我们可以做的是该区域(绿色框)投影到特征图上,然后我们可以捕捉那个特征

alt text 我们这样做,那个投影区域可能不会完全对齐到卷积特征图的网格(比如说特征图中一个特征向量可能对应原始图像中的32x32大小的区域),所以我们需要将特征图上的感兴趣区域投影分成大致相等的几部分(如下图所示),或者固定数量且均匀分割的子区域

alt text

然后对每个子区域进行最大池化,得到一个区域特征向量,然后我们就得到了固定大小的特征图块

这意味着,尽管我们的输入区域可能有不同的大小,但是我们的RoI池化操作总是可以将其转化为应该相同的固定大小的张量,以便于我们将其提供给下游的CNN层,这样就便于我们去学习,当我们获得了上游梯度之后,我们就可以将其向下传播到图像特征中的相应区域

我们简单描述一下上述 Rol Pooling 的过程:

  1. 我们输入一张图像,其中绿色矩形框表示我们想要处理的候选区域(RoI)
  2. 我们将候选区域映射到 CNN 生成的特征图上,在特征图上,该区域对应到一个矩形(蓝色框)
  3. 我们将该区域划分为等大小的子区域网格,每个子区域包含特征图中一部分特征点。这步是Rol Pooling 的关键步骤。
  4. 我们在每个子区域中应用 最大池化(Max Pooling) 操作,提取出每个子区域的最显著特征值。
  5. 输出固定大小的特征图,便于后续处理

Rol Pooling 的优势:

  • 高效:RoI Pooling只对候选区域内进行池化,减少了计算量。
  • 统一尺寸:将不同大小的候选区域转换为固定大小的特征图,便于后续的全连接层处理。
  • 局部特征保留:通过最大池化操作,RoI Pooling能够保留候选区域内的显著特征,有助于提高检测精度。

但是 Rol Pool 存在一个问题,就是特征与原始区域可能存在未对齐的情况,这会影响检测精度,特别是当输入候选区域较小时,这种误差可能会明显影响模型性能。所以我们引入另一种对齐方法,就是 Rol Align

RoI Align操作的目标是消除这种量化引入的对齐误差。它首先按照RoI的精确坐标和大小(不进行量化)将RoI划分为固定大小的网格,每个子网格中选取多个固定采样点(通常是 4 个点,平均分布在每个子网格内)然后在每个网格内进行双线性插值,从而得到该网格的特征值。在每个子网格中,将采样点的特征值进行平均池化。这样,RoI Align可以提取出与原始RoI精确对齐的特征,从而提高检测的精度。

alt text

Faster R-CNN: Learnable Region Proposals

我们想找到一些使用神经网络的方法来实际计算候选区域的方法,希望继续改善这类算法,这就是 Faster R-CNN。Faster R-CNN 又由 Region Proposal Network (RPN)Fast R-CNN 组成。它在两阶段目标检测方法中引入了共享的特征提取器和端到端的训练机制,从而在精度和速度之间达到了良好的平衡。

具体一点,首先使用骨干网络来提取特征,然后插入一个很小的网络,叫做候选区域网络(Region Proposal Network,RPN),负责学习如何预测候选区域(如下图所示),从而提高准确性

alt text

Region Proposal Network(RPN) 是 Faster R-CNN 的关键创新之处。它直接在特征图上生成候选区域,使用滑窗机制在特征图上滑动,生成多个固定大小的锚框(anchor boxes),并为每个锚框预测是否包含物体(分类任务)以及调整框的位置(边界框回归任务)

具体来说,我们使用骨干网络将输入图像转化为特征图,这个时候,特征图与输入图像在位置上是对齐的,所以我们可以想象一个锚框(anchor box),是一个固定大小的边界框,并且在特征图上滑动(如下图所示),原始图像中锚框所包含的信息已经压缩到特征图对应位置的特征向量中了,所以我们可以根据这个特征向量判断原始图像中对应区域有没有对象,有的话大概在什么位置

alt text

然后,我们训练一个小的神经网络也就是 RPN,对这个锚框进行二分类(如上图所示),要么包括对象,要么不包括(或者说是输出得分,得分高就是对象,否则就是背景,当然原始论文中使用了两个值,正分数和负分数,本质上与一个得分一致),当然这是一个很粗糙的分类方法,因为包括对象的地方可能包括的不是一个完整的对象,所以我们需要使用一种之前提到的方法——边界框变换,这将会把固定大小的锚框(下图绿色框)变为实际的边界框(下图黄色框),使用回归损失来训练

alt text

事实上,在 RPN 中,我们将每个 anchor 分类成positive(正锚框)、negative(负锚框)和 neutral(中性锚框)。Poistive Anchors 表示与 GT(Ground Truth 真实边界框) 的IoU大于某个正阈值(通常为0.7),该锚框可以准确的覆盖到某个物体,被标记为整理,Negative Anchors 表示与 GT 的 IoU 值小于某个负阈值(通常为0.3),这些锚框主要是背景区域,而 Neutral Anchors 是那些正阈值和负阈值之间的锚框,这些锚框会被忽略,不会被用来计算损失,也就是不会影响模型的训练。这种分类方式有效地减少了噪声,并帮助 RPN 提高候选框生成的准确性。

当然,这个还有不足,那就是固定大小的锚框通常没有足够的能力来捕获所有我们想识别的对象,或者说其只能识别一种对象而无法识别数据集中可能出现的所有对象,所以我们在同一个地方使用若干个(或者说K个)不同形状的锚框来识别不同的对象,这些锚框具有不同的大小、纵横比,然后我们将所有位置的所有锚框的得分进行排列,取其中得分最高的一些进行识别和最终输出

alt text

这样我们就引入了很多超参数,比如说锚框的数量、比例和大小

当然,本质上 RPN 就是卷积层,一般来说会通过若干个 3x3 卷积和填充输出跟特征图大小一致的新特征图,然后使用 1x1 卷积作为检测头输出锚框的得分和变换,然后使用不同损失函数进行训练,最后 RPN 提出的网络进行最终的分类和位置细化(相当于第二次看图像进行判断),这一步也有两个损失,所以总的来说我们有四种损失(如下图所示),两个损失是针对 RPN 网络学习如何提出候选区域的,两个损失是针对检测的(用于输出目标类别和精确化位置)

alt text

RPN 的损失函数由两部分组成,以实现候选框的分类和回归:

  1. 分类损失:用于判断锚框是前景(目标)还是背景,通常使用二分类的交叉熵损失。
  2. 回归损失:用于调整锚框的位置和尺寸,使其更贴近实际物体。回归损失通常采用 smooth L1 损失。

损失函数的总和可以表示为:

\[\text{Loss}=\frac{1}{N_\text{cls}}\sum \text{L}_\text{cls}+\lambda \frac{1}{N_\text{reg}}\sum \text{L}_{\text{reg}}​\]

其中,\(N_\text{cls}\)\(N_\text{reg }\) 是分类和回归的正则化系数,\(\lambda\) 是平衡两个损失的权重。

给出效果比较

alt text

Faster R-CNN是目标检测的双阶段方法,这是因为算法内部有两个阶段的概念,第一个阶段就是骨干网络提取特征和RPN选择区域的阶段,将输出一些区域,第二个阶段是为每个区域进行位置细化和类别预测

alt text

Dealing with Scale

在现实生活中,我们需要探测不同尺度的物体,比如一张路口的照片里有不同大小的车辆,于是这就给我们带来了一个问题,如何提高我们检测器的尺度不变性(scale invariance) 呢?一个经典的想法是通过对原始图像进行多次缩放,生成一系列不同尺度的图像的图像金字塔(Image Pyramid) 但是这带来一个问题:太昂贵了,我们不能在不同尺度图像之间分享计算资源。

alt text

于是提出了另一种办法:多尺度特征(Multiscale Features)。在CNN的不同层级上独立地附加检测器,其核心思想是利用 CNN 不同层级地特征图来进行多尺度目标检测,但问题是早期的检测器不能充分利用骨干网络,也不能访问高层的特征图。我们需要增加一个自顶而下的特征融合,这就是特征金字塔网络(Feature Pyramid Network, FPN)。

FPN 的整体架构可以分为两个主要部分:自底向上的特征提取(Bottom-Up Pathway)自顶向下的特征融合(Top-Down Pathway)

  1. 自底向上的特征提取(Bottom-Up Pathway)
    • 这个部分通常是一个常见的 CNN 主干网络,如 ResNet、VGG 等。
    • 随着网络深度的增加,特征图的分辨率逐层降低,但语义信息逐步增强。
    • 在每一个关键层级(称为层次或“stage”)提取特征,构成多层次的特征图,比如 ResNet 中的 C2、C3、C4、C5 等特征图。
  2. 自顶向下的特征融合(Top-Down Pathway)
    • 在自顶向下路径中,将高层语义信息较丰富的特征图逐层上采样,并与自底向上路径中对应分辨率的低层特征图进行融合。
    • 融合方法通常是通过上采样(如双线性插值)以及 1x1 卷积来调整通道数,并将高层特征图与底层特征图相加,得到包含多尺度信息的特征图。
    • 这种融合后的特征图从浅到深分别命名为 P2、P3、P4、P5 等。
  3. 多尺度检测
    • 生成的金字塔特征图(P2 到 P5)都可以用于多尺度检测或分割任务。P2 适合小目标,P5 适合大目标。
    • 每个层级的特征图都可以独立地进行目标检测,使得模型能够同时处理不同大小的物体。

alt text

Single-Stage Detectors

我们知道 Faster R-CNN 是目标检测的双阶段方法,于是就引出一个问题:我们真的需要第二阶段嘛?我们貌似实际上可以只使用第一阶段来完成所有的任务,以此达到更快的速度,这也就是单阶段目标检测(Single-Stage Object Detection)

RetinaNet 是一种 单阶段检测器(Single-Stage Detector),专为目标检测任务而设计。单阶段检测器在一张图像的特征图上直接生成预测结果,不需要像两阶段检测器那样使用区域提议网络(如 R-CNN 系列)。RetinaNet 的主要创新是引入了 Focal Loss,解决了单阶段检测器中常见的正负样本不平衡问题,从而提升了小目标和稀有目标的检测精度。

alt text

在目标检测中,我们可能会遇到一个问题:类别不平衡。背景锚点远多于非背景锚点,这导致类别极度不平衡,因此为了解决这个问题就引入了一个新的损失函数——Focal Loss。

Local loss的定义如下:

\[ \text{FL}(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t) \]
  • pt​ 是模型预测为正类别的概率,定义为: $$ pt=\left{\begin{align} p,&\text{ if } y =1\ 1-p,&\text{ otherwise}\end{align}\right.​ $$ 这里 \(p\) 是模型预测为正类的概率,\(y\) 是真实标签。
  • \(\gamma\) 是一个调节因子,用于调整正负样本的平衡,论文中提到取值2时效果最好。
  • \(α_t\) 是一个平衡正负样本的权重系数,用于处理样本不平衡问题。

Focal Loss 通过引入调节因子 \(\gamma\),降低了易分类样本(即预测概率的样本)的损失权重,同时增加了(即预测概率低的样本)的损失权重,这样做的目的是让模型在训练过程中更加关注于难分类的严格不能,从而提高模型对少数类别的分类能力。

而在实际过程中,RetinaNet 也运用了特征金字塔网络来解决多尺度的问题。

alt text

FCOS (Fully Convolution One-Stage Object Detection) 是一种无锚框(anchor-free)和无提议(proposal-free)的单阶段目标检测算法。其核心是将目标检测问题转换为逐像素预测问题,类似于语义分割的方式进行目标检测。它避免了使用预定义的锚框,从而减少了训练过程中的复杂计算和与锚框相关的超参数调整。

FCOS会为每个GT框分配一个中心区域,坐落在真实框(GT框)内的像素点标记为正样本(positive),其余则标记为负样本(negative)。对于正样本,将其到 GT 框上下左右边界的距离通过 L2 损失函数进行回归这意味着,FCOS直接对图片的每个位置进行目标边框的回归,而不是依赖于预定义的锚框,FCOS还引入了逻辑回归损失函数来预测所有正样本的中心度(Centerness)。中心度是指一个像素点是否接近目标的中心,这有助于模型抑制低质量的预测框。

\[ \text{centerness} = \sqrt{\frac{\min(L,R)}{\max(L,R)}\cdot\frac{\min(T,B)}{\max(T,B)}} \]

Ranges from 1 at box center to 0 at box edges

alt text