- 人工智能
- 深度学习
- 计算机视觉
【免费下载链接】yolov7
Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
导读
本文以 README.md 为主线,系统讲解 YOLOv7 官方仓库的完整工作流:环境搭建、COCO 数据准备、训练与迁移学习、精度测试、图片/视频推理、重参数化,以及 PyTorch 向 ONNX、TensorRT、CoreML 的模型导出。读完本文,你将能够复现 MS COCO 上 51.4% AP 的基准结果,掌握单卡/多卡训练命令的每个参数含义,并学会把模型导出为可直接部署的端到端推理格式。
YOLOv7 是论文《YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors》(arXiv:2207.02696)的官方实现,其核心思想是提出多种"可训练的免费赠品"(trainable bag-of-freebies)——包括规划的重参数化卷积、辅助训练头、动态标签分配策略等,在不增加推理成本的前提下显著提升实时目标检测精度。
性能总览:MS COCO 基准
官方在 MS COCO 测试集上评估了从 P5 到 P6/E6E 的全系列模型,覆盖 640 与 1280 两种测试分辨率。下表来自仓库 README 的性能数据,其中 AP 为 COCO 标准 mAP@0.5:0.95:
| Model | Test Size | APtest | AP50test | AP75test | batch 1 fps | batch 32 average time |
|---|---|---|---|---|---|---|
| YOLOv7 | 640 | 51.4% | 69.7% | 55.9% | 161fps | 2.8ms |
| YOLOv7-X | 640 | 53.1% | 71.2% | 57.8% | 114fps | 4.3ms |
| YOLOv7-W6 | 1280 | 54.9% | 72.6% | 60.1% | 84fps | 7.6ms |
| YOLOv7-E6 | 1280 | 56.0% | 73.5% | 61.2% | 56fps | 12.3ms |
| YOLOv7-D6 | 1280 | 56.6% | 74.0% | 61.8% | 44fps | 15.0ms |
| YOLOv7-E6E | 1280 | 56.8% | 74.4% | 62.1% | 36fps | 18.7ms |
从表中可以看到清晰的"精度-速度"取舍梯度:640 输入下的 YOLOv7 与 YOLOv7-X 面向实时场景(单卡 batch 1 下分别约 161 fps 与 114 fps),而 1280 输入下的 W6/E6/D6/E6E 系列面向高精度场景,AP 从 54.9% 一路提升到 56.8%。此外,官方还提供了 HuggingFace Spaces 上的 Gradio Web Demo 供在线体验。
环境搭建与安装
Docker 环境(推荐)
README 推荐直接使用 NVIDIA 官方 PyTorch 容器,避免复杂的 CUDA 环境配置。核心步骤如下:
# 创建 docker 容器,可根据机器显存调整共享内存大小 nvidia-docker run --name yolov7 -it -v your_coco_path/:/coco/ -v your_code_path/:/yolov7 --shm-size=64g nvcr.io/nvidia/pytorch:21.08-py3 # 安装 apt 依赖 apt update apt install -y zip htop screen libgl1-mesa-glx # 安装 pip 依赖(seaborn 用于绘图、thop 用于 FLOPs 统计) pip install seaborn thop # 进入代码目录 cd /yolov7注意--shm-size=64g的取值:DataLoader 的num_workers较多时会占用共享内存,官方建议按实际资源调整该值。
pip 依赖版本约束
若使用本地 Python 环境,可参考仓库 requirements.txt 中的版本约束:
torch>=1.7.0,!=1.12.0、torchvision>=0.8.1,!=0.13.0(注意显式排除 1.12.0 / 0.13.0 两个版本);numpy>=1.18.5,<1.24.0;opencv-python>=4.1.1、Pillow>=7.1.2、PyYAML>=5.3.1、scipy>=1.4.1、tqdm>=4.41.0;protobuf<4.21.3;- 绘图与可视化:
pandas>=1.1.4、seaborn>=0.11.0、matplotlib>=3.2.2; - 日志:
tensorboard>=2.4.1; - ONNX/TensorRT 等导出所需的
onnx、onnx-simplifier在 requirements 中以注释形式给出,按需安装。
README 标注的官方测试环境为:Python 3.7.13、PyTorch 1.12.0+cu113。
精度测试(Testing)
测试命令与指标解读
下载预训练权重(yolov7.pt、yolov7x.pt、yolov7-w6.pt、yolov7-e6.pt、yolov7-d6.pt、yolov7-e6e.pt)后,在验证集上运行 test.py:
python test.py --data data/coco.yaml --img 640 --batch 32 --conf 0.001 --iou 0.65 --device 0 --weights yolov7.pt --name yolov7_640_val参数含义如下:
--data:数据集配置文件路径;--img:测试输入尺寸(像素);--batch:批大小;--conf:NMS 前的置信度阈值。测试阶段建议设为极低的 0.001,避免漏检拉低召回率,这与推理阶段的 0.25 是不同场景;--iou:NMS 的 IoU 阈值(0.65);--device:GPU 编号;--weights:权重文件路径;--name:结果输出目录名,保存到runs/test/<name>。
从 test.py 的实现可以看到,mAP 计算会遍历torch.linspace(0.5, 0.95, 10)这 10 个 IoU 阈值(0.5~0.95 步长 0.05)取平均,同时按 small / medium / large 三种目标面积分别统计 AP 与 AR。官方测试结果如下:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.51206 Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.69730 Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.55521 Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.35247 Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.55937 Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.66693 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.38453 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.63765 Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.68772 Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.53766 Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.73549 Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.83868标注文件准备
为计算 mAP,需要把 COCO 官方标注(annotations_trainval2017.zip)解压到./coco/annotations/instances_val2017.json。test.py 内部通过coco80_to_coco91_class()(见 utils/general.py)完成 COCO 80 类索引到 COCO 91 类索引的映射后提交给 pycocotools 计算。
训练(Training)
数据准备
仓库提供了 scripts/get_coco.sh 一键脚本:
bash scripts/get_coco.sh脚本会并行下载并解压:
- 标签:
coco2017labels-segments.zip(68 MB,同时包含检测与分割标签); - 图像:
train2017.zip(约 19G,118k 张)、val2017.zip(约 1G,5k 张)、test2017.zip(约 7G,41k 张,可选)。
提示:如果之前使用过其他版本 YOLO 的 COCO 数据,官方强烈建议删除
train2017.cache和val2017.cache缓存文件并重新下载标签,避免缓存与标签格式不匹配导致训练异常。
单 GPU 训练
# 训练 p5 模型(输入 640) 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 # 训练 p6 模型(输入 1280) 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两条命令分别对应两个训练入口:train.py 用于 P5 骨干(stride 32)系列,train_aux.py 用于带辅助训练头的 P6 系列。--img 640 640的第二个值用于第 11 个 epoch 起的微调输入尺寸。
多 GPU 训练
# 训练 p5 模型(4 卡) python -m torch.distributed.launch --nproc_per_node 4 --master_port 9527 train.py --workers 8 --device 0,1,2,3 --sync-bn --batch-size 128 --data data/coco.yaml --img 640 640 --cfg cfg/training/yolov7.yaml --weights '' --name yolov7 --hyp data/hyp.scratch.p5.yaml # 训练 p6 模型(8 卡) python -m torch.distributed.launch --nproc_per_node 8 --master_port 9527 train_aux.py --workers 8 --device 0,1,2,3,4,5,6,7 --sync-bn --batch-size 128 --data data/coco.yaml --img 1280 1280 --cfg cfg/training/yolov7-w6.yaml --weights '' --name yolov7-w6 --hyp data/hyp.scratch.p6.yaml多卡训练通过torch.distributed.launch启动,--sync-bn开启跨卡同步批归一化(通常能提升精度),--batch-size 128为 4 卡/8 卡下的全局总批大小(每卡约 32 或 16),--master_port 9527用于指定分布式通信端口。
网络结构配置说明
以 cfg/training/yolov7.yaml 为例,配置文件由三部分组成:
- parameters:
nc(类别数,COCO 为 80)、depth_multiple与width_multiple(深度/宽度缩放系数,为 1.0 时即标准 YOLOv7); - anchors:P3/8、P4/16、P5/32 三个尺度的锚框,如
[12,16, 19,36, 40,28]、[36,75, 76,55, 72,146]、[142,110, 192,243, 459,401]; - backbone / head:以
[from, number, module, args]形式描述的模块列表。backbone 大量使用Concat组合多路特征(ELAN 结构),head 则使用SPPCSPC空间金字塔池化、RepConv可重参数化卷积,并在最后通过IDetect(对应 models/yolo.py 中的检测头)在 P3/P4/P5 三个尺度输出检测结果。
迁移学习(自定义数据集微调)
针对自定义数据集,官方提供了训练权重(yolov7_training.pt、yolov7x_training.pt以及 W6/E6/D6/E6E 对应的 training 权重,均带 EMA 结构):
# 微调 p5 模型 python train.py --workers 8 --device 0 --batch-size 32 --data data/custom.yaml --img 640 640 --cfg cfg/training/yolov7-custom.yaml --weights 'yolov7_training.pt' --name yolov7-custom --hyp data/hyp.scratch.custom.yaml # 微调 p6 模型 python train_aux.py --workers 8 --device 0 --batch-size 16 --data data/custom.yaml --img 1280 1280 --cfg cfg/training/yolov7-w6-custom.yaml --weights 'yolov7-w6_training.pt' --name yolov7-w6-custom --hyp data/hyp.scratch.custom.yaml--weights 'yolov7_training.pt'传入的是保留训练结构(含辅助头/EMA)的权重而非推理权重,这是 YOLOv7 迁移学习的关键——官方同时提供.pt(推理)与_training.pt(训练)两套权重,微调务必使用后者。对应的data/custom.yaml需要按nc、train/val图片路径、类别名等字段改写。
重参数化(Re-parameterization)
YOLOv7 采用可重参数化设计(RepConv),训练时网络带有额外的并行分支,推理时需要将结构重参数化合并,才能得到精简、高速的部署模型。仓库提供了完整的操作说明,见 tools/reparameterization.ipynb,其中主要工作是把 RepConv 的多分支权重融合为单分支卷积,并去除辅助训练头,最终保存为可部署的推理权重。
推理(Inference)
推理入口为 detect.py,支持图片、视频、摄像头与网络流:
# 视频推理 python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source yourvideo.mp4 # 图片推理 python detect.py --weights yolov7.pt --conf 0.25 --img-size 640 --source inference/images/horses.jpg推理结果示例(马匹检测,来自仓库figure/horses_prediction.jpg):
从 detect.py 的参数定义可以看到完整的可调项:
--source:输入源,默认inference/images;支持文件、目录、摄像头编号0,以及rtsp://、rtmp://、http://、https://网络流;--img-size:推理输入尺寸,默认 640,会被 utils/general.py 的check_img_size自动修正为 stride 的整数倍;--conf-thres:置信度阈值,默认 0.25;--iou-thres:NMS 的 IoU 阈值,默认 0.45;--device:0或0,1,2,3或cpu;--view-img:实时显示结果;--save-txt:额外保存 YOLO 格式的标签文件;--save-conf:在 txt 标签中附带置信度;--nosave:不保存结果图像/视频;--classes:按类别过滤,如--classes 0 2 3;--agnostic-nms:类别无关 NMS;--augment:开启测试时增强(TTA);--project/--name/--exist-ok:控制结果输出目录(默认runs/detect/exp,同名自动递增);--no-trace:关闭 TorchScript Trace 加速(默认开启TracedModel)。
推理流水线(见 detect.py)为:模型预热(warmup)→torch.no_grad()下前向 →non_max_suppression去重 →scale_coords将框坐标从网络输入尺寸映射回原图尺寸 → 绘制/保存。GPU 上默认启用 FP16(model.half())以加速。
模型导出(Export)
PyTorch → ONNX(含 NMS)
仓库提供了完整导出脚本 export.py,输出 ONNX 与配套的 Colab 教程(tools/YOLOv7onnx.ipynb)。导出带内置 NMS 的端到端 ONNX 命令如下:
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关键参数(对应 export.py):
--grid:导出 Detect 层的网格输出;--end2end:导出端到端模型(内置 NMS)。--max-wh为 None 时适配 TensorRT 的 NMS 插件(输出num_dets/det_boxes/det_scores/det_classes四组张量),给定整数值(如 640)时适配 ONNX Runtime 的 NMS(输出拼接的output);--topk-all:每张图保留的目标数上限,默认 100;--iou-thres/--conf-thres:内置 NMS 的 IoU 与置信度阈值;--simplify:用 onnx-simplifier 精简计算图;--dynamic-batch/--dynamic:导出动态 batch 或动态宽高的 ONNX(见 export.py 中 dynamic_axes 的设置逻辑);--include-nms:通过RegisterNMS插件注册自定义 NMS 算子(utils/add_nms.py)。
导出时内部会先做 TorchScript trace,再统一opset_version=12导出,并进行onnx.checker.check_model校验。
PyTorch → TensorRT(两种方式)
方式一:导出端到端 ONNX 后用官方工具转 TRT
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方式二:使用 NMS 插件 + trtexec
wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-tiny.pt python export.py --weights yolov7-tiny.pt --grid --include-nms 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 把 ONNX 转为 TensorRT engine /usr/src/tensorrt/bin/trtexec --onnx=yolov7-tiny.onnx --saveEngine=yolov7-tiny-nms.trt --fp16方式一基于端到端 ONNX,把 NMS 一并固化进模型;方式二在导出时注册自定义 NMS 插件,再用 trtexec 以 FP16 精度构建 engine。两者都需要借助外部 tensorrt-python 工具库完成 ONNX→engine 转换。
PyTorch → CoreML(macOS/iOS)
导出及端到端推理流程见 tools/YOLOv7CoreML.ipynb。CoreML 导出在 export.py 中实现:先得到 TorchScript 模型,再用 coremltools 转换,输入按scale=1/255.0做像素归一化;--fp16与--int8分别启用 FP16 与 INT8 权重量化(量化仅在 macOS 上支持,见 export.py 的平台判断)。
扩展分支:姿态估计与实例分割
除了目标检测主线,官方还基于同一框架发布了多种任务分支与配套权重:
- 姿态估计(Pose estimation):权重
yolov7-w6-pose.pt,使用说明见 tools/keypoint.ipynb,支持单人/多人关键点检测:
- 实例分割(Instance segmentation):YOLOv7 实例分割分支(YOLOR + YOLOv5 + YOLACT 组合),权重
yolov7-seg.pt,使用说明见 tools/instance.ipynb。其 COCO 结果为:box AP 51.4%、box AP50 69.4%、mask AP 41.5%、mask AP50 65.5%; - 无锚框检测头(Anchor free):带解耦 TAL 头(TAL 即 Task-Aligned Assigner)的 YOLOv7-u6 变体,640 输入下 COCO val 集 AP 52.6%、AP50 69.7%、AP75 57.3%。
引用(Citation)
若在研究中使用了 YOLOv7,请引用以下文献(来自仓库 README):
@inproceedings{wang2023yolov7, title={{YOLOv7}: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors}, author={Wang, Chien-Yao and Bochkovskiy, Alexey and Liao, Hong-Yuan Mark}, booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)}, year={2023} } @article{wang2023designing, title={Designing Network Design Strategies Through Gradient Path Analysis}, author={Wang, Chien-Yao and Liao, Hong-Yuan Mark and Yeh, I-Hau}, journal={Journal of Information Science and Engineering}, year={2023} }延伸:官方展示的更多视觉任务
README 末尾的 Teaser 展示了基于 YOLOv7 骨架扩展的更多研究方向,包括:YOLOv7-semantic(语义分割)、YOLOv7-panoptic(全景分割)、YOLOv7-caption(图像描述)、YOLOv7-depth(深度估计)、YOLOv7-3d-detection(3D 检测)、YOLOv7-lidar(激光雷达)与 YOLOv7-road(道路分割)等。这些内容说明 YOLOv7 的骨干与颈部结构具备较强的跨任务迁移能力,可作为进一步研究或二次开发的起点。相关示例图(如tennis.jpg、yolov7_city.jpg、yolov7_3d.jpg等)均存放在 figure 目录下。
- 人工智能
- 深度学习
- 计算机视觉
【免费下载链接】yolov7
Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors
相关推荐
EfficientDet 完整实战指南:COCO 预训练模型、SavedModel/TFLite/TensorRT 导出、推理与微调
EfficientDet 完整实战指南:COCO 预训练模型、SavedModel/TFLite/TensorRT 导出、推理与微调 本指南基于当前仓库 ten
示例工程MXNet 模型导出为 ONNX 格式:从 Gluon 训练到跨框架推理的完整实战指南
MXNet 模型导出为 ONNX 格式:从 Gluon 训练到跨框架推理的完整实战指南 ONNX(Open Neural Network Exchange)为
人工智能深度学习机器学习LaMa推理优化终极指南:ONNX导出与TensorRT加速完整实战
LaMa推理优化终极指南:ONNX导出与TensorRT加速完整实战 还在为LaMa模型推理速度慢而烦恼吗?处理高分辨率图像时漫长的等待时间是否严重影响了你的工
人工智能计算机视觉深度学习图像处理
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考