【UE4】复杂背景人像抠图-飞浆AI-paddlepaddle深度训练模型

2023-11-16

前言:运用到Python3.7,UEC++,蓝图;实现复杂背景人物使用PaddleHub深度训练模型进行抠像后在UE中使用(纯色背景人物仅材质就可实现)使用到的训练模型:deeplabv3p_xception65_humanseg


1.准备工作:

  • 安装Python3.7或者使用Anaconda套件进行安装(python3.7对应版本如图)
  • 安装Anaconda所有选项请全勾选(即使有红字提示)
  • 使用cmd验证是否安装成功:
    python
  • 使用pip install xxx进行所需模块的安装
  • 后续如遇到错误修复注意事项:
    //如在运行过程中命令行报错,尝试使用以下几种方法在cmd中解决:
    
    //1.模块xxx缺少(ModuleNotFoundError: No module named xxx)
    pip install xxx
    
    //2.模块xxx版本错误(如错误提示:xxx>=或>或<=或<x.x.x)
    pip install xxx>=x.x.x
    
    //3.模块xxx需要更新
    pip install xxx --upgrade

    2.编写py,bat,vbs代码并解决后续错误:

  • 1.py(C:/imgcut/1.py):

#!/usr/bin/env python
# coding: utf-8

#请使用ipython运行:ipython 1.py IMGname

#安装 paddlehub 库
get_ipython().system('pip install paddlehub==1.6.0 -i https://pypi.tuna.tsinghua.edu.cn/simple')
# 安装deeplabv3p_xception65_humanseg模型
get_ipython().system('hub install deeplabv3p_xception65_humanseg==1.0.0')

import sys
import paddlehub as hub
import matplotlib.image as mpimg
get_ipython().run_line_magic('matplotlib', 'inline')

module = hub.Module(name="deeplabv3p_xception65_humanseg")#预加载图像分割模型
test_img_path = ["./" + str(sys.argv[1])]#["./t6.png"] #传入图片名
input_dict = {"image": test_img_path}

# 执行模型分割方法展示结果
results = module.segmentation(data=input_dict)#根据图像分割模型对jpg进行分割
print(results)
  • run.bat(C:/imgcut/run.bat):

cd /d C:/imgcut/&&ipython 1.py t10.png
  • Run.vbs(C:/imgcut/Run.vbs)://便于UE中调用后台运行

    Set objShell = WScript.CreateObject("WScript.Shell")
    objShell.Run "C:\imgCut\Run.bat", 0,true
    

    此时cmd运行bat中的命令会报错,以下开始解决问题:

  1. pip install ipython

  安装好ipython,且根据warnning提示路径,复制Scripts文件夹,配置环境变量path新增ipython文件夹路径 

 2.提示缺少模块:

pip install 模块名

(安装命令如:pip install paddle)

(此时再报错如:No Moudle named 'common',请逐步进行安装所需的模块,再执行安装paddle模块,以此重复)

(如提示缺少 paddle.fluid 模块请执行: pip install paddlepaddle)
(如提示缺少 git 模块请执行: pip install gitpython)

 3.提示DLL load failed:找不到指定的模块。

此处提示导入core_avx失败:
ImportError: DLL load failed: 找不到指定的模块。
Error: Can not import avx core while this file exists: C:\Users\666\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\paddle\fluid\core_avx.pyd
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)

--进入python37安装目录:
复制Python37\site-packages\paddle\libs中的所有Dll文件
粘贴到:Python37\site-packages\paddle\fluid文件夹 

 4.错误提示JSONDecodeError: Expecting value: line 1 column 1 (char 0):

手动import paddlehub发现失败,是因为paddlepaddle并没有安装正确

So重新安装anaconda3,使用pip再次安装paddlepaddle==2.2.0


安装paddlepaddle:
1、手动下载whl:
https://mirror.baidu.com/pypi/packages/a1/c2/7809f9f170232611855ac857fbbc8bec26d63858e0ec1634afed6d2d931c/paddlepaddle_gpu-2.3.1-cp37-cp37m-win_amd64.whl
2、打开次文件进行安装

(如遇到下载whl文件失败时都可如此手动进行下载安装)

5.下载某个模块后安装仍然失败

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn --user 加你想要下载的模块

6.安装paddlehub模块时失败

错误为某些模块版本不兼容,重新安装提示的版本模块带--upgrade,拒绝访问加上参数--user即可:

如:ERROR:huggingface-hub 0.8.1 has requirement packaging>=20.9,butxxxxxxxxxxx

解决:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-host pypi.tuna.tsinghua.edu.cn --user --upgrade packaging>=20.9

解决所有错误问题后运行测试成功,图片输出到humanseg_output文件夹:

 3.创建UEC++项目并编写代码及控件蓝图:

  • 项目Build.cs中添加模块"ImageWrapper":
  • 创建新的蓝图函数库PYBPF类继承自BlueprintLibrary

PYBPF.h中:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "Engine/Texture2D.h"
#include "PYBPF.generated.h"

/**
 * 
 */
UCLASS()
class NEWOPENCV_API UPYBPF : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
	

public:
	UFUNCTION(BlueprintCallable,Category = "BPF")//处理图片
	static void CutIMG(FString batCommand,bool& cuted);

	UFUNCTION(BlueprintCallable)//获取图片
	static UTexture2D* GetIMG(FString path, bool& IsValid, int& Width, int& Height);
	
};

PYBPF.cpp中:

// Fill out your copyright notice in the Description page of Project Settings.


#include "PYBPF.h"
#include "Runtime/Core/Public/HAL/FileManager.h"
#include "Runtime/Core/Public/Misc/FileHelper.h"
#include "IImageWrapper.h"
#include "IImageWrapperModule.h"
#include "Kismet/KismetStringLibrary.h"

const FString vbsPath = FString("C:/imgcut/Run.vbs");
const FString batPath = FString("C:/imgcut/run.bat");

void UPYBPF::CutIMG(FString batCommand, bool& cuted)
{
	FString unuse,pngname;
	UKismetStringLibrary::Split(batCommand," ",unuse, pngname,ESearchCase::IgnoreCase,ESearchDir::FromEnd);
	UKismetStringLibrary::Split(pngname,".", pngname, unuse,ESearchCase::IgnoreCase,ESearchDir::FromEnd);
	FString imgpath = "C:/imgcut/humanseg_output/"+ pngname + ".png";
	if (FPaths::FileExists(imgpath))
	{
		cuted = true;
		return;
	}
	cuted = false;
	//写入文本到bat文件
	FFileHelper::SaveStringToFile(batCommand, *batPath);
	
	//等待0.2秒
	FPlatformProcess::Sleep(0.2f);
	//执行vbs文件
	//FString cmd = TEXT("wscript.exe ");
	//FPlatformProcess::CreateProc(*cmd,*vbsPath, true, false, false, nullptr, 0, nullptr, nullptr);
	FPlatformProcess::LaunchFileInDefaultExternalApplication(*vbsPath);
}

UTexture2D* UPYBPF::GetIMG(FString path,bool& IsValid,int& Width,int& Height)
{
	IsValid = false;
	UTexture2D* LoadedT2D = NULL;

	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::PNG);

	TArray<uint8> RawFileData;
	FFileHelper::LoadFileToArray(RawFileData, *path);
	
	if (ImageWrapper.IsValid() && ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()))
	{
		TArray<uint8> UncompressedBGRA;
		if (ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA))
		{
			LoadedT2D = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);
			
			Width = ImageWrapper->GetWidth();
			Height = ImageWrapper->GetHeight();

			void* TextureData = LoadedT2D->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
			FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num());
			LoadedT2D->PlatformData->Mips[0].BulkData.Unlock();

			LoadedT2D->UpdateResource();
			if (LoadedT2D == nullptr)
			{return NULL;}
		}
	}
	// Success!
	IsValid = true;
	return LoadedT2D;
}
  • 编译打开项目;创建新的用户控件:

  •  创建空白关卡;编辑关卡蓝图,开始运行时创建控件到视口:

 空白地图可自己添加个背景

 4.运行UE项目输入指定图片处理效果:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【UE4】复杂背景人像抠图-飞浆AI-paddlepaddle深度训练模型 的相关文章

  • Pandas apply 与 np.vectorize 从现有列创建新列的性能

    我正在使用 Pandas 数据框 并希望创建一个新列作为现有列的函数 我还没有看到关于之间速度差异的很好的讨论df apply and np vectorize 所以我想我会在这里问 熊猫apply 功能很慢 根据我的测量 在一些实验中如下
  • 具有多处理功能的 Python 代码无法在 Windows 上运行

    以下简单的绝对初学者代码在 Ubuntu 14 04 Python 2 7 6 和 Cygwin Python 2 7 8 上运行 100 但在 Windows 64 位 Python 2 7 8 上挂起 我使用另一个片段观察到了同样的情况
  • python导入模块时如何避免一直写模块名?

    我用math最近模块很多 我不想写math sqrt x and math sin x 每时每刻 我想缩短它并写sqrt x and sin x How 对于较长的模块名称 通常会缩短它们 例如 import numpy as np 然后您
  • Python 中的安全解除引用

    Groovy 有一个很好的安全取消引用运算符 这有助于避免 NullPointerExceptions variable method The method仅当以下情况时才会被调用variable is not null 有没有办法在 Py
  • conda 无法从 yml 创建环境

    我尝试运行下面的代码来从 YAML 文件创建虚拟 Python 环境 我在 Ubuntu 服务器上的命令行中运行代码 虚拟环境名为 py36 当我运行下面的代码时 我收到下面的消息 环境也没有被创建 这个问题是因为我有几个必须使用 pip
  • 如何在 ReportLab 段落中插入回车符?

    有没有办法在 ReportLab 的段落中插入回车符 我试图将 n 连接到我的段落字符串 但这不起作用 Title Paragraph Title n Page myStyle 我想要这样做 因为我将名称放入单元格中 并且想要控制单元格中的
  • 如何找到列表S的所有分区为k个子集(可以为空)?

    我有一个唯一元素列表 比方说 1 2 我想将其拆分为 k 2 个子列表 现在我想要所有可能的子列表 1 2 1 2 2 1 1 2 我想分成 1 1 2 我怎样才能用 Python 3 做到这一点 更新 我的目标是获取 N 个唯一数字列表的
  • 使用 Scipy imsave 将 Numpy 数组保存到图像时保留未更改的数据

    使用 Scipy 保存二维 Numpy 数组 单个值 时toimage or imsave像素值与 Numpy 数组中的像素值不完全匹配 相反 在某些区域 主要是边缘 图像算法似乎使用某种插值 是否有一个选项可以停止插值并保留准确的数据 例
  • Python 正则表达式部分匹配或“hitEnd”

    我正在编写一个扫描器 因此我将任意字符串与正则表达式规则列表进行匹配 如果我可以模拟 Java hitEnd 功能 不仅知道正则表达式何时不匹配 还知道何时匹配 这将非常有用 can t匹配 当正则表达式匹配器在决定拒绝输入之前到达输入末尾
  • 网页抓取 - 前往第 2 页

    如何访问数据集的第二页 无论我做什么 它都只返回第 1 页 import bs4 from urllib request import urlopen as uReq from bs4 import BeautifulSoup as sou
  • 在 matplotlib 中使用 yscale('log') 时缺少误差线

    在某些情况下 当使用对数刻度时 matplotlib 会错误地显示带有误差条的图 假设这些数据 例如在 pylab 内 s 19 0 20 0 21 0 22 0 24 0 v 36 5 66 814250000000001 130 177
  • 为什么“return self”返回 None ? [复制]

    这个问题在这里已经有答案了 我正在尝试获取链的顶部节点getTopParent 当我打印出来时self name 它确实打印出了父实例的名称 然而 当我回来时self 它返回 None 为什么是这样 class A def init sel
  • 从 IMDbPy 结果中的片目中获取电影 ID

    我正在尝试创建一个数据集 允许我根据 Python IMDb API 中的演员 ID 和电影 ID 加入演员和电影 现在 我正在尝试从演员的电影作品中提取电影 ID 列表 但无法做到 例如 我知道 Rodney Dangerfield 在
  • Django 接受 AM/PM 作为表单输入

    我试图弄清楚如何使用 DateTime 字段在 Django 中接受 am pm 作为时间格式 但我遇到了一些麻烦 我尝试在 forms py 文件中这样设置 pickup date time from DateTimeField inpu
  • 为什么 bot.get_channel() 会产生 NoneType?

    我正在制作一个 Discord 机器人来处理公告命令 当使用该命令时 我希望机器人在特定通道中发送一条消息 并向用户发送一条消息以表明该命令已发送 但是 我无法将消息发送到频道 我尝试了这段代码 import discord import
  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • 在 Python 的 Textmate 中突出显示尾随空格?

    我想做类似的事情this http remysharp com 2008 03 30 trailing white space in textmate Textmate 提示 这样当我在 Python 中编写代码时 尾随空白总是以某种方式突
  • 如何使用Featuretools按列值从单个数据框中的多个列创建特征?

    我正在尝试根据之前的结果来预测足球比赛的结果 我在 Windows 上运行 Python 3 6 并使用 Featuretools 0 4 1 假设我有以下代表结果历史记录的数据框 原始数据框 https i stack imgur com
  • 在Python中从日期时间中减去秒

    我有一个 int 变量 它实际上是秒 让我们调用这个秒数X 我需要得到当前日期和时间 以日期时间格式 减去的结果X秒 Example If X是 65 当前日期是2014 06 03 15 45 00 那么我需要得到结果2014 06 03
  • 从数据集的给定日期范围中提取属于一天的数据

    我有一个数据集 日期范围为 2018 年 1 月 12 日到 8 月 3 日 其中包含一些值 维数为my df数据框是 my df shape 9752 2 每行包含半小时频率 第一行开始于2018 01 12 my df iloc 0 D

随机推荐

  • VMware上pfsense开源防火墙的下载、安装、简单配置

    文章目录 1 pfsense概述 1 1 官方描述 1 2 个人描述 2 pfsense下载 2 1 官网下载 3 pfsense安装 3 1 官网手册 3 2 安装步骤 4 pfsense配置 4 1 默认账号密码 4 2 初始化配置 4
  • PyTorch学习笔记(三)PyTorch回归问题——分类问题

    PyTorch学习笔记 三 PyTorch回归问题 分类问题 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 一 pandas是什么 示例 pandas 是基于NumPy 的一种工具 该工具是为了
  • 性能测试的基本流程

    1 性能测试需求分析 项目经理 业务 架构专家 产品经理 高级性能测试工程师 开发经理 2 性能测试计划 高级性能测试工程师 项目经理 架构师 产品经理 3 性能测试准备 性能测试工程师 外部支持 网络工程师 系统管理员 测试服务器和被测试
  • 记录——企业课Python-科学计算(只学了Numpy、pandas和matplotlib.pyplot中的一些基础)

    一学期一次的企业课 大好的周末在机房度过 三个周日一个周六 感觉听的讲起来还不如自己看CSDN 顺带吐槽一下这个老师的评分 自己敲了一天整天最后得分82 同学复制粘贴过去87 更有甚者32学时课程结束 复制过来的代码连环境都没有都无法运行居
  • 微云存储空间多大_qq微云内存多大

    QQ微云容量最大多少 根据QQ微云官方的说法 可以达到100G 微云网盘怎么扩容 扩容方法可分为2种 一是登录QQ微云iPad版等获得额外的8G空间 二是参加每天签到活动获得额外的容量 下面就由学习啦小编为大家整理的相关信息 供大家参考 一
  • cmake构建多目录项目

    1 项目工程文件目录结构 2 源码 2 1 hello include hello h ifndef HELLOWORLD HELLO H define HELLOWORLD HELLO H extern void hello void e
  • 【Linux】【网络】应用层协议:HTTPS

    文章目录 HTTPS 1 加密方式 2 数据摘要 数据指纹 3 数字签名 HTTPS 的 工作过程 HTTPS 工作过程中的密钥 HTTP HTTPS HTTP HyperText Transfer Protocol 是客户端浏览器或其他程
  • 检测跟踪分割网络笔记

    模型247 97m GitHub SysCV pcan Prototypical Cross Attention Networks for Multiple Object Tracking and Segmentation NeurIPS
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Java-线程通信

    Java 线程通信 1 线程通信中的三个方法 wait 一旦执行此方式 当前线程就进入阻塞状态 并释放线程锁 notify 一旦执行此方法 就会唤醒被wait的一个线程 如果有多个线程被wait 就唤醒优先级高的那个线程 notifyAll
  • java swing结构,Java Swing的层次结构理解

    一 什么是Java Swing Swing 是一个用于开发Java图形界面应用程序的开发工具包 它是以抽象窗口工具包 AWT Abstract Window Toolkit 为基础 使跨平台应用程序可以使用任何可插拔的外观风格 通常把AWT
  • oracle 的 start with connect by 用法 .

    分类 oracle java 2012 11 27 17 38 489人阅读 评论 0 收藏 举报 目录 ORACLE Connect ByLevelStart With的使用Hierarchical query 层次查询 connect
  • 一张图解释什么是遗传算法_遗传算法总结(#看了就能懂和用系列#)

    Word害我重写 顺便重新整理下思路 背景 写论文时用到遗传算法 花了近一周时间 还算理解了算法以及能够进行基础的编程实现 保持谦虚 说明 具体的实现没敢细讲 主要是原理的方法上的介绍 讲解都算不上 先说说算法学习 个人觉得首先需要了解这个
  • SpringBoot--Eureka

    SpringBoot Eureka 项目一 使用Eureka注册服务 任务一 搭建Maven父工程 任务二 搭建服务端工程 任务三 搭建客户端工程 项目二 实现服务间的调用 任务一 搭建订单服务工程 任务二 编写用户服务功能 任务三 启动服
  • buuctf-loveSQL

    进入界面 没有什么明显的提示 上次有个一样界面的题目 结果直接万能密码1 1出来了 这次再试试 啥 简单的我有点不相信 睿智的我一下子就觉得不对经 去尝试一下MD5 就知道 算了 接着找吧 看题目名字 lovesql 估计还是注入 只能把目
  • lol 那个服务器最稳定,lol哪个区的人多,哪个区的技术最好?

    每日科技网 一直都有 一区的螃蟹能走位单杀打野 郊区王者打不过一区钻石 的搞笑言论 其实这个言论有一定的是事实依据 虽然有一点夸张 说的神乎其神的 电信一区艾欧尼亚在LOL中的地位是大家有目共睹的 而之所以会出现那样的畸形观点 主要呢有以下
  • js获取昨天/明天、本周/上周/下周、本月/上月、本季度/上季度、上一年的开始/结束日期

    一 获取昨天 明天的日期 该方法参数如果为true 则获取昨天日期 反之为明天日期 默认为true function getYestDayOrNextDay flag true 获取当前日期 const today new Date 计算前
  • 代码检视(一)

    一 意义 最大的意义 通过代码检视 发现问题 解决问题 并且能够有效地提升自己 最终达到写出优质代码 提高代码质量 成功做好项目 二 基本要求 一 逻辑一定要正确 逻辑错误非常容易引起BUG 二 避免一些没必要的代码 能用一句解决的就不要用
  • XMLSocket

    XMLSocket 协议是flash的长连接消息协议 XMLSocket协议规则 每个 XML 消息都是一个完整的XML文档 一定要以 0 结束 html5 websocket是长连接传输的是精简的http报文 XMLSocket conn
  • 【UE4】复杂背景人像抠图-飞浆AI-paddlepaddle深度训练模型

    前言 运用到Python3 7 UEC 蓝图 实现复杂背景人物使用PaddleHub深度训练模型进行抠像后在UE中使用 纯色背景人物仅材质就可实现 使用到的训练模型 deeplabv3p xception65 humanseg 1 准备工作