4. YOLOv7精读
YOLOv7这篇,我前前后后读了好几遍。说实话,刚拿到手的时候,感觉它跟YOLOv5长得挺像。但仔细一抠细节,发现里面藏了不少“私货”。
这一章,咱们就把里最核心的几个模块拆开来看。网络长什么样?ELAN和E-ELAN到底在搞什么名堂?MPConv又是干嘛的?
嗯,咱们一个一个来。
4.1 网络架构总览:一张图看懂YOLOv7
先看整体结构。YOLOv7延续了“Backbone + Neck + Head”的经典范式。但它的Backbone和Neck里,大量使用了ELAN和MPConv这两个“积木块”。
我个人习惯把YOLOv7的网络分成三块:
- Backbone(主干网络):负责提取图像特征。它由多个ELAN模块堆叠而成,中间穿插MPConv进行下采样。
- Neck(颈部):负责特征融合。它采用了类似FPN+PAN的结构,但内部也换成了ELAN和MPConv。
- Head(检测头):负责输出预测结果。YOLOv7用的是“重参数化”的检测头,跟YOLOv5的Coupled Head不太一样。
下面这张图,是我根据描述重新梳理的。它把关键模块和连接关系都标出来了。
核心思路:YOLOv7的设计哲学是“用更少的层,做更多的事”。它没有盲目堆叠深度,而是通过精心设计的模块,让信息流动更高效。
我的经验:刚开始看YOLOv7的结构图时,我被那些密密麻麻的箭头搞晕了。后来我把它拆成“下采样路径”和“上采样路径”两条线来看,一下子就清晰了。你试试看。
4.2 ELAN模块:让梯度“抄近道”
ELAN,全称是“Efficient Layer Aggregation Network”。说白了,它就是一个“让信息抄近道”的模块。
传统的残差网络,信息要经过很多层才能从输入传到输出。ELAN不一样,它把输入分成两条路:一条走“短路径”,一条走“长路径”。最后再把两条路径的结果拼在一起。
这样做的好处是什么?
- 梯度流更顺畅:短路径让梯度可以直接回传到前面,避免了梯度消失。
- 特征复用更充分:不同路径提取的特征,在通道维度上拼接,信息更丰富。
- 计算量更小:相比同等深度的普通卷积,ELAN的参数量更少。
我在项目中遇到过一个问题:用YOLOv5训练小目标检测,发现深层特征图上的小目标信息几乎消失了。后来换成YOLOv7的ELAN结构,情况好了很多。原因就是ELAN的短路径保留了更多浅层细节。
ELAN的核心公式:输出 = Conv( Concat( 短路径特征, 长路径特征 ) )
其中,短路径通常只经过1-2个卷积,长路径经过3-4个卷积。两者在通道维度拼接后,再用一个1x1卷积融合。
4.3 E-ELAN模块:让模型“学会”选择路径
E-ELAN是ELAN的升级版。多了一个“E”,意思是“Extended”。
它跟ELAN有什么区别?
ELAN的路径是固定的:短路径走哪几条,长路径走哪几条,都是设计好的。E-ELAN不一样,它引入了“分组卷积”和“随机路径”的概念。
具体来说,E-ELAN把输入特征图分成多个组。每个组走不同的路径。在训练时,这些路径是随机选择的。在推理时,所有路径的结果会合并在一起。
你想想看,这像什么?
有点像“模型集成”的轻量版。它让模型在训练时见过更多样化的特征组合,从而提升了泛化能力。
| 特性 | ELAN | E-ELAN |
|---|---|---|
| 路径数量 | 固定(通常2条) | 可扩展(多条) |
| 路径选择 | 手工设计 | 随机/学习 |
| 计算开销 | 低 | 中等 |
| 适用场景 | 轻量模型 | 大型模型 |
注意:E-ELAN虽然效果好,但训练时显存占用会高一些。我曾经在2080Ti上尝试训练YOLOv7-E6E,结果显存爆了。后来我减少了batch size,才跑起来。如果你显存紧张,建议先用ELAN版本。
4.4 MPConv模块:下采样的“新花样”
MPConv,全称是“MaxPooling Convolution”。它把最大池化和卷积结合在了一起。
传统的下采样,要么用步长为2的卷积,要么用最大池化。MPConv把两者都用了:
- 输入特征图分成两路。
- 一路经过最大池化(步长2),再经过一个1x1卷积。
- 另一路经过一个1x1卷积,再经过一个步长为2的3x3卷积。
- 最后把两路的结果在通道维度上拼接。
这样做的好处是:既保留了最大池化的“平移不变性”,又保留了卷积的“学习能力”。
我刚开始看到这个设计时,觉得有点多余。后来在项目中对比了一下,发现MPConv确实比单纯的步长卷积效果好那么1-2个点。尤其是在目标尺度变化大的场景下,MPConv的鲁棒性更好。
小技巧:如果你在部署时发现MPConv速度慢,可以尝试把它替换成步长为2的卷积。效果会稍微差一点,但速度能提升不少。具体怎么选,看你更看重精度还是速度。
4.5 本章小结:三个模块,一个目标
ELAN、E-ELAN、MPConv,这三个模块看似不同,但目标是一致的:在保持计算效率的同时,最大化信息流动。
- ELAN通过“抄近道”让梯度流更顺畅。
- E-ELAN通过“随机路径”让模型学得更全面。
- MPConv通过“双路径下采样”让特征保留更完整。
理解了这三个模块,YOLOv7的网络结构你就掌握了七八成。剩下的,就是一些细节上的“调优”了。