【动漫修复以及超分辨率杂谈】关于动漫长片超分辨率处理质量控制的方法
写在前面:
应K佬的要求,写一篇专栏讨论一下关于动漫长片超分辨率处理质量控制的方法。这个视频压制杂谈的专栏就当是开的新坑的吧。随缘更新。本期着重讲技术,尽量不讲代码和环境。
起因:
UP本人和朋友在测试使用Vapoursynth的压制流程压制4K动漫番剧长片的时候,如果只是单一使用一种算法或一种模型处理整个长片的话,画面会在一些模型处理不好的地方造成崩坏。例如,在这个使用场景,我们对整个片段都使用Real-Cugan算法的保守模型处理,但这会在部分地方造成瑕疵,具体可以下面对比图的两边房屋的树叶纹路

处理后纹路的虚化会被锐成一条显眼的线条。现在这种情况还算好的了,当画面的细节很小但是是那种不可抹去的细节的时候崩坏就会更严重。

而当我们换一个更加保守的参数的话这种情况就会有所好转,但又会造成影片的其他较长的片段没有足够“清晰”的效果。
解决方法讨论:
方法一:(全都要)
我们的想法是在长片的大多数画面都使用单独一种超分辨率算法,然后在一些特定崩坏的画面单独分离片段使用更加保守的参数进行处理,最后再拼接回去。特定片段使用特定的算法和参数如图所示,这里只是简单举个例子,需要按帧先把分段分割为几部分,然后分别对这几个部分使用不同的超分辨率算法以及参数,最后拼接为处理后的长片片段。

清晰度和细节保留这两个方向在现在的动漫超分辨率算法下是不能都同时拉满的,但是二者可以牺牲其中一方让另一方获得更好的效果。例如调整Real-cugan算法的Alpha强度的值。上面的例子可以全片使用保守模型,然后Real-cugan的Alpha值拉到0.3或.4左右就可以很好的保留细节,并且会有一点相对于原片好的清晰度。个人常用的有0.7或0.8。

特别注意:
在叠加超分辨率函数API的时候,脚本里对于Real-cugan这样吃一定显存的算法来说,有一行代码调用就会叠加一次显存,它们之间不是显存复用,调用次数只要多一点点就算是3090也扛不住。
在VS-mlrt的github的issue还没找到如何释放显存的方式。所以在处理的时候得想办法对所有崩坏的帧进行抽取统一归类,对不同类进行不同的超分,再以此分割,拼接,最后出片子。然而这对于一部长片来说肯定是费时费力还费脑子的工作。虽然可以叫上几个人一起对崩坏的帧进行分类,调整参数来加快处理速度(“人工”智能)。(实际上只需要人工鉴别崩坏场景并标注对应帧数,后续的代码都可以写个脚本自动生成)这是我目前能想到最好也是最累的方法了。
在issue里面好像提到了走pytorch的Real-cugan渲染不存在这样的问题,但由于速度和体积原因,个人已经删掉了torch的环境,具体请自行测试。
题外话:
绝大多数片子一般来说一个超分算法一个模型处理到底也能有很好的超分辨率效果。而且不仔细查看细节的话几乎找不到瑕疵。只是在一些细节狂魔的动漫里,直接套一种算法的效果确实会有很多瑕疵。这种思路不仅仅可以用在超分辨率上面,对于基础的画面修复也可以采用类似的思路解决质量控制的问题。
欢迎其他大佬一起交流技术。上述有什么没说清楚的地方欢迎补充,有说错的地方也欢迎提出,我会视情况修正。