[Issue #51] YOLO-Master-EsMoE-N 在 VisDrone 上的 ONNX/NCNN 边缘部署与一致性验证 #205
CressBoy
started this conversation in
Show and tell
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
1. 项目目标
本项目在 VisDrone2019-DET 上微调 YOLO-Master-EsMoE-N,并完成
PyTorch → ONNX(onnxsim)→ NCNN(PNNX)的部署链路。重点验证三个问题:
2. 训练与模型
640 × 640Letterbox;close_mosaic=10;mAP50=0.35049,mAP50-95=0.20263。同一次正式训练中,epoch 10 到最佳 epoch 81 的
mAP50-95从0.13187提升到
0.20263,绝对提升0.07076,相对提升53.66%。epoch 100略回落到
0.19830,因此部署使用best.pt。需要说明:COCO 80 类源权重与 VisDrone 10 类微调权重的检测头语义不同,不能直接把
源权重的 VisDrone mAP 当作有效“微调前基线”。上述数字是同一次训练的进展证据,
不能证明 EsMoE-N 优于其他架构。项目已准备参数规模接近的 YOLO11n 对照配置,但未把
尚未完成的对照训练写成结果。
作为量级参考,上游项目公开表格在 VisDrone 上报告 YOLOv11-N 为
mAP=0.185 / mAP50=0.322、YOLO-Master-N 为0.196 / 0.337;本项目最佳训练器结果为
0.20263 / 0.35049,并非明显异常。但由于上游表与本项目的模型版本、数据处理和评估细节可能不同,这只能作为外部背景,不能冒充本地受控架构对照。
参考:YOLO-Master Main Results
3. 导出与兼容性
ONNX 使用 opset 17 并通过
onnx.checker;简化模型通过 onnxsim 校验。NCNN 使用PNNX 转换,最终 param 文件包含 561 layers / 664 blobs,未发现残留的
aten::、prim::或pnnx.不支持层。PNNX 20260526 会把 FP32 路由器中的冗余
.float().type_as(x)保留为 NCNN不支持的
aten::to。本项目在 FP32 导出时省略这两个恒等转换,并提供独立补丁与回归测试。
当前 checkpoint 的 4 个 EsMoE 模块均为
top_k=3 / num_experts=3 / use_top_k=False,即 PyTorch eager 本身也是 dense。ONNX/NCNN 的 dense fallback没有改变本模型实际计算的专家数量。
4. 548 张验证集一致性
三个后端统一使用固定
640 × 640Letterbox(rect=False)、conf=0.10、iou=0.55、class-aware NMS 和max_det=1000。两种导出格式的差值均远低于课题要求的非量化
< 0.005。5. 公平 CPU benchmark
早期测试直接逐图调用
YOLO.predict(path),但审计发现三个运行时没有实际使用相同线程数:PyTorch 初始化后重置为 8 线程,ONNX Runtime 使用自动线程,NCNN 默认 8
线程;同时计时混入逐图数据源创建和包装开销。因此早期“ONNX 比 PyTorch 慢”的结论
被废弃。
最终主性能口径如下:
ONNX 端到端延迟相对 PyTorch 降低
27.1%,FPS 提升37.2%,公平加速结论成立。NCNN 在当前 Windows x86_64 Python 环境没有跑赢 PyTorch,这是一项平台相关负结果,
不外推为 ARM/移动端结论。
正确性闸门中,ONNX 的最大原图框坐标差为
0.001282 px、最大置信度差为1.55e-5;NCNN 分别为0.004578 px和5.10e-5,均通过0.01 px / 1e-4门槛。6. 原生 NCNN C++ 与双平台
C++ 推理程序使用 CMake,包含 VisDrone 预处理、解码、class-aware NMS、JSON
benchmark 输出和线程数控制。
Windows 扫描
1/2/4/8/12/16/24线程后,24 线程相对固定 4 线程的端到端延迟下降
22.8%、FPS 提升29.5%。Linux/WSL 2 的最优点是 8 线程;24 线程反而下降到
9.19 FPS,说明混合 P/E 核和不同调度器下不能照搬线程配置。Windows 与 Linux 对同一输入均输出 122 个检测,类别完全一致,最大置信度差
2e-6,最大框坐标差0.000305 px。7. 复现
核心命令:
模型权重和数据集不提交进仓库;README 中给出下载、目录布局、导出、验证、benchmark
和 CMake 构建说明。所有主表的机器可读 JSON 已放入
docs/results/。8. 限制与后续
物理边缘设备,不能提供真实设备功耗、温度和峰值内存结论;
不是稀疏专家裁剪。
完整实现、复现说明、补丁和结构化实验结果见文首部署仓库。
All reactions