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)
把标准卷积拆成两步:
- Depthwise Conv:每个通道单独做3x3卷积
- 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管线中的位置关系。你把它记在脑子里,后面讲具体管线搭建时,就知道每个模块该放在哪里了。
总结一下:
- CNN:特征提取的基础操作,局部连接 + 权值共享
- ResNet:让网络能堆到100层以上,残差连接是关键
- Attention:告诉网络该关注哪里,通道和空间两个维度都要考虑
- 轻量化:深度可分离卷积 + 通道混洗,是移动端部署的标配
这些基础模块,后面每一章都会用到。尤其是注意力机制和轻量化网络,在ISP实时处理中几乎是必选项。你先把这些概念吃透,后面讲具体管线搭建时,我们直接上手调参。