最近由字节跳动开源的一套人工智能视频抠图方案火了,RVM(Robust Video Matting)专为稳定人物视频抠像设计。不同于现有神经网络将每一帧作为单独图片处理,RVM 使用循环神经网络,在处理视频流时有时间记忆。RVM 可在任意视频上做实时高清抠像。在 Nvidia GTX 1080Ti 上实现 4K 76FPS 和 HD 104FPS。目前虽没有面向大众的简易工具,但是基于 torch、onnx 和 ncnn 的模型均已放出,可见其受欢迎程度。
0. 效果截图
1. Colab 在线尝鲜
步骤主要有三步,第一步上传待处理的视频或图片;第二步:安装 Python 等环境依赖第三步:使用 Pytorch 加载模型并设置导出路径
视频处理完毕后,会在当前目录下生成三个文件。
- com.mp4:在绿幕背景上合成的抠图结果。
- pha.mp4:原始的 alpha 遮罩。
- fgr.mp4:原始前景预测。
2. 本地尝鲜
首先下载项目到本地,然后解压并进入目录,执行安装依赖环境命令:
pip install -r requirements_inference.txt
然后加载模型
import torch
from model import MattingNetwork
model = MattingNetwork('mobilenetv3').eval().cuda() # 或 "resnet50"
model.load_state_dict(torch.load('rvm_mobilenetv3.pth'))
上述步骤也可以直接从 Pytorch 直接加载模型
# 加载模型
model = torch.hub.load("PeterL1n/RobustVideoMatting", "mobilenetv3") # 或 "resnet50"
# 转换 API
convert_video = torch.hub.load("PeterL1n/RobustVideoMatting", "converter")
最后一步,视频入口及出口设置:
from inference import convert_video
convert_video(
model, # 模型,可以加载到任何设备(cpu 或 cuda)
input_source='input.mp4', # 视频文件,或图片序列文件夹
output_type='video', # 可选 "video"(视频)或 "png_sequence"(PNG 序列)
output_composition='output.mp4', # 若导出视频,提供文件路径。若导出 PNG 序列,提供文件夹路径
output_video_mbps=4, # 若导出视频,提供视频码率
downsample_ratio=None, # 下采样比,可根据具体视频调节,或 None 选择自动
seq_chunk=12, # 设置多帧并行计算
)
3. 手机端体验
可以参考该 GitHub 地址:https://github.com/FeiGeChuanShu/ncnn_Android_RobustVideoMatting
4. 速度
速度用 inference_speed_test.py
测量以供参考。
GPU | dType | HD (1920x1080) | 4K (3840x2160) |
---|---|---|---|
RTX 3090 | FP16 | 172 FPS | 154 FPS |
RTX 2060 Super | FP16 | 134 FPS | 108 FPS |
GTX 1080 Ti | FP32 | 104 FPS | 74 FPS |
5. 应用开发
目前的应用范围主要偏向专业人员,未来或许会出现更多跨终端的 GUI 视图,方便普通人开箱即用。不过该项目采用 GPL 协议,意味着商用困难,想要普通人用得起,对开发者而言没有利好,只能用爱发电。虽然 ResNet 诞生于 2015,但是近几年的论文中并未有效果显著的新模型出现,说明图像模型这块基本趋于自满状态,从 pt 文件,转到 onnx,再转到 ncnn 已经非常成熟,唯一卡住的地方就是基于 C 语言的 ncnn 编程。所以想要大众用得起的 GUI 视图,还需要打通 ncnn 到 go 版本的转换,遗憾的是目前尚未有人尝试这么做。假如有 go 版 ncnn,那么就可以很方便的使用 wails 打包跨终端的应用。