图像抠图技术,即图像蒙版技术,其核心目标是精确计算图像中每个像素的透明度或alpha值,以确定像素属于前景还是背景的比例。这项技术在多种应用中都非常常见,包括图像和视频编辑,它允许创建逼真的合成图像,将一个图像中的对象无缝集成到另一个图像中,同时保留如头发或皮毛等复杂细节。高级图像抠图技术通常涉及使用机器学习模型和深度学习算法来提高抠图过程的准确性。这些模型分析图像的视觉特征,包括颜色、纹理和光照,以有效估计alpha值并分离前景和背景元素。
ViTMatte是Transformers库中的最新成员,是一个为图像抠图设计的最先进的模型。ViTMatte利用视觉变换器(ViT)作为其核心,辅以轻量级解码器,使其能够区分如单根头发这样的细节。本文将深入探讨ViTMatte模型,并提供使用代码的逐步指南。
ViTMatte的架构建立在视觉变换器(ViT)之上,这是模型的核心。这种设计的关键优势在于核心能够处理繁重的工作,从大规模自监督预训练中获益,从而在图像抠图方面实现高性能。ViTMatte的关键贡献如下:
ViTMatte继承了ViT的多种特性,包括多样的预训练策略、简化的架构设计和可适应的推理策略。
让深入了解ViTMatte的实际应用。将逐步介绍如何使用ViTMatte来利用其能力。首先需要设置环境,安装包含ViTMatte模型的Transformers库。以下是安装代码:
!pip install -q git+https://github.com/huggingface/transformers.git
在图像抠图中,手动标记一个称为trimap的提示图,其中白色代表前景,黑色代表背景,灰色代表未知区域。ViTMatte模型需要输入图像和trimap来执行图像抠图。以下是加载图像及其对应trimap的代码示例:
import matplotlib.pyplot as plt
from PIL import Image
import requests
# 加载图像和trimap
url = "https://github.com/hustvl/ViTMatte/blob/main/demo/bulb_rgb.png?raw=true"
image = Image.open(requests.get(url, stream=True).raw).convert("RGB")
url = "https://github.com/hustvl/ViTMatte/blob/main/demo/bulb_trimap.png?raw=true"
trimap = Image.open(requests.get(url, stream=True).raw)
# 显示图像和trimap
plt.figure(figsize=(15, 15))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.subplot(1, 2, 2)
plt.imshow(trimap)
plt.show()
接下来,将加载ViTMatte模型及其处理器。处理器负责图像预处理,而模型本身是图像抠图的核心。以下是加载处理器和模型的代码:
from transformers import VitMatteImageProcessor, VitMatteForImageMatting
# 加载处理器和模型
processor = VitMatteImageProcessor.from_pretrained("hustvl/vitmatte-small-distinctions-646")
model = VitMatteForImageMatting.from_pretrained("hustvl/vitmatte-small-distinctions-646")
现在已经设置了图像、trimap和模型,让运行一个前向传递来预测alpha值。这些alpha值代表图像中每个像素的透明度。这意味着有了模型和处理器,现在可以执行一个前向传递来获得预测的alpha值,代表图像中每个像素的透明度。
import torch
# 执行前向传递
with torch.no_grad():
outputs = model(pixel_values)
# 提取alpha值
alphas = outputs.alphas.flatten(0, 2)
为了可视化前景对象,可以使用以下代码,它根据预测的alpha值从图像中裁剪前景:
import PIL
from torchvision.transforms import functional as F
# 定义计算前景的函数
def cal_foreground(image: PIL.Image, alpha: PIL.Image):
image = image.convert("RGB")
alpha = alpha.convert("L")
alpha = F.to_tensor(alpha).unsqueeze(0)
image = F.to_tensor(image).unsqueeze(0)
foreground = image * alpha + (1 - alpha)
foreground = foreground.squeeze(0).permute(1, 2, 0).numpy()
return foreground
# 计算并显示前景
fg = cal_foreground(image, prediction)
plt.figure(figsize=(7, 7))
plt.imshow(fg)
plt.show()
图像抠图的一个令人印象深刻的用途是用新背景替换现有背景。以下代码展示了如何将预测的alpha蒙版与新背景图像合并:
# 加载新背景图像
url = "https://github.com/hustvl/ViTMatte/blob/main/demo/new_bg.jpg?raw=true"
background = Image.open(requests.get(url, stream=True).raw).convert("RGB")
plt.imshow(background)
# 定义与新背景合并的函数
def merge_new_bg(image, background, alpha):
image = image.convert('RGB')
bg = background.convert('RGB')
alpha = alpha.convert('L')
image = F.to_tensor(image)
bg = F.to_tensor(bg)
bg = F.resize(bg, image.shape[-2:])
alpha = F.to_tensor(alpha)
new_image = image * alpha + bg * (1 - alpha)
new_image = new_image.squeeze(0).permute(1, 2, 0).numpy()
return new_image
# 与新背景合并
new_image = merge_new_bg(image, background, prediction)
plt.figure(figsize=(7, 7))
plt.imshow(new_image)
plt.show()
完整的代码可以在这里找到,不要忘记关注GitHub。这是图像抠图的强大补充,使准确估计图像和视频中的前景对象变得更加容易。像ZOOM这样的视频会议可以使用这项技术有效地移除背景。
ViTMatte是图像抠图领域的突破性补充,使准确估计图像和视频中的前景对象变得前所未有地容易。通过利用预训练的视觉变换器,ViTMatte提供了结果。通过遵循本文概述的步骤,可以利用ViTMatte的能力进行更好的图像抠图,并探索如背景替换等创意应用。无论是开发者、研究人员还是对计算机视觉的最新进展感兴趣,ViTMatte都是一个有价值的工具。
Q1: 什么是图像抠图?它为什么重要? A1: 图像抠图是准确估计图像和视频中前景对象的过程。这对于应用、视频通话中的背景模糊和肖像摄影至关重要。