当前位置:   article > 正文

X3派 部署pytorch yolov5 demo_x3派demo

x3派demo

一、配置环境

我的pytorch之前已配置了,参照链接:

安装anconda+配置pytorch

查看环境conda env list

激活环境 conda activate yolov5_py3.10

 安装onnx:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple onnx

安装yolov5需要的包:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.1 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 tqdm>=4.64.0 tensorboard>=2.4.1 pandas>=1.1.4 seaborn>=0.11.0 ipython psutil thop>=0.1.1

二、运行yolov5

下载百度云中提供的文件提取码0a09

获取yolov5源码版本V6.2

  1. 解压yolov5-master.zip
  2. zidane.jpg放到yolov5-master文件夹中。
  3. yolov5s.pt放到yolov5-master/models文件夹中。
  4. 进入yolov5-master文件夹,输入python .\detect.py --weights .\models\yolov5s.pt --source zidane.jpg,代码会输出检测结果保存路径,比如我的就是Results saved to runs\detect\exp9,检测结果如下所示

在这里插入图片描述

三、 pytorch的pt模型文件转onnx

python .\export.py --weights .\models\yolov5s.pt --include onnx --opset 11

输出信息如下:

 转换后的模型文件在models/下

四、windows安装docker

下载安装包进行安装

 五、docker环境配置

1、管理员模式打开cmd ,docker pull 获取部署所需要的CentOS Docker镜像

docker pull openexplorer/ai_toolchain_centos_7:v1.13.6

安装成功之后,即可在docker中看到我们成功安装的镜像:

在这里插入图片描述

 2、将百度下载文件horizon_xj3_open_explorer_v2.2.3_20220617.tar解压

 3、启动docker:

docker run -it --rm 
-v "J:\深度学习\OpenExplorer\horizon_xj3_open_explorer_v2.2.3_20220617":/open_explorer 
-v "J:\深度学习\OpenExplorer\dataset":/data/horizon_x3/data 
-v "J:\深度学习\Codes":/data/horizon_x3/codes 
openexplorer/ai_toolchain_centos_7:v1.13.6

 至此已经通过dockers镜像进入了完整的开发工具链环境, hb_mapper --help 命令验证可看到下面信息:

六、ONNX模型转换 

1、创建bpucondes文件夹

 将前面转好的yolov5s.onnx放进这个文件夹里。

2、模型检查

模型检测的目的是检测有没有不支持的算子,输入指令hb_mapper checker --model-type onnx --march bernoulli2 --model yolov5s.onnx,开始检查模型,显示如下内容表示模型检查通过

3、准备校准数据

核对下代码中src_root、dst_root路径和img = imequalresize(img, (640, 640))输入图像大小

  1. import os
  2. import cv2
  3. import numpy as np
  4. src_root = '/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/calibration_data/coco'
  5. cal_img_num = 100 # 想要的图像个数
  6. dst_root = '/data/horizon_x3/codes/yolov5/bpucodes/calibration_data'
  7. ## 1. 从原始图像文件夹中获取100个图像作为校准数据
  8. num_count = 0
  9. img_names = []
  10. for src_name in sorted(os.listdir(src_root)):
  11. if num_count > cal_img_num:
  12. break
  13. img_names.append(src_name)
  14. num_count += 1
  15. # 检查目标文件夹是否存在,如果不存在就创建
  16. if not os.path.exists(dst_root):
  17. os.system('mkdir {0}'.format(dst_root))
  18. ## 2 为每个图像转换
  19. # 参考了OE中/open_explorer/ddk/samples/ai_toolchain/horizon_model_convert_sample/01_common/python/data/下的相关代码
  20. # 转换代码写的很棒,很智能,考虑它并不是官方python包,所以我打算换一种写法
  21. ## 2.1 定义图像缩放函数,返回为np.float32
  22. # 图像缩放为目标尺寸(W, H)
  23. # 值得注意的是,缩放时候,长宽等比例缩放,空白的区域填充颜色为pad_value, 默认127
  24. def imequalresize(img, target_size, pad_value=127.):
  25. target_w, target_h = target_size
  26. image_h, image_w = img.shape[:2]
  27. img_channel = 3 if len(img.shape) > 2 else 1
  28. # 确定缩放尺度,确定最终目标尺寸
  29. scale = min(target_w * 1.0 / image_w, target_h * 1.0 / image_h)
  30. new_h, new_w = int(scale * image_h), int(scale * image_w)
  31. resize_image = cv2.resize(img, (new_w, new_h))
  32. # 准备待返回图像
  33. pad_image = np.full(shape=[target_h, target_w, img_channel], fill_value=pad_value)
  34. # 将图像resize_image放置在pad_image的中间
  35. dw, dh = (target_w - new_w) // 2, (target_h - new_h) // 2
  36. pad_image[dh:new_h + dh, dw:new_w + dw, :] = resize_image
  37. return pad_image
  38. ## 2.2 开始转换
  39. for each_imgname in img_names:
  40. img_path = os.path.join(src_root, each_imgname)
  41. img = cv2.imread(img_path) # BRG, HWC
  42. img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # RGB, HWC
  43. img = imequalresize(img, (640, 640))
  44. img = np.transpose(img, (2, 0, 1)) # RGB, CHW
  45. # 将图像保存到目标文件夹下
  46. dst_path = os.path.join(dst_root, each_imgname + '.rgbchw')
  47. print("write:{0}, shape: {1}".format(dst_path, img.shape))
  48. img.astype(np.uint8).tofile(dst_path)
  49. # data = np.fromfile(dst_path)
  50. # print(data.shape)
  51. # exit()
  52. print('finish')

 执行python3 ./prepare_calibration_data.py 在calibration_data目录生成校准数据

 

 4、转换BPU模型

转换模型需要yaml参数文件:

  1. model_parameters:
  2. onnx_model: 'yolov5s.onnx'
  3. output_model_file_prefix: 'yolov5s'
  4. march: 'bernoulli2'
  5. input_parameters:
  6. input_type_train: 'rgb'
  7. input_layout_train: 'NCHW'
  8. input_type_rt: 'nv12'
  9. norm_type: 'data_scale'
  10. scale_value: 0.003921568627451
  11. input_layout_rt: 'NHWC'
  12. calibration_parameters:
  13. cal_data_dir: './calibration_data'
  14. calibration_type: 'max'
  15. max_percentile: 0.9999
  16. compiler_parameters:
  17. compile_mode: 'latency'
  18. optimize_level: 'O3'
  19. debug: False
  20. core_num: 2

转换我们的模型输入命令:hb_mapper makertbin --config convert_yolov5s.yaml --model-type onnx

转换成功后,得到model_output/yolov5s.bin,这个文件拿出来,拷贝到旭日X3派上使用,它也是我们上板运行所需要的模型文件。

七、上板运行

拷贝到旭日X3派开发板中,其中yolov5s.bin就是我们转换后的模型,coco_classes.names仅用在画框的时候,如果用自己的数据集的话,参考coco_classes.names创建个新的名字文件即可

1、 安装opencv库:sudo apt-get install libopencv-dev cython

2、编译后处理代码:python3 setup.py build_ext --inplace得到lib/pyyolotools.cpython-38-aarch64-linux-gnu.so文件

3、运行推理命令:sudo python3 inference_model_bpu.py,推理结果保存为res.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/423829
推荐阅读
相关标签
  

闽ICP备14008679号