Ultralytics HUBで学習したモデルを利用し、手持ちのiOS端末で物体検出する。

# 目的

- `Ultralytics HUB`の理解を深める。
- `Ultralytics HUB`で学習したモデルを利用し、手持ちのiOS端末で物体検出をする。

# 背景

`YOLOv5`について理解を深めていたところ、`Ultralytics HUB`（投稿時点ではbeta版）という機械学習プラットフォームを知った。
このプラットフォームはどういったことができるのか、どういった可能性を秘めているのか深めようと思った。

# 前提知識・条件

- `YOLOv5`を使って学習と検出の操作を行ったことがある
- `YOLOv5`で読み込める形式のデータセットが手元にある
- iOS端末を所持している

# Ultralytics HUBとは

`Ultralytics HUB`とは、機械学習モデルの学習、デプロイを行うことができるWebプラットフォームです。
機械学習フレームワークとしては、内部で`YOLOv5`が動いています。

学習設定はUIから行うことができます。
UIは非常にシンプルで、分かりやすく、とっつき易いです。（個人の感想です）

また、iOSやAndroidでリリースされている`Ultralytics`アプリから、`Ultralytics HUB`に登録してある学習済みモデルを読み込み、物体検出を試すことができます。

今回は`サングラス`を検出してみました。こんな感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/b5009bfc-6176-23a0-4d54-91748a7fd725.png)
もちろんですが、`Ultralytics HUB`から学習済みモデルをダウンロードし利用することもできます。（ただし、beta版のため出力形式は限られているようです）

利用プランについて、投稿時点ではbeta版のため無料プランのみ、データセットや学習モデルの保存容量は合計で100.0GBまでのようです。
学習実行環境は現段階では`Google Colab`と自端末のみとなります。
今後、`Ultralytics Cloud`という学習を実行できるクラウド環境が利用可能になるとのことです。

# 内容

### 1.サインアップ

`Ultralytics HUB`のページへアクセスし登録します。

https://hub.ultralytics.com/

GoogleやGithubとの連携も可能なため、お好きな方法を選択し登録してください。
![Pasted Graphic 13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/6e65a50c-905d-5860-ea47-c22190c70f31.png)

### 2.プロジェクトの作成
左の`Projects`メニューを選択し、表示された右側画面の右上`Create Project`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/b14bf077-f9f9-d05b-3465-184835daf7f2.png)
プロジェクト作成画面にて、必要情報を入力し、`Create Project`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/10cb7e10-e24e-7221-4af2-591fc50af99e.png)
作成したプロジェクトが一覧に追加されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/a94576c1-1298-5a7a-d0a2-75c54b41eab3.png)


### 3.データセットのアップロード

左の`Datasets`メニューを選択し、表示された右側画面の右上`Upload Dataset`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/3b056b25-83a1-2cb0-aaf1-b5b31174aa47.png)
データセットをアップロードする画面にて、必要情報の入力とデータセットのzipファイルをドラッグドロップし、`Upload Dataset`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/0115b682-8bb0-84ca-a3a0-e0a740728e41.png)
今回は`サングラス`を検出したかったため、サングラスが写っている画像のデータセットを事前に準備しました。

中身の形式に誤りがある場合は、画面上にエラーが表示されますので、内容に従い修正してください。

参考として、私がアップロードした際のデータセット構成を下記に掲載します。
ちょっと雑ですが、データセットの形式については本投稿のメインではないため簡単な説明に留めます。

- rootフォルダ
    - trainフォルダ
        - imagesフォルダ
            - 画像ファイル
        - labelsフォルダ
            - アノテーション座標が記述された画像ファイルと1対1のテキストファイル
    - validフォルダ
        - trainフォルダ以下と同様
    - testフォルダ
        - trainフォルダ以下と同様
    - data.yamlファイル

`data.yaml`ファイルの中身は下記です。

:::note warn
画像が格納されているフォルダを指定していますが、`data.yaml`が格納されているフォルダからの相対パスとなります。少しだけハマってしまったので皆様もご注意ください。
:::
```yaml
names: [Sunglasses]
nc: 1
test: test/images
train: train/images
val: valid/images
```

しばらくするとアップロードが完了し、一覧の`Status`が`Ready`となることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/5a522ee6-ea62-dc72-e75f-302af653c77b.png)

### 4.モデルの作成
#### 4.1.モデル作成画面表示
左の`Projects`メニューを選択し、`2.プロジェクトの作成`にて作成したプロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/21037b88-831b-8524-27ac-1a961daacc01.png)
右上の`Create Model`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/d60ea88b-cdb2-3cbf-7b4d-a2cb15d70ca0.png)
#### 4.2.モデル情報入力
モデル情報を入力する画面にて、必要情報を入力し`Next`ボタンを押します。
モデルについては検出精度や性能を加味した上でベストなモデルを選択してください。
![Pasted Graphic 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/0cda066d-13a0-3cd9-7c78-6f1234e79936.png)

#### 4.3.データセット選択
データセットを選択する画面にて、アップロードしたデータセットを選択し、`Next`ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/37efd1d9-38ce-505f-7366-1f0aa743c29b.png)
ラベルやデータの分割具合を確認することもできますので、選択したデータセットに誤りがないよう、確認した上で進めるようにしてください。
#### 4.4.学習設定
学習設定画面にて学習環境、学習設定を選択します。
（`Ultralytics Cloud`はまだ提供されていないため選択できません。）
その後、Step1の`API key`をコピーし、Step2の`Open Colab`ボタンを押します。
`Done`ボタンはこの時点では押せません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/127f1de7-67ea-4456-8433-1745c19673d4.png)

`Colabノートブック`が開くことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/f7ca272b-828a-8fc6-3bb4-c73ca964087c.png)
#### 4.5.学習
`Colabノートブック`にて、`Setup`セクションのセルを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/779427f5-65af-0fac-637e-c544c789ead2.png)
実行時、下記のような警告が出ますが、特に問題ないため`このまま実行`ボタンを押し、完了を待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/c853219b-fe66-8cc5-5c54-fbdedecb2689.png)
`Start`セクションのセルのソースコードを編集します。
`API_key`文字列を、先程コピーしたAPI keyに置き換えてください。置き換えたら、`Start`セクションのセルを実行し、完了を待ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/313e1b62-19e3-60d8-9b14-3cc67ae6bc4a.png)
学習が終わったら、`Colabノートブック`を開いた元のページを表示します。
まだ`Done`ボタンを押していない場合は押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/6e47f1e0-2475-53b2-6367-b22ce3fe35e5.png)
モデル一覧に学習済みのモデルが表示され、`Status`が`Trained`であることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/933c5446-f89e-f3b9-236a-32d17783cf4f.png)

### 5.学習結果の確認

左の`Projects`メニューを選択し、先程学習が終わったモデルがあるプロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/21037b88-831b-8524-27ac-1a961daacc01.png)
モデルを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/95269cdb-ed58-205c-41c5-67c742473a4e.png)
画面上部にバッチサイズ、キャッシュ、デバイス、エポック等が表示され、学習時の設定を確認することができます。
`Train`、`Preview`、`Export`タブについては以降順に説明します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/f9ad1a2d-6164-b1ca-5219-ded29ad28aba.png)

- Trainタブ
`mAP`、`Precision`、`Recall`の推移、また損失をグラフで確認できます。
![Pasted Graphic 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/8879ab8b-7cf9-af83-793b-c7f9e9ada660.png)
![Class loss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/0e3ac95e-ee33-dcb7-67ae-4aea98fedb65.png)

- Previewタブ
学習済みモデルの動作を確認できます。
モデルに読み込ませる画像は、画面内からアップロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/1e300596-d2d2-036c-3664-7f95f06b4b25.png)

- Exportタブ
学習済みモデルをエクスポートします。
beta版のため、選択できる形式が2つのみですが、今後のアップデートや、プランによって選択できる形式が変わってくると予想されます。
真ん中より少し右下に`Coming Soon`が表示されてます。待ち遠しいですね。
![sunglasses_model.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/9f2799a4-16f9-6734-7751-7970ba8c61b6.png)
￼
### 6.iOS端末にて検出

ここから先は手持ちのiOS端末での操作に移ります。
使用した端末は`iPad Mini 5`です。

`App Store`にて、`Ultralytics`アプリをインストールします。

:::note warn
他にも似たようなアイコンのアプリが存在しますが、間違えないよう注意してください。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/70ad4968-fe1d-e325-8dd5-63e2cd8ccfc7.png)
アプリをインストールしたら`Settings`タブにてサインインします。アプリ初回起動時にもサインインを促されるため、そのタイミングでも問題ありません。
学習済みモデルを利用する場合、サインインは必須となりますが、初期状態から存在する学習済みモデルを利用し検出する場合は不要です。

:::note
サインイン後にプロフィール入力がありますが、入力完了し待ってても画面が戻らないことがあります。アプリを終了し再度アプリを開くとサインイン状態になっています。同じ状況に陥った場合はお試しください。
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/ab3b282f-5a46-292a-1dcd-357ea03098a9.png)
`Projects`タブにて学習済みモデルがあるプロジェクトを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/e1ec9f96-86cf-f07c-1fda-2bbacdaec962.png)
プロジェクト情報画面が表示されるので、赤枠のダウンロードボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/545505a4-e578-1f26-b08f-db87ec6d9e9d.png)
ちょっと分かりにくいのですが、ダウンロードが完了するとダウンロードボタンがあったところがチェックボックスになります。これをチェックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/ad8df1bb-d789-5efa-d4b8-9c95724a52d1.png)
チェック状態になっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/14faf967-8a29-88ea-90c5-f62e69e16fef.png)
画面下にある青い`Detect`ボタンを押し、画面上部にモデル名が表示されていれば学習済みモデルが選択された状態です。
ちゃんと検出できていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38724/d85b65a6-16ec-bc87-5fea-7c2033fe6b91.png)

これで以上となります。

# 最後に

`Ultralytics HUB`を利用し、簡単に学習と検出ができました。

一度でも`YOLOv5`を使って学習と検出を行ったことがある方であれば、操作も迷うことなく簡単に進めれると思います。
`YOLOv5`の`train.py`に指定できる大体のオプションは存在しましたが、細かなオプションは実装されていないようなので、今後のアップデートに期待しています。もしかするとそこもプランで変わってきたりするのでしょうか？

総じて今後が非常に楽しみなプラットフォームだと思いました。

ぜひ皆様も試してみてください。