Appleの機械学習がヤバい

近年、機械学習はさまざまな分野で利用され注目を高めてきました。また、Firebaseをはじめてとした様々なクラウドサービスで手軽に利用できるほど便利なものになりました。そんな中、今年発表されたAppleの機械学習フレームワークCoreML3がすごかったため、今回CoreML周辺の情報を簡単にですがまとめてみました。

## CoreMLとは?
Appleが2017年に発表した機械学習を扱うためのフレームワークであり、今年新たにCoreML3という名前で強力な機能の追加がなされた。機械学習モデルの仕様はオンデバイスで完結させることができ、さらに`CreateML`というFrameworkを使い機械学習モデルを超簡単に作成することが可能。モデルを作成するためのCreateMLアプリは[こちら](https://developer.apple.com/machine-learning/create-ml/)
下記の画像でCoreMLの上位レイヤー部分にあたるフレームワークがCoreML3にのFeatuesです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/42dcc28f-e5ce-b29c-880c-6d76926b1c0e.png">

参照: https://developer.apple.com/documentation/coreml より


## CoreMLを使用するメリットは？

CoreMLを使用するメリットは下記の通り大きく分けて4つあり、どれもオンデバイスで完結することによる効力を受けています。

#### Privacy
- ネットワークを介してデータのやりとりする必要がないため、個人情報を守ることができる

#### Speed
- デバイス上ですでにある学習モデルを使用するため、データ取得にかかる時間が超高速

#### No Server
 - デバイス上で完結するためサーバが必要なくなります

#### Available
 - トレーニング済みモデルをCoreMLに変換することも可能なため(keras -> CoreML)、自作Modelを有効的に使うことができる(https://developer.apple.com/jp/documentation/coreml/converting_trained_models_to_core_ml/)

## CoreMLで何ができる？

実際にアプリにCoreMLが取り入れられているものを参考に見ていきましょう

- [BootFinder-App](https://apps.apple.com/jp/app/boot-finder/id1472790615)
   
     これは、写真を撮るだけでブーツの種類を判別し、そのブーツを販売しているオンラインストアを探すことができるアプリですが、ネットワークを介していないため、普通にサーバを介してデータを取得する場合とでは処理の速さは一目瞭然です。一度試しに使って見るとわかるのですが、超高速です。
![ml-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/ffcc52f8-7f88-0438-269c-e6635bd03751.jpeg)


- [HomeCourt-App](https://apps.apple.com/jp/app/homecourt-the-basketball-app/id1258520424)

このアプリはバスケの練習を機械学習を用いることで、より効果的にトレーニングを行うことができるアプリです。

##### どこで機械学習が使われている？
 - バスケのドリブルを練習したい場合、ボール・人物・人物のバランスを検知し、トレーニングしたいポイントに応じてバーチャルな目標物が画面に出力され。目標物をタッチすることでトレーニングできる仕組み

##### どう作られてる？

下記の項目が主に使われている機能です。ここではだいたい機能が`Vision`フレームワークを使うことで実現されています。このVisionフレームワークについては別のセクションでも説明します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292456/b00b76d2-2307-88ac-9c19-ce7d6a9b16f3.jpeg" width=480>



- ObjectDetection(物体検知) -> Vision-framework(https://developer.apple.com/documentation/vision/recognizing_objects_in_live_capture)
- ObjectTracking(物体追跡) -> Vision-framework(https://developer.apple.com/documentation/vision/tracking_multiple_objects_or_rectangles_in_video)
- PoseEstimation(姿勢検知) -> https://github.com/tucan9389/PoseEstimation-CoreML <- CoreMLを使った姿勢検知機能。Appleから提供されているModelは見つかりませんでした、、
- HitDetection(衝突検知) -> Vision-framework

## CoreML-Framework
  - Vision(https://developer.apple.com/documentation/vision)
    - FaceDetection 顔をリアルタイムで認知し、トラッキングすることができる(https://developer.apple.com/documentation/vision/tracking_the_user_s_face_in_real_time)
    - FaceLandmarks 顔の76pointの位置を検知することで、細かな表情の変化や瞳の向いている方向などを取得することができる(https://developer.apple.com/documentation/vision/vnfacelandmarks2d)
    - ObjectTracking ビデオ内で複数のオブジェクトをトラッキングすることができる -> トラック競技などで選手などをそれぞれトラッキングすることなどが可能(https://developer.apple.com/documentation/vision/tracking_multiple_objects_or_rectangles_in_video)
  - NaturalLanguage(https://developer.apple.com/documentation/naturallanguage)
    - 言語判定
    - MLTextClassifierを用いてカスタムモデルを作ることも可能
    - textがポジティブな内容かネガティブな内容かなどの判断をすることができる(カスタムModelを作ればさらに細分化して感情を判断することができる)
    - Word Embeddings ワードの類似語を取得するsuggestions機能を簡単に実装することができる(https://www.hackingwithswift.com/example-code/naturallanguage/how-to-find-similar-words-for-a-search-term)(https://developer.apple.com/documentation/naturallanguage/nlembedding)
  - SoundAnalysis(https://developer.apple.com/documentation/soundanalysis)
    - MLSoundClassifierを用いてカスタムモデルを作ることも可能
    - 笑っている声や泣いている声を判断することができる
    - 水の音、車の音、鳥の鳴き声など普段耳にしているような音も判別することができる
    - 活用の例 👇
      - カメラアプリなどで人物が笑っている時などに自動でシャッターを切ることができるなど
  - CreateML(https://developer.apple.com/documentation/createml)
    - Image, Sound, Textなど様々なデータを学習させModelを作成することのできるフレームワーク
    - TableDataも学習させることができる※番外編で活用例紹介(https://developer.apple.com/documentation/createml/mldatatable)
  - これ以外にも様々な機械学習用のFrameworkは数多くありますが、全て紹介することはできないため今回はこのぐらいで🙇‍♂️

## Model Creation
  - MLModel作成用のCreateML-Appで簡単に作ることができる(Xcodeでも可能)

#### Model生成の流れ

1. DataCollection
2. DataPreparation
3. Training
4. Testing

#### MLModelを作る上でポイント

Modelの精度の高まりを認知し、効果的にトレーニングするために、トレーニングの最初からテストを行って行くことが重要です。また、アプリ毎の用途に応じて必要なデータ量などは変わっていきますが`ImageClassification`の場合1クラス10枚から学習することが可能でしたので、手軽に使えそうです。そして、自分は機械学習についての知識は浅かったため知らなかったのですが、無視するべき関係のないデータ(ネガティブクラス)を含めることもModelを作成する上では重要みたいです。なぜ関係のないデータも必要かというと、例えば、りんご・いちごしか学習クラスがなかった場合、画像認識の際にどちらかのカテゴリーに結果が振り分けられますが、他のデータも学習させておくことで間違いの結果に当てはめてしまう確率を下げるということが狙いみたいですね。また、クラス(カテゴリー)のTrainingデータ量のバランスも大事で、できるだけバランスよく均等にデータ量を整えることが質の高いModelを作る上では重要です。

## 最後に

今回はあまり触れていませんでしたが、個人的に`MLDataTable`の活用の幅が広そうだなと感じました。例えば、好みの条件に合わせた地域の家賃相場を算出するアプリなどで、`地域`・`間取り`・`キッチンの広さ`などをそれぞれテーブルのカラムとし、それぞれの家賃を学習させることで、条件にあった地域の家賃がどのくらいなのかをネットワークを介さず高速に算出することができます。このようにCoreMLには色々な活用方法があり、まだまだ便利な機能があると思うので、何か面白そうな機能を見つけたらぜひ教えてください🙏