Stable Diffusion 模特换装 蒙版一键批量提取

news2024/9/29 13:20:15

有没有想过可以使用算法批量提取图片中模特的服装,然后通过SD进行换装。

一个一个的PS抠图是不是太累,可以使用算法批量提取。相对于 Segment Anything 方法这个比较简单。

在这里插入图片描述

文章目录

  • 蒙版批量提取
  • SD换装

蒙版批量提取

import os

from tqdm import tqdm
from PIL import Image
import numpy as np

import warnings

warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=DeprecationWarning)

import torch
import torch.nn.functional as F
import torchvision.transforms as transforms

from data.base_dataset import Normalize_image
from utils.saving_utils import load_checkpoint_mgpu

from networks import U2NET

device = "cuda"

image_dir = "input_images"
result_dir = "output_images"
mask_dir = "output_mask"
checkpoint_path = os.path.join("trained_checkpoint", "cloth_segm_u2net_latest.pth")
do_palette = True


def get_palette(num_cls):
    """Returns the color map for visualizing the segmentation mask.
    Args:
        num_cls: Number of classes
    Returns:
        The color map
    """
    n = num_cls
    palette = [0] * (n * 3)
    for j in range(0, n):
        lab = j
        palette[j * 3 + 0] = 0
        palette[j * 3 + 1] = 0
        palette[j * 3 + 2] = 0
        i = 0
        while lab:
            palette[j * 3 + 0] |= ((lab >> 0) & 1) << (7 - i)
            palette[j * 3 + 1] |= ((lab >> 1) & 1) << (7 - i)
            palette[j * 3 + 2] |= ((lab >> 2) & 1) << (7 - i)
            i += 1
            lab >>= 3
    return palette


transforms_list = []
transforms_list += [transforms.ToTensor()]
transforms_list += [Normalize_image(0.5, 0.5)]
transform_rgb = transforms.Compose(transforms_list)

net = U2NET(in_ch=3, out_ch=4)
net = load_checkpoint_mgpu(net, checkpoint_path)
net = net.to(device)
net = net.eval()

palette = get_palette(4)

images_list = sorted(os.listdir(image_dir))
pbar = tqdm(total=len(images_list))
for image_name in images_list:
    img = Image.open(os.path.join(image_dir, image_name)).convert("RGB")
    image_tensor = transform_rgb(img)
    image_tensor = torch.unsqueeze(image_tensor, 0)

    output_tensor = net(image_tensor.to(device))
    output_tensor = F.log_softmax(output_tensor[0], dim=1)
    output_tensor = torch.max(output_tensor, dim=1, keepdim=True)[1]
    output_tensor = torch.squeeze(output_tensor, dim=0)
    output_tensor = torch.squeeze(output_tensor, dim=0)
    output_arr = output_tensor.cpu().numpy()

    output_img = Image.fromarray(output_arr.astype("uint8"), mode="L")
    if do_palette:
        output_img.putpalette(palette)
    output_img.save(os.path.join(result_dir, image_name[:-3] + "png"))

    pbar.update(1)

pbar.close()

from PIL import Image

dir_list = os.listdir(result_dir)

for n in dir_list:
    # 打开图片文件
    im = Image.open(result_dir + '/' + n)
    # 转换为RGB模式
    im = im.convert('RGB')
    # 获取像素矩阵
    pixels = im.load()
    # 遍历每个像素点
    for i in range(im.size[0]):
        for j in range(im.size[1]):
            # 判断当前像素是否为黑色
            if pixels[i, j] == (0, 0, 0):
                pass
            else:
                # 将黑色像素点转换为白色F
                pixels[i, j] = (255, 255, 255)
    # 保存修改后的图片

    im.save(os.path.join(mask_dir, str(n)[:-3] + "png"))

这部分代码用途将input_images下面所有的模特进行抠图,预处理的图片保存到output_images下。

在这里插入图片描述
然后通过计算的方式将其处理成mask黑白蒙版图。
在这里插入图片描述

SD换装

打开SD页面中的img2img中的Inpaint upload。把模特的原图和蒙版上传。

在这里插入图片描述
填写关键词生成就可以拉。

在这里插入图片描述
就是这么简单,如果自己有兴趣可以做一个批量处理脚本,然后自己选图就可以了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/730360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前台测试,工程督导及5G网络优化工程师的区别具体在哪里?

什么是通信? 北邮版《通信原理》教材的第一句话是--通信乃是互通信息。 其实&#xff0c;这句话就说出了通信的本质&#xff0c;通信的目标就是如何让世界的任何人在任何时间&#xff0c;任何地点都进行信息的互通。 大到卫星&#xff0c;小到SIM卡&#xff0c;通信技术覆盖于…

OpenCV实现一张图片的特定区域上添加另一张图片

#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv;int main( ){Mat image= imread

Vite是如何实现Esbuild打包的

前面文章说过&#xff08;Vite如何实现秒级依赖预构建的能力&#xff09;&#xff0c;在 Vite 依赖预构建的底层实现中&#xff0c;大量地使用到了 Esbuild 这款构建工具&#xff0c;实现了比较复杂的 Esbuild 插件功能和技巧。接下来&#xff0c;我就来带你揭开 Vite 预构建神…

【JVM进阶】JVM看这一篇就够了(类加载器、垃圾回收、JVM调优、内存泄漏、CPU飙高)

文章目录 1、JVM组成1.1、JVM组成及运行流程1.2、程序计数器什么是程序计数器&#xff1f; 1.3、Java堆你能给我详细的介绍Java堆吗? 1.4、虚拟机栈什么是虚拟机栈垃圾回收是否涉及栈内存&#xff1f;栈内存分配越大越好吗&#xff1f;方法内的局部变量是否线程安全&#xff1…

spring boot学习之自定义starter启动器

starter启动器的目标 引入maven包即可自动装配配置&#xff0c;个人理解&#xff0c;如jdbc引入即可操作数据库 实现 1新建springboot工程编写实现类 2编写配置类 3配置 4打包 4新建工程引入使用

【Linux】进程信号之信号的保存

进程信号 二 一、信号的保存1、信号其他相关常见概念2、信号在内核中表示3、系统内核中信号集sigset_t类型介绍 二、信号集操作函数1、sigset_t 类型的操作函数2、关于block表的系统调用3、关于pending表的系统调用 三、结语 一、信号的保存 1、信号其他相关常见概念 实际执行…

1、vscode+cmake c++环境配置

文章目录 1、安装2、开发环境 关于vscode c环境的配置&#xff0c;应该有两种一种是vscodec/c插件&#xff0c;另一种是vscodecmake插件&#xff0c;第一种没太多用过&#xff0c;感觉就像python那样&#xff0c;要写相关配置文件&#xff0c;有自己的一套规则&#xff1b;另一…

【雕爷学编程】Arduino动手做(155)---2262/2272四键无线遥控套件模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

ISO接口隔离

IIC为例 为什么需要隔离—隔离电路 隔离电性干扰&#xff0c;增强抗干扰能力&#xff0c;保护隔离总线iic确保系统的稳定型和可靠性。【通过我们强大的I2C缓冲转换器、I/O扩展器和交换机组合&#xff0c;简化您的I2C总线并减少通信错误。这些器件具有宽电压范围和小型工业标准…

手写操作系统--读写硬盘操作

以下图片均来自王道考研视频我们先来看看硬盘的结构&#xff1a; 这是物理图上的磁盘构造。 一个盘片被分成一个个的磁道。 在划分一下就会出现我们的扇区&#xff0c;每个扇区的大小是固定的&#xff0c;一般来说是512个字节。最内侧的扇区面积小&#xff0c;因此数据密度就密…

c++11 标准模板(STL)(std::basic_istream)(一)

定义于头文件 <istream> template< class CharT, class Traits std::char_traits<CharT> > class basic_istream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_istream 提供字符流上的高层输入支持。受支持操作包含带格式…

C#核心知识回顾——11.各数据集合的汇总区分、委托、事件、匿名函数

变量: 无符号 byte正8位 ushort正16位 uint正32位 ulong正64位 有符号 sbyte8位 short16位 int32位 long64位 浮点数 float double decimal 特殊 char bool string 复杂数据容器: 枚举enum 结构体struct 数组(一维、二维、交错) [] [,] [][] 类 数据集合&#xff1a;…

ChatGPT 提示词设置

提示词 Prompt&#xff08;提示词&#xff09;&#xff1a;当我们询问GPT时&#xff0c;发送的消息就是Prompt。 通过给出合适的Prompt&#xff0c;可以让GPT了解我们的想法&#xff0c;在根据我们的想法做出更加合适的判断&#xff0c;帮助我们完成任务&#xff0c;提高效率。…

Oracle存储过程的使用DEMO(一)

文章目录 Oracle存储过程的使用DEMO&#xff08;一&#xff09;1. Oracle中块的使用2. IF使用2.1 IF...ELSE...2.2 IF嵌套 3. CASE...WHEN...4. LOOP5. WHILE6. FOR Oracle存储过程的使用DEMO&#xff08;一&#xff09; 1. Oracle中块的使用 DECLAREI NUMBER; BEGINSELECT EM…

Obfuscar的使用

1、在程序中nuget安装Obfuscar 2、在工程中新建Obfuscar.xml文件&#xff0c;内容如下 <?xml version1.0?> <Obfuscator><!-- 输入的工作路径&#xff0c;采用如约定的 Windows 下的路径表示法&#xff0c;如以下表示当前工作路径 --><!-- 推荐使用当前…

【Spring】项目创建和使用

一、Spring 的概念 Spring : 包含众多工具方法的 IoC 容器。 Spring 的核心 &#xff1a;IoC &#xff08;控制反转&#xff09;&#xff0c; DI (依赖注入)。 loC &#xff08;Inversion of Control&#xff09;翻译成中文就是 “控制反转” 的意思&#xff0c;控制反转一种…

嵌入式QT- QT使用MQTT

目录 一、MQTT介绍 二、MQTT概念 2.1 订阅(Subscribtion) 2.2 会话&#xff08;Session&#xff09; 2.3 主题名&#xff08;Topic Name&#xff09; 2.4 主题筛选器&#xff08;Topic Filter&#xff09; 2.5 消息订阅 三、MQTT中的角色 3.1 客户端 3.2 服务器 四、X86平…

2.1.cuda驱动API-概述

目录 前言1. Driver API概述总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记 本次课程学习精简 CUDA 教程-Driver API 概述 课程大纲可看下…

【UE】点击场景中的物体生成介绍标签

效果 步骤 首先创建一个控件蓝图添加如下控件 给水平框控件添加了一段动画&#xff0c;让该控件显示2秒钟&#xff0c;然后在2~3秒间位置上移并且不透明度减少 在图表中播放动画&#xff0c;延迟3秒后移除控件蓝图 在玩家控制的Pawn中添加如下节点 首先由“由通道检测线条”节…

基于Swing的校园管理系统

1 引言 1.1项目背景 我校积极举办组织学生参加各级各种科技、文艺、体育等校园文化活动&#xff0c;寓思想品德教育于生动活泼、形象具体的校园文化活动中。由于学校各级通讯不太方便&#xff0c;活动筹备过程中&#xff0c;无论是活动参与者的报名、观众的报名还是组织者的…