FFmpeg + ESRGANで低画質動画の超解像に挑戦
目的
約10年に自分のライブで撮影された540×360pxの低画質の動画をESRGANの超解像技術でスケールアップする。
前回の記事を振り返る
前回は話題性だけで選定したTecoGANを使って超解像に挑戦しましたが、結果がイマイチで綺麗にスケールアップされませんでした...
※全体的に気持ち綺麗にはなりましたが、「超解像か?」と言われると全然な結果でした。
ESRGANを選んだ理由
はじめに言っておくと筆者はAIモデルのアーキテクチャについてはまったくの素人です。
参考に見た論文を見ても、頭が追いついていけません。が、それでいいと思います。道具は使えることが大切で、どういう仕組で作られてるのか、その中身まで細かく知る必要はないと思ってます。
ちなみにESRGANはEnhanced Super-Resolution Generative Adversarial Networksの略で、「Enhanced=強化された=何か凄そうw」程度の気持ちで使ってみます。
筆者の環境
OS | Ubuntu 20.04 LTS(WSL2) |
Pythonバージョン | 3.7.12 |
GPU | RTX2070 Super |
メモリ | 32GB |
手順
手順は基本的に前回やったTecoGANと同じでFFmpegで動画フレームを抜き出して画像に変換し、その画像をESRGANでスケールアップしてFFmpegで動画に戻します。
最終的なディレクトリ構成
ESRGAN ├ LR ← FFmpegで動画から抜き出した画像を格納するディレクトリ │ ├ image_xxxxx.png │ └ image_xxxxx.png ├ results ← ESRGANで超解像化した画像を格納するディレクトリ │ ├ image_xxxxx_rlt.png │ └ image_xxxxx_rlt.png ├ models ← ダウンロードしたモデルを格納するディレクトリ │ └ README.md ← モデルの説明を記載したファイル │ └ RRDB_ESRGAN_x4.pth ← Googleドライブからダウンロードしたモデル ├ movie.mp4 ← 超解像前の動画 ├ result.mp4 ← 超解像後の動画 └ test.py ← ESRGANの実行Python
ESRGANのセットアップ
リポジトリをクローン
$ git clone https://github.com/xinntao/ESRGAN $ cd ESRGAN
ライブラリのインストール
$ pip install numpy $ pip install opencv-python $ pip install torch
モデルのダウンロード
GoogleドライブからPyTorchの学習済みのモデルをダウンロードして、「./models」に配置します。
いくつかモデルがありますが、今回は「RRDB_ESRGAN_x4.pth」をダウンロードしてきます。
NVIDIAのGPUが搭載されていて、上記のモデルを使う場合は意識する必要ありませんが、そうではない場合、一部ソースコードの修正が必要になります。
※「RRDB_PSNR_x4.pth」 を使用する場合
test.pyの8行目あたりを書き換える必要があります。
[修正前] model_path = 'models/RRDB_ESRGAN_x4.pth' [修正後] model_path = 'models/RRDB_PSNR_x4.pth'
※GPU(CUDA)が使用できない場合
test.pyの9行目あたりを書き換える必要があります。
[修正前] device = torch.device('cuda') [修正後] device = torch.device('cpu')
FFmpegで動画フレームを抜き出して画像に変換
$ ffmpeg -i movie.mp4 -vcodec png LR/image_%05d.png
ESRGANで画像を超解像
下記のコマンドを実行して「./LR」ディレクトリ配下に格納した画像を超解像化します。
超解像した結果は「./results」に出力されます。
$ python test.py
TecoGANでは大量画像(6860枚)を一気に処理するとエラーになりましたが、ESRGANでは一気に処理できました!
処理中の負荷はこんな感じ。結構高負荷な処理ですね(当たり前か)
- GPU使用率:約70% ~ 90%
- GPU専用メモリ:約5GB使用
- メモリ:約25GB使用
FFmpegで超解像後の画像を動画に変換
$ ffmpeg -framerate 30 -i results/image_%05d_rlt.png -vcodec libx264 -pix_fmt yuv420p -r 30 result.mp4
結果
動画は重いので、今回は画像のみアップします。
左が超解像前、右が超解像後の画像。(TecoGANと一緒で後ろの白い文字はキレイになってる気がする)
↑の画像だと画質向上してるのか、むしろ悪くなってるのかよく分からないですね。
なので別の画像で試してみた。
この画像なら目に見えてキレイになるんですよねぇ...
やっぱりライブ映像がダメなのかな?追加学習すればまともになるのかな?
取り敢えず昔のライブ映像を超解像技術でスケールアップするのは今は諦めます...