人工知能でバレンタインチョコが本命か義理かを判別する

2月14日といえば**バレンタインデー(Valentine's Day)**ですね。
日本では、女性から男性へチョコレートを贈る日というイメージが強いと思います。この日を心待ちにしている方も多いのではないのでしょうか。

このように楽しいイベントと認識されているバレンタインデーですが、一方、重要な課題として、**本命チョコ(Honmei Chocholate)**と**義理チョコ(Obligation Chocholate)**が判別できないという問題が挙げられます。

実際、この問題を解くため多くの先行研究がなされています。（参考[1], [2], [3]）
[義理チョコと本命チョコの見分け方！義理チョコをあげる意味や理由って何だろう？](http://9arcus-creation.com/archives/1875.html)
[バレンタインの本命と義理の違い＆見分け方！手作りは！？男性必見！](https://halaioru.com/valentinesday/barentainnohonmeitogirinotigai.html)
[【バレンタイン】やっぱり気になる、“本命か義理チョコ”かを判断するポイントまとめ](https://matome.naver.jp/odai/2142349438486894501)
しかし、既存手法には主観的な要素が入ってしまい、客観的な判断を下すのが難しい、という問題点が挙げられます。

そこで、本記事では、このような課題を解決するため、人工知能を用いてチョコの画像のみから本命チョコと義理チョコを分類します。

この問題は、**二値分類(Binary Classification)**に含まれますが、便宜上、本記事ではこの問題を**本命・義理チョコ分類問題(Honmei・Obligation Chocholate Classification Problem)**と呼びます。

![valentine-bear.jpg](https://qiita-image-store.s3.amazonaws.com/0/221139/37dc664c-9e6a-8cb4-54ed-d8ca09f8c41e.jpeg)


# 動機 -Motivation-
言うまでもないことですが、本命チョコと義理チョコを判別することは、非常に重要な課題です。

男性にとっては、本命チョコを義理チョコと勘違いすると、相手のアプローチに気づかない鈍感な男というレッテルを貼られてしまいます。また、義理チョコを本命チョコと勘違いしてしまうと、恥ずかしい思いをすることとなります。

女性にとっても、どのようなチョコが本命、義理と捉えられるか、ということを把握するのは無用なトラブルを防ぐために非常に重要な課題です。


# 本命・義理チョコ分類問題 -Honmei・Obligation Chocholate Classification Problem-
さて、それでは実際この問題をどのように解いてくいくか、を紹介します。

まず、本命チョコと義理チョコは、以下の画像のようにそれぞれ何らかの特徴を共有していると考えられます。画像は[4], [5], [6], [7]からお借りしました。

![スライド2.png](https://qiita-image-store.s3.amazonaws.com/0/221139/c8610f6f-9da7-203d-fc25-dba0d3dad3d0.png)

よって、この画像を適当な方法で次元削減すると、以下の図のように本命チョコ同士、義理チョコ同士は"近く"、本命チョコと義理チョコは"遠く"なることが期待されます。

![スライド3.png](https://qiita-image-store.s3.amazonaws.com/0/221139/34a96acf-6b14-f762-d0a0-ba94ba230b1b.png)

すなわち、本命チョコと義理チョコの境界が分かれば、与えられた画像から、そのチョコが本命か義理であるかを分類することができます。

![スライド4.png](https://qiita-image-store.s3.amazonaws.com/0/221139/4e1b4212-65de-1df0-a68c-d595602ba71f.png)




# 使用するアルゴリズム -Algorithm-
本記事では、画像認識の分野で、その高い精度から広く用いられている畳み込みニューラルネットワーク**(Convolutional Neural Network; CNN)**を用います。

CNNについては、以前の記事で概念を紹介しているので、詳しく知りたい方はそちらを参照してください。

[カプセルネットワークはニューラルネットワークを超えるか。](https://qiita.com/hiyoko9t/items/f426cba38b6ca1a7aa2b)

今回は、使用するネットワークのみを示します。

![スライド5.png](https://qiita-image-store.s3.amazonaws.com/0/221139/d15e2967-1173-e759-05b2-b63075156b53.png)


# 学習/予測に用いるデータ -Train/Test Data-
今回、学習/予測に用いるデータに用いる画像は、web検索を用いて収集します。ただし、webから取得できた画像枚数が少なかったため、学習データの水増しを行いました。手法としては、左右反転、上下反転を行うことで1枚の画像から4枚の画像を生成しています。

| データ | 検索クエリ | 検索で得た枚数 | 水増し後の枚数 |
|:-----------:|:------------:|:------------:|:------------:|
| 訓練データ(本命)      |  本命チョコ  | 500枚 | 500×4=2000枚 |
| 訓練データ(義理)      |  義理チョコ  | 500枚 | 500×4=2000枚 |
| 予測データ       |  チョコ　プレゼント、バレンタインチョコ       | - | - |

検索の一例を示します。

* 「本命チョコ」で検索した結果
<img width="1680" alt="スクリーンショット 2018-02-09 21.05.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/221139/ebd48754-dd93-9347-05bb-da7a63209c32.png">


* 「義理チョコ」で検索した結果
<img width="1680" alt="スクリーンショット 2018-02-09 21.06.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/221139/cafd69b5-8815-d14d-26d7-ec6af8a6a103.png">

検索結果から、本命チョコは傾向として以下のようなものが挙げられます。

* 形状：ハート型が多い
* 色：カラフル。また、ピンク色が多い

また、義理チョコの傾向としては、次のようなものが挙げられます。

* 形状：凝ったものが少ない。シンプルな長方形など
* 色：（ブラックサンダーの影響のせいか）黒、黄色が多い

これらの情報が予測結果に反映されることが考えられます。


# 結果 -Results-
## 訓練結果 -Train Results-
まず、訓練データに対する**精度(accuracy)**を示します。精度は、予測した結果と実際の結果が完全に一致するとき1、完全に不一致のとき0となります。CNNでは、画像を何度も入力することでこの精度を高めます。

今回はバッチサイズ100、エポック数1000としました。(すなわち、2000枚中100枚を用いて1回の学習とし、それを1000回繰り返します。)

```python
epoch_step 0, training accuracy 0.5
epoch_step 50, training accuracy 0.635776
epoch_step 100, training accuracy 0.72306
epoch_step 150, training accuracy 0.767241
epoch_step 200, training accuracy 0.828664
epoch_step 250, training accuracy 0.852371
epoch_step 300, training accuracy 0.922414
epoch_step 350, training accuracy 0.927802
epoch_step 400, training accuracy 0.920259
epoch_step 450, training accuracy 0.959052
epoch_step 500, training accuracy 0.96875
...
epoch_step 990, training accuracy 0.981681
```

最終的な精度は、0.983836でした。結構いいですね。

グラフにすると次のようになります。横軸がエポック数、縦軸が精度をあらわしています。
学習回数が増えるごとに精度が高くなっていくことがわかります。

![graph.png](https://qiita-image-store.s3.amazonaws.com/0/221139/71c5b06c-1447-ea1f-805f-179ac2b5f771.png)


## 予測結果 -Prediction Results-
最後に、テストデータを用いた予測結果を示します。

どちらに分類されたか、だけだと味気ないので本命・義理チョコである確率（のようなもの）も一緒に見ていきます。（実際は、確率とは異なりますが、あくまで目安として）

* 本命の確率が90%以上と予測されているもの

![スライド7.png](https://qiita-image-store.s3.amazonaws.com/0/221139/3e4c3f63-59d7-37a3-8a3f-e1cddcb34b78.png)

結果を見ると、やはりハート型＋ピンク色という特徴を持つチョコが本命チョコと分類されやすいようです。
魚はちょっとよくわかりません。　

* 義理の確率が90%以上と予測されているもの

![スライド8.png](https://qiita-image-store.s3.amazonaws.com/0/221139/45d3e661-0027-c89d-f439-46d76baca660.png)

本命チョコと比べると、色の種類が少なく、また形状もシンプルなものが多いです。
ブラックサンダーは流石ですね。

* 微妙なもの(一方の確率が40~60%)

![スライド9.png](https://qiita-image-store.s3.amazonaws.com/0/221139/b80e622c-421c-87f3-236d-317151e3a694.png)

判断に困るものとしては、本命・義理チョコ両方の性質を兼ね備えたものが多く見られました。
右下の手は、確かにもらっても判断に困りますね。

# 結論 -Conclusion-
ここまで読んでいただいた方、ありがとうございました。
結果で見た通り、当初考えていたよりも高い精度の分類を行うことができました。
今年のバレンタインも近いので、本記事で、一人でも多くの方が幸福になることを祈ります。

記事に関してお気付きの点、またご感想がありましたら、遠慮なくコメントや[Twitter](https://twitter.com/hiyoko9t)の方でお声がけください。

~~チョコほしい。~~

# 参考文献
[1] Chopic, 「義理チョコと本命チョコの見分け方！義理チョコをあげる意味や理由って何だろう？」, Available at http://9arcus-creation.com/archives/1875.html, Accessed 2018.
[2] いちにのさんし！, 「バレンタインの本命と義理の違い＆見分け方！手作りは！？男性必見！」, Available at https://halaioru.com/valentinesday/barentainnohonmeitogirinotigai.html, Accessed 2018.
[3] NAVERまとめ, 「【バレンタイン】やっぱり気になる、“本命か義理チョコ”かを判断するポイントまとめ」, Available at https://matome.naver.jp/odai/2142349438486894501, Accessed 2018.
[4] 本命チョコ1, Available at http://img-cdn.jg.jugem.jp/297/2720444/20130125_128451.jpg, Accessed 2018.
[5] 本命チョコ2, Available at https://cdn.mdpr.jp/photo/images/d6/e9d/w700c-ez_3a814245adff023e019cfb849cccbb474d876b0d9181a9bb.jpg, Accessed 2018.
[6] 義理チョコ1, Available at https://grapee.jp/wp-content/uploads/12450_00.jpg, Accessed 2018.
[7] 義理チョコ2, Available at https://justmatsumoto.com/wp-content/uploads/2017/01/f35c7b076febe601b3a2c59ca92910be_s.jpg, Accessed 2018.