RK3588 模型转换+Deepsort 移植
完成pt模型的训练后,现在需要修改生成的pt 模型,让它适应rknn的框架:
1. onnxsim - 让导出的模型具有中间节点的信息:
显然,如果直接用
python export.py
我们也可以得到一个onnx 模型,但是这个模型是较为复杂的,而且它没有中间节点的输入输出信息,加入我们需要获得中间的节点的shape信息,我们只能自己手动去设置,但是onnxsim 解决了这个问题:
1. 安装onnx-simplifier 包
pip install onnx-simplifier
2.加载onnx文件,simplify处理后重新保存:
from onnxsim import simplify
onnx_model = onnx.load("source_onnx_dir") # load onnx model
model_simp, check = simplify(onnx_model)
assert check, "Simplified ONNX model could not be validated"
onnx.save(model_simp, "target_onnx_dir")
print('finished exporting onnx')
3. 利用netron查看导出的onnx
打开netron
导入模型:
这样中间节点的输出也同样被标识出来了,方便我们进行后续的修改
2. 修改onnx模型
1. 查看官方文档
官方的教程是在export 的时候就把 detect 层的forward函数修改掉,但其实他的用意就是修改原model 的detecet层,将detect层完全删掉,因为rknn需要三个输入,还要将模型输出修改为三个。
2. 查看onnx模型
根据查看模型,我们只需要删除最后一个conv层后面的reshape,transpose层,并将输出修改为三个就可以了:
3. 加载模型
具体操作就是遍历模型中的节点,首先确定最后一个卷积层的位置,然后重置这个卷积层的shape为 三个输出
代码后续看情况开源
成功将模型输出改为1x33x20x20,1x33x40x40,1x33x80x80。
保存模型"yolo.onnx"
至此,我们就成功完成了pt–>onnx 的转换。
下载官方的npu
cd /home/ptay/rknpu2-master/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5
在onnx下放入修改好的onnx 模型
打开 onnx2rknn.py
修改:
platform = 'rk3588'
MODEL_PATH = './onnx_models/yolo.onnx'
python onnx2rknn.py
结束!
源代码具体后续我考虑是否开源
deepsort 部署请看后续!