计算机视觉简介
## 什么是计算机视觉 计算机视觉(Computer Vision, CV)是人工智能的重要分支,旨在让计算机能够"看懂"图像和视频内容,并从中提取有用的信息。 ### 传统方法 vs 深度学习 ``` 传统方法: 图像 → 手工特征提取(SIFT/HOG)→ 分类器(SVM/随机森林)→ 类别 深度学习方法: 图像 → 卷积神经网络(自动特征提取)→ 全连接层 → Softmax → 类别概率 ``` > **行业补充**:现代 CV 已进入"大模型时代",如 CLIP、SAM 等模型实现了视觉-语言的统一理解。
## 计算机视觉三大基本任务 | 任务 | 描述 | 应用场景 | |------|------|----------| | **图像分类** | 为图像分配类别标签 | 人脸识别、医学影像诊断 | | **目标检测** | 定位并识别图像中的多个对象 | 自动驾驶、安防监控 | | **图像分割** | 像素级别的分类 | 医学图像分析、遥感图像 | ### 特征学习的层次性 卷积神经网络通过多层结构学习层次化特征: | 网络层 | 学习特征 | 可视化示例 | |--------|----------|------------| | **第1层** | 边缘、颜色、简单纹理 | 水平/垂直边缘检测器 | | **第2层** | 更复杂的纹理 | 布纹、叶纹、网格 | | **第3层** | 局部模式 | 烛光、萤火、鸡蛋黄色 | | **第4层** | 物体部件 | 狗脸、圆柱体、七星瓢虫 | | **第5层** | 完整物体 | 花朵、黑眼圈动物、键盘 | > **关键洞察**:增加层数 → 学习更抽象的概念;增加节点数 → 增加同一层特征的种类。
## 为什么需要深度学习 传统计算机视觉方法依赖手工设计的特征(如 SIFT、HOG),而深度学习能够: - **自动学习特征**:从原始像素中自动提取层次化特征 - **端到端训练**:直接从数据到结果的优化 - **泛化能力强**:学习到的特征可迁移到其他任务 ### 图像分类任务定义 **输入**:一张图像(如 224×224×3 的 RGB 图像) **输出**:该图像属于各个类别的概率分布
CNN核心原理
## 为什么需要 CNN ### 全连接神经网络的局限 #### 问题 1:参数量巨大,效率低 假如处理一张 **1000×1000 像素**的彩色图片: ``` 输入参数量 = 1000 × 1000 × 3 = 3,000,000 ``` 如果第一个隐藏层有 1000 个神经元: ``` 权重参数 = 3,000,000 × 1000 = 3,000,000,000(30亿) ``` #### 问题 2:难以保留空间特征 图像展平为一维向量后,空间特征丢失。圆形位置不同会产生完全不同的数据表达,但物体本质未变。 ### 平移不变性 **平移不变性**指的是:当输入图像中的物体发生位置平移时,网络的输出(识别结果)保持不变。 **为什么全连接网络没有平移不变性?** 全连接网络每个像素位置对应独立的权重。物体平移后,特征对应的权重完全不同,导致输出变化。 **为什么 CNN 具有平移不变性?** 1. **权重共享**:同一个卷积核在图像的所有位置使用相同的参数滑动扫描 2. **池化层**:最大池化进一步增强平移不变性 > **关键点**:平移不变性的本质是"**相同的特征检测器在任意位置都能工作**" ### CNN 的优势 | 特性 | 全连接网络 | CNN | |------|-----------|-----| | 参数量 | 巨大 | 较小 | | 空间特征 | 丢失 | 保留 | | 平移不变性 | 无 | 有 | | 局部连接 | 全连接 | 局部连接 |
## 卷积层 ### 卷积的计算方法 卷积运算本质上就是在**滤波器和输入数据的局部区域间做点积**。 **计算过程**: 1. 将卷积核放置在输入特征图的左上角 2. 对应位置相乘后求和 3. 按照步长移动卷积核,重复计算 **示例**:输入 5×5,卷积核 3×3 ``` 输入: 卷积核: 输出(3x3): 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 1 1 1 0 0 → 1 0 1 → 5 3 3 0 0 0 1 1 3 2 2 0 0 0 1 1 2 2 4 ``` ### 特征图大小计算 $$Output\ Size = \\lfloor \\frac{Input\ Size - Kernel\ Size + 2 \\times Padding}{Stride} \\rfloor + 1$$ ### Padding 和 Stride | 方式 | 说明 | 输出尺寸 | |------|------|----------| | **Valid** | 不填充 | $(N - F) / S + 1$ | | **Same** | 填充使输出尺寸与输入相同 | $N / S$ | ### 多通道与多卷积核 ``` 输入: H × W × C_in → 卷积核: N 个 K × K × C_in → 输出: H' × W' × N ``` ### tf.keras 实现 ```python tf.keras.layers.Conv2D( filters, kernel_size, strides=(1, 1), padding='valid', activation=None ) ```
## 池化层 ### 作用 - 降低后续网络层的输入维度 - 缩减模型大小,提高计算速度 - 提高 Feature Map 的鲁棒性 - 防止过拟合 ### 最大池化 取窗口内的**最大值**作为输出。 ```python tf.keras.layers.MaxPool2D( pool_size=(2, 2), strides=None, padding='valid' ) ``` ### 平均池化 取窗口内**所有值的均值**作为输出。 ```python tf.keras.layers.AveragePooling2D( pool_size=(2, 2), strides=None, padding='valid' ) ``` ### 对比 | 特性 | 最大池化 | 平均池化 | |------|----------|----------| | 输出值 | 窗口内最大值 | 窗口内平均值 | | 保留信息 | 最强特征 | 整体特征 | | 使用场景 | 特征提取(常用) | 平滑特征 |
## 全连接层 ### 作用 将卷积层提取的特征图转换成一维向量,进行分类或回归。 ``` 展平特征图 → 全连接层 → 输出类别概率 ``` ### tf.keras 实现 ```python tf.keras.layers.Dense(units, activation=None) tf.keras.layers.Flatten() # 将多维特征图展平为一维 ``` ### 激活函数 **ReLU**:$f(x) = \\max(0, x)$ **优势**: - 计算简单 - 缓解梯度消失问题 - 加速网络训练 > **行业补充**:现代 CNN 默认使用 ReLU 或 Leaky ReLU
## CNN 核心原理深入 ### 权重共享(Weight Sharing) 同一个卷积核在整个输入图像上滑动,使用相同的权重参数。 **对比**: | 网络类型 | 参数量示例(输入1000×1000×3) | |----------|------------------------------| | 全连接(1000神经元) | 3,000,000,000 | | CNN(3×3卷积核,64通道) | 1,792 | ### 感受野(Receptive Field) 输出特征图中的每个像素对应输入图像的区域大小。 $$RF_l = RF_{l-1} + (kernel\\_size - 1) \\times stride_{累积}$$ ### 卷积核可视化 | 层次 | 学习内容 | |------|----------| | 第1层 | 边缘、颜色、纹理 | | 第2层 | 简单形状 | | 第3层+ | 复杂模式、物体部件 | ### 反向传播在卷积层中 $$\\frac{\\partial L}{\\partial W} = X * \\left(\\frac{\\partial L}{\\partial Y}\\right)$$ $$\\frac{\\partial L}{\\partial X} = rot180(W) * \\left(\\frac{\\partial L}{\\partial Y}\\right)$$
经典网络概览
## 经典网络对比 | 网络 | 年份 | 层数 | 参数量 | Top-5 错误率 | 核心创新 | |------|------|------|--------|-------------|----------| | LeNet | 1998 | 8 | 60K | - | 奠定 CNN 基础 | | AlexNet | 2012 | 8 | 60M | 16.4% | ReLU、Dropout、GPU 并行 | | VGGNet | 2014 | 16-19 | 138M | 7.3% | 小卷积核堆叠 | | GoogLeNet | 2014 | 22 | 4M | 6.7% | Inception 模块 | | ResNet | 2015 | 152 | 60M | 3.6% | 残差连接 | > 各网络的详细内容请参阅对应专题页面
## LeNet(1998) **开创者**:Yann LeCun **网络结构**: ``` 32×32 输入 → 6@28×28 卷积 (5×5) → 平均池化 (2×2) → 16@10×10 卷积 (5×5) → 平均池化 (2×2) → 全连接 120 → 全连接 84 → 全连接 10 输出 ``` **意义**:最早的卷积神经网络之一,奠定了 CNN 的基础架构。 > 详细内容请参阅 [LeNet专题](/xuetu/cv_lenet_lunwen)
## AlexNet(2012) **开创者**:Alex Krizhevsky **划时代意义**:首次证明学习到的特征可以超越手工设计的特征 **关键创新**: | 创新点 | 说明 | |--------|------| | **8层结构** | 5层卷积 + 2层全连接隐藏层 + 1层输出层 | | **ReLU激活** | 替代 sigmoid,计算更简单 | | **Dropout** | 控制全连接层复杂度,防止过拟合 | | **数据增强** | 翻转、裁剪、颜色变化 | | **GPU并行** | 上下两支网络在两块 GPU 上并行训练 | > 详细内容请参阅 [AlexNet专题](/xuetu/cv_alex)
## VGGNet(2014) **特点**: - **加深版的 AlexNet** - 全部使用 **3×3 小卷积核** 和 **2×2 池化核** - 通过不断加深网络来提升性能 **核心思想**: ``` 两个 3×3 卷积的堆叠 ≈ 一个 5×5 卷积的感受野 三个 3×3 卷积的堆叠 ≈ 一个 7×7 卷积的感受野 ``` **常见配置**: - VGG-16:13 层卷积 + 3 层全连接 - VGG-19:16 层卷积 + 3 层全连接 > 详细内容请参阅 [VGG专题](/xuetu/cv_vgg)
## GoogLeNet / Inception(2014) **特点**: - 不单纯依靠加深网络,而是做**结构创新** - 引入 **Inception 模块** - ImageNet Top-5 错误率降低到 **6.7%** **Inception 模块**: ``` 输入 → [1×1 卷积] → 输出 → [3×3 卷积] → 输出 → [5×5 卷积] → 输出 → [3×3 最大池化] → 输出 → 拼接所有输出 ``` **1×1 卷积的作用**:降维、增加非线性、跨通道信息融合 > 详细内容请参阅 [Inception专题](/xuetu/cv_inception)
## ResNet(2015) **核心问题**:网络退化(Degradation) **现象**:56 层网络比 20 层网络效果更差,且训练误差同样高。 **解决方案**:残差学习(Residual Learning) **残差块结构**: ``` 输入 x → [卷积 + BN + ReLU] → [卷积 + BN] → ⊕ → ReLU → 输出 └──────────────────────────────┘ 跳跃连接(Skip Connection) ``` **核心公式**: $$Output = F(x) + x$$ > 详细内容请参阅 [ResNet专题](/xuetu/cv_resnet)
常用数据集
## MNIST - **内容**:手写数字 0-9 - **规模**:60K 训练图像 + 10K 测试图像 - **类别**:10 个 - **图像大小**:28×28×1(灰度) - **用途**:最基础的合理性检验数据集
## CIFAR-10 / CIFAR-100 - **内容**:自然图像 - **规模**:50K 训练图像 + 10K 测试图像 - **类别**:10 类(CIFAR-10)/ 100 类(CIFAR-100) - **图像大小**:32×32×3 - **用途**:合理性检验,算法对比
## ImageNet - **主导者**:斯坦福大学李飞飞教授 - **规模**:超过 1400 万张全尺寸有标记图片 - **类别**:约 22,000 个类别 - **竞赛**:ILSVRC(ImageNet Large-Scale Visual Recognition Challenge) - **子集**:1000 类,1,281,167 训练图像,50,000 验证图像,100,000 测试图像 - **地位**:视觉领域最受追捧、最具权威的学术竞赛 > **行业补充**:现代大规模数据集 > - **ImageNet-21K**:21000 类,1400 万张图片 > - **LAION-5B**:开源大规模图文数据集,58.5 亿对
## 其他数据集 | 数据集 | 类别数 | 用途 | |--------|--------|------| | Caltech 101 | 101 | 物体识别 | | Caltech 256 | 256 | 物体识别 | | Pascal VOC | 20 | 通用分割/分类基线 |
模型训练流程
## 标准流程 ``` 1. 获取数据 → 2. 数据预处理 → 3. 特征工程 → 4. 模型训练 → 5. 模型评估 ``` ### CNN 训练流程 ``` 输入图像 → [卷积层] → [激活函数] → [池化层] → ... → [展平] → [全连接层] → Softmax → 输出 ↑______________________________________________↓ 反向传播更新权重 ```
## 数据预处理 - **归一化**:将像素值缩放到 [0,1] 或 [-1,1] ```python x = x / 255.0 ``` - **标准化**:减去均值,除以标准差 ```python x = (x - mean) / std ``` - **数据增强**: - 随机裁剪、水平翻转 - 颜色抖动(亮度、对比度、饱和度) - Mixup、CutMix 等高级增强
## 损失函数 **交叉熵损失(Cross-Entropy Loss)**: $$L = -\\sum_{i} y_i \\log(\\hat{y}_i)$$ 其中 $y_i$ 是真实标签,$\\hat{y}_i$ 是预测概率。 ```python # 多分类 loss = 'sparse_categorical_crossentropy' # 或 loss = tf.keras.losses.SparseCategoricalCrossentropy() ```
## 优化器 **梯度下降法**: $$\\theta = \\theta - \\alpha \\nabla L(\\theta)$$ **现代优化器**: | 优化器 | 特点 | 适用场景 | |--------|------|----------| | **SGD + Momentum** | 经典、稳定 | 大规模训练 | | **Adam** | 自适应学习率 | 通用、默认选择 | | **AdamW** | Adam + 权重衰减 | 推荐默认使用 | ```python # Adam optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) # AdamW optimizer = tf.keras.optimizers.AdamW(learning_rate=0.001, weight_decay=0.004) ```
## 评估指标 - **准确率**(Accuracy):正确预测的比例 - **Top-1 / Top-5 准确率**:预测概率最高的 1 个 / 5 个类别中包含正确标签的比例 - **精确率、召回率、F1-Score**:类别不平衡时使用 - **混淆矩阵**:详细分析各类别的预测情况 ```python model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] ) ```
核心概念深入
## 反向传播算法 **核心思想**: 1. **前向传播**:输入数据通过网络,计算输出和损失 2. **反向传播**:从输出层开始,逐层计算梯度 3. **参数更新**:使用梯度下降更新权重 **链式法则**: $$\\frac{\\partial L}{\\partial w} = \\frac{\\partial L}{\\partial a} \\cdot \\frac{\\partial a}{\\partial z} \\cdot \\frac{\\partial z}{\\partial w}$$ **卷积层的反向传播**: $$\\frac{\\partial L}{\\partial W} = X * \\left(\\frac{\\partial L}{\\partial Y}\\right)$$ $$\\frac{\\partial L}{\\partial X} = rot180(W) * \\left(\\frac{\\partial L}{\\partial Y}\\right)$$
## 梯度消失与梯度爆炸 **问题描述**: - **梯度消失**:深层网络中,梯度逐层衰减,前层参数几乎不更新 - **梯度爆炸**:梯度逐层放大,导致参数更新过大,训练不稳定 **解决方案**: | 方法 | 作用 | |------|------| | **ReLU 激活函数** | 缓解梯度消失 | | **批归一化** | 稳定训练 | | **残差连接** | 提供梯度捷径 | | **梯度裁剪** | 限制梯度大小 |
## 过拟合与正则化 **过拟合现象**:训练集表现好,测试集表现差。 **正则化方法**: | 方法 | 原理 | |------|------| | **L1/L2 正则化** | 在损失函数中添加权重惩罚项 | | **Dropout** | 训练时以概率 p 丢弃神经元 | | **数据增强** | 扩充训练数据 | | **早停** | 验证集性能不提升时停止 | | **批归一化** | 稳定分布,轻微正则化效果 | ```python # Dropout tf.keras.layers.Dropout(0.5) # L2 正则化 tf.keras.layers.Dense(64, kernel_regularizer=tf.keras.regularizers.l2(0.001)) ```
## 批归一化(Batch Normalization) **作用**: - 加速训练收敛 - 允许使用更大的学习率 - 减少对初始化的依赖 - 轻微的正则化效果 **公式**: $$BN(x) = \\gamma \\cdot \\frac{x - \\mu_B}{\\sqrt{\\sigma^2_B + \\epsilon}} + \\beta$$ **使用位置**:卷积层之后,激活函数之前 ```python tf.keras.layers.BatchNormalization() ``` > **行业补充**:现代归一化技术 > - **Layer Normalization**:Transformer 中使用 > - **Group Normalization**:小批量场景效果更好
现代架构演进
## 注意力机制 **核心思想**:让网络关注重要的特征区域。 **SENet(Squeeze-and-Excitation)**: ``` 特征图 → 全局平均池化 → FC → ReLU → FC → Sigmoid → 通道权重 ``` **CBAM(Convolutional Block Attention Module)**: - 通道注意力 + 空间注意力 **作用**:让网络自动学习每个通道的重要性,提升特征表达能力。
## 轻量化网络 | 网络 | 核心思想 | 适用场景 | |------|----------|----------| | **MobileNet V1** | 深度可分离卷积 | 移动端 | | **MobileNet V2/V3** | 倒残差结构、SE模块 | 移动端 | | **ShuffleNet** | 通道混洗 | 嵌入式设备 | | **EfficientNet** | 复合缩放(深度、宽度、分辨率) | 通用 | **深度可分离卷积**: 标准卷积参数量:$K \\times K \\times C_{in} \\times C_{out}$ 深度可分离卷积参数量:$K \\times K \\times C_{in} + C_{in} \\times C_{out}$ 参数量减少约 1/8 ~ 1/9
## Vision Transformer(ViT) **核心思想**:将 Transformer 架构应用于图像分类。 **做法**: 1. 将图像切分为 16×16 的 Patch 2. 将每个 Patch 线性投影为向量 3. 加入位置编码 4. 输入 Transformer Encoder 5. 使用 [CLS] token 进行分类 **优势**: - 全局感受野(CNN 是局部感受野) - 在大规模数据上性能超越 CNN - 统一的图像-文本处理框架 > **行业补充**:ViT 的出现标志着视觉领域从 CNN 时代进入 Transformer 时代。
## 自监督学习 **核心思想**:无需人工标注,从数据本身学习特征。 **方法**: - **对比学习**(SimCLR、MoCo):学习相似样本的表示 - **掩码图像建模**(MAE、BEiT):预测被掩码的图像块 **多模态大模型**: | 模型 | 能力 | 特点 | |------|------|------| | **CLIP** | 图文理解 | 对比学习,零样本分类 | | **SAM** | 图像分割 | 提示分割,通用分割模型 | | **GPT-4V** | 视觉问答 | 多模态对话 |
训练技巧
## 激活函数选择 课件使用 `sigmoid`,但现代 CNN 中更常用: | 激活函数 | 公式 | 优点 | 缺点 | |----------|------|------|------| | **ReLU** | $f(x) = \\max(0, x)$ | 计算快、缓解梯度消失 | 神经元"死亡" | | **Leaky ReLU** | $f(x) = \\max(\\alpha x, x)$ | 解决死亡问题 | 需调参 | | **ELU** | $x<0: \\alpha(e^x-1)$ | 平滑负值 | 计算稍慢 | | **GELU** | - | Transformer默认 | 计算复杂 | > **建议**:现代 CNN 默认使用 ReLU 或 Leaky ReLU。
## 学习率策略 | 策略 | 描述 | |------|------| | **Step Decay** | 每隔 N 个 epoch,学习率乘以系数 | | **Exponential Decay** | 学习率指数衰减 | | **Cosine Annealing** | 余弦曲线衰减 | | **Warmup** | 训练初期学习率从小逐渐增大 | | **One-Cycle** | 先增后降,一个周期完成训练 | ```python # 学习率衰减 lr_scheduler = tf.keras.callbacks.LearningRateScheduler( lambda epoch: 0.001 * 0.95 ** epoch ) # 早停 early_stop = tf.keras.callbacks.EarlyStopping( monitor='val_loss', patience=5, restore_best_weights=True ) ```
## 迁移学习 **核心思想**:将在大数据集上预训练的模型,迁移到小规模数据集上进行微调。 **常见做法**: 1. 使用 ImageNet 预训练权重 2. 冻结底层特征提取层 3. 只训练顶层分类层 4. 逐步解冻更多层进行微调 **优势**: - 减少训练时间 - 提升小数据集上的性能 - 降低对标注数据的需求 ```python # 使用预训练模型 base_model = tf.keras.applications.ResNet50( weights='imagenet', include_top=False, input_shape=(224, 224, 3) ) base_model.trainable = False # 冻结底层 ```
## 数据增强 ```python tf.keras.layers.RandomFlip("horizontal"), tf.keras.layers.RandomRotation(0.1), tf.keras.layers.RandomZoom(0.1), tf.keras.layers.RandomBrightness(0.1), ``` **高级增强**: - **Mixup**:将两张图片按一定比例混合 - **CutMix**:将一张图片的局部区域替换为另一张图片的对应区域 - **AutoAugment**:自动学习最优的数据增强策略
参考
## 推荐资源 - **在线演示**:[TensorFlow Playground](http://playground.tensorflow.org) - **经典论文**:LeNet、AlexNet、ResNet 原始论文 - **框架文档**:[TensorFlow Keras Layers](https://www.tensorflow.org/api_docs/python/tf/keras/layers) - **可视化工具**:TensorBoard - **学习路径**: 1. 掌握基础:CNN 原理、反向传播、优化器 2. 实践经典:复现 LeNet → AlexNet → ResNet 3. 深入理解:阅读经典论文,理解设计思想 4. 跟踪前沿:关注 ViT、自监督、多模态 5. 项目实战:参加 Kaggle 竞赛,解决实际问题