hibitの技術系メモ

数学とか3Dとか翻訳とか

waifu2xとffmpegで30fpsHD動画を60fpsFullHD動画にした

 諸事情で取り直しができない動画(30fpsHD)を60fpsFullHD化する必要があったため、

  • 高画質化 ... waiuf2x
  • 60fps化 ... ffmpeg

 を用いて補正処理を行いました。あんまり目新しいことはないと思いますが、主に環境再現とかエラー報告の話になります。環境はWindows10です。

Before After

ツール(断念)

waifu2xで動画をアップコンバートする | MyLaboratory https://xyle-official.com/2020/03/23/waifu2x_upscale/

 実は、様々な先人達が同様の取り組みをしていて、ツールも公開されているのですが、これらを使ってみた所上手くいきませんでした。ツールにはよくあることです。ツールのエラーに対処するよりも個別のステップを自分でやっていった方が早そうだと思ったので、そうしました。

高画質化(導入)

 高画質化にはGitHub - lltcggie/waifu2x-caffe: waifu2xのCaffe版を用いました。Releaseにある最新版をDLすれば動くと思います……が、最初はGPUが認識しませんでした。結果的にはcudaを最新にすると(10.1 -> 11.1)解決しました。cudaのドライバーはCUDA Toolkit | NVIDIA Developerでインストールできます。

 GPUは認識したのですが、画像を変換しようとすると「モデルファイルが開けませんでした」というエラーが出ました。知恵袋だとファイル構成が間違っている可能性があるということでしたが、その症例ではなさそうだったので不思議だなあと思っていたのですが、ものはためしにCPUを使うモードで実験してみたら上手くいきました。その後はなぜかGPUモードでも上手くいったので、よくわからないまま解決しました。ツールにはよくあることです。

フレーム分割

 waifu2xは画像を処理するソフトなので、動画を処理するにはまず動画のコマを全部切り出す必要があります。ffmpegでもできるらしいですが、コマンドラインで大量の画像を扱うのに慣れておらず変なミスをしそうだったのでPythonOpenCVでやりました。今回は 30 fps 6分弱の動画だったので、切り出したものは全部で 1 万枚強の画像、 1.74 GB分になりました。言いそびれましたが、作業スペースとしてそれなりのファイル容量が必要です。

高画質化(本体)

 1つのフォルダに画像がまとまっていればそれをwaifu2xで一括処理できます。GPUを使えれば1枚1枚はほぼ一瞬で終わりますが、1万枚近くあるのでそれなりの時間がかかります。今回は数時間かかりました。(GPU : RTX2070Super)。当然ですが、ここでも大量のファイル容量が必要になります。今回の場合、最終的に 10 GBぐらいの一時ファイルが生成された気がします。

f:id:hibit_at:20201022094510p:plain

フレーム結合

 例によってffmpegでもできるらしいですが、同様の理由によりPythonOpenCVでやりました。

60fps化

 これはffmpegでやりました。参考記事で発見したコマンドで一発でした。便利。

ffmpeg -i input.mp4 -vf minterpolate=60:2:0:1:8:16:32:0:1:5 output.mp4

 コマンドは1行で済みますが、実際の処理は数時間かかります(CPUもGPUもそんなに酷使しない感じでしたが)。

実務上のポイント

 これはあまりプログラムとは関係ないトラブルポイントですが、動画としては60fpsですが、2フレームずつコマが入っているので実際は30fpsになっているという事例がありました。その場合、上のコマンドではまったく同じ60fpsの動画が出力されてしまいますので、

ffmpeg -i input.mp4 -vf minterpolate=30:2:0:1:8:16:32:0:1:5 convert30.mp4
ffmpeg -i convert30.mp4 -vf minterpolate=60:2:0:1:8:16:32:0:1:5 output.mp4

 という感じで2回補正する必要があります。