这是本文档旧的修订版!
第十一章 计算机视觉
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。