在瑞芯微RK3588边缘计算机上部署YOLOv8n目标检测:从模型转换到NPU加速实战
在RK3588边缘计算设备上部署YOLOv8n目标检测:从模型转换到NPU加速实战
摘要:本文详细介绍如何在映翰通EC3000(RK3588平台)边缘计算设备上部署YOLOv8目标检测模型,包括硬件接线、ONNX导出、RKNN模型转换、NPU推理加速全流程,实测FPS提升约2倍。
关键词:YOLOv8、RK3588、NPU加速、边缘计算、RKNN、目标检测
前言
随着边缘AI的快速发展,如何在嵌入式设备上高效运行深度学习模型成为工业物联网领域的热点问题。本文以映翰通EC3000边缘计算机(搭载RK3588芯片)为例,详细介绍YOLOv8n目标检测模型的完整部署流程,从硬件接线到模型推理,帮助读者实现从PyTorch模型到NPU硬件加速的落地应用。
硬件平台:
- 设备:EC3000(RK3588,ARM Cortex-A76/A55,6TOPS NPU)
- 系统:Ubuntu 22.04 LTS aarch64
- 摄像头:UGREEN Camera 4K(USB)
- 显示屏:HDMI接口
一、硬件接线与部署环境
1.1 设备接线图
EC3000外接设备接线如下:
- HDMI1口 → 接显示屏(用于本地可视化)
- USB-1口 → 接摄像头(UGREEN Camera 4K)
- USB-2口 → 接键盘
- USB-3口 → 接鼠标
- ETH2网口 → 接PC(用于调试)
接线示意图:
1.2 环境信息
| 组件 | 版本/说明 |
|---|---|
| OS | Ubuntu 22.04 LTS aarch64 |
| 内核 | 5.10.160 |
| Python | 3.10.12 |
| OpenCV | 4.5.4(已预装) |
| rknn-toolkit-lite2 | 1.5.0(设备端 NPU 推理库,已预装) |
| librknnrt(NPU runtime) | 2.3.2 |
| NPU 驱动 | 0.9.8 |
| onnxruntime | 1.18.1 |
| ultralytics | 8.x |
| 摄像头 | UGREEN Camera 4K,/dev/video0,支持 MJPG 1280×720 @60fps |
二、方案架构
2.1 为什么选用RKNN格式?
| 格式 | 运行位置 | 推理速度 | 适用场景 |
|---|---|---|---|
.pt |
CPU | 慢(~6.7 FPS) | 训练/调试 |
.onnx |
CPU | 中等 | 跨平台部署 |
.rknn |
NPU | 快(~13-16 FPS) | 生产环境(推荐) |
RK3588的NPU可提供硬件级神经网络加速,相比CPU推理速度提升约2倍。
2.2 数据流架构
摄像头(/dev/video0,MJPG 1280×720)
↓ OpenCV VideoCapture
原始帧(BGR,1280×720)
↓ letterbox缩放 + RGB转换
模型输入(RGB,640×640,float32)
↓ RKNNLite.inference()
NPU(RK3588 Core 0)
↓ 输出 [1, 84, 8400]
后处理(置信度过滤 + NMS)
↓
检测结果(框 + 类别 + 置信度)
↓ OpenCV绘制标注
可视化输出 + 结果保存
三、部署步骤
步骤 1:确认NPU可用
SSH登录设备,验证NPU驱动和RKNN runtime正常:
ssh edge@10.5.32.23
# 密码:security@edge
python3 -c "
from rknnlite.api import RKNNLite
rknn = RKNNLite()
rknn.load_rknn('/usr/share/model/RK3588/mobilenet_v1.rknn')
ret = rknn.init_runtime()
print('NPU init ret:', ret) # 0 = 成功
rknn.release()
"
预期输出:
I RKNN: RKNN Runtime Information, librknnrt version: 2.3.2
I RKNN: RKNN Driver Information, version: 0.9.8
NPU init ret: 0
实际输出:
步骤 2:确认摄像头
# 列出V4L2设备
v4l2-ctl --list-devices
# 查询摄像头支持的分辨率
v4l2-ctl -d /dev/video0 --list-formats-ext | head -20
预期看到 /dev/video0 对应 UGREEN Camera 4K,支持 MJPG 格式 1280×720 @60fps。
实际输出:
步骤 3:安装Python依赖(设备端)
# onnxruntime(可选,用于CPU备用推理)
pip3 install onnxruntime==1.18.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
# ultralytics(用于模型格式转换,可选)
pip3 install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
实际输出:

注意:如果网络访问GitHub不通,需配置代理:
export https_proxy=http://<proxy_host>:<port> export http_proxy=http://<proxy_host>:<port>
步骤 4:获取YOLOv8n预训练权重
在有网络访问的机器上下载:
# 下载PyTorch格式权重(6.3 MB)
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt \
-O yolov8n.pt
实际输出:
步骤 5:导出ONNX格式
在有ultralytics的机器上执行(设备端或x86均可):
python3 -c "
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.export(format='onnx', imgsz=640, opset=12, simplify=True, dynamic=False)
# 生成 yolov8n.onnx(约13MB)
"
实际输出:

步骤 6:将ONNX转换为RKNN(在x86机器上执行)
⚠️ 重要:此步骤必须在x86 Linux机器上执行,需安装rknn-toolkit2:
# 在x86机器上安装转换工具
pip3 install rknn-toolkit2 -i https://pypi.tuna.tsinghua.edu.cn/simple
转换脚本convert_yolov8_rknn.py:
from rknn.api import RKNN
ONNX_MODEL = 'yolov8n.onnx'
RKNN_MODEL = 'yolov8n.rknn'
PLATFORM = 'rk3588'
rknn = RKNN(verbose=False)
# 配置:均值0,标准差255(ultralytics默认归一化)
rknn.config(
mean_values=[[0, 0, 0]],
std_values=[[255, 255, 255]],
target_platform=PLATFORM,
)
# 加载ONNX
rknn.load_onnx(
model=ONNX_MODEL,
input_size_list=[[1, 3, 640, 640]],
)
# 编译(不量化,保持float32精度)
rknn.build(do_quantization=False)
# 导出RKNN模型
rknn.export_rknn(RKNN_MODEL)
rknn.release()
print(f'Done: {RKNN_MODEL}')
运行转换:
python3 convert_yolov8_rknn.py
# 生成 yolov8n.rknn(约25MB)
步骤 7:将模型传输到设备
scp yolov8n.rknn edge@<设备IP>:~/yolov8/yolov8n.rknn
步骤 8:上传推理脚本
将detect_yolov8.py传到设备:
scp detect_yolov8.py edge@10.5.32.23:~/yolov8/detect_yolov8.py
实际输出:
步骤 9:运行检测
ssh edge@10.5.32.23
cd ~/yolov8
# 运行50帧检测(默认)
python3 detect_yolov8.py
# 或指定帧数
python3 detect_yolov8.py 100
步骤10:识别结果展示


四、推理脚本说明
4.1 核心配置参数
RKNN_MODEL = '/home/edge/yolov8/yolov8n.rknn' # RKNN模型路径
VIDEO_DEVICE = '/dev/video0' # 摄像头设备
CAP_WIDTH = 1280 # 采集分辨率
CAP_HEIGHT = 720
INPUT_SIZE = 640 # 模型输入尺寸
CONF_THRESH = 0.45 # 置信度阈值
IOU_THRESH = 0.45 # NMS IoU阈值
SAVE_DIR = '/home/edge/yolov8/results' # 结果保存路径
4.2 推理流程
- 初始化RKNN:加载
.rknn模型,绑定NPU Core 0 - 打开摄像头:
/dev/video0,MJPG,1280×720@30fps - 逐帧推理循环:
- letterbox缩放到640×640(保持宽高比,灰边填充)
- BGR → RGB转换
RKNNLite.inference()在NPU上执行- 输出
[1, 84, 8400]:84 = 4(xywh)+ 80(COCO类别分数),8400个候选框 - 过滤低置信度框 → NMS去重 → 还原到原图坐标
- 标注绘制:框 + 类别标签 + 置信度 + FPS叠加
- 结果保存:每10帧保存一张JPEG到
results/ - 控制台输出:每帧打印检测结果
4.3 输出示例(实测)
[INFO] DISPLAY=:1
[INFO] Loading RKNN: /home/edge/yolov8/yolov8n.rknn
[INFO] NPU Core 0 ready
[INFO] Camera: 1280x720 MJPG@30fps
[INFO] Display window created, press Q to quit
Frame 0001 | FPS=8.9 | Objects=10 | person(0.59), laptop(0.59), chair(0.57)...
Frame 0002 | FPS=11.3 | Objects=9 | person(0.64), chair(0.58), laptop(0.37)...
Frame 0009 | FPS=11.6 | Objects=8 | chair(0.65), laptop(0.61), person(0.49)...
→ saved: /home/edge/yolov8/results/frame_00000.jpg
...
[DONE] avg FPS = 14.2
五、性能对比
| 运行方式 | 平均FPS | 单帧耗时 | 说明 |
|---|---|---|---|
| CPU (onnxruntime) | ~6.7 FPS | ~150ms | 仅CPU推理 |
| NPU (RKNN) | ~13-16 FPS | ~70ms | 硬件加速,推荐 |
NPU加速相比CPU提升约2倍性能。
六、常见问题
Q:NPU初始化失败(init_runtime返回非0)?
# 检查NPU驱动状态
dmesg | grep rknpu
Q:FPS过低(<5 FPS)?
- 确认使用的是
.rknn格式模型 - 检查模型转换时
target_platform是否为rk3588
Q:检测结果为空?
- 尝试降低
CONF_THRESH(如0.25) - 检查摄像头画面:
v4l2-ctl --stream-mmap -d /dev/video0 --stream-count=1 --stream-to=/tmp/test.jpg
Q:摄像头打开失败?
# 确认用户权限
id edge | grep video
# 若不在video组,执行:
sudo usermod -a -G video edge
七、总结
本文完整介绍了YOLOv8在RK3588边缘设备上的部署流程,核心要点:
- 硬件接线:HDMI显示 + USB摄像头/键鼠 + 网口调试
- 模型转换路径:PyTorch → ONNX → RKNN(必须在x86上转换)
- 性能提升:NPU加速相比CPU提升约2倍
- 实用技巧:letterbox预处理、NMS后处理、置信度调优
适用场景:工业质检、智能监控、AGV视觉导航等对实时性有要求的边缘AI应用。
参考资源
版权声明:本文为技术分享,转载请注明出处。
标签:#YOLOv8 #RK3588 #边缘计算 #NPU加速 #目标检测 #工业物联网 #映翰通 #EC3000
更多推荐
所有评论(0)