-
默认支持commit_id 为 c9a46a6,目前优化已经适配 v5, v6 结构
在该 README.md 文件所在目录下执行以下指令,
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
git checkout c9a46a60e09ab94009754ca71bde23e91aab33fe
(git switch -c c9a46a60e09ab94009754ca71bde23e91aab33fe 修改成)
git apply ../patchs/rknpu_optimize.patch
#对于rknpu设备,我们推荐打上下面的patch,将silu激活层替换成relu,以获得更佳的推理性能。请注意替换后权重需要重新训练!
git apply ../patchs/silu_to_relu.patch
请参考官方仓库文档训练即可
COCO 数据集下载地址: https://cocodataset.org/#download
注意:
- 使用Silu激活函数训练的模型,与使用ReLU激活函数训练的模型,两者的权重是不一样的,不可以混淆使用!官方权重是使用Silu进行训练!
- 除了 ReLU 替换成 Silu,其他的优化操作仅改变部分算子的结构,且该优化操作不会影响模型的预测结果,故关于如何训练模型,参考官方文档即可,这里不再赘述。
- 对于不同的数据集,yolov5仓库可能会自动求出最佳anchors,导出模型时请留意anchors信息,与后续demo的anchors信息不一致时,需要修改demo中的anchors信息。
- 通常而言,Detect层的stride信息固定为[8,16,32],如果该定义被修改了,也需要在demo中修改对应信息。
131:
/home/pc/xx/rkn/rknn_model_zoo/models/vision/object_detection/yolov5-pytorch/yolov5 训练模型:
python train.py --data coco128.yaml --cfg yolov5s.yaml --img 320 --batch-size 16
test: python detect.py --source data/images/bus.jpg --weights runs/train/exp2/weights/best.pt --conf 0.25
python export.py --weights runs/train/exp2/weights/best.pt --img 320 --batch 1 python -m onnxsim runs/train/exp2/weights/best.onnx yolov5s-sim.onnx
可以导出部分模型 :这样比较好 remonnx.py onnx.utils.extract_model(input_path, output_path, input_names, output_names)
方法1
直接转---》rknn-toolkit-v1.7.1/examples/onnx/yolov5
修改load_onnx --》outputs
good
方法2:
RKNN_model_convert 转
yolov5s_convert.yml 修改 各种参数RK_device_id: simulator
得到model.rknn
测试模型: RKNN_python_demo
修改 model = RKNN_model_container(args.model_path, None, "")
input_data.append(np.transpose(input0_data, (1, 2, 0, 3)))
input_data.append(np.transpose(input1_data, (1, 2, 0, 3)))
input_data.append(np.transpose(input2_data, (1, 2, 0, 3)))
demo :onnx/yolov5$ vim 3test.py
python yolo_map_test_rknn.py --model_path ../RKNN_model_convert/model.rknn --img_show --img_folder ../test_data
在yolov5 目录下执行以下命令,即可导出针对npu优化的模型,同时打印并将anchors保存成txt文件。
python export.py --rknpu {device_platform} 修改 rknn.load_onnx 加上各种lable
- device platform 替换成手上板子对应的平台,有以下选择 [rk1808/rv1109/rv1126/rk3399pro/rk3566/rk3568/rk3588]
- 不同平台具体优化细节略有差异
请参考 ./RKNN_model_convert/README.md 文档
请参考 ./RKNN_python_demo/README.md 文档
RKNN_toolkit1 请参考./RKNN_C_demo/RKNN_toolkit_1/rknn_yolov5_demo/README.md 文档
RKNN_toolkit2 TO DO
- 大尺寸 Maxpool 优化:大尺寸的 Maxpool 对底层不友好,会导致耗时增加,而从公式上 5x5 Maxpool 与两个串联的 3x3 Maxpool 是等价的,以此类推,我们对 SPP 层 5x5, 9x9, 13x13 的Maxpool 做了分解优化,使模型更适合在 RKNN 设备上部署,且不影响精度。
- Focus层使用卷积优化:slice算子目前对部分 RKNN 设备不友好,我们使用特殊权重分布的卷积替换它,在保证计算结果不变的情况下,优化模型部署速度。
- 去掉后处理的原因:目前大部分模型的后处理对 NPU 设备都不友好,部分后处理op量化后会有精度问题,故我们默认将 yolov5 的后处理结构移除。
platform(fps) | yolov5s-relu | yolov5s-silu | yolov5m-relu | yolov5m-silu |
---|---|---|---|---|
rk1808 - u8 | 35.24 | 26.41 | 16.27 | 12.60 |
rv1109 - u8 | 19.58 | 13.33 | 8.11 | 5.45 |
rv1126 - u8 | 27.54 | 19.29 | 11.69 | 7.86 |
rk3566 - u8 | 15.16 | 10.60 | 8.65 | 6.61 |
rk3568 - u8 | ||||
rk3588 - u8(single core) | 53.73 | 33.24 | 22.31 | 14.74 |
rk3588 - u8(triple core) |
具体细节请参考文档
yolov5转换成rknn模型卡住问题
https://blog.csdn.net/u013171226/article/details/120886871
1.安装驱动usb
2.[root@tech:/etc/init.d]# cat .usb_config
usb_ntb_en usb_adb_en
3.zadig-2.4.exe rk3xx 安装驱动重启
-
python -m rknn.bin.list_devices all device(s) with ntb mode: 27049522c092de70
C:\Users\ffipc\AppData\Local\Programs\Python\Python36>python ecompile_model.py mobilenet_v2.rknn vvmobilenet_v2.rknn ret = rknn.init_runtime(target='rk1126', rknn2precompile=True) --> Init runtime environment D RKNNAPI: ============================================== D RKNNAPI: RKNN VERSION: D RKNNAPI: API: 1.7.1 (566a9b6 build: 2021-10-28 15:13:57) D RKNNAPI: DRV: 1.6.1 (f78b668 build: 2021-04-25 15:46:12) D RKNNAPI: ============================================== done