在打算机视觉处理中,人像抠图有着重要的意义,当然PS技能也能达到类似的效果,实在实质也是代码的实现,前2期的视频,我们利用了RVM人像抠图技能来实现人像的抠图,效果视频如下:
人工智能人像抠图来进行清华虚拟AI人华智冰抠图
实时动态视频背景抠图技能,让没有绿布的你也可以制作绿幕大片
RVM是一款功能强大的实时视频人像抠图技能,其由字节跳动项目组开拓。不同于现有神经网络将每一帧作为单独图片处理,RVM利用循环神经网络,在处理视频流时有韶光影象。RVM可在任意视频上做实时高清抠像。在Nvidia GTX 1080Ti上实现4K 76FPS和HD 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种预演习模型:
rvm_mobilenetv3.pthrvm_resnet50.pthrvm_mobilenetv3.pth模型比较小,速率快,大家可以按照此模型进行考试测验,当然,若电脑配置较高,可以利用rvm_mobilenetv3.pth模型
前面的准备事情完成后,在test.py文件中输入如下代码:
import torchfrom model import MattingNetworkfrom inference import convert_videomodel = MattingNetwork('mobilenetv3').eval().cuda() # or "resnet50"model.load_state_dict(torch.load('rvm_mobilenetv3.pth')) # or rvm_resnet50.pthconvert_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 DataLoaderfrom torchvision.transforms import ToTensorfrom inference_utils import VideoReader, VideoWriterimport cv2reader = 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")