難しいことは何も分からないけどpix2pixを使ってみたい

注:Ubuntuブラウジングくらいしかやったことがないプログラミング素人高校生が興味本位で試してみたものです。おそらく間違いや余計なことを多々しているかと思います。
Twitterでpix2pixってやつが面白いって見て、調べてみたら「めっちゃ簡単」って書いてあったので試してみたくなった。結論から言うとpix2pixを使うための環境構築にとても時間がかかりました。OpenCVビルドするの大変すぎ(-_-;)半日くらい?かかった。

今回使ったマシン

手順

ubuntu server 16.04LTSのインストール

ローカルのHDD見たらUbuntuServerのisoしか無かったのでこれを使った。普通にDesktopでいいと思う。unetbootinを使ってUSBメモリインストーラ入れて作業。指示に従ってインストールしてたら元から入ってたWindows10がGRUBに表示されないじゃないですかー。年賀状の住所録が入っているので忘れないうちに抜き出しとかないとやばい。ブートローダーのところの話はいまいち良く分からない。どうやったら確実に共存させられるんだろう?
インストール中に「LANカードが見つからない」と出てきたら画面戻ってその項目に従うべきだ。勝手に見つけてくれる。無視してインストールを続行したらネットに繋がらなくて(当然)、もう一度最初からやり直した。見つけてくれるなら最初からそうしてくれよって思うのは私だけ?

Nvidiaドライバ&CUDA&cuDNNのインストール

これは調べればいくつも出てくるので省略。GPUドライバは自分のグラボに合った最新のものをチェックして入れる。確認はWindowsにドライバを入れるときと同じようにNvidiaのサイトに行き、OSを「linux 64bit」みたいなやつを選び、何が最新か見る。
CUDAとcuDNNをダウンロードするにはNvidiaのDeveloper menbershipというものに登録しない。こちらのページを参考にした。

Ubuntu 16.04へのCUDAインストール方法 - Qiita : http://qiita.com/yukoba/items/3692f1cb677b2383c983

私がハマったのは以下に書いたので何かの参考になれば幸いです。

Ubuntu16.04にOpenCV3.2 - takanotume24 (・・? : http://takanotume24.hatenablog.jp/entry/2017/01/12/201827

pix2pix関係をインストール

こちらのページを参考にした。

pix2pix(GAN)を使ってモノクロのおそ松くんをカラー画像にしてみた - 技術メモ集 : http://t-nkb.hatenablog.com/entry/2016/11/26/120255

学習させる画像がでかすぎる

GTX660ではVRAMが足りないようで、out of memoryのエラーを吐いて途中で学習が終わってしまう。「pix2pix outofmemory」とかでググってみると、学習させる画像データを小さくしてみろって出てきた。
サンプルデータは512x256、これを256x128に圧縮する。ImageMagickと言うものを利用し、テキトウなシェルスクリプトを書いて変換した。ファイル名が「数字.jpg」で助かった。Imagemagickはカラー→グレースケールへの変換も対応していて、学習用データを作るときにも使った。

学習させてみる

あとはpix2pixのGithubのドキュメントに書いてあるとおりにトレーニングを実行してみる。
先程のブログにあった、train.luaのbatchSizeを1→4に増やすとトレーニングを高速化させることができる、というのをやってみたところ実際に早くなった。
最後まで処理させて3時間位。ただ、入力画像サイズ(128px)とtrain後検証用画像(256px)でサイズが違ったせいか、かなりぐちゃぐちゃな画像になってしまった。
今回は途中から面倒くさくなってきて検証用画像の方の圧縮をサボったが、これサイズ合わせたらちゃんと出力されるのだろうか?
ちなみに学習が20(単位がわからない 10回トレーニングしたってことなのだろうか?)行ったくらいでCtrl+Cで強制終了させてテストしてみたところかなりいい感じに出力された。
解像度が足りてない感じはあったがちゃんと窓のある建物の写真が出力されていて感動した。もとの写真とは違うけど「こんな建物あるよな」という感じのものが生成された。

学習用画像を生成できるpythonスクリプトについて

scripts/内にあるcombine_A_and_B.pyはOpenCV3.2では仕様変更しているところがあるらしく、私の環境では修正する必要があった。

python - cv2.imread flags not found - Stack Overflow : http://stackoverflow.com/questions/19013961/cv2-imread-flags-not-found

これに書いてあるとおり、scripts/combine_A_and_B.pycv2.CV_LOAD_IMAGE_COLORcv2.IMREAD_COLORに変更する。

やっていて気がついたこと

GUIなしのUbuntuServerを使うことにはある意味良いようで、GUIを起動してしまうとその分VRAMを消費してしまうため、CUIオンリーで作業するとVRAMの節約になり学習に支障が出ない。CUIで256px(付属のスクリプトでダウンロードした画像群)の画像でトレーニングを行うと、途中でトレーニングが強制終了してしまうものの、「途中までは」すすめることができる。
後に慣れないCUIが嫌になってきてGnome Desktopをインストールしたのだが、そうすると完全にVRAMが足りなくなりトレーニング開始直後にOutofmemoryで終了するようになった。VRAMに余裕があれば普通にGUIを使っても大丈夫そうだが、2GB程度だとダメっぽい。

今後の目標

  • 自前で用意した画像で学習させてみる。モノクロ画像→カラー画像にするのが素材が一番集めやすいと思う。
  • 256pxだとVRAM不足でエラー落ちしてしまうのが残念。128pxは流石に荒すぎる。GTX1070とかあればVRAM8GBで余裕そう。でも途中で強制終了させたときは結構いい感じに生成できていた。もしかして学習させる画像とテストで出力させる画像の解像度は一致してなくてもいいor良くする方法があるのだろうか?