漫画をきれいに拡大できるコマンドラインツールwaifu2x
毎日洪水のように流れてくるHackerNewsのフィードから気になった投稿をさらっと紹介するシリーズを今日から初めます。
第一弾はwaifu2x: Image Super-Resolution for Anime/Fan-Artです。日本人の方が作っているっぽいですね。日本語タイトルは「深層畳み込みニューラルネットワークによる二次元画像のための超解像システム」だそうです。
なんか今流行りのDeep neural netをつかって画像を拡大して超解像度の画像を得ることができるツールだそうです。
元ネタはImage Super-Resolution Using Deep Convolutional Networksというarxiv.orgに掲載された論文らしく、そのアルゴリズムを参考に似たようなものを実装してみたようです。
これ見た時は「高解像度のイメージを多数用意して、縮小・拡大した時に生じるノイズと元画像の差を使って、何がノイズかというのをニューラルネットワークに学習させることでノイズを選択的にフィルターするのかなぁ」と予想したんだけども元論文をさらっとみるとノイズを選択的に除去するというよりは、低解像度の画像から高解像度の画像を予想して生成する感じですね。
魔法のようですが、低解像度画像から特徴マップを抽出して、これを高解像度画像の特徴マップへと非線形性マッピングするところがミソらしいです。詳しくは下のアルゴリズムのセクションに解説したので飛んでください。
ちなみにあの有名なJavascriptライブラリJQueryを作ったJohn Resigさんは浮世絵の収集しているそうで、Waifu2xを使って浮世絵を拡大したデモのUsing Waifu2x to Upscale Japanese Printsという記事を書いています。
Waifu2xは高解像度の画像が十分にあれば(3000くらい)、学習させていろいろなタイプの画像につかえるようですね。
使い方
コマンドラインツールと書きましたが、インストールしなくともこちらのウェブインターフェースにファイルをアップロードするかウェブ上にあるイメージのURLを指定してやれば簡単に試せるようです。これはすでにくアニメ・漫画に最適化されているものと思います。浮世絵だったらこれで行けそうかな。
アニメ以外のものを自分で学習させる場合、Ubuntuでwaifu2xをインストールして、コマンドラインツールを使うことになります。
アルゴリズムはなぜかLuaで実装されているのでLuaもインストールすることになります。Deep neural networkのゴリゴリと行列計算をする部分は自分で書いたのだろうか?なぜにLuaと思ってしまったが、まあ色々とライブラリがあるのかもしれない。
追記。とりあえず、Numeric LuaというLAPACKのラッパーみたいなのが見つかった。行列計算も賢く出来そう。これなら納得。
アルゴリズム
機械学習は全然専門じゃないので間違いがあるかもしれませんが、面白そうなので元論文を流し読みしてみました。
Image Super-Resolution Using Deep Convolutional Networksの図2。
学習の実際の作業としてはこんな感じっぽい。
入力画像生成(図の一番右):まず高解像度の画像を沢山用意して、一度3倍に圧縮して、これをbicubic interpolationで拡大して元の画像サイズに戻す。これが図の左の入力画像で、圧縮によって情報が失われているので低解像度画像になる。これからできるだけ元画像に近い画像を生成したい。ピクセルサイズを元画像と同じにしたのは色々と計算に都合がいいからと思われ。
パッチ抽出(左から2つ目): この入力画像をn1個の3x3または5x5のちっちゃな画像(特徴マップ、パッチ)を重み付けて重ね合わせたもの(畳み込み)として表現し直す。この特徴マップは畳み込みのフィルターで縦線とか斜めの線とか、いろんな大きさの円とかそんな漫画を書く時の基本の部品みたいなものだと思えば多分大体あっていると思います。赤緑青の色違いも用意します。脳の視覚野の神経細胞がやっているような表現方式に変換しているとも考えられます。「畳み込みって何?」という場合は2次元の畳み込みについてはこちらが図が沢山あって分かりやすいような気がします。大相撲の叩き込みとは無関係です。
非線形性マッピング(左から3つ目): 次にこのn1個の特徴マップそれぞれにフィルターをかけてn2個の特徴マップを得る。この過程が非線形性マッピングでこれもやっぱり畳み込みで低解像度の特徴マップを重ねあわせて高解像度用の特徴マップを生成している。計算としては一次視覚野から二次視覚野へ行く感じか。この非線形性マッピングの関係性は最初は適当だけども我々は高解像度の元画像を持っているので元画像に近いような結果になるように畳み込みを調整することができるのがミソ。
再構成(一番右): このn2個の特徴マップは高解像度画像の特徴マップであるとして扱われ、これの畳み込みで元画像に近い画像を得る。操作としてはそれぞれの画素の周辺の予想結果の平均をとっている感じだけども、単純な一律で平均ではなく畳み込みとして空間的な重み付けが違ってもいいように一般的に表現してある。
もちろん最初はどんな特徴マップがいいのかも、どんな非線形性マッピングがいいのか、最後の再構成の重み付けもわからないので、ニューラルネットワークに学習させて最適化。
このパッチ抽出、非線形性マッピング、再構成の3つの過程それぞれは畳み込みなので畳み込みニューラルネットワークとして表現して、これらを3つつなげた深層畳み込みニューラルネットワークをつくってこれに多数の高解像度画像を与えて学習させて、再構成した画像がオリジナルに近づくように重み付けを調整する。これでトレーニングセットに対して有効な特徴マップとそれの非線形性マッピングの重み付け行列が得られるので、これをつかってトレーニングセット以外の新しい低解像度画像に同じ計算をしてやるとあら不思議、超解像度の画像が得られるというしかけ。
しかし3層しかないのに深層と呼ぶのなのは大昔のパーセプトロンでも3層あるしなんか変な感じ。グーグルの画像認識の例だと6層くらいだし、普通は非線形性マッピングの部分を繰り返して、合計で6-7層はあると思うけど。まあ深層って言ったほうが受けるだろうし画像認識よりは単純なタスクだから3層で済んだのか。
« Synologyのアップデート後のTeamDriveパーソナルサーバー復旧覚書 | トップページ | Pythonの標準ライブラリのみで書かれたコンソール上で遊べるスネークゲーム »
「HackerNewsうぉっち」カテゴリの記事
- クマムシの全遺伝情報が解読されたら17.5%がバクテリア・菌類由来。(2015.11.28)
- 有料ゲーム・アプリが「実質タダ」に!Amazon undergroundを試してみた(2015.08.28)
- Windows 10はプライバシーがどうのこうの(2015.08.27)
- チートがバレたバイドゥの画像認識研究チームのリーダーが解雇される。(2015.06.12)
- アセンブリで実装された高級言語Amber(2015.06.12)
「ディープラーニング」カテゴリの記事
- CaffeをWindows 7でcuDNN付きでビルド。(2016.07.14)
- Theano用にCUDAができるお手ごろGPUを物色中。GTX-960が良さげ(2016.03.05)
- ウィンドウズでLasagne/nolearn/Theanoで深層畳み込みニューラルネットワークしてみる(2016.02.27)
- ウィンドウズでCUDA付きでTheanoインストール!Python3.5でもできた。(2016.02.18)
- チートがバレたバイドゥの画像認識研究チームのリーダーが解雇される。(2015.06.12)
« Synologyのアップデート後のTeamDriveパーソナルサーバー復旧覚書 | トップページ | Pythonの標準ライブラリのみで書かれたコンソール上で遊べるスネークゲーム »
コメント