今年のCVPRで発表された、高性能の超解像アルゴリズム「PULSE:Self-Supervised Photo Upsampling via Latent Space Exploration of Generative Models」を試してみました。
流行りの「自己教師あり学習」です。
※論文の内容に関しては省略(いつか解説記事を書くかも?!)
→書きました
「PULSE」のポイント
- 今までとは評価ポイントが違う
- 超解像した後の画像じゃなくて、超解像した後にダウンスケールした画像で比較
- 今までの手法よりも超解像可能
- 超解像自体はStyleGANを使用(CelebA-HQで学習済み)
ソースコード
ソースコードはGithubにて公開されています。
今回はこれをそのまま使います。
インストール
Python 3.7上で、以下のモジュールをインストールしました。
- Anaconda NavigatorのGUIからインストール
- matplotlib
- numpy
- pandas
- pillow
- scipy
- requests
- コマンドラインからインストール
- pytorch
- torchvision
- cudatoolkit(今回は10.2を使用)
環境構築
超解像したい画像を入れておくフォルダを用意します。
ここではとりあえず「input」とします。
そこに超解像したい画像を入れます。(複数入れてもOK)
画像にはいくつか制限があります。
- 縦横のサイズは同じ
- サイズは1,024の約数
- フォーマットはPNG(RGB)
実行
> python run.py
で実行します。
エラー対応
ほとんどの画像で、以下のようなエラーになります。
Loading Synthesis Network
Optimizing
BEST (100) | L2: 0.0058 | GEOCROSS: 4.3057 | TOTAL: 0.7981 | time: 10.0 | it/s: 9.98 | batchsize: 1
Could not find a face that downscales correctly within epsilon
上記の例の場合、L2の最小値が「0.0058」なのですが、デフォルトの閾値が「0.002」になっており、それより近づかないとエラーになります。
対応方法としては、引数「eps」で閾値の値を変更します。
> python run.py -eps 0.005
実行結果
実行結果は「runs」フォルダに保存されます。
出力される超解像画像は1,024x1,024のpngになります。
外国人バイアスがむごい...
あと、正面顔じゃないとダメそう。
感想
実行は簡単ですが、実際に使おうと思うと、いろいろとやらなくてはいけないことがいっぱいありそうです。