Skip to content

Latest commit

 

History

History

yolov5-pytorch

Yolov5 - pytorch

下载仓库并打上patch:

​ 在该 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

修改 yaml 中anchors

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 文档


Python_demo

请参考 ./RKNN_python_demo/README.md 文档


C_demo

RKNN_toolkit1 请参考./RKNN_C_demo/RKNN_toolkit_1/rknn_yolov5_demo/README.md 文档

RKNN_toolkit2 TO DO


Patch优化细节:

  • 大尺寸 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 安装驱动重启

  1. 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