GANによるノイズ・モザイク等の除去
GANによるノイズ・モザイク等の除去
近況
眠い。
実は今月、三回も停電が起きてそのたびに機械学習のモデルが飛んでいます。原因は電子レンジとケトルを両方利用したとか、そういった当たり前のことなのですが...(ブレーカを飛ばしているの私でないです)。
モチベーション
pix2pixなどのニューラルネットでの画像変換は、通常のフィルタと違って、情報量を増加させることができるような振る舞いをすることがある。
画像は大学の学部で習ったレベルの知識しかないが、平滑化フィルタなどの画像を変換する系のやつは大抵が行列で表現されるようなやつで、平均値だの分散などを取るので、情報量が下がるものがほとんどだった(というかそれしか知らない)。
GANでモザイク除去や、なんやらができるとは先行研究でわかっていたし、理論は単純だし、この前のpix2pix with textに比べて簡単だと思った。
先行研究
- GANによる去年の実装 http://www.yukisako.xyz/entry/mosaic
- 2017/01/21 arxiv submiited 数日差で負けた感じ.仕方がない https://128.84.21.199/pdf/1701.05957v1.pdf
- 有名なWaifu2x,学習するドメインを限定すればより高機能に使えるという発想のもとになった https://github.com/nagadomi/waifu2x
理論
- GANなので、生成DNNと判別DNNがお互いを騙そうと、競争し合う。
- 十分に学習した生成DNNが生成タスクとして利用可能
- 一番良い理解はソースコードを見ることだと思う
図1. 生成タスクの例
図2. 判別タスクの例
実験環境
- この前のpix2pix with textを更に変更したモデルを利用
- textの領域にランダムなデータを入れることで、もとのDCGANのような、ランダムに近いZシードの位置づけを作成した(直感的な理解であるが、いらなくてもなんとかなるのでは)
- GTX 1060, GTX 1070で4日ほど回した
- 途中、chainerのバグを踏む、serializerがメモリバカ食いという点はあったものの、色々細工することで乗り切った. (バグは今は直っている。大容量なswapをNVMeに作成するなど)
- 学習データとは別のデータセットを用意して、各モデルの学習の進み具合を確認してepochを進めていった. leakは防げていると考えている。
- epoch: 350
- 画像ドメイン: 艦これの7500枚の一人だけ表示されている絵、ただし縦横比が2:1, 1:2までのカラー画像のみ
- その他パラメータは原則、Facadeのものに従っている
モザイク生成
- opencvを利用
- 一度1/10まで縮小して単純に10倍に拡大することで、モザイクを発生させる[1]
- モザイク状態のデータと、正解データを対応させて学習する
ランダム情報欠落
- opencvを利用
- 全体の画像の面積の半分を白いブロック領域でランダムにデータを欠落させる[1]
- 情報が欠落した状態のデータと、正解データを対応させて学習する
評価
- 評価には、別途用意した500枚の画像を利用する
結果
- 概ね良好な結果が得られた。
- inputとはgeneratorの入力値である
- predictとはgeneratorの出力値である
- ground truthとは未加工のもとデータである
図3. ブロックノイズ除去の例
図4. モザイク除去の例
考察
- ランダム情報欠落は、復元しやすいのかかなり強力に動作しているように見える
- GANの特徴として、判別機を騙せるようにGeneratorは学習していくので、ニューラルネットという人間に近い判別の仕方、判別能を持っているので、人間をうまい感じに騙せような補完をしてくれる(別にground truthに近くなるわけでない)
- 停電でpix2pix with textのデータが飛んでしまったので、しかたなくやった感があったが、思ったより簡単に結果が出たので、学部の論文とかにはいいかもしれない.ただし、通用するのは今年までな気がする
- 比較こそしていないが、少しの汚れや情報欠落ぐらいでは、うまくドメインが合致していれば、もとの絵とイメージは違うけど、十分見れるものを出力できている.色々応用は広そうである