说明:
步骤1-2在任何可执行的平台(x86,arm等)都ok
步骤3开始在arm上执行
版本:python3.8
rknn-toolkit2 :2.3.0 用于转换rknn模型,2.3.0版本支持了arm
rknn_model_zoo: 2.3.0 用于转换rknn模型
rknn_toolkit_lite2: 1.5.0 用于部署实时推理
1. 下载公开的yolov5模型或训练自己的yolov5模型
1.1 下载公开的yolov5模型
基于开源COCO数据集预训练的模型权重 Pretrained Checkpoints
下载地址: https://github.com/ultralytics/yolov5?tab=readme-ov-file
1.2 训练自己的yolov5模型
参照jetson
2. pt转onnx
2.1 克隆 airockchip从官方yolov5 fork的仓库
git clone https://github.com/airockchip/yolov5.git
**注:**据说拉官方的有问题,没试过
2.2 转onnx
参考仓库中README_rkopt.md,换成要转的yolov5版本权重
python export.py --rknpu --weight yolov5s.pt
如此便得到了一个onnx模型
注:
1.不管用rknn进行单张预测,还是批量预测,此步骤转的时候都不需要改export.py脚本中的batch_size
2.img_size默认是(640,640),rknn推理代码默认也是640,其他size,我也没试过。可以自行测试
3. onnx转rknn
3.1 首先克隆2个仓库,仓库有些大,如果克隆不动,直接下载zip,下载2.3.0版本
git clone https://github.com/airockchip/rknn-toolkit2.git -b v2.3.0
git clone https://github.com/airockchip/rknn_model_zoo.git -b v2.3.0
3.2 安装python依赖
安装包在 ./rknn-toolkit2/rknn-toolkit2/packages 下, 依赖比如torch在内的一些包,最好加上pip源
pip3 install -i https://mirrors.aliyun.com/pypi/simple rknn_toolkit2-2.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
3.3 执行转rknn
cd到执行目录 ./rknn_model_zoo/examples/yolov5/python
对于后续部署实时只要单张预测的,convert.py脚本保持不变,执行
python3 convert.py ../model/yolov5s_relu.onnx rk3588 i8 ../model/yolov5s_relu.rknn
对于后续部署实时要批量预测的,convert.py做如下修改,再执行上述命令
ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)
### 根据需要的batch, 修改为
ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH,rknn_batch_size=4)
执行完,得到一个.rknn模型
3.4 测试转后的rknn模型
执行如下操作,
python3 yolov5.py --model_path ../model/yolov5s_relu.rknn --target rk3588
**注:**因为在arm上执行的,所以如果有啥报错,把yolov5.py中画图相关的代码注释掉即可
4. rknn部署实时推理
2.3.0版本的rknn-toolkit2 已经支持在arm进行推理,不过之前的版本如果要在arm上推理,需要用另外的包:rknn-toolkit-lite2,所以下面还是介绍用rknn-toolkit-lite2部署推理
rknn-toolkit-lite2用1.5.0版本,用匹配的2.3.0版本也是ok的,不过2.3.0版本我没测过
4.1 克隆对应的仓库
之所有用鲁班猫,是因为它最早提供了yolov5的示例,官方的rknn-toolkit-lite2中没给示例。不过后来用完发现不同模型用rknn的推理代码其实差不多,稍微改吧改吧就行
但因为用2.3.0版本的rknn-toolkit2转的rknn模型,所以鲁班猫里的推理代码,也要改动不少(粘贴,复制就行)
git clone https://github.com/LubanCat/lubancat_ai_manual_code.git
4.2 修改鲁班猫里的推理代码(重要)
要修改的推理脚本:lubancat_ai_manual_code/dev_env/rknn_toolkit_lite2/examples/yolov5_inference/test.py
具体修改如下:
#1# 删除test.py中outputs = rknn_lite.inference(inputs=[img]) 之后的代码,即:对outputs后处理的代码
#2# 用步骤3中 rknn_model_zoo/examples/yolov5/python下的yolov5.py中后处理代码(post_process函数操作)替换即可
注: 如果不做此修改,实时推理的结果会有出现很多目标检测结果,原因是没做同目标的对齐。
4.3 单张图片预测
代码不用做其他修改,直接用单张预测转换的rknn模型,执行test.py即可
4.4 批量图片预测
可以参考其他模型的批量示例,用批量预测转换的rknn模型,具体操作如下:
#1# 在outputs = rknn_lite.inference(inputs=[img])之前,加上
img = np.concatenate((img, img, img, img), axis=0) # 4张图片
#2# 对于推理结果的后处理,在进行post_process之前,加上
first_outputs =[outputs[0][0],outputs[1][0],outputs[2][0]] # 第一张图片输出
second_outputs =[outputs[0][1],outputs[1][1],outputs[2][1]] # 第二张图片输出,依次...
#3# 将得到的first_outputs,second_outputs,... 依次进行post_process的后处理,得到各自目标识别结果
**注:**批量的图片输入数量,一定要和rknn_batch_size一样,否则会报错。