计算机视觉基础与深度学习回顾
计算机视觉作为人工智能领域最活跃、应用最广泛的分支之一,其核心目标是使计算机能够从图像或视频中自动提取、分析和理解高层次的信息。从20世纪60年代早期的边缘检测算子到21世纪深度学习的爆发,该领域经历了多次范式革命。本章将系统梳理计算机视觉的发展脉络,明确其核心任务范式——图像分类、目标检测与图像分割——并深入剖析各自面临的技术挑战。随后,本章将回顾深度学习的基础理论,包括前馈神经网络的结构、反向传播算法的数学原理、常见损失函数与优化器的设计思想。为确保读者具备必要的工具支撑,我们还将复习线性代数与概率论中的关键概念,并介绍Python科学计算栈(NumPy、OpenCV)的核心用法。最后,通过配置PyTorch/TensorFlow开发环境并完成一个端到端的图像分类Demo,为后续章节中卷积神经网络与目标检测技术的深入探讨打下坚实基础。本章内容既是全书的理论起点,也是实践操作的入门指南,旨在帮助中级读者构建完整、连贯的知识体系。
计算机视觉的发展脉络与核心任务范式
计算机视觉的起源可追溯至20世纪50年代的神经生理学实验,科学家们通过研究动物视觉系统,试图理解生物如何感知世界。1966年,麻省理工学院的人工智能小组正式将“计算机视觉”列为项目,标志着其作为独立研究领域的诞生。早期工作主要集中在低层视觉处理,如边缘检测(Roberts算子、Sobel算子)、角点检测(Harris角点)和图像分割(区域生长、阈值分割)。这些方法高度依赖手工设计的特征和启发式规则,对光照、视角和遮挡变化极为敏感,应用场景极为有限。
20世纪90年代至21世纪初,统计学习方法成为主流。支持向量机(SVM)与方向梯度直方图(HOG)特征的结合,在行人检测等任务上取得了突破性进展。2006年,Hinton等人提出深度学习概念,但真正引发计算机视觉革命的是2012年AlexNet在ImageNet大规模视觉识别挑战赛(ILSVRC)上的惊人表现——其Top-5错误率比传统方法降低了超过10个百分点。这一成功归功于三个关键要素:大规模标注数据集(ImageNet)、高性能GPU计算以及卷积神经网络(CNN)对图像平移不变性的天然建模能力。此后,VGGNet、GoogLeNet、ResNet等架构不断刷新性能纪录,深度学习迅速成为计算机视觉的标配工具。
当前,计算机视觉已从单一图像理解扩展到视频分析、三维重建、神经辐射场(NeRF)等前沿方向,并深度融合于自动驾驶、医疗影像、工业质检等实际场景。理解其发展脉络,有助于我们把握技术演进的内在逻辑:从手工特征到自动特征学习,从浅层模型到深层非线性建模,从单一任务到多任务联合优化。
核心任务范式:定义、挑战与关联
计算机视觉的核心任务可归纳为三个层次,它们构成了从抽象语义理解到具体像素级推理的完整链条。
图像分类是最高层级的抽象任务,其目标是为整张图像分配一个或多个语义标签(如“猫”、“狗”)。挑战主要源于类内差异大(同一类别物体姿态、光照、背景多变)和类间差异小(不同类别物体外观相似,如金毛犬与拉布拉多)。经典数据集如ImageNet包含1000个类别、超过120万张训练图像,推动了大规模分类模型的发展。分类任务的性能通常以Top-1/Top-5准确率衡量。
目标检测在分类基础上增加了定位要求,需同时预测图像中每个目标物体的边界框(Bounding Box)和类别。这带来了新的挑战:尺度变化(小目标如远处行人 vs 大目标如近景车辆)、密度变化(稀疏场景 vs 密集人群)、遮挡与截断。检测任务通常使用平均精度均值(mAP)作为评估指标,它综合了不同交并比(IoU)阈值下的精度与召回率。主流检测框架分为两阶段(如Faster R-CNN,先生成候选框再分类)和一阶段(如YOLO、SSD,直接回归边界框),各有优劣。
图像分割是像素级别的密集预测任务,分为语义分割(为每个像素分配类别标签,不区分实例)和实例分割(同时区分不同实例)。其挑战在于边界精度(如何精确刻画物体轮廓)和计算效率(全像素预测计算量大)。典型数据集如PASCAL VOC、COCO及Cityscapes(用于自动驾驶)。分割任务常用平均交并比(mIoU)评估,它计算预测区域与真实区域的重叠程度。
这三个任务并非孤立,而是存在紧密的演进关系:分类为检测提供特征提取骨干网络,检测为分割提供区域提议或边界框先验。例如,Mask R-CNN在Faster R-CNN基础上添加一个分割分支,实现了检测与实例分割的联合优化。理解任务间的关联,是设计高效多任务系统的关键。
```mermaid graph TD A[计算机视觉核心任务] --> B[图像分类<br/>整图语义标签] A --> C[目标检测<br/>边界框+类别] A --> D[图像分割<br/>像素级标签] B --> E[挑战:类内/类间差异] C --> F[挑战:尺度/密度/遮挡] D --> G[挑战:边界精度/计算量] C --> H[两阶段方法<br/>Faster R-CNN] C --> I[一阶段方法<br/>YOLO/SSD] D --> J[语义分割<br/>FCN/U-Net] D --> K[实例分割<br/>Mask R-CNN] H & I --> L[共享CNN骨干网络] L --> M[特征金字塔网络<br/>FPN] ```
上图展示了计算机视觉核心任务的层级关系与主流方法演进。图像分类是基础,为目标检测提供特征提取能力;目标检测又通过边界框为图像分割提供区域先验。现代架构如FPN(特征金字塔网络)已成为连接这些任务的通用骨干,体现了技术融合的趋势。
深度学习基础回顾:从感知机到反向传播
深度学习的前身是人工神经网络,其核心单元——感知机(Perceptron)——由Rosenblatt于1958年提出,模拟生物神经元的加权求和与阈值激活。单层感知机只能解决线性可分问题,而Minsky和Papert在1969年的著作中指出了其局限性,导致神经网络研究进入第一个低谷。直到1986年,Rumelhart等人提出反向传播算法(Backpropagation),结合Sigmoid等非线性激活函数,多层感知机(MLP)才得以有效训练,开启了神经网络的第一次复兴。
前馈神经网络:结构与激活函数
前馈神经网络(Feedforward Neural Network,FNN)是最基础的深度学习架构,信息单向流动,无循环连接。一个典型的MLP由三部分组成: 1. 输入层:接收原始数据向量 $\mathbf{x} \in \mathbb{R}^{d}$,其中 $d$ 为特征维度。 2. 隐藏层:包含 $L$ 层变换,每层执行线性映射与非线性激活:$\mathbf{h}^{(l)} = f(\mathbf{W}^{(l)}\mathbf{h}^{(l-1)} + \mathbf{b}^{(l)})$,其中 $\mathbf{W}^{(l)}$ 为权重矩阵,$\mathbf{b}^{(l)}$ 为偏置向量,$f(\cdot)$ 为激活函数。 3. 输出层:根据任务设计,如分类任务常用Softmax输出概率分布。
激活函数的选择对网络表达能力至关重要。早期常用的Sigmoid函数 $f(x) = \frac{1}{1+e^{-x}}$ 在输入绝对值较大时梯度趋近于零,导致梯度消失问题。双曲正切(Tanh)函数 $f(x) = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}$ 输出零中心,缓解了Sigmoid的部分问题,但仍存在饱和区。目前最流行的激活函数是修正线性单元(ReLU):$f(x) = \max(0, x)$。其优势在于计算简单、正区间梯度恒为1,显著加速了训练收敛。ReLU的变体如Leaky ReLU $f(x) = \max(\alpha x, x)$($\alpha$ 为小常数,如0.01)和参数化ReLU(PReLU)进一步解决了“神经元死亡”问题。
反向传播算法:链式法则与梯度计算
反向传播是训练神经网络的基石,其本质是链式法则(Chain Rule)在计算图上的高效应用。考虑一个简单网络:输入 $\mathbf{x}$,经一层隐藏层变换后输出预测 $\hat{\mathbf{y}}$,损失函数为 $J(\theta)$,其中 $\theta = \{\mathbf{W}, \mathbf{b}\}$ 为模型参数。目标是计算梯度 $\nabla J(\theta) = \left( \frac{\partial J}{\partial \mathbf{W}}, \frac{\partial J}{\partial \mathbf{b}} \right)$。
以单样本为例,前向传播过程为: $$ \mathbf{z} = \mathbf{W}\mathbf{x} + \mathbf{b}, \quad \mathbf{h} = f(\mathbf{z}), \quad \hat{\mathbf{y}} = g(\mathbf{h}) $$ 其中 $f$ 为隐藏层激活函数,$g$ 为输出层函数(如Softmax)。损失函数 $J$ 衡量 $\hat{\mathbf{y}}$ 与真实标签 $\mathbf{y}$ 的差异(如交叉熵)。
反向传播从输出层开始,逐层计算梯度: 1. 输出层梯度:$\frac{\partial J}{\partial \mathbf{h}} = \frac{\partial J}{\partial \hat{\mathbf{y}}} \cdot \frac{\partial \hat{\mathbf{y}}}{\partial \mathbf{h}}$ 2. 隐藏层梯度:$\frac{\partial J}{\partial \mathbf{z}} = \frac{\partial J}{\partial \mathbf{h}} \odot f'(\mathbf{z})$($\odot$ 表示逐元素乘) 3. 参数梯度:$\frac{\partial J}{\partial \mathbf{W}} = \frac{\partial J}{\partial \mathbf{z}} \mathbf{x}^\top$,$\frac{\partial J}{\partial \mathbf{b}} = \frac{\partial J}{\partial \mathbf{z}}$
对于批量数据(Batch),梯度为各样本梯度的平均。反向传播的效率源于其复用前向传播的中间结果(如 $\mathbf{z}$, $\mathbf{h}$),避免了重复计算。现代深度学习框架(如PyTorch)通过自动微分(Autograd)构建动态计算图,自动求解梯度,但理解其原理对调试模型至关重要。
损失函数与优化器
损失函数(Loss Function)量化模型预测与真实值的差距,是优化目标的直接体现。常见损失函数包括:
- **均方误差**(MSE):$J = \frac{1}{N}\sum_{i=1}^{N}(y_i - \hat{y}_i)^2$,适用于回归任务。
- **交叉熵损失**(Cross-Entropy):对于分类任务,若真实分布为 $\mathbf{p}$,预测分布为 $\mathbf{q}$,则 $J = -\sum_{i} p_i \log q_i$。当标签为one-hot向量时,简化为 $J = -\log \hat{y}_c$($c$ 为真实类别)。
- **合页损失**(Hinge Loss):用于支持向量机,$J = \max(0, 1 - y \cdot f(\mathbf{x}))$,其中 $y \in \{-1, +1\}$。
优化器负责根据损失函数的梯度更新模型参数。随机梯度下降(SGD)是最基础的优化算法:$\theta_{t+1} = \theta_t - \eta \nabla J(\theta_t)$,其中 $\eta$ 为学习率。SGD的变体通过引入动量(Momentum)加速收敛并缓解震荡:$v_{t+1} = \mu v_t - \eta \nabla J(\theta_t)$,$\theta_{t+1} = \theta_t + v_{t+1}$($\mu$ 为动量系数,通常0.9)。自适应优化器如Adam(Adaptive Moment Estimation)结合了动量与逐参数自适应学习率,其更新规则为: $$ \begin{aligned} \mathbf{m}_t &= \beta_1 \mathbf{m}_{t-1} + (1-\beta_1) \nabla J(\theta_t) \\ \mathbf{v}_t &= \beta_2 \mathbf{v}_{t-1} + (1-\beta_2) (\nabla J(\theta_t))^2 \\ \hat{\mathbf{m}}_t &= \mathbf{m}_t / (1-\beta_1^t), \quad \hat{\mathbf{v}}_t = \mathbf{v}_t / (1-\beta_2^t) \\ \theta_{t+1} &= \theta_t - \eta \frac{\hat{\mathbf{m}}_t}{\sqrt{\hat{\mathbf{v}}_t} + \epsilon} \end{aligned} $$ 其中 $\beta_1, \beta_2$ 为指数衰减率(通常0.9, 0.999),$\epsilon$ 为数值稳定常数(如 $10^{-8}$)。Adam因其良好的收敛性和对超参数的不敏感性,成为深度学习实践中的默认选择。
必要的数学基础:线性代数与概率论
深度学习模型本质上是高维空间中的函数逼近器,其数学根基深植于线性代数与概率论。掌握这些基础概念,不仅能理解模型内部运作机制,还能在模型设计、调试和优化时做出更明智的决策。
线性代数核心概念
向量与矩阵运算是深度学习的“原子操作”。输入图像常被展平为向量 $\mathbf{x} \in \mathbb{R}^{n}$,但更常见的是保持其二维结构作为矩阵 $\mathbf{X} \in \mathbb{R}^{h \times w \times c}$(高、宽、通道数)。神经网络层间变换本质是线性映射:$\mathbf{y} = \mathbf{W}\mathbf{x} + \mathbf{b}$,其中 $\mathbf{W} \in \mathbb{R}^{m \times n}$ 为权重矩阵,$\mathbf{b} \in \mathbb{R}^{m}$ 为偏置向量。矩阵乘法满足结合律但不满足交换律,这一性质决定了网络层的顺序不可随意调换。
特征值分解与奇异值分解(SVD)在数据降维与模型压缩中扮演重要角色。对协方差矩阵 $\mathbf{C} = \frac{1}{N}\sum_{i=1}^{N}(\mathbf{x}_i - \bar{\mathbf{x}})(\mathbf{x}_i - \bar{\mathbf{x}})^\top$ 进行特征值分解,可得到主成分(PCA),用于可视化高维特征或去除噪声。SVD将矩阵 $\mathbf{A} \in \mathbb{R}^{m \times n}$ 分解为 $\mathbf{A} = \mathbf{U}\mathbf{\Sigma}\mathbf{V}^\top$,其中 $\mathbf{\Sigma}$ 的对角线元素为奇异值,按降序排列。在推荐系统与自然语言处理中,截断SVD(仅保留前 $k$ 个奇异值)是实现低秩近似的核心技术。
张量(Tensor)是向量与矩阵在高维的推广,用 $\mathcal{T} \in \mathbb{R}^{i_1 \times i_2 \times \cdots \times i_N}$ 表示。深度学习框架中的数据张量通常遵循NCHW(批量大小、通道数、高、宽)或NHWC格式。理解张量转置、重塑(Reshape)、广播(Broadcast)机制,是高效操作数据的前提。例如,在批量归一化层中,需对每个通道的特征图进行均值与方差计算,这涉及沿批量维度(N)和空间维度(H、W)的归约操作。
概率论核心概念
深度学习本质上是概率建模,即使不显式输出概率分布,其优化过程也常基于最大似然原则。条件概率 $P(y|\mathbf{x})$ 表示给定输入 $\mathbf{x}$ 时输出 $y$ 的概率,分类模型的目标即估计此分布。贝叶斯定理 $P(y|\mathbf{x}) = \frac{P(\mathbf{x}|y)P(y)}{P(\mathbf{x})}$ 为生成模型与判别模型的划分提供了理论依据:判别模型直接建模 $P(y|\mathbf{x})$(如逻辑回归、CNN),生成模型则建模联合分布 $P(\mathbf{x}, y) = P(\mathbf{x}|y)P(y)$(如朴素贝叶斯、GAN)。
信息论基础概念如熵(Entropy) $H(Y) = -\sum_{y} P(y)\log P(y)$、交叉熵(Cross-Entropy) $H(Y, \hat{Y}) = -\sum_{y} P(y)\log \hat{P}(y)$ 与KL散度(Kullback-Leibler Divergence) $D_{KL}(P\|Q) = \sum_{x} P(x)\log \frac{P(x)}{Q(x)}$ 是理解损失函数的关键。最小化交叉熵等价于最小化真实分布与预测分布之间的KL散度,因为 $H(Y, \hat{Y}) = H(Y) + D_{KL}(P\|Q)$,而 $H(Y)$ 对于固定数据集是常数。
最大似然估计(MLE)是参数学习的经典方法。假设数据独立同分布(i.i.d.),则似然函数为 $L(\theta) = \prod_{i=1}^{N} P(y_i|\mathbf{x}_i; \theta)$。为简化计算,常取对数似然 $\log L(\theta) = \sum_{i=1}^{N} \log P(y_i|\mathbf