ChrisKim
Do not go gentle into that good night.
颢天

使用 AI 对视频进行超分与补帧

最近发现 Wallpaper Engine 上的一些动态壁纸作画很棒,但是视频质量不佳,非常可惜。于是研究了下超分与补帧相关的 AI 应用,效果令人非常惊喜,本文在此记录一下使用经验。

1 选用模型

选用 AI 应用的标准首先是开源、免费,因为市面上收费的 AI 视频增强应用太贵了,基本上无法承受得起。我选择了两款应用,分别应付超分和补帧任务。其中 VSET 实际上也有补帧功能,但我认为它的补帧功能没有另一款强,因此建议大家分开使用。

需要注意的是,超分补帧非常消耗显卡显存,显存 <8GB 就很难用了,显存 16G 以上可以比较舒服,必要的话可以去云平台租用显卡。

如果官方下载方式不方便,可用我的阿里云盘分享:https://www.alipan.com/s/ewKK9EKQ8JV

2 VSET 进行超分

2.1 参数选择

VSET 官方有比较详细的教程文档,放在它的下载目录下,如果想自己研究可以仔细阅读官方文档。这里简单提一下我的使用方法和经验,我的硬件是 RTX4070 12G,如果和我差不多,可以直接抄作业。

输入输出就不说了,在程序的超分补帧页面:

  • 启用半精度推理:效果略微减小,但是能节省一半显存。
  • 超分算法:Real_esrgan_mlrt,是一个能力均衡,效果很棒的超分算法。
  • 推理方式:CUDA 或 TRT。TRT (TensorRT) 理论上会比 CUDA 的更快。
  • 模型选择:animevideov3
  • 切割大小:如果视频分辨率太大可能爆显存,切割相当于将视频横竖切成几个小的部分进行推理,可以缓解现存压力。但需要注意的是有可能会产生切割痕迹。
  • 放大倍数:超分倍数,超个两倍一般就够了

在画面修正页面:

  • 后处理 – 抗锯齿:防止产生锯齿
  • 后处理 – 缩放设置:有些情形,只是因为视频码率不够导致很糊,此时可以超到两倍再压回原分辨率,达到提升画质的作用,当然不想压回去也没关系。

在压制设置页面:

  • 编码器:如果有硬件编码器比如 nvenc,选用它可以大幅加速。
  • 码率:建议开高一点,40 以上,免得辛苦超上去的视频又被压缩变糊。当然如果你需要控制文件体积,那就调整到合适码率。

一些问题:

  • 不知道为什么,作者在文档里写的很多加速策略在我的设备上均没有效果,例如使用 TensorRT、增加流处理数量等等,不知道是程序的问题还是硬件瓶颈。
  • 当视频长/宽超过 4096 时,NVENC 硬件编码器将会报错。因此需要控制超分前的视频长/宽小于 2048,或者启用后处理把它缩放回去。

2.2 效果展示

注意
keyboard_arrow_down

博客内图片经过了二次压缩,如果要真正比较差异,请下载原图:https://run.sh.cn/upsample

使用 Real_esrgan_mlrt 模型,原尺寸 2048×1304,两倍超分到 4096×2608,然后再缩放还原到原尺寸(画师: 冰冻鱼粽, PID: 107071778)

前后对比如下:

https://assets.zouht.com/img/blog/3696-01.webp
超分前
https://assets.zouht.com/img/blog/3696-02.webp
超分后

通过比较,可以发现超分后图片的边缘明显锐利许多,观感明显从雾蒙蒙变为了清晰锐利。但是需要承认的是,超分后图片也有细节丢失,仔细观察可发现原来衣装上存在的一些光影过渡,在超分后过渡变“硬”了。但总体上,图片观感还是明显变好的。

差分对比如下:

https://assets.zouht.com/img/blog/3696-03.webp
两张图片差分比较

将两张图片进行差分运算,得到差分图。可以发现超分后主要变化的是边缘线条,这也是为什么观感上明显锐利许多。相当于 AI 向图片中额外添加了高频信息,提升了图片清晰度。

3 DAIN 进行补帧

3.1 安装

对于 Windows 平台,官方已经编译好了二进制,直接在 GitHub Release 即可下载。解压后运行 DAINAPP.exe 即可启动程序 GUI. 然后就可以看下一节内容了。

对于 Linux 平台,需要自行编译,且没有 GUI。官方提供了 Google Colab 的笔记本,里面提供了编译方式:https://colab.research.google.com/github/HeylonNHP/Dain-App/blob/master/Dain_App_Colab.ipynb

相信会熟练使用 Linux 的也不需要我解释步骤了,我就只分享几个坑点:

  • PyTorch 版本不能太高:最开始使用的是 PyTorch 2.1,结果根本没法编译,换到 1.7 就可用了。另外,分享阿里云平台可正常使用的镜像版本 pytorch-develop:1.7pai-gpu-py36-cu101-ubuntu18.04.
  • ffmpeg 版本不能太低:如果 ffmpeg 版本太低,运行某几个模式时会报错 'frame_pts' as unrecognized option,这大概率是没正确按笔记本的指令安装新版本 ffmpeg. 手动安装:
    • apt install software-properties-common
    • add-apt-repository -y ppa:jonathonf/ffmpeg-4
    • apt update
    • apt -y install ffmpeg

3.2 参数选择

打开 GUI 后程序有三个部分,我们分别解释:

https://assets.zouht.com/img/blog/3696-04.webp

① 输入输出部分

首先把 Input 和 Output 选好,Input 选择要补帧的视频,Output 选择输出文件夹。

如果上次补帧意外终止,可以选择 Resume Render,然后选择上次补帧的输出文件夹即可继续运行了。

参数选择部分

然后可以看到程序有 9 个选项卡,我们一一来讲。当然我只提到我认为比较重要,有必要调整的选项,没提到的保持默认即可。

Frame Handling Options

  • Model: 选择默认 best.pth 即可。
  • Frames Handling Mode: 这个比较重要,需要根据具体情况选择:
    • Mode 1: 最简单的方式,就是两帧之间插帧。
    • Mode 2: 移除重复帧后,两帧之间插帧。
    • Mode 3: 移除重复帧后,动态计算需要插入的帧数进行插帧。
    • Mode 4: 移除重复帧后,静态计算需要插入的帧数进行插帧。

如果你要补帧的视频是真实录像,一般来说是不存在重复帧的,直接选模式 1 就行了。但如果是动漫,很多都存在一拍二、一拍三的现象,即一张图显示两帧,60 帧实际上只有 30 帧不同的帧。那么如果不去掉重复帧,效果有局限。一般来说,动漫建议选择模式 3.

Interpolation Option

  • Use Half-Precision float: 半精度推理,略微牺牲质量,节省显存。建议开启。
  • Batch Size: 批大小,如果显存够大可以开大。
  • Device to use: 选择要使用的显卡。
  • Depth Awareness Mode: 根据实际情况选择:
    • Real life or 3D: 如果视频是真实世界或者 3D 软件导出的符合真实透视的,则选择这项。
    • Cartoon or anime: 如果视频是卡通或动漫这种不符合真实透视的,则选择这项。
  • Interpolation Algorithm: 选择 Default 默认。
  • Interpolation 2/4/8X: 根据想补帧的倍数选择,2X 即 60 帧变 120 帧。

Output Options

  • CRF vaule: 压缩质量参数,越低质量越高。

Misc Options

  • Don’t interpolate scenes changes: 场景切换时不插帧,防止出现不合理的中间帧,如果视频包含多个场景建议勾选。同时也可以调整场景切换的检测灵敏度。
  • Perfect loop animation: 完美循环,如果你要做的是动态壁纸,一定记得勾上它,这样壁纸头尾就能完美衔接成循环了。

Fix OutOfMemory Options

如果爆显存了,就得调整这个选项。

  • Downscale Video: 缩小视频大小进行插帧,因此视频分辨率会降低。
  • Split frames into sections: 将视频横竖切成多份,分别进行插帧后合并,分辨率不会降低。
    • Number of divisions X: 横向切几刀
    • Number of divisions Y: 纵向切几刀
    • Section Padding: 边缘覆盖宽度,即切分时让边缘有一定覆盖,防止出现切分线。

③ 运行部分

参数填好后就可以开始运行了,看到程序下部分,有一个大按钮和三个小按钮。

大按钮代表开始所有步骤,小按钮代表手动单步运行。三步分别是:视频转图片序列、插帧、图片序列转视频。

3.3 效果展示

使用模式三,原帧数 60FPS(一拍二),两倍插帧到 120FPS(画师: 冰冻鱼粽, PID: 107071778)

下面示例是视频第 1 帧与第 2 帧之间的插帧,共插入 7 帧:

  • 原视频时间戳为:00 ** ** ** ** ** ** ** 50
  • 插帧后时间戳为:00 06 12 18 25 31 37 43 50

叠加对比如下:

https://assets.zouht.com/img/blog/3696-05.webp
补帧前
https://assets.zouht.com/img/blog/3696-06.webp
补帧后

可以看到,补帧前 00 和 50 帧之间运动比较大,叠加后明显看到中间过程的缺失。而补帧后,00 ~ 50 帧之间多了 7 帧,叠加后已经看到这 7 帧基本覆盖了整个运动过程,非常流畅。

差分对比如下:

https://assets.zouht.com/img/blog/3696-07.webp
补帧前 00 与 50 的差异
https://assets.zouht.com/img/blog/3696-08.webp
补帧后 00 与 06 的差异

可以看到,补帧前相邻的 00 帧和 50 帧的差异非常大,肉眼感觉就是帧之间有突变。而补帧后相邻的 00 与 06 帧之间几乎没有差异,肉眼感觉就是帧之间变化平滑。

补帧样本原图同样也上传到了上面的云盘链接中。

本文链接:https://www.zouht.com/3696.html
本文使用:CC BY-NC-SA 4.0 许可
# # # #
首页      教程      使用 AI 对视频进行超分与补帧

发表回复

textsms
account_circle
email

颢天

使用 AI 对视频进行超分与补帧
最近发现 Wallpaper Engine 上的一些动态壁纸作画很棒,但是视频质量不佳,非常可惜。于是研究了下超分与补帧相关的 AI 应用,效果令人非常惊喜,本文在此记录一下使用经验。 1 选用模…
扫描二维码继续阅读
2024-02-16