CoreMLとCreateMLを使って犬の犬種予測AI（IOSアプリ）を作ってみた！

この記事は、フラー株式会社 Advent Calendar 2021 の17日目の記事です。
16日目の記事は @yudai_watanabe さんによる [iBeaconについてとその使い道を考えてみる!]
(https://qiita.com/yudai_watanabe/items/2b94334fc6e76aff2a0f) でした。

## はじめに

こんにちは。
今年から、フラーでiosエンジニアとしてアルバイトをさせていただいている住安です。
現在、大学4年で機械学習に関する研究を行なっています。
そこで、アプリ+機械学習でなにか作成したら、今年を締めくくれるのではないかと思い、犬の犬種予測AIを作ってみることにしました。

最終目標は、自分で学習させたモデルが我が家の愛犬ハルくんの犬種をあてることです！

実際に作成したものはこちら
[https://github.com/KosukeSumiyasu/DogClassifier/](https://github.com/KosukeSumiyasu/DogClassifier/)

<img width="250" alt="IMG_8879 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/d0b0dd0b-09b1-5088-2865-a6ee270497f7.png">

このような記事を書くのは初めてなのでおてやわらかに...

## CoreMLとCreateMLとは

アプリに機械学習モデルの組み込みを容易にさせるフレームワークです。
機械学習は、「モデルの学習」を行い、学習を行なった「モデルを用いた推論」を行います。
CoreMLは、「モデルを用いた推論」、CreateMLは、「モデルの学習」に特化したものになります。
<img width="400" alt="createML.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/f069c9be-4e6a-2e5c-2d71-d949b64b42e9.png">

CoreMLについては、公式に実際「モデルの学習」済みのモデルがあるので、これを用いればCreateMLを用いなくてもCoreMLがどんなものかわかると思います。
また、単純にどんなものか触って見たい方は、[公式サンプル](https://developer.apple.com/jp/machine-learning/models/)があるので、コードを持ってくるのもありだと思います。


[公式CoreML](https://developer.apple.com/machine-learning/core-ml/)
[公式CreateML](https://developer.apple.com/documentation/createml)

## 学習させたデータ

今回は、CreateMLで学習させたデータとして、Dog APIから画像を取得し、データセットとしました。
このAPIは、[dog apiサンプルURL](https://dog.ceo/api/breeds/image/random)を押すと、ランダムで犬の画像(URL)を返してくれます。
実際の中身は、以下のようにJSON形式で記載されています。

```
{
    "message": "https://images.dog.ceo/breeds/tervuren/yoda_in_sofa.jpg",
    "status": "success"
}
```

また、検索するURLを変えることで犬種を指定することができたり、取得する枚数を指定することができます。
くわしくは[こちら](https://github.com/ElliottLandsborough/dog-ceo-api)に

データセットは、犬種（ラブラドール・レトリバー、ゴールデン・レトリバー、フラットコーテッド・レトリーバー、チェサピーク・ベイ・レトリーバー、カーリーコーテッド・レトリーバー、ハスキー、ドーベルマン、ビーグル）の100枚ずつとしました。

[Dog API](https://dog.ceo/dog-api/)

## 作成

### 作成手順

1.Dog APIから学習用のデータを持ってくる
2.CreateMLを用いて機械学習モデルを作る
3.CoreMLを用いて推論を行う部分をつくり、UIとつなげる。

今回は、CreateMLがすごく実装が簡単であったため、紹介も兼ねて2について説明していきたい思います。実装の大体は、公式ドキュメントと等しいと思います。推論時に用いる画像は、UIImagePickerControllerを使用しました。

### CreateMLを用いて機械学習モデルを作る

実際にCreateMLを用いて機械学習モデルを作っていきたいと思います。

X code > Open Developer Tool > Create ML
New documentを選択、この複数のテンプレートのうち今回は画像分類を行いたいので、Image Classificationを選択。

![スクリーンショット 2021-12-16 5.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/f21ef19b-4f24-d023-c9ad-1071732d90c3.png)

ファイル名や保存先を決めると、以下の画面が出てくる。

![スクリーンショット 2021-12-16 6.02.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/836440f8-ac2f-92a2-ac67-6a9b841e5ffd.png)

学習用データをドラッグ&ドロップでDataにいれてTrainを押す

少し補足すると、Data下のParametersの部分は、Iteractionsは、学習をどれくらい繰り返して行うのかを示し、Augmentationsは、学習データの増強を行うためにノイズを足すかどうか(Add Noise)、画像を反転させるか(Flip)などを指す。

はい、以上の手順でモデルが作成できてしまいます。通常、モデルを学習させる際には、モデルのネットワークを選択したり、ハイパーパラメータというものをいじったりしないといけないのですが、これだけでできてしまいます。
簡単すぎる...

![スクリーンショット 2021-12-16 18.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/43d0a765-b4c3-af3a-502f-d28b10a55244.png)

これでモデルの作成ができました。作成したモデルを保存して、以下のようにモデルを読み込めばモデルを用いた推論ができるようになります！

```
let defaultConfig = MLModelConfiguration()
guard let model = try? VNCoreMLModel(for: DogImageClassifier_1(configuration: defaultConfig).model) else { return }
```

## 実際に分類してみる

我が家のハルくんの犬種はラブラドールレトリバーです。
アプリを用いてハルくんの写真を分類してみると

<img width="250" alt="IMG_8879 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/d0b0dd0b-09b1-5088-2865-a6ee270497f7.png">

みごとに76.8%でlabradorと予測されました！


## さいごに

今回は、前々から触って見たいなと思っていたCoreMLとCreateMLを用いた犬の分類器のアプリを作成して見ました。
想像よりも簡単にアプリに分類器をつけることができるなと思いました。
学習不足なだけかもしれませんが、モデルの学習が簡単な分、触れる部分が少ないので、細々としたモデルの精度向上手法ができないなーとも思いました。


## 困った点

困った部分を一応共有しておきます。
今回は、Iteractionsを35回、Augmentationsはなしで実際に学習させようとしました。
そうすると、以下の画像のように精度の学習曲線が出力されます。ですが、途中で途切れていることがわかります。
おそらく何かのストッパーがかかり、iteractionsが10回で学習が終了してしまうみたいです。
調べて見たのですが、学習が足りていない場合でもなっている方がいるため、具体的な解決案は見つけることができませんでした。

![スクリーンショット 2021-12-16 2.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2272880/11659d77-66b1-dd02-244e-04af205f9d9d.png)