一键AI抠图,证件照换背景,可部署成自己的应用

1 开发背景

AI抠图技术已经非常成熟,并且有效果非常好的开源模型。 日常中可以用于替换证件照背景

但是网上许多的证件照替换背景 竟然需要收费

鉴于此,便将目前最好的(SOTA)开源抠图模型 BRIA Background Removal v1.4 Model 进行部署

也可以直接体验部署好的应用

点击链接体验应用

 

2 项目内容

  1. 展示如何配置环境,这种配置环境的方法是所有项目通用的,配置一次就可以,做到一劳永逸

  2. 展示如何调用模型,进行背景的抠去和背景颜色的替换

  3. 最后展示了如何将该项目 部署成一个应用,这个应用比较简单,也是具有教学意义

3 配置环境

In [ ]

# 配置环境(第一次运行次项目的时候配置即可,之后无需安装)# 安装包
!mkdir /home/aistudio/external-libraries
!pip install  onnxruntime scikit-image -i https://mirrors.aliyun.com/pypi/simple/ \-t /home/aistudio/external-libraries

In [1]

# 设置环境变量 (每次重新进入此项目或者重启内核后,都要执行此代码)# 在py文件里面运行环境
import sys 
sys.path.append('/home/aistudio/external-libraries')# 在ipynb里面运行环境
import os
os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '')  + ':/home/aistudio/external-libraries'

4 定义remove background的函数

In [2]

# 在py文件里面运行环境
import sys 
sys.path.append('/home/aistudio/external-libraries')# 在ipynb里面运行环境
import os
os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '')  + ':/home/aistudio/external-libraries'import onnxruntime as ort
import cv2
import numpy as np
from PIL import Image, ImageDraw
import re
from skimage import ioclass BriaRMBG_ONNX:def __init__(self, model_path):self.session = ort.InferenceSession(model_path)def __call__(self, input_tensor):input_name = self.session.get_inputs()[0].nameoutputs = self.session.run(None, {input_name: input_tensor})return outputsdef preprocess_image(im: np.ndarray, model_input_size: list) -> np.ndarray:if len(im.shape) < 3:im = cv2.cvtColor(im, cv2.COLOR_GRAY2BGR)  # 将灰度图像转换为BGR格式im = cv2.resize(im, model_input_size, interpolation=cv2.INTER_LINEAR)  # 调整图像大小im = im.astype(np.float32)  # 将图像数据类型转换为float32im /= 255.0  # 归一化到[0, 1]范围mean = [0.5, 0.5, 0.5]std = [1.0, 1.0, 1.0]im -= meanim /= stdreturn im[np.newaxis, :, :, :]def postprocess_image(result: np.ndarray, im_size: list) -> np.ndarray:result = result[0]  # 移除batch维度ma = np.max(result)mi = np.min(result)result = (result - mi) / (ma - mi)  # 归一化到[0, 1]范围result = (result * 255).astype(np.uint8)  # 将数据类型转换回uint8result = cv2.resize(result, [im_size[1], im_size[0]], interpolation=cv2.INTER_LINEAR)  # 调整图像大小return resultdef add_background_to_image(input_image_path, output_image_path, background_color, out_size=None):"""给透明背景的PNG人像图像添加任意颜色的背景。:param input_image_path: 输入图像的路径:param output_image_path: 输出图像的路径:param background_color: 背景颜色 (R, G, B):param size: 输出图像的大小 (width, height) 默认与输入图像相同"""# 打开输入图像image = Image.open(input_image_path)# 如果图像不是PNG格式,先转换为PNGif image.format != 'PNG':image = image.convert('RGBA')if out_size is None:out_size = image.sizeimageout_image = Image.new('RGB', image.size, background_color)out_image.paste(image, (0,0), image)out_image.resize(out_size)# 保存新的图像out_image.save(output_image_path)def rmbg(input_image_path,  background_color, out_size_w, out_size_h, size_opt):if size_opt == "保持原图大小":shape = cv2.imread(input_image_path).shapeout_size = (int(shape[0]),int(shape[1]))else:out_size = (int(out_size_w), int(out_size_h))match = re.search(r'^(.+/)([^.]+)(\..+)$', input_image_path) # 使用正则表达式找到图片名称和扩展名path, filename, ext = match.groups() # 获取组:路径、文件名、扩展名new_filename = filename + "_rmgb" + ext # 修改文件名out_path = path + new_filename # 抠图new_filename = filename + "_bg" + extoutput_image_path = path + new_filename # 证件照net = BriaRMBG_ONNX(f"/home/aistudio/rmbg/onnx/model.onnx" )# prepare inputmodel_input_size = [1024,1024]orig_im = io.imread(input_image_path)orig_im_size = orig_im.shape[0:2]image = preprocess_image(orig_im, model_input_size)image = np.transpose(image, (0, 3, 1, 2))  # ONNX通常需要CHW格式# inferenceresult = net(image)# post processresult_image = postprocess_image(result[0][0], orig_im_size)# save resultpil_im = Image.fromarray(result_image)no_bg_image = Image.new("RGBA", pil_im.size, (0,0,0,0))orig_image = Image.open(input_image_path)no_bg_image.paste(orig_image, mask=pil_im)no_bg_image.save(out_path)print(background_color, out_size)add_background_to_image(out_path, output_image_path, background_color, out_size)return out_path, output_image_path

5 调用函数进行抠图

In [3]

import cv2
import matplotlib.pyplot as plt# 输入图片的路径
input_img = '/home/aistudio/rmbg/photo/wj.png'# 证件照的背景颜色
# color = "#FFFFFF" # 白色(用于护照、签证、身份证等)
color = "#438EDB" # 蓝色(用于毕业证、工作证等)
# color = "#FF0000" # 红色(用于一些特殊的证件照)# 证件照的大小
width = 295
height = 413  # 一寸(295像素 x 413像素)# 是否保持原图大小 
# size_opt = "不保持原图大小"
size_opt = "保持原图大小" # 如果选了这个会保持输入图片的大小,忽略上面的 证件照的大小 参数# color, width, height 这三个参数不影响抠图,只会影响证件照的结果
out_path, output_image_path = rmbg(input_img, color, width, height, size_opt)print('抠图后的图片: ', out_path)
print('证件照: ', output_image_path)
#438EDB (1024, 1596)
抠图后的图片:  /home/aistudio/rmbg/photo/wj_rmgb.png
证件照:  /home/aistudio/rmbg/photo/wj_bg.png

6 结果展示

In [4]

# 展示图片from PIL import Image
import matplotlib.pyplot as plt# print('原图')
image_input = Image.open(input_img)# print('抠图后的图片')
image_rmbg = Image.open(out_path)# print('证件照')
image_bg = Image.open(output_image_path)# 设定图片显示的大小
fig, axs = plt.subplots(3, 1, figsize=(5, 15))# 在每个子图上显示一张图片
axs[0].imshow(image_input)
axs[0].axis('off')  # 不显示坐标轴
axs[0].set_title(' original')axs[1].imshow(image_rmbg)
axs[1].axis('off')  # 不显示坐标轴
axs[1].set_title(' remove background')axs[2].imshow(image_bg)
axs[2].axis('off')  # 不显示坐标轴
axs[2].set_title('with background')# 调整子图之间的间距
plt.tight_layout()# 显示画布
plt.show()

<Figure size 500x1500 with 3 Axes>

7 部署自己的应用

应用的代码我已经写好了 /home/aistudio/untitled.gradio.py

直接点击右上角的“部署” 即可,步骤如下


分割线

图片1

 

图片2

 

图片3

 

图片4

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

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

相关文章

前端Vue自定义带加减按钮的数字输入框组件的设计与实现

随着前端技术的不断发展&#xff0c;开发的复杂度日益提升。传统的整块应用开发方式在面对小改动或小功能增加时&#xff0c;常常需要修改大量代码&#xff0c;导致整个系统的逻辑受到影响。为了解决这个问题&#xff0c;组件化开发成为了前端开发的必然趋势。 一、组件化开发…

GPT-4o:新一代人工智能技术的全方位解析引言

目录 &#x1f40b;引言 &#x1f40b;梳理 GPT 各版本之间的内容 &#x1f988;GPT-1&#xff1a;开创性的起点 &#x1f988; GPT-2&#xff1a;参数规模的大幅提升 &#x1f988; GPT-3&#xff1a;参数爆炸与多任务学习 &#x1f988;GPT-4&#xff1a;进一步提升的智…

pdf拆分成有图和无图的pdf(方便打印)

pdf拆分成有图和无图的pdf(方便打印) 原因 打印图片要彩印&#xff0c;每次都要手动弄&#xff0c;打印的时候很麻烦&#xff1b; 随着打印次数的增加&#xff0c;时间就越来越多 为解决此问题&#xff0c;使用python写一个exe解决这个问题 历程 找一个python的GUI界面找到 t…

每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符

杭电2156.分数矩阵 原题链接&#xff1a;Problem - 2156 题目描述 Problem Description&#xff1a;我们定义如下矩阵: 1/1 1/2 1/3 1/2 1/1 1/2 1/3 1/2 1/1 矩阵对角线上的元素始终是1/1&#xff0c;对角线两边分数的分母逐个递增。请求出这个矩阵的总和。 Input&#xf…

一套为家政服务行业开发的移动应用程序——家政上门服务app源码 家政上门服务系统源码

家政上门服务系统是一种通过互联网或移动应用平台&#xff0c;为用户提供在线预约、下单、支付和评价家政服务的系统。该系统整合了家政服务资源&#xff0c;使用户能够便捷地找到合适的服务人员&#xff0c;同时也为家政服务人员提供了更多的工作机会。 工作内容 操持家务、护…

Flink CDC - Postgres

1&#xff09;部署安装Postgres服务 jiangzhongzhouZBMac-C02CW08SM ~ % docker pull postgres Using default tag: latest latest: Pulling from library/postgres latest: Pulling from library/postgres 24c63b8dcb66: Pull complete 2bb0b7dbd861: Pull complete ... D…

mac 安装java jdk8 jdk11 jdk17 等

oracle官网 https://www.oracle.com/java/technologies/downloads/ 查看当前电脑是英特尔的x86 还是arm uname -m 选择指定版本&#xff0c;指定平台的安装包&#xff1a; JDK8 JDK11的&#xff0c;需要当前页面往下拉&#xff1a; 下载到的安装包&#xff0c;双击安装&#x…

怎么使用Python代码在图片里面加文字

在Python中&#xff0c;给图片添加文字可以使用Pillow库&#xff08;PIL的一个分支&#xff09;&#xff0c;它是一个强大的图像处理库。如果你还没有安装Pillow&#xff0c;可以通过pip安装&#xff1a; pip install Pillow下面使用一个简单的示例&#xff0c;演示如何使用Pi…

TCP的重传机制

TCP 是一个可靠的传输协议&#xff0c;解决了IP层的丢包、乱序、重复等问题。这其中&#xff0c;TCP的重传机制起到重要的作用。 序列号和确认号 之前我们在讲解TCP三次握手时&#xff0c;提到过TCP包头结构&#xff0c;其中有序列号和确认号&#xff0c; 而TCP 实现可靠传输…

数据分析案例一使用Python进行红酒与白酒数据数据分析

源码和数据集链接 以红葡萄酒为例 有两个样本: winequality-red.csv:红葡萄酒样本 winequality-white.csv:白葡萄酒样本 每个样本都有得分从1到10的质量评分&#xff0c;以及若干理化检验的结果 #理化性质字段名称1固定酸度fixed acidity2挥发性酸度volatile acidity3柠檬酸…

Lesson6--排序(初级数据结构完结篇)

【本节目标】 1. 排序的概念及其运用 2. 常见排序算法的实现 3. 排序算法复杂度及稳定性分析 1.排序的概念及其运用 1.1排序的概念 排序 &#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来…

Thread的stop和interrupt的区别

Thread.stop Thread.stop()方法已被废弃。 因为本质上它是不安全的&#xff0c;使用该方法可能会导致数据、资源不一致的问题&#xff0c; public class ThreadDemo {static class MyThread extends Thread {Overridepublic void run() {while (true) {try {Thread.sleep(10…

解决Windows 10通过SSH连接Ubuntu 20.04时的“Permission Denied”错误

在使用SSH连接远程服务器时&#xff0c;我们经常可能遇到各种连接错误&#xff0c;其中“Permission denied, please try again”是较为常见的一种。本文将分享一次实际案例的解决过程&#xff0c;帮助你理解如何排查并解决这类问题。 问题描述 在尝试从Windows 10系统通过SS…

面试题 17.05. 字母与数字(前缀和)

给定一个放有字母和数字的数组&#xff0c;找到最长的子数组&#xff0c;且包含的字母和数字的个数相同。 返回该子数组&#xff0c;若存在多个最长子数组&#xff0c;返回左端点下标值最小的子数组。若不存在这样的数组&#xff0c;返回一个空数组。 示例 1: 输入: ["…

openssl 常用命令demo

RSA Private Key的结构&#xff08;ASN.1&#xff09; RSAPrivateKey :: SEQUENCE { version Version, modulus INTEGER, -- n publicExponent INTEGER, -- e privateExponent INTEGER, -- d prime1 INTEGER, -- …

嵌入式人工智能开发:基于TensorFlow Lite和OpenCV的实时姿态估计算法实现

文章目录 引言环境准备人工智能在嵌入式系统中的应用场景代码示例常见问题及解决方案结论 1. 引言 在嵌入式系统中集成人工智能&#xff08;AI&#xff09;技术已经成为一种重要的发展方向。实时姿态估计是AI在嵌入式领域的一个高级应用&#xff0c;能够在资源受限的环境中实…

海外动态IP代理可以用来批量注册邮箱吗?

无论是个人还是企业&#xff0c;都需要使用邮箱进行沟通、注册账号、接收通知等多种用途。然而&#xff0c;由于互联网服务商为了防止滥用和垃圾邮件的传播&#xff0c;通常对注册邮箱设置了一定的限制&#xff0c;如IP限制、验证码验证等。为了解决这些问题&#xff0c;海外动…

GPT LoRA 大模型微调,生成猫耳娘

往期热门专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用&#xff1b;手写框架等Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、VueJava微服务实战Java 微服务实战&#xff0c;Spring Cloud Netflix套件、Spring Cloud Alibaba套件、Seata、gateway、shadingjdbc…

关于ida如何进行远程linux调试(详解)

首先我们需要安装工具软件VMware虚拟机和finalshell&#xff0c;并在虚拟机中安装centos 7系统&#xff0c;还要将finalshell连接到该系统中&#xff0c;具体操作可以去b站搜黑马Linux学习&#xff0c;学完该课程的p5&#xff0c;p6&#xff0c;p8即可&#xff0c;我接下来讲的…

[Linux]vsftp配置大全---超完整版

[Linux]vsftp配置大全---超完整版 以下文章介绍Liunx 环境下vsftpd的三种实现方法 一、前言 Vsftp(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器&#xff0c;目前已经被许多大型站点所采用&#xff0c;如ftp.redhat.com,ftp.kde.org,ftp.gnome.org.等。…