文系学生が機械学習を学んだ半年間の軌跡

##はじめに
[機械学習をどう学んだか by 日経 xTECH ビジネスAI② Advent Calendar 2019](https://qiita.com/advent-calendar/2019/machine-learning-01)の25日目です。
この記事では 文系大学生が半年で "機械学習をどう学んだか" について書きます。

ポエム調に書いてますので、結果が知りたい方は、
学習内容(Aidemy)、Aidemy後の学習内容、試作機(1万枚&CoreML化)、まとめ
をご覧ください。

##きっかけ
きっかけは、ランニングをしながらよく考え事をするのですが、
その時に思いついた**落書きアートミュージアム**でした。

割とアホな理由から始めたもんだなと思いますが、当時の自分は制作意欲に燃えていました🔥

ちなみに...
※落書きアートミュージアムって何？
→ 世界の落書き情報を集約し、絵画情報を学習させたAIに読み込ませて新しいアートにしよう！
つまり人間が描いた落書き情報をもとに学習済みAIが新たに落書き情報を再配置させようというものです)

##早速...
さて、1週間経っても制作意欲が失せることがなかったので、
作るためには何が必要なのか情報を集めました。

調べてみると、機械学習が絶対必要 
(AI利用したいって言っとるんだから当然なのですが...
本当にAIは必要なのか？ということも踏まえて。)

ということで機械学習を学ぶことになりました！

##機械学習を学習
半年間の休学期間だったため、短期的に集中学習がしたい。
ということで、Aidemyさんで画像認識に関する講座を受講しました。

(もちろん費用は自腹を切りました...嗚呼)
##学習内容(Aidemy)
・Python入門
・Numpy基礎
・Pandas基礎
・Matplotlib基礎
・データクレンジング
・スクレイピング
・機械学習概論
・教師あり学習
・教師なし学習
・ディープラーニング基礎
・CNNを用いた画像認識
・画像認識アプリの作成

本当に機械学習における基礎を学びました。
自分は質問が多めだったので、メンターさんがいて良かったかなとは思いますが、
正直、Mentaで機械学習詳しい人に聞いて学習しても良かったかなとは今では思います。
(人それぞれかと...)

##Aidemy後の学習内容
Aidemy受講終了後、数学について学ぶ必要があると思い数学を勉強します。(かなり基礎)
・微分積分
・統計基礎
・線形代数
この辺です。

数学学習後、機械学習に関する論文や研究を調べて覗いてみました。

...
　
なんとなくはわかるけど... 

ほ？

要するにレベルが違いすぎて理解に苦労しました。
噛み砕いていくとなるほど、なるほどと理解できるようになってきましたが、それでもわからないこともある...

このような形で最新の研究ではどこまで進んでいて、実用できる技術はどのへんなのか、またその技術の仕組みを理解しようと試みました。



##落書きアートミュージアムはできるのか？
実はこの記事を書いている現在も具体的にどう作れば良いのか模索しています。
というのも、落書き情報を特定座標に**再配置する**というのはアバウトすぎます。

また、そもそも再配置させなくても良いのではないか？
→ cycle GANなど使用すれば落書き情報を学習できるから、再配置しなくても良いのではないか？
といった具合に**自分でも練り上げれていない部分**が浮き彫りになりました。

ここで、落書きアートミュージアム制作を一から考え直すことになり、
一旦クローズすることにしました。
(**実力が伴っていないことや、そもそもアバウトすぎて具体的な解決方法がないため**)


##散った後どうしたのか？
落書きアートミュージアムの構想も考えながらも、**オリジナルアプリ**ができないか考えます。
自分はコーヒーが好きで、よくコーヒー巡りをしていたのですが、コーヒーで面白いアプリはできないか？

...

全然思い浮かびませんでした...


##アイデアの転機
いつものようにコーヒー巡りをしていたわけですが、巡っていたコーヒー店で面白い話に遭遇します。

店員： 〇〇Coffeeさん例の欠点豆入ってたらしくて、一袋(コーヒー豆)ダメになったらしいよ。

**店主: あーあれ一粒でも入っていると全部の豆ダメにしちゃうやつだろ？
　　　うちはまだないけど、入ってたら怖いね~**


自分: え？ そんな豆があるんですか？

...以後省略

聴いてみると、どうやらその豆は**発酵豆**のようです。
発酵しすぎた上に異臭を放ち周りにも危害を加える最悪の豆のよう。

**ここで初めてコーヒー豆には欠点豆があることを知ります。**

欠点豆についてバリスタさんから教えてもらった私は、早速欠点豆について調べます。
ふむふむいろんな種類があるな...

**あれ?**

**ハンドピッキングしてる!?**

そうです、技術が進歩しているにも関わらず、**いまだに欠点豆処理がハンドピッキングなのです！**

※ハンドピッキング: 人の手で欠点豆を除去すること

##そうだ、欠点豆検出アプリを作ろう!!
前置きが長くなってしまいましたが、
要は、**画像認識を使って欠点豆を検出するアプリを作ろうというものです！**

ただ、自分はハードが作れないので、とりあえずソフトを作ろうということで制作を計画します。

##実現方法
まず現実に落とし込む必要があります。
自分の頭のイメージでは、スマホのカメラをかざしただけで欠点豆を検出したい！
**→　ということは物体検出**

物体検出を調べると様々な手法が見つかります。
とりあえず調べていくと**SSD系 or YOLO系**のどちらかとなりました。

結果YOLOの方が速く、Tiny-YOLOではCoreML変換でiOSアプリとして使用できることから、
**YOLO**を選択しました。(SSDでもできるが、速さを重視しました)

ある程度調べてみて、実現可能の目処が経ったので作成を開始します。

##欠点豆を収集
まずは料理でいう**材料**がないと何も始まらないので、欠点豆を集めます。

自分は以下方法を使用して収集しました。
**1.SNSで集める**
**2.直接お願いしてコーヒー企業さんから集める**

1は生豆を集める際に使用し、多くのコーヒー関係者の方々からご協力いただきました！
2は直接お願いして、某コーヒー企業様から焙煎後の欠点豆をいただきました！

本当にありがとうございます(泣)

##アノテーション(ラベル付け)
**この作業が一番しんどかったです。**
なんせいただいた欠点豆を撮影して、さらにその画像にラベルを一枚一枚手作業で付けていくのですが、
これを**1万枚全て**に行います。

一週間ほどかかりました。
##実装
ここはYOLOという巨人の肩に乗り、YOLOのモデルはいじらず、
batch数や他のパラメータをいじることで最適化させようとします。

510枚アノテーションした際にこれでいけるのかを試しました。
記録を残し忘れたのですが、
**epoch:300 loss: 10.81**
くらいだったと思います。

**epoch:400**を超えると、**過学習**に陥り、**Lossが ∞(無限大)**になってしまいました。
とりあえずまだ使える**epoch:300 loss: 10.81**の weightsを使用して試したところ...

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">510枚の学習データで試しましたが、微妙ですね笑<br><br>焙煎後で色も似てることから、5000枚に増やして再学習させたいと思います!!<br><br>(5000枚を手作業で...嗚呼) <a href="https://t.co/6idayn0FFL">pic.twitter.com/6idayn0FFL</a></p>&mdash; Mr.Beans(ミスタービーンズ) (@91beans) <a href="https://twitter.com/91beans/status/1177155455476322304?ref_src=twsrc%5Etfw">September 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな形で微妙ですが、なんとか認識しようと頑張っています。

##5000枚に増強すると...
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">良い感じにはなってきましたが誤認識が多々ある。<br><br>うーん。もう少し簡単なデータに作り替える必要があるよう... <a href="https://t.co/9L5ixqcc1Y">pic.twitter.com/9L5ixqcc1Y</a></p>&mdash; Mr.Beans(ミスタービーンズ) (@91beans) <a href="https://twitter.com/91beans/status/1178208240997240833?ref_src=twsrc%5Etfw">September 29, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

500枚よりも精度が上がっていることがわかります!!
あとは、画像増強とパラメータの最適化！！

という形で進めました！！

##試作機(1万枚&CoreML化)
さて、**1万枚**の学習データで、**1万2000回**の学習後、CoreML変換し、Swiftで実装できるようにしました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">ズーム修正、ピント(焦点)機能を追加しました!!<br><br>想像した感じの出来になってなんとか安心。<br><br>あと2万枚画像を増やして精度あげたらリリースする予定です!!<a href="https://twitter.com/hashtag/%E3%82%B3%E3%83%BC%E3%83%92%E3%83%BC%E8%B1%86?src=hash&amp;ref_src=twsrc%5Etfw">#コーヒー豆</a><a href="https://twitter.com/hashtag/%E6%AC%A0%E7%82%B9%E8%B1%86?src=hash&amp;ref_src=twsrc%5Etfw">#欠点豆</a> <a href="https://twitter.com/hashtag/%E7%89%A9%E4%BD%93%E6%A4%9C%E5%87%BA?src=hash&amp;ref_src=twsrc%5Etfw">#物体検出</a> <a href="https://t.co/r9Q3ofvjxa">pic.twitter.com/r9Q3ofvjxa</a></p>&mdash; Mr.Beans(ミスタービーンズ) (@91beans) <a href="https://twitter.com/91beans/status/1198435554964041728?ref_src=twsrc%5Etfw">November 24, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##まとめ
ここまで長く説明しましたが、自分がこの半年で学んだのは大きく分けて2つです。
**・機械学習における必要不可欠な基礎的内容と数学的知識**
**・オリジナルアプリ開発を通して実際の泥臭さと、実現できた喜び体感すること**

機械学習エンジニアさんから見ると、自分が半年で学んだ内容はかなり薄いかもしれませんね。

欠点豆検出アプリについては[こちら](https://qiita.com/piyomatu-piyomatu/items/3f006f8978bda6d8b4ea)に記載しておりますので、
詳しく知りたい方は是非ご覧ください。

##今後の課題
正直無限にあるかとは思いますが、次のステップとして以下が当てはまります。
**・数学的知識の増強 (これは最重要課題)**
**・Kaggleへのチャレンジ (データ処理や実装の経験値をあげることが可能)**
**・理論内容の理解**
**・積極的に輪読会や勉強会への参加**
**・第2弾 オリジナルアプリの開発　(課題が見える+モチベも上がるので非常に良い)**

これから機械学習したい方の参考になればと思います。