第2章 深度学习模型基础回顾:卷积神经网络核心概念、YOLO系列与ResNet在缺陷检测中的应用、模型量化与剪枝原理

各位工程师朋友,咱们直接进入正题。这一章我打算把深度学习模型里跟工业缺陷检测最相关的几个硬核知识点掰开揉碎讲清楚。你可能会觉得“卷积神经网络、YOLO、ResNet”这些词早就听烂了,但真正到了移植和落地的时候,很多细节会卡住你。我当年第一次把YOLOv3往海思3519上搬的时候,就因为没搞懂卷积层的计算量分布,导致推理帧率死活上不去。嗯,咱们今天就把这些坑提前填上。

2.1 卷积神经网络核心概念:你真正需要记住的

CNN说白了就是一套“特征提取流水线”。工业缺陷检测里,我们最关心的是:感受野、参数量、计算量。这三个指标直接决定了模型能不能在嵌入式设备上跑起来。

核心公式(请刻在脑子里):

  • 输出特征图尺寸 = (输入尺寸 - 卷积核尺寸 + 2×填充) / 步长 + 1
  • 参数量 = 卷积核高 × 卷积核宽 × 输入通道 × 输出通道 + 偏置
  • 计算量(FLOPs)≈ 参数量 × 输出特征图高 × 输出特征图宽

为什么强调这个?因为你在做模型剪枝和量化的时候,每一步都在跟这些数字打交道。我见过不少团队,模型在GPU上跑得飞快,一移植到RK3588上就卡成PPT,一查原因——某个3×3卷积层的输出通道数设成了1024,计算量直接爆了。

2.1.1 卷积层 vs 深度可分离卷积

这是嵌入式部署的分水岭。标准卷积一个卷积核同时处理空间和通道信息,而深度可分离卷积把它拆成了两步:先逐通道卷积(Depthwise),再逐点卷积(Pointwise)。

类型 参数量(举例:输入32通道,输出64通道,3×3核) 计算量对比 适用场景
标准卷积 3×3×32×64 = 18,432 高 GPU/云端
深度可分离卷积 3×3×32 + 1×1×32×64 = 288 + 2,048 = 2,336 约1/8 嵌入式/移动端

我的经验:在工业缺陷检测中,如果检测目标比较小(比如划痕、针孔),深度可分离卷积可能会损失一些精度。我建议在浅层用标准卷积保精度,深层用深度可分离卷积降计算量。这叫“混合策略”,我在一个PCB缺陷检测项目里试过,模型体积缩小了60%,mAP只掉了0.3%。

2.2 YOLO系列在缺陷检测中的应用:从V3到V8的取舍

YOLO系列是工业界最爱的目标检测框架,没有之一。原因很简单:快。但不同版本在嵌入式设备上的表现天差地别。

2.2.1 YOLOv3:经典但笨重

YOLOv3用了Darknet-53作为骨干,FPN做多尺度检测。说实话,它在GPU上表现不错,但移植到嵌入式设备上,参数量太大(约61M),推理延迟感人。我曾经在Jetson Nano上跑YOLOv3,640×640输入,帧率只有8FPS,根本没法用。

2.2.2 YOLOv5:轻量化的转折点

YOLOv5引入了CSPNet和Focus层,模型体积大幅下降。它的nano版本(YOLOv5n)只有1.9M参数,在RK3399上能跑到30FPS以上。我个人习惯用YOLOv5s作为工业缺陷检测的基线模型,因为它平衡了速度和精度。

2.2.3 YOLOv8:Anchor-Free的新范式

YOLOv8去掉了Anchor机制,改用Task-Aligned Assigner,训练更简单。但要注意,它的Head部分计算量比YOLOv5大,量化后精度下降更明显。我在一个钢材表面缺陷检测项目里对比过,YOLOv8n量化后mAP下降了4.2%,而YOLOv5s只下降了2.1%。

避坑指南:我曾经在部署YOLOv8到地平线J5芯片时,发现它的Decoupled Head在量化后出现严重的激活值分布偏移。解决方案是在训练时加入QAT(量化感知训练),或者在部署时把Head部分的激活函数从SiLU换成ReLU。这个坑我踩了整整一周才爬出来。

2.3 ResNet在缺陷检测中的应用:残差连接的价值

ResNet的核心贡献是残差连接(Skip Connection),解决了深层网络梯度消失的问题。在缺陷检测中,ResNet通常作为Backbone使用,比如YOLOv3的Darknet-53就借鉴了ResNet的思想。

为什么残差连接对工业缺陷检测特别重要?因为很多缺陷(比如裂纹、气泡)的纹理特征非常细微,需要深层网络才能提取到高级语义信息。如果没有残差连接,网络一深,梯度就传不回去了,浅层学不到东西。

关键数据:在MVTec AD数据集上,使用ResNet-50作为Backbone的检测模型,比使用VGG-16的模型在纹理缺陷类别上AUC高出约5%。这就是残差连接带来的红利。

但ResNet也不是没有缺点。它的Bottleneck结构(1×1→3×3→1×1)虽然减少了参数量,但在嵌入式设备上,1×1卷积的访存开销很大。我建议在部署时把ResNet的某些Bottleneck替换成RepVGG风格的直筒结构,推理速度能提升15%左右。

2.4 模型量化与剪枝原理:从浮点到整数的跨越

这是模型移植中最关键的一步,也是坑最多的一步。量化说白了就是把FP32的权重和激活值用INT8甚至INT4来表示。剪枝则是把不重要的连接或通道直接砍掉。

2.4.1 量化原理:对称量化 vs 非对称量化

量化类型 公式 适用场景 精度损失
对称量化 q = round(r / s) 权重分布对称(如经过BN的权重) 较小
非对称量化 q = round((r - z) / s) 激活值分布偏斜(如ReLU输出) 更小

我个人习惯对权重用对称量化,对激活值用非对称量化。为什么?因为权重经过训练后大致呈零均值分布,而激活值经过ReLU后全是非负的,用非对称量化能更好地利用INT8的256个刻度。

2.4.2 剪枝原理:结构化剪枝才是王道

剪枝分两种:非结构化剪枝和结构化剪枝。非结构化剪枝把单个权重置零,模型变成稀疏矩阵,但大多数嵌入式硬件不支持稀疏加速,所以实际推理速度不降反升。结构化剪枝直接砍掉整个通道或卷积核,硬件友好。

我的建议:做剪枝时,先用L1范数对卷积核排序,剪掉范数最小的20%通道。然后微调几个epoch恢复精度。重复这个过程,直到精度开始明显下降。我在一个电池极片缺陷检测项目里,用这个方法剪掉了40%的通道,推理速度提升了1.8倍,mAP只掉了0.5%。

2.4.3 量化+剪枝的联合优化

先剪枝再量化,效果通常更好。因为剪枝后的模型参数量更少,量化时的校准数据集更容易覆盖整个激活值分布。反过来,先量化再剪枝,量化误差会被剪枝放大,精度损失更严重。

避坑指南:我曾经在一个项目中先做了量化(INT8),然后做剪枝,结果模型精度直接崩了,从95%掉到82%。后来改成先剪枝再量化,精度恢复到了93.5%。这个顺序问题,很多人会忽略。

2.5 本章知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作一个思维导图,也可以当作部署前的检查清单。

第2章知识体系结构图 第2章:深度学习模型基础回顾 - 知识体系 工业缺陷检测模型基础 CNN核心概念 YOLO系列应用 量化与剪枝原理 感受野与参数量 深度可分离卷积 YOLOv3/v5/v8 Anchor-Free 对称/非对称量化 结构化剪枝 ResNet残差连接 部署核心原则 先剪枝后量化 → 联合优化 → 硬件适配 → 精度验证

这张图里,CNN核心概念是地基,YOLO和ResNet是上层建筑,量化与剪枝是通往嵌入式硬件的桥梁。三者缺一不可。你想想看,如果地基没打牢(不理解感受野和计算量),上层建筑再漂亮(YOLOv8精度再高),到了量化剪枝阶段也会塌方。