• AI项目十五:PP-Humanseg训练及onnxruntime部署


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

    关于PP-Humanseg是在正点原子的3568开发板AI测试例子里看到的,目的也是想自己训练并部署,这里记录一下训练和在onnxruntime部署运行的全过程,会转成ONNX,至于部署到rk3568上,会在另一篇文章説明ONNX转成RKNN并部署到RK3568.

    一、训练模型

    一、介绍

    本文将PaddleSeg的人像分割(PP-HumanSeg)模型导出为onnx,并使用onnxruntime部署,实现人像分割,效果如下图所示。

    二、环境搭建

    使用的是AutoDL服务器,配置如下:

    创建虚拟环境

    conda create -n ppseg_env python=3.8 -y

    激活环境

    conda activate ppseg_env

    三、安装PaddlePaddle

    直接安装

    python -m pip install paddlepaddle-gpu==2.4.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

    也可以源码其他的,参考

    开始使用_飞桨-源于产业实践的开源深度学习平台

    四、安装PaddleSeg

    1. git clone https://github.com/PaddlePaddle/PaddleSeg
    2. cd PaddleSeg
    3. pip install -r requirements.txt
    4. pip install -v -e .

    五、下载数据

    PP-Humanseg位于contrib/PP-HumanSeg目录下,在目录下有个 readme.md文件,根据文件,下载数据及模型

    进入PP-HumanSeg目录下

    cd PaddleSeg/contrib/PP-HumanSeg

    1、下载Inference Model

    python src/download_inference_models.py

    2、下载测试数据

    python src/download_data.py

    六、测试

    测试的数据可以是视频也可以是图片,这里测试图片

    执行下面指令:

    1. # Use PP-HumanSegV2-Lite
    2. python src/seg_demo.py \
    3. --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
    4. --img_path data/images/portrait_heng.jpg \
    5. --save_dir data/images_result/portrait_heng_v2.jpg

    结果会保存到data/images_result目录下,结果如下:

    视频可以自我测试,不在演示,使用如下 命令:

    1. python src/seg_demo.py \
    2. --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
    3. --video_path data/videos/video_heng.mp4 \
    4. --save_dir data/videos_result/video_heng_v2.avi

    七、训练

    配置文件保存在`./configs`目录下,如下。配置文件中,已经通过`pretrained`设置好预训练权重的路径。

    执行如下命令,进行模型微调,模型训练的详细文档,请参考[链接](../../docs/train/train_cn.md)

    1. export CUDA_VISIBLE_DEVICES=0 # Linux下设置1张可用的卡
    2. # set CUDA_VISIBLE_DEVICES=0 # Windows下设置1张可用的卡
    3. python ../../tools/train.py --config configs/human_pp_humansegv2_lite.yml --save_dir output/human_pp_humansegv2_lite --save_interval 100 --do_eval --use_vdl

    训练完成后,模型会保存在output目录下

    八、评估模型

    python ../../tools/val.py --config configs/human_pp_humansegv2_lite.yml --model_path output/human_pp_humansegv2_lite/best_model/model.pdparams

    看起来评估的结果还是可以的。

    九、预测 

    python ../../tools/predict.py --config configs/human_pp_humansegv2_lite.yml --model_path output/human_pp_humansegv2_lite/best_model/model.pdparams --image_path data/images/human.jpg --save_dir ./data/images_result

    接下来是重头戏,需要导出模型

    十、导出静态模型

    输入图片大小是192x192

    python ../../tools/export.py --config configs/human_pp_humansegv2_lite.yml --model_path output/human_pp_humansegv2_lite/best_model/model.pdparams --save_dir output/human_pp_humansegv2_lite --input_shape 1 3 192 192 

    十一、预测导出静态模型

    参考deploy下的测试

    python ../../deploy/python/infer.py --config output/human_pp_humansegv2_lite/deploy.yaml  --image_path ./human.jpg --save_dir ./data/images_result3

    至此,导出的静态模型测试完成

    二、ONNX模型转换

    一、安装paddle2onnx

    pip install paddle2onnx

    二、导出ONNX模型 

    1. paddle2onnx --model_dir output/human_pp_humansegv2_lite/ \
    2. --model_filename model.pdmodel \
    3. --params_filename model.pdiparams \
    4. --opset_version 12 \
    5. --save_file output.onnx

    三、测试

    测试使用的是onnxruntime环境测试,所以需要先安装onnxruntime

    pip install onnxruntime

    测试代码是自己编写的,文件为predict.py

    1. import cv2
    2. import numpy as np
    3. import onnxruntime as rt
    4. def normalize(im, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]):
    5. im = im.astype(np.float32, copy=False) / 255.0
    6. im -= mean
    7. im /= std
    8. return im
    9. def resize(im, target_size=608, interp=cv2.INTER_LINEAR):
    10. if isinstance(target_size, list) or isinstance(target_size, tuple):
    11. w = target_size[0]
    12. h = target_size[1]
    13. else:
    14. w = target_size
    15. h = target_size
    16. im = cv2.resize(im, (w, h), interpolation=interp)
    17. return im
    18. def preprocess(image, target_size=(192, 192)):
    19. image = normalize(image)
    20. image = resize(image, target_size=target_size)
    21. image = np.transpose(image, [2, 0, 1])
    22. image = image[None, :, :, :]
    23. return image
    24. def display_masked_image(mask, image, color_map=[255, 0, 0], weight=0.6):
    25. mask = mask > 0
    26. c1 = np.zeros(shape=mask.shape, dtype='uint8')
    27. c2 = np.zeros(shape=mask.shape, dtype='uint8')
    28. c3 = np.zeros(shape=mask.shape, dtype='uint8')
    29. pseudo_img = np.dstack((c1, c2, c3))
    30. for i in range(3):
    31. pseudo_img[:, :, i][mask] = color_map[i]
    32. vis_result = cv2.addWeighted(image, weight, pseudo_img, 1 - weight, 0)
    33. return vis_result
    34. onnx_model_path = './output.onnx'
    35. sess = rt.InferenceSession(onnx_model_path,providers=['AzureExecutionProvider', 'CPUExecutionProvider'])
    36. input_name = sess.get_inputs()[0].name
    37. label_name = sess.get_outputs()[0].name
    38. target_size = (192, 192)
    39. #cap_video = cv2.VideoCapture('./human.jpg')
    40. #if not cap_video.isOpened():
    41. # raise IOError("Error opening video stream or file.")
    42. path = "./human.jpg"
    43. while 1:
    44. #ret, raw_frame = cap_video.read()
    45. ret = 1
    46. raw_frame = cv2.imread(path)
    47. pre_shape = raw_frame.shape[0:2][::-1]
    48. if ret:
    49. frame = cv2.cvtColor(raw_frame, cv2.COLOR_BGRA2RGB)
    50. frame = preprocess(frame, target_size)
    51. pred = sess.run(
    52. [label_name],
    53. {input_name: frame.astype(np.float32)}
    54. )[0]
    55. pred = pred[0]
    56. raw_frame = resize(raw_frame, target_size)
    57. image = display_masked_image(pred, raw_frame)
    58. image = resize(image, target_size=pre_shape)
    59. #cv2.imshow('HumanSegmentation', image)
    60. cv2.imwrite('result.jpg',image)
    61. print("finish! result save result.jpg")
    62. break
    63. if cv2.waitKey(1) & 0xFF == ord('q'):
    64. break
    65. else:
    66. break
    67. #cap_video.release()

    执行python predict.py

    运行正常

    以上是完整的一个过程 ,在onnxruntime上部署成功

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

  • 相关阅读:
    MPP(无主备)环境搭建
    TiDB v6.2 发版
    关于 Data Lake 的概念、架构与应用场景介绍
    三、简单了解kafka设计原理
    SQL SERVER EXEC 、SP_EXECUTESQL
    参加2024年CSDN博客_付费内容优质创作者_颁奖仪式的收获
    前端CSS实现响应式TimeLine效果(附源码)
    Unity热更新那些事
    力扣:611. 有效三角形的个数
    基于 QEMUv8 搭建 OP-TEE 开发环境
  • 原文地址:https://blog.csdn.net/weixin_38807927/article/details/133780665