一键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,一经查实,立即删除!

相关文章

银行贷款逾期还款流程的功能测试详解

银行贷款在未能按照约定的还款日期和金额进行还款时&#xff0c;即被视为逾期。 一、贷款逾期处理 产生罚息&#xff1a;银行会按照借款合同中的约定&#xff0c;对逾期部分加收罚息&#xff0c;罚息力度各家银行不同&#xff0c;但通常会在原利率的基础上加收一定比例。 影响…

运用函数:素数的判定

题目&#xff1a;编写函数&#xff0c;参数是个正整数n&#xff0c;如果它是个素数&#xff0c;返回1&#xff0c;否则返回0. 这种“判断一个事物是否具有某种性质”的函数还具有一个学术名称——谓词&#xff08;predicate&#xff09; #define _CRT_SECURE_NO_WARNINGS #in…

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

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

阻塞队列BlockingQueue(FIFO)

一:简介 阻塞队列:从定义上来说是队列的一种,那么肯定是一个先进先出(FIFO)的数据结构。与普通队列不同的是,它支持两个附加操作,即阻塞添加和阻塞删除方法。 阻塞添加:当阻塞队列是满时,往队列里添加元素的操作将被阻塞。 阻塞移除:当阻塞队列是空时,从队列中获取…

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…

高通Android 12/13实现USB拔出关机功能

思路流程 1、监听广播->接受USB断开或者USB不充电广播->执行关机逻辑 涉及类 UsbManager/UsbDeviceManager \frameworks\base\services\usb\java\com\android\server\usb\UsbDeviceManager.java \frameworks\base\services\com\android\hardware\usb\UsbManager.java 2…

力扣刷题--2148. 元素计数【简单】

题目描述 给你一个整数数组 nums &#xff0c;统计并返回在 nums 中同时至少具有一个严格较小元素和一个严格较大元素的元素数目。 示例 1&#xff1a; 输入&#xff1a;nums [11,7,2,15] 输出&#xff1a;2 解释&#xff1a;元素 7 &#xff1a;严格较小元素是元素 2 &…

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

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

身份证号的正则表达式怎么写

在中国&#xff0c;一个标准的身份证号&#xff08;通常是18位&#xff0c;但也有旧式的15位&#xff09;包含数字和可能的校验码&#xff08;X代表数字10&#xff09;。下面是一个用于匹配这两种格式的正则表达式&#xff1a; 对于18位身份证号&#xff08;包括X作为校验码&a…

java不使用遍历下标遍历数组的方法

java有一种新型循环&#xff0c;可以不使用遍历下标就可以遍历整个数组 for(数据类型 element 数组名) { System.out.println(element); } 示例代码如下: import java.util.*; public class HelloWorld { public static void main(String[] args) { double…

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;递增或递减的排列起来…

[补题记录]LeetCode 12.整数转罗马数字

传送门&#xff1a;整数转罗马数字 转自&#xff1a;Happyyt Thought/思路 从规则第 3 3 3 点可以看出&#xff0c;一个符号最多连续 3 3 3 次&#xff0c;然后就必须要改为 小-大 的形式。 比如 9 9 9&#xff0c;不能写成 VIIII&#xff0c;要写成 IX。 那么对于一个…

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…