YOLO-NAS
一个卷积检测器,它的骨干和 neck 出自 Deci.AI 的架构搜索,由量化感知的 RepVGG 模块搭成。它的权重属于 Deci.AI,许可仅限非商业用途,LibreYOLO 一个都不发布。
- 任务
- detection, pose
- 尺寸
- s, m, l at 640 px
- 安装
pip install libreyolo- 支持层级
- 核心,自 v1.1.0 起。核心的可训练检测器:功能在同一个发布波次里紧跟旗舰。
- 许可
- 代码采用 Apache-2.0,权重采用 Deci.AI proprietary, non-commercial。商用
安装
YOLO-NAS 除了基础包之外不需要任何额外依赖。
pip install libreyolo预测
磁盘上还没有的检查点(checkpoint)名字会从 Deci 的公共 CDN 拉取,而不是从 LibreYOLO 组织拉取,那里不托管这些权重中的任何一个。传输开始之前,库会每个进程 打印一次 Deci 的许可条款;下载下来的文件被打开之前,它的 SHA-256 会先和一个钉死 的值做校验。这些条款允许什么,见许可证。
from libreyolo import LibreYOLO, SAMPLE_IMAGE # 磁盘上还没有的名字会从 Deci 的 CDN 拉取;下载时会先打印 Deci# 的许可条款,拿走文件就等于接受它们model = LibreYOLO("LibreYOLONASs.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreYOLONASs.pt save=True \ source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpgfrom libreyolo import LibreYOLO, SAMPLE_IMAGE # -pose 后缀会选中姿态 head 和它自己那一套权重model = LibreYOLO("LibreYOLONASs-pose.pt")result = model(SAMPLE_IMAGE) print(result.keypoints.xy)返回的 Results 对象和每个家族返回的都是同一个,所以换成另一个检测器只是一行的
改动。conf 设置置信度阈值,iou 设置 NMS 阈值。数据源、流式处理和结果处理见
预测。
变体
检测和姿态是同一套架构配上不同的 head,接受的参数也一样。下表里的尺寸是检测的 那一组;姿态在这些尺寸之外还多发布了一个更小的尺寸。姿态 head 预测的是 COCO 的 关键点集合。
| 检查点 | 输入(px) | mAP 50-95 | 参数量(M) |
|---|---|---|---|
| LibreYOLONASl | 640 | 56.3 | 66.98 |
| LibreYOLONASm | 640 | 55.4 | 51.18 |
| LibreYOLONASs | 640 | 51.8 | 19.05 |
COCO val2017, 500 images。数据由 LibreYOLO 基准测试工具测得,并发布在 Vision Analysis 上,可在此比较不同硬件和运行时的延迟,并查看完整的运行记录。
训练
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.train(data="my-dataset.yaml", epochs=100, imgsz=640, batch=16)libreyolo train model=LibreYOLONASs.pt data=my-dataset.yaml \ epochs=100 imgsz=640 batch=16from libreyolo import LibreYOLONAS # 完全不碰 Deci 的检查点:模型从随机权重开始,所以这次训练的# 产物只源自你自己的数据model = LibreYOLONAS(None, size="s")model.train(data="my-dataset.yaml", imgsz=640, batch=16)不传 epochs、lr0 和 amp 时,它们会按任务分别解析,所以一次姿态训练的默认值
和一次检测训练不同。优化器默认是 AdamW。类别数来自数据集 YAML,head 会在第一轮
之前为它重建;在姿态 head 上,关键点数量也是同样的处理方式,所以一个 COCO 姿态
检查点可以微调到另一种规模的骨架上。
微调是从 Deci 的权重开始的,而这正是 Deci 的许可覆盖的部分。从随机初始化的模型 开始训练则完全不涉及任何 Deci 检查点,上面第三个代码片段就是这条路。
数据集、数据增强、多卡训练和日志记录器见训练。
验证
val() 返回一个由 metrics/ 键组成的字典,涵盖查准率、查全率、mAP 50 和
mAP 50-95,衡量对象是任何符合你训练时所用格式的数据集。
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreYOLONASs.pt data=my-dataset.yaml# 自带的 COCO yaml 里内嵌了一段下载脚本,所以除非数据集已经在# 本地,否则需要显式授权libreyolo val model=LibreYOLONASl.pt data=coco.yaml imgsz=640 \ allow_download_scripts=True导出
| 任务 | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection 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:支持 |
| Pose | Pose to ONNX:支持 | Pose to TorchScript:支持 | Pose to ExecuTorch:支持 | Pose to TensorRT:支持 | Pose to OpenVINO:支持 | Pose to Paddle:支持 | Pose to MNN:不支持 | Pose to RKNN:不支持 | Pose to ncnn:支持 | Pose to TFLite:不支持 | Pose to CoreML:不支持 | Pose to Core AI:不支持 |
导出的产物按文件后缀经由 LibreYOLO() 重新加载,所以一个 .onnx 或 .engine
文件的表现和检查点一样,返回同样的 Results。在不装 LibreYOLO 的裸运行时里跑
这张图也是支持的,但那时预处理和后处理就得你自己写。每种格式安装的 extra 不同,
各自也接受几个自己的参数。这两件事都在对应格式的页面上。
一次导出只是把同样的权重换一个容器再存一份。导出一个 Deci 检查点既不会改变权重 的来源,也不会改变覆盖它们的许可。
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLONASs.pt")model.export(format="onnx", imgsz=640)libreyolo export model=LibreYOLONASs.pt format=onnx imgsz=640from libreyolo import LibreYOLO, SAMPLE_IMAGE # 工厂按文件后缀分发,所以导出的产物加载方式和任何检查点一样,# 返回的也是同一个 Results 对象model = LibreYOLO("LibreYOLONASs.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)检查点
这里没有可列的。Deci 的许可禁止再分发,所以 LibreYOLO 组织不发布任何 YOLO-NAS
权重,下载会解析到别处:形如 LibreYOLONAS<size>.pt 的名字,或者姿态用的
LibreYOLONAS<size>-pose.pt,会映射到 Deci 公共 CDN 上对应的对象。
只有 SHA-256 被库钉死的检查点才能这样拉取。其他的一律失败关闭,而不是去打开一个
未经校验的第三方 pickle,得手动下载并以路径的形式传进来。已经在磁盘上的文件按
路径加载,没有下载,也没有校验和这道关。这也包括保持原始文件名的 Deci .pth,
加载器认得它。
许可证
请检查你所下载的具体权重在 Hugging Face 仓库中的许可。LibreYOLO 组织里的每个检查点都附有许可,同一家族内也不一定相同。该仓库是权威来源;以下摘要说明本页上次验证时适用的情况。
这里只说明涉及的许可证,不构成法律意见。如果答案对商用很重要,请自行阅读许可证并咨询法律顾问。
- 原始工作
- YOLO-NAS, Deci.AI
- 上游许可
- Deci.AI proprietary, non-commercial
- LibreYOLO 代码
- MIT
- 权重
- 采用 Deci.AI proprietary, non-commercial 许可,由作者分发。LibreYOLO 不托管或镜像这些权重。
- 解读
- Two licenses apply here and they are not the same. The SuperGradients source this port follows is Apache-2.0 and LibreYOLO's own implementation is MIT, so nothing restricts the architecture or the training code. Deci's published checkpoints are a different matter: the YOLO-NAS license grants a revocable, non-transferable right to use them and nothing more. It forbids redistribution and sublicensing, forbids offering them as a managed or remote service, restricts modification and reverse engineering, and rules out commercial use, including any model running in a production environment, unless you hold a separate agreement with Deci. LibreYOLO therefore does not mirror them, and prints those terms once before the download starts. Weights trained from a randomly initialized model on your own data derive from no Deci checkpoint.
LibreYOLO 既不托管也不镜像这些权重:LibreYOLO 的 Hugging Face 组织里没有任何属于 这个家族的东西。所有自动下载都改为走 Deci 的公共 CDN,开始之前按进程打印一次 Deci 的条款,并在文件被打开之前对照一个钉死的 SHA-256 做校验。
另一条路是从随机初始化的模型开始训练。这套架构在上游采用 Apache-2.0 许可,在这里 采用 MIT 许可,所以用你自己的数据这样训练出来的模型不派生自任何 Deci 检查点。
引用
YOLO-NAS 发布时没有论文。下面这一条是它的作者要求引用的,指向 SuperGradients, 也就是它随之发布的那个库。
@misc{supergradients,
doi = {10.5281/ZENODO.7789328},
url = {https://zenodo.org/record/7789328},
author = {Aharon, Shay and {Louis-Dupont} and {Ofri Masad} and Yurkova, Kate and {Lotem Fridman} and {Lkdci} and Khvedchenya, Eugene and Rubin, Ran and Bagrov, Natan and Tymchenko, Borys and Keren, Tomer and Zhilko, Alexander and {Eran-Deci}},
title = {Super-Gradients},
publisher = {GitHub},
journal = {GitHub repository},
year = {2021},
}复制自作者在 github.com/Deci-AI/super-gradients#citing 上提供的引用块。