LINEで動物画像を送ってくれる人にAIでリアクションをしてみた

友人とLINEをしていると、可愛い動物の画像が送られてきたりします。
暇な時は何かしらのリアクションを取るのですが、忙しい時は既読をつけることしかできません。
これでは画像を送ってくれている相手に申し訳ないです。
そこで、少しでも友人に楽しんでもらえるように、私に代わってAIにリアクションをしてもらおうと思い、
機械学習を使ったLINEのボットを作りました。
技術者でもない友人からすると、送った画像を判別してリアクションしてくれるというのは面白いらしく、
ボットのリアクションが間違えている場合も含めて、楽しんでくれているようです。
今回は、そのボットをどういう風に作ったか、その詳細も含めてお話しようと思います。

全体の仕組みとしては、ボットがLINEから送られてくる画像を取り込み、
その画像から写っている動物の種類を予測するプログラムに渡します。
そのプログラムは渡ってきた画像がどのような動物なのかを予測し、その結果をボットに渡します。
ボットはその結果を見て、特定の動物(今回は犬、猫、羊、鳥)と予測された場合に、スタンプをリアクションとして返します。

画像から動物の種類を予測するプログラム以外は、以前に作ったことがあったため、それを流用することにしました。
今回の課題は動物の種類をどうやって予測するか、です。
内容のわからない画像から、特定の動物が写っているかどうかを判別するプログラムを作る必要があります。
そこで色々と調べてみた結果、機械学習の分野で使われている、
CNNと呼ばれるニューラルネットワーク を利用してみることにしました。
CNNを使って、ある程度の数の動物の画像を事前に読み込ませ、それぞれの種類の特徴を学習させ、モデルを作ります。
そのモデルを使うことで、与えられた画像の動物の種類を予測することができます。

学習に使われる画像は何万枚にも及ぶもので、学習にはPCに大きな負荷がかかり、時間もかかります。
はじめは自分のPCでモデルを作っていたのですが、8時間(睡眠中ずっと稼働していました)かかっても、学習は終わりませんでした。
私のPCではメモリやGPUのスペックが明らかに足りていないのです。
そこで、効率的に学習できる方法が他にないかと考えていたところ、
AIに絵を描いてもらう時に使っているGoogle Colabというサービスが使えそうだということに気づきました。
Colabには無料版と有料版があり、無料版は自分のPCと同じく学習に時間がかかりすぎたため、
思い切って有料版にしてみたところ、数十分で学習が終わってしまいました。
この効率の良さに感動し、しかも月額1000円です。コスパ良すぎです。

…それはさておき、作っているモデルには精度という指標があり、
今回のモデルでは、送られてくる画像を97%程度正しく判別できるようになりました。
ただこれは、特定の動物が特定の動物であることを97%程度正しく判別できるということであり、
特定の動物に含まれない動物(例えば馬や象) に関しては判別できません。
つまり、猫の画像が送られてこれば、猫であることは97%で判別できるが、
まれにそれを犬と判別してしまう。みたいなイメージですね。

今回はお遊びということもあり、とりあえずこのぐらいの精度が出ていれば十分かと思い、モデルの作成は完了としました。

なお、モデルを作るためにはスペックの高いPCや環境が必要ですが、
モデルを実行するだけであれば、そこまでスペックが高くなくても問題なく動かせます。
今回のモデルであれば、安価のレンタルサーバで十分でした。

こうして、できたモデルを試すため、猫や羊、犬や鳥の画像をボットに送ってみたところ、
無事スタンプを送り返すことができました。

こうして今では、忙しい時は私に代わってAIが友人の相手をしてくれているのですが、
実際に動かしてみてわかったのは、精度が97%ほどあっても、羊の判別が難しいということです。
今回のモデルでは「猫、羊、犬、鳥」を判別するように作ったのですが、羊を犬と間違えるケースが多発しています。(友人はその間違えを「無能なAIだ」といって楽しんでくれてますが…)
どうしてかなと思っていたのですが、どうも友人が送ってくれている羊は、
「ひまりちゃん」という有名で人気のある羊らしいのですが、
学習した羊の画像とは見た目が随分違い、とても幼く愛くるしい見た目をしています。
そこが人気の理由なのでしょうが、一般的な羊の画像で学習したために上手く判別ができていないのかもしれません。
この辺りは、またの機会に改善できればと思っています。

ABOUTこの記事をかいた人

フリーランスとして働く、フルスタックエンジニア 初崎 匠のサイト。仕事のことから趣味のアニメーション制作、英語学習など、様々なことを通じて、少しでも多くの人が幸せになれるような価値を提供できるよう挑戦し続けます。