export_pose.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #!/usr/bin/env python3
  2. """将 YOLOv5-pose 权重转换为 RKNN 模型(RK3568/RK3576/RK3588)。
  3. 依赖:
  4. pip install rknn-toolkit2 ultralytics onnx onnxsim
  5. 用法:
  6. python3 scripts/export_pose.py --weights yolov5s-pose.pt \
  7. --rknn models/yolov5s-pose_rk3588_int8.rknn --chip rk3588
  8. """
  9. import sys
  10. import os
  11. import argparse
  12. def export_onnx(weights, onnx_path, input_size=640):
  13. from ultralytics import YOLO
  14. model = YOLO(weights)
  15. model.export(format='onnx', imgsz=input_size, simplify=True,
  16. opset=12, dynamic=False)
  17. default = os.path.splitext(weights)[0] + '.onnx'
  18. if os.path.exists(default):
  19. os.replace(default, onnx_path)
  20. print(f"[ONNX] -> {onnx_path}")
  21. def convert(onnx_path, rknn_path, chip, input_size=640, fp=False):
  22. from rknn.api import RKNN
  23. rknn = RKNN(verbose=False)
  24. if rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]],
  25. target_platform=f'rk{chip}',
  26. optimization_level=3) != 0:
  27. raise RuntimeError("rknn.config 失败")
  28. if rknn.load_onnx(model=onnx_path, outputs=None) != 0:
  29. raise RuntimeError("load_onnx 失败")
  30. if fp:
  31. if rknn.build(do_quantization=False) != 0:
  32. raise RuntimeError("build(fp) 失败")
  33. else:
  34. if rknn.build(do_quantization=True, dataset='scripts/dataset.txt') != 0:
  35. raise RuntimeError("build(int8) 失败")
  36. if rknn.export_rknn(rknn_path) != 0:
  37. raise RuntimeError("export 失败")
  38. print(f"[RKNN] -> {rknn_path}")
  39. rknn.release()
  40. if __name__ == '__main__':
  41. ap = argparse.ArgumentParser()
  42. ap.add_argument('--weights', required=True)
  43. ap.add_argument('--rknn', default='models/yolov5s-pose_rk3588_int8.rknn')
  44. ap.add_argument('--chip', default='rk3588', help='rk3568/rk3576/rk3588')
  45. ap.add_argument('--input-size', type=int, default=640)
  46. ap.add_argument('--fp16', action='store_true', help='导出fp16而非int8')
  47. args = ap.parse_args()
  48. onnx = os.path.splitext(args.weights)[0] + '.onnx'
  49. export_onnx(args.weights, onnx, args.input_size)
  50. convert(onnx, args.rknn, args.chip, args.input_size, fp=args.fp16)