计算机视觉是一门研究如何使计算机具备类似人类视觉能力的科学,其核心目标是通过处理图像或视频数据,理解和解析实际场景。它结合了图像处理、模式识别、机器学习等技术,广泛应用于自动驾驶、医疗诊断、安全监控等领域。

目标检测

目标检测(Object Detection)是一种不仅能识别图像或视频中的物体,而且还能精确定位它们位置的计算机视觉技术。目标检测在多个领域中被广泛使用,例如,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍物的位置来规划行进线路。深度学习技术的出现极大地推动了目标检测领域的进展。

目标定位

在目标定位(object localization)任务中,我们假设图像中只有一个主要物体对象,我们不仅想知道它的类别,还想得到它在图像中的具体位置。

目标定位通常有两个输出分支:一个用于图像分类;另一个用于判断目标位置,通常使用边界框(bounding box)来描述对象的空间位置。

y=[pcbxbybwbhc1c2c3]\mathbf y=\begin{bmatrix}p_c\\b_x\\b_y\\b_w\\b_h\\c_1\\c_2\\c_3\end{bmatrix}

其中,pcp_c 为预测结果的置信度,可以简单理解为物体存在的概率,检测是否有除背景外的其他物体。如果图像中没有物体,即 pcp_c 为 0,则不关心其他数字。[c1,c2,c3][c_1,c_2,c_3] 为属于某个类别(cat, dog, child)的概率。边界框是围绕检测到的物体绘制的矩形。它由四个值定义:[bx,by,bw,bh][b_x,b_y,b_w,b_h] 是边界框的中心坐标以及框的宽度和高度。另一种常用的边界框表示方法是由矩形左上角的以及右下角的坐标决定。

接下来定义一个损失函数来指导网络学习。如均方误差

(y^,y)={i=18(y^iyi)2if y1=1(y^1y1)2if y1=0\ell(\hat{\mathbf y},\mathbf y)=\begin{cases} \sum\limits_{i=1}^{8}(\hat y_i-y_i)^2 & \text{if }y_1=1\\ (\hat y_1-y_1)^2 & \text{if }y_1=0 \end{cases}

通过反向传播,网络逐渐学会如何准确预测边界框和类别。

为了评估预测的边界框与真实情况的匹配程度,使用了一个称为交并比(Intersection over Union,IoU)的指标,用于测量预测和实际边界框之间交集和并集的比率。

IoU=ABAB\text{IoU}=\frac{|A\cap B|}{|A\cup B|}

IoU 值介于 0 到 1 之间,值越大,重合度越高。通常以 0.5 作为阈值来判断预测是否正确。

滑动窗口检测

很多时候图像里有多个我们感兴趣的目标。目标检测算法通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标。不同的模型使用的区域采样方法可能不同。

传统的暴力方法是从左到右,从上到下滑动窗口,然后对当前窗口执行目标定位。为了检测不同尺寸的目标类型,我们需要使用不同大小和宽高比的窗口。

对每个不同窗口的滑窗都进行检测后,同一个物体可能会被多个相邻的边界框检测到,产生多个重叠的、置信度不同的边界框。非极大值抑制 (Non-Maximum Suppression, NMS)的目的是确保每个物体只由一个最准确的边界框表示,清理掉冗余的重复框。

NMS的流程:

  1. 对所有预测框按置信度分数进行排序。
  2. 选择分数最高的那个框,将其输出为最终检测结果。
  3. 计算这个框与所有其他同类别预测框的交并比(IoU)。
  4. 删除所有与当前最高分框的 IoU 超过某个预定阈值(如 0.5)的框(因为它们很可能检测的是同一个物体)。
  5. 对剩下的框中置信度最高的重复上述过程,直到所有框都处理完毕。

滑窗法简单易于理解,但是计算量巨大。在一张图片上,你需要检查成千上万个不同位置、不同大小的窗口,效率极低。

R-CNN

R-CNN(Regions with CNN)首次成功地将深度学习(CNN)应用于目标检测任务,大幅提升了检测精度。

R-CNN 的核心思路非常直观,可以概括为以下三个步骤:

  1. 找出可能包含物体的区域:输入一张图像,使用一种“区域提议”算法生成约 2000 个可能存在目标的候选区域(Region Proposals)。
  2. 对每个区域进行特征提取:将每一个候选区域缩放(Warp)到固定大小,然后送入一个卷积神经网络(CNN)中,提取出一个固定长度的特征向量。
  3. 对特征进行分类和修正:使用一系列针对每个类别的线性支持向量机(SVM)对提取出的特征向量进行分类,判断它属于哪一类(或背景)。同时,使用一个线性回归模型对候选区域的边界框进行精细调整,使其更贴合真实物体。

R-CNN 避免对图像中的每一个可能位置和尺度进行穷举扫描,而是先找出最有可能包含物体的区域,极大地减少了后续处理的候选框数量。

Fast R-CNN: 改进R-CNN。整张图只通过CNN一次,得到特征图,然后将候选区域映射到特征图上(ROI Pooling),再进行分类和回归。大大加快了速度。

Faster R-CNN: 革命性的改进。引入区域提议网络(RPN),直接从特征图中产生高质量的候选区域,取代了耗时的选择性搜索,实现了端到端的训练

YOLO

YOLO(You Only Look Once)是一种简单而高效的目标检测算法。与R-CNN采取两步法深度学习目标检测模型(首先提出区域,然后分类物体)不同,YOLO 一次性完成所有操作。它将输入图像划分为SxS 的网格,每个网格负责预测中心点落在该网格内的目标。每个网格预测 B 个边界框和置信度以及 C 个类别概率。

这种基于网格的结构使 YOLO 能够在一次网络遍历中快速做出预测,显著减少了处理时间。然而,尽管 YOLO 在速度上表现出色,它可能会牺牲一些准确性。

SSD

SSD(Single Shot Multibox Detector)提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体。

SSD采用了不同尺度和长宽比的先验框(Prior boxes),预测的边界框是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置尺度或者长宽比不同的先验框。