画像生成などに用いられるAIモデルのGANの考え方を用いて低解像度の動画を高解像度に変換するtecoGANというモデルが発表されていました
- 昔に撮影した動画を高解像度化したい
- 超解像度に興味がある
- tecoGANを実行する方法がしりたい
といった方向けにtecoGANを使った動画の高解像度化の方法を説明します
超解像度とは?
低解像度を高解像度に変換する試みはいろいろな試みがを超解像度といわれています
通常は低解像度の動画は高解像度の動画に比べて情報量が少ないので、低解像度から高解像度へ変換するのは難しい問題です
以前に本ブログでも紹介した2次元画像から3次元に変換するのも低次元から高次元へ変換しているので同様に難しい問題になります
そういう本来できないはずの解像度をあげる試みであるため超解像度という仰々しい名前がついているのだと思います
AI技術の発展によってこういった難しい問題が自動で行えるようになってきているのは、今後もいろいろな可能性を期待できます
それでは、今回はtecoGANを用いて低解像度のネコの動画を高解像にしてみましょう
実行環境
私が実行した環境は下記の通りですが、PCについてはこれと同じである必要はありません
- PC
- メモリ 16GB (8GB以上推奨)
- NVIDIA GeForce 1070
- OS
- Ubuntu 18.04LTS
- 言語
- Python 3.6
- ライブラリ
- git
- ffmpeg
- tensorflow gpu 1.14.0
- keras 2.0.8
- CUDA 10.0
事前準備
NVIDIAドライバ、CUDA、cuDNNのインストール(GPUを使わない場合は不要)
NVIDIAドライバ、CUDA、cuDNNなどのインストールは下記の記事を参考に行ってください
Anacondaで作業環境を作成
下記の通りcondaでpython 3.6の仮想環境をつくり、つくった環境にスイッチします
$ conda create -n tecogan python=3.6
$ conda activate tecogan
TecoGANのインストール
今回利用させていただくのはこちらのgithubです
githubからTecoGANのソースをクローンします
$ git clone https://github.com/thunil/TecoGAN.git
必要なライブラリをインストールします
tensorflowでも一応動きますが今回はtensorflow-gpuを用います
1.8以上が必要なので今回は1.14.0を入れてます
$ sudo apt-get install ffmpeg
$ pip install tensorflow-gpu==1.14.0
$ pip install keras==2.0.8
$ pip install -r requirements.txt
必要なtecoGANのモデルファイルとサンプルデータをダウンロードして配置します
下記のコマンドで自動でダウンロードして適切なディレクトリに配置してくれますがサンプルデータのサイズが大きく時間がかかります
サンプルデータがいらない方はあとで紹介する方法で直接モデルだけダウンロードしましょう
$ python runGan.py 0
モデルだけダウンロードして配置する手順を下記の通りです
TecoGANディレクトリ配下で実行してください
$ mkdir model
$ wget https://ge.in.tum.de/download/data/TecoGAN/model.zip -O model/model.zip
$ unzip model/model.zip -d model; rm model/model.zip
低解像度の動画を画像に切り出して、LR/testディレクトリに配置しましょう
今回は長さ47秒、FPS24の猫の動画を使いました
$ mkdir -p LR/test
$ ffmpeg -i cat_low.mp4 -ss 0 -t 47 -vcodec png -r 24 -f image2 LR/test/%04d.png
ちなみに低解像度の動画がない場合は下記の手順で動画を低解像度化することもできます
まず下記のmediainfoというコマンドをつかって動画の解像度と長さおよびFPSを確認します(今回は640×360)
$ sudo apt-get install mediainfo
$ mediainfo cat.mp4
---省略----
Duration : 47 s 589 ms
---省略----
Width : 640 pixels
Height : 360 pixels
---省略----
Frame rate : 23.976 (24000/1001) FPS
---省略----
つづいてWidthとHeightの値が割り切れる値で割った値に低解像度化します
$ ffmpeg -i cat.mp4 -vf --scale=-1:180 cat_low.mp4
上記はHeightを180(元の2分の1)にしているのでWidthは自動で320になります
インプットファイルの場所をデフォルトから変更するためにrunGan.pyスクリプトの70行目にあるtestpreの代入する部分をtestに変更します
$vi runGan.py
67 elif( runcase == 1 ): # inference a trained model
68
69 dirstr = './results/' # the place to save the results
70 testpre = ['test'] # the test cases
71
72 if (not os.path.exists(dirstr)): os.mkdir(dirstr)
73
tecoGANで高解像度化を実行する
それでは高解像度化の処理を行ってみましょう
$ runGan.py 1
するとresults/testというディレクトリに高解像度化された画像の結果がout_[数字].pngという形式で出力されます
最後に出力されたフレームごとの画像を動画に戻します
$ ffmpeg -r 24 -i results/test/output_%4d.png cat_high.mp4
まずは変換前の画像と、高解像度化した画像を比べてみましょう
変換前

変換後

若干わかりにくいですが高解像度にした方がはっかりと見える気がします
続いて動画も見比べてみましょう
変換前
変換後
※現在、PC上のChromeでないと正常に表示されない可能性がございます。どうしても再生できない場合は動画をダウンロードの上、VLC Media Playerを用いて再生してみてください。
こちらもなんとなく見やすくなった気がします!
学習済みのモデルをそのまま使った場合はこれくらいの結果になりました
類似するような動画で追加学習するなどをすればもう少しきれいにしたり改善できると思いますが、今回はここまでとさせてください
最後に
今回は超解像と言われる、低解像度の動画を高解像度に変換する方法をtecoGANを用いて実行してみました
本来少ない情報の低解像度の動画から高解像度にするというのは難しい問題ですが、GANなどの新しい手法を応用することで、たくさんの動画を学習させれば、こういった難しいにも対応できてきているのは素晴らしい技術の進歩だなと思います
引き続き気なる技術について勉強した内容を発信していければと思いますので、よろしければまた本ブログを見に来てください
コメント
高解像度のネコが見れないです><
ミー様、
表示がうまくいっておらず申し訳ございません。
動画変換の形式のせいか、PC上のChromeでないと正常に再生ができないようです。
それでも再生ができない場合は、動画をダウンロードしたあと、VLC Media Player (https://www.videolan.org/index.ja.html)にて再生してみてください。
ありがとうございます
OpenPoseだけじゃない!無料でつかえる高精度な姿勢推定を実行してみよう【HRNet】(2020年8月)をやってみました。
お勉強のために、GoogleColabで同じように動画を用いて実施させていただきましたが、 エラーが出て動画が出力できませんでした。
for i, (x1, y1, x2, y2, conf, cls_conf, cls_pred) in enumerate(detections):
ValueError: not enough values to unpack (expected 7, got 6)
おそらく予想結果が返ってきていない感じです。
一応エラーが無いようにパッケージや環境を同じものを使用して、同じコードで入力しましたが、他に何か対処するところがあるのでしょうか?
よろしくお願いいたします。
エラー箇所を拝見すると、下記ファイルの207行目のコードのようですね
simple-HRNet/SimpleHRNet.py
detectionsには、YOLOv3で人の物体検知を行った結果が格納されているのですが、そのYOLOv3モデルからの出力の数が通常と異なっているようです
引用しているgithub側での変更があった可能性もございますが、YOLOv3周りのインストールやweightファイルのダウンロード等を再度実施いただけると治る可能性がございますので一度お試しください
ありがとうございます!
確かにissueを見てみるとyolo v4に対応も考えているとも書いてありました。
何が原因か調査してみます。