動画のフレーム補間(ubuntu編)(解説)”Video Frame Interpolation (Ubuntu Edition) – Explanation”

Ubuntu

前回の導入で少し触れましたが、今回はフレーム補間をするときの調整の方法を説明します。

調整は「vulkan_interp」フォルダ内の「script」フォルダの中にある「config」というテキストファイルで行います。

このファイルを開くと

ひとつづつ見ていきましょう。

PSNR値

この数値を小さく設定すると動画がぬるぬるになりやすく、またぐにゃぐにゃにもなりやすくなります。
作風を壊したくない場合は、「1000」など大きな値に設定してください。
デフォルトは「35」としています。

この値について詳しく説明していきますと、これはffmpegでpsnrという値を算出するのですが、ふたつの画像を比べたときのピクセル情報の差分を数値で表したものです。
似通った画像である程、数値は大きくなります。最大値は100、最小値は5になっています。

実写の動画において、ffmpegを使って動画を画像フレームに変換した際、同じフレームまたは似通ったフレームというのはほとんどありえないと思います。
ですが、アニメなどでは2コマ打ちとか3コマ打ちとか言って同じフレームを重複させている場合があります。制作コストを抑えたり、動画に躍動感やスピード感を出すためだと思われます。

巷に存在するリアルタイムなフレーム補間処理をおこなったとき、例え240fpsとかで表示してもそんなにヌルヌル感じないのは、この重複したフレームまで補間しているためです(同じフレームを何倍にも補間して見せてもずっと同じフレームを表示するため)。

PSNR値の設定は、「1フレーム目」と「2フレーム目」のふたつの画像ファイルを比べた時、設定した数値以上のフレーム間情報である場合、これを重複しているとみなして「2フレーム目」を削除します。
これを繰り返し行うことで、動画に存在する全てのフレームを調べていくのです。

削除したフレームをそのままにしておくと歯抜け状態になりますので、その情報はリスト化されて「6_python_interp.py」というスクリプトで活用されます。

シーンチェンジ

この値を大きく設定すると、シーンチェンジを検出しやすくなります。
あまり大きくするとカクカクの動画になりやすくなり、小さくすると全然違うフレーム間であっても補間がなされ、動画がぐにゃぐにゃになりやすくなります。
写真では1になっていますが、デフォルトは「15」です。

これは上の処理で算出されたPSNR値を元に判断されます。
PSNR値は動画や作風によってまちまちな結果になるため、調べてから設定したほうが良いと思います。
調べ方は後述します。

フレーム補間の倍率

動画のfpsを何倍にするかの設定です。
スクリプトで自動的に動画のfps(秒間フレーム数)を検出しますので、単純に「整数」を入力してください。

「1」も設定可能です。
重複フレームの削除のみ行いたい場合は「1」を設定すると良いでしょう。

デフォルトで「2」が設定されています。
ちなみに「rife-ncnn-vulkan」の仕様なのか「model」の問題なのかわかりませんが、3倍以上に設定すると処理が遅くなるようです。
急いでいる場合は「2」の重ねがけが最適ですが、不便であるためここは改良予定です。とはいえ、仕様の変更は自分にはできませんので、重ねがけの自動化がせいぜいですが・・・。

GPU

「6_python_interp.py」と「7_Frame_Interpolation.sh」の処理においてどのデバイスを利用するか指定する値です。
デフォルトは「0」ですが、内蔵GPUが有効化されていたりするとそちらが指定されてしまうことがあります。だいたいの場合「0」「1」「2」のどれかになるようです。「GPU」となっていますが、数値によってCPUを指定することもできます。
なんの数値がどのデバイスに割り当てられているかはシステムによって違いますのでいろいろ試してみてください。

https://github.com/nihui/rife-ncnn-vulkan
によりますと、すべてのデバイスに割当することができるみたいに書かれていますが、参考例が少なくあまり良くわかりませんでした。
暇な人はいろいろ調べてみてください。

重複フレーム補間時のプロセス数

「6_python_interp.py」を実行する際の実行プロセス数の設定です。
デフォルトは「8」です。
多分なのですが、CPUのスレッド数が最大値になるのではないかと思います。
プロセス数を多くするとその分ビデオメモリを大量に消費します。
大きくすれば良いというものでもなさそうですので、いろいろ試してみてください。

インストールスクリプトについて

ffmpegをaptで実行しています。
ですので、システムによっては「AV1エンコード」や「ハードウェアエンコード」が使えない場合があります。
その場合は、

sudo apt remove ffmpeg

上のコマンドでffmpegをアンインストールしてから、当ブログで解説しているffmpegのビルドとインストールを参考にしてください。

動画のPSNR値だけを調べたい時

「vulkan_interp」フォルダの中にある「check psnr.sh」を実行してください。
「temp」フォルダが出来上がります。その中に「psnr_values.txt」があると思いますので、そこから探ってください。

コンフィグファイルを初期値に戻したい時

「script」フォルダの中の「defaults.sh」を実行してください。
元に戻せます。

エンコードの設定を変えたい時

「script」フォルダの中に「encode_command_sample」があります。中にサンプルコマンドがあるので、「9_Video_Encoding_And_Merging.sh」の中の

26行目あたりのこのコマンドをコピペで変更してください。

デフォルトは互換性を重視し「h.264」のソフトウェアエンコードを指定しています。

出力される動画ファイルは「mkv」のみです。
「mp4」で出力することももちろんできますが、そのときは音声ファイルの形式で制限がでてくるので自分は採用しませんでした。

どんなGPUが早いのか

自分が試した限りですと、「GeForce RTX4060」「Radeon RX7600XT」「ARC B580」くらいになりますが、ダントツで早かったのは「GeForce RTX4060」でした。

Ubuntuだと「GeForce RTX4060」「Radeon RX7600XT」「ARC B580」の順番です。
Windowsだと「GeForce RTX4060」「ARC B580」「Radeon RX7600XT」です。

GeForceはcudaも早いけど、vulkanも早かったです・・・。

Windows編は無いの?

上の項目でWindowsの事が書かれていますが、「vulkan_interp」の古いバージョンではpythonに書き直したやつで実行してました。
新しいバージョンのpythonに書き直したやつはまだできてません。
そのうち作ると思います(ChatGPTが)。

WSLを使えば現状でも動くかもしれませんが、自分まだWSL使ったことがないので試していません。

まぁ、Windowsには「flowframes」があるので・・・。

最後に

長々と説明してきましたが、後で補足をいれるかもしれません。
多分書ききれていない部分もあろうかと思います。

「6_python_interp.py」の部分だけpythonになっています。
これは、この部分の処理だけbashではどうしても高速化できなかったのでChatGPTにお願いしてpythonに書き直してもらいました。
というか、全体のスクリプトも自分が出したのはアイデアとちょっとの手直しだけで、ほとんどChatGPTが担っています。

自分はエンジニアでもなんでもなく、3直交代制の工場の非正規ライン工なので、最適化技術は情けないのひとことです。
まだまだ、バグも多くファイルが足りないのに実行したプログラムが止まらず走り続けたりと脆弱極まる作りですが、少しずつ改善していくつもりです。
本職が見たら鼻で笑う程度の未完成品だと思います。

ただ、オープンソースになっているので気に入らなかったら自分で直すという手もあります。
更新はすごく遅いと思いますので・・・、ごめんなさい。

今回は以上です。

コメント

タイトルとURLをコピーしました