香橙派5Pro实战:YOLOv8模型部署方案深度评测与选型指南
最近在折腾边缘计算项目,手头正好有一块香橙派5Pro,这颗RK3588芯片内置的NPU(神经网络处理单元)一直让我很感兴趣。市面上关于模型部署的方案很多,尤其是YOLO这类目标检测模型,到底是用原生的RKNN格式直接调用NPU,还是走更通用的ONNX Runtime路线?网上教程不少,但真正把两种方案放在同一硬件上,用同一模型、同一测试脚本进行量化对比的深度分析并不多见。
这篇文章就是一次彻底的实测记录。我会基于YOLOv8模型,在香橙派5Pro上分别部署RKNN和ONNX两种格式,从环境搭建、模型转换、推理脚本编写,到最终的帧率(FPS)、内存占用、CPU负载等核心指标进行全方位对比。目标很明确:不是为了复现某个教程,而是通过真实数据,帮你理清在不同应用场景(比如高实时性视频流分析 vs. 对功耗敏感的低频图片检测)下,究竟该选择哪种部署方案。无论你是正在做技术选型的嵌入式开发者,还是对边缘AI落地感兴趣的研究者,相信这些一手测试结果和背后的原理分析都能给你带来直接参考。
1. 测试环境搭建与模型准备
工欲善其事,必先利其器。确保测试的公平性是第一要务,这意味着我们需要一个干净、一致的基线环境。
我使用的硬件是香橙派5Pro 8GB版本,其核心是Rockchip RK3588 SoC。这颗芯片的亮点在于其内置的6TOPS算力NPU,支持INT8/INT16量化。软件方面,我选择了官方推荐的Debian 11 (Bullseye) 镜像,内核版本5.10。为了避免系统后台服务对性能测试造成干扰,我关闭了图形桌面,全程通过SSH在纯命令行环境下操作。
关键依赖安装清单:
- Python环境: 使用Miniconda创建独立的Python 3.9环境,避免与系统包冲突。
- 推理框架:
- RKNN Toolkit Lite2: 版本1.6.0,这是Rockchip官方提供的用于在设备端加载和运行RKNN模型的轻量级库。
- ONNX Runtime: 版本1.16.3,特别注意需要安装为ARM架构优化的版本(
onnxruntime-linux-aarch64),而不是通用的onnxruntime包。
- 计算机视觉库: OpenCV 4.8.0,用于图像读取、预处理和结果可视化。
注意:安装
onnxruntime时,务必通过pip install onnxruntime-linux-aarch64命令。直接安装onnxruntime会默认下载x86版本,在ARM设备上无法运行。
模型方面,我选用YOLOv8n(纳米尺度)作为测试对象。它体积小、速度快,是边缘设备的常见选择。我们从Ultralytics官方仓库获得预训练的PyTorch模型(.pt文件)。为了对比,我们需要从这个源模型衍生出两个格式:
- RKNN模型: 通过RKNN Toolkit2转换工具生成,后续将直接由NPU驱动。
- ONNX模型: 同样从
.pt导出,但将在CPU上通过ONNX Runtime执行。
转换过程的代码核心如下,我将其封装成了一个可配置的脚本:
# convert_yolo_to_onnx_and_rknn.py
import argparse
from pathlib import Path
from ultralytics import YOLO
from rknn.api import RKNN # 注意:这部分在x86转换机上运行
def main():
parser = argparse.ArgumentParser(description='Convert YOLOv8 .pt to ONNX and RKNN.')
parser.add_argument('--model-pt', type=str, required=True, help='Path to source .pt file')
parser.add_argument('--output-dir', type=str, default='./converted_models', help='Output directory')
args = parser.parse_args()
output_dir = Path(args.output_dir)
output_dir.mkdir(parents=True, exist_ok=True)
model_stem = Path(args.model_pt).stem
# 步骤1: 导出ONNX
print("[1/2] Exporting to ONNX...")
model = YOLO(args.model_pt)
onnx_path = output_dir / f"{model_stem}.onnx"
model.export(format="onnx", imgsz=640, opset=12, simplify=True, dynamic=False)
print(f" ONNX model saved to: {onnx_path}")
# 步骤2: 转换ONNX到RKNN (此步骤通常在x86开发机进行)
print("[2/2] Converting ONNX to RKNN...")
rknn = RKNN()
rknn.config(target_platform='rk3588', quantize_input_node=True) # 启用输入节点量化
ret = rknn.load_onnx(model=onnx_path)
if ret != 0:
print('Load ONNX failed!')
return
# 构建模型,此处使用少量校准图片进行量化,能提升NPU性能
ret = rknn.build(do_quantization=True, dataset='./calibration_dataset.txt')
if ret != 0:
print('Build RKNN failed!')
return
rknn_path = output_dir / f"{model_stem}_quant.rknn"
ret = rknn.export_rknn(export_path=rknn_path)
if ret != 0:
print('Export RKNN failed!')
return
rknn.release()
print(f" RKNN model saved to: {rknn_path}")
print("\nConversion completed!")
if __nam
916



被折叠的 条评论
为什么被折叠?



