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 版本不匹配导致format=rknn参数不识别、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 python=3.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.3,torch 用 2.4.0。版本不对会出现format=rknn不被识别的情况:
pip install ultralytics==8.4.3 pip install torch==2.4.0 torchvision==0.19.0导出时还会自动拉onnxslim>=0.1.71,如果网络慢可以提前装:
pip install "onnxslim>=0.1.71"2.4 TaoToken Key 获取与通道配置
到https://taotoken.net/api-keys生成一个 Key,然后在终端里导出环境变量,方便后面用 curl 验证:
export TAOTOKEN_API_KEY="sk-你的key" export TAOTOKEN_BASE_URL="https://taotoken.net/api"如果你用 Python 的 openai 库,配置是这样:
from openai import OpenAI client = OpenAI( api_key="sk-你的key", base_url="https://taotoken.net/api" )这样一套配置,后面验证模型输出、排查导出日志都能复用。环境准备好之后,进入正式的模型转换。
3. 可复制配置:YOLO26 导出 ONNX 与 rknn.config 参数模板
3.1 原始版本直接导出 RKNN
Ultralytics 官方从某个版本开始内置了format=rknn的导出支持,命令很简洁:
yolo export model=yolo26n.pt format=rknn name=rk3568执行后会在当前目录生成yolo26n_rknn_model文件夹,里面是.rknn文件。name参数决定目标平台,可选rk3588, rk3576, rk3566, rk3568, rk3562, rv1103, rv1106, rv1126b等。
这条命令背后其实做了三件事:先导出 ONNX,再调 rknn-toolkit2 转 RKNN,最后打包。优点是省事,缺点是中间过程不透明,量化配置用的是默认值,遇到精度问题不好调。
3.2 优化版本:先导 ONNX 再手动转 RKNN
优化版是参考 Rockchip 官方在 YOLOv11 上的改动做的,主要优化了后处理部分,更适合 RKNPU 推理。流程拆成两步,可控性更强。
第一步,进入优化版源码目录,导出 ONNX:
conda activate rknn-toolkit2-2.3.2 cd ultralytics-8.4.3-rknn-optimized yolo export model=yolo26n.pt format=rknn name=rk3568这一步的name参数其实不影响 ONNX 结构,写rk3568或rv1126b都行,因为只是导出中间格式。导出后你会得到一个yolo26n.onnx。
第二步,写转换脚本。新建convert目录,创建convert.py:
import 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(verbose=False) print('--> Config model') rknn.config( mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform=platform ) print('done') print('--> Loading model') ret = rknn.load_onnx(model=model_path) if ret != 0: print('Load model failed!') exit(ret) print('done') print('--> Building model') ret = rknn.build(do_quantization=do_quant, dataset=DATASET_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 量化。如果想先验证结构、不量化,加fp:
python 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之类的解析报错时,可以快速用模型做归因,不用自己翻文档。
如果你更习惯 Python:
from openai import OpenAI client = OpenAI(api_key="sk-你的key", base_url="https://taotoken.net/api") resp = client.chat.completions.create( model="claude-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 format=rknn一步到位 | 保留原版 | 快速验证 |
| 优化版 | 先 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/api,Key 是否放在正确字段。以 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 "onnxslim>=0.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 节的排查表,大部分问题都能定位。