【UiPath】AI Centerを使ってRPAに機械学習を導入してみる

# はじめに
AI Centerとは、UiPath社が提供する機械学習プラットフォームサービスです。
これを使うと、RPAと機械学習を連携させることができます。
機械学習に精通している必要はありませんが、基礎的知識はあった方が良いです（学習済みのモデルをStudioから呼び出すだけなら、なんとなくできますが、各モデルの仕様を深堀すると専門的知識が必要です）。

本記事ではAI Centerの基本的な使い方をまとめます。

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

# AI Centerを使うには
AI Centerを使用するには、3つの方法があります。
1. Automation Cloudを使用する
1. Automation Suiteを構築して使用する
1. AI Centerを構築して使用する

## 1. Automation Cloud
UiPath社が提供するクラウド環境を使用します。
簡単に始めることができます。GPUも使用できます。
Community版では使用できません。Enterprise版を購入するか無償トライアルを申請します。

## 2. Automation Suite
自社のデータセンターまたは、AWSなどのパブリッククラウドにて、Automation Suiteを構築します。
Automation SuiteにはAI Centerだけでなく、Orchestratorや他サービスも一度に構築できます。
セキュリティポリシーなど自社の制約でAutomation Cloudが使用できない場合に有効です。

## 3. AI Center
自社のデータセンターまたは、AWSなどのパブリッククラウドにて、AI Centerを構築します。
Automation Suiteと違い、AI Center単独での構築となります。
GPUを使用する場合は、対応したアーキテクチャを選択する必要があります。

# AI Centerを始める
AI Centerを使う手順を簡単に説明します。

※あくまでAI Centerの使い方にフォーカスします。機械学習で最も重要で大変な作業である、モデルの構築、データセットの準備（収集・ラベリング）は済んでいる前提で進めます。

流れは以下の通りです。
![手順1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/35bda903-e5c2-6653-c929-ba57a9a03173.png)

1. プロジェクトを作成する
1. モデルを選ぶ
1. データセットを登録する（選択したモデルによってはスキップできます）
1. パイプラインを実行する（選択したモデルによってはスキップできます）
1. デプロイする
1. Studioから呼び出す

今回のユースケースは、「玄関先の画像をインプットにして、置き配（段ボールなど）があれば、お知らせを通知する」というフローを想定して、物体検出モデルを使って玄関先の画像から段ボールらしき物体を検出させてみたいと思います。
（そんな業務が実際にあるかどうかは置いておきます）

## 1. プロジェクトを作成する
まずはプロジェクトを作成します。
「アクセスを制限」を有効にするとプロジェクトにアクセスできるロールを限定できます。
![プロジェクト作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/188cf2b2-0227-d45d-a9d1-70c0b9a3df60.png)

## 2. モデルを選ぶ
機械学習モデルを選択します。
自作のPythonコードでも良いですが、すでに用意されたプリセットのモデルも使用できます。
AI Centerではモデルを「MLパッケージ」とも呼びます。
※今回は、オープンソースの物体検出モデル（ObjectDetection）を使用します。
![パッケージ作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/9291074d-1562-7430-a15c-8c3bbec39dad.png)
![パッケージ作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/349467f1-6e37-63da-5d0a-627f42249152.png)

## 3. データセットを登録する
トレーニングで使用するデータセットを登録します。
ステップ2で選択したモデルによっては、事前トレーニングが済んでいるものがあるので、このステップは不要になる場合もあります。
※今回使用する物体検出モデルも事前トレーニング済みモデルですが、今回は再トレーニングしてから使用します。
![データセット作成1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/dc4db661-b134-80b1-266e-a51e5118de72.png)

データセットはフォルダ階層ごと登録できます。
今回は、トレーニング用データセット（trainフォルダ）と評価用データセット（testフォルダ）の2つを準備します。
どのような形式のデータを準備するかは選択したモデルによって異なりますが、今回の物体検出モデルでは、各フォルダに画像ファイルとアノテーションファイル（.xml）が複数セット入れておきます（詳細は割愛します）。
![データセット作成2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/b2aa043a-d14f-0763-6ac0-1e50a9d00d7a.png)

## 4. パイプラインを実行する
ステップ3のデータセットを使用し、モデルをトレーニングします。必要であれば、トレーニング後の評価も行えます。
ステップ2で選択したモデルによっては、事前トレーニングが済んでいるものがあるので、このステップは不要になる場合もあります。
※今回使用する物体検出モデルも事前トレーニング済みモデルですが、今回は再トレーニングしてから使用します。

今回は、フルパイプライン（トレーニング＋評価）を実行します。
「パッケージを選択」は、ステップ2で選択したモデルを選び、「入力データセットを選択」、「評価データセットを選択」では、それぞれステップ3で登録したデータセットを選択します。
「パラメータを入力」は、モデル固有のハイパーパラメータで、選択したモデルによって変わります（今回の例では必要ありません）。
実行タイミングは「今すぐ実行」を選択しますが、定期的な再学習をスケジュールすることも可能です。
![パイプライン実行1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/3e34ea11-8559-4eeb-b8f8-b251e6426de6.png)

選択したモデルとデータセットに依存しますが、パイプライン実行（トレーニング）はかなりの時間がかかります。今回の検証では、250件程度のデータセットを用意しましたが、フルパイプラインの実行に6時間半かかりました。GPU対応モデルであれば、GPUを使用することで時間を短縮することが可能です。

フルパイプライン実行後、結果とスコアを確認します。
スコアが不十分であれば、データセットの質が悪いかもしれないので、データセットを変え再度トレーニングします。
![パイプライン実行2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/5d8883ef-6c86-1589-0655-52d21dbdf026.png)

パイプラインが成功したら、MLパッケージのマイナーバージョンを1つ上がります。今回の検証では、v1.0のパッケージをトレーニングして、v1.1のパッケージが生成されました。
![パイプライン実行3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/3efd9c69-0743-2b5b-35e5-efcc628eeb71.png)

## 5. デプロイする
トレーニングしたモデルをStudioから使用するためにデプロイします。
デプロイしたモデルは、AI Centerでは「MLスキル」と呼ばれます。

ステップ4のトレーニングで生成されたバージョンのパッケージを指定します。
「自動更新を有効化」は、パイプライン実行で新規バージョンが生成された際、自動的に最新バージョンをデプロイするオプションです。
「次の非アクティブ期間後にスキルのデプロイを解除」は、MLスキルが一定期間使用されなかった場合、MLスキルを無効化するオプションです。
![デプロイ1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/83bd942c-925f-1258-7b6d-54120b74d394.png)

パイプライン実行ほどではありませんが、デプロイは時間がかかるので、終わるまでしばらく待ってください。

## 6. Studioから呼び出す
デプロイしたMLスキルをStudioから呼び出します。
まず、パッケージ（UiPath.MLServices.Activities）をインストールします。
![Studio1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/6a077dd3-d22a-3e5a-953c-d9ab7ea8ad58.png)

「MLスキル」アクティビティを使用します。
![Studio2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2604ed91-a927-439b-228f-b86ab1bb9b75.png)

StudioとAI Center（Automation Cloud）が接続されていれば、ステップ5でデプロイしたMLスキルを選択することができます。
入力と出力はMLスキルよって異なりますが、今回の物体検出モデルでは、入力は画像ファイルのパス（String型）、出力は検出した物体のカテゴリ、スコアなどを含んだJSON（String型）となります。
![Studio3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/c879815b-660b-8d75-113b-822a8f82ba26.png)

ちなみに一定期間（デプロイ時に指定した期間）、MLスキルを使用しなかった場合、該当のMLスキルは停止状態となりますので、再度使用する場合は、AI Centerから再開を指示します。
![MLスキル停止1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2f5c7354-6800-89fa-6010-59c6af5808b8.png)


作成したワークフローを動かしてみます。

（検証1つ目）玄関に段ボールを置いた画像では、正しく物体（カテゴリ：package）を検出しました。スコアも93％と信頼できる数値です。
![sample1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/0475e9b7-99ce-6819-050d-60e0f633b685.jpeg)

（検証2つ目）玄関に何も置いていない画像では、何も反応しませんでした。
![sample3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/ff1141f6-2a8b-4554-7e1c-a2a83ad5311c.jpeg)

（検証3つ目）スコアは低いですが、猫のエサ入れに反応してしまいました。学習データを工夫して再トレーニングさせれば、検出しないようにできるかもしれません。
![sample4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/2e469d86-1051-99f2-5135-a87764e8feca.jpeg)

# おまけ
Studio（Robot）からAI Centerへデータセットをアップロードすることができます
これを活用すると、精度が微妙なデータをラベリングし直し、再トレーニング用のデータセットとしてアップロードする流れを自動化することができます。
さらにパイプラインを定期的な実行としておくことで、機械学習モデルの運用を効率化することができます。
![ファイルアップロード1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89445/355986bb-4d4d-4cc4-01b9-dc559b023ae2.png)


# さいごに
AI CenterとUiPathワークフローの連携の流れを説明しました。
今後は、個々の機械学習モデルについて、詳細な使い方（データセットの準備、トレーニングのパラメータなど）を検証してみます。