SuperGradients 中 YOLO-NAS 快速上手:实例化、推理、ONNX 导出与 RF100 微调全指南
2026/9/18 2:44:53 网站建设 项目流程

SuperGradients 中 YOLO-NAS 快速上手:实例化、推理、ONNX 导出与 RF100 微调全指南

【免费下载链接】super-gradientsEasily train or fine-tune SOTA computer vision models with one open source training library. The home of Yolo-NAS.项目地址: https://gitcode.com/GitHub_Trending/su/super-gradients

导读

YOLO-NAS 是 SuperGradients 开源训练库内置的 SOTA 目标检测模型,由 Deci 的神经架构搜索引擎 AutoNAC 自动生成,并在结构中引入量化感知的 RepVGG 模块,使其天然兼容训练后量化(PTQ),适合部署到多种硬件平台。本文基于仓库文档 YoloNASQuickstart.md 并结合源码,完整演示如何用几行代码实例化预训练 YOLO-NAS、对图片/URL 直接推理、一键导出 ONNX,以及如何在 Roboflow 100(RF100)数据集上通过 Recipe 配置文件微调 YOLO-NAS-S,并覆盖自定义输入通道数等进阶用法。

YOLO-NAS 分为 S / M / L 三个规模变体,对应仓库中的YoloNAS_SYoloNAS_MYoloNAS_L实现(见 yolo_nas_variants.py),本文以最小的 YOLO-NAS-S 为主线展开。

实例化 YOLO-NAS 模型

与原文档一致,加载模型只需两行代码:

from super_gradients.training import models from super_gradients.common.object_names import Models net = models.get(Models.YOLO_NAS_S, pretrained_weights="coco")
  • Models.YOLO_NAS_S是 SuperGradients 注册表中的模型枚举名(定义于 object_names.py),底层通过装饰器@register_model(Models.YOLO_NAS_S)YoloNAS_S类绑定;
  • pretrained_weights="coco"表示自动下载在 COCO 数据集上预训练好的权重,权重下载后缓存在本地;
  • 默认输入通道数为 3、输出 80 个 COCO 类别。

从源码看,models.get()是统一的模型工厂入口,其完整签名(见 model_factory.py)支持:

参数作用
model_name模型架构名,如Models.YOLO_NAS_S
arch_params架构超参(block、通道数、层数等)覆盖项
num_classes类别数,为None时从预训练权重对应数据集推导
pretrained_weights预训练权重对应的数据集(如"coco""imagenet"
checkpoint_path外部检查点路径(本地或 URL),与pretrained_weights二选一
strict_load权重加载的严格程度,默认NO_KEY_MATCHING
load_backbone是否只加载 backbone 权重
checkpoint_num_classes检查点自身的类别数,用于迁移学习时自动调用replace_head()
num_input_channels输入通道数,非默认时自动调用replace_input_channels()

加载完成后,net即为一个可直接推理、也可继续训练的标准SgModule/torch.nn.Module对象。

直接推理:predict 与结果可视化

YOLO-NAS 内置predict接口,接受图片 URL、本地路径、PIL 图像、numpy 数组等多种输入:

prediction = net.predict("https://www.aljazeera.com/wp-content/uploads/2022/12/2022-12-03T205130Z_851430040_UP1EIC31LXSAZ_RTRMADP_3_SOCCER-WORLDCUP-ARG-AUS-REPORT.jpg?w=770&resize=770%2C436&quality=80") prediction.show()
  • net.predict(...)内部会自动完成数据预处理(归一化、缩放等,处理参数随预训练权重一同保存),推理后返回prediction对象;
  • prediction.show()在 Jupyter / notebook 环境中直接绘制带检测框、类别标签与置信度分数的可视化结果(效果见下图,来源 yolo_nas_qs_predict.png);
  • 更精细的结果访问方式(如取框坐标、置信度、类别索引,或用prediction.save(...)存盘)可参考仓库中的推理示例脚本,如 detection_predict.py 与 detection_predict_image_folder.py。

导出为 ONNX

一行代码即可将训练好的模型导出为 ONNX 格式:

models.convert_to_onnx(model=net, input_shape=(3,640,640), out_path="yolo_nas_s.onnx")

其中input_shape=(3,640,640)表示无 batch 维的[C,H,W],导出时 batch 固定为 1。基于源码(见 conversion.py)补充两点重要说明:

  1. input_shape参数当前已标记为deprecated(弃用),官方推荐改用prep_model_for_conversion_kwargs中的input_size(带 batch 维的[1,C,H,W]),并可通过torch_onnx_export_kwargs透传torch.onnx.export的参数:
models.convert_to_onnx( model=net, out_path="yolo_nas_s.onnx", prep_model_for_conversion_kwargs=dict(input_size=(1, 3, 640, 640)), torch_onnx_export_kwargs=dict(opset=11), )
  1. 导出默认开启simplify=True,会调用 ONNX Simplifier 对图进行常量折叠等优化;导出前模型会先经过prep_model_for_conversion处理,将后处理(NMS 之外的解码逻辑)也固化进计算图,保证部署端无需复刻训练时的预处理/后处理细节。

仓库还提供了基于 Recipe 的批量导出入口 convert_recipe_to_code.py 与配套示例 models_export.ipynb,以及针对 YOLO-NAS-Pose 的导出指南 models_export_pose.md。

在 RF100(Roboflow 100)上微调 YOLO-NAS

数据集准备

原文档要求按照 Roboflow 官方指引下载 RF100 数据集,并强调两个关键约束:

  • 必须下载 COCO 格式,而不是 YOLOv5 格式;
  • 安装 COCO API(pycocotools)。

数据目录需整理为如下结构:

rf100 ├── 4-fold-defect │ ├─ train │ │ ├─ 000000000001.jpg │ │ ├─ ... │ │ └─ _annotations.coco.json │ ├─ valid │ │ └─ ... │ └─ test │ └─ ... ├── abdomen-mri │ └─ ... └── ...

使用 Recipe 启动训练

SuperGradients 为 YOLO-NAS 提供了开箱即用的微调 Recipe,仓库中的 roboflow_yolo_nas_s.yaml 专为 RF100 定制。启动训练的命令为:

python -m super_gradients.train_from_recipe --config-name=roboflow_yolo_nas_s dataset_name=<DATASET_NAME> dataset_params.data_dir=<PATH_TO_RF100_ROOT> ckpt_root_dir=<YOUR_CHECKPOINTS_ROOT_DIRECTORY>

参数说明:

参数含义
--config-name=roboflow_yolo_nas_s加载 S 变体微调配置(另有 roboflow_yolo_nas_m.yaml 对应 M 变体)
dataset_name替换为任意 RF100 数据集名(如digits-t2eg6,即 Roboflow 数据集 URL 中的标识段)
dataset_params.data_dirRF100 根目录路径,即上面目录结构中的rf100
ckpt_root_dir检查点保存根目录

dataset_name会被传递到数据集配置 roboflow_detection_dataset_params.yaml 中,用于自动拼接train/valid分区的路径;类别数则通过内置的 hydra 解析器roboflow_dataset_num_classes:${dataset_name}自动推导并写入num_classes,无需手工指定。

Recipe 内部做了什么

以 S 变体为例,roboflow_yolo_nas_s.yaml 的关键设计:

  • 默认继承coco2017_yolo_nas_train_params训练超参、roboflow_detection_dataset_params数据集参数、yolo_nas_s_arch_params架构参数;
  • pretrained_weights: coco表示从 COCO 预训练权重出发做迁移学习;
  • 训练配置将initial_lr设为5e-4、采用LinearEpochLRWarmup预热 3 个 epoch、cosine_final_lr_ratio: 0.1的余弦退火、max_epochs: 100,并开启mixed_precision: True(混合精度)与ema: True(指数滑动平均,decay=0.9);
  • 损失函数为PPYoloELossreg_max: 16对应 DFL(Distribution Focal Loss)的回归桶数;
  • 验证指标使用DetectionMetrics_050(即 mAP@0.50),后处理回调为PPYoloEPostPredictionCallback(score_threshold=0.01、nms_top_k=1000、max_predictions=300、nms_threshold=0.7);
  • 单卡训练(multi_gpu: Offnum_gpus: 1),实验名自动生成为yolo_nas_s_roboflow_<dataset_name>

数据增强方面,训练集默认启用 Mosaic、RandomAffine、HSV、HorizontalFlip、PaddedRescale 与 Standardize 组合(Mixup 在配置中以注释形式预留,可自行开启);验证集仅做 PaddedRescale + Standardize,保证评估一致性。输入分辨率统一为640x640,batch size 在 S 变体下默认 16。

为多通道(非 RGB)输入创建模型

YOLO-NAS 默认接收 3 通道 RGB 图像,但可以通过arch_params传入in_channels构建任意输入通道数的模型:

model = models.get(Models.YOLO_NAS_S, arch_params=dict(in_channels=2), num_classes=15)

使用时有两点必须注意:

  1. 不能使用预训练权重pretrained_weights是为 3 通道输入训练的,改通道数后结构与权重不匹配,因此该场景下应省略pretrained_weights
  2. 必须显式提供num_classes:此时无法从预训练权重推导类别数,需要手动指定(上例为 15 类)。

从源码看,YoloNAS_S.__init__(见 yolo_nas_variants.py)会先加载默认架构参数 yolo_nas_s_arch_params.yaml,再用传入的arch_params覆盖合并;其中in_channels的默认值为 3,heads段中的num_classes默认 80。当你传入arch_params=dict(in_channels=2)时,仅替换 stem 的输入通道,backbone 其余部分与 neck、head 结构保持不变——这也是它能"一行换通道数"的原理所在。

深入:YOLO-NAS 架构要点

了解底层结构有助于正确使用与调参。YOLO-NAS 的完整结构定义在 yolo_nas_s_arch_params.yaml 中,由三大部分组成:

  • Backbone(主干)NStageBackbone,包含YoloNASStem起始层与 4 个YoloNASStage阶段,通道数逐级扩展(48 → 96 → 192 → 384 → 768),最后接一个SPP空间金字塔池化模块(池化核k: [5,9,13])以聚合多尺度上下文;
  • Neck(颈部)YoloNASPANNeckWithC2,由两个上采样阶段与两个下采样阶段构成 FPN+PAN 结构,实现自顶向下与自底向上的特征融合;
  • Heads(检测头)NDFLHeads内含 3 个YoloNASDFLHead,分别对应 stride 8 / 16 / 32 的三个尺度输出,每个 head 的inter_channelswidth_mult定义了回归/分类分支宽度。

其中YoloNASDFLHead使用 DFL 形式的边界框回归(reg_max: 16),这也是损失函数必须配套PPYoloELossreg_max保持一致的原因。该架构的量化友好性来自 backbone 中融入的量化感知 RepVGG 模块(见 qarepvgg_block.py),训练时使用多分支结构、推理时可重参数化为单分支卷积,从而在保持精度的同时降低延迟,并为后续 PTQ/QAT 量化部署(参见 ptq_qat.md)打下基础。

总结

本文完整覆盖了 YOLO-NAS 在 SuperGradients 中的四条核心使用路径:实例化models.get加载 COCO 预训练权重)、推理predict+show)、导出convert_to_onnx一行生成 ONNX)、微调(RF100 Recipe 训练命令与数据集规范),并额外讲解了多通道输入定制与底层架构原理。掌握这些内容后,即可基于 YOLO-NAS 快速完成从预训练模型评估、自有数据集微调到边缘端部署的完整闭环。更多模型细节可查阅仓库中的 YOLONAS.md 与模型导出文档 models_export.md。

【免费下载链接】super-gradientsEasily train or fine-tune SOTA computer vision models with one open source training library. The home of Yolo-NAS.项目地址: https://gitcode.com/GitHub_Trending/su/super-gradients

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询