前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用上 RNN,这个视频抠像工具效果绝了

用上 RNN,这个视频抠像工具效果绝了

作者头像
HyperAI超神经
发布2021-11-12 09:53:03
1.2K0
发布2021-11-12 09:53:03
举报
文章被收录于专栏:HyperAI超神经HyperAI超神经

内容导读

本文为字节跳动团队发布的视频抠像工具 RVM 代码解析及论文《Robust High-Resolution Video Matting with Temporal Guidance》概要。

视频抠像,把人物从动态画面中抠除,用于进一步替换背景或其他用途。看似是专业拍摄才用得上的工具,但在有些场景里的确派得上大用处。

快捷、高效的视频抠像有多重要?这一点,今年《披荆斩棘的哥哥》的后期团队一定深有体会。

近期,字节跳动的论文 《Robust High-Resolution Video Matting with Temporal Guidance 》被 WACV 2022 收录,官方 GitHub 库于近期以 GPL-3.0 许可证开源。

RVM 项目开放线上公开测试

此次开源的 RVM 项目专为稳定人物视频抠像设计,可在任意视频上做实时高清抠像。不同于现有神经网络将每一帧作为单独图片处理,RVM 使用循环神经网络,在处理视频流时有时间记忆。

经测试,RVM 支持在 Nvidia GTX 1080Ti 上实现 4K 76FPS 和 HD 104FPS。

此研究项目的团队来自字节跳动。

项目 GitHub https://github.com/PeterL1n/RobustVideoMatting

项目论文 https://arxiv.org/abs/2108.11515

墙内 Colab

https://openbayes.com/console/open-tutorials/containers/oqv42tbd8ko

模型核心:RNN

RVM 的网络架构包括:

- 特征提取编码器:提取单帧特征;

- 循环解码器:综合时间信息;

- 深度引导滤波(DGF)模块:高分辨率采样。

值得注意的是,模型在内部将高分辨率输入缩小做初步的处理,然后再放大做细分处理。所以建议用户设置 downsample_ratio 使缩小后的分辨率维持在 256 到 512 像素之间。

另外,正因为此模型基于循环神经网络(Recurrent Neural Network),所以必须按顺序处理视频每帧,并提供网络循环记忆。

多框架支持

项目成员非常贴心,模型分别基于 MobileNetV3、ResNet50 实现,还支持了PyTorch、TorchHub、TorchScript、ONNX、TensorFlow、TensorFlow.js、CoreML 等主流框架。

PyTorch

- 载入模型

代码语言:javascript
复制
import torch
from model import MattingNetwork
model = MattingNetwork(variant='mobilenetv3').eval().cuda() # 或 variant="resnet50"
model.load_state_dict(torch.load('rvm_mobilenetv3.pth'))

- 推断循环(完整实例)

代码语言:javascript
复制
from torch.utils.data import DataLoader
from torchvision.transforms import ToTensor
from inference_utils import VideoReader, VideoWriter

reader = VideoReader('input.mp4', transform=ToTensor())
writer = VideoWriter('output.mp4', frame_rate=30)

bgr = torch.tensor([.47, 1, .6]).view(3, 1, 1).cuda()  # 绿背景
rec = [None] * 4                                       # 初始记忆

with torch.no_grad():
    for src in DataLoader(reader):
        fgr, pha, *rec = model(src.cuda(), *rec, downsample_ratio=0.25)  # 将上一帧的记忆给下一帧
        writer.write(fgr * pha + bgr * (1 - pha))

- 视频转换 API

代码语言:javascript
复制
from inference import convert_video

convert_video(
    model,                           # 模型,可以加载到任何设备(cpu 或 cuda)
    input_source='input.mp4',        # 视频文件,或图片序列文件夹
    input_resize=(1920, 1080),       # [可选项] 缩放视频大小
    downsample_ratio=0.25,           # [可选项] 下采样比,若 None,自动下采样至 512px
    output_type='video',             # 可选 "video"(视频)或 "png_sequence"(PNG 序列)
    output_composition='com.mp4',    # 若导出视频,提供文件路径。若导出 PNG 序列,提供文件夹路径
    output_alpha="pha.mp4",          # [可选项] 输出透明度预测
    output_foreground="fgr.mp4",     # [可选项] 输出前景预测
    output_video_mbps=4,             # 若导出视频,提供视频码率
    seq_chunk=12,                    # 设置多帧并行计算
    num_workers=1,                   # 只适用于图片序列输入,读取线程
    progress=True                    # 显示进度条
)

TensorFlow

- 范例(Channal Last 格式)

代码语言:javascript
复制
import tensorflow as tf

model = tf.keras.models.load_model('rvm_mobilenetv3_tf')
model = tf.function(model)

rec = [ tf.constant(0.) ] * 4         # 初始记忆
downsample_ratio = tf.constant(0.25)  # 下采样率,根据视频调整

for src in YOUR_VIDEO:  # src 张量是 [B, H, W, C] 的形状,而不是 [B, C, H, W]!
    out = model([src, *rec, downsample_ratio])
    fgr, pha, *rec = out['fgr'], out['pha'], out['r1o'], out['r2o'], out['r3o'], out['r4o']

项目 GitHub https://github.com/PeterL1n/RobustVideoMatting

项目论文 https://arxiv.org/abs/2108.11515

Colab

https://openbayes.com/console/open-tutorials/containers/oqv42tbd8ko

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HyperAI超神经 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档