计算机系统应用教程网站

网站首页 > 技术文章 正文

RVM最新AI人像抠图技术,代码已经开源

btikc 2024-09-05 12:41:00 技术文章 9 ℃ 0 评论

在计算机视觉处理中,人像抠图有着重要的意义,当然PS技术也能达到类似的效果,其实本质也是代码的实现,前2期的视频,我们使用了RVM人像抠图技术来实现人像的抠图,效果视频如下:

人工智能人像抠图来进行清华虚拟AI人华智冰抠图

实时动态视频背景抠图技术,让没有绿布的你也可以制作绿幕大片

RVM是一款功能强大的实时视频人像抠图技术,其由字节跳动项目组开发。不同于现有神经网络将每一帧作为单独图片处理,RVM使用循环神经网络,在处理视频流时有时间记忆。RVM可在任意视频上做实时高清抠像。在Nvidia GTX 1080Ti上实现4K 76FPSHD 104FPS。开源地址:

github.com/PeterL1n/RobustVideoMatting

我们可以从GitHub上下载其源代码,下载完成后,在项目文件夹里面可以建立一个test.py文件,当然在开始本代码之前需要安装如下第三方库

1

av==8.0.3

2

torch==1.9.0

3

torchvision==0.10.0

4

tqdm==4.61.1

5

pims==0.5

安装完成后,需要下载其项目预训练好的模型,当然大家可以在GitHub上面找到其分享的模型地址进行下载,其模型包含2种预训练模型:

  1. rvm_mobilenetv3.pth
  2. rvm_resnet50.pth

rvm_mobilenetv3.pth模型比较小,速度快,大家可以按照此模型进行尝试,当然,若电脑配置较高,可以使用rvm_mobilenetv3.pth模型

前面的准备工作完成后,在test.py文件中输入如下代码:

import torch
from model import MattingNetwork
from inference import convert_video
model = MattingNetwork('mobilenetv3').eval().cuda() # or "resnet50"
model.load_state_dict(torch.load('rvm_mobilenetv3.pth')) # or rvm_resnet50.pth
convert_video(
model, # The model, can be on any device (cpu or cuda).
input_source='input.mp4', # A video file or an image sequence directory.
output_type='video', # Choose "video" or "png_sequence"
output_composition='output.mp4', # File path if video; directory path if png sequence.
output_video_mbps=4, # Output video mbps. Not needed for png sequence.
downsample_ratio=None, # A hyperparameter to adjust or use None for auto.
seq_chunk=12, # Process n frames at once for better parallelism.
)

model = MattingNetwork('mobilenetv3').eval().cuda(),这里模型可以选择mobilenetv3,当然也可以选择resnet50,若电脑没有GPU,删除此行代码中的cuda()即可

torch.load('rvm_mobilenetv3.pth')加载模型文件,此模型文件需要放置在test.py文件夹的根目录中

然后使用convert_video函数便可以成功生成背景为绿色的人像抠图视频了

convert_video函数:

参数一:model为前定义的预训练模型

参数二:input_source,输入视频地址路径

参数三:output_composition,输出视频的路径地址

参数四:output_video_mbps,输出视频的mbps参数

参数五:downsample_ratio,一些超参数调整,可以配置成None,软件自动配置

参数六:seq_chunk,由于此技术具有时间记忆功能,可以同时一次处理多个视频帧来加快视频处理的速度

当然若想输出Pha通道与fgr通道

添加参数如下:

output_alpha=‘输出路径’

output_foreground=‘输出路径’

然后运行test.py,待代码运行完成后,便在设置的目录下,自动生成抠图后的效果视频

当然项目也可以按照如下方式进行抠图

from torch.utils.data import DataLoader
from torchvision.transforms import ToTensor
from inference_utils import VideoReader, VideoWriter
import cv2
reader = VideoReader('415809648-1-208.mp4', transform=ToTensor())
writer = VideoWriter('output1234.mp4', frame_rate=30)

bgr = torch.tensor([.47, 1, .6]).view(3, 1, 1)  # Green background.
rec = [None] * 4                                       # Initial recurrent states.
downsample_ratio = 0.25                               # Adjust based on your video.

with torch.no_grad():
    for src in DataLoader(reader):                     # RGB tensor normalized to 0 ~ 1.
        fgr, pha, *rec = model(src, *rec, downsample_ratio)  # Cycle the recurrent states.
        com = fgr * pha + bgr * (1 - pha)              # Composite to green background. 
        #cv2.imshow('com',com)
        writer.write(com)                              # Write frame.

当然也可以直接使用API 的方式

# Load the model.
model = torch.hub.load("PeterL1n/RobustVideoMatting", "mobilenetv3") # or "resnet50"
# Converter API.
convert_video = torch.hub.load("PeterL1n/RobustVideoMatting", "converter")

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表