PaddleSeg模型的ONNX格式部署

近期在工作时遇到项目需要用ONNX格式实现PaddleSeg模型的本地部署,在此记录供日后自己可以参考。

环境:Python3.8+RTX3060 + CUDA 11.4 + onnxruntime-GPU 1.11.0

在贴码之前,PaddleSeg转ONNX模型的输出结果是一个三维 int64数组,分别对应N, H, W,  代表每一个像素点的分类,比如我的模型只有1个分类——缺陷,那么输出的数组中,0代表这个像素点是背景,1代表是缺陷。另外注意的是,如下图维度-1代表输入ONNX的尺寸可以是任意,但在使用时还是要resize成原模型里的尺寸,否则会报错。

 

读取需要用到包,以及获取输入、输出的名字。

import numpy as np
import onnxruntime
import cv2
import time

model_path = 'output.onnx'
image_path = 'test_dp.jpg'

sess = onnxruntime.InferenceSession(model_path,providers=['CUDAExecutionProvider']) #使用GPU

input_name = sess.get_inputs()[0].name  # 'data'
outputs0 = sess.get_outputs()[0].name

图片的读取,resize与转换为RGB格式;

img = cv2.imread(image_path)
img = cv2.resize(img,(512,512))
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)

因为opencv读取图片的维度为hwc, 按照模型所需要的先转换为nchw,并对其进行normalize (mean=0.5, std=0.5),才能喂到ONNX模型中;

img = np.transpose(img,(2,0,1))  # 转为chw
input_blob = ((np.expand_dims(img,axis=0).astype(np.float32)/255.0)-0.5)/0.5 #转为nchw并归一化

运行模型,打印运算时间为0.168s,outputs0, input_name对应为自己模型的输入输出名称;

time0 = time.time()
out = sess.run([outputs0], input_feed={input_name: new_img})
time1 = time.time()
print(time1-time0)

创建空白图像、空白数组用于记录结果并显示;

res_img = np.ones((512,512,3),dtype=np.uint8) #空白图像
tmp =out[0][0]                                #输出数组

#将输出中分类为缺陷的像素点标记出来
for i in range(0,512):
    for j in range(0,512):
        if tmp[i][j] == 1:
            res_img[i][j][0] =88
            res_img[i][j][1] = 197
            res_img[i][j][2] =33

记录下来的输出结果;

将该结果与原图叠加,并显示:

 

res = cv2.addWeighted(img,0.7,res_img,0.3,0)
res_img = cv2.resize(res,(1024,800))
cv2.imshow('?',res_img)
cv2.waitKey(0)

最后是叠加出来的最后结果,检测效果还是比较理想:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以得知PaddleSeg是一个基于飞桨PaddlePaddle的图像分割套件,而ONNXRuntime是一个用于模型推理的框架。因此,我们可以使用PaddleSeg训练出语义分割模型,并将其转换为ONNX格式,然后使用ONNXRuntime在Java项目中进行部署。 以下是语义分割模型Java项目部署的步骤: 1.使用PaddleSeg训练出语义分割模型,并将其转换为ONNX格式。可以使用PaddleSeg提供的export_model.py脚本将模型转换为ONNX格式,具体命令如下: ```shell python export_model.py --config configs/quick_start/bisenet_optic_disc_512x512_1k.yml --model_path output/best_model/model.pdparams --save_dir ./onnx_model --opset_version 11 ``` 其中,--config指定了训练时使用的配置文件,--model_path指定了训练得到的模型参数文件,--save_dir指定了转换后的ONNX模型保存路径,--opset_version指定了ONNX的版本号。 2.在Java项目中使用ONNXRuntime加载模型并进行推理。可以使用ONNXRuntime提供的Java API来加载模型并进行推理,具体代码如下: ```java import ai.onnxruntime.*; import java.nio.file.Paths; public class SegmentationModel { private OrtEnvironment env; private OrtSession session; private OrtSession.Result output; public SegmentationModel(String modelPath) throws Exception { env = OrtEnvironment.getEnvironment(); session = env.createSession(Paths.get(modelPath)); } public float[] predict(float[] input) throws Exception { OrtSession.Result inputTensor = session.getInput("input"); inputTensor.use(input, new long[]{1, 3, 512, 512}); output = session.run(new String[]{"output"}); float[] result = output.get(0).asFloatArray(); return result; } public void close() throws Exception { output.close(); session.close(); env.close(); } } ``` 其中,OrtEnvironment是ONNXRuntime提供的环境类,用于创建会话和释放资源。OrtSession是会话类,用于加载模型和进行推理。OrtSession.Result是推理结果类,用于获取模型的输出。predict方法用于进行推理,input参数是输入数据,result参数是输出数据。 3.将Java项目打包为可执行jar文件。可以使用Maven或Gradle等构建工具将Java项目打包为可执行jar文件。 4.在命令行中运行Java项目。可以使用以下命令在命令行中运行Java项目: ```shell java -jar segmentation-model.jar ``` 其中,segmentation-model.jar是Java项目打包后的jar文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值