====== 第十一章 计算机视觉 ====== ===== 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。