PeerCastの創作系イベント「きゃすけっと」で、参加者に絵を大量に書かせて、それをもとに識別AIを作った話。
きゃすけっとはオンラインで行うコミケのようなもので、参加者は自分の制作物を公開したり、他の人の制作物を楽しんだりする身内イベント。絵やゲーム、ツールなどが主要コンテンツ。半年に一度のペースで開催される。
今回のきゃすけっと(2016年秋)で、複数種類のすたちゅーさん(下図、一例)の絵を書いてもらって、そのデータをもとに、どの種類のすたちゅーさんかを識別するAIを作成した。
UI
データとなる絵を書くページ、AIを使うページ、どれだけ投稿されたかの情報のページ、簡単な説明を書いたページの4つを用意した。
9種類の絵をランダムに出して、それを真似て書いてもらう。逆にAIはどの絵に近いかを確率で答えるというものにした。
どこかの会社の古いIEでみるなんて環境にいないだろうから、ES2015で書いてbabelでコンパイルせずに配置してやったぜ、ヒャッハー。
サーバ
herokuの無料枠に押し込んだ。Python3でFlaskを使った。画像データは、もとのサイズそのままだと、データサイズが大きくなるので、画像を32×32にして、それがどの絵かという情報とともに、herokuのPostgreSQLに入れた。
Pythonを採用したのは、機械学習にTensorFlowを使うためで、ウェブアプリとして複雑にするつもりがなかったのでFlaskを使った。データベースを扱うためにFlask-SQLAlchemyを使った。
絵を書いてページを更新する必要があるととても苦痛だろうから、Ajaxでデータを送ったら、キャンバスをまっさらにするという方法を取った。なので、ページ自体はほぼ静的で、サーバはjson APIで操作する部分が中心になった。
AI
AIの課題はmnistと同レベルなので、TensorFlowのチュートリアルをちょっと取り組むと理解できるレベルのものにした。自分の限界に挑戦することなく無難なものにしたのは、きゃすけっと期間内に調整することになるから。
モデルはTensorFlowのチュートリアルに出てくるような、softmax regression、多層パーセプトロン、CNNを使い、ユーザがモデルを選んでそれぞれの結果が見れるようにした。
結果
現在4500個を超えるデータが集まっている。(内、自分の書いたものは1000個ほど)自分がPeerCastでデータを書く様子を配信しているのに合わせて一緒に書いてくれた人が多く、大半の投稿がそのときのものだった。こういう修行のような繰り返しの作業を楽しむ文化のあるPeerCastらしい反応で、イベントを盛り上げられたと思う。(さすがに全日程の三日間を書き続けることになると辛かっただろうけど、十分な学習結果が出る程度のデータが初日だけで集まったので助かった)ペンタブがあると書きやすかったけど、スマホ対応ができていなかったので、スマホなら書いたのにって人もいたのかも。
逆に、予想通りだけど、ネタ投稿があって、学習の妨げになってしていたはず。ネタ投稿を検出とかやってみたいけど、それは今後のお話。とりあえず、自分の目で見て、ネタっぽいものはツイッターで晒した。うどんの絵のところで、チャーハンを書く輩とか、どうみても女の子なものや、別キャラクタなど。
AIの精度は、softmax regressionと多層パーセプトロンが7割台、CNNが86%というくらい。mnistに比べ、データが大きい割に、データの総数が少ないから、これくらいなのかなと思う。チュートリアルと違って、自分で次元やパラメータをいじらないと精度が出ず、色々試行錯誤する必要があった。深夜に学習させて、成果が出るかも怪しかったので配信上でしなかったけど、期待していた人もいただろうなと反省。けど、CNNの学習とか時間かかるし・・・
データやソースコードの扱いは今後検討。絵を書くのにつかれた。
反応
投稿さた画像を表示する機能をつけていなかったのだけど、やっぱり、見たいという声がいくつかあった。どういうように見せればいいかが悩ましかったが、投稿すると一つ表示するような案をもらった。
スマホで外から試したいという声もあったが、スマホが無いからどうしよう。
AIよりも人間がすたちゅーの書き方を学ぶサービスだったというコメントも。実際、数秒で一枚書いていた。
今後
データをどうするか。公開とかどうするか。次回のきゃすけで、同じデータから別の課題に取り組むとか。ソースコードを公開するために整理するとか。
少し休んで頭の中がリセットできたら考える。