导出rknn模型
使用官方onnx模型
使用yolov5官方仓库导出模型,该demo创建时yolov5的最新节点sha码为:c5360f6e7009eb4d05f14d1cc9dae0963e949213
在yolov5工程的根目录下模型已经训练好yolov5,如yolov5s.onnx。
python export.py --weights yolov5s.pt --img 640 --batch 1 --opset 12
注:yolov5 工程需要使用 pytorch 1.8.0 或 1.9.0 版本才能最终完成。
使用onnx-simplifier工具优化yolov5的onnx模型,安装和优化命令如下:
如果已安装onnx-simplifier,跳过这句
pip install onnx-simplifier
python -m onnxsim yolov5s.onnx yolov5s.onnx
运行python推理
rknn-toolkit提供了一个转好的yolov5s.onnx,如果从yolov5官网模型重新进入了优化的onnx模型,则目录rknn-toolkit目录,将导出的onnx复制到examples/onnx/yolov5下yolov5s.onnx,再执行命令:
cd examples/onnx/yolov5
python test.py
使用rk预训练模型
官方的yolov5s中包含了Slice层/Swish层/大kernel_size的MaxPooling层,NPU执行效率不高。我们建议开发者使用NPU友好的倒算子替换官网的结构,下面给出两个模型网络结构:
改进结构1
a. 将Focus层改成Conv层
b. 将Swish激活函数改成Relu激活函数
我们的Demo中提供了一个很好的过程版本是训练rknn模型:model/yolov5s-640-640.rknn。的onnx模型convert_rknn_demo/yolov5/onnx_models/yolov5s_rm_transpose.onnx,该模型是预测80类coco数据集的yolov5s改进结构,
转换rknn模型的步骤如下:
cd convert_rknn_demo/yolov5/
python onnx2rknn.py
改进结构2
a. 将Focus层改成Conv层
b. 将Swish激活函数改成Relu激活函数
c. 将大kernel_size的MaxPooling改成3x3 MaxPooling Stack结构
注意事项:
使用rknn-toolkit大于等于1.7.0。
本Demo只支持8位非相关的rknn模型推理。
切换成自己训练的模型时,请关注主播等后处理参数,否则会引发后处理解析错误。
官网和rk训练都是检测80类的目标,如果自己训练后的模型,自行更改include/postprocess.h中的OBJ_CLASS_NUM以及NMS_THRESH,_THRESH后模型处理参数编译。
测试代码导出模型的时间指定节点['378', '439', '500'],分别为原模型的第2、3、4个输出节点的移除三个Reshape的后层(不包含Reshape layer ),输出的形状必须是[1,255,80,80],[1,255,40,40],[1,255,20,20]。对于自己训练的输出模型的顺序和形状的要求必须是[1,? ,80,80],[1,?,40,40],[1,?,20,20],C代码后处理正确处理。
关于加载时间:model目录下均是预编译rknn模型,加载速度比非预编译rknn模型快。convert_rknn_demo目录下的脚本转换生成非预编译rknn模型,如需重新生成预编译rknn模型,请参考rknn-工具包的用户指南。
Aarch64 Linux 演示
编译
可以根据修改平台build.sh中的交叉编译器指定目录的路径GCC_COMPILER,例如修改成
GCC_COMPILER=~/opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf
然后执行:
./build.sh
执行执行文件到板子
将install/rknn_yolov5_demo拷贝到板子的/userdata/目录下。
如果使用rockchip的EVB板子,可以使用adb将文件推到板子上:
adb push install/rknn_yolov5_demo /userdata/
如果使用其他板子,可以使用scp等将install/rknn_yolov5_demo方式拷贝到板子的/userdata/目录
运行
adb shell
cd /userdata/rknn_yolov5_demo/
rk180x
./run_rk180x.sh
rv1109/rv1126
./run_rv1109_rv1126.sh
原作者:rockchip-linux