到目前为止,我们已经了解了 CNN 的基础知识和最近的创新。但 CNN 的应用不仅限于对图像进行分类。另一个有趣的领域是“对象检测”。在本文中,我们将了解它是什么以及它如何将计算机视觉带入商业应用。
从“什么”到“什么和在哪里”
想象一下,你正在看一张全家福。当你的大脑处理这张照片时,它不仅能识别出画面中有人类,还能识别出站在窗边的阿姨、坐在沙发上的表弟以及趴在地上的家犬。这种复杂的视觉理解体现了图像分类和物体检测之间的区别。
在我们之前对神经网络的探索中,我们深入研究了图像分类——教网络回答“这幅图像里有什么?”这个问题。物体检测则更进了一步,可以回答“这幅图像里有什么?”和“它到底在哪里?”
分类与检测:分类为整个图像分配单个标签,而检测则识别多个对象、标记每个对象并在图像中精确定位它们。
从分类到检测的演变代表了计算机视觉领域最具影响力的飞跃之一,它支持从自动驾驶汽车到医学成像和零售分析等各种应用。
输出三要素:Boxes, Labels, and Confidence
对于物体检测,我们的网络需要输出三个基本元素:
边界框——包围每个检测到的物体的矩形坐标(通常为 x、y、宽度、高度)
类别标签——每个检测到的物体的分类标识
置信度分数——模型对每次检测的确定性的概率估计。
这种多维输出使得对象检测比分类复杂得多。
该模型不仅必须识别识别物体的模式,还必须学会在图像内对它们进行空间定位。
两大系列:基于区域的方法与统一方法
物体检测算法沿着两种不同的架构理念发展:将区域提议与分类分开的两阶段检测器,以及将这些过程统一在单个分支中以提高速度的单阶段检测器。
让我们通过它们的先驱实例来探索这两种方法。
R-CNN:两阶段先驱
2014 年,Ross Girshick 及其同事推出了R-CNN(基于区域的卷积神经网络),建立了第一个成功的深度学习物体检测方法。这项开创性的工作引发了整个基于区域的检测器系列的诞生。
R-CNN 采用连续的两阶段流程进行运行:
- 区域提议——使用选择性搜索生成约 2,000 个潜在感兴趣区域 (RoI),即图像中可能包含我们想要识别的对象的提议区域
- 特征提取——从每个提议区域提取 CNN 特征
- 分类——应用SVM分类器识别每个区域中的对象
- 边界框细化——使用回归来提高定位精度(图像中物体的坐标)
R-CNN 首先将输入图像划分为多个区域或子区域。这些区域称为“区域提议”或“区域候选”。区域提议步骤负责在图像中生成一组可能包含对象的潜在区域。R -CNN 不会自行生成这些提议;相反,它依靠外部方法(如 Selective Search 或 EdgeBox)来生成区域提议。
例如,选择性搜索通过基于颜色、纹理和形状等各种图像提示合并或分割图像的各个部分来创建多样化的区域提议。
一旦生成区域提议,就会提取大约 2,000 个区域并将其各向异性扭曲为 CNN 期望的一致输入大小(例如224x224 像素),然后通过 CNN 提取特征。
在变形之前,区域大小会扩大到新的大小,从而在变形帧中产生16 个上下文像素。使用的 CNN 是AlexNet,它通常在 ImageNet 等大型数据集上进行微调,以实现通用特征表示。
CNN 的输出是一个表示区域提议内容的高维特征向量。
从区域提案中提取的特征向量被输入到针对每个感兴趣的对象类别的单独机器学习分类器中。R-CNN 通常使用支持向量机 (SVM)进行分类。对于每个类别,都会训练一个唯一的 SVM 来确定区域提案是否包含该类别的实例。
在训练过程中,正样本是包含该类实例的区域,负样本是不包含该类实例的区域。
除了对物体进行分类之外,R-CNN 还执行边界框回归。对于每个类别,都会训练一个单独的回归模型来细化检测到的物体周围边界框的位置和大小。边界框回归通过调整最初提出的边界框以更好地拟合物体的实际边界,有助于提高物体定位的准确性。
R-CNN 的准确率令人印象深刻,但也存在很大的局限性:
- 训练和推理速度缓慢——单独处理每个区域会导致冗余计算
- 多阶段流程——需要对 CNN、分类器和回归组件进行单独训练
- 存储开销- 必须将特性缓存到磁盘
为了解决 R-CNN 效率低下的问题,Girshick于 2015 年推出了Fast R-CNN,引入了三项关键创新:
- 单次特征提取——仅对整个图像计算一次 CNN 特征
- RoI 池化层——将区域提案投影到特征图上,消除冗余计算
- 多任务学习——同时训练分类和边界框回归
该方法比 R-CNN 实现了 9 倍的训练速度、213 倍的推理速度、更高的检测精度和具有多任务损失函数的端到端训练。
Fast R-CNN 背后的直觉非常聪明但又简单:如果我们要检查同一图像的多个区域,为什么要重复计算特征图?
我们还能用它做什么?
虽然 Fast R-CNN 大大提高了计算效率,但区域提议仍然是一个瓶颈。Ren 等人在 2015 年的论文“ Faster R-CNN:通过区域提议网络实现实时对象检测”中讨论了这个问题。
Faster R-CNN 的关键创新是区域提议网络(RPN):
- 同时预测物体边界和物体分数的全卷积网络
- 使用锚框——预先确定不同尺度和长宽比的框形状(我们将在本文后面进行研究)
- 与检测网络共享全图卷积特征,实现几乎免费的区域提议
RPN 会在每个滑动窗口位置评估多个区域提案,同时考虑不同的尺度和长宽比。这种方法可让网络了解哪些形状最能捕捉训练数据中的对象。
Faster R-CNN 在接近实时性能的同时实现了最先进的准确率,成为物体检测历史上的分水岭。
R-CNN 的遗产
R-CNN 家族不断发展创新,包括:
- R-FCN(基于区域的全卷积网络)——通过在整个图像上共享所有计算来提高速度
- Mask R-CNN——通过添加预测分割掩码的分支,扩展了 Faster R-CNN 以执行实例分割
- Cascade R-CNN——通过用越来越严格的 IoU 阈值训练的一系列检测器来提高定位精度
这些算法多年来一直代表着精确物体检测领域的最新水平,其中 Mask R-CNN 在研究和商业应用方面都具有特别大的影响力。
YOLO:“你只需看一次”
虽然 R-CNN 系列针对准确性进行了优化,但一场并行革命专注于速度。2016 年,Joseph Redmon 推出了YOLO,将物体检测重新想象为单阶段回归问题。
YOLO 的基本理念是将检测视为一个单一的回归问题,直接从图像像素映射到边界坐标和类别概率。顾名思义,YOLO 在一次前向传递中处理整个图像。
该模型有24 个卷积层、4 个最大池化层和 2 个全连接层。为了减少层数(通道数),我们使用1*1卷积,然后是3*3卷积。请注意,YOLOv1 的最后一层预测一个立方体输出。这是通过从最终全连接层生成(1, 1470)并将其重塑为大小(7, 7, 30)来实现的。来源。
YOLO 的理念是将一张图像分割成更小的图像。图像被分割成 S×S 大小的方形网格,如下所示:
物体中心(例如狗的中心)所在的单元格是负责检测该物体的单元格。每个单元格将预测B 个边界框和每个框的置信度分数。此架构的默认设置是模型预测两个边界框。分类分数将从 `0.0` 到 `1.0`,其中 `0.0` 为最低置信度,`1.0` 为最高置信度;如果该单元格中不存在物体,则置信度分数应为 `0.0`,如果模型对其预测完全确定,则分数应为 `1.0`。这些置信度水平捕获了模型对该单元格中存在物体并且边界框准确的确定性。
每个边界框由 5 个数字组成:x 位置、y 位置、宽度、高度和置信度。坐标 `(x, y)` 表示预测边界框中心的位置,宽度和高度是相对于整个图像大小的分数。置信度表示预测边界框和实际边界框(称为地面真实框)之间的 IOU。IOU 代表交并比,是预测框和地面真实框交集的面积除以相同预测框和地面真实框并集的面积。
以下是 IOU 的示例:真实框与预测框的交集面积(绿色)除以两个框的并集面积(紫色)。该值介于 0 和 1 之间,如果它们完全不重叠,则为 0,如果它们是同一个框,则为 1。因此,IOU 越高越好,因为它的预测越准确。来源:图片来自我修改的研究论文。
除了输出边界框和置信度分数之外,每个单元还预测对象的类别。
这种统一方法有几个优点:
- 速度惊人——初始 YOLO 每秒处理 45 帧,较小版本每秒处理超过 150 FPS
- 全局推理——通过“查看”整个图像,YOLO 的背景错误更少
- 可泛化表征——学习更多可顺利迁移到新领域的通用特征
然而,第一个 YOLO 也有局限性:
- 准确率低于两阶段检测器
- 难以处理小物体和密集群体
- 对于具有不寻常纵横比的物体,能力有限
YOLO 经过多个版本快速发展:
YOLOv2/YOLO9000介绍:
- 批量标准化
- 高分辨率分类器预训练
- 锚框可实现更好的预测
- 维度集群
- 细粒度特征
- 多尺度训练
- 检测和分类数据的联合训练
YOLOv3新增:
- 特征金字塔网络实现更好的多尺度检测
- 更复杂的主干网(Darknet-53)
- 不同尺度下每个位置的多个预测
- 每个类的二元交叉熵损失
YOLOv4及更高版本带来:
- 改进的架构和训练策略
- 马赛克数据增强
- 自我对抗训练
- 交叉小批量标准化
- 各种创新的特征融合技术
每次迭代都通过两阶段检测器缩小了准确率差距,同时保持了 YOLO 标志性的速度优势。最近发布的 Yolo v12 首次使用了 Transformer,不再使用基于 CNN 的架构。
其他单级检测器
在 YOLO 占据头条新闻的同时,其他重要的单阶段检测器也纷纷涌现:
- SSD(单次多框检测器) ——使用不同分辨率的多个特征图
- RetinaNet——引入 Focal Loss 来解决类别不平衡问题
- CornerNet——检测对象作为配对关键点
- FCOS——使用全卷积单阶段检测消除锚框
- CenterNet — 将对象建模为具有属性的点
现在,让我们看看训练过程是如何进行的?
训练物体检测模型比分类模型更复杂。让我们来探索一下关键组成部分:
损失函数
物体检测需要同时优化多个目标:
- 分类损失——确保正确的物体识别
- 定位损失——提高边界框精度
- 物体损失——区分物体和背景
对于像 Faster R-CNN 这样的两阶段检测器,这意味着单独的损失:
- RPN 分类(对象性)
- RPN 回归(框细化)
- 探测器分类(物体类别)
- 检测器回归(最终的框细化)
像 YOLO 这样的单阶段检测器使用统一的多部分损失函数,包含:
- 边界框坐标的均方误差
- 对象性的二元交叉熵
- 用于分类的分类交叉熵
锚点
大多数现代检测器使用锚框(作为检测模板的预定义形状)。这些锚框:
- 提供物体形状的初步猜测
- 允许网络专注于细化特定形状
- 启用在同一位置检测多个物体
锚点通常为:
- 以多种尺度定义(针对不同大小的物体)
- 使用不同的纵横比创建(适用于宽物体与高物体)
- 密集地分布在图像上
网络学习通过回归来调整这些锚点,而不是从头开始预测框坐标。
IoU 指标
交并比 (IoU) 是对象检测的基石指标:
IoU = 重叠面积 / 并集面积
IoU 具有多种关键作用:
- 训练期间——确定正/负锚点
- 用于评估——测量检测精度
- 在损失函数中——直接优化定位质量
- 对于后处理——过滤冗余检测
许多先进的检测器使用基于 IoU 的损失来直接优化我们关心的指标,而不是使用坐标差异等代理度量。
非最大抑制
物体检测器通常会对同一物体生成多个重叠的预测。非最大抑制 (NMS) 通过以下方式解决此问题:
- 按置信度对所有检测进行排序
- 选择置信度最高的检测
- 删除所有其他具有高 IoU 重叠的检测
- 重复,直到没有检测结果
尽管最近的方法试图使其可区分或完全消除它,但几乎所有检测系统中都存在这一关键的后处理步骤。
推理
当训练有素的检测器处理新图像时,推理流程包括:
- 预处理——调整大小、规范化和数据转换
- 特征提取——使用主干 CNN 计算视觉特征
- 提案生成(两阶段)或直接预测(单阶段)
- 框细化和分类
- 后处理——NMS 删除重复项
- 阈值——根据置信度过滤预测
单阶段检测器和双阶段检测器之间的主要区别在推理过程中最为明显:
- 两阶段推理遵循以下顺序过程:生成区域、对区域进行分类、细化边界框
- 单阶段推理只需一步即可将图像特征直接映射到最终预测
这种架构差异解释了单级检测器的速度优势,其通常需要较少的操作来产生最终结果。
网络如何“看见”物体?
为了真正理解物体检测,可视化这些网络正在学习的内容会有所帮助。让我们来看看检测网络的不同部分如何响应图像:
特征图和激活
主干 CNN 学习分层特征:
- 早期的层检测边缘、纹理和简单图案
- 中间层将这些组合成轮子、眼睛或窗户等部分
- 后续层可激活整个物体或特定物体部分
例如,在检测汽车时,某些过滤器可能会在以下情况下强烈激活:
- 水平边缘(用于汽车车顶和引擎盖)
- 圆形图案(用于车轮)
- 类似窗户的结构
权衡:准确度与速度
物体检测中的基本矛盾在于准确性和计算效率之间:
这种权衡推动了该领域的大部分创新,研究人员不断寻求突破可能的帕累托前沿。
结论
物体检测是计算机视觉向人类视觉理解迈进的一项基本能力。同时识别和定位多个物体的能力使机器能够以前所未有的复杂程度解读视觉场景。
正如我们所见,这种能力源自精心设计的架构、巧妙的学习策略和创新的损失函数的相互作用。无论是通过两阶段检测器的系统化区域分类方法,还是单阶段方法的统一回归,这些网络都改变了机器感知视觉世界的方式。