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使用
ESRGAN実行中のGPU負荷

FFmpegで超解像後の画像を動画に変換

$ ffmpeg -framerate 30 -i results/image_%05d_rlt.png -vcodec libx264 -pix_fmt yuv420p -r 30 result.mp4


結果

動画は重いので、今回は画像のみアップします。

左が超解像前、右が超解像後の画像。(TecoGANと一緒で後ろの白い文字はキレイになってる気がする)

ESRGANによる超解像の結果

↑の画像だと画質向上してるのか、むしろ悪くなってるのかよく分からないですね。

なので別の画像で試してみた。

ESRGANによる超解像の結果(サンプル画像)

この画像なら目に見えてキレイになるんですよねぇ...

やっぱりライブ映像がダメなのかな?追加学習すればまともになるのかな?

取り敢えず昔のライブ映像を超解像技術でスケールアップするのは今は諦めます...