
1. 自训练 YOLO11 上 RK3588 到底卡在哪从权重到板端推理的完整链路你手里有一份自己标注、自己训练出来的 YOLO11 权重可能是best.pt检测的是螺丝、药片、安全帽或者某种工业零件。现在要把它塞进 RK3588 这块边缘板子里跑实时推理。听起来就是「导出 ONNX再转 RKNN编译 demo拷过去运行」四步但真正动手你会发现每一步都有坑ONNX 的输入维度不对、RKNN 转换报算子不支持、板端跑出来的框全是乱的、类别数对不上导致后处理越界。这篇就按我实际跑通的顺序把 RK3588 部署自训练 YOLO11 检测模型的完整链路拆开讲。核心检索词先摆出来RK3588 部署 YOLO11 自训练模型本质是把 PyTorch 权重经 ONNX 中间格式用 RKNN-Toolkit2 转成 NPU 能吃的.rknn再在板端用 C demo 做推理验证。适合谁看已经训练出 YOLO11 权重、手上有 RK3588 开发板、想跑通自己数据集而不是 COCO 的开发者。整条链路我分成两大段PC 端负责「pt → onnx → rknn」板端负责「编译 demo → 拷贝 → 运行 → 精度对齐」。PC 端建议用 Linux因为rknn-toolkit2在 Windows 上没有官方包硬装会浪费你半天。板端就是 RK3588 的 aarch64 Linux 环境。下面每一步我都给出可复制的命令和配置重点放在「自训练模型和官方 COCO 模型的差异处理」上因为官方 demo 默认 80 类、默认bus.jpg你换成自己的模型必须改这几处否则跑起来必崩。2. TaoToken 前置准备把模型转换和推理脚本的调试成本降下来在正式转模型之前有个容易被忽略的效率问题整个链路里你会反复写转换脚本、后处理脚本、精度对比脚本还要查 RKNN 算子支持列表、YOLO11 的 anchor 配置、量化参数含义。这些查资料和写样板代码的时间往往比转模型本身还长。我的做法是先把一个能对话、能跑代码的模型接口准备好遇到报错直接贴进去问比自己翻文档快很多。这里用 TaoToken 做前置它的 API 地址是https://taotoken.net/api官网在https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content。它提供统一的模型调用入口适合在写转换脚本、排查 RKNN 报错时当辅助工具用。具体怎么接如果你只是想在浏览器里问「RKNN 不支持某个算子怎么办」直接打开模型对话页面就行地址是https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite。如果你打算长期做模型部署、写 Agent 自动跑转换流程可以看 Coding Plan地址https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。需要生成 API Key 的话在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。强调一点TaoToken 在这里的角色是「辅助你写脚本和排错」不是替代 RKNN-Toolkit2也不是替代板端推理。模型转换和板端运行必须用瑞芯微官方的工具链。把 Key 和 Base URL 配好之后你在 PC 端写 Python 转换脚本时遇到不确定的参数可以直接问省去大量试错。配置上如果你用 OpenAI 兼容的客户端Base URL 填https://taotoken.net/apiKey 填你生成的Model ID 按文档里支持的填。这三件套Base URL Key Model ID是接入任何兼容接口的通用写法后面在脚本里调用也一样。3. 可复制配置pt 转 ONNX 与 ONNX 转 RKNN 的完整参数这一节是全文技术核心给出可直接复制的配置和命令。分两步先 pt 转 ONNX再 ONNX 转 RKNN。3.1 用 airockchip 的 ultralytics_yolo11 导出 ONNX官方 ultralytics 导出的 ONNX 在 RKNN 上经常出问题所以要用瑞芯微维护的 forkairockchip/ultralytics_yolo11。克隆下来后关键是改ultralytics/cfg/default.yaml# ultralytics/cfg/default.yaml 关键项 model: /path/to/your/best.pt # 你自训练的权重路径 batch: 1 # 转出的输入维度必须是 [1,3,640,640] imgsz: 640 # 必须和训练时一致没改过就是 640batch一定要改成 1。RK3588 的 NPU 推理默认按单 batch 走如果导出成[4,3,640,640]后面 RKNN 转换和板端 demo 都会对不上。imgsz必须和训练时一致训练时如果用了imgsz640这里就 640如果你训练用了 512这里也写 512但板端 demo 的预处理尺寸也要同步改。改完执行导出cd airockchip/ultralytics_yolo11 python export.py --weights /path/to/your/best.pt --include onnx --opset 12导出后确认 ONNX 的输入输出import onnx model onnx.load(best.onnx) for inp in model.graph.input: print(input:, inp.name, [d.dim_value for d in inp.type.tensor_type.shape.dim]) for out in model.graph.output: print(output:, out.name, [d.dim_value for d in out.type.tensor_type.shape.dim])正常应该看到输入[1,3,640,640]输出是三个尺度的特征图YOLO11 是 anchor-free输出通道数和类别数相关。如果输出维度里类别数不对说明导出时用的权重不是你自训练的检查model路径。3.2 用 rknn_model_zoo 的脚本转 RKNNONNX 转 RKNN 用airockchip/rknn_model_zoo里examples/yolo11的转换脚本。先装rknn-toolkit2注意 Windows 没有这个包必须在 Linux 上装pip install rknn-toolkit2 -i https://pypi.org/simple如果 pip 装不上或者版本不对用本地 wheel。克隆airockchip/rknn-toolkit2进rknn-toolkit2/rknn-toolkit2按你的 Python 版本和架构选 requirements 和 whlpip install -r requirements_cp38.txt pip install rknn_toolkit2-2.x.x-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl装好后进rknn_model_zoo/examples/yolo11/python转换脚本的核心配置如下以convert.py为例参数按你的模型改# 关键参数 ONNX_MODEL best.onnx # 上一步导出的 onnx RKNN_MODEL best.rknn # 输出 TARGET_PLATFORM rk3588 # 目标平台 MEAN_VALUES [[0, 0, 0]] # 和训练时预处理一致 STD_VALUES [[255, 255, 255]] # 归一化方式 QUANTIZED_DTYPE i8 # 量化类型 QUANTIZED_ALGORITHM normal # 量化算法执行转换python convert.py ../model/best.onnx rk3588 i8 best.rknn转换过程中如果报某个算子不支持通常是 YOLO11 里的某些激活或 reshape 在 RKNN 上需要替换。这时候可以把报错贴到前面配好的对话接口里问一般能快速定位到需要改 ONNX 的哪一层。转换成功后你会得到best.rknn这是板端真正要用的文件。注意量化会带来精度损失如果发现板端精度掉得厉害可以先用不量化fp16转一版对比确认是量化问题还是模型本身问题。4. 验证请求与成功结果板端编译 demo 并跑通自训练模型拿到best.rknn后进入板端环节。这一步的目标是编译 C demo把模型和测试图拷到 RK3588运行后拿到带框的输出图。4.1 修改 demo 适配自训练模型官方 demo 默认 80 类 COCO你必须改三处第一标签文件。把coco_80_labels_list.txt换成你自己的标签一行一个类别顺序和训练时data.yaml里的names一致。第二类别数宏定义。改cpp/postprocess.h#define OBJ_CLASS_NUM 3 // 改成你自己的类别数量这个不改后处理会按 80 类解析直接越界或输出乱框。第三测试图片和 CMakeLists。把bus.jpg换成你的测试图或者新增图片同时改cpp/CMakeLists.txt里 install 对应的文件列表确保你的图片和标签会被打包进install目录。4.2 编译并拷贝到板端在 PC 端交叉编译或者直接在板端编译看你环境cd rknn_model_zoo/examples/yolo11 ./build-linux.sh -t rk3588 -a aarch64 -d yolo11编译产物在install/rk3588_linux_aarch64/rknn_yolo11_demo/。拷到板子scp -r install/rk3588_linux_aarch64/rknn_yolo11_demo/ xxx192.168.1.xxx:/home/xxx4.3 板端运行登录 RK3588进 demo 目录export LD_LIBRARY_PATH./lib ./rknn_yolo11_demo model/best.rknn model/your_test.jpg运行成功会输出out.jpg。把它拷回 PC 查看scp xxx192.168.1.xxx:/home/xxx/rknn_yolo11_demo/out.jpg ./打开out.jpg如果框的位置、类别、置信度都正常说明整条链路跑通了。如果框是乱的先检查标签顺序和OBJ_CLASS_NUM如果没框检查输入图片尺寸和预处理如果框位置偏移检查imgsz是否和训练一致。精度对齐的验证动作拿同一张图在 PC 端用 PyTorch 权重跑一遍记录每个框的坐标和置信度再和板端out.jpg对比。允许有小幅偏差量化导致但如果偏差很大回到第 3 步换 fp16 重新转确认是量化问题。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth 对照部署过程中报错集中在几类逐个对照。401 Unauthorized如果你在脚本里调用了辅助接口Key 没填对或者 Base URL 写错会报 401。检查https://taotoken.net/api是否完整Key 是否过期。注意 Base URL 和 Key 要配套Model ID 也要在支持列表里。local proxy failed这个通常出现在你本地配了网络代理但代理没起来或者端口不对。RKNN 转换本身不需要代理如果你在 pip 安装或克隆仓库时遇到检查环境变量http_proxy/https_proxy是否指向了一个不存在的端口。清掉这些变量再试unset http_proxy https_proxyreading choices 相关报错多出现在解析模型输出时后处理按固定类别数读取但实际输出维度不匹配。回到postprocess.h确认OBJ_CLASS_NUM再确认 ONNX 输出通道数是否等于(类别数 5) * 3YOLO11 anchor-free 的常见形式具体以你导出的为准。OAuth 报错如果你用某些客户端接入辅助接口时走 OAuth 流程失败改用 API Key 方式Base URL 填https://taotoken.net/api不要走浏览器授权那套。RKNN 转换报算子不支持把报错里的算子名记下来在 RKNN 文档里查支持列表。常见的是某些激活函数需要替换成 ReLU 或 SiLU 的等价形式。改完 ONNX 重新转。板端运行报 lib 找不到确认export LD_LIBRARY_PATH./lib执行了且lib目录下有librknnrt.so等库文件。如果是从 PC 拷过来的确认拷贝完整。框全乱或类别全错九成是标签顺序或类别数不对。标签文件必须和训练时names顺序完全一致OBJ_CLASS_NUM必须等于类别数。6. 继续深入把部署链路固化成可复用流程跑通一次之后建议把整条链路脚本化。PC 端写一个convert.sh把 pt 转 ONNX、ONNX 转 RKNN 串起来板端写一个run.sh把环境变量、模型路径、测试图参数化。这样下次换模型只改路径和类别数。如果你要长期做 RK3588 上的模型部署和 Agent 自动化Coding Plan 适合把转换、验证、精度对比这些步骤做成可调用的流程地址https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite。需要管理多个 Key 或查看调用情况控制台在https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite。接入细节以文档为准https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite。最后给一个实用技巧每次转完 RKNN先在 PC 端用rknn-toolkit2的仿真推理跑一遍确认模型输出正常再拷到板端。这样能把「模型问题」和「板端环境问题」分开省去反复拷贝的时间。板端 demo 编译一次之后后续换模型只需要替换.rknn和标签文件重新运行即可。