Toybrick

标题: RK3399ProD移植部署yolov5-6.2 [打印本页]

作者: Frank_35    时间: 2023-3-8 12:25
标题: RK3399ProD移植部署yolov5-6.2
本帖最后由 Frank_35 于 2023-3-8 17:16 编辑

因发帖限制,本教程对应的每一步图片参考附件PDF,请自行下载
-----------------------------------------------------------------------------------------
一、搭建yolov5环境
  从yolov5官方仓库(Releases · ultralytics/yolov5(github.com))中下载 yolov5-6.2 代码。解压后,修改 requirements.txt :
   (注:我是先将代码通过git 克隆到win10本地,然后通过FTP客户端上传到ubuntu
  1、将第12行torch>=1.7.0 改为 torch==1.9.0因为只有 pytorch 1.8.0 或 1.9.0 版本才能正常导出模型;
  2、删除第28、29行 onnx>=1.9.0 前的 # 号,否则无法导出onnx模型
           执行:pip install -r requirement.txt     验证环境是否搭建成功: python3 detect.py
    会自动下载 yolov5s.pt 模型,如果环境搭建成功,将会对示例图片进行预测。


二、导出onnx模型
   1、进入 yolov5-6.2/models ,将 yolo.py 文件中 class Detect 中的 forward 函数,修改如下:(其实就是用多行注释注释代码)
   2、进入 yolov5-6.2 主目录,执行以下命令导出onnx模型
      python export.py --weights yolov5s.pt --img 640 --batch 1 --opset 12--include onnx
    执行成功后,将在 yolov5s.pt 同目录生成 yolov5s.onnx 文件

三、安装 rknn-toolkit(运行带完整 RKNN-Toolkit 开发环境的 docker 镜像)
   1. 下载docker版本的toolkit
    (:1.先在ubuntu下载docker,请自行百度;2.我是先将镜像下载到win10本地,然后通过FTP客户端上传到ubuntu)
   从rockchip-linux/rknn-toolkit下载docker版本的toolkit,提取码:rknn
   下载的是 1.7.3 版本

   2.加载镜像
    在安装有docker的linux服务器上导入上述toolkit,执行:
       docker load --input rknn-toolkit-1.7.3-docker.tar.gz
    导入完成后执行 docker images,将看到 toolkit-1.7.3 镜像

   执行以下命令,进入docker
      docker run -t -i --privileged -v $PWD:/test rknn-toolkit:1.7.3 /bin/bash
   其中 -v $PWD:/test 是指把当前目录映射到docker容器的/test目录内,这样当要和docker容器内部进行文件传输时,只需把需要传输的文件放到当前目录,就能在 docker 容器内的 /test 目录看到,反之亦然。
执行成功后,将自动进入docker容器内

   可以看到已经有一个 test 目录,test目录的内容就是服务器当前目录的内容。

四、通过netron 查看 yolov5s.onnx 输出节点
  1.安装netron
   (:我是安装在win10上。)
         https://github.com/lutzroeder/netron   点击对应系统的Download

  2.然后netron打开上述第二步导出的 yolov5s.onnx 模型,点击左上角图标,即可看到输出节点信息
   可以看到这里的输出节点分别是: output327328,记住这几个输出节点,下一步导出rknn时将用到。

五、创建 onnx2rknn.py 文件(文件内容参考pdf
  在该文件中指定onnx_model路径,platform,以及 rknn.load_onnx 时一定要指定上一步查看的输出节点信息。

from rknn.api import RKNN ONNX_MODEL = 'yolov5s.onnx'platform = "rk3399pro"RKNN_MODEL = 'yolov5s_{}_out_opt.rknn'.format(platform) if __name__ == '__main__':     add_perm = False # 如果设置成True,则将模型输入layout修改成NHWC    # Create RKNN object    rknn = RKNN(verbose=True)     # pre-process config    print('--> config model')    rknn.config(batch_size=1, mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], reorder_channel='0 1 2', target_platform=[platform],                 force_builtin_perm=add_perm, output_optimize=1)    print('done')     # Load tensorflow model    print('--> Loading model')    ret = rknn.load_onnx(model=ONNX_MODEL,outputs=['output', '327', '328'])# 这里一定要根据onnx模型修改    if ret != 0:        print('Load onnx model failed!')        exit(ret)    print('done')     # Build model    print('--> Building model')    ret = rknn.build(do_quantization=True, dataset='./dataset.txt')    if ret != 0:        print('Build rkmodel failed!')        exit(ret)    print('done')     # rknn.export_rknn_precompile_model(RKNN_MODEL)    rknn.export_rknn(RKNN_MODEL)     rknn.release()
六、通过toolkit将onnx转换为rknn模型
  1、将上述第二步导出的yolov5s.onnx 模型以及 第五步创建的 onnx2rknn.py 放到服务器当前目录,即映射到docker容器内/test目录的目录;
       2、进入docker容器内,执行
       cp /test/yolov5/yolov5s.onnx /examples/onnx/yolov5/            
      cp /test/yolov5/onnx2rknn.py /examples/onnx/yolov5/       
      cd /examples/onnx/yolov5/       
      python onnx2rknn.py       
      cp yolov5s_rk3399pro_out_opt.rknn /test/yolov5

    执行完成后将生成相应的 yolov5s_rk3399pro_out_opt.rknn 模型:

七、在rk3399pro开发板上运行rknn模型
   1、下载 airockchip/RK3399Pro_npu,将其放到 rk3399pro 开发板上:
    (:我是通过git下载到本地,然后FTP客户端上传到RK3399ProD的Dibian10系统上,转换的rknn模型也是如此,在桌面专门新建一个文件夹存放相关资料。)
   2、如果需要更新npu驱动,根据说明更新NPU驱动,只需要替换相应的boot.img 即可。参考git官方README文件。
   3、进入RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo 目录,执行以下命令
                 cd RK3399Pro_npu-main/rknapi/examples/c_demos/rknn_yolov5_demo                                  mkdir build                
                 cd build          
                cmake -DCMAKE_C_COMPILER=/usr/bin/gcc DCMAKE_CXX_COMPILER= /usr/bin/g++ ..                
                make -j4
            执行成功后,将在build目录生成可执行程序 rknn_yolov5_demo:
       4、将yolov5s_rk3399pro_out_opt.rknn模型复制RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo/model目录。
    5、在RK3399Pro_npu-main/rknn-api/examples/c_demos/rknn_yolov5_demo创建以下运行脚本 run_demo.sh
         export LD_LIBRARY_PATH=./lib/                
        ./build/rknn_yolov5_demo  model/yolov5s_rk3399pro_out_opt.rknn  model/bus.bmp
          6.执行脚本  ./run_demo.sh   正常将输出预测信息



























作者: jin412    时间: 2023-9-28 11:45
本帖最后由 jin412 于 2023-9-28 12:07 编辑

我的是rk3399pro
大佬我安装你的步骤生成的rknn模型,能不能帮忙找下原因
  1. [toybrick@toybrick rknn_yolov5_demo]$ ./run_my.sh
  2. post process config: box_conf_threshold = 0.85, nms_threshold = 0.60
  3. Loading mode...
  4. D RKNNAPI: ==============================================
  5. D RKNNAPI: RKNN VERSION:
  6. D RKNNAPI:   API: 1.7.5 (bb79b30 build: 2023-07-18 16:49:12)
  7. D RKNNAPI:   DRV: 1.7.5 (bb79b30 build: 2023-07-18 10:49:14)
  8. D RKNNAPI: ==============================================
  9. sdk version: 1.7.5 (bb79b30 build: 2023-07-18 16:49:12) driver version: 1.7.5 (bb79b30 build: 2023-07-18 10:49:14)
  10. model input num: 1, output num: 3
  11.   index=0, name=images_202, n_dims=4, dims=[1, 3, 640, 640], n_elems=1228800, size=1228800, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003922
  12.   index=0, name=Conv_Conv_198/out0_0, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=198, scale=0.093099
  13.   index=1, name=Conv_Conv_199/out0_1, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=177, scale=0.086641
  14.   index=2, name=Conv_Conv_200/out0_2, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=171, scale=0.083522
  15. model is NCHW input fmt
  16. model input height=640, width=640, channel=3
  17. once run use 61.091000 ms
  18. loadLabelName ./model/coco_80_labels_list.txt
  19. person @ (131 0 195 640) 9.315677
  20. person @ (81 0 145 640) 7.544122
  21. person @ (369 299 526 437) 7.534053
  22. person @ (92 215 131 413) 7.520102
  23. person @ (0 309 640 319) 7.436389
  24. person @ (111 0 111 640) 7.031783
  25. person @ (476 263 633 462) 5.957483
  26. bus @ (193 251 286 260) 5.915627
  27. person @ (100 345 379 433) 5.678444
  28. person @ (433 0 462 640) 5.573804
  29. bus @ (0 73 640 427) 5.231981
  30. person @ (199 0 280 640) 5.134318
  31. person @ (95 200 374 289) 5.099438
  32. person @ (540 0 569 640) 4.785519
  33. person @ (0 329 256 417) 4.185585
  34. person @ (81 0 162 640) 3.529844
  35. bus @ (316 251 409 260) 3.418228
  36. person @ (496 32 511 640) 3.107728
  37. person @ (226 0 242 640) 2.702372
  38. loop count = 100 , average run  41.097110 ms

  39. 上面是我生成rknn预测

  40. 下面是官方预测是正确的
  41. [toybrick@toybrick rknn_yolov5_demo]$ ./run_demo.sh
  42. post process config: box_conf_threshold = 0.85, nms_threshold = 0.60
  43. Loading mode...
  44. D RKNNAPI: ==============================================
  45. D RKNNAPI: RKNN VERSION:
  46. D RKNNAPI:   API: 1.7.5 (bb79b30 build: 2023-07-18 16:49:12)
  47. D RKNNAPI:   DRV: 1.7.5 (bb79b30 build: 2023-07-18 10:49:14)
  48. D RKNNAPI: ==============================================
  49. sdk version: 1.7.5 (bb79b30 build: 2023-07-18 16:49:12) driver version: 1.7.5 (bb79b30 build: 2023-07-18 10:49:14)
  50. model input num: 1, output num: 3
  51.   index=0, name=x.1_0, n_dims=4, dims=[1, 3, 640, 640], n_elems=1228800, size=1228800, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003922
  52.   index=0, name=sigmoid_at_1097_147_out0_152, n_dims=4, dims=[1, 255, 80, 80], n_elems=1632000, size=1632000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003858
  53.   index=1, name=sigmoid_at_1109_149_out0_153, n_dims=4, dims=[1, 255, 40, 40], n_elems=408000, size=408000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003919
  54.   index=2, name=sigmoid_at_1121_151_out0_154, n_dims=4, dims=[1, 255, 20, 20], n_elems=102000, size=102000, fmt=NCHW, type=UINT8, qnt_type=AFFINE, zp=0, scale=0.003916
  55. model is NCHW input fmt
  56. model input height=640, width=640, channel=3
  57. once run use 67.280000 ms
  58. loadLabelName ./model/coco_80_labels_list.txt
  59. person @ (208 246 287 505) 0.867932
  60. person @ (481 239 561 526) 0.860113
  61. person @ (109 234 231 536) 0.860113
  62. loop count = 100 , average run  33.336930 ms
  63. [toybrick@toybrick rknn_yolov5_demo]$
复制代码
附件是我的rknn文件在,扩展名后面 .zip 删除就是正确的文件名




欢迎光临 Toybrick (https://t.rock-chips.com/) Powered by Discuz! X3.3