【趣味实践】自动化抠图工具——XMem的使用

前言

视频制作者可能都遇到过需要“抠图”的情况,即需要把一幅画面中的部分对象抠出来合成到另一幅画面之中。
伊利诺伊大学厄巴纳-香槟分校的研究者在ECCV 2022上提出了一个长视频目标分割算法XMem,不仅可以分割目标,还能处理超过长视频。而且,它对显存要求不高,2GB的显卡都可以带动。

论文标题:XMem: Long-Term Video Object Segmentation with an Atkinson-Shiffrin Memory Model
论文链接:https://arxiv.org/pdf/2207.07115.pdf
开源代码:https://github.com/hkchengrex/XMem

抠图方法概述

为了比较XMem的抠图效果,首先先利用视频制作者常用到的几款视频抠图工具。

这里我选取的视频素材是朋友手绘的一个游戏人物,并且它的背景五颜六色,给抠图造成了一定的难度。
素材链接:https://www.bilibili.com/video/BV1Rt4y1L7Rb

PR超级键

在PR中有个效果叫超级键,可以指定吸取某一种颜色,但是当背景颜色和人物颜色上有相似的颜色时,吸取背景色的同时会同时把人物上的颜色同时吸除,从而让人物显得发灰,如下图所示:

在这里插入图片描述

PR钢笔抠图

钢笔抠图就是对于每一帧用打点的方式进行抠出来,费时费力,效率太低,而且边缘处理较为困难,这里不再展开。

AE笔刷

AE中有个Roto笔刷工具,可以快速做到类似钢笔抠图的功能。

在这里插入图片描述
打开笔刷工具后,进入到视频图层。
按住Ctrl+鼠标左键,拖动鼠标左右可以调整笔刷大小。
按住鼠标左键涂抹可以选择前景扣出对象(绿色),按住Alt+鼠标左键涂抹可以选择背景。

在这里插入图片描述
不过该方法仍然不够精准,特别是在这个动漫人物上。

智能抠图网站

经过搜索,查阅到一些AI智能抠图网站,这里以unscreen网站为例,上传视频稍等片刻即可。

在这里插入图片描述
可以看到即便没指定画面的主体,算法自动得将人物抠出来了,不过边缘仍然有背景色的残留。并且如果不指定画面的主体的话,对于多对象的扣离任务可能会产生问题。

综上,现有的一些抠图方式各有优劣,都无法快速完美实现需求。

XMem理论简述

下面轮到主角XMem算法了,先简单看看该算法的原理。

该算法的Overview如下图所示:

在这里插入图片描述

该算法将内存分成三部分:瞬时内存、工作内存、长期内存(受到人脑三部分记忆:瞬时记忆、短期记忆和长期记忆的启发)

其中,瞬时内存会每帧更新一次,来记录画面中的图像信息。工作内存从瞬时内存中收集画面信息,每r帧更新一次。当工作内存饱和时,它会被压缩转移到长期内存里。当长期内存也饱和(数千帧)时,会随着时间推移忘记过时的特征。

更进一步,XMem处理每一帧画面的过程如下:

在这里插入图片描述

整个算法由3个end to end的网络组成。
第一个查询编码器(Query encoder)用来追踪提取查询特定图像特征,经过一系列处理之后,将信息传入到第二个解码器(Decoder)中,生成对象掩码。最后一个值编码器(Value encoder)将图像和目标的掩码相结合,从而来提取新的内存特征值,添加到工作内存中。

在论文中,作者将XMem算法和其他JOINT、AFB-URR、STCN等算法进行对比,可以看到在不同长度的视频帧中,XMem均取得了不错的效果。

在这里插入图片描述

XMem实践上手

下面到了快乐的实践环节。
克隆代码,配置环境不再赘述。
作者提供了多套模型,这里只需要下载下图所示的三个,如果下载麻烦,可以在博文最后使用我备份的下载链接。
模型下载需要创建一个saves文件夹,并将模型放置其中。

在这里插入图片描述
之后,在终端输入:

python interactive_demo.py --video video/demo.mp4 --num_objects 4

这里的video指向输入的视频路径,num_objects是对象数量,这里使用的是作者提供的一段视频。
如果运行不报错,会弹出下方这个可视化界面。

在这里插入图片描述
该算法基本属于半监督学习,需要引入人为先验信息,因此需要先在前几帧通过点击对象进行标注,标注之后点击Forward Propagate进行前向推理,稍等片刻,算法会对每一帧画面进行处理。

移动下面的蓝色小标,可以预览每一帧处理结果,也可以手动进行调整。

在这里插入图片描述

处理完之后,算法会生成一个workspace文件夹,对于每一个视频包含两个文件夹,第一个包含视频每一帧的图片画面,第二个包含视频每一帧的遮罩。

在这里插入图片描述
该算法并不能直接输出带透明通道的视频,因此可以利用PR进行后续处理。

在PR中,先按图片顺序导入轨道,再调整持续时间合成视频。
之后将mask的红色区域用超级键进行吸除,这样和原图像画面叠加,得到目标对象。
然后利用颜色替换功能,将黑色背景替换为绿色(该颜色须为扣离对象中并不包含的颜色),再加一个超级键吸取绿色,这样就得到了想要的透明背景的目标对象。
在这里插入图片描述

效果演示

下面来看抠图之后的效果,视频中使用了另一个图像补帧算法,将在下一篇博文介绍。

AI补帧:RIFE效果演示

总体下来该算法还是比上述一些传统方法要抠得干净的,不过边缘部分仍有一些小瑕疵,视频中使用了手动调色等手段进行了优化。

代码备份

包含源代码,模型文件,测试视频:
https://pan.baidu.com/s/12PE8xoUaUZjFm3Y8Q5DfUA?pwd=8888

猜你喜欢

转载自blog.csdn.net/qq1198768105/article/details/126873335