当前位置: 首页 > news >正文

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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/305681/

相关文章:

  • 企业广告配音新方案:IndexTTS 2.0批量生成实践
  • 2026年合肥专业自助入住系统公司深度评测与推荐
  • 破解教材下载难题:tchMaterial-parser全功能解析
  • 如何在macOS上运行Windows程序:Whisky的跨平台解决方案
  • LyricsX与iTunes歌词同步解决方案:自动完善音乐库的实用指南
  • 6大防护策略!用luci-app-access-control构建家庭网络安全防线
  • VibeThinker-1.5B效率翻倍:优化推理速度的小技巧
  • 分子动力学分析实战指南:从认知基础到效能提升的完整路径
  • 告别手动点击!用Open-AutoGLM快速搭建手机AI助手
  • keil编译器下载v5.06下CAN总线控制程序设计实战案例
  • all-MiniLM-L6-v2参数详解:hidden_size=384, num_layers=6, dropout=0.1全解读
  • 2步解锁唇语黑科技:让无声交流秒变文字
  • 零编码经验?照样用BSHM镜像玩转AI图像处理
  • 解锁创意卡牌设计:专业级三国杀武将创作全指南
  • 7个技巧打造专业级三国杀卡牌:从新手到高手的创作指南
  • 如何实现VRChat无障碍沟通?VRCT全场景应用指南
  • 7个系统焕新技巧:用Dism++解决Windows卡顿的终极优化方案
  • 如何用ms-swift实现7B模型4-bit量化?实测分享
  • 系统化岛屿设计:从空白画布到梦幻乐园的进阶指南
  • Scanner类方法项目应用快速上手
  • 如何突破口型同步技术瓶颈?MuseTalk的创新路径解析
  • 还在手动扒字幕?BiliBiliCCSubtitle让B站文字提取效率提升10倍
  • 3步静音控制+散热优化:全系统散热管理完全指南
  • 颠覆式教育资源获取工具:3分钟高效获取电子教材完整指南
  • GLM-4.7-Flash一文详解:GPU显存优化至85%的推理部署方案
  • 厦门大学LaTeX模板:论文排版效率提升指南
  • 3步构建零延迟监控中枢:go2rtc轻量革命与全场景落地指南
  • 无需安装也能专业绘图?这款浏览器工具让SVG创作变简单
  • 岛屿设计大师:从概念到完美的三阶创作之旅
  • 突破设计瓶颈:创意设计工具驱动的岛屿空间规划革新方案