クーの自由研究

マスターのかえるのクーは、弟子達の召喚術により新たな依り代を得てⅡ世として復活しました。

TecoGAN でどの程度の画像まで拡大できるか実験します

みちくさは王道よりも面白い?

スターティングゲートを自分で蹴り開けたい@ゴルシちゃんに共感する、かえるのクーの助手の「井戸中 聖」(いとなか あきら)でございます。

さて、今週末は個人的芸術週間にするつもりでしたが、予定を変更してTecoGANで遊んでみます。

TecoGANとってもいいです

TecoGANを使った画像の拡大(高レゾリューション化)は昨日までやってみてました。「使うだけ」のつもりがとてもおもしろいので、中身をのぞき見してみます。

何かをのぞき見したいと思うのは「chainerMN」以来2~3年ぶりくらいです。

まぁ、もともとOpenなので、「覗く」という言い方も下賤ではございます。

TecoGANをやる方は

(1)チュートリアル通りやってみた派

(2)改造してみたが、思いのほかいいので、課金サービスにしてしまった派(もちろんソース公開なんてしてくれない)

(3)いろいろ応用してみた派

がありますが、とりわけいろいろ「応用してみた派」は少ないです。

2~3例の諸先輩のがんばりを貼ってみます。

機械学習のモーフィングやこのTecoGANでも、動画で本来静止している部分が微妙に波打つ系のノイズ(正式名称は知りません)が大嫌いです。なので、おそらく個人的には動画には使用しないと思います。TecoGANは静止画でも結局変換可能ですが、微妙に改変してしまうので、用途を選ぶように思います。

美術系はダメでしたが、北斎は思いのほかよかったので「アニメ/イラスト」系の高レゾ化には向いているかもしれません(こちらも学習モデル次第ですが。)

GPUがしょぼいのが原因なのかTensorflowでメモリ不足がでて、中程度以上の画像は拡大できませんでした。

そこで今回は

TecoGANでどれくらいの画像までなら変換できるか

をやってみます。これが、5/16の「お題」です。

実験機のスペック:

CPU:AMD Ryzen 5 3600

Mem: 16GB

GPU:RTX 3060 (12GB)

OS:Windows10 Pro + WSL2 + Ubuntu 18.04

10:16の画像(モトネタがスマホ用なので縦長)の画像でやってみました。

高いほうの限界(メモリ制限)

この環境での限界は元画像Pixel:540×864あたりでした。

主だった変換例を貼っていきます。

540x864

2160x3456

480x768

1920x3072

320x512

1280x2048

240x384

960x1536

160x256

640x1024

f:id:np2LKoo:20210516104834p:plain

f:id:np2LKoo:20210516104859p:plain

f:id:np2LKoo:20210516104921p:plain

f:id:np2LKoo:20210516104932p:plain

f:id:np2LKoo:20210516104944p:plain

f:id:np2LKoo:20210516110647p:plain

f:id:np2LKoo:20210516110728p:plain

f:id:np2LKoo:20210516110814p:plain

f:id:np2LKoo:20210516110839p:plain

f:id:np2LKoo:20210516110901p:plain

低いほうの制限 (推論としての性能的な限界:画像崩れ)

低解像度のものをどのように拡大しているかが興味深いです。低解像度すぎるアニメ絵の拡大は得意でないようです。(とはいえ、普通の拡大アルゴリズムよりは各段によいです)学習データ次第という予感もします。アニメ系の学習をさせると、どのようになるのかとても興味があります。

複数画像指定での改善

では、TecoGANの特徴である複数画像(微妙にズームをかえた複数画像による推定拡大)をやってみます。(この処理自体では学習はしていないはずです)

上記でダメダメな横160pxの画像について、元画像からのズームをすこしだけかえて、トリミングして同サイズにした16枚の画像からどのように拡大するか確認します。

16枚を連続して処理しますが、上記と同じ160x256画像の拡大処理結果はこちらです。大変微妙ですが、改善傾向にあるのがわかります。

f:id:np2LKoo:20210516121839p:plain

細かな部分の拡大比較です。(上が単一画面を複製したバッチで生成、下が微妙なズーム画面を含むバッチで生成した拡大処理画像です。)

f:id:np2LKoo:20210518072932p:plain

f:id:np2LKoo:20210518072955p:plain

 動画をもとにしたでフレーム間の「処理」も機能していることがわかります。下のほうがノイズが際立ってしまったのは別として、細部のニュアンスがいいと思います。

付属の学習モデルでこれですから、アニメ系の学習をさせて使えばよりよくなると思います。本当に凄いとおもいました。

 TecoGANの学習の概略

TecoGANは動画用の高解像度ツールとして学習がおこなわれます。

TencoGAN のオプションはネットで多数情報がありますが、説明のために抜粋して記載します。

基本的に「runGan.py をサンプルとして、自分でパラメータを設定する」ことを前提にして作成されています。なので、全く汎用的に作成されていません。

自分でいろいろやりたい場合はrunGan.pyを修正することが必要となります。

場合によっては main.py側も修正が必要かもしれません。

なお、扱う画像はpngのみで、jpgは扱うように作成してありません。

$ python3 runGan.py 0  (ダウンロード)

TecoGANのモデルやデモ情報をダウンロードします。

$ python3 runGan.py 1 (アップコンバート実施)

指定したフォルダ内にある(Videoから抽出した相当の)複数pngファイルをもとに画像を縦横4倍(4x4=16)にアップコンバート推論します。推論には学習済の情報が使用されます。

自分の画像をコンバートしたい場合はフォルダ内に複数のファイルを準備します。(同一フォルダ内では必ず「同一の解像度」のpngファイルでそろっている必要があります。)フォルダの指定は runGUN.py 内の runcase==1の条件のとろこにある testpre=['フォルダ名']の箇所を変更します。

runGan.py で各種パラメータを設定して、アップコンバート推論の本体 main.pyを実行します。

$ python3 runGan.py 2 (結果評価)

 結果を評価するための指定です(詳細確認中)

$ python3 dataPrepare.py  各種オプション

 これは正直驚きました。youtube-dl (動画ダウンロード)の機能を使い、ネットから動画を順次ダウンロードして特定フレーム事に学習用のデータを準備します。環境設定も特段設定らしいところは何も必要なく、実行してみると、学習用データ(静止画)がvimeo.comの動画から「どんどん」生成されていきます。パッケージ内の機能としてとても簡単にできるようにしているのを見るのは初めてです。(だいたいこれ系は処理システムとは「別だて」で、やるとしても環境構築とか敷居がとても高いイメージがありました)

$ python3 runGan.py 3 (学習)

 ダウンロード、生成した学習用データはデフォルトでは /mnt/netdisk/video_data にフォルダ単位にpng画像が格納されます。このコマンドではそこに準備された「動画から抽出された png 画像」をもとに学習を行います。

学習を行い、FRVSRという予め準備してある基本モデルをもとにそれをベースにTecoGANモデルとしての学習を更新していきます。

学習の本体はmain.py です。

$ python3 runGan.py 4 (DST無しの学習)

予め準備されている(ある程度の?)学習済データFRVSR ファイル自体を学習更新するモードです。この学習をしたあと、更新した学習ファイルをベースに独自の学習をする場合は 3 の部分のコードを変更する必要があります。変更の仕方は runGAN.py ファイルに記載されています。

$ tensorboard --logdir='ex_TecoGANmm-dd-hh/log' --port=8008

 学習経過はTensorBoardで確認できます。

youtube-dlでアニメだけ自動で集めてくるオプションはないようなので、手持ちのアニメ動画や画像で学習させられないか、今後の研究課題とします。

 応用もおもしろいですね

かえるのクーの影響なのか、自己符号化器、もしくはディープラーニング内での特定の1~2層の挙動にしか興味がありませんでしたが、いろいろな応用が本当に簡単にできるようになっていて驚きました。これは遊べます!