Skip to content

CNN 与计算机视觉

本页速览 卷积神经网络是深度学习的第一个引爆点。本文拆解卷积/池化/残差三大构件与从 LeNet 到 ViT 的架构演进,覆盖图像任务家族、迁移学习黄金配方(附 PyTorch 代码)与训练技巧,并梳理 CLIP/SAM/VLM 等视觉大模型现状。

CNN 与计算机视觉

一句话定义:卷积神经网络(Convolutional Neural Network, CNN)是通过卷积、池化与残差连接三大构件,把"局部性、权值共享、平移等变性"这些图像先验直接编入网络结构的深度模型——它是深度学习在 2012 年引爆的第一代主力架构,也是今天几乎所有视觉系统的底层引擎(回顾整体脉络可先读深度学习演进简史)。

一、为什么图像需要 CNN

先看一个反例:把 224×224×3 的彩色图片直接拉平成约 15 万个数字,喂给神经网络基础中讲过的全连接层。第一层若接 1024 个神经元,参数就是 15 万×1024 ≈ 1.5 亿——权重矩阵本身比图像数据还大。这暴露出全连接处理图像的三个问题:

  1. 参数量爆炸:像素多、层一深,参数就天文数字,训练需要的数据和算力都不现实;
  2. 结构信息丢失:展平后像素的二维邻接关系被抹掉,"猫在左、背景在右"的空间结构不复存在;
  3. 没有平移不变性:同一只猫在画面里挪 10 个像素,全连接网络的输入就完全不同,必须靠数据硬扛。

CNN 的解法是给网络注入"图像先验":局部连接(神经元只看一个小邻域)、权值共享(同一卷积核扫遍全图)、层级特征(浅层学边缘纹理、深层学部件与语义)。这套归纳偏置极大压缩了假设空间,让模型用远少得多的参数学到了可泛化的视觉表征。

二、三大构件

卷积层

卷积核(filter)是一个小矩阵,例如 3×3,在输入特征图上滑动做逐元素乘加,生成输出特征图。输出尺寸由三个超参决定:步长(stride,核每次滑几格)、填充(padding,边缘补零)、核数量(决定输出通道数)。假设输入为 224×224×3,用 64 个 3×3 核、步长 1、padding 1,输出就是 224×224×64——输入输出分辨率不变,只是通道数变了。位置 (i,j) 的输出公式为:

$$ y_{i,j,k} = b_k + \sum_{c=0}^{C-1}\sum_{p=0}^{K-1}\sum_{q=0}^{K-1} w_{p,q,k,c}\cdot x_{i+p,,j+q,,c} $$

一次卷积的参数量 = K×K×输入通道×输出通道(再加偏置),例如 3×3×256×256 ≈ 59 万——同样 256 通道输入输出,全连接要算 256²×256²。1×1 卷积不聚合空间信息,只做通道混合,常用来降维或当"可学习的通道加权",在后续很多架构里(含 Transformer 架构的 MLP 里)都能看到它的思想。

池化层

池化对邻域做下采样:最大池化取局部最大值(保留最强响应、带平移不变性),平均池化取均值(更平滑)。2×2 池化把特征图长宽各减半,参数量为零,作用有三:降低计算量、扩大后续卷积的感受野、提供轻度不变性。现代架构里池化地位有所下降(ResNet 用步长卷积替代),但理解它仍是理解 CNN 特征金字塔的起点。

残差连接

残差连接是让 CNN 能"深下去"的关键。直观理解:如果若干层学不到有用变换,最稳妥的选择是"什么都不做"(恒等映射)。于是把层包装成残差块,学习目标是残差 F(x) = H(x) − x,输出 H(x) = F(x) + x。这个加法给梯度留了一条"高速公路":反向传播时梯度能近乎无损地流过跳跃连接(链式法则细节见反向传播与自动微分),从而缓解深层网络的梯度消失。ResNet 正是靠这个结构把网络做到了 152 层,还顺手解决了退化问题(层数增加反而变差的现象)。

直观类比

卷积负责"看局部",池化负责"看更广",残差负责"安全地变深"——三者合起来就是一张"越看越懂、越看越全、越看越稳"的视觉皮层的粗粒度模拟。

三、架构演进表

下表汇总 CNN 主线的里程碑,ImageNet Top-5 错误率均为当年单模型/集成模型在 ILSVRC 上的公开成绩(Top-1 分类任务代表性指标):

模型年份核心贡献ImageNet Top-5 错误率
LeNet-51998卷积+池化+全连接的经典组合,手写数字识别—(MNIST,非 ILSVRC)
AlexNet2012ReLU、Dropout、数据增强、双 GPU;深度学习引爆点15.3%(冠军,远超第二的 26.2%)
VGG2014用堆叠小 3×3 核替代大核,感受野不变、参数更少7.3%
GoogLeNet (Inception)2014Inception 多分支并行 + 1×1 卷积降维6.67%(冠军)
ResNet2015残差连接,152 层训练可行3.57%(冠军,首次超越人类水平 5.1%)
DenseNet2017层间密集连接,特征复用、梯度路径更短5.19%(同年较优)
EfficientNet2019神经架构搜索 + 复合缩放(深/宽/分辨率同调)2.27%(当时 SOTA)
ViT2020纯 Transformer 结构做图像,大预训练数据下反超 CNN88.55% Top-1 准确率(ImageNet-21k 预训练)

从这张表能看到三条规律:架构在变深变宽(LeNet 5 层 → ResNet 152 层)、归纳偏置逐渐让位给数据与算力(ViT 没有卷积先验,靠海量预训练补回来)、自动化参与设计(EfficientNet 用 NAS 搜结构)。关于"结构先验 vs 数据规模"的深层权衡,见DL 设计原则

四、图像任务家族

图像任务远不止分类,但分类往往是它们的地基(分类网络的特征层被几乎所有下游任务复用):

任务目标代表性方法
图像分类整图一个类别AlexNet、ResNet、EfficientNet、ViT
目标检测定位+分类多个物体R-CNN 系(两阶段)、YOLO/SSD(单阶段)、DETR(Transformer)
语义分割每个像素一个类别FCN、U-Net、DeepLab
实例分割区分每个独立物体实例Mask R-CNN
姿态估计关键点定位OpenPose、HRNet
图像检索按内容找相似图度量学习 + 向量检索(特征库)

检测和分割都建立在"先提特征、再定位/分类"的流水线上;姿态估计本质是密集关键点回归。做这些任务常用 COCO、PASCAL VOC 等公开数据集,具体见数据集与工具档案。一个工程现实是:这些任务极少从零训练——几乎都从 ImageNet 预训练的骨干网络(backbone)出发,这也引出下面最实用的一节。

五、迁移学习黄金配方

全站最实用的配方之一。核心思路来自表征学习与预训练:先用海量通用数据学会"通用的视觉特征",再用少量任务数据适配。经典流程四步:

  1. 预训练:在 ImageNet(1400 万张图)等大语料上训练骨干,学到边缘→纹理→部件→语义的层级特征;
  2. 换头:把预训练网络最后的全连接分类层换成新的分类头(类别数改为目标任务);
  3. 冻结与分层微调:先冻结骨干(learning_rate 设为 0 或用低一两个数量级的学习率),只训新头;数据充足时再逐步解冻高层;
  4. 数据增强:随机裁剪、翻转、颜色抖动(ColorJitter)、CutMix 等,等效免费扩数据。

PyTorch 参考实现(基于 torchvision 的 ResNet50):

python
import torch
import torchvision.models as models

model = models.resnet50(weights=models.ResNet50_Weights.IMAGENET1K_V2)
# 换头:把 1000 类的 fc 换成目标 10 类
model.fc = torch.nn.Linear(model.fc.in_features, 10)

# 冻结骨干(头两层按需冻结)
for name, param in model.named_parameters():
    if "fc" not in name:
        param.requires_grad = False

# 分层微调:骨干用低学习率,新头用正常学习率
optimizer = torch.optim.AdamW([
    {"params": model.fc.parameters(), "lr": 1e-3},
    {"params": [p for n, p in model.named_parameters()
                if "fc" not in n and p.requires_grad], "lr": 1e-4},
])

这一配方在分类、检测、分割、检索上几乎通吃,微调的调参细节(何时解冻、用多大学习率)见训练配方与调参

六、训练技巧

从 0 到 1 训练 CNN 或微调时的六个高频技巧:

  • BatchNorm:对每个 batch 的通道做归一化,允许用更大学习率、加速收敛,还带轻微正则效果。训练与推理行为不同(推理用滑动统计量),细节见初始化与归一化
  • 学习率调度:线性 warmup 后接 cosine 退火是当下默认;一个 epoch 内还用 EMA(指数移动平均,权重指数加权平均),常能白拿 0.3~0.5% 精度;
  • 标签平滑:把 one-hot 的 1 换成 0.9/0.1×均匀分布,抑制过度自信、改善泛化(Szegedy 等 2016)——它属于过拟合与正则化中"输出端正则"一类;
  • 混合精度(AMP):FP16/FP32 混算 + 损失缩放,显存减半、速度翻倍级提升,已是训练标配;
  • 数据增强:基础增强 + CutMix/MixUp 等强增强能显著提升鲁棒性;
  • 随机深度/剪枝:训练时随机丢残差块,深层网络训练更稳。

常见坑

ResNet 在 ImageNet 上的默认超参(batch size 256、初始 lr 0.1、90 epoch)不能直接平移到小数据集或不同任务——复制别人配置前先想清楚数据量级,否则大概率过拟合或欠拟合,排查思路见调试与诊断

七、视觉大模型现状

CNN 的下一步是"从专才到通才"。2021 年后视觉模型迅速走向多模态与基础模型(foundation model)范式:

  • CLIP(OpenAI, 2021):用 4 亿图文对做对比学习,让图像特征与文本特征对齐到同一空间,实现零样本图像分类与图文检索;
  • SAM(Segment Anything, Meta, 2023):提示分割基础模型,11M 图像 + 10 亿掩码训练,可对任意物体做分割;
  • VLM 视觉语言模型:GPT-4V、LLaVA、Qwen-VL 等把视觉编码器接上大语言模型,让模型"看图说话"、做视觉问答与推理——这类架构详见多模态模型

这些模型共享一个范式:用大规模弱监督数据做对比或生成式预训练,把视觉、文本(乃至音频)统一进一个表征空间。传统 CNN 在这些系统里往往退化为"视觉编码器"组件,主干反而交给Transformer 架构

八、权衡与取舍

  • 归纳偏置 vs 数据效率:CNN 靠先验在小数据上胜出,ViT 靠数据和算力在超大尺度反超。你的数据量在百万级以下,CNN/混合架构往往更稳;在十亿级语料尺度,纯注意力结构更有上限;
  • 深度 vs 可解释性:层越深越准,但特征越难解释,"为什么判这张图是猫"常是黑盒,相关讨论见可解释性与公平性
  • 精度 vs 速度:EfficientNet 的 NAS 搜出的是"精度/算力帕累托前沿",实际部署还要叠加深度的工程优化(剪枝、量化、蒸馏),见MLOps 与模型部署
  • 视觉 vs 语言范式的合流:自注意力已渗透进视觉,卷积也被引入 Transformer(如 ConvNeXt 的"现代化 ResNet"),两者边界在模糊,不必站队。

延伸阅读

参考资料