また一年くらい投稿が空いてしまってますね…
掲題の通りで Twitter bot に仕立てたので(@love_ramen_nya)、そちらのご報告も兼ねた記事になります。
良かったらフォローしてみてください、一日三食、ラーメン(っぽいもの)をアップします。
アイコンや返信パターンなどは暇を見て用意していきます~
ラーメンにゃ! #自動ラーメン #auto_generated_ramen pic.twitter.com/HCg5qVv7ps
— ラーメンにゃ! (@love_ramen_nya) August 7, 2018
本記事では特に詳しいことを書くわけではないので、人工知能だか機械学習だかニューラルネットワークだかディープラーニングだかでごにょごにょして、
それっぽいラーメンの写真を自動生成してみましたという感じでフーンと思いながら読み流してもらえればよいかと思います。
■GAN とかいうやつで何ができるのというのはこの記事(今回使っているのは DCGAN というやつ)
http://venturclef.com/blog2/?p=3423
■やってみるにあたって参考にさせていただいた記事
https://qiita.com/shu223/items/b6d8dc1fccb7c0f68b6b
もはや試してみるだけならほとんどコード書かなくてもいけちゃいます。詳しいところさっぱりでも(よくない)、試すだけならプログラミングのハードルは高くないです。
■学習のための画像を集める
Google のイメージ検索で集めました。この辺のクローラーもいろいろあるので探してみるとよいでしょう。
- 「ラーメン」で過去 10 年分
- 「中本」で過去 5 年分(辛くておいしい、スープが真っ赤)
- 「二郎」で過去 5 年分(大盛りというか、見た目インパクトも絶大ですよね)
もともとある程度ノイズはあってもいいかなと思っていたのと、出力のバリエーションを期待したチョイスです。
■集めた画像を選定する
イメージ検索なので、あんまり関係ないものを除外します。仕事合間に手動でぽちぽちやってたら 1 ヶ月以上かかりました。
ここはもうちょっとうまくやるべきところです。ここで枚数は以下のようになりました。
- 「ラーメン」約 48000 枚
- 「中本」約 6000 枚
- 「二郎」約 6000 枚
Twitter ではラーメンにゃ!とか言いながらラーメンか怪しい写真を添付する芸をやることがありますが、今回はちゃんとラーメンに絞ってます(カオスになりすぎて面白くなさそうだったので)。
あとはアングル都合などでノイズが大きくなりそうなものも除外したりしています。
■画像のクリッピング(スキップ)
各写真をターゲット中心で切り抜いたほうが良いのですが、さすがに手間がかかりすぎるので、今回はスキップしました。
■画像のリサイズ
今回試す DCGAN のサンプルは入力画像のサイズが揃っていないといけないので、長辺ベースで 256px になるようリサイズするスクリプトを書きました(Python + OpenCV)。
Gif だったりバイナリおかしかったりでスクリプト通らないものは別のツール使ったりしています。
■学習
ゲーミングノート PC が手元にあったので、tensorflow-gpu を使ってガリガリ回しました。
出力にある程度サイズが欲しかったのでオプションは以下のように。
python main.py --dataset ramen_dest --input_height=240 --output_height=200 --train --crop
これで 20 時間くらいかかったのではないでしょうか。ここでいろいろとパラメーターを調整して精度を上げていったりするものなのですが、この所要時間では試行錯誤も面倒です。
(output_height を減らせば数時間で終わります)
■出力結果
この手のやってみました記事では失敗例も多いのですが、幸いにも概ねそれっぽい結果が得られたので、以降のようなお遊び程度なら上々の結果ではないかと思ってます。
遠目だと気にならないんですが、拡大すると生理的にキツめのやつあったりします…ご愛敬…
■Twitter bot へ連携(おまけ)
Twitter の開発者登録が何やら面倒くさくなったようなので、自分ではキーを持たなくて済むような流れを構築しました。
- 出力結果は 8 x 8 枚パターンで 1 画像になっているので、切り分けるスクリプト(Python + OpenCV)
- 自分管理のサーバー(さくら契約してました)へとりあえず 1000 枚ほどアップ
- ここからランダムピックアップして image/png を返すスクリプト(PHP)
- IFTTT に定時で画像付きツイートする設定を作る
■今後の展望
何をするにも時間かかるので腰を上げるのが面倒なところなんですが、変換系は試してみたいですね~