查看 Markdown

YOLOv9

一个单阶段卷积检测器:一次前向就为密集的检测框网格打分,再由 NMS 去掉重复的那些。LibreYOLO 收录了它的三个变体,其中一个没有 NMS 步骤。

任务
detection
尺寸
yolo9: t, s, m, c at 640 px; yolo9_p2: t, s at 640 px
安装
pip install libreyolo
支持层级
旗舰,自 v1.0.0 起。功能在这里最先设计,并完整地在 GPU 上验证。
上游
YOLOv9,由 MultimediaTechLab 发布,采用 MIT 许可。论文源码
许可
代码采用 MIT,权重采用 MIT。商用

安装

YOLOv9 在基础包之外不需要任何 extra。

bash
pip install libreyolo

预测

权重在首次使用时从 Hugging Face 下载,并缓存在本地。

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreYOLO9s.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes:    print(box.cls, box.conf, box.xyxy)
CLI
libreyolo predict model=LibreYOLO9s.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
不用 NMS
from libreyolo import LibreYOLO, SAMPLE_IMAGE # 同样的调用,换一个检查点。端到端 head 返回自己得分最高的预测,# 所以不跑 NMS,iou 也被忽略model = LibreYOLO("LibreYOLO9E2Es.pt")result = model(SAMPLE_IMAGE, conf=0.25, max_det=300) print(len(result.boxes))

返回的 Results 对象就是每个家族都会返回的那一个,所以换成另一个检测器只是改一行 的事。在基础模型和 stride-4 模型上,conf 设置置信度阈值,iou 设置 NMS 阈值。端 到端模型不跑 NMS,也忽略 iou,所以决定它输出形态的是 confmax_det。数据 源、流式处理和结果处理见预测

变体

三个变体共用一个骨干。三者都只做检测,接受的参数也相同。

基础模型在三个特征尺度上预测,并用 NMS 清掉重复的检测框。

端到端模型保留那个 head,并在它旁边加了一条一对一匹配分支。推理时只读一对一分支, 取它得分最高的预测,所以不跑 NMS。当你部署的运行时没有 NMS 算子时,选它。

stride-4 模型从骨干上再往上取一层,把 neck 向下延伸到那一层,在四个尺度而不是三个 尺度上预测。多出来的这个尺度是给只占几个像素的目标用的;它已发布的那一个检查点 (checkpoint)是在航拍图像上训练的。基础检测检查点可以迁移进来:骨干和 neck 原样 加载,三组预训练的 head 整体上移一格,stride-4 的那组从随机初始化开始。

检查点输入(px)mAP 50-95参数量(M)
LibreYOLO9c64056.425.5
LibreYOLO9m64055.320.12
LibreYOLO9s64055.97.2
LibreYOLO9t64054.02.02

COCO val2017, 500 images。数据由 LibreYOLO 基准测试工具测得,并发布在 Vision Analysis 上,可在此比较不同硬件和运行时的延迟,并查看完整的运行记录。

训练

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 imgsz=640 batch=16
小目标
from libreyolo import LibreYOLO9P2 # stride-4 变体没有自己的 COCO 检查点,所以指定一个基础检测的# 检查点:它的骨干和 neck 原样加载,stride-4 的那组 head 从随机# 初始化开始model = LibreYOLO9P2(None, size="s")model.train(data="my-dataset.yaml", epochs=100, pretrained="LibreYOLO9s.pt")

pretrained 决定这次训练从什么开始。传 True 会加载同一模型、同一尺寸已发布的检查 点,传名称或路径则可以加载别的。形状对不上的张量会被跳过而不是报错,训练还会记录 加载了多少个,所以在不同类别数上训练出来的检查点仍然是一个可用的起点。

stride-4 模型没有自己已发布的 COCO 检查点,所以 True 在这里会解析到一个不存在的 文件,下载会失败。改为指定一个基础检测检查点。

数据集、数据增强、多卡训练和日志记录器见训练

验证

val() 返回一个由 metrics/ 键组成的字典,涵盖查准率、查全率、mAP 50 和 mAP 50-95,在任何采用你训练时所用格式的数据集上测量。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])
CLI
libreyolo val model=LibreYOLO9s.pt data=my-dataset.yaml
在 COCO 上
# 内置的 COCO yaml 带有一段内嵌的下载脚本,所以除非数据集已经# 在本地,否则需要显式放行libreyolo val model=LibreYOLO9c.pt data=coco.yaml imgsz=640 \  allow_download_scripts=True

导出

任务ONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
DetectionDetection to ONNX:支持Detection to TorchScript:支持Detection to ExecuTorch:支持Detection to TensorRT:支持Detection to OpenVINO:支持Detection to Paddle:支持Detection to MNN:支持Detection to RKNN:不支持Detection to ncnn:支持Detection to TFLite:不支持Detection to CoreML:不支持Detection to Core AI:支持

一个勾对三个变体都成立:三者有差异的地方,矩阵取其中最弱的那个。

导出的产物按文件后缀经由 LibreYOLO() 重新加载,所以一个 .onnx.engine 文件 的表现和检查点一样,返回同样的 Results。在不装 LibreYOLO 的裸运行时里跑这张计算图 也是支持的,但那样预处理和后处理就得你自己写。

对基础检测模型来说,其中后处理的那一半可以搬进计算图。ONNX 导出加上 nms=True 会把 抑制放进模型里,第一个输出变成一个固定的 (1, max_det, 6) 张量,每一行是 x1, y1, x2, y2, score, class,检测数之后补零。这张计算图是 batch 1 的,也不带动态 轴。端到端模型和 stride-4 模型不接受这个参数。

每种格式安装的 extra 不同,也各自带几个自己的参数。两者都在那个格式的页面上。

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.export(format="onnx", imgsz=640)
CLI
libreyolo export model=LibreYOLO9s.pt format=onnx imgsz=640
把 NMS 放进计算图
libreyolo export model=LibreYOLO9s.pt format=onnx nms=True \  conf=0.25 iou=0.45 max_det=300
使用导出的文件
from libreyolo import LibreYOLO, SAMPLE_IMAGE # 工厂按文件后缀分发,所以导出的产物加载方式和任何检查点一样,# 返回的也是同一个 Results 对象model = LibreYOLO("LibreYOLO9s.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)

检查点

这个家族已发布的全部权重文件。

文件输入(px)权重许可
Detection
LibreYOLO9t.pt640mit
LibreYOLO9s.pt640mit
LibreYOLO9m.pt640mit
LibreYOLO9c.pt640mit
LibreYOLO9E2Et.pt640mit
LibreYOLO9E2Es.pt640mit
LibreYOLO9E2Em.pt640mit
LibreYOLO9E2Ec.pt640mit
LibreYOLO9P2s-visdrone.ptcc-by-nc-sa-3.0

上面的每个文件目前都在 LibreYOLO 组织中,并会在首次使用时下载。

许可证

请检查你所下载的具体权重在 Hugging Face 仓库中的许可。LibreYOLO 组织里的每个检查点都附有许可,同一家族内也不一定相同。该仓库是权威来源;以下摘要说明本页上次验证时适用的情况。

这里只说明涉及的许可证,不构成法律意见。如果答案对商用很重要,请自行阅读许可证并咨询法律顾问。

原始工作
YOLOv9, MultimediaTechLab
上游许可
MIT
LibreYOLO 代码
MIT
权重
采用 MIT 许可,重新发布在 huggingface.co/LibreYOLO
解读
MIT is a permissive license, so these weights can be used in commercial and closed-source products. The one standing obligation is to keep the license text and the copyright notice, Kin-Yiu Wong and Hao-Tang Tsui, with any copy you redistribute. It places no condition on your own application code, and a model you train yourself on your own data is yours. Two things are worth knowing beyond that. The port follows the authors' MIT re-release of YOLOv9, not the GPL-3.0 repository that carries the same model, so the permissive terms come from the source LibreYOLO actually derives from. And one checkpoint in this family is not MIT: the stride-4 model trained on VisDrone2019-DET inherits that dataset's CC BY-NC-SA 3.0 terms, which rule out commercial use and require share-alike on anything derived from it.

这里有一个检查点不是 MIT 许可。在 VisDrone2019-DET 上训练的 stride-4 模型继承了那个 数据集的 CC BY-NC-SA 3.0 条款:只允许非商业使用,任何由它衍生出来的东西都要以相同 方式共享,这也在这个家族其余部分所采用的宽松许可之外。它预测的是 VisDrone 的航拍 类别,而不是 COCO 的类别。库在下载这个文件之前会把这些全部打印出来。

引用

@inproceedings{wang2024yolov9,
      title={{YOLOv9}: Learning What You Want to Learn Using Programmable Gradient Information},
      author={Wang, Chien-Yao and Yeh, I-Hau and Liao, Hong-Yuan Mark},
      year={2024},
      booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
}

复制自作者在 github.com/MultimediaTechLab/YOLO#citations 上提供的引用块。

已针对 LibreYOLO v1.5.0 验证。本页的支持表、检查点和基准测试数据由已发布的库和权重生成,并非手工编写。