動画の高画質化

Program

【追記】処理速度を速めるために

★ Pythonの標準実装だと、Python環境で重いPytorchを使うので、処理に時間がかかる → Tencentが公開しているVulkanベースのC++実装版(realesrgan-ncnn-vulkan)を使ったほうが速度が出るらしいので切り替えた

★ タイルサイズが小さすぎると処理時間がかかるため、専用GPUメモリに余裕があれば、タイルサイズを大きくすること → タイルサイズを自動判定にしたら256になっていたので、更新した

★ Real ESRGANx2plusが処理重でよくないモデルらしいので、realesr-animevideov3(アニメやイラストでおすすめ。2倍3倍4倍対応)やgeneral-x4v3(実写でおすすめ。4倍固定)という軽量モデルをつかうことにした。

★ 「フレームを一度HDD/SSDに保存するのではなく、FFmpegでデコードした映像ストリームを標準出力(stdout)経由でAIの推論プロセスにパイプで直接流し込み、処理後のフレームもそのままエンコーダーにパイプで戻す仕組みにすると、ディスクI/Oのボトルネックが消え、高速化する」。 → ただし、ディスクに連番画像(PNG)を保存しないため、途中経過がわからない(今処理しているフレームの色味などが確認できない)。またGPUが常にフル稼働しているなら、これ以上GPU速度が上がらないため、FFmpegによるCPU処理ができてもGPU側の処理をまたなくてはならず、大幅な高速化は見込めない → これまで通りSSDに保存することにした

AIモデル

アップスケーリング用のAIモデルとして

・ Real-ESRGAN

・ Waifu2x

があり、今回はReal-ESRGANを採用

AIモデルは

 %LOCALAPPDATA%\HighResolution\weights

にダウンロードされており、プロジェクトフォルダの中にない

動画の拡大倍率と処理時間

・ 動画を縦横2倍にする(=動画面積を4倍にする)には「Real ESRGAN x2plus」をつかい、縦横4倍にするには「Real ESRGAN x4plus」をつかう

・ 15分のMP4(850x480px)を2倍の高画質(1700x960px)にするのに4時間もかかった(→Real ESRGAN x4plusを使うといつまでも処理が終わらないから使わない!)

動画ファイルサイズ

縦横2倍(面積4倍)にするとファイルサイズが5倍に行かないくらいになった

高画質化の流れ

1 動画からフレーム(静止画)を1コマずつ切り出す

2 AIモデルに画像を読み込ませて、高画質化(720p->1080p, 1080p->4k)を行う

3 高画質化したコマを再び音声と合成して1つの動画ファイルに書き出す

GPU条件

・ CPUだけで高画質化処理すると、1秒の動画の処理に数分かかるほど重い作業のため、基本的にGPUが必要

・ RTX3060Ti 8GBでも動くように指定

専用GPUと共有GPU

・ 共有GPUとはCPUをGPUとして扱った場合のメモリのこと

・ 共有GPUを使うと処理速度が非常に遅くなるため、専用GPUメモリだけを使うのが一般的

GPUで行われる処理の種類

・ GPUを使って行う処理は「3D, Video Encode, Video Decode, Copy」の4種類に分けられる

・ 高画質化処理を行うとタスクマネージャーで3Dだけ使用率100%になり、ほか3種類は0%になるが、高画質化処理(=AIモデルを使って画像を拡大する処理)は膨大な行列計算であり、3D処理なのでこれは正常な動作

・ 3D使用率100%はGPUの計算性能をフルで利用しているということ。車に例えると「アクセルベタ踏みで最高速度で走っている状態」

※ これに対して専用GPUメモリの使用GBは車に例えると「トランクの容量」であり、荷物をたくさん積んで走ったほうが処理時間が減る

※タイルサイズを増やして専用GPUメモリが増えても、3D使用率は増えないので大丈夫

GPU温度

・ GPU温度は90度になった

・ 95~100度になると自動シャットダウンするため、できれば85度以下に下げたほうがいい

・ タイルサイズを大きくするとGPU負荷が上がり、GPU温度が上がる

タイルサイズ

・ 各フレームを一度に処理するとGPUへの負荷が大きすぎるので、各フレームを複数のタイルにわけて処理する

・ タイルサイズを増やすと一度に処理する面積が増えるため、専用GPUメモリを多く消費するが、全体の処理時間を減らせる

(タイルサイズを自動にしたら、専用GPUメモリ8GB中1.2GBしか使わなかったので、タイルサイズを512〜1024にふやしてOK。増やすことで処理速度を上げられる(VRAMの使用率は80%くらいまで上げてOK)

アプリの使いかた

・ AI生成されたコードをGPU付きのパソコンにコピーし、setup.ps1をメモ帳ではなくPowerShellで実行したあと、run.batをクリックする

なお、Windows/System32/high-resolutionで

PowerShell -ExecutionPolicy Bypass -File .\setup.ps1

することで、権限付与して実行できる

BACK