PeeeeRONの日記

更新頻度はあまり高くはありませんがネタがあったら書いていこうと思います。

ディープラーニングで画像を超解像するwaifu2xをGoで実装してみた。

Web+DBとい雑誌で少し前にディープラーニング入門の記事があったので読んでいたら、waifu2xというディープラーニングの技術を使って画像の解像度を上げるソフトウェアがあることを知りました。

このソフトウェアの様々な言語での実装ができていたので、今回はGoで実装してみることにしました。実装した部分は学習済みモデルを使って画像の解像度を上げる部分です。

参考にしたプログラムはPythonで書かれているこれを使わせて頂きました。ただ本家と1つだけ違うのは畳み込みではなく自己相関関数を使いました。これが利用したモデルです。本家のLuaで書かれたwaifu2xを使うと新しいモデルを作れるみたいです。このモデルは本家のものとニューラルネットの形状が若干違っていて、最初の入力が本家のものはRBG(三原色)の3チャネルなのに対し、Python実装のものはY(輝度)の1チャネルになっていました。

Pythonと違い数値計算ライブラリが発展途上のGoなので結構たいへんでした。行列演算にはgonum/matrixというGoogle製のオープンソースを使いました。
画像は本家のものと同じmiku_small.pngを使い。

f:id:PeeeeRON:20160223182525p:plain

これを2倍に拡大しました。
まずは普通に近傍補完法で拡大した画像がこちらです。

f:id:PeeeeRON:20160223182652p:plain

明らかにジャギっています。
次にwaifu2xで拡大したものです。

f:id:PeeeeRON:20160223182745p:plain

若干縁のギザギザが小さくなっているのが分かります。
なぜか保存してみると画像が左上に移動してしまっていますが、超解像に成功しています。
コードはGithubにあります。

github.com

画像が左上のずれるバグが直っていないので、プルリク送って頂けると助かります。