当前位置:   article > 正文

RK3568笔记二十一:YOLOv8 实例分割部署

RK3568笔记二十一:YOLOv8 实例分割部署

若该文为原创文章,转载请注明原文出处。

参考rknn_model_zoo部署YOLOv8 实例分割.

一、环境

1、测试训练环境:AutoDL.

2、平台:rk3568

3、开发板: ATK-RK3568正点原子板子

4、环境:buildroot

5、虚拟机:正点原子提供的ubuntu 20

二、测试

个人电脑没有GPU,在AutoDL租了服务器,配置如下:将在上面测试并训练。

  1. PyTorch  1.8.1
  2. Python  3.8(ubuntu18.04)
  3. Cuda  11.1

1、环境搭建

创建虚拟环境

conda create -n yolov8 python=3.8

激活

conda activate yolov8

2、安装yolov8

安装方式有二种:

1、使用命令安装

pip install ultralytics -i https://mirror.baidu.com/pypi/simple

2、源码安装

  1. git clone https://github.com/ultralytics/ultralytics
  2. cd ultralytics
  3. # 安装
  4. pip install -e .

安装后,看下版本。

yolo version

3、 测试

使用官方的预训练模型yolov8s-seg.pt简单测试下图像分割测试,然后推理。

先下载模型:

https://github.com/ultralytics/assets/releases/download/v8.1.0/yolov8s-seg.pt

下载后,拷贝到ultralytics目录下。 

yolo segment predict model=./yolov8s-seg.pt source='https://ultralytics.com/images/bus.jpg'

执行命令后进行推理。

结果保存在runs/segment/predict下。

三、训练

由于只是测试,直接使用官网提供的coco128数据集,也可以自行制定数据集训练。

1、训练

yolo segment train data=coco128-seg.yaml model=yolov8s-seg.pt epochs=300 imgsz=640

2、评估

yolo segment val model=runs/segment/train/best.pt

四、模型导出

使用 airockchip/ultralytics_yolov8 导出适合部署到 rknpu 上的模型。
使用这个仓库是原因这个仓库RK修改过,在 npu 上能获得更高的推理效率。
拉取分支
  1. git clone https://github.com/airockchip/ultralytics_yolov8.git
  2. cd ultralytics_yolov8
修改 ultralytics/cfg/default.yaml 中 model 文件路径,可以修改成自己训练出的模型, 或者使用预
训练模型 yolov8n-seg.pt。这里使用上面训练出来的模型。
修改 ultralytics/cfg/default.yaml, model修改成训练后的模型路径

导出模型,执行下面命令:

先执行

export PYTHONPATH=./

在执行转换,转换前需要先安装onnx

pip install onnx

导出模型:

python ./ultralytics/engine/exporter.py

导出正常,可以使用netron查看模型。

 五、转换成 rknn 模型

rknn模型是通过 toolkit2 转换的。环境搭建自行搭建。

参考简单的转换例程onnx2rknn.py

  1. import os
  2. import sys
  3. import numpy as np
  4. from rknn.api import RKNN
  5. DATASET_PATH = '../dataset/coco_subset_20.txt'
  6. DEFAULT_QUANT = True
  7. def parse_arg():
  8. if len(sys.argv) < 3:
  9. print("Usage: python3 {} [onnx_model_path] [platform] [dtype(optional)] [output_rknn_path(optional)]".format(sys.argv[0]));
  10. print(" platform choose from [rk3562,rk3566,rk3568,rk3588]")
  11. print(" dtype choose from [i8, fp]")
  12. print("Example: python onnx2rknn.py ./yolov8n.onnx rk3588")
  13. exit(1)
  14. model_path = sys.argv[1]
  15. platform = sys.argv[2]
  16. do_quant = DEFAULT_QUANT
  17. if len(sys.argv) > 3:
  18. model_type = sys.argv[3]
  19. if model_type not in ['i8', 'fp']:
  20. print("ERROR: Invalid model type: {}".format(model_type))
  21. exit(1)
  22. elif model_type == 'i8':
  23. do_quant = True
  24. else:
  25. do_quant = False
  26. if len(sys.argv) > 4:
  27. output_path = sys.argv[4]
  28. else:
  29. output_path = "./model/yolov8_seg_"+platform+".rknn"
  30. return model_path, platform, do_quant, output_path
  31. if __name__ == '__main__':
  32. model_path, platform, do_quant, output_path = parse_arg()
  33. # Create RKNN object
  34. rknn = RKNN(verbose=False)
  35. # Pre-process config
  36. print('--> Config model')
  37. rknn.config(mean_values=[[0, 0, 0]], std_values=[
  38. [255, 255, 255]], target_platform=platform)
  39. print('done')
  40. # Load model
  41. print('--> Loading model')
  42. ret = rknn.load_onnx(model=model_path)
  43. #ret = rknn.load_pytorch(model=model_path, input_size_list=[[1, 3, 640, 640]])
  44. if ret != 0:
  45. print('Load model failed!')
  46. exit(ret)
  47. print('done')
  48. # Build model
  49. print('--> Building model')
  50. ret = rknn.build(do_quantization=do_quant, dataset=DATASET_PATH)
  51. if ret != 0:
  52. print('Build model failed!')
  53. exit(ret)
  54. print('done')
  55. # Export rknn model
  56. print('--> Export rknn model')
  57. ret = rknn.export_rknn(output_path)
  58. if ret != 0:
  59. print('Export rknn model failed!')
  60. exit(ret)
  61. print('done')
  62. # 精度分析,,输出目录./snapshot
  63. #print('--> Accuracy analysis')
  64. #ret = rknn.accuracy_analysis(inputs=['./subset/000000052891.jpg'])
  65. #if ret != 0:
  66. # print('Accuracy analysis failed!')
  67. # exit(ret)
  68. #print('done')
  69. # Release
  70. rknn.release()

执行

python onnx2rknn.py best.onnx rk3568 i8

不使用上面代码,也可以使用rknn_model_zoo里的convert.py转换,参考RK3568笔记七:yolov5-seg实例分割测试验证_yolov5seg rknn-CSDN博客

python convert.py ../model/yolov5s-seg.onnx rk3568 i8

部署前面文章有提及,自行参考。

如有侵权,或需要完整代码,请及时联系博主。

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

闽ICP备14008679号