PP-HumanSeg模型导出为ONNX格式并分割人像

2023-10-17 17:50

本文主要是介绍PP-HumanSeg模型导出为ONNX格式并分割人像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、模型导出
    • 1.1 导出预测模型
    • 1.2 导出为ONNX格式
      • 1.2.1 安装paddle2onnx
      • 1.2.2 格式转换
  • 二、ONNX模型属性结构
    • 2.1 模型属性
    • 2.2 模型结构
  • 三、ONNX模型使用
    • 3.1 代码
    • 3.2 运行
  • 四、分割效果展示
    • 4.1 原图
    • 4.2 分割
  • 参考

前言

在上一篇内容中已经对PP-HumanSeg模型进行了训练和微调,为了方便后续的部署,在这篇文章中,会将训练产生的模型导出ONNX格式并调用,对RGB图和深度图进行人像分割。

一、模型导出

1.1 导出预测模型

PaddleSeg训练好模型后,需要将模型导出为预测模型(这里还是利用的PaddleSeg项目中的脚本),才可以进行模型部署。

python ../../export.py \--config configs/human_pp_humansegv1_server.yml \--model_path output/human_pp_humansegv1_server/best_model/model.pdparams \--save_dir output/human_pp_humansegv1_server_export \--without_argmax \--with_softmax

导出预测模型后,会在保存文件夹下产生四个文件预测模型相关文件,下一步中会用到。
在这里插入图片描述

1.2 导出为ONNX格式

1.2.1 安装paddle2onnx

pip install paddle2onnx

1.2.2 格式转换

paddle2onnx --model_dir ./output/human_pp_humansegv1_server_export \--model_filename model.pdmodel \--params_filename model.pdiparams \--save_file ./output/human_pp_humansegv1_server_export/model.onnx \--enable_dev_version True \--enable_onnx_checker True \--opset_version 11

转换成功后就会在保存文件下产生一个model.onnx文件。

二、ONNX模型属性结构

2.1 模型属性

在这里插入图片描述

2.2 模型结构

使用Netron可视化模型结构。

三、ONNX模型使用

3.1 代码

import os
import numpy as np
import onnxruntime
import cv2
import time
import onnx
from PIL import Image as PILImage#onnx模型加载检测
onnx_path = "output/human_pp_humansegv1_server_export/model.onnx"
onnx_model = onnx.load(onnx_path)
onnx.checker.check_model(onnx_model)
print('The model is checked!')#路径
rgb_img_path = "data/images/2275122.png"
depth_img_path = "data/images/2275188.png"
save_img_path = "data/images_result"sess = onnxruntime.InferenceSession(onnx_path,providers=['CUDAExecutionProvider']) #使用GPU#读取图片
rgb_img = cv2.imread(rgb_img_path)
depth_img = cv2.imread(depth_img_path)#输入数据预处理
#input_img = cv2.resize(rgb_img,(512,512)) # resize到网络模型合适的输入,这里也可以不缩放,已经调整为随机大小
input_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2RGB) #BGR->RGB
input_img = np.transpose(input_img, (2,0,1))  # 转为[c,h,w]
input_img = ((input_img.astype(np.float32)/255.0) - 0.5) / 0.5 #归一化
img_data = input_img[np.newaxis, :, :, :] # shape:[1,3,720,1080]#onnx模型推理
ort_inputs = {sess.get_inputs()[0].name: img_data}
results = sess.run(None, ort_inputs)#保存图片
if not os.path.exists(save_img_path):os.makedirs(save_img_path)for i, result in enumerate(results):result = np.argmax(result, axis=1) #shape:[1,720,1080]if result.ndim == 3:result = np.squeeze(result) #shape:[720,1080] value:0,1result *= 255 # value:0,255#创建mask PILmask = PILImage.fromarray(result.astype(np.uint8), mode='L')#构建保存路径rgbname = os.path.basename(rgb_img_path)rgbname, _ = os.path.splitext(rgbname)depthname = os.path.basename(depth_img_path)depthname, _ = os.path.splitext(depthname)maskname = f'{rgbname}_mask.png'seg_rgbname = f'{rgbname}_seg_rgb.png'seg_depthname = f'{depthname}_seg_depth.png'#保存mask图片mask_save_path = os.path.join(save_img_path, maskname)mask.save(mask_save_path)print('mask image is saved in {}'.format(mask_save_path))#保存分割后的图片mask_img = cv2.imread(mask_save_path, 0) #以灰度图的形式读取maskseg_rgb_img = cv2.bitwise_and(rgb_img, rgb_img, mask = mask_img)seg_depth_img = cv2.bitwise_and(depth_img, depth_img, mask = mask_img)seg_rgb_save_path = os.path.join(save_img_path, seg_rgbname)seg_depth_save_path = os.path.join(save_img_path, seg_depthname)cv2.imwrite(seg_rgb_save_path, seg_rgb_img)print('rgb_seg image is saved in {}'.format(seg_rgb_save_path))cv2.imwrite(seg_depth_save_path, seg_depth_img)print('depth_seg image is saved in {}'.format(seg_depth_save_path))

3.2 运行

在这里插入图片描述

四、分割效果展示

4.1 原图

在这里插入图片描述
在这里插入图片描述

4.2 分割

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考

1.https://github.com/PaddlePaddle/PaddleSeg
2.https://github.com/PaddlePaddle/Paddle2ONNX

这篇关于PP-HumanSeg模型导出为ONNX格式并分割人像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_41994173/article/details/126185954
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/226991

相关文章

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见