4. 深度学习基础回顾

各位同学,今天我们进入深度学习基础回顾。别小看这一章,虽然都是基础概念,但它们是整个AI ISP管线的地基。我在做ISP算法落地时,发现很多问题追根溯源,都是对这几个基础模块理解不够深。

说白了,CNN是眼睛,ResNet是梯子,Attention是聚光灯,轻量化网络是减肥教练。咱们一个一个来拆解。

4.1 卷积神经网络(CNN)—— 视觉系统的“像素扫描仪”

CNN的核心思想,就是局部连接 + 权值共享。你想想看,一张1080P的图,如果用全连接去处理,参数数量直接爆炸。CNN用一个小窗口(卷积核)滑过整张图,每个位置都用同一组权重,这效率就上来了。

核心三要素:

  • 卷积核(Kernel):特征提取器,3x3、5x5最常见
  • 步长(Stride):每次滑动的像素数
  • 填充(Padding):保持特征图尺寸,常用same/valid

我在项目中遇到过一个问题:用3x3卷积堆叠时,感受野不够大,导致ISP去噪时纹理细节丢失。后来加了空洞卷积(Dilated Conv),才把大尺度特征抓回来。嗯,这里要注意,空洞卷积虽然能扩大感受野,但用多了会产生网格效应,需要配合标准卷积一起用。

实战小技巧:在ISP管线中,浅层卷积用大核(5x5)抓低频噪声,深层用小核(3x3)恢复纹理细节。我习惯在第一个卷积层用7x7,步长2,快速降分辨率同时保留空间信息。

4.2 残差网络(ResNet)—— 让网络“深”得下去

为什么网络越深反而越难训练?不是过拟合,是梯度消失/爆炸。ResNet的解决方案简单粗暴:让输入跳过一些层,直接加到输出上。这就是残差连接(Skip Connection)。

公式很简单:输出 = F(x) + x。当F(x)学不到东西时,至少还有x能传回去,梯度就不会消失。

# 一个典型的残差块(PyTorch风格)
class BasicBlock(nn.Module):
    def __init__(self, in_channels, out_channels, stride=1):
        super().__init__()
        self.conv1 = nn.Conv2d(in_channels, out_channels, 3, stride, 1)
        self.bn1 = nn.BatchNorm2d(out_channels)
        self.conv2 = nn.Conv2d(out_channels, out_channels, 3, 1, 1)
        self.bn2 = nn.BatchNorm2d(out_channels)
        # 捷径连接,处理维度不匹配
        self.shortcut = nn.Sequential()
        if stride != 1 or in_channels != out_channels:
            self.shortcut = nn.Sequential(
                nn.Conv2d(in_channels, out_channels, 1, stride),
                nn.BatchNorm2d(out_channels)
            )

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

我曾经在调优一个去摩尔纹网络时,发现50层以上的网络训练loss死活降不下去。加了残差连接后,收敛速度直接翻倍。说白了,ResNet让深度学习真正有了“深度”。

避坑指南:残差连接不是万能的。当输入和输出通道数不一致时,需要用1x1卷积做维度匹配。我见过有人直接用padding补零,结果特征分布被破坏,效果反而变差。

4.3 注意力机制(Attention)—— 让网络学会“看哪里”

CNN对所有位置一视同仁,但人眼看图时,会聚焦在关键区域。注意力机制就是干这个的。在ISP场景中,天空区域和暗部区域需要的处理策略完全不同,注意力机制能自动分配权重。

我常用的几种注意力模块:

类型 核心思想 ISP应用场景
通道注意力(SE-Net) 全局平均池化 + 全连接,学习通道权重 色彩校正、白平衡
空间注意力(CBAM) 空间维度上学习权重图 去噪、去模糊(保留边缘)
自注意力(Self-Attention) 计算任意两点之间的相关性 去摩尔纹、超分辨率

我的经验:在ISP管线中,通道注意力对颜色恢复帮助极大。我曾经在RAW域去噪网络里加了一个SE模块,PSNR提升了0.3dB,而且计算量只增加了不到5%。性价比很高。

为什么会这样?因为不同通道对应不同的颜色分量或频率分量,通道注意力能告诉网络“现在该关注红色通道还是蓝色通道”。

4.4 模型轻量化(MobileNet / ShuffleNet)—— 让AI跑在手机上

ISP管线最终要部署在手机、摄像头等边缘设备上。模型太大,帧率上不去,功耗压不住。轻量化网络就是解决这个问题的。

MobileNet的核心:深度可分离卷积(Depthwise Separable Conv)

把标准卷积拆成两步:

  1. Depthwise Conv:每个通道单独做3x3卷积
  2. Pointwise Conv:用1x1卷积融合通道信息

计算量对比:标准卷积 = 3x3x3x3 = 81,深度可分离 = 3x3x3 + 3x3 = 36,直接减半。

ShuffleNet的核心:通道混洗(Channel Shuffle)

分组卷积会导致组间信息不流通,ShuffleNet通过打乱通道顺序,让不同组的信息互相融合。我试过在ISP的浅层特征提取中用ShuffleNet,参数量降了40%,推理速度提升明显。

# 深度可分离卷积实现(简化版)
class DepthwiseSeparableConv(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3):
        super().__init__()
        self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size,
                                   padding=kernel_size//2, groups=in_channels)
        self.pointwise = nn.Conv2d(in_channels, out_channels, 1)

    def forward(self, x):
        return self.pointwise(self.depthwise(x))

选型建议:

  • 追求极致速度 → ShuffleNetV2(通道混洗 + 内存访问优化)
  • 追求精度与速度平衡 → MobileNetV3(NAS搜索 + 激活函数优化)
  • 追求超低功耗 → 考虑二值化网络(BNN),但精度损失较大

4.5 本章知识体系总览

下面这张图,是我自己梳理的深度学习基础模块在ISP管线中的位置关系。你把它记在脑子里,后面讲具体管线搭建时,就知道每个模块该放在哪里了。

深度学习基础模块在AI ISP管线中的位置 RAW输入 CNN特征提取 卷积核滑动扫描,提取局部特征 ResNet残差连接 解决梯度消失,支持深层网络 注意力机制 通道/空间/自注意力 轻量化网络 MobileNet / ShuffleNet 特征融合与重建 ISP输出(RGB) 💡 核心思路 CNN提取 → 残差加深 → 注意力聚焦 → 轻量化部署

总结一下:

  • CNN:特征提取的基础操作,局部连接 + 权值共享
  • ResNet:让网络能堆到100层以上,残差连接是关键
  • Attention:告诉网络该关注哪里,通道和空间两个维度都要考虑
  • 轻量化:深度可分离卷积 + 通道混洗,是移动端部署的标配

这些基础模块,后面每一章都会用到。尤其是注意力机制和轻量化网络,在ISP实时处理中几乎是必选项。你先把这些概念吃透,后面讲具体管线搭建时,我们直接上手调参。