Skip to content

03 - 计算机视觉

掌握卷积神经网络架构演进与图像处理核心技术。

模块概览

属性
前置要求02-神经网络, 线性代数, Python
学习时长3-4 周
Notebooks20+
难度⭐⭐⭐ 中级

学习目标

完成本模块后,你将能够:

  • ✅ 理解卷积、池化等基本操作的数学原理
  • ✅ 掌握 CNN 经典架构的设计思想和演进历程
  • ✅ 熟练应用迁移学习和数据增强技术
  • ✅ 实现图像分类、目标检测和语义分割任务
  • ✅ 理解 Vision Transformer 的工作原理

子模块详解

01. CNN 基础

理解卷积神经网络的核心组件。

组件功能关键参数
卷积层特征提取kernel_size, stride, padding
池化层下采样,增强平移不变性pool_size, stride
激活函数引入非线性ReLU, LeakyReLU, GELU
全连接层分类决策units, dropout

卷积操作公式

Oi,j=mnIi+m,j+nKm,n+b

输出尺寸计算

O=WK+2PS+1

其中 W 为输入尺寸,K 为卷积核大小,P 为填充,S 为步长。

代码实现

python
import torch.nn as nn

class ConvBlock(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3):
        super().__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, padding=1)
        self.bn = nn.BatchNorm2d(out_channels)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        return self.relu(self.bn(self.conv(x)))

02. 经典架构演进

CNN 架构的发展历程与核心创新。

架构演进时间线

1998        2012        2014           2015        2017         2020
 │           │           │              │           │            │
 ▼           ▼           ▼              ▼           ▼            ▼
LeNet ──► AlexNet ──► VGG/GoogLeNet ──► ResNet ──► SENet ──► EfficientNet/ViT
 │           │           │              │           │            │
 ▼           ▼           ▼              ▼           ▼            ▼
卷积+池化   ReLU+Dropout  深度网络      残差连接    注意力机制    NAS/Transformer
架构年份层数Top-5 错误率核心创新
LeNet19985-卷积神经网络开创
AlexNet2012816.4%ReLU, Dropout, GPU训练
VGG201416/197.3%小卷积核堆叠 (3×3)
GoogLeNet2014226.7%Inception 模块
ResNet20151523.6%残差连接
DenseNet2017121+3.5%密集连接
EfficientNet2019-2.9%复合缩放
ViT2020--纯 Transformer

ResNet 残差块

y=F(x,{Wi})+x
python
class ResidualBlock(nn.Module):
    def __init__(self, channels):
        super().__init__()
        self.conv1 = nn.Conv2d(channels, channels, 3, padding=1)
        self.bn1 = nn.BatchNorm2d(channels)
        self.conv2 = nn.Conv2d(channels, channels, 3, padding=1)
        self.bn2 = nn.BatchNorm2d(channels)

    def forward(self, x):
        residual = x
        out = F.relu(self.bn1(self.conv1(x)))
        out = self.bn2(self.conv2(out))
        out += residual  # 残差连接
        return F.relu(out)

03. 迁移学习

利用预训练模型加速训练和提升性能。

策略方法适用场景
特征提取冻结预训练层,只训练分类头数据量少,任务相似
微调解冻部分/全部层,小学习率训练数据量中等
从头训练只用预训练权重初始化数据量大,任务差异大

微调策略

python
import torchvision.models as models

# 加载预训练模型
model = models.resnet50(pretrained=True)

# 冻结所有层
for param in model.parameters():
    param.requires_grad = False

# 替换分类头
model.fc = nn.Sequential(
    nn.Linear(2048, 512),
    nn.ReLU(),
    nn.Dropout(0.5),
    nn.Linear(512, num_classes)
)

# 只训练分类头
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)

04. 数据增强

提升模型泛化能力的关键技术。

增强方法描述适用场景
几何变换翻转、旋转、缩放、裁剪通用
颜色变换亮度、对比度、饱和度调整通用
Cutout随机遮挡图像区域分类任务
Mixup混合两张图像及标签分类任务
CutMix剪切粘贴图像区域分类任务
AutoAugment自动搜索增强策略大规模数据集

PyTorch 数据增强

python
from torchvision import transforms

train_transform = transforms.Compose([
    transforms.RandomResizedCrop(224),
    transforms.RandomHorizontalFlip(),
    transforms.ColorJitter(brightness=0.2, contrast=0.2),
    transforms.RandomRotation(15),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                        std=[0.229, 0.224, 0.225])
])

05. 目标检测

从图像中定位和识别多个目标。

检测算法分类

类型代表算法特点
两阶段R-CNN, Fast R-CNN, Faster R-CNN精度高,速度慢
单阶段YOLO, SSD, RetinaNet速度快,端到端
Anchor-FreeCenterNet, FCOS无需预设锚框
TransformerDETR, Deformable DETR端到端,无NMS

YOLO 核心思想

输入图像 ──► 划分网格 ──► 每个网格预测 ──► NMS 后处理


                    (x, y, w, h, confidence, class_probs)

IoU 计算

IoU=AreaintersectionAreaunion

06. 语义分割

对图像进行像素级分类。

架构特点应用场景
FCN全卷积,端到端通用分割
U-Net编码器-解码器,跳跃连接医学图像
DeepLab空洞卷积,ASPP高精度分割
Mask R-CNN实例分割目标检测+分割

U-Net 架构

编码器 (下采样)          解码器 (上采样)
    │                        │
    ▼                        ▼
[64] ──────────────────► [64] ──► 输出
    │                        ▲
[128] ─────────────────► [128]
    │                        ▲
[256] ─────────────────► [256]
    │                        ▲
[512] ─────────────────► [512]
    │                        ▲
    └──────► [1024] ─────────┘
              瓶颈层

07. Vision Transformer (ViT)

将 Transformer 应用于计算机视觉。

ViT 工作流程

输入图像 ──► 分割为 Patches ──► 线性嵌入 ──► 加位置编码 ──► Transformer Encoder ──► 分类
 (224×224)    (16×16 patches)    (768-dim)

核心公式

z0=[xclass;xp1E;xp2E;...;xpNE]+Eposzl=MSA(LN(zl1))+zl1zl=MLP(LN(zl))+zl

ViT vs CNN 对比

特性CNNViT
归纳偏置局部性、平移等变性较少
数据需求中等大量数据
计算复杂度O(n)O(n²)
全局建模需要深层网络天然支持

实验列表

实验内容文件
CNN 基础从零实现卷积层01_cnn_basics.ipynb
LeNet 实现MNIST 手写数字识别02_lenet_mnist.ipynb
VGG 训练CIFAR-10 分类03_vgg_cifar10.ipynb
ResNet 实现残差网络从零实现04_resnet_scratch.ipynb
迁移学习ImageNet 预训练微调05_transfer_learning.ipynb
数据增强增强策略对比实验06_data_augmentation.ipynb
目标检测YOLO 实现与训练07_yolo_detection.ipynb
语义分割U-Net 医学图像分割08_unet_segmentation.ipynb
ViT 实现Vision Transformer09_vit_implementation.ipynb

参考资源

教材

  • Goodfellow et al. (2016). Deep Learning - Chapter 9: Convolutional Networks
  • Prince, S. (2023). Understanding Deep Learning - 在线阅读

论文

  • He et al. (2016). Deep Residual Learning for Image Recognition
  • Dosovitskiy et al. (2020). An Image is Worth 16x16 Words: Transformers for Image Recognition
  • Redmon et al. (2016). You Only Look Once: Unified, Real-Time Object Detection
  • Ronneberger et al. (2015). U-Net: Convolutional Networks for Biomedical Image Segmentation

视频课程

Released under the MIT License.