轻量级人像分割深度学习模型PP-HumanSeg树莓派部署

2023-12-28 17:10

本文主要是介绍轻量级人像分割深度学习模型PP-HumanSeg树莓派部署,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

人像分割是图像分割领域的高频应用,PaddleSeg推出在大规模人像数据上训练的人像分割系列模型PP-HumanSeg,包括超轻量级模型PP-HumanSeg-Lite,满足在服务端、移动端、Web端多种使用场景的需求。本项目将PP-HumanSeg-Lite模型转为onnx并部署到树莓派,实现人像抠图效果。效果如下图所示(这里只露个半脸):

目录

一、介绍

          硬件

 软件

二、具体流程

1、克隆PaddleSeg仓库

2、安装paddleseg

3、下载预训练模型

4、导出静态图模型

5、ONNX转换

6、移动模型的路径

7、预测代码

三、树莓派运行

四、问题解答

五、参考链接


一、介绍

本项目将PaddleSeg的轻量级人像分割模型转换为onnx,将其部署到树莓派实现实时人像分割。树莓派环境如下:

硬件:

树莓派4B/4G
摄像头一个

 软件

Ubuntu Desktop 21.10
onnxruntime
opencv-python

二、具体流程

1、克隆PaddleSeg仓库

%cd ~/
!git clone https://gitee.com/PaddlePaddle/PaddleSeg.git

2、安装paddleseg

!pip install paddleseg

3、下载预训练模型

%cd ~/PaddleSeg/contrib/PP-HumanSeg
!python pretrained_model/download_pretrained_model.py

4、导出静态图模型

导出静态图模型的时候,需要加上input_shape参数,本项目部署的模型是PP-HumanSeg-Lite,该模型的输入图片大小是192x192,如果要部署其他模型,需要更改model_path和config路径。

(为什么导出静态图模型?答:paddlepaddle在训练时可以使用动态图模型很方便的完成模型组网,完成训练模型的任务,但是动态图预测速度比静态图差,为了加快推理速度,可以将动态图转换为静态图。)

%cd ~/PaddleSeg/contrib/PP-HumanSeg
!python ../../export.py \
--config configs/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely.yml \
--model_path pretrained_model/fcn_hrnetw18_small_v1_humanseg_192x192/model.pdparams \
--save_dir export_model/fcn_hrnetw18_small_v1_humanseg_192x192 \--with_softmax  --input_shape 1 3 192 192

5、ONNX转换

将paddlepaddle静态图模型转换为onnx,方便后续的树莓派部署。

# ① 安装paddle2onnx
!pip install paddle2onnx 
# ② 转换为onnx
%cd ~/PaddleSeg/contrib/PP-HumanSeg
! paddle2onnx --model_dir ./export_model/fcn_hrnetw18_small_v1_humanseg_192x192/ \--model_filename model.pdmodel \--params_filename model.pdiparams \--save_file onnx_model/model.onnx \--opset_version 12

6、移动模型的路径

为了部署到树莓派,仅保留必要的文件,创建pp_humanseg_deploy文件夹,模型路径是~/pp_humanseg_deploy,文件夹目录结构如下:
|-onnx_model
|---model.onnx
|-predict.py   ---- 这个文件下一步生成

%cd ~/
!mkdir pp_humanseg_deploy
%cd ~/pp_humanseg_deploy/
!mkdir onnx_model
!cp ~/PaddleSeg/contrib/PP-HumanSeg/onnx_model/model.onnx ~/pp_humanseg_deploy/onnx_model

7、预测代码

按照上一步的目录结构,创建predict.py文件,将以下代码放入其中。

下方代码包含预处理和模型预测2个部分,其中预处理部分需要和PaddleSeg的预处理相同。

import cv2
import numpy as np
import onnxruntime as rtdef normalize(im, mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]):im = im.astype(np.float32, copy=False) / 255.0im -= meanim /= stdreturn imdef 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_sizeh = target_sizeim = cv2.resize(im, (w, h), interpolation=interp)return imdef 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 imagedef display_masked_image(mask, image, color_map=[255, 0, 0], weight=0.6):mask = mask > 0c1 = 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_resultonnx_model_path = 'onnx_model/model.onnx'
sess = rt.InferenceSession(onnx_model_path)
input_name = sess.get_inputs()[0].name
label_name = sess.get_outputs()[0].nametarget_size = (192, 192)cap_video = cv2.VideoCapture(0)
if not cap_video.isOpened():raise IOError("Error opening video stream or file.")while cap_video.isOpened():ret, raw_frame = cap_video.read()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)if cv2.waitKey(1) & 0xFF == ord('q'):breakelse:break
cap_video.release()

三、树莓派运行

将~/pp_humanseg_deploy文件夹打包,放入树莓派环境运行predict.py,效果如下:

 四、问题解答

1、为什么图片看起来很模糊?

这里使用的模型是pp-humanseg-lite,该模型的输入像素是192x192,在树莓派部署 时,先将480x640的图片resize到192x192送入模型预测,再将预测结果resize到480x640,所以图片看起来模糊。

2、为什么转换为onnx?

也可以在树莓派安装paddlepaddle环境,然后使用paddlepaddle来实现推理功能。此处转换为onnx是考虑到个人的树莓派内存有限,并未安装过多的包。

3、如何训练自己的人像分割模型?

参考PaddleSeg

五、参考链接

onnx模型导出AiStudio参考链接

这篇关于轻量级人像分割深度学习模型PP-HumanSeg树莓派部署的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

如何在Ubuntu 24.04上部署Zabbix 7.0对服务器进行监控

《如何在Ubuntu24.04上部署Zabbix7.0对服务器进行监控》在Ubuntu24.04上部署Zabbix7.0监控阿里云ECS服务器,需配置MariaDB数据库、开放10050/1005... 目录软硬件信息部署步骤步骤 1:安装并配置mariadb步骤 2:安装Zabbix 7.0 Server

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现