说明
pytorch 训练出来的是pt权重,需要转成在瑞芯微板子上跑的rknn模型,但在Linux上无法运行rknn模型。
为了能够验证rknn的效果,而不用发版到嵌入式侧,所以需要:
模型转换 pt–》onnx-》rknn
在Linux上运行rknn,刚才说的在linux上无法运行rknn模型,但可以linux 通过usb插入瑞芯微的芯片,前后处理都在linux上,而推理在rknn上
所需仓库:
https://github.com/airockchip/yolov5/tree/master 模型转换使用
rknn-toolkit2-1.5.2
rknpu2
rknn_model_zoo
模型转换
# 切换conda env
# conda init
# conda activate rknn1
# python 路径 /home/justin/miniconda3/envs/rknn1/bin/python
# todo 把.pt 路径 --data 路径 改成传参的路径,并能改名
yolov5_path="/home/justin/Desktop/code/python_project/export/yolov5-master"
# exp_name="exp19" 一类的新模型
exp_name="exp11"
height=544
width=960
weight_path="/home/justin/Desktop/code/python_project/yolov5/runs/train/$exp_name/weights/best.pt"
data_path="/home/justin/Desktop/code/python_project/Jersey-Number/handball/data.yaml"
onnx_path="/home/justin/Desktop/code/python_project/yolov5/runs/train/$exp_name/weights/best.onnx"
rknn_path="/home/justin/Desktop/code/python_project/yolov5/runs/train/$exp_name/weights/best-640X640.rknn"cd $yolov5_path
/home/justin/miniconda3/envs/rknn1/bin/python export.py --rknpu --weight $weight_path --imgsz $height $width --data $data_path
rknn_toolkit_path="/home/justin/Desktop/code/python_project/export/rknn-toolkit2-1.5.2/examples/onnx/yolov5"
cd $rknn_toolkit_path
/home/justin/miniconda3/envs/rknn1/bin/python export_from_yh.py $onnx_path rv1106 i8 $rknn_path# cp /home/justin/Desktop/code/python_project/yolov5/runs/train/exp16/weights/best.rknn /home/data_for_ai_justin3/justin/handball/20241112-yh/handball/
# cp /home/justin/Desktop/code/python_project/Jersey-Number/handball/data.yaml /home/data_for_ai_justin3/justin/handball/20241112-yh/handball/# 下面是在windows 下的shell脚本
# adb push \\192.168.112.5\ai_justin3\justin\handball\20241112-yh\handball\best.rknn /userdata/
# adb push \\192.168.112.5\ai_justin3\justin\handball\20241112-yh\handball\label.txt /userdata/
@todo 这里后面会全部改成传入参数的方式
到这里就完成了模型转换
搭建板子上的环境
https://github.com/rockchip-linux/rknpu2/blob/master/rknn_server_proxy.md
安装这个指引,该干嘛干嘛,主要是这几步骤。
RV1106启动步骤
RV1103/RV1106上使用的RKNPU Runtime库是librknnmrt.so,使用32-bit的rknn_server,启动步骤如下:
adb push RV1106/Linux/rknn_server/arm/usr/bin下的所有文件到/oem/usr/bin目录
adb push RV1106/Linux/librknn_api/armhf/librknnmrt.so到/oem/usr/lib目录
进入板子的串口终端,执行:
chmod +x /oem/usr/bin/rknn_server
chmod +x /oem/usr/bin/start_rknn.sh
chmod +x /oem/usr/bin/restart_rknn.sh
restart_rknn.sh
RV1106使用串口查看rknn_server详细日志
进入串口终端,设置日志等级
export RKNN_SERVER_LOGLEVEL=5
重启rknn_server进程
restart_rknn.sh
再次使用python接口连板推理
它先转成了 onnx,又转成了 rknn
然后进入 rknn_model_zoo\examples\yolov5\pythpn\yolov5.py
python yolov5.py --model_path /home/justin/Desktop/code/python_project/yolov5/runs/train/exp11/weights/best-640X640.rknn --target rv1106 --device_id 9376f2d578f8bd36 --img_save --img_save_dir /home/data_for_ai_justin3/justin/handball/exp11 --img_folder /home/data_for_ai_justin3/justin/handball/20241114 --obj_thresh 0.35 --sample_ratio 0.1 --perf_debug --eval_mem
我有加了几个参数,大概就是这么一个意思。
然后还需要加的参数是, classes label文件 和 classes_id 文件,来回改文件的代码太麻烦了,不如直接给目录方便。
同时,其实也需要,obj_thresh 也用类的方式分开调参,否则太硬了,不灵活、