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格式并分割人像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/226991

相关文章

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)

《Java导入、导出excel用法步骤保姆级教程(附封装好的工具类)》:本文主要介绍Java导入、导出excel的相关资料,讲解了使用Java和ApachePOI库将数据导出为Excel文件,包括... 目录前言一、引入Apache POI依赖二、用法&步骤2.1 创建Excel的元素2.3 样式和字体2.

java导出pdf文件的详细实现方法

《java导出pdf文件的详细实现方法》:本文主要介绍java导出pdf文件的详细实现方法,包括制作模板、获取中文字体文件、实现后端服务以及前端发起请求并生成下载链接,需要的朋友可以参考下... 目录使用注意点包含内容1、制作pdf模板2、获取pdf导出中文需要的文件3、实现4、前端发起请求并生成下载链接使

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使