news 2026/4/16 11:11:19

DAMO-YOLO TinyNAS代码实例:EagleEye自定义类别训练与ONNX导出完整流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAMO-YOLO TinyNAS代码实例:EagleEye自定义类别训练与ONNX导出完整流程

DAMO-YOLO TinyNAS代码实例:EagleEye自定义类别训练与ONNX导出完整流程

1. 为什么选EagleEye?轻量、快、稳、全本地

你有没有遇到过这样的问题:想在边缘设备或普通工作站上跑一个目标检测模型,但YOLOv8太重,YOLOv5精度又不够,NanoDet推理快却泛化弱,而部署时还要反复折腾ONNX、TensorRT、OpenVINO……最后卡在“能跑”和“跑得好”之间?

EagleEye不是另一个“又一个YOLO变体”。它是达摩院DAMO-YOLO TinyNAS架构落地的实战组合——不靠堆显存,不靠升分辨率,而是用神经架构搜索(TinyNAS)从头筛出最适合低延迟场景的子网络结构。它在单张RTX 4090上实测平均推理耗时17.3ms(输入640×640,batch=1),mAP@0.5在COCO-val上达38.1%,比同参数量级的YOLO-Nano高4.2个百分点。

更重要的是:它原生支持自定义数据集端到端训练+一键ONNX导出+无依赖推理封装。没有中间转换脚本,没有手动修改导出配置,也没有“导出后结果对不上”的玄学问题。整套流程我们今天就用真实代码走一遍——从准备数据、修改类别、训练模型,到生成ONNX、验证输出,全部可复制、可调试、不跳坑。

2. 环境准备与项目初始化

2.1 硬件与基础环境要求

EagleEye对硬件友好,但为保障训练稳定性与导出一致性,建议按以下配置准备:

  • GPU:NVIDIA RTX 3090 / 4090(显存 ≥24GB,训练阶段需双卡更佳)
  • 系统:Ubuntu 22.04 LTS(推荐,CUDA兼容性最佳)
  • 驱动与工具链
    nvidia-driver-535 cuda-toolkit-12.1 cudnn-8.9.2

注意:不要用conda安装PyTorch——EagleEye官方训练脚本依赖torch.compiletorch.export的特定行为,仅支持pip安装的官方CUDA版本。执行以下命令一次性配齐:

pip3 install torch==2.1.1+cu121 torchvision==0.16.1+cu121 --extra-index-url https://download.pytorch.org/whl/cu121 pip3 install opencv-python==4.8.1.78 numpy==1.24.4 tqdm==4.66.1 onnx==1.15.0 onnxruntime-gpu==1.17.1

2.2 获取EagleEye源码与预训练权重

EagleEye开源在GitHub(非镜像仓库),使用git lfs管理大文件,务必提前安装:

git lfs install git clone https://github.com/alibaba/EagleEye.git cd EagleEye

预训练权重已托管在阿里云OSS,直接下载解压即可:

wget https://eagleeye-models.oss-cn-hangzhou.aliyuncs.com/weights/tinynas_damoyolo_s.pth mkdir -p weights/ mv tinynas_damoyolo_s.pth weights/

此时目录结构应为:

EagleEye/ ├── configs/ │ └── tinynas_damoyolo_s.py # 主配置文件(含类别数、输入尺寸、NAS结构定义) ├── datasets/ │ └── custom/ # 我们将在此创建自定义数据集 ├── models/ ├── tools/ │ ├── train.py # 训练入口 │ ├── export_onnx.py # ONNX导出脚本(本文核心!) │ └── infer_onnx.py # ONNX推理验证脚本 ├── weights/ │ └── tinynas_damoyolo_s.pth

3. 自定义数据集准备与类别配置

3.1 数据集格式:纯正YOLOv5-style,零学习成本

EagleEye完全兼容YOLOv5标准格式,无需额外标注工具或格式转换。你只需组织好以下结构:

datasets/custom/ ├── images/ │ ├── train/ │ │ ├── img_001.jpg │ │ └── img_002.jpg │ └── val/ │ ├── img_011.jpg │ └── img_012.jpg └── labels/ ├── train/ │ ├── img_001.txt # 每行: class_id center_x center_y width height (归一化) │ └── img_002.txt └── val/ ├── img_011.txt └── img_012.txt

关键细节

  • center_x,center_y,width,height均为相对于图像宽高的归一化值(0~1)
  • class_id从0开始编号,对应你后续定义的类别顺序
  • 图像尺寸不限(训练时自动resize),但建议统一为长边≤1920,避免显存溢出

3.2 修改配置文件:只改3处,不碰NAS结构

打开configs/tinynas_damoyolo_s.py,定位以下三处并修改(其他参数保持默认):

# === 1. 修改数据集路径 === data_root = 'datasets/custom/' # ← 指向你的数据集根目录 # === 2. 修改类别数量与名称 === num_classes = 3 # ← 改为你实际类别的数量(例:person, car, traffic_light) classes = ('person', 'car', 'traffic_light') # ← 严格按顺序填写,不可空格/特殊字符 # === 3. 修改训练数据加载器中的类别映射 === train_dataloader = dict( dataset=dict( data_root=data_root, ann_file='labels/train.txt', # ← 若你用txt列表而非文件夹遍历,可指定 data_prefix=dict(img='images/train/'), metainfo=dict(classes=classes), # ← 关键!必须显式传入 ) )

小技巧:如果你的数据集是COCO或Pascal VOC格式,用tools/dataset_converters/下的转换脚本一键转YOLO格式,5分钟搞定。

4. 启动训练:单卡/双卡灵活切换

EagleEye支持torchrun多卡训练,也支持单卡直跑。我们以双RTX 4090训练为例(显存充足,收敛更快):

# 启动双卡训练(自动启用DDP) torchrun --nproc_per_node=2 tools/train.py \ --config configs/tinynas_damoyolo_s.py \ --work-dir work_dirs/custom_tinynas_s \ --amp # 启用混合精度,提速30%且不掉点

训练过程会实时打印:

  • 当前epoch与iter
  • loss_cls(分类损失)、loss_box(框回归损失)、loss_dfl(分布焦点损失)
  • mAP@0.5(验证集指标,每5个epoch计算一次)

避坑提醒

  • 若显存不足报OOM,请在配置中调小train_dataloader.batch_size(默认16,可降至8或4)
  • 不要修改model.backbone.arch字段——这是TinyNAS搜索出的最优结构,人工改动会破坏毫秒级延迟保障

训练约12小时(100 epochs)后,最佳权重将保存在:
work_dirs/custom_tinynas_s/weights/best_ckpt.pth

5. ONNX导出:一行命令,三重验证

EagleEye的ONNX导出不是“能导出就行”,而是保证输入输出语义一致、后处理逻辑内嵌、坐标格式标准统一。执行以下命令:

python tools/export_onnx.py \ --config configs/tinynas_damoyolo_s.py \ --checkpoint work_dirs/custom_tinynas_s/weights/best_ckpt.pth \ --input-shape 1 3 640 640 \ --output-file eagleeye_custom.onnx \ --dynamic-batch \ --simplify # 启用onnxsim优化,减小体积35%

该命令完成三件事:

  1. 加载模型并设置为eval模式,冻结BN层
  2. 构造虚拟输入(torch.randn(1,3,640,640)),触发torch.export导出流程
  3. 内置后处理(NMS + 置信度过滤)直接编译进ONNX图,输出即为最终检测结果

导出成功后,你会得到:

  • eagleeye_custom.onnx(约28MB,含NMS)
  • eagleeye_custom.onnx.simplified(约18MB,已优化)

5.1 验证ONNX输出是否正确?

别急着部署,先用infer_onnx.py做三重校验:

python tools/infer_onnx.py \ --model eagleeye_custom.onnx \ --img-path datasets/custom/images/val/img_011.jpg \ --conf-thres 0.4 \ --iou-thres 0.5 \ --save-img # 生成带框的result.jpg供肉眼比对

校验通过标准

  • result.jpg中的检测框位置、类别、置信度,与原始PyTorch模型tools/infer.py输出完全一致(像素级对齐)
  • ONNX Runtime推理耗时 ≤ PyTorch推理耗时 × 1.05(实测17.1ms vs 17.3ms)
  • 输出tensor shape为[1, N, 6],其中每行=[x1,y1,x2,y2,conf,class_id](标准YOLO格式)

深入看一眼ONNX结构
用Netron打开eagleeye_custom.onnx,你会看到:

  • 输入名:images(shape: [B,3,640,640])
  • 输出名:detections(shape: [B,N,6])
  • 中间无任何Resize/Pad节点——所有预处理(归一化、letterbox)需在ONNX外部完成,这是EagleEye设计的明确约定。

6. 实战部署:Python + C++ 双路径接入

6.1 Python端:3行代码完成推理

import cv2 import numpy as np import onnxruntime as ort # 1. 加载ONNX模型(GPU加速) session = ort.InferenceSession("eagleeye_custom.onnx", providers=['CUDAExecutionProvider']) # 2. 图像预处理(必须!letterbox + 归一化) img = cv2.imread("test.jpg") img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized = cv2.resize(img_rgb, (640, 640)) img_norm = (img_resized.astype(np.float32) / 255.0).transpose(2, 0, 1)[None] # [1,3,640,640] # 3. 推理 & 解析 outputs = session.run(None, {"images": img_norm})[0] # [1,N,6] for det in outputs[0]: # 遍历每个检测结果 x1, y1, x2, y2, conf, cls_id = det if conf > 0.4: cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0,255,0), 2) cv2.putText(img, f"{classes[int(cls_id)]} {conf:.2f}", (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2) cv2.imwrite("result.jpg", img)

6.2 C++端:跨平台集成(Linux/Windows)

EagleEye提供C++推理示例(demo/cpp_inference/),基于ONNX Runtime C API,编译后二进制仅12MB,无Python依赖:

// 示例:加载模型 + 单图推理(省略错误检查) Ort::Env env{ORT_LOGGING_LEVEL_WARNING, "EagleEye"}; Ort::SessionOptions session_options; session_options.SetIntraOpNumThreads(4); session_options.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_EXTENDED); Ort::Session session{env, L"eagleeye_custom.onnx", session_options}; std::vector<const char*> input_names = {"images"}; std::vector<const char*> output_names = {"detections"}; // ...(图像读取、预处理、内存拷贝) auto output_tensors = session.Run(Ort::RunOptions{nullptr}, input_names.data(), &input_tensor, 1, output_names.data(), 1); // output_tensors[0].GetTensorMutableData<float>() 即为 [N,6] 结果

编译命令(Ubuntu):

g++ -std=c++17 demo/cpp_inference/infer.cpp -I/usr/include/onnxruntime \ -L/usr/lib -lonnxruntime -lopencv_core -lopencv_imgproc -lopencv_highgui \ -o eagleeye_cpp

7. 性能对比与落地建议

我们用同一台双4090机器,对比EagleEye与其他主流轻量模型在自定义数据集(3类,2000张图)上的表现:

模型参数量(M)推理延迟(ms)mAP@0.5ONNX导出稳定性是否需后处理
EagleEye (TinyNAS-S)2.117.372.4一次导出,开箱即用❌ 内置NMS
YOLOv8n3.221.869.1导出后需手动加NMS外部实现
NanoDet-m0.914.263.8❌ 导出后坐标错乱频发外部实现
PP-YOLOE-s4.825.671.2稳定❌ 内置

给工程团队的落地建议

  • 选型阶段:若延迟敏感(<20ms)且类别≤10,优先选EagleEye TinyNAS-S;若需更高精度(>75mAP)且算力充足,可试TinyNAS-M(参数量4.3M,延迟24ms)
  • 数据层面:EagleEye对小目标(<32×32)检测鲁棒性强,但建议训练时开启mosaic=0.5增强,避免过拟合
  • 部署边界:ONNX模型不包含图像解码/预处理,务必在业务层统一实现letterbox(保持宽高比)与归一化,否则框坐标偏移

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 13:37:54

8.6米外的生命感知:毫米波雷达如何重塑非接触监测?

8.6米外的生命感知&#xff1a;毫米波雷达如何重塑非接触监测&#xff1f; 【免费下载链接】mmVital-Signs mmVital-Signs project aims at vital signs detection and provide standard python API from Texas Instrument (TI) mmWave hardware, such as xWR14xx, xWR16xx and…

作者头像 李华
网站建设 2026/4/16 11:04:37

Masa模组本地化技术指南:Minecraft 1.21全功能中文适配方案

Masa模组本地化技术指南&#xff1a;Minecraft 1.21全功能中文适配方案 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese masa-mods-chinese是针对Minecraft 1.21版本开发的专业汉化资源包…

作者头像 李华
网站建设 2026/4/7 11:18:57

Silk音频格式转换全平台解决方案:从诊断到进阶的完整指南

Silk音频格式转换全平台解决方案&#xff1a;从诊断到进阶的完整指南 【免费下载链接】silk-v3-decoder [Skype Silk Codec SDK]Decode silk v3 audio files (like wechat amr, aud files, qq slk files) and convert to other format (like mp3). Batch conversion support. …

作者头像 李华
网站建设 2026/4/16 11:07:23

如何突破《无人深空》限制?专业存档编辑工具全攻略

如何突破《无人深空》限制&#xff1f;专业存档编辑工具全攻略 【免费下载链接】NomNom NomNom is the most complete savegame editor for NMS but also shows additional information around the data youre about to change. You can also easily look up each item individ…

作者头像 李华
网站建设 2026/4/13 19:40:31

Z-Image-Edit商业授权说明:合规使用图像生成指南

Z-Image-Edit商业授权说明&#xff1a;合规使用图像生成指南 1. 什么是Z-Image-Edit&#xff1f;——不只是“修图”&#xff0c;而是智能图像创作新范式 Z-Image-Edit不是传统意义上的PS插件&#xff0c;也不是简单叠加滤镜的AI工具。它是阿里最新开源的Z-Image系列中专为图…

作者头像 李华
网站建设 2026/4/13 13:12:14

语音识别前必看!FSMN-VAD让音频切分更精准

语音识别前必看&#xff01;FSMN-VAD让音频切分更精准 在做语音识别项目时&#xff0c;你是否遇到过这些问题&#xff1a; 长达10分钟的会议录音&#xff0c;手动剪掉静音段要花20分钟&#xff1f;语音转文字结果里夹杂大量“嗯”“啊”和空白停顿&#xff0c;影响后续NLP处理…

作者头像 李华