• 【趣味实践】自动化抠图工具——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
    
    • 1

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

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

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

    在这里插入图片描述

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

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

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

    效果演示

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

    AI补帧:RIFE效果演示

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

    代码备份

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

  • 相关阅读:
    mac使用python递归删除文件夹下所有的.DS_Store文件
    Spring 事务失效了,怎么办?
    详解如何通过稀疏向量优化信息检索
    麦芽糖-聚乙二醇-甲氨蝶呤 MTX-PEG-maltose
    全能代码生成器,自动生成前后端代码、生成项目框架、生成JavaBean、生成数据库文档、自动化部署项目(TableGo v8.0.0)
    strimzi实战之一:简介和准备
    二、Javascript类型[数组、对象]
    STL-vector
    Unity——脚本与序列化
    Nodejs初识
  • 原文地址:https://blog.csdn.net/qq1198768105/article/details/126873335