UiPath AI Center 第2回 基礎編 物体検出モデルを再トレーニングして自分の子供を検出します

[第一回の記事](https://qiita.com/utanesuke/private/43af7e88f2fb05b288f1)では、 AI CenterでのObject Detectionモデルを使って物体検出を行いました。
Object Detectionは、汎用的で再トレーニング可能なディープラーニングモデルで、オブジェクト検出を実行するために使用されます。このMLパッケージはCOCOのデータセットで事前にトレーニングされており、COCOデータセットの80個のクラスを識別するために使用することができます。
以下に、この80個のクラスを示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/af90ddb4-8e24-a25b-cbcd-d4395370f704.png)
上記以外の物体を検出する場合は、データを投入してObject Detectionモデルを再学習する必要があります。
AI Centerでは、データの投入と再学習は以下の処理（③と④）で行います。
```mermaid
graph LR
  1.プロジェクト作成-->2.MLパッケージ選ぶ
　2.MLパッケージ選ぶ-->3.データセット登録
  3.データセット登録-->4.パイプライン実行
  4.パイプライン実行-->5.MLスキル作成
　5.MLスキル作成-->6.StudioからMLスキル利用
```

今回は、このモデルを使用して自分の子供を検出できるようにするために、データの準備と再学習の方法について解説していきます。

# 1. データセットの準備

ObjectDetectionの入力データには、画像データとXML 注釈ファイルの両方が必要です。それぞれのフォーマットは以下の通りです。

- **画像データ**
既定では、このモデルは .jpg 形式と .jpeg 形式の画像を読み取ります。以下に、入力画像に関する考慮事項をいくつか示します。
    1. 同じ形式のすべての画像を含めます。
    2. 同じサイズ (推奨サイズ 800*600) のすべての画像を含めます。
    3. オブジェクトの各カテゴリについて、100 以上の画像を含めます。

- **XML 注釈ファイル**
アップロードされる画像ごとに、画像の境界ボックスの詳細が記述された注釈の .XML ファイルが必要です。この .XML ファイルは Pascal VOC 形式である必要があります。
画像に注釈を付けるために、LabelImg などのオープンソースの注釈ツールまたはその他の任意のツールを使用できます。

データフォーマットの詳細は[**データセット フォーマット ページ**](https://docs.uipath.com/ja/ai-center/automation-cloud/latest/user-guide/object-detection#dataset-format) を参照してください。

## 1.1 子供写真収集

携帯で子供の一年間の写真を集めました。特に息子が写真を撮るときには、変顔をしたりしていたので、60枚ほどの写真を集めるのは大変でした。

## 1.2 写真のリサイズ

写真データのピクセルサイズが大きいため、推奨サイズの800×600にリサイズする必要があります。画像編集のツールは数多く存在していますので、適切なツールを選んで写真のサイズを800×600に変更してください。

## 1.3 ラベリングツールのインストール

オープンソースのラベリングツールが多数あります(例：[labelImg](https://github.com/heartexlabs/labelImg)と[Label Studio](https://labelstud.io/guide/start.html))。私はこちらで**Label Studio**を使用しました。
Label StudioはPythonやDocker、またはAnacondaからインストールすることができますので、自分にとってやりやすい方法でインストールしてください。詳細なインストール方法については、[このページ](https://labelstud.io/guide/install.html)を参照してください。
インストールが成功したら、http://localhost:8080 にアクセスし、以下のようなサインイン画面が表示されると、Label Studioが利用可能になります。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/445aabd2-efef-13ec-3e6a-8b8bf802cd97.png" width=640>

## 1.4 写真のラベリング

ラベリングツールのLabel Studioがインストールされたら、子供の顔に対してラベリングを行います。Label Studioの使用方法についてはこちらでは省略しますので、[Label Studioのマニュアル](https://labelstud.io/guide/get_started.html#Quick-start)を参照してください。

顔に四角形で選択する方法は以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/4710e1e2-c8cb-f7f5-f2a2-05f3969d416a.png)

全ての画像のラベリングが終わったら、メイン画面に戻して、データ一式をエクスポートします。データセットは **Pascal VOC 形式**である必要がありますので、エクスポートする際に、Pascal VOC XMLを選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/ce80ae37-a790-a46d-6f16-18dd2b8ba7f2.png" width=480>

## 1.5 作成したデータ一式

最後に準備したのデータセットは以下のようなイメージです。60枚の画像データ及びXML 注釈ファイルが一つのフォルダーに保存されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/545883a9-920f-ba3f-fd5d-2e9317d7d2ad.png)

実際に画像データとXMLの注釈データの関連性は以下の通りです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/34c4f34f-603b-5433-dce6-013c1e048a16.png)

# 2. データセットの作成
[UiPath AI Center 第1回 基礎編](https://qiita.com/utanesuke/items/43af7e88f2fb05b288f1#31-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)で作成したプロジェクトで、データセットを作成しますので、第1回で作成したプロジェクトに入って、データセットを作成します。

**手順：**
- 左側のナビゲーション バーからの**データセット**に移動して、**新規作成**をクリックします。
- 次の**新しいデータセットを作成**ページに、**データセット名**に名前を入力して、**作成**をクリックします。
- 新しいデータセットの画面に、右側の**ファイルをアップロード**をクリックして、作成した60枚の画像データ及びXML 注釈ファイル一式を**アップロードします**。
- アップロード完了したら、データセットは以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/6c7d16e3-db70-d35f-8923-6ad758cb7152.png)

# 3. パイプライン実行
[UiPath AI Center 第1回 基礎編](https://qiita.com/utanesuke/items/43af7e88f2fb05b288f1#32-%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E9%81%B8%E3%81%B3%E3%81%BE%E3%81%99)で作成したMLパッケージを再トレーニングします。

**手順：**
- 左側のナビゲーション バーからの**パイプライン**に移動して、**新規作成**をクリックします。
- 以下の設定して、**作成**をクリックします。
    - パイプラインの種類：フル パイプラインの実行<sup>補足</sup>
    - パッケージを選択：第一回で作成した**Junli_Demo_FaceRecognition**を選択
    - 入力データセットを選択：上記2で作成したデータセットを選択
    - 評価データセットを選択：選択せずに空白でOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/b7d7f85b-311d-3c46-59b4-7893d7e60bac.png)
- メイン画面に戻って、作成したパイプラインのステータスが**実行中**になっていることを確認します。
- 60枚画像の場合はほぼ2時間かかりました。2時間後該当パイプラインのステータスが成功になったら、MLパッケージの再トレーニングが完了しました。
- MLパッケージ画面にて、該当MLパッケージの状態を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/e1d58396-6afb-f837-61ab-6bb3ff11ef75.png)


:::note info
**補足：**
Object Detection (オブジェクト検出)のMLパッケージでは、フル パイプラインの実行のみがサポートされます。
:::

# 4. ML スキルの更新

作成したML スキルが自動更新であれば、既に上記の再トレーニング済の新しいバージョン(22.12.0.1)のパッケージが適用されます。
自動更新ではない場合は、手動で新しいバージョン(22.12.0.1)のパッケージを選択して適用してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/e06166df-354f-18fd-e500-146417150aeb.png)

# 5. 再トレーニング済のML パッケージを使って確認する

[UiPath AI Center 第1回 基礎編](https://qiita.com/utanesuke/items/43af7e88f2fb05b288f1)で作成した[ワークフロー](https://drive.google.com/drive/folders/1dv0VG7yEt1EBbPOxGfK4-JXpW7-3iTDn?usp=sharing)を使用して、写真から子供を検出します。

**手順：**
- 上記データセットに存在していない写真を何枚準備します。
- 上記ワークフローを実行して、準備した写真に対して検出します。

検出した結果を確認します。新しい写真からでも息子(Junli's boy)と娘(Junli's gir)の顔を正しく検出できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177240/c5a739e8-c1e8-5ea9-bc08-16a97e267c2d.png)

# 6. 最後に

今回は、UiPathのAI Centerで既に利用可能なモデルを自分のデータセットで再トレーニングしました。次回は、自分のAIモデルをUiPathのAI Centerにアップロードして使ってみます。


# 参考資料

https://docs.uipath.com/ja/ai-center/automation-cloud/latest/user-guide/object-detection


https://labelstud.io/guide/install.html


https://github.com/heartexlabs/label-studio


https://lib-arts.hatenablog.com/entry/dataset_ml1


https://laid-back-scientist.com/labelimg#toc2