ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

幸狐RV1106开发板部署Yolo8实战:从模型转换到板端推理全流程

2026/9/29 9:49:01 拓冰建站 浏览量
幸狐RV1106开发板部署Yolo8实战:从模型转换到板端推理全流程 1. 幸狐RV1106开发板跑Yolo8到底值不值RV1106这颗芯片在边缘AI圈子里讨论度一直不低尤其是幸狐把开发板价格压到百元级别之后很多做智能视觉、嵌入式AI的朋友都在琢磨这玩意儿到底能不能跑Yolo8跑起来效果怎么样帧率能到多少我前后用了大概三周时间在幸狐RV1106开发板上把Yolo8的部署流程完整走了一遍踩了不少坑也积累了一些实测数据。这篇文章就把整个部署过程、关键参数、性能表现和避坑经验全部摊开来讲给正在评估这个方案的同行一个真实参考。先说结论RV1106跑Yolo8是可行的但需要经过模型转换、量化、编译等一系列步骤不能直接把PyTorch的.pt文件丢上去。整个链路涉及PC端训练、ONNX导出、RKNN工具链转换、板端推理四个阶段。适合有一定嵌入式Linux基础、了解神经网络基本概念的开发者。如果你之前玩过树莓派或者ESP32这类开发板上手会快很多。但如果你完全没有接触过交叉编译和NPU推理建议先把Linux基础命令和Python环境配置搞清楚再动手。RV1106的核心卖点是内置了自研的NPU算力标称0.5TOPS支持INT8量化推理。这个算力放在2024年不算高但跑轻量级的Yolo8n或者Yolo8s模型在合理量化之后还是能用的。幸狐的开发板把RV1106的接口基本都引出来了包括MIPI CSI摄像头接口、以太网、USB、TF卡槽等做视觉项目比较方便。我这次用的是幸狐Luckfox Pico Max版本带256MB DDR3内存板载SPI Flash系统跑的是Buildroot Linux。注意RV1106的NPU只支持INT8推理不支持FP16或FP32。这意味着你的模型必须经过量化才能跑量化过程中的精度损失是必须面对的问题。2. 开发板基础环境搭建与系统烧录2.1 幸狐RV1106开发板的硬件准备拿到板子之后先别急着上电。幸狐的RV1106开发板有几个版本我手上这块是Luckfox Pico Max核心配置是RV1106G3芯片、256MB DDR3、128MB SPI NAND Flash。板子很小大概比一张名片还小一圈接口倒是挺全一个百兆以太网口、一个USB Type-C供电调试、一个TF卡槽、一个MIPI CSI摄像头接口、还有几组排针引出的GPIO和UART。你需要准备的配件清单幸狐RV1106开发板一块USB Type-C数据线一根要能传数据的有些充电线只能供电TF卡一张建议16GB以上Class10MIPI CSI摄像头一个幸狐官方店有配套的SC3336传感器模组网线一根用于有线网络连接如果要做串口调试还需要一个USB转TTL模块我一开始图省事用了一根手机充电线结果电脑死活识别不到设备。换了一根带数据传输的线之后立马就好了。这个坑很常见建议直接拿手机原装数据线试。2.2 系统镜像烧录的两种方式幸狐官方提供了两种烧录方式一种是通过瑞芯微的SocToolKit工具在Windows下烧录另一种是通过TF卡启动。我推荐新手先用TF卡方式因为不会破坏板载Flash里的出厂系统万一搞砸了还能恢复。TF卡烧录的步骤从幸狐的GitHub仓库或者官方论坛下载最新的Buildroot镜像文件通常是一个.img格式的压缩包用balenaEtcher或者Rufus把镜像写入TF卡插入TF卡按住板子上的BOOT按键再上电等待系统从TF卡启动用网线连接板子和电脑或者通过USB串口登录终端如果你要用SocToolKit烧录到SPI Flash需要先把板子进入MaskROM模式。具体操作是断开电源按住BOOT键插入USB线然后松开BOOT键。这时候SocToolKit应该能识别到设备。然后加载对应的分区表和镜像文件点击升级即可。实操心得烧录之前一定要确认镜像版本和板子型号匹配。我有一次拿Luckfox Pico的镜像烧到Pico Max上结果网卡驱动不对死活连不上网。后来换了对应版本的镜像才正常。2.3 网络配置与SSH连接系统启动之后默认的IP地址通常是192.168.1.100或者通过DHCP自动获取。如果你用网线直连电脑需要手动给电脑网卡配一个同网段的IP比如192.168.1.10子网掩码255.255.255.0。然后通过SSH登录ssh root192.168.1.100默认密码一般是root或者空密码具体看镜像说明。登录进去之后先用ifconfig确认网络状态再用ping www.baidu.com测试外网连通性。如果ping不通检查一下路由器的DHCP设置或者手动配置网关。串口调试的话波特率是1500000这个比较特殊很多USB转TTL模块默认不支持这么高的波特率。我用的是CH340G芯片的模块在Windows下用MobaXterm可以设置1500000的波特率Linux下用minicom需要手动改配置。3. Yolo8模型训练与ONNX导出3.1 PC端训练环境的搭建Yolo8的训练我是在Ubuntu 22.04上做的显卡是RTX 3060 12GB。如果你没有独立显卡也可以用Google Colab或者AutoDL租GPU成本大概几块钱一小时。训练环境的核心依赖pip install ultralytics pip install onnx onnxsim onnxruntime pip install torch torchvisionUltralytics的Yolo8安装非常简单pip一行命令搞定。但要注意版本兼容性我用的ultralytics是8.0.145版本torch是2.0.1cu118。版本不匹配的话导出ONNX的时候容易报错。数据集方面我用的是一个自定义的工业零件缺陷检测数据集大概3000张图片分5个类别。如果你只是做验证可以直接用COCO数据集的一个子集或者自己拍几十张照片标注一下。标注工具推荐LabelImg或者Roboflow后者可以在线标注还能直接导出Yolo格式。训练命令yolo detect train datadataset.yaml modelyolov8n.pt epochs100 imgsz640 batch16这里选yolov8n是因为RV1106的算力有限nano版本参数量最少量化后的精度损失也相对可控。如果你用yolov8s或者m量化后精度掉得会比较厉害而且推理速度也会明显下降。3.2 模型导出为ONNX格式的关键参数训练完成之后需要把.pt文件导出为ONNX。这一步有几个关键参数直接影响后续RKNN转换的成功率yolo export modelbest.pt formatonnx imgsz640 opset12 simplifyTrueimgsz640输入分辨率要和训练时保持一致opset12ONNX算子集版本RKNN工具链对opset 12支持最好太高或太低都可能出问题simplifyTrue启用ONNX Simplifier去掉冗余算子减小模型体积导出之后用Netron打开ONNX文件检查一下输入输出节点。输入应该是imagesshape是[1,3,640,640]输出通常是三个分支对应不同尺度的特征图。如果输出节点名字乱七八糟后面RKNN转换的时候需要手动指定。注意Yolo8的ONNX导出默认包含后处理吗不包含。RKNN转换的时候需要把后处理也加进去或者自己在板端用C实现。我建议在RKNN转换阶段就把后处理融合进去这样板端代码简单很多。3.3 ONNX模型的简化与验证导出ONNX之后强烈建议用onnxsim再做一次简化onnxsim best.onnx best_sim.onnx然后用onnxruntime跑一下推理确认模型输出正常import onnxruntime as ort import numpy as np sess ort.InferenceSession(best_sim.onnx) input_name sess.get_inputs()[0].name dummy np.random.randn(1, 3, 640, 640).astype(np.float32) outputs sess.run(None, {input_name: dummy}) print([o.shape for o in outputs])如果这一步就报错那后面RKNN转换肯定过不了。常见问题包括算子不支持、shape不匹配、数据类型不对。ONNX Simplifier能解决大部分算子兼容性问题但有些自定义算子还是得手动改。4. RKNN工具链转换与量化实战4.1 RKNN-Toolkit2的安装与版本选择瑞芯微的RKNN工具链有多个版本RV1106需要用RKNN-Toolkit2不是老版本的RKNN-Toolkit。这两个版本API不兼容装错了会各种报错。我用的版本是rknn-toolkit2-1.5.2配套的板端runtime是librknnmrt.so。安装方式推荐用conda创建独立环境conda create -n rknn python3.8 conda activate rknn pip install rknn-toolkit2-1.5.2-cp38-cp38-linux_x86_64.whl注意Python版本必须是3.6到3.8之间3.9以上会有兼容性问题。这个坑我踩过用Python 3.10装完之后import rknn直接报错换回3.8就好了。4.2 模型转换脚本的编写与参数详解RKNN转换的核心是一个Python脚本主要步骤包括加载ONNX、配置量化参数、构建RKNN模型、导出RKNN文件。from rknn.api import RKNN rknn RKNN(verboseTrue) # 配置模型预处理参数 rknn.config( mean_values[[0, 0, 0]], std_values[[255, 255, 255]], target_platformrv1106, quantized_dtypeasymmetric_quantized-8, optimization_level3 ) # 加载ONNX模型 ret rknn.load_onnx(modelbest_sim.onnx) if ret ! 0: print(Load ONNX failed) exit(ret) # 构建RKNN模型指定量化数据集 ret rknn.build(do_quantizationTrue, datasetquant_dataset.txt) if ret ! 0: print(Build RKNN failed) exit(ret) # 导出RKNN文件 ret rknn.export_rknn(best.rknn) if ret ! 0: print(Export RKNN failed) exit(ret)关键参数说明mean_values和std_values归一化参数。Yolo8训练时通常把像素值归一化到0-1所以mean0std255。如果你训练时用了不同的归一化方式这里要对应修改。target_platformrv1106指定目标平台这个必须写对否则生成的RKNN文件在板子上跑不起来。quantized_dtypeasymmetric_quantized-8非对称INT8量化这是RV1106 NPU支持的模式。optimization_level3优化等级3是最高会做一些算子融合和内存优化。dataset量化校准数据集需要一个txt文件每行是一张图片的路径。建议放100到200张训练集里的图片覆盖各种场景。4.3 量化数据集准备与精度调优量化数据集的准备经常被忽视但它直接影响量化后的精度。我的经验是从训练集里随机抽100到200张图片不要只抽某一类的图片分辨率要和推理时一致都是640x640如果训练时做了数据增强量化集里也要包含增强后的样本量化集txt文件的路径要写绝对路径相对路径容易找不到精度调优方面如果量化后发现mAP掉得厉害可以尝试增加量化集数量到300张以上调整optimization_level为2减少激进优化在ONNX导出时去掉一些不必要的算子考虑用混合量化对敏感层保持FP16但RV1106不支持FP16所以这条不适用我实测下来yolov8n在COCO子集上原始mAP50大概是0.52INT8量化后掉到0.47左右损失大概10%。这个精度损失在工业缺陷检测场景下是可以接受的但如果你的任务对精度要求极高可能需要考虑更高算力的芯片。实操心得RKNN转换过程中如果报Unsupported OP错误先用Netron看一下是哪个算子。常见的unsupported算子包括Resize、Transpose、Slice等。解决办法是在ONNX导出时用simplifyTrue或者手动修改模型结构把这些算子替换掉。5. 板端推理部署与性能实测5.1 RKNN Runtime的交叉编译板端推理需要用到RKNN Runtime的C API。幸狐的SDK里已经包含了librknnmrt.so但头文件和示例代码需要从瑞芯微的GitHub仓库下载。交叉编译工具链用的是arm-rockchip830-linux-uclibcgnueabihf幸狐的SDK里有。编译命令大概是这样arm-rockchip830-linux-uclibcgnueabihf-gcc main.c -o yolov8_demo -I./include -L./lib -lrknnmrt -lpthread -lstdc编译的时候注意链接顺序-lrknnmrt要放在源文件后面否则会报undefined reference。这个坑很经典GCC的链接顺序是从右到左解析依赖。5.2 推理代码的核心逻辑与后处理板端推理代码的核心流程初始化RKNN上下文加载.rknn模型文件读取摄像头或图片数据做预处理resize、归一化调用rknn_run执行推理获取输出做后处理解码边界框、NMS绘制结果或输出坐标后处理是Yolo8部署里最麻烦的部分。Yolo8的输出是三个特征图每个特征图的shape是[1, 64, 80, 80]、[1, 64, 40, 40]、[1, 64, 20, 20]以640输入为例。64是通道数等于4个边界框坐标加上80个类别分数COCO是80类。如果你的类别数不是80通道数要对应调整。解码逻辑for (int i 0; i 3; i) { int grid_h output_shapes[i][2]; int grid_w output_shapes[i][3]; for (int h 0; h grid_h; h) { for (int w 0; w grid_w; w) { // 读取64个通道的数据 // 前4个是box坐标后面是类别分数 // 找到最大类别分数如果超过阈值就保留 } } }NMS部分可以用C实现也可以调用OpenCV的NMSBoxes。但RV1106上跑OpenCV比较重建议自己写一个简单的NMS。5.3 实测帧率与资源占用分析我用yolov8n模型输入640x640在RV1106上实测的推理帧率大概是8到12 FPS。这个数据是在CPU跑后处理的情况下测的如果后处理也用NPU加速理论上能到15 FPS左右。资源占用方面NPU占用率推理时大概60%到80%CPU占用率单核跑后处理大概40%内存占用模型加载后大概占用30MB左右如果换成yolov8s帧率会掉到5 FPS左右而且量化后精度损失更大。所以RV1106上强烈建议用yolov8n。摄像头实时推理的话SC3336传感器的分辨率是2304x1296需要先缩放到640x640再送进NPU。缩放可以用RGA硬件加速比CPU软缩放快很多。幸狐的SDK里有RGA的示例代码可以直接参考。注意RV1106的NPU和CPU共享内存带宽如果同时跑摄像头采集、缩放、推理、显示带宽会成为瓶颈。建议用多线程流水线采集和推理分开中间用环形缓冲区传递数据。6. 常见问题排查与避坑指南6.1 模型转换阶段的典型报错报错信息原因解决方法Unsupported OP: ResizeONNX里有NPU不支持的Resize算子用onnxsim简化或修改模型结构Quantize dataset not found量化集路径不对检查txt文件路径用绝对路径Build RKNN failed: shape mismatch输入shape和模型不匹配确认ONNX输入是[1,3,640,640]Export RKNN failed: target not supportedtarget_platform写错改成rv11066.2 板端运行时的常见异常板端跑推理的时候最常见的问题是段错误Segmentation fault。原因通常是模型文件路径不对rknn_init返回失败但没检查输入数据格式不对比如用了float32但模型需要uint8输出buffer大小分配不够排查方法在每一步之后打印返回值确认ret0再继续。RKNN的API返回值都是int0表示成功负数表示失败。不要偷懒不检查返回值否则出了问题很难定位。另一个常见问题是内存不足。RV1106只有256MB DDR3系统本身占掉一部分留给应用的可能只有100MB左右。如果模型太大或者同时开多个线程容易OOM。解决办法是优化内存使用及时释放不用的buffer或者换更大内存的版本。6.3 精度与速度的平衡技巧如果你发现量化后精度掉太多可以试试这些技巧量化集里加入一些困难样本让校准过程更有代表性调整optimization_level从3降到2或1在训练时加入量化感知训练QAT让模型提前适应量化误差对分类头保持更高精度只对backbone做INT8量化速度优化方面用RGA做图像缩放不要用CPU后处理用C写不要用Python多线程流水线采集、推理、后处理并行降低输入分辨率到416x416帧率能提升一倍但精度会掉一些我个人在实际操作中的体会是RV1106这个平台适合做低功耗、低成本的边缘视觉方案但不能指望它跑大模型。yolov8n是甜点yolov8s是上限再大就不合适了。如果你需要更高精度建议考虑RV1126或者RK3588。另外幸狐的社区文档虽然不算特别完善但GitHub上的示例代码质量还可以遇到问题先去issues里搜一下大概率有人已经踩过同样的坑了。