yolov7详细讲解,包括网络结构图、关键创新点、部署。

一版 YOLOv7 详细讲解 ,按 网络结构图 → 各模块作用 → 关键创新点 → 训练与推理 → 部署 来讲。这里以 YOLOv7 CVPR 2023 论文官方仓库官方配置文件 为准。YOLOv7 的核心不是单纯"换了个 backbone",而是把 E-ELAN、面向拼接网络的复合缩放、计划式重参数化、辅助头深监督与 lead-guided label assignment 串成了一整套。([CVF Open Access][1])

1. YOLOv7 是什么

YOLOv7 是一套面向实时目标检测的单阶段检测器。论文把它的主题概括为 "Trainable Bag-of-Freebies" :也就是通过一批主要发生在训练期的设计来提升精度,同时尽量不增加推理成本。论文还给出一个很醒目的结果:YOLOv7 在其发布时,在 5 FPS 到 120 FPS 的实时检测区间里取得了很强的速度-精度权衡,并在 30 FPS 以上 的已知实时检测器里达到了 56.8% AP。([CVF Open Access][1])

官方仓库给出的主模型族包括 YOLOv7、YOLOv7-X、YOLOv7-W6、YOLOv7-E6、YOLOv7-D6、YOLOv7-E6E 。在 COCO 测试集上,官方 README 列出的结果是:YOLOv7 640 输入 51.4 AP / 161 FPS ,YOLOv7-X 53.1 AP / 114 FPS ,YOLOv7-W6 1280 输入 54.9 AP / 84 FPS ,YOLOv7-E6E 56.8 AP / 36 FPS。([GitHub][2])

2. 先看默认检测版的网络结构图

以官方 cfg/training/yolov7.yaml 的默认 P5 检测模型为例,它是 3 检测层、anchor-based、P3/P4/P5 输出 。配置文件里明确写了 3 组 anchor,分别对应 P3/8、P4/16、P5/32 ,最后由 IDetect 做检测输出。([GitHub][3])

可以把它画成这张简化结构图:

text 复制代码
Input
 └─ Backbone
    ├─ Stem Conv
    ├─ Stage P2
    ├─ E-ELAN style stage -> P3/8
    ├─ E-ELAN style stage -> P4/16
    └─ E-ELAN style stage -> P5/32

 └─ Head / Neck
    ├─ SPPCSPC
    ├─ Top-down FPN/PAN fusion:
    │   P5 -> upsample -> fuse with P4
    │   -> upsample -> fuse with P3
    ├─ Bottom-up aggregation:
    │   P3 -> downsample -> fuse
    │   -> downsample -> fuse
    ├─ RepConv on three output branches
    └─ IDetect(P3, P4, P5)

Outputs:
  Small  : P3/8
  Medium : P4/16
  Large  : P5/32

如果按 yolov7.yaml 逐层看,Backbone 从多层 Conv 开始,经过多次 Concat 聚合形成类似 E-ELAN 的计算块;Head 先接一个 SPPCSPC,再做两次上采样融合和两次下采样回传,最后在三路输出前接 RepConv,再进入 IDetect。配置里这三路 RepConv 分别位于第 75、88、101 层输出之后,最终检测层是 [[102,103,104], 1, IDetect, [nc, anchors]]。([GitHub][3])

3. 结构拆解:默认 YOLOv7 到底由哪些模块组成

3.1 Backbone:E-ELAN 风格主干

论文的 Backbone 关键词是 E-ELAN 。作者是在 ELAN 基础上提出 Extended Efficient Layer Aggregation Network ,核心目标不是单纯"堆更深",而是在不破坏原始梯度路径的前提下,持续增强网络的学习能力。论文对 E-ELAN 的概括是:它通过 expand、shuffle、merge cardinality 来增强特征表达,同时维持原有梯度传播路径的性质。([CVF Open Access][1])

更具体一点,论文说明 E-ELAN 会:

  • group convolution 扩展通道和 cardinality;
  • 把各计算块输出按组 shuffle
  • 再做 concat + merge cardinality
  • 重点是不改 transition layer 的基本结构,避免把原本已经稳定的梯度路径打乱。([CVF Open Access][1])

如果从工程角度理解,E-ELAN 的价值在于:

它不是只追求 FLOPs 漂亮,而是很强调 梯度路径长度、特征多样性、参数利用率 这几个更"训练友好"的因素。([CVF Open Access][1])

3.2 Neck:PAN/FPN 风格双向融合

yolov7.yaml 看,YOLOv7 的 Head 部分实际上承担了典型 Neck 的工作:先用 SPPCSPC 扩大感受野,然后做 top-down 上采样融合 ,再做 bottom-up 下采样回传。这和 PAN/FPN 思想是一致的,只是实现细节是 YOLOv7 自己这套 concat-heavy 配置。([GitHub][3])

你可以把它理解成:

  • 深层特征负责更强语义;
  • 浅层特征保留更高分辨率;
  • 双向融合后,三路输出分别更适合小、中、大目标。([GitHub][3])

3.3 Detection Head:三尺度 anchor-based 输出

默认 YOLOv7 P5 版不是 anchor-free,而是 anchor-based 三尺度检测头 。配置文件直接给出了三组 anchors,对应 P3/8、P4/16、P5/32;最后的 IDetect 接三路特征图输出分类、objectness 和边框预测。([GitHub][3])

一个很容易被忽略的点是:默认 yolov7.yaml 里,RepConv 并不是在全网到处替换,而是主要放在检测分支输出前。这和论文里"计划式重参数化"的思路是对得上的:重参数化不是无脑全替换,而是要考虑残差/拼接路径的结构约束。([GitHub][3])

4. YOLOv7 的关键创新点

4.1 Trainable Bag-of-Freebies

这是 YOLOv7 最核心的概念。论文明确说,它关注的是一类 会增加训练复杂度、但不增加推理成本 的模块和优化方法,并把这套东西统称为 trainable bag-of-freebies。这也是 YOLOv7 和很多只强调结构搜索/骨干网络改进的方法的最大不同。([CVF Open Access][1])

4.2 E-ELAN

E-ELAN 解决的是:在 concatenation-based 网络里,继续加深/加宽时,怎样不把原有的高效梯度路径破坏掉。论文指出,E-ELAN 用 expand / shuffle / merge cardinality,在不改原始梯度传递路径的前提下增强学习能力。([CVF Open Access][1])

4.3 面向拼接网络的 compound scaling

论文特别指出,普通 compound scaling 往往把不同维度的缩放近似看成彼此独立,但 concat-based 模型在深度变化时会联动影响某些层的输入宽度 ,所以 YOLOv7 需要一套新的复合缩放方法。作者提出的策略是:放大计算块深度时,同时按相应比例调整 transition layer 的宽度。论文的消融里,给出的一个具体例子是 计算块深度放大 1.5 倍,同时 transition block 宽度放大 1.25 倍。([CVF Open Access][1])

这也是为什么论文里说 YOLOv7-X 不是简单"更宽更深的 YOLOv7",而是通过 stack scaling + compound scaling 得到的。论文里还明确写到:对 YOLOv7,先在 neck 上做 stack scaling,再用提出的 compound scaling 同时扩展整网深度与宽度,从而得到 YOLOv7-X。([CVF Open Access][1])

4.4 Planned Re-parameterization

这是 YOLOv7 另一个很有辨识度的创新。论文分析了 RepConv 直接套进不同结构时的问题,结论是:

对于带 residualconcatenation 连接的层,RepConv 里的 identity connection 可能会破坏原本用于产生多样梯度的结构,因此这类位置更适合用 不带 identity 的 RepConvN 。作者把这一套设计原则称为 planned re-parameterization model。([CVF Open Access][1])

这也是为什么你在默认 yolov7.yaml 里不会看到"整个主干全换成 RepConv"。官方配置里的做法更克制,和论文思想一致:重参数化要计划性地放,不是遍地放。 ([GitHub][3])

4.5 Auxiliary Head + Lead-guided Label Assignment

YOLOv7 还把 深监督 真正用到了检测训练里。论文区分了:

  • lead head:最终输出头
  • auxiliary head:只在训练时辅助优化的头。([CVF Open Access][1])

真正有意思的是它的 label assignment。论文指出,多输出分支模型在用动态标签分配时会遇到新问题:辅助头和主头的标签该怎么分配。YOLOv7 为此提出了:

  • lead head guided label assigner
  • coarse-to-fine lead guided label assigner。([CVF Open Access][1])

核心思想是:

不是让辅助头和主头各自独立做分配,而是让 lead head 的预测结果引导两者的标签生成。其中 coarse-to-fine 版本会给 auxiliary head 更"粗"的正样本范围、给 lead head 更"细"的标签,从而让辅助头偏重 recall,主头偏重最后精化。论文的消融表里,这一套相比 base/independent assignment 有小幅但稳定的提升。([CVF Open Access][1])

5. YOLOv7 默认模型和变体怎么理解

论文把基础模型分成面向不同算力档位的三类:

  • YOLOv7-tiny:更偏 edge GPU
  • YOLOv7:normal GPU
  • YOLOv7-W6:cloud GPU。([CVF Open Access][1])

然后再往上扩成 YOLOv7-X、E6、D6、E6E。官方 README 的性能表显示,从 640 输入的 YOLOv7 / YOLOv7-X 到 1280 输入的 W6/E6/D6/E6E,精度持续上升,速度逐步下降,这是它的主系列缩放路线。([GitHub][2])

另外,官方仓库里还列了一个 YOLOv7-u6 ,说明它是 anchor-free detection head ,并且用了 decoupled TAL head 。这说明 YOLOv7 家族并不只一种头,但默认最常用的 yolov7.yaml 仍然是前面说的 anchor-based P5 检测结构。([GitHub][2])

6. 训练流程怎么走

官方仓库把训练分成两条主线:

6.1 P5 模型训练

默认 640 输入,入口是 train.py

bash 复制代码
python train.py --workers 8 --device 0 --batch-size 32 \
  --data data/coco.yaml --img 640 640 \
  --cfg cfg/training/yolov7.yaml --weights '' \
  --name yolov7 --hyp data/hyp.scratch.p5.yaml

6.2 P6 模型训练

1280 输入,入口变成 train_aux.py

bash 复制代码
python train_aux.py --workers 8 --device 0 --batch-size 16 \
  --data data/coco.yaml --img 1280 1280 \
  --cfg cfg/training/yolov7-w6.yaml --weights '' \
  --name yolov7-w6 --hyp data/hyp.scratch.p6.yaml

官方把这两条命令都放在 README 里;P6 使用 train_aux.py,也和它的辅助头训练机制相对应。微调自定义数据集时,官方同样分别提供了 P5 与 P6 的 finetune 命令。([GitHub][2])

7. 推理和部署

7.1 最基础的 PyTorch 推理

官方最基本的图像/视频推理命令就是:

bash 复制代码
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg
python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source yourvideo.mp4

这就是最直接的原生仓库推理入口。([GitHub][2])

7.2 官方导出支持什么

官方仓库 README 直接列出了导出入口:

  • PyTorch → CoreML
  • PyTorch → ONNX with NMS
  • PyTorch → TensorRT with NMS。([GitHub][2])

也就是说,YOLOv7 官方仓库的部署路线并不止 ONNX/TensorRT,它连 CoreML 也给了导出入口。([GitHub][2])

7.3 ONNX 导出

官方 README 给的 ONNX 导出命令是:

bash 复制代码
python export.py --weights yolov7-tiny.pt --grid --end2end --simplify \
  --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 \
  --img-size 640 640 --max-wh 640

这个命令名里已经明确写了 with NMS ,而且参数里有 --end2end--iou-thres--conf-thres--topk-all。工程上这通常意味着:你导出的并不是"纯原始 head 输出",而是一个更偏部署可直接消费的图。([GitHub][2])

7.4 TensorRT 导出

官方 README 给出了两条路:

第一条是先导 ONNX,再用 tensorrt-python 转 engine:

bash 复制代码
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt
python export.py --weights ./yolov7-tiny.pt --grid --end2end --simplify --topk-all 100 --iou-thres 0.65 --conf-thres 0.35 --img-size 640 640
git clone https://github.com/Linaom1214/tensorrt-python.git
python ./tensorrt-python/export.py -o yolov7-tiny.onnx -e yolov7-tiny-nms.trt -p fp16

第二条是直接用 trtexec

bash 复制代码
/usr/src/tensorrt/bin/trtexec --onnx=yolov7-tiny.onnx --saveEngine=yolov7-tiny-nms.trt --fp16

这些命令都在官方 README 里。([GitHub][2])

7.5 Ultralytics 工具链里的 YOLOv7

如果你是在 Ultralytics 工具链 里使用 YOLOv7,官方文档特别说明:Ultralytics 当前只支持 YOLOv7 的 ONNX 和 TensorRT 推理。这个说法是"在 Ultralytics 环境里"的支持范围,不等同于 YOLOv7 原始仓库只能导出这两种格式。([Ultralytics Docs][4])

8. 部署时最容易踩的点

第一,区分"原生 PyTorch 权重"与"部署图" 。YOLOv7 官方导出命令里强调了 with NMS--end2end--simplify 等参数,所以你部署时要先确认:导出的 ONNX/engine 是不是已经把 NMS/后处理并进图里了。这个会直接影响你后端代码里要不要再做一次 decode/NMS。这个判断来自官方导出命令本身。([GitHub][2])

第二,注意 re-parameterization 。官方 README 单独给了一个 reparameterization.ipynb。这说明从训练态结构到部署态结构的转换,在 YOLOv7 里是官方认可的正式流程,不是可有可无的小技巧。([GitHub][2])

第三,P5 和 P6 不是只差输入分辨率 。官方训练入口已经分成 train.pytrain_aux.py 两条路径;因此你做迁移训练或导出时,最好沿着对应系列的官方脚本和配置走,不要把 P5/P6 的配置混用。([GitHub][2])

9. 总结

YOLOv7 的本质,不是"YOLOv5 的小修小补",而是把 E-ELAN、concat-aware compound scaling、planned re-parameterization、辅助头深监督和 coarse-to-fine lead-guided label assignment 组合成了一套完整的训练-结构协同方案。 默认检测版仍是三尺度 anchor-based,但它的强项主要来自这套系统化设计,而不只是某一个模块。([CVF Open Access][1])

参考链接:

1\]: https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_YOLOv7_Trainable_Bag-of-Freebies_Sets_New_State-of-the-Art_for_Real-Time_Object_Detectors_CVPR_2023_paper.pdf "YOLOv7: Trainable Bag-of-Freebies Sets New State-of-the-Art for Real-Time Object Detectors" \[2\]: https://github.com/wongkinyiu/yolov7 "GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors · GitHub" \[3\]: https://github.com/WongKinYiu/yolov7/blob/main/cfg/training/yolov7.yaml "yolov7/cfg/training/yolov7.yaml at main · WongKinYiu/yolov7 · GitHub" \[4\]: https://docs.ultralytics.com/models/yolov7/ "YOLOv7: Trainable Bag-of-Freebies - Ultralytics YOLO Docs"

相关推荐
艾莉丝努力练剑8 小时前
【Linux网络】计算机网络入门:Socket编程预备,从字节序共识到 Socket 地址结构的“伪多态”设计
linux·服务器·网络·c++·学习·计算机网络
乔江seven9 小时前
【李沐 | 动手学深度学习】 21 计算机视觉:微调
人工智能·深度学习·计算机视觉·微调
2501_9333295515 小时前
媒介宣发技术实践:Infoseek舆情系统的AI中台架构与应用解析
开发语言·人工智能·架构·数据库开发
热爱生活的五柒15 小时前
026主流三大模型(GPT / Gemini / Claude Code)总结
人工智能·gpt
DuHz16 小时前
论文精读:大语言模型 (Large Language Models, LLM) —— 一项调查
论文阅读·人工智能·深度学习·算法·机器学习·计算机视觉·语言模型
AI木马人16 小时前
9.【AI任务队列实战】如何在高并发下保证系统不崩?(Redis + Celery完整方案)
数据库·人工智能·redis·神经网络·缓存
陈天伟教授16 小时前
GPT Image 2-桂林山水
人工智能·神经网络·安全·架构
offer收割机小鹅16 小时前
大学生求职必备:AI面试、AI写作与设计工具助力职场发展
人工智能·ai·面试·aigc·ai写作
Oll Correct16 小时前
实验二十一:验证OSPF可以划分区域
网络·笔记
乔江seven16 小时前
【李沐 | 动手学深度学习】20 计算机视觉:数据增广(Data Augmentation)
人工智能·深度学习