AI计算机视觉笔记二十三:PP-Humanseg训练及onnxruntime部署

简介: 本文介绍了如何训练并使用PaddleSeg的人像分割模型PP-HumanSeg,将其导出为ONNX格式,并使用onnxruntime进行部署。首先在AutoDL服务器上搭建环境并安装所需库,接着下载数据与模型,完成模型训练、评估和预测。最后,通过paddle2onnx工具将模型转换为ONNX格式,并编写预测脚本验证转换后的模型效果。此过程适用于希望在不同平台上部署人像分割应用的开发者。

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

一、训练模型

一、介绍

本文将PaddleSeg的人像分割(PP-HumanSeg)模型导出为onnx,并使用onnxruntime部署,实现人像分割,效果如下图所示。
image.png
二、环境搭建
使用的是AutoDL服务器,配置如下:

image.png
创建虚拟环境

conda create -n ppseg_env python=3.8 -y

激活环境

conda activate ppseg_env

image.png

三、安装PaddlePaddle

直接安装

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

也可以源码其他的,参考

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

四、安装PaddleSeg

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

image.png

五、下载数据

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

六、测试

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

执行下面指令:

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

结果会保存到data/images_result目录下,结果如下:
image.png
视频可以自我测试,不在演示,使用如下 命令:

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

七、训练

配置文件保存在./configs目录下,如下。配置文件中,已经通过pretrained设置好预训练权重的路径。
image.png
执行如下命令,进行模型微调,模型训练的详细文档,请参考链接

export CUDA_VISIBLE_DEVICES=0 # Linux下设置1张可用的卡
# set CUDA_VISIBLE_DEVICES=0  # Windows下设置1张可用的卡
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目录下
image.png

八、评估模型

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

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

九、预测

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

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

十、导出静态模型

输入图片大小是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

image.png

十一、预测导出静态模型

参考deploy下的测试

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

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

image.png

二、ONNX模型转换

一、安装paddle2onnx

pip install paddle2onnx

二、导出ONNX模型

paddle2onnx --model_dir output/human_pp_humansegv2_lite/ \
--model_filename model.pdmodel \
--params_filename model.pdiparams \
--opset_version 12 \
--save_file output.onnx

三、测试

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

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

import cv2
import numpy as np
import onnxruntime as rt


def normalize(im, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]):
    im = im.astype(np.float32, copy=False) / 255.0
    im -= mean
    im /= std
    return im


def resize(im, target_size=608, interp=cv2.INTER_LINEAR):
    if isinstance(target_size, list) or isinstance(target_size, tuple):
        w = target_size[0]
        h = target_size[1]
    else:
        w = target_size
        h = target_size
    im = cv2.resize(im, (w, h), interpolation=interp)
    return im


def preprocess(image, target_size=(192, 192)):
    image = normalize(image)
    image = resize(image, target_size=target_size)
    image = np.transpose(image, [2, 0, 1])
    image = image[None, :, :, :]
    return image


def display_masked_image(mask, image, color_map=[255, 0, 0], weight=0.6):
    mask = mask > 0
    c1 = np.zeros(shape=mask.shape, dtype='uint8')
    c2 = np.zeros(shape=mask.shape, dtype='uint8')
    c3 = np.zeros(shape=mask.shape, dtype='uint8')
    pseudo_img = np.dstack((c1, c2, c3))
    for i in range(3):
        pseudo_img[:, :, i][mask] = color_map[i]
    vis_result = cv2.addWeighted(image, weight, pseudo_img, 1 - weight, 0)
    return vis_result


onnx_model_path = './output.onnx'
sess = rt.InferenceSession(onnx_model_path,providers=['AzureExecutionProvider', 'CPUExecutionProvider'])
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].name

target_size = (192, 192)

#cap_video = cv2.VideoCapture('./human.jpg')
#if not cap_video.isOpened():
#    raise IOError("Error opening video stream or file.")
path = "./human.jpg"

while 1:
    #ret, raw_frame = cap_video.read()
    ret = 1
    raw_frame  = cv2.imread(path)
    pre_shape = raw_frame.shape[0:2][::-1]
    if ret:
        frame = cv2.cvtColor(raw_frame, cv2.COLOR_BGRA2RGB)
        frame = preprocess(frame, target_size)
        pred = sess.run(
            [label_name],
            {input_name: frame.astype(np.float32)}
        )[0]
        pred = pred[0]
        raw_frame = resize(raw_frame, target_size)
        image = display_masked_image(pred, raw_frame)
        image = resize(image, target_size=pre_shape)
        #cv2.imshow('HumanSegmentation', image)
        cv2.imwrite('result.jpg',image)
        print("finish! result save result.jpg")
        break
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
#cap_video.release()

执行python predict.py

运行正常
image.png

相关文章
|
13天前
|
机器学习/深度学习 存储 人工智能
【AI系统】感知量化训练 QAT
本文介绍感知量化训练(QAT)流程,旨在减少神经网络从FP32量化至INT8时的精度损失。通过在模型中插入伪量化节点(FakeQuant)模拟量化误差,并在训练中最小化这些误差,使模型适应量化环境。文章还探讨了伪量化节点的作用、正向与反向传播处理、TensorRT中的QAT模型高效推理,以及QAT与PTQ的对比,提供了实践技巧,如从良好校准的PTQ模型开始、采用余弦退火学习率计划等。
51 2
【AI系统】感知量化训练 QAT
|
13天前
|
机器学习/深度学习 存储 人工智能
【AI系统】训练后量化与部署
本文详细介绍了训练后量化技术,涵盖动态和静态量化方法,旨在将模型权重和激活从浮点数转换为整数,以优化模型大小和推理速度。通过KL散度等校准方法和量化粒度控制,文章探讨了如何平衡模型精度与性能,同时提供了端侧量化推理部署的具体实现步骤和技术技巧。
38 1
【AI系统】训练后量化与部署
|
12天前
|
人工智能 PyTorch 测试技术
【AI系统】并行训练基本介绍
分布式训练通过将任务分配至多个节点,显著提升模型训练效率与精度。本文聚焦PyTorch2.0中的分布式训练技术,涵盖数据并行、模型并行及混合并行等策略,以及DDP、RPC等核心组件的应用,旨在帮助开发者针对不同场景选择最合适的训练方式,实现高效的大模型训练。
47 8
|
22天前
|
机器学习/深度学习 存储 人工智能
【AI系统】谷歌 TPU v2 训练芯片
2017年,谷歌推出TPU v2,专为神经网络训练设计,标志着从推理转向训练的重大转变。TPU v2引入多项创新,包括Vector Memory、Vector Unit、MXU及HBM内存,以应对训练中数据并行、计算复杂度高等挑战。其高效互联技术构建了TPU v2超级计算机,显著提升大规模模型训练的效率和性能。
39 0
|
7月前
|
机器学习/深度学习 计算机视觉
AIGC核心技术——计算机视觉(CV)预训练大模型
【1月更文挑战第13天】AIGC核心技术——计算机视觉(CV)预训练大模型
643 3
AIGC核心技术——计算机视觉(CV)预训练大模型
|
机器学习/深度学习 PyTorch 算法框架/工具
Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
Azure 机器学习 - 使用 ONNX 对来自 AutoML 的计算机视觉模型进行预测
129 0
|
3月前
|
人工智能 测试技术 API
AI计算机视觉笔记二十 九:yolov10竹签模型,自动数竹签
本文介绍了如何在AutoDL平台上搭建YOLOv10环境并进行竹签检测与计数。首先从官网下载YOLOv10源码并创建虚拟环境,安装依赖库。接着通过官方模型测试环境是否正常工作。然后下载自定义数据集并配置`mycoco128.yaml`文件,使用`yolo detect train`命令或Python代码进行训练。最后,通过命令行或API调用测试训练结果,并展示竹签计数功能。如需转载,请注明原文出处。
|
3月前
|
人工智能 测试技术 PyTorch
AI计算机视觉笔记二十四:YOLOP 训练+测试+模型评估
本文介绍了通过正点原子的ATK-3568了解并实现YOLOP(You Only Look Once for Panoptic Driving Perception)的过程,包括训练、测试、转换为ONNX格式及在ONNX Runtime上的部署。YOLOP由华中科技大学团队于2021年发布,可在Jetson TX2上达到23FPS,实现了目标检测、可行驶区域分割和车道线检测的多任务学习。文章详细记录了环境搭建、训练数据准备、模型转换和测试等步骤,并解决了ONNX转换过程中的问题。
|
5月前
|
自然语言处理 监控 自动驾驶
大模型在自然语言处理(NLP)、计算机视觉(CV)和多模态模型等领域应用最广
【7月更文挑战第26天】大模型在自然语言处理(NLP)、计算机视觉(CV)和多模态模型等领域应用最广
262 11
|
6月前
|
编解码 机器人 测试技术
2024年6月计算机视觉论文推荐:扩散模型、视觉语言模型、视频生成等
6月还有一周就要结束了,我们今天来总结2024年6月上半月发表的最重要的论文,重点介绍了计算机视觉领域的最新研究和进展。
159 8

热门文章

最新文章

下一篇
DataWorks