RK3568笔记111:YOLO26模型导出到TaoToken统一Key通道的RKNN转换实践

发布时间:2026/10/12 22:54:34

RK3568笔记111:YOLO26模型导出到TaoToken统一Key通道的RKNN转换实践 1. RK3568 上跑 YOLO26 到底卡在哪从训练权重到 RKNN 的完整链路YOLO26 是 Ultralytics 在 2025 年推出的新一代检测模型相比 YOLOv8/YOLO11 在端到端推理和 NMS-free 上做了不少改动。但真正把它落到 RK3568 这类边缘 NPU 上很多人第一步就卡住了PyTorch 的.pt权重不能直接喂给 RKNPU必须经过 ONNX 中间格式再用 rknn-toolkit2 转成.rknn中间还要处理量化、后处理算子兼容、输入输出节点对齐等一堆细节。我自己在正点原子 ATK-RK3568 开发板buildroot 系统上完整走了一遍 YOLO26n 的导出链路踩过的坑包括ultralytics 版本不匹配导致formatrknn参数不识别、onnxslim 版本过低报错、量化数据集路径写错导致 build 阶段直接崩、以及优化版和非优化版导出结果在 rknn_model_zoo 里跑出来的差异。这篇文章把整条链路拆成可复制的步骤包括环境准备、ONNX 校验、rknn.config 参数模板、量化配置以及最后用统一 Key/API 通道做一次推理连通性验证确认模型文件本身没问题。适合谁看手上已经有 RK3568/RK3566/RK3588 开发板想把自训练的 YOLO26 权重部署到 NPU 上的嵌入式工程师或者正在用 rknn-toolkit2 做模型转换、被量化报错折磨的同学。全文命令都可以直接复制路径按你自己的工程改一下就行。核心检索词先明确RK3568 YOLO26 模型导出 RKNN 转换本质是把 Ultralytics 的 PyTorch 权重通过 ONNX 中间层转成 Rockchip NPU 能加载的.rknn文件并保证量化后精度可用。下面从环境开始。2. 前置准备rknn-toolkit2 2.3.2 环境与 TaoToken 统一 Key 通道2.1 为什么要在导出链路里引入 TaoToken模型转换本身是本地操作跟 API 通道没关系。但转换完之后你需要验证两件事一是.rknn文件在 PC 端模拟推理是否正常二是模型结构输入尺寸、输出节点是否符合预期。这时候如果还要自己搭一套推理服务、配环境变量、管理多个模型的 Key会很碎。TaoToken 在这里的角色是统一 Key/API 通道你用一个 Key 就能调用多家模型做对照验证比如让视觉语言模型帮你检查导出日志、对比 ONNX 和 RKNN 的输出节点命名是否一致。它的 API 地址是https://taotoken.net/api兼容 OpenAI 风格的请求格式所以你可以直接用curl或 Python 的openai库发请求不需要额外装 SDK。我试过把导出过程中的报错日志丢给模型做归因比自己翻 rknn-toolkit2 源码快很多。下面先把环境搭好再讲怎么用这个通道做验证。2.2 rknn-toolkit2 2.3.2 安装RK3568 对应的 toolkit 版本建议用 2.3.2太新的版本对 YOLO26 的后处理算子支持还不稳定。用 conda 建独立环境conda create -n rknn-toolkit2-2.3.2 python3.10 -y conda activate rknn-toolkit2-2.3.2然后装 rknn-toolkit2 的 wheel 包。Rockchip 官方在 GitHub 的rknn-toolkit2仓库里按版本放了 whl下载对应cp310的包pip install rknn_toolkit2-2.3.2-cp310-cp310-linux_x86_64.whl装完验证一下python -c from rknn.api import RKNN; print(rknn ok)能打印rknn ok就说明底层库没问题。注意这个环境是跑在 x86 PC 上的不是开发板上开发板只负责跑编译好的可执行文件。2.3 Ultralytics 与 PyTorch 版本对齐YOLO26 的导出依赖 ultralytics 8.4.3torch 用 2.4.0。版本不对会出现formatrknn不被识别的情况pip install ultralytics8.4.3 pip install torch2.4.0 torchvision0.19.0导出时还会自动拉onnxslim0.1.71如果网络慢可以提前装pip install onnxslim0.1.712.4 TaoToken Key 获取与通道配置到https://taotoken.net/api-keys生成一个 Key然后在终端里导出环境变量方便后面用 curl 验证export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api如果你用 Python 的 openai 库配置是这样from openai import OpenAI client OpenAI( api_keysk-你的key, base_urlhttps://taotoken.net/api )这样一套配置后面验证模型输出、排查导出日志都能复用。环境准备好之后进入正式的模型转换。3. 可复制配置YOLO26 导出 ONNX 与 rknn.config 参数模板3.1 原始版本直接导出 RKNNUltralytics 官方从某个版本开始内置了formatrknn的导出支持命令很简洁yolo export modelyolo26n.pt formatrknn namerk3568执行后会在当前目录生成yolo26n_rknn_model文件夹里面是.rknn文件。name参数决定目标平台可选rk3588, rk3576, rk3566, rk3568, rk3562, rv1103, rv1106, rv1126b等。这条命令背后其实做了三件事先导出 ONNX再调 rknn-toolkit2 转 RKNN最后打包。优点是省事缺点是中间过程不透明量化配置用的是默认值遇到精度问题不好调。3.2 优化版本先导 ONNX 再手动转 RKNN优化版是参考 Rockchip 官方在 YOLOv11 上的改动做的主要优化了后处理部分更适合 RKNPU 推理。流程拆成两步可控性更强。第一步进入优化版源码目录导出 ONNXconda activate rknn-toolkit2-2.3.2 cd ultralytics-8.4.3-rknn-optimized yolo export modelyolo26n.pt formatrknn namerk3568这一步的name参数其实不影响 ONNX 结构写rk3568或rv1126b都行因为只是导出中间格式。导出后你会得到一个yolo26n.onnx。第二步写转换脚本。新建convert目录创建convert.pyimport sys from rknn.api import RKNN DATASET_PATH ./coco_subset_20.txt DEFAULT_RKNN_PATH ./yolo26.rknn DEFAULT_QUANT True def parse_arg(): if len(sys.argv) 3: print(Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)].format(sys.argv[0])) print( platform choose from [rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b]) print( dtype choose from [i8, fp]) exit(1) model_path sys.argv[1] platform sys.argv[2] do_quant DEFAULT_QUANT if len(sys.argv) 3: model_type sys.argv[3] if model_type not in [i8, u8, fp]: print(ERROR: Invalid model type: {}.format(model_type)) exit(1) elif model_type in [i8, u8]: do_quant True else: do_quant False if len(sys.argv) 4: output_path sys.argv[4] else: output_path DEFAULT_RKNN_PATH return model_path, platform, do_quant, output_path if __name__ __main__: model_path, platform, do_quant, output_path parse_arg() rknn RKNN(verboseFalse) print(-- Config model) rknn.config( mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformplatform ) print(done) print(-- Loading model) ret rknn.load_onnx(modelmodel_path) if ret ! 0: print(Load model failed!) exit(ret) print(done) print(-- Building model) ret rknn.build(do_quantizationdo_quant, datasetDATASET_PATH) if ret ! 0: print(Build model failed!) exit(ret) print(done) print(-- Export rknn model) ret rknn.export_rknn(output_path) if ret ! 0: print(Export rknn model failed!) exit(ret) print(done) rknn.release()这里rknn.config的三个参数是关键mean_values[[0,0,0]]和std_values[[255,255,255]]表示输入归一化到 0-1跟 Ultralytics 训练时的预处理对齐target_platform必须和你的板子一致写错会导致 NPU 加载失败。3.3 量化数据集配置rknn.build里的dataset指向一个 txt 文件每行是一张校准图片的路径。量化需要至少 20 张有代表性的图片太少会导致精度掉得厉害。coco_subset_20.txt内容示例./subset/000000005001.jpg ./subset/000000038829.jpg ./subset/000000052891.jpg ./subset/000000075612.jpg ./subset/000000098261.jpg ./subset/000000181542.jpg ./subset/000000215245.jpg ./subset/000000277005.jpg ./subset/000000288685.jpg ./subset/000000301421.jpg ./subset/000000334371.jpg ./subset/000000348481.jpg ./subset/000000373353.jpg ./subset/000000397681.jpg ./subset/000000414673.jpg ./subset/000000419312.jpg ./subset/000000465822.jpg ./subset/000000475732.jpg ./subset/000000559707.jpg ./subset/000000574315.jpg图片要放在subset目录下路径是相对convert.py所在目录的。如果路径写错build 阶段会报dataset read failed。3.4 执行转换python convert.py yolo26n.onnx rk3568默认走 int8 量化。如果想先验证结构、不量化加fppython convert.py yolo26n.onnx rk3568 fp执行成功会看到Export rknn model done当前目录生成yolo26.rknn。到这里原始版和优化版两个 RKNN 文件都有了接下来验证。4. 验证请求与成功结果rknn_model_zoo 编译 TaoToken 通道连通性测试4.1 用 rknn_model_zoo 编译测试程序Rockchip 官方的rknn_model_zoo里有现成的 YOLO 例子直接复用 yolo11 的工程即可。先克隆git clone https://github.com/airockchip/rknn_model_zoo cd rknn_model_zoo/examples/yolo11设置交叉编译工具链正点原子的工具链路径一般是export GCC_COMPILER/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu把导出的模型拷进 model 目录cp /path/to/yolo26n-rk3568.rknn ./model/编译./build-linux.sh -t rk356x -a aarch64 -d yolo11编译产物在install/rk356x_linux_aarch64/rknn_yolo11_demo/把整个目录拷到开发板同时把.rknn模型也拷过去。4.2 开发板上运行在开发板终端cd rknn_yolo11_demo ./rknn_yolo11_demo model/yolo26n-rk3568.rknn test.jpg正常输出会打印推理耗时和检测框坐标。如果模型结构对不上会报rknn_init fail或输出节点数量不匹配。4.3 用 TaoToken 通道做推理连通性验证模型在板子上跑通后建议再用统一 Key 通道做一次对照验证确认导出日志和输出节点没问题。用 curl 发一个请求让模型帮你检查 ONNX 的输出节点命名curl https://taotoken.net/api/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-5, messages: [ {role: user, content: YOLO26 导出 ONNX 后输出节点通常是 output0形状 [1, 84, 8400]请确认这个结构在 RKNN 量化时是否需要特殊处理} ] }预期返回是一段关于输出节点和量化对齐的说明。这一步的意义是当你遇到reading choices之类的解析报错时可以快速用模型做归因不用自己翻文档。如果你更习惯 Pythonfrom openai import OpenAI client OpenAI(api_keysk-你的key, base_urlhttps://taotoken.net/api) resp client.chat.completions.create( modelclaude-sonnet-4-5, messages[{role: user, content: 帮我分析这段 rknn build 报错Build model failed, dataset read failed}] ) print(resp.choices[0].message.content)成功结果就是返回一段可读的分析文本。这个通道的好处是 Key 统一换模型只改model字段不用重新配环境。4.4 两个版本对比版本导出方式后处理适用场景原始版yolo export formatrknn一步到位保留原版快速验证优化版先 ONNX 再 convert.py针对 RKNPU 优化追求推理速度实测下来优化版在 RK3568 上的单帧推理耗时比原始版低一些但精度差异需要按你的数据集评估。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth导出和验证过程中报错集中在几个地方逐个说。401 Unauthorized用 TaoToken 通道验证时最常见。原因是 Key 没导出或写错。检查echo $TAOTOKEN_API_KEY是否有值请求头里Bearer后面有没有多余空格。如果 Key 过期到https://taotoken.net/api-keys重新生成。local proxy failed这个报错通常出现在你本地配了环境变量指向某个代理但代理没起来。检查env | grep -i proxy把http_proxy、https_proxy清掉再试。注意这里说的是本地环境变量残留不是让你去配代理。reading choices 报错Python 里resp.choices[0]报IndexError或NoneType一般是返回体结构不对。先打印resp看原始返回确认model字段写的是有效模型名。如果返回里带error字段说明请求本身失败了。OAuth 相关报错如果你用 Claude Code 或 Codex 这类工具接入报 OAuth 失败检查配置文件里的 Base URL 是否写成了https://taotoken.net/apiKey 是否放在正确字段。以 Codex 的auth.json为例三件套要写全{ base_url: https://taotoken.net/api, api_key: sk-你的key, model: claude-sonnet-4-5 }Base URL、Key、Model ID 缺一不可少一个就会报鉴权或模型不存在。rknn build 报 dataset read failed量化数据集路径问题。确认coco_subset_20.txt里的路径是相对convert.py的且图片真实存在。用ls ./subset/ | head检查。rknn_init fail模型和板子平台不匹配。确认导出时target_platform写的是rk3568不是rk3588。onnxslim 版本报错pip install onnxslim0.1.71升级即可。输出节点数量不匹配优化版和非优化版的输出节点数不同用 rknn_model_zoo 测试时要确认 demo 代码里的后处理跟模型版本对应。6. 从导出到验证把 RK3568 YOLO26 链路跑顺的实用建议整条链路跑下来最耗时间的不是转换本身而是版本对齐和量化数据集准备。给你几个实操建议。第一conda 环境一定要独立。rknn-toolkit2 对 Python 版本和依赖很敏感跟其他工程混用迟早出问题。我习惯给每个 toolkit 版本建一个环境名字带上版本号。第二量化数据集别偷懒。20 张只是下限如果精度掉得厉害加到 100 张以上并且要覆盖你的实际场景。校准图片和推理场景差异太大量化后精度会崩。第三优化版和非优化版都留一份。原始版用来快速验证模型结构优化版用来上板跑性能两个.rknn文件都存好方便对比。第四验证通道用统一 Key。导出日志、报错归因、输出节点确认这些都可以通过https://taotoken.net/api发请求让模型帮你分析省去翻文档的时间。Key 在https://taotoken.net/api-keys管理接入文档在https://taotoken.net/doc。第五交叉编译工具链路径写进 shell 配置。export GCC_COMPILER...每次开终端都要敲写进.bashrc省事。最后一步把编译好的 demo 和模型拷到开发板跑一张测试图看到检测框输出整条链路就算通了。如果卡在某一步先看报错关键词再对照第 5 节的排查表大部分问题都能定位。
延伸阅读

更多相关文章

2026/10/12 22:54:34

C++享元模式实战:从原理到内存优化

如果让我从自己做过的一个项目说起,事情就简单多了。当时我在做一块地图类模块,地图上的地块对象数量大得吓人,每块地都带着坐标、贴图路径、碰撞参数、地形属性等一串字段。对象实例一多,内存直接飙升,优化来优化去都…

2026/10/12 22:49:34

实时手势识别落地实战:OpenCV+Keras轻量CNN低延迟优化方案

简介:这是一套基于Python的实时手势识别系统开源实现,面向计算机视觉初学者与深度学习实践者,解决手势数据采集、模型训练与实时预测的一站式需求。资源包共4991个文件,主体为4984张手势样本JPG图像(用于训练/测试集&a…

2026/10/12 22:49:34

Java进阶:从源码理解List与泛型的核心机制与实战避坑

写这篇的时候,我刚从一场代码走查里出来。某同事把一个方法的入参设计成了 String[] ,然后在方法体里反复 Arrays.asList 、 toArray 来回倒腾,就为了在一个固定长度的数组上做增删操作。我看完没说话,因为我知道这不是他一…

2026/10/12 23:59:41

Keras与sklearn交叉验证协同实战:避坑指南与指标对齐

1. 为什么“交叉验证评价指标”在KerasSklearn组合里总出问题?你有没有遇到过这样的场景:用Keras搭好一个二分类模型,训练时accuracy飙到98%,一跑sklearn的cross_val_score就掉到72%;或者多分类任务里,混淆…

2026/10/12 23:59:40

代码评审工具化实践:分层评审与规则引擎设计指南

1. 为什么“代码评审”这件事值得单独拿出来做一套工具1.1 从一次真实的评审翻车说起前阵子帮一个朋友看他们团队的代码仓库,十几个人协作,主分支上跑着一套还算稳定的服务。聊到代码评审,他给我看了他们的流程:提交合并请求&…

2026/10/12 23:59:40

基于COMSOL相场法的岩石孔隙尺度两相流驱替与扩散模拟

干微观驱替模拟的人都知道,真正影响结果走向的往往不是软件操作本身,而是对物理过程的拆解和对数值稳定性的控制。我最近在COMSOL里做了一件事:从岩石扫描图像中重建出真实的孔隙几何,再模拟两种油相在这个孔隙结构里的扩散与驱替…

2026/10/12 23:59:40

骨头肿瘤X光语义分割数据集:1600张临床级标注图像

简介:本资源是面向医学图像分析初学者与深度学习实践者的X光骨肿瘤语义分割专用数据集,聚焦临床辅助诊断场景,适用于U-Net、SwinUNet、TransUNet等主流分割网络的训练与验证。数据集共约1600张配对图像,已严格划分为训练集&#x…

2026/10/12 23:59:40

Lua模式匹配实战:从字符类到gsub的进阶练习

1. 为什么模式匹配值得单独拎出来练Lua 的模式匹配是我见过最容易“一看就会、一写就废”的语言特性之一。语法就那么几个字符,%a、%d、%s、.-、.*,半小时就能背下来,但真到项目里要从一段日志里抠出时间戳、从配置文本里提取键值对、从 HTML…

2026/10/12 23:54:40

低代码选型关键:拖拽仅是表面,模型、集成与治理决定深度

1. 先说结论:拖拽能力只是入场券,不是胜负手在深入对比了几类低代码开发平台之后,我最想先说的一句话是:判断一个低代码平台值不值得投入,不要先问“拖拽流不流畅”,要看它背后那些看不见的能力。我前后花了…

2026/10/11 0:02:13

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/12 12:01:26

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/12 12:54:07

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑