第十一章 计算机视觉
1. 概念定义与原理讲解
1.1 计算机视觉概述
什么是计算机视觉
计算机视觉(Computer Vision, CV)是人工智能的一个重要分支,旨在使计算机能够从图像或多维数据中“理解”视觉世界。其核心任务包括:
- 从数字图像中提取有意义的信息
- 理解场景的内容和结构
- 做出基于视觉信息的决策
计算机视觉与人类视觉
人类视觉系统的特点:
- 并行处理大量信息
- 具有先验知识和推理能力
- 对光照、视角变化具有鲁棒性
- 可以处理模糊和不完整的输入
计算机视觉的挑战:
- 从2D图像恢复3D信息是病态问题
- 光照、遮挡、形变等因素增加复杂性
- 需要大量数据学习视觉概念
计算机视觉的主要任务
1. 图像分类:给整张图像打标签
2. 目标检测:定位并识别图像中的物体
3. 语义分割:像素级别的类别标注
4. 实例分割:区分同一类别的不同实例
5. 目标跟踪:追踪视频中的目标
6. 图像生成:创造新的图像
7. 图像恢复:去噪、超分辨率、去模糊
1.2 图像分类
1.2.1 经典网络架构演进
LeNet(1998):
- 首个成功的卷积神经网络
- 5层结构:2个卷积层 + 3个全连接层
- 应用于手写数字识别(MNIST)
- 奠定了CNN的基础架构
AlexNet(2012):
- 深度学习的里程碑
- 8层网络,首次使用ReLU和Dropout
- GPU加速训练,大规模数据(ImageNet)
- 错误率比传统方法降低10%以上
VGGNet(2014):
- 探索网络深度的影响
- 使用更小的3×3卷积核替代大卷积核
- VGG-16和VGG-19成为标准架构
- 证明深度是提升性能的关键因素
ResNet(2015):
- 引入残差连接解决梯度消失
- 可以训练超过100层的深层网络
- ResNet-152在ImageNet上取得突破性成果
- 成为后续网络的标配组件
EfficientNet(2019):
- 系统研究网络的深度、宽度、分辨率平衡
- 使用复合系数统一缩放三个维度
- 在精度和效率之间取得最佳平衡
1.2.2 图像分类的核心技术
数据增强:
- 几何变换:翻转、旋转、裁剪、缩放
- 颜色变换:亮度、对比度、色调调整
- 高级增强:Mixup、CutMix、AutoAugment
正则化技术:
- Dropout:随机丢弃神经元
- Batch Normalization:批归一化
- Label Smoothing:标签平滑
- Stochastic Depth:随机深度
迁移学习:
- 在大规模数据集(ImageNet)上预训练
- 在目标任务上微调
- 小样本场景下的有效策略
1.3 目标检测
1.3.1 目标检测的任务定义
目标检测需要同时解决两个子问题:
1. 定位:确定物体的位置(边界框)
2. 分类:确定物体的类别
输出格式:$(x, y, w, h, class, confidence)$
- $(x, y)$:边界框中心坐标
- $(w, h)$:边界框宽度和高度
- $class$:物体类别
- $confidence$:置信度
1.3.2 两阶段检测器
R-CNN系列:
R-CNN(2014):
1. 使用Selective Search生成候选区域(约2000个)
2. 每个候选区域缩放到固定尺寸
3. 使用CNN提取特征
4. SVM分类 + 边界框回归
局限性:每个候选区域单独前向传播,速度极慢。
Fast R-CNN(2015):
1. 整张图像输入CNN得到特征图
2. ROI Pooling从特征图提取候选区域特征
3. 全连接层同时进行分类和回归
改进:共享卷积计算,显著提速。
Faster R-CNN(2015):
1. 引入区域提议网络(RPN)替代Selective Search
2. RPN与检测网络共享特征
3. 端到端训练
特点:首个接近实时的两阶段检测器。
1.3.3 单阶段检测器
YOLO(You Only Look Once):
- 将检测视为回归问题
- 图像划分为$S \times S$网格
- 每个网格预测$B$个边界框和类别概率
- 单次前向传播完成检测和分类
优点:速度快,适合实时应用
缺点:小目标和密集目标检测效果较差
YOLO演进:
- YOLOv2/v3:引入Batch Norm、Anchor Box、多尺度预测
- YOLOv4/v5:各种优化技巧的组合
- YOLOv8:Anchor-Free、解耦头、CIOU Loss
SSD(Single Shot MultiBox Detector):
- 多尺度特征图预测
- 使用不同尺度和长宽比的默认框(Default Boxes)
- 在多个层同时进行检测
RetinaNet:
- 引入Focal Loss解决正负样本不平衡
- Focal Loss降低易分样本的权重,聚焦难分样本
1.3.4 Anchor-Free检测器
传统方法依赖预定义的Anchor Box,存在超参数敏感问题。
CenterNet:
- 将目标表示为中心点
- 预测中心点偏移、尺寸、方向等
- 无需NMS后处理
FCOS(Fully Convolutional One-Stage):
- 逐像素预测
- 引入中心度(Center-ness)抑制低质量预测
- 完全避免Anchor相关计算
1.4 语义分割与实例分割
1.4.1 语义分割
为图像中每个像素分配类别标签。
FCN(Fully Convolutional Network):
- 首个端到端分割网络
- 将全连接层替换为卷积层
- 使用转置卷积(上采样)恢复分辨率
- 跳跃连接融合不同层次特征
U-Net:
- 编码器-解码器结构
- 跳跃连接保留空间细节
- 在医学图像分割中广泛应用
DeepLab系列:
空洞卷积(Atrous/Dilated Convolution):
- 在卷积核中插入空洞
- 扩大感受野而不增加参数
- 保留高分辨率特征图
ASPP(Atrous Spatial Pyramid Pooling):
- 使用不同空洞率的并行卷积
- 捕获多尺度上下文
PSPNet(Pyramid Scene Parsing Network):
- 金字塔池化模块
- 聚合不同区域的上下文
1.4.2 实例分割
同时完成检测和分割,区分同一类别的不同实例。
Mask R-CNN:
- 在Faster R-CNN基础上增加Mask分支
- ROI Align替代ROI Pooling,解决量化误差
- 同时输出类别、边界框、分割掩码
PANet(Path Aggregation Network):
- 增强信息传播路径
- 自适应特征池化
SOLO(Segmenting Objects by Locations):
- 将实例分割转化为位置分类
- 引入坐标卷积(CoordConv)
1.5 目标跟踪
1.5.1 目标跟踪的任务定义
给定视频第一帧中目标的位置,在后续帧中持续定位该目标。
主要挑战:
- 遮挡、形变、尺度变化
- 光照变化、运动模糊
- 相似物体干扰
- 实时性要求
1.5.2 跟踪算法分类
基于相关滤波的跟踪:
- MOSSE、KCF、CSR-DCF
- 利用循环矩阵性质加速训练
- 速度快,但精度有限
基于Siamese网络的跟踪:
- SiamFC、SiamRPN、SiamMask
- 孪生网络提取模板和搜索区域的特征
- 相关操作定位目标
- 端到端训练,精度高
基于Transformer的跟踪:
- TransT、STARK、MixFormer
- 利用自注意力和交叉注意力建模模板与搜索区域关系
- 当前SOTA方法
1.6 视觉Transformer
1.6.1 从CNN到ViT
CNN在计算机视觉中的局限:
- 局部感受野限制长距离建模
- 平移等变性可能不是最佳选择
- 需要大量归纳偏置
Transformer在NLP的成功启发了视觉领域的探索。
ViT(Vision Transformer):
图像分块(Patch Embedding):
- 将图像分割为固定大小的patch(如16×16)
- 每个patch展平并线性投影为向量
- 加入位置编码
Transformer编码器:
- 标准的多头自注意力 + MLP结构
- 在大规模数据集上预训练
- 在下游任务上微调
1.6.2 ViT的关键发现
归纳偏置的权衡:
- CNN具有局部性、平移等变性等归纳偏置
- ViT依赖自注意力学习空间关系
- 在小数据集上CNN更好,在大数据集上ViT可以超越
数据规模的重要性:
- ViT需要大规模数据(如JFT-300M)预训练
- 在ImageNet上从头训练效果不如ResNet
1.6.3 ViT的改进变体
DeiT(Data-efficient Image Transformer):
- 使用知识蒸馏从CNN迁移知识
- 在ImageNet上从头训练即可达到好效果
Swin Transformer:
- 层次化金字塔结构
- 移位窗口(Shifted Window)自注意力
- 线性复杂度,适合高分辨率图像
PVT(Pyramid Vision Transformer):
- 金字塔结构降低计算复杂度
- 空间缩减注意力(Spatial Reduction Attention)
1.7 自监督学习与对比学习
1.7.1 自监督学习的动机
标注数据昂贵且耗时,如何利用海量无标注数据?
自监督学习通过设计预训练任务,从无标注数据学习有用表示。
1.7.2 对比学习
核心思想:学习使相似样本接近、不相似样本远离的表示。
SimCLR:
1. 对每个样本生成两个增强视图
2. 使用同一网络编码两个视图
3. 最大化同一样本不同视图的相似度
4. 最小化不同样本的相似度
InfoNCE Loss:
$$\mathcal{L} = -\log \frac{\exp(sim(z_i, z_j)/\tau)}{\sum_{k} \exp(sim(z_i, z_k)/\tau)}$$
其中$z_i, z_j$是正样本对,$\tau$是温度系数。
MoCo(Momentum Contrast):
- 使用动量编码器维护动态字典
- 解决大批量训练的需求
- 引入队列存储负样本
BYOL和SimSiam:
- 无需负样本的对比学习
- 使用非对称结构防止平凡解
- 在线网络和目标网络
1.7.3 掩码图像建模(Masked Image Modeling)
受BERT启发,在图像上进行掩码预测。
BEiT:
- 使用离散VAE将图像转换为视觉token
- 掩码部分patch,预测离散token
MAE(Masked Autoencoder):
- 高掩码率(75%)
- 非对称编码器-解码器
- 仅编码可见patch,解码器重建完整图像
1.7.4 自监督学习的应用
- 预训练后微调下游任务
- 数据高效的迁移学习
- 特征表示的可视化和分析
1.8 生成式视觉模型
1.8.1 图像生成
VAE和GAN:
- 生成高质量图像
- 支持条件生成(类别、文本、草图)
扩散模型:
- DDPM、Stable Diffusion
- 逐步去噪生成图像
- 当前最高质量的生成方法
1.8.2 文本到图像生成
DALL-E / DALL-E 2:
- GPT风格的文本编码
- 自回归或扩散模型生成图像
Stable Diffusion:
- 在潜在空间进行扩散
- 大幅降低计算成本
- 开源,社区生态丰富
ControlNet:
- 在扩散模型上添加条件控制
- 支持边缘、姿态、深度等多种条件
1.8.3 神经辐射场(NeRF)
从多视角图像学习场景的隐式3D表示:
$$\mathbf{c}, \sigma = \text{MLP}(\mathbf{x}, \mathbf{d})$$
其中$\mathbf{x}$是3D坐标,$\mathbf{d}$是视角方向,输出颜色$\mathbf{c}$和体密度$\sigma$。
通过体渲染合成新视角图像。
应用:3D重建、新视角合成、3D内容生成
2. 例题分析
例题1:目标检测IoU计算
题目:给定两个边界框:
- Box A:左上角$(0, 0)$,右下角$(4, 4)$
- Box B:左上角$(2, 2)$,右下角$(6, 6)$
计算IoU(Intersection over Union)。
分析过程:
步骤1:确定边界框参数
Box A:
- 左下角:$(0, 0)$
- 右上角:$(4, 4)$
- 宽度:$w_A = 4$,高度:$h_A = 4$
- 面积:$Area_A = 4 \times 4 = 16$
Box B:
- 左下角:$(2, 2)$
- 右上角:$(6, 6)$
- 宽度:$w_B = 4$,高度:$h_B = 4$
- 面积:$Area_B = 4 \times 4 = 16$
步骤2:计算交集区域
交集的左下角:
- $x_1 = \max(0, 2) = 2$
- $y_1 = \max(0, 2) = 2$
交集的右上角:
- $x_2 = \min(4, 6) = 4$
- $y_2 = \min(4, 6) = 4$
交集宽度:$w_{inter} = x_2 - x_1 = 4 - 2 = 2$
交集高度:$h_{inter} = y_2 - y_1 = 4 - 2 = 2$
交集面积:
$$Area_{inter} = 2 \times 2 = 4$$
步骤3:计算并集面积
$$Area_{union} = Area_A + Area_B - Area_{inter}$$
$$= 16 + 16 - 4 = 28$$
步骤4:计算IoU
$$IoU = \frac{Area_{inter}}{Area_{union}} = \frac{4}{28} = \frac{1}{7} \approx 0.143$$
结论:两个边界框的IoU约为0.143(14.3%)。
分析:
- IoU是目标检测中评估定位精度的重要指标
- 通常IoU阈值设为0.5判断正负样本
- 此例中IoU较低,说明两个框重叠较少
例题2:语义分割上采样计算
题目:语义分割网络输出特征图尺寸为$8 \times 8$,类别数为21。需要上采样到原始图像尺寸$256 \times 256$。使用双线性插值和1×1卷积,计算输出尺寸和参数数量。
分析过程:
步骤1:1×1卷积调整通道数
输入特征图:$8 \times 8 \times C$(假设$C$为通道数)
1×1卷积将通道数映射到类别数:
- 权重尺寸:$1 \times 1 \times C \times 21$
- 输出:$8 \times 8 \times 21$
- 参数数量:$1 \times 1 \times C \times 21 = 21C$
步骤2:双线性插值上采样
上采样因子:$256 / 8 = 32$
使用双线性插值将$8 \times 8$上采样到$256 \times 256$:
- 输出尺寸:$256 \times 256 \times 21$
- 双线性插值是确定性的,无需学习参数
步骤3:最终输出
对每个空间位置,21个通道对应21个类别的概率(经过softmax)。
尺寸总结:
- 输入:$8 \times 8 \times C$
- 1×1卷积后:$8 \times 8 \times 21$
- 上采样后:$256 \times 256 \times 21$
参数总结:
- 1×1卷积参数:$21C$
- 上采样层参数:0
分析:
- 1×1卷积用于将特征映射到类别空间
- 上采样恢复空间分辨率
- 可以调换顺序:先上采样再1×1卷积,但计算量更大
例题3:ViT的patch嵌入计算
题目:ViT处理$224 \times 224$的图像,patch大小为$16 \times 16$,嵌入维度为768。计算:
1. patch数量
2. patch嵌入后的序列长度
3. 可学习的线性投影参数数量
分析过程:
步骤1:计算patch数量
图像尺寸:$224 \times 224$
Patch尺寸:$16 \times 16$
每行的patch数:$224 / 16 = 14$
每列的patch数:$224 / 16 = 14$
总patch数:$14 \times 14 = 196$
步骤2:序列长度
每个patch展平后:$16 \times 16 \times 3 = 768$(假设RGB图像)
经过线性投影到768维后,每个patch对应一个768维的向量。
序列长度 = patch数 + 1(类别token)= 197
步骤3:线性投影参数
输入维度:$16 \times 16 \times 3 = 768$
输出维度:$768$
线性投影矩阵:$768 \times 768$
偏置向量:$768$
总参数:$768 \times 768 + 768 = 589,824 + 768 = 590,592$
步骤4:位置编码参数
可学习的位置编码:$197 \times 768 = 151,296$参数
总结:
- Patch数量:196
- 序列长度:197(含类别token)
- Patch嵌入参数:590,592
- 位置编码参数:151,296
分析:
- ViT将图像转化为类似NLP的序列
- 计算复杂度高($O(n^2)$的自注意力)
- 需要大规模数据预训练
3. 训练题
一、选择题
1. Faster R-CNN中的RPN的作用是:
A. 提取特征 B. 生成区域提议 C. 分类物体 D. 分割实例
2. YOLO属于什么类型的检测器?
A. 两阶段检测器 B. 单阶段检测器 C. 实例分割方法 D. 目标跟踪方法
3. U-Net的跳跃连接主要用于:
A. 加速训练 B. 保留空间细节 C. 减少参数量 D. 增加深度
4. ViT将图像分割为16×16的patch,输入$224 \times 224$图像会产生多少个patch?
A. 14 B. 196 C. 224 D. 768
5. 对比学习中,InfoNCE损失的目标是:
A. 最大化正样本对相似度,最小化负样本对相似度 B. 最小化所有样本对的相似度 C. 最大化所有样本对的相似度 D. 保持所有样本对的相似度不变
二、填空题
6. 目标检测需要同时解决$\_\_\_\_$和$\_\_\_\_$两个子问题。
7. IoU的全称是$\_\_\_\_$,用于评估边界框的重叠程度。
8. ResNet通过引入$\_\_\_\_$连接解决了深层网络的梯度消失问题。
9. 语义分割为图像中每个$\_\_\_\_$分配类别标签。
10. MAE(Masked Autoencoder)采用$\_\_\_\_$%的掩码率。
三、计算题
11. Box A:$(0,0,4,4)$,Box B:$(3,3,7,7)$(格式:$x,y,w,h$)。计算IoU。
12. 特征图尺寸$16 \times 16$,通过$3 \times 3$空洞卷积(dilation=2, padding=2),计算输出尺寸。
13. ViT处理$384 \times 384$图像,patch大小为$16 \times 16$,计算patch数量。
4. 答案与解析
一、选择题答案:
1. 答案:B
解析:RPN(Region Proposal Network)用于生成候选区域提议,替代传统的Selective Search。
2. 答案:B
解析:YOLO是单阶段检测器,直接预测边界框和类别,速度快。
3. 答案:B
解析:U-Net的跳跃连接将编码器的低层特征直接传递到解码器,保留空间细节。
4. 答案:B
解析:$(224/16) \times (224/16) = 14 \times 14 = 196$个patch。
5. 答案:A
解析:对比学习通过拉近正样本对、推远负样本对来学习有用表示。
二、填空题答案:
6. 答案:定位;分类
解析:目标检测需要定位物体位置并分类物体类别。
7. 答案:Intersection over Union
解析:IoU = 交集面积 / 并集面积。
8. 答案:残差(或Residual,或skip connection)
解析:残差连接允许梯度直接传播,解决梯度消失。
9. 答案:像素
解析:语义分割是像素级别的分类任务。
10. 答案:75(或75%)
解析:MAE采用高掩码率75%,迫使模型学习强特征表示。
三、计算题答案:
11. 解答:
Box A:$(0, 0)$到$(4, 4)$,面积$= 4 \times 4 = 16$
Box B:$(3, 3)$到$(7, 7)$,面积$= 4 \times 4 = 16$
交集:
- 左下角:$(\max(0,3), \max(0,3)) = (3, 3)$
- 右上角:$(\min(4,7), \min(4,7)) = (4, 4)$
- 宽度:$4 - 3 = 1$
- 高度:$4 - 3 = 1$
- 交集面积:$1 \times 1 = 1$
并集:$16 + 16 - 1 = 31$
IoU:$1/31 \approx 0.032$
12. 解答:
空洞卷积有效核大小:$k_{effective} = k + (k-1)(d-1) = 3 + 2 \times 1 = 5$
输出尺寸公式:$H_{out} = \lfloor(H_{in} + 2p - k_{effective})/s\rfloor + 1$
假设stride=1:
$H_{out} = (16 + 2 \times 2 - 5)/1 + 1 = 16 + 4 - 5 + 1 = 16$
输出尺寸:$16 \times 16$
13. 解答:
$(384/16) \times (384/16) = 24 \times 24 = 576$
共576个patch。