FFmpeg + TecoGANで低画質動画の超解像に挑戦

目的

約10年に自分のライブで撮影された540×360pxの低画質の動画をTecoGANの超解像技術でスケールアップする。


なぜTecoGANなのか?

他にも超解像技術はありますが、単純に話題になった技術を使ってみたかったのです。

何で話題になったかはBANされたくないので明記しませんが、気になる方はYahoo!ニュースで検索してみてください。

ちなみにTecoGANでは縦4倍、横4倍の超解像にしか対応していないらしい。


筆者の環境

OS Ubuntu 20.04 LTS(WSL2)
Pythonバージョン 3.7.12
GPU RTX2070 Super


手順

  1. FFmpegのインストール
  2. TecoGANのセットアップ
  3. TecoGANのソースコードを修正(任意)
  4. FFmpegで動画フレームを抜き出して画像に変換
  5. TecoGANで画像を超解像
  6. FFmpegで超解像後の画像を動画に変換


注意点

TecoGANを使う場合、Pythonのバージョンに注意です。

3.8系でも3.6系でも動かず、3.7で上手くいきました。

Pythonのバージョン ダメだった理由
3.8 TecoGANはtensorflowのバージョンが1系で動作するのですが、Python3.8だと2系しか動かない。
3.6 画像処理を行うライブラリPillowがPython3.6用のバイナリを配布していない。


最終的なディレクトリ構成

TecoGAN
├ LR
│ └ calendar ← FFmpegで動画から抜き出した画像を格納するディレクトリ
│    ├ image_xxxxx.png
│    └ image_xxxxx.png
├ results
│ └ calendar ← TecoGANで超解像化した画像を格納するディレクトリ
│    ├ output_image_xxxxx.png
│    └ output_image_xxxxx.png
├ model ← ダウンロードしたモデルを格納するディレクトリ
│ └ TecoGAN.xxx
│ └ TecoGAN.xxx
├ runGAN.py ← TecoGANの実行Python
├ movie.mp4 ← 超解像前の動画
└ result.mp4 ← 超解像後の動画


FFmpegのインストール

$ sudo apt-get update
$ sudo apt-get install ffmpeg


TecoGANのセットアップ

ソースコードの取得

GitHubからソースコードをダウンロードするか、下記のコマンドを実行してcloneしてきます。

$ git clone https://github.com/thunil/TecoGAN.git

Pythonの仮想環境を作成

$ python -m venv venv
$ . venv/bin/activate

ライブラリのインストール

$ pip install tensorflow-gpu==1.15.0
$ pip install -r requirements.txt

モデルの取得

$ python runGan.py 0


TecoGANのソースコードを修正(任意)

ダウンロードしてきたTecoGANは超解像化する対象の画像を格納しているディレクトリのパス「TEcoGAN/LR/calendar」をハードコーディングしています。

そこを任意のパスに書き換えることで任意のディレクトリ配下の画像を対象に出来ます。

[TecoGan/runGan.py - 70行目辺り]
  dirstr = './results/'
  testpre = ['calendar'] # 任意のパスを指定する

修正が面倒くさい場合、FFmpegで動画フレームを抜き出した画像を上記のディレクトリに配置するようにすればソースコードを修正する必要はありません。

(私は面倒くさいのでソースコードは直してません。)


FFmpegで動画フレームを抜き出して画像に変換

$ ffmpeg -i movie.mp4 -vcodec png LR/calendar/image_%05d.png


TecoGANで画像を超解像

下記のコマンドを実行して「TecoGAN/LR/calendar」に配置した画像を超解像化します。

$ python runGan.py 1

なんかエラーが出た...

ImportError: cannot import name 'get_config' from 'tensorflow.python.eager.context'

こちらの記事を見るとkerasのバージョンを2.3.1にすると解決するそうです。

ということでバージョン指定で再インストールした後、リトライ!

$ pip uninstall keras
$ pip install keras==2.3.1
$ python runGan.py 1

今度は違うエラーが出た...

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc

これは大量の画像を読み込もうとすると出すエラーらしいので「TEcoGAN/LR/calendar」の下にある画像を1200枚くらいに減らすと上手くいきました!

本当ならGPUメモリと画像サイズを計算して適切な枚数にすべきなんだろうけど、この辺りはテキトーです。 

 

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

$ ffmpeg -framerate 30 -i results/calendar/output_image_%05d.png -vcodec libx264 -pix_fmt yuv420p -r 30 result.mp4


結果

左が超解像前の動画、右が超解像後の動画です。

全画面で、ディスプレイに顔を近づけてよーく見れば、プラシーボ効果で画質が向上している気がしないでもないです。(後ろの文字とか)

コマ落ちもしてるのだが、これはFFmpegの使い方の問題かな?


他の人が言ってる通り、TecoGANには得意・不得意があってこのライブ映像みたいなのは苦手な部類なんでしょうね......で、ニュースになったやつは得意分野だったと。

あとは元のサイズくらいの動画だとあまり効果はなく、もっと低い解像度の時に活躍するとか。

これでは映像が粗いままなので、もっと別の超解像技術を使ってみようかな。

演奏が粗いのは練習あるのみ...(まぁ、10年前の演奏だし)

というか今回のブログの主旨とは違うけど、2010年頃の大学生がLed ZeppelinのRock And Rollをやってるって凄い違和感…1971年の曲だぞ?


2022/04/03追記

TecoGANとは別の超解像技術「ESRGAN」を試してみた。

https://d-oshige.blogspot.com/2022/03/ffmpeg-esrgan.html


参考

FFmpegの使い方:https://qiita.com/livlea/items/a94df4667c0eb37d859f