Skip to content

CNN 与计算机视觉

本页速览 从 AlexNet 到 ViT——卷积神经网络如何统治计算机视觉十年。本文拆解 CNN 的架构演进(AlexNet/ResNet/EfficientNet)、图像任务家族(分类/检测/分割)、训练技巧(迁移学习/数据增强),以及视觉大模型的现状。

CNN 与计算机视觉 ​

概念定义:用局部性先验看世界 ​

卷积神经网络(Convolutional Neural Network, CNN)是专门为图像等网格结构数据设计的神经网络。它的核心假设是局部性:图像中相邻像素的关系远比远处像素重要——一只猫的耳朵、眼睛、胡须都是局部特征,通过滑动窗口(卷积核)提取,再逐层组合成"猫"的语义。

原始图像 → 卷积层(提取局部特征)→ 池化层(压缩尺寸)
        → 卷积层 → 池化层 → … → 展平 → 全连接层 → 类别概率

CNN 相比全连接网络的两个决定性优势:

  1. 参数共享:一个卷积核在全图滑动复用——一张 224×224×3 的图像,全连接第一层就有千万级参数,CNN 只用几千个;
  2. 平移不变性:猫在图像左上角还是右下角,卷积核都能识别——全连接网络做不到。

二、CNN 的三大构件 ​

1. 卷积层:滑动的特征探测器 ​

一个卷积核(如 3×3×3)在输入上滑动,每个位置做加权求和,输出一张特征图(feature map)。多个核 = 多个特征图(检测不同模式:边缘、颜色、纹理)。两个超参数:

  • 步长(stride):核每次滑动的像素数,>1 时输出尺寸缩小;
  • 填充(padding):边缘补零,保持输出尺寸(same padding)。

感受野(receptive field):每个输出像素"看到"的输入区域大小。浅层感受野小(看局部),深层感受野大(看整体)——这就是"浅层学边缘、深层学语义"的机制。

2. 池化层:压缩与不变性 ​

最大池化(Max Pooling):在 2×2 窗口取最大值——保留最强响应、丢弃精确位置。作用:降维(减少计算量)、带来一定平移不变性、防止过拟合。现代网络(ResNet 后)倾向用"步长 2 的卷积"代替池化,但思想一致。

3. 残差连接:让网络变深的钥匙 ​

2015 年 ResNet 之前的困境:网络加到 20+ 层,训练误差反而上升(退化问题——不是过拟合,是深层网络难优化)。ResNet 的解法极其简单:

输出 = F(x) + x     (F 是卷积块,x 是输入,即"残差")

让网络学习"残差"而不是完整映射:如果某层已经最优,残差学习只需把 F 学到 0(输出 = 输入),学习难度骤降。ResNet 借此做到 152 层,ImageNet top-5 错误率 3.57% 首次超过人类(约 5.1%)。残差连接今天已是所有深层网络的标配(Transformer 里也有)。

三、架构演进时间线 ​

年份模型关键贡献ImageNet top-5 错误率
2012AlexNetGPU + ReLU + Dropout + 数据增强,引爆深度学习15.3%(前一年冠军 26.2%)
2014VGG小卷积核(3×3)堆深,结构规整7.3%
2014GoogLeNet(Inception)多尺度卷积并行 + 1×1 卷积降维6.7%
2015ResNet残差连接,152 层3.57%(超过人类)
2017DenseNet层间稠密连接,特征复用3.46%
2019EfficientNet神经架构搜索(NAS)联合缩放深度/宽度/分辨率2.9% 以下
2020ViTTransformer 直接吃图像 patch,视觉大模型开端追平 CNN

趋势:从"手工设计架构"(VGG/ResNet)到"NAS 自动搜架构"(EfficientNet),再到"Transformer 统一视觉与语言"(ViT)。2021 年后的视觉大模型(CLIP、SAM、DINO)基本以 ViT 或 CNN 混合为主,但CNN 的局部性先验仍在轻量、移动端场景占优。

四、图像任务家族 ​

任务目标代表模型指标
图像分类整图 → 类别ResNet、EfficientNet、ViTtop-1/top-5 准确率
目标检测定位 + 分类多个目标YOLO(单阶段)、Faster R-CNN(两阶段)mAP
语义分割每个像素 → 类别U-Net、DeepLabmIoU
实例分割分割 + 区分个体Mask R-CNNmAP
姿态估计关键点定位HRNet、OpenPoseOKS/AP
图像检索/嵌入图像 → 向量度量学习、CLIPRecall@K

检测 vs 分割:检测给"框 + 类别",分割给"像素级掩码"。业务上:质检用分类/检测,医学影像、自动驾驶用分割,跨模态搜索用嵌入。

五、图像任务的黄金配方:迁移学习 ​

几乎所有实际图像项目都从预训练模型开始,而不是从零训练:

  1. 加载预训练权重:ImageNet 上训练好的 ResNet/EfficientNet(免费、质量高);
  2. 替换分类头:把最后全连接层换成自己任务的输出维度;
  3. 两阶段训练:先冻结主干只训新分类头(几轮),再解冻主干小学习率微调(few epochs);
  4. 数据增强:随机裁剪、翻转、颜色抖动(每 epoch 变着花样喂数据,等于免费扩数据)。
python
import torchvision.models as models
import torch.nn as nn

backbone = models.resnet18(weights=models.ResNet18_Weights.IMAGENET1K_V1)
backbone.fc = nn.Linear(512, num_classes)          # 换分类头
# 冻结主干(先只训分类头)
for p in backbone.parameters():
    p.requires_grad = False
for p in backbone.fc.parameters():
    p.requires_grad = True

为什么有效:ImageNet 上学到的底层特征(边缘、纹理、形状)是通用的,小数据集任务只需适配高层语义。冻结 + 微调的分层策略是小数据图像项目的核心套路。

迁移学习的三条纪律

  1. 数据增强别过度:翻转/裁剪对"方向敏感"任务(车牌识别、医学图像)会毁掉标签语义;
  2. 微调学习率要小:预训练权重已经很好了,学习率大一步就毁了;
  3. 类别不平衡照旧要处理:预训练解决的是"特征",不是"样本分布"。

六、训练图像模型的关键技巧 ​

  • BatchNorm:CNN 标配,稳定训练、加速收敛、自带轻微正则化(放在卷积后、激活前);
  • 学习率:warmup + 余弦退火,峰值 1e-3 量级(微调时 1e-4~1e-5);
  • 标签平滑(Label Smoothing):分类头输出软化(不追求 100% 置信),抑制过拟合;
  • EMA(指数滑动平均):对权重做滑动平均,推理用均值权重,稳定涨点;
  • 混合精度训练:FP16 前向/反向 + FP32 主权重,显存减半、速度翻倍(PyTorch AMP 一行开启)。

七、视觉大模型与现状(2023–2026) ​

CNN 之后,视觉进入"大模型"时代:

  • CLIP(2021):图像 + 文本联合训练,图像编码器学到跨模态语义——"猫的照片"和"cat"映射到相近向量,支撑文生图(Stable Diffusion 用它做文本编码)与零样本分类;
  • SAM(2023):分割一切(Segment Anything),提示词驱动(点/框/文本)的通用分割模型;
  • 视觉-语言模型(VLM):GPT-4V、Gemini、Qwen-VL 等把视觉理解并入 LLM,图像问答、文档理解成为主流;
  • 视觉 tokenizer 趋势:越来越多系统把图像切成 token 喂给 Transformer——CNN 的"局部先验"正在被"数据规模"替代。

给从业者的现状判断:工业界视觉项目 = 预训练 CNN/ViT 微调 + 检测/分割框架(MMDetection、Detectron2)+ 数据增强 + 蒸馏(大模型蒸馏成小模型部署)。大模型(VLM)负责"理解",小模型负责"高速推理"。

八、权衡与取舍 ​

  • CNN vs ViT:数据小、资源少 → CNN(先验强、效率高);数据大、要跨模态 → ViT/视觉大模型;
  • 精度 vs 速度:检测用 YOLO(快)还是 Faster R-CNN(准)——按实时性需求定;部署量化 + TensorRT/ONNX 加速;
  • 微调 vs 蒸馏:小模型直接微调简单,大模型蒸馏到小模型质量更高但工程重;
  • 监督 vs 自监督:标注贵时用自监督预训练(MAE、DINO)或 CLIP 零样本,再少量标注微调。

延伸阅读 ​

参考资料 ​