模型部署|将自己训练的yolov8模型在rk3568上部署
RK3568作为瑞芯微推出的高性能处理器,广泛应用于嵌入式系统,具有强大的计算能力和较低的功耗,适合用于运行深度学习任务。将YOLOv8部署在RK3568上,不仅能够提升目标检测的效率,还能充分利用RK3568的硬件加速能力,为开发者提供更高效、更实用的方案。
1 将模型转成onnx
训练的步骤这里就不赘述,之前文章已经提到过,不知道的兄弟们可以看以下文章:
实例分割 | yolov11训练自己的数据集
yolov8和yolov11的训练方法都是相同的。
1.1 明确需要的模型结构
如果直接使用官方给的导出onnx功能,会得到以下结构模型:
输入为1x3x640x640,两个输出output0和output1,而官方给的输出为13个,如下图所示:
想要看原文的可以看这里:官方示例
至于怎么将自己训练的模型转成官网的这种结构,请继续往下看。
1.2 导出onnx模型
git clone https://github.com/airockchip/ultralytics_yolov8.git
cd ultralytics_yolov8
将ultralytics/cfg/default.yaml 中 model 文件路径,改为自己训练模型路径,如下图所示:
在这里修改你训练的模型的绝对路径和训练尺寸,然后输入继续以下命令:
# linux下用export windows下用set
export/set PYTHONPATH=./
python ./ultralytics/engine/exporter.py
如图所示,看打印输出output数量为13个则表示打印成功:
1.3 onnx转rknn
在将ONNX模型转换为RKNN模型之前,需要一台电脑或Ubuntu系统的虚拟机作为开发环境,至于为什么,请看这里:
这里要安装的ubuntu版本和python版本也可以参考一下,这里推荐使用Ubuntu20.04和python3.8。
1.3.1 下载并安装rknn-toolkit2
rknn-toolkit2官网地址
这里一般选择虚拟机x86_64,开发板选arm64:
这里选择下载你对应python版本的rknn-toolkit2和requirments.txt_cpxx,cp版本就是python版本,cp37就是python3.7,下面是安装命令:
# 以python3.8版本为例
pip install -r requirements_cp38-2.3.2.txt
pip install rknn_toolkit2-2.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1.3.2 转换模型到rknn
转化代码:
# convert.py
import sys
from rknn.api import RKNNDATASET_PATH = 'xxx/coco_subset_20.txt'
DEFAULT_RKNN_PATH = 'xxx/yolov8_seg.rknn'
DEFAULT_QUANT = Truedef parse_arg():if len(sys.argv) < 3:print("Usage: python3 {} onnx_model_path [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0]));print(" platform choose from [rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b, rv1109, rv1126, rk1808]")print(" dtype choose from [i8, fp] for [rk3562, rk3566, rk3568, rk3576, rk3588, rv1126b]")print(" dtype choose from [u8, fp] for [rv1109, rv1126, rk1808]")exit(1)model_path = sys.argv[1]platform = sys.argv[2]do_quant = DEFAULT_QUANTif len(sys.argv) > 3:model_type = sys.argv[3]if model_type not in ['i8', 'u8', 'fp']:print("ERROR: Invalid model type: {}".format(model_type))exit(1)elif model_type in ['i8', 'u8']:do_quant = Trueelse:do_quant = Falseif len(sys.argv) > 4:output_path = sys.argv[4]else:output_path = DEFAULT_RKNN_PATHreturn model_path, platform, do_quant, output_pathif __name__ == '__main__':model_path, platform, do_quant, output_path = parse_arg()# Create RKNN objectrknn = RKNN(verbose=False)# Pre-process configprint('--> Config model')rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], target_platform=platform)print('done')# Load modelprint('--> Loading model')ret = rknn.load_onnx(model=model_path)if ret != 0:print('Load model failed!')exit(ret)print('done')# Build modelprint('--> Building model')ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)if ret != 0:print('Build model failed!')exit(ret)print('done')# Export rknn modelprint('--> Export rknn model')ret = rknn.export_rknn(output_path)if ret != 0:print('Export rknn model failed!')exit(ret)print('done')# Releaserknn.release()
这里的DATASET_PATH 是你量化需要加的数据集文件,如果DEFAULT_QUANT =False则不用管
DEFAULT_RKNN_PATH 为你要输出的模型路径及名称。
转化模型命令:
cd python
python convert.py <onnx_model> <TARGET_PLATFORM> <dtype(optional)> <output_rknn_path(optional)># such as:
python convert.py ../model/yolov8s-seg.onnx rk3588
- onnx_model: 指定 ONNX 模型路径。
- TARGET_PLATFORM: 指定 NPU 平台名称。支持平台请参阅此处。
- dtype(optional): 指定为 或 。 用于进行量化,用于不进行量化。默认值为 。i8/u8fpi8/u8fpi8/u8
- output_rknn_path(optional): 指定 RKNN 模型的保存路径,默认保存在与 ONNX 模型相同的目录中,名称为yolov8_seg.rknn
如图所示:
这样算是导出成功,至于warning 不用管。
总结
本文主要记录了如何将自己训练的 .pt 文件模型转换为 RKNN 格式的模型。这个过程涉及从 PyTorch 框架中导出训练好的模型,并通过 RKNN Toolkit 对其进行优化和转化,以便能够在 Rockchip 的硬件平台上进行推理加速。