背景替换大模型图像处理gradio部署服务

愿我们终有重逢之时,而你还记得我们曾经讨论的话题。

 group 868373192

 second group 277356808

1. 导入库
import gradio as gr
from PIL import Image
from modelscope_studio import encode_image, decode_image, call_demo_service
import json
import os
from skimage import io
import numpy as np
  • gradio: 用于创建交互式Web界面的库。

  • PIL: Python Imaging Library,用于图像处理。

  • modelscope_studio: 自定义库,包含图像编码、解码和调用模型服务的功能。

  • json: 用于处理JSON数据。

  • os: 用于处理文件路径。

  • skimage.io: 用于读取图像。

  • numpy: 用于数值计算。

2. 定义推理函数 inference
def inference(image: Image, bk: Image) -> Image:if image is None or bk is None:return None, Noneinput_url = encode_image(image)data = {"task": "portrait-matting","inputs": [input_url],"urlPaths": {"inUrls": [{"value": input_url,"fileType": "png","type": "image","displayType": "ImgUpload","displayProps": {"label": {"text": "原图","style": {"background": "rgba(98,74,255,0.8)","color": "#fff"}}},"validator": {"max_resolution": "3000*3000","max_size": "10M"},"name": "","title": ""}],"outUrls": [{"outputKey": "output_img","type": "image"}]}}model_id = 'cv_unet_image-matting'result = call_demo_service(path='damo', name=model_id, data=json.dumps(data))print(result)res_url = result['data']['output_img']res_img = io.imread(res_url)alpha = res_img[:, :, 3:4] / 255.0w, h = image.sizebk = bk.resize((w, h))combine_img = image * alpha + bk * (1 - alpha)combine_img = combine_img.astype(np.uint8)return res_img, combine_img
  • 功能: 该函数接收两张图像(人像和背景),使用模型对输入的人像进行抠图,然后将抠图结果与背景图像进行合成,生成新的图像。

  • 步骤:

    1. 检查输入: 确保输入图像不为空。

    2. 图像编码: 将输入图像编码为URL。

    3. 构建请求数据: 构建包含任务类型、输入图像URL等信息的JSON数据。

    4. 调用模型服务: 使用call_demo_service函数调用模型服务进行抠图。

    5. 读取结果: 从模型服务返回的结果中获取抠图结果的URL,并读取该图像。

    6. 处理图像: 提取抠图结果的Alpha通道,调整背景图像大小,将抠图结果与背景图像合成。

    7. 返回结果: 返回抠图结果和合成后的新图像。

3. 定义Gradio界面
css_style = "#fixed_size_img {height: 240px;} " \"#overview {margin: auto;max-width: 400px; max-height: 400px;}"title = "一键人像抠图换背景"
description = "输入一张人像照片和背景图,本空间能生成抠图结果,并进行换背景,一键穿越!欢迎使用!"
examples = [[os.path.dirname(__file__) + 'input1.jpg', os.path.dirname(__file__) + 'bk1.jpg'],[os.path.dirname(__file__) + 'input2.jpg', os.path.dirname(__file__) + 'bk2.jpg'],[os.path.dirname(__file__) + 'input3.jpg', os.path.dirname(__file__) + 'bk3.jpg']]with gr.Blocks(title=title, css=css_style) as demo:gr.HTML('''<div style="text-align: center; max-width: 720px; margin: 0 auto;"><divstyle="display: inline-flex;align-items: center;gap: 0.8rem;font-size: 1.75rem;"><h1 style="font-family:  PingFangSC; font-weight: 500; font-size: 36px; margin-bottom: 7px;">一键人像抠图换背景</h1>       ''')gr.Markdown(description)with gr.Row():img_input1 = gr.Image(label="人像", type="pil", elem_id="fixed_size_img")img_output1 = gr.Image(label="抠图", type="pil", elem_id="fixed_size_img")with gr.Row():img_input2 = gr.Image(label="背景", type="pil", elem_id="fixed_size_img")img_output2 = gr.Image(label="新图", type="pil", elem_id="fixed_size_img")with gr.Row():btn_submit = gr.Button(value="一键抠图换背景", elem_id="blue_btn")# btn_clear = gr.Button(value="清除")examples = gr.Examples(examples=examples, inputs=[img_input1, img_input2], outputs=[img_output1, img_output2])btn_submit.click(inference, inputs=[img_input1, img_input2], outputs=[img_output1, img_output2])demo.launch()
  • 功能: 创建一个Gradio界面,允许用户上传人像和背景图像,并展示抠图结果和合成后的新图像。

  • 界面元素:

    • 标题: 显示“一键人像抠图换背景”。

    • 描述: 显示功能的简要说明。

    • 输入框: 用户上传人像和背景图像。

    • 输出框: 显示抠图结果和合成后的新图像。

    • 按钮: 用户点击按钮后,调用inference函数进行抠图和合成。

    • 示例: 提供一些示例图像供用户参考。

4. 启动Gradio界面
demo.launch()
  • 功能: 启动Gradio界面,用户可以在浏览器中访问并使用该工具。

总结

该代码实现了一个基于Gradio的Web界面,用户可以通过上传人像和背景图像,使用预训练的模型进行人像抠图,并将抠图结果与背景图像合成,生成新的图像。界面简洁直观,适合用于展示和体验人像抠图换背景的功能。

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

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

相关文章

Nginx SSL+tomcat,使用request.getScheme() 取到https协议

架构上使用了 Nginx tomcat 集群, 且nginx下配置了SSL,tomcat no SSL,项目使用https和http协议。 发现 request.getScheme() //总是 http&#xff0c;而不是实际的http或https request.isSecure() //总是false&#xff08;因为总是http&#xff09; request.getRemoteAddr(…

[Redis] Redis服务集群

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

期权懂|上证50ETF期权的交易时间是什么时候?

期权小懂每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 上证50ETF期权的交易时间是什么时候&#xff1f; 一、开盘集合竞价时间‌&#xff1a; 上午9:15至9:25。在这段时间内&#xff0c;投资者可以提交或撤销委托&#xff0c;但不会立…

FPGA 第7讲 简单组合逻辑译码器

时间&#xff1a;2024.11.15 一、学习内容 1.译码器 译码是编码的逆过程&#xff0c;在编码时&#xff0c;每一种二进制代码&#xff0c;都赋予了特定的含义&#xff0c;即都表示了一个确定的信号或者对象。把代码状态的特定含义翻译出来的过程叫做译码&#xff0c;实现译码操…

jmeter常用配置元件介绍总结之断言

系列文章目录 安装jmeter jmeter常用配置元件介绍总结之断言 9.断言9.1.响应断言9.2.JSON断言9.3.大小断言9.4.JSON JMESPath Assertion9.5.断言持续时间9.6.MD5Hex断言9.7.XPath断言9.8.XPath2 Assertion 9.断言 检查测试中得到的响应数据结果是否符合预期 9.1.响应断言 功…

莱特币转型MEME币:背后隐含的加密市场现象

随着加密市场的风云变幻&#xff0c;莱特币&#xff08;LTC&#xff09;这款曾经的“老牌矿币”近日以自嘲式推文宣布“自己是一个MEME币”&#xff0c;迅速引发了市场的广泛关注和一波围绕MEME币的炒作浪潮。这一举动看似玩笑&#xff0c;却反映出当前加密市场的一种微妙转变&…

【网页设计】CSS3 进阶(动画篇)

1. CSS3 2D 转换 转换&#xff08;transform&#xff09;是CSS3中具有颠覆性的特征之一&#xff0c;可以实现元素的位移、旋转、缩放等效果 转换&#xff08;transform&#xff09;你可以简单理解为变形 移动&#xff1a;translate旋转&#xff1a;rotate缩放&#xf…

系统架构设计师:软件架构的演化和维护

软件架构一般会经历初始设计、实际使用、修改完善和退化弃用的过程&#xff0c;其中修改完善的过程实际上就是软件架构的演化和维护过程&#xff0c;演化和维护的目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等。 软件架构的演化和维护过程是一个不断…

如何在 Ubuntu 上安装 Jupyter Notebook

本篇文章将教你在 Ubuntu 服务器上安装 Jupyter Notebook&#xff0c;并使用 Nginx 和 SSL 证书进行安全配置。 我将带你一步步在云服务器上搭建 Jupyter Notebook 服务器。Jupyter Notebook 在数据科学和机器学习领域被广泛用于交互式编码、可视化和实验。在远程服务器上运行…

IoT [remote electricity meter]

IoT [remote electricity meter] 物联网&#xff0c;远程抄表&#xff0c;电表数据&#xff0c;举个例子

使用ivew-ui-plus 的Submit组件踩坑 injection “LoginInstance“ not found 记录 问题原因分析与解决方案

问题描述: 在下面这个页面中 注册按钮使用了view-ui-plus的Submit组件 结果控制台报错 runtime-core.esm-bundler.js:257 Uncaught TypeError: Cannot read properties of undefined (reading handleSubmit)at Proxy.handleSubmit (viewuiplus.min.esm.js:32610:26)at callW…

力扣 LeetCode 1047. 删除字符串中的所有相邻重复项(Day5:栈与队列)

解题思路&#xff1a; 方法一&#xff1a;栈 class Solution {public String removeDuplicates(String s) {Deque<Character> stack new ArrayDeque<>();for (char c : s.toCharArray()) {if (stack.isEmpty() || stack.peek() ! c) stack.push(c);else stack.p…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

网络IP地址会经常换吗?深入解析与实操指南

在互联网的生态系统中&#xff0c;IP地址&#xff08;Internet Protocol Address&#xff09;是每台连接设备的唯一标识符&#xff0c;它在网络通信中起着至关重要的作用。然而&#xff0c;不少用户观察到自己的IP地址有时会发生变化&#xff0c;这引发了诸多疑问。本文旨在详细…

AI测试的主要研究方向介绍

随着AI技术的不断进步和应用场景的日益广泛&#xff0c;如何确保人工智能系统的可靠性和安全性&#xff0c; 变得日益重要。人工智能测试作为保障AI系统质量的关键环节&#xff0c;也随着AI技术不断向前发展。本文将介绍当前AI测试的主要研究方向&#xff0c;以期为大家提供一个…

Python3中str和bytes

参考文章&#xff1a;浅析Python3中的bytes和str类型 - Chown-Jane-Y - 博客园 Python 3最重要的新特性之一是对字符串和二进制数据流做了明确的区分。文本总是Unicode&#xff0c;由str类型表示&#xff0c;二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str…

比特币前景再度不明,剧烈波动性恐即将回归

比特币市场降温&#xff0c;波动性增加 自特朗普赢得美国总统大选以来&#xff0c;比特币市场的投机狂热有所降温&#xff0c;现货和衍生品市场的活跃度开始减弱。比特币在上周五跌破87000美元&#xff0c;较之前创下的历史高点低了约6500美元。这一变化受到美联储主席鲍威尔讲…

node对接ChatGpt的流式输出的配置

node对接ChatGpt的流式输出的配置 首先看一下效果 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联…

esp32c3安装micropython环境

esp32c3竟然支持micropython环境&#xff0c;真的太让人高兴了。主要是python开发比较友好&#xff0c;开发速度要快于C和C&#xff0c; 可以用来快速创意验证。 下载 首先到官网&#xff1a;MicroPython - Python for microcontrollers 点击“download”进入下载页面&#…