|
## 什么是计算机视觉
计算机视觉(Computer Vision, CV)是人工智能的重要分支,旨在让计算机能够"看懂"图像和视频内容,并从中提取有用的信息。
### 传统方法 vs 深度学习
```
传统方法:
图像 → 手工特征提取(SIFT/HOG)→ 分类器(SVM/随机森林)→ 类别
深度学习方法:
图像 → 卷积神经网络(自动特征提取)→ 全连接层 → Softmax → 类别概率
```
> **行业补充**:现代 CV 已进入"大模型时代",如 CLIP、SAM 等模型实现了视觉-语言的统一理解。
|
|
## 计算机视觉三大基本任务
| 任务 | 描述 | 应用场景 |
|------|------|----------|
| **图像分类** | 为图像分配类别标签 | 人脸识别、医学影像诊断 |
| **目标检测** | 定位并识别图像中的多个对象 | 自动驾驶、安防监控 |
| **图像分割** | 像素级别的分类 | 医学图像分析、遥感图像 |
### 特征学习的层次性
卷积神经网络通过多层结构学习层次化特征:
| 网络层 | 学习特征 | 可视化示例 |
|--------|----------|------------|
| **第1层** | 边缘、颜色、简单纹理 | 水平/垂直边缘检测器 |
| **第2层** | 更复杂的纹理 | 布纹、叶纹、网格 |
| **第3层** | 局部模式 | 烛光、萤火、鸡蛋黄色 |
| **第4层** | 物体部件 | 狗脸、圆柱体、七星瓢虫 |
| **第5层** | 完整物体 | 花朵、黑眼圈动物、键盘 |
> **关键洞察**:增加层数 → 学习更抽象的概念;增加节点数 → 增加同一层特征的种类。
|
|
## 为什么需要深度学习
传统计算机视觉方法依赖手工设计的特征(如 SIFT、HOG),而深度学习能够:
- **自动学习特征**:从原始像素中自动提取层次化特征
- **端到端训练**:直接从数据到结果的优化
- **泛化能力强**:学习到的特征可迁移到其他任务
### 图像分类任务定义
**输入**:一张图像(如 224×224×3 的 RGB 图像)
**输出**:该图像属于各个类别的概率分布
|
|
## 为什么需要 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 竞赛,解决实际问题
|