187、YOLOv11 结构化剪枝实战一:依赖图构建、稀疏训练与 BN 权重分析
从一次线上事故说起
去年年底,我负责的一个工业质检项目,模型部署在 Jetson Orin NX 上,YOLOv11s 跑 640x640 输入,FPS 死活卡在 28 帧,离客户要求的 30 帧就差那么一口气。试了 TensorRT FP16、INT8 量化,精度掉得妈都不认识——mAP 从 0.723 直接跳水到 0.651。后来我盯着模型结构图看了三天,发现 Neck 部分有 12 个 3x3 卷积层,通道数全是 256,但 BN 层的 gamma 值分布极其稀疏——超过 60% 的通道 gamma 值小于 0.01。这些通道对最终输出几乎没贡献,却白白占着算力。
这就是结构化剪枝的典型场景:不是所有通道都值得保留,但直接删通道会导致特征图维度错乱,必须用依赖图来保证网络拓扑的完整性。今天这篇笔记,我会把依赖图构建、稀疏训练、BN 权重分析这三个核心步骤拆开揉碎,代码全部来自我实际跑过的实验,踩过的坑会特别标注。
依赖图构建:别让剪枝把网络剪成筛子
结构化剪枝和权重剪枝最大的区别在于:你不能随便把某个卷积层的某几个通道删掉就完事。YOLOv11 的 C2f 模块里,一个卷积层的输出可能同时喂给后面的卷积、残差连接、甚至上采样层。删掉一个通道,所有依赖这个通道的层都会报维度错误。
我最早犯的错误就是直接对 BN 层做阈值剪枝,结果模型推理时直接崩了,报错信息是“size mismatch”。后来我翻了一遍 YOLOv11 的源码,发现它的网络结构里存在大量