AIでバレンタインチョコが義理か本命か判別する｢バレンタイン先生」を作りました。

2月14日といえばバレンタインデーですね。

学生であれば、急にソワソワしだして何気なく机の中や下駄箱の中、ロッカーなどを探った経験があるんじゃないでしょうか。チョコが入っていなくて、人知れず落ち込み、お母さんから貰ったチョコで慰めてもらう。そんな苦い経験もあるかと思います。

運良く、チョコレートを貰ったかと思えば、
今度は**このチョコは義理か本命なのか？**と悩むはめになります。

明らかに、本命であれば良いですが微妙なラインのやつってありますよね。

という訳で今回、AIでバレンタインチョコが義理か本命か判別する｢バレンタイン先生」を作りました。

こちらから友達登録できます！
![Screen Shot 2019-02-11 at 19.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/337592/983a8514-99a5-a850-eaf1-059845559319.png)

![Screen Shot 2019-02-11 at 18.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/337592/ed545bce-0f9b-7cd0-c377-f3b88823c9ff.png)

#今回の課題
- バレンタインデーで義理チョコか本命チョコかわからない
    - そもそもチョコが貰えないという課題については今回は触れない
- 先行研究は存在するが根拠に欠ける
    - [【バレンタイン】やっぱり気になる、“本命か義理チョコ”かを判断するポイントまとめ
](https://matome.naver.jp/odai/2142349438486894501)
- AIを用いた先行研究も存在するが中高生が気軽に試すことができない
    - [人工知能でバレンタインチョコが本命か義理かを判別する](https://qiita.com/hiyoko9t/items/089c3c828b2d3b04f756)
- さらにより判別の精度を高めたい

#解決策
- バレンタインデーのチョコを判別するAIのLine Botを作れば気軽に誰でも試せる！
- 精度はGoogle先生が作ったGoogle Cloud AutoML Visionを使えば上がるんじゃないのか？？
- 義理チョコと、本命チョコとは何か？もGoogle先生に聞いて解決しよう！

かなりのGoogle先生頼みです！

#作成したもの
- Lineでチョコの画像を送ると、義理チョコか本命チョコか教えてくれる「バレンタイン先生」
- 義理チョコ2733枚、本命チョコ3492枚の画像を学習したバレンタインマスターな先生。
![Screen Shot 2019-02-11 at 18.32.45.png](https://qiita-image-store.s3.amazonaws.com/0/337592/ee001782-631f-501c-4e09-48303e8527d9.png)

#使い方
- LineのQRコードで友達登録！

![Screen Shot 2019-02-11 at 19.28.12.png](https://qiita-image-store.s3.amazonaws.com/0/337592/2fa9337d-cd53-80bc-ba98-5b2f2da26a85.png)

- 友達登録したら、チョコの画像を送ってみてください。今回はブラックサンダーの画像を送ってみます。
![ブラックサンダー.jpeg](https://qiita-image-store.s3.amazonaws.com/0/337592/917116d8-8e4f-b690-6118-f4adb200f4b6.jpeg)
- その結果を先生が教えてくれます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/69873fbf-ae07-fa22-284a-4f0d59fb16f4.png" width=400>

- 本命の場合は
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/fdb2af04-7be2-58c2-c70d-b0753b414157.png" width=400>

- 他にもバレンタインに関する名言を呟いてくれます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/02a17445-7c3c-e0c7-7b20-df7bbe640861.png" width=400>


- スーパーで買ってきたチョコレートで試してみる
- Ghanaのミルクチョコレート
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/2169e413-b73a-1096-5004-1175b538ac06.jpeg" width=700>
- 99.65%の確率で義理判定
- meiji The Chocolate（赤）
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/d12cbdfa-5169-daea-b353-39fe810b60df.jpeg"width=700>
- 58.05%の確率で本命判定
- meiji The Chocolate（青）
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/a9cc91fe-6eb9-683d-9ee9-2f1d77497380.jpeg" width=700>
- 96.01%の確率で義理判定
- なにやら高級そうなチョコレート
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/72bd69ee-6e1c-9632-1b3f-f4aabd7ed295.jpeg" width=700>
- 99.09%の確率で本命判定
- コアラのマーチ
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/efc174e3-b074-fe9f-8e67-2a6baaeac05b.jpeg" width=700>
- 99.99%の確率で義理判定

#実装方法
##前処理
- Google画像検索で「義理チョコ」「本命チョコ」と検索した結果をPythonでスクレイピング
- 本命チョコで画像検索した結果

<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/ee9773d9-a9c8-30df-5af7-607db38ad49b.png" width=600>

- 義理チョコで画像検索した結果

<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/63b57da7-70aa-75da-7223-97aa5e7e7a7b.png" width=600>

- Pythonでスクレイピングをしローカルに保存

<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/28274786-feaf-a818-3eac-2766cb4f6b2b.png" width=600>

- 取得した画像を水増し、義理チョコ2733枚、本命チョコ3492枚に増やす
    - [機械学習のデータセット画像枚数を増やす方法](https://qiita.com/bohemian916/items/9630661cd5292240f8c7)

- Google Cloud AutoML Visionに画像を学習させる
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/d5027db9-9c85-0bf6-49dd-7f15b774e6ed.jpeg" width=600>
- 画像ファイルのアップロードとラベル付け
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/a5d6e3fc-f612-97c1-1da1-36874678954e.png" width=600>
- ブラウザ上でチョコの画像を判定
<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/2ea5c511-190d-bd45-fff9-c25de17c5866.png" width=600>

#実行時の処理
- Lineからチョコの画像を送るとそれが、Herokuに送信されます。
- それをHerokuで上で受け取りGoogle Cloud AutoML Visionに画像を渡します。
- Google Cloud AutoML Visionはチョコ画像が義理か本命かを確率で返してくれるので、それをHeroku上で受け取ります。
- 返ってきた結果をメッセージにしてLINEに渡して、LINE上でメッセージを返す

<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/f3275c51-74a6-f925-97f7-7ca232969c10.jpeg" width=600>

- 具体的な実装方法はこちらに詳しく記載しました。

[【画像認識を利用したAIアプリ】LINEに画像を送ったら自動で判定してくれる機械学習アプリを作ろう](https://note.mu/kota_en/n/n8cf278e1f22e)

#もっとやりたいこと
- Lineの審査に落ちてしまったので、出来れば審査を通して検索できるようにしたい！
- APIだけじゃなくて、自分で学習モデルを組んでみたい
- バレンタイン関係ないけど、双子の画像を高精度で判別したい
- リッチテキスト？とかでかっちょよくしたい
- 親も間違う双子の声をAIに判別させたい（音声解析？）

#チュートリアル書いてみました

- 具体的な実装方法は以下にチュートリアルとして詳しく書いたので、気になった方は是非読んでみてください。

[【画像認識を利用したAIアプリ】LINEに画像を送ったら自動で判定してくれる機械学習アプリを作ろう](https://note.mu/kota_en/n/n8cf278e1f22e)

- バレンタイン先生を0から実装できます！

<img src="https://qiita-image-store.s3.amazonaws.com/0/337592/c936d19b-31dd-ffc2-7021-0efa6e89a5ba.png" width=400>

- 結構詳しく書いたので、プログラミング学び始めの方でも読めるようになっています。
- 是非、読んでみてください！