在边缘计算设备上部署目标检测模型一直是工业界的热门需求。RDK X5作为一款高性能边缘计算盒子,搭载了强大的AI加速芯片,非常适合运行YOLO这类轻量级目标检测模型。但实际部署过程中,从模型训练到最终落地,会遇到各种意想不到的"坑"。
我最近完成了一个在RDK X5上部署自定义YOLOv5模型的项目,整个过程耗时两周,踩遍了几乎所有可能的坑。本文将详细记录从数据准备、模型训练、模型转换到最终部署的全流程,特别是那些官方文档没有提及的细节问题。
RDK X5开发套件包含以下核心组件:
在开始之前,需要在开发主机(建议使用Ubuntu 18.04/20.04)上安装以下工具:
bash复制# 安装基础工具
sudo apt update && sudo apt install -y git curl wget unzip python3-pip
# 安装PyTorch(建议使用1.8.0版本)
pip3 install torch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0
# 克隆YOLOv5官方仓库
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip3 install -r requirements.txt
# 安装RKNN-Toolkit2(用于模型转换)
wget https://rknn-toolkit2.rock-chips.com/download/rknn-toolkit2-1.4.0-cp36-cp36m-linux_x86_64.whl
pip3 install rknn-toolkit2-1.4.0-cp36-cp36m-linux_x86_64.whl
注意:RKNN-Toolkit2必须与RDK X5的NPU驱动版本匹配。当前最新稳定版本是1.4.0,使用其他版本可能导致转换失败。
code复制custom_dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
yaml复制# dataset.yaml
train: ../custom_dataset/images/train
val: ../custom_dataset/images/val
nc: 3 # 类别数
names: ['person', 'car', 'dog'] # 类别名称
使用YOLOv5s(小型模型)作为基础:
bash复制python3 train.py --img 640 --batch 16 --epochs 100 --data dataset.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name custom_model
关键参数说明:
--img 640: 输入图像尺寸(RDK X5建议使用640x640)--batch 16: 根据GPU显存调整(11GB显存可设16-32)--epochs 100: 通常50-100个epoch足够训练完成后,在runs/train/custom_model/weights/目录下会得到best.pt和last.pt两个模型文件。
实操心得:如果数据集类别不平衡,可以添加--weights参数使用预训练权重,并调整--hyp参数中的分类损失权重。
bash复制python3 export.py --weights runs/train/custom_model/weights/best.pt --img 640 --batch 1 --include onnx --simplify
关键点:
--batch 1,因为RKNN目前只支持固定batch推理--simplify会优化ONNX模型结构,减少转换出错概率创建convert.py脚本:
python复制from rknn.api import RKNN
rknn = RKNN()
rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform='rk3588')
# 加载ONNX模型
ret = rknn.load_onnx(model='yolov5s_custom.onnx')
if ret != 0:
print('Load ONNX model failed!')
exit(ret)
# 量化配置
ret = rknn.build(do_quantization=True, dataset='./dataset.txt')
if ret != 0:
print('Build model failed!')
exit(ret)
# 导出RKNN模型
ret = rknn.export_rknn('./yolov5s_custom.rknn')
if ret != 0:
print('Export RKNN model failed!')
exit(ret)
踩坑记录:量化时需要提供dataset.txt,包含约100-200张校准图片的路径。我们最初只用了10张,导致量化精度大幅下降。
在RDK X5上安装必要的运行库:
bash复制sudo apt update
sudo apt install -y python3-opencv libopenblas-dev libgomp1
将转换好的RKNN模型和推理脚本拷贝到设备上。
创建inference.py:
python复制import numpy as np
import cv2
from rknnlite.api import RKNNLite
# 初始化RKNN
rknn = RKNNLite()
ret = rknn.load_rknn('yolov5s_custom.rknn')
ret = rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0)
def preprocess(image):
# 与训练时相同的预处理
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (640, 640))
image = image.astype(np.float32) / 255.0
return image
def inference(image):
inputs = preprocess(image)
outputs = rknn.inference(inputs=[inputs])
return postprocess(outputs)
# 后处理代码(根据YOLOv5输出格式调整)
def postprocess(outputs):
# 实现解码、NMS等操作
...
NPU核心绑定:RDK X5有3个NPU核心,可以通过core_mask参数指定:
python复制rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0_1_2) # 使用全部三个核心
输入输出固定:在模型转换时添加--outputs output1,output2明确指定输出节点,避免自动解析出错。
内存优化:对于长时间运行的推理服务,定期调用rknn.release()释放内存。
问题现象:RKNN-Toolkit转换时出现"Unsupported op type: xxx"
解决方案:
--opset 12参数--no-onnxsim问题现象:检测框位置或类别完全错误
排查步骤:
问题现象:帧率低于预期
优化方法:
rknn.eval_perf()分析各层耗时在我们的实际项目中,使用YOLOv5s模型(640x640输入)获得了以下性能:
| 量化类型 | 推理时间(ms) | mAP@0.5 | 内存占用(MB) |
|---|---|---|---|
| FP16 | 15.2 | 0.78 | 420 |
| INT8 | 10.8 | 0.74 | 380 |
在RDK X5上,INT8量化模型可以实现约90FPS的实时检测性能,完全满足工业场景需求。
多模型切换:利用RKNN的load_rknn和release方法,可以在运行时动态切换不同模型。
视频流处理优化:使用多线程实现采集-推理-显示流水线:
python复制import threading
class VideoProcessor:
def __init__(self):
self.frame = None
self.lock = threading.Lock()
def capture_thread(self):
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
with self.lock:
self.frame = frame
def inference_thread(self):
while True:
with self.lock:
if self.frame is not None:
results = inference(self.frame)
display_results(results)
温度监控:长时间运行需要监控NPU温度:
bash复制cat /sys/class/thermal/thermal_zone*/temp
经过两周的反复调试,我们的自定义检测模型在RDK X5上实现了稳定运行。最大的经验是:量化阶段的质量决定了最终部署的成败,务必使用具有代表性的校准数据集,并在转换后立即验证模型精度。