【UiPath】物体検出モデルを使ってみる（AI Center）

# はじめに
この記事はUiPathブログ発信チャレンジ2022サマーの4日目の記事です。

https://note.com/shumpei_w/n/n19383ce5abb1

昨日は[@RPA_Journey](https://twitter.com/RPA_Journey)さんの記事、明日は[@masatomix](https://twitter.com/masatomix)さんの記事です。

https://twitter.com/RPA_Journey/status/1543249443142926337

---
AI Centerでプリセットされている機械学習モデル「物体検出（Object Detection）」を深堀りしてみます。
AI Centerの大まかな使い方は以下の記事で説明しています。

https://qiita.com/shuy/items/8f732357a1b2e8f61e06

# つかうもの
※クラウド環境は2022年6月時点のもの
* Automation Cloud(AI Center) Enterprise版

# モデルの概要
![概要1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/e9d05ee3-e2a9-8989-c66a-de8380330e02.png)
物体検出とは、深層学習（ディープラーニング）を使用したデジタル画像内に映っている特定のクラス（人間、建物、車といったカテゴリ）の物体を検出するモデルです。
AI Centerで用意されているものは、YOLO v3を使ったモデルです。GPUはサポートさせていません。

* 論文：https://arxiv.org/abs/1804.02767
* YOLO公式：https://pjreddie.com/darknet/yolo/

COCOデータセットを使って事前学習がされているので、以下の80個のクラスであれば、再トレーニングをしなくても検出することが可能です。
一覧にないクラスを検出するのであれば、自分でデータセットを準備し、再トレーニングします。

https://cocodataset.org/

![cocoデータセット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/f29704af-b07b-37f0-64e5-12d896a88b9c.png)


|事前学習済みのクラス|
|-|
|person, backpack, umbrella, handbag, tie, suitcase|
|bicycle, car, motorcycle, airplane, bus, train, truck, boat|
|traffic light, fire hydrant, stop sign, parking meter, bench|
|bird, cat, dog, horse, sheep, cow, elephant, bear, zebra, giraffe|
|frisbee, skis, snowboard, sports ball, kite, baseball bat, baseball glove, skateboard, surfboard, tennis racket| |bottle, wine glass, cup, fork, knife, spoon, bowl|
|banana, apple, sandwich, orange, broccoli, carrot, hot dog, pizza, donut, cake|
|chair, couch, potted plant, bed, dining table, toilet|
|tv, laptop, mouse, remote, keyboard, cell phone|
|microwave, oven, toaster, sink, refrigerator|
|book, clock, vase, scissors, teddy bear, hair drier, toothbrush|

# データセット
再トレーニングするためのデータは、PASCAL VOCという形式に準拠したセットを用意する必要があります。

* 画像ファイル（.jpgまたは.pjeg）とアノテーションファイル（.xml）の1対1で用意する
* 画像ファイルとアノテーションファイルのファイル名は同じにする
* 画像ファイルは同じサイズに統一する（推奨 800*600）

![データセット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/80902108-3a5e-b921-6f32-b78d9617c24d.png)
![データセット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/079a66ad-de60-6fe6-a2bd-71ce1fb6cd3e.png)

用意するデータセットの目安です（あくまで参考です）。

* 最低限のレベルは、1クラスに対して、100枚程度
* 標準的なレベルで、1クラスに対して、500～1,000枚程度
* 高精度（似た物体を分けて認識するなど）なレベルで、1クラスに対して、5,000枚以上

データ準備とラベリング作業は、かなり大変です。
アノテーションファイルを手作業で作成するのは、コスト的に現実的ではないので、何かしらのツールを使います。
オープンデータセットを活用する手もあります（ものによっては、PASCAL VOCでダウンロード可能です）。

# パイプライン
フルパイプライン（トレーニング＋評価）のみサポートされています。
実行時に指定できる環境変数（ハイパーパラメータ）は、以下の通りです。

* learning_rate：学習率（ディープラーニングを実行する際、勾配をどれくらい変化させるかを示したもの）。デフォルトは、0.0001。

フルパイプラインの実行時間は、経験上、250件程度のデータセットを用意して、6時間半くらいかかりました（あくまで参考です）。

# 実行結果
![MLスキル1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/bd1c72c9-8a9e-0d4f-ac20-fe2c3ea1effd.png)

入力は、画像ファイルのパスです（String型）。
出力は、検出したクラスとスコアを含むJSONです（String型）。
スコアは、0～1の間の数値で、1に近いほど信頼できる予測となります。
検出した物体の座標値は出力されないので、これらが欲しい場合は、Pythonのコードを修正する必要がありそうです（試したことはありません）。

```
{
  "Predicted Class ": "[
    {'class': 'package', 'score': ' 0.93'}
  ]",
  "Predicted ByteArray": "..."
}
```

「Predicted ByteArray」はエンコードされた画像データです。以下の処理で画像ファイルに戻すことができます。
![sample1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/a1f61d7c-5d80-41f6-573c-3b09cbfb0ecb.jpeg)
![ファイル作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ec5875e1-5848-9ed1-78bb-a8e8a085f32f.png)

# おわりに
実際の業務で使用する場合は、COCOデータセットではなく、業務データを使って再学習するケースがほとんどかと思います。
物体検出モデルはよく使用されるモデルなので、使い方を覚えておいて損はないかと思います。
機会があれば、他のモデルも試したいと思います。

# 参考
https://docs.uipath.com/ai-fabric/lang-ja/v0/docs/object-detection