【UiPath×AI】UiPathからGoogle Vision APIを呼ぶ

# 前置き
　以前から「何かUiPathでAI連携っぽい事を試したい」と考えていたのですが、7/30の[UiPath AI Expo](https://uipath-ai-expo.jp/)のセッションでGoogleやMSが"学習済みAI"を紹介してたのを思い出したので、手軽に試せるネタとしてUiPathから学習済みAIへ連携させてみます。

# まぁちょっとコレを見てよ
[ゲーム](https://ec.nintendo.com/JP/ja/titles/70010000010548)のスクリーンショットを[Google Cloud Vision AIのデモ画面](https://cloud.google.com/vision/?hl=ja)に食わせてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/decb7af0-2377-60c6-60c6-a48c9cd2078d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/99356b0e-b3f9-f032-a1a1-8352eb153ba6.png)
すごくない？UiPathとは全然関係ないけど、
画像をアップロードするだけで様々な情報を取り出してくれます。

- まず日本語OCRの精度は完璧（むしろ取り過ぎてる）
- キャラクターと被ってる小さなテキストすら正確に抽出
- 画像中のキャラクターも（ゲームCGなのに）人と認識できてる

これがクラウドの学習済みAIの威力なのか・・・

無料期間があったりタダで試せるAIサービスとしては

- Microsoft Azure Cloud [Cognitive Services](https://azure.microsoft.com/ja-jp/services/cognitive-services/directory/)
- Google Cloud [AI & Machine learning](https://cloud.google.com/products/ai/?hl=ja)
- [IBM Watson](https://cloud.ibm.com/catalog?category=ai) ※ライトプラン

などがありますが、上記デモ画面の結果を見て即Google Cloudに決めました。

アカウント登録にクレジットカードの登録が必要ですが、無理な使い方しなければ12ヶ月間は無料なので、その範囲で色々やっていきます。
早速サービスアカウント作って、Cloud Vision AI用のAPIキーを取得しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/08b40a76-d052-b298-6584-45408d453941.png)
これでGoogle側の準備は完了、早速UiPathからAPI経由で画像を送り、Vision AIから解析結果を受けてみようと思います。

# Google Vision API連携用パッケージを使う
APIなので普通ならPython等のScriptから呼ぶんだけど、さすがUiPath、既にUiPath GO!に連携用パッケージ [Google Vision](https://go.uipath.com/ja/component/client-for-google-vision) が用意されてます。
（ちなみにStudioのパッケージ管理ダイアログからもお手軽にインストールできます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/92286bbf-b083-ed7d-a3a3-c1b7ba7fe1d6.png)

ちなみにGO!ページの"リソース"タブには解説書も付いてます。優しい！でも中身English！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/58561ef9-7b86-f1d9-0b2a-16cf750eff43.png)

インストールするとアクティビティパネルに連携 > Google > Vision の階層でActivityが用意されます。今回は"テキストを検出"(Text Detection)を使って画像中のテキストを抽出してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/a2af2081-2276-dab6-06b1-f158202729a3.png)

# Vision AIからテキスト抽出結果を受け取る（"テキストを検出"Activity）
まず"Google Visionスコープ"を置いて、その中に"テキストを検出"を置く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/93c9826c-ffd6-a78c-8a07-9dd6c6aff1b6.png)
"Google Visionスコープ"の入力プロパティは多いですが、AIサービス認証の種類に応じたプロパティが用意されているだけ。認証をAPIキーで行うなら、認証の種類＝ApiKeyにしてAPIキーを記入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/fb0dbe5b-50e7-530b-ccf9-f233226d47f1.png)
"テキストを検出"の入力プロパティには解析させたい画像のパスを記入。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/9f4b921f-2df3-71bc-cd45-68cd16aff9ba.png)
出力テキストの返り方には２つあり、"識別されたテキスト"はUiPath.GoogleVision.Models.LinePropertiesの配列、"返されたテキスト"はStringです。
おそらく前者はテキストブロック毎の位置・テキストの情報、後者はテキスト全体と想像。

まず前者を１行ずつWriteLineしてみる。（X位置 : Y位置 : 抽出テキスト）
item.TextRegion.X.ToString()+" : "+item.TextRegion.Y.ToString()+" : "+item.Description
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/01e1fc8b-2746-3cb2-0533-aaaff0b0b4f1.png) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/56a015d7-4984-0df6-d4d4-aa4a37ce2840.png)

結果 → ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/0d603f36-4ae6-bd6f-cad4-8d719e1ae18d.png)
う～ん、なんか思ってたのと違う。配列はテキストブロック毎でなく、１要素目に全体のテキストがまとまってしまってるし、２要素目以降は細かすぎるブツ切りテキストで使い道が無い。

一方後者は → ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/38326e68-4fd7-471b-de52-79aa49c2b030.png)
こっちは予想通り。画像内の全部のテキストが改行付きで返ってきます。
ちなみにデモ画面でしっかり"市民"と取れてたのが、こっちだと"売民"で間違ってる。
呼んでるエンジン違うのかな？

# Vision AIからテキスト抽出結果を受け取る（"手書き文字認識"Activity）
"テキストを検出"がイマイチだったので、別の"手書き文字認識"(Handwriting Detection) Activityを試してみる。
フローの組み方やプロパティはさっきと一緒です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/b0680e92-8b21-2933-2212-bf3f37cfa8fc.png)
同様に、返ってきた
"識別されたテキスト"（UiPath.GoogleVision.Models.LinePropertiesの配列）と
"返されたテキスト"（String）をチェック。
前者の結果 → ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/6b9dac8f-84b6-527d-ba5d-c17dd2b2b2c1.png)
後者の結果 → ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255097/dc41b903-66ff-d06e-cc59-ac5d84e42aa3.png)
デモ画面で使われていたエンジンはコッチだったようです。
テキストは正確だし、ブツ切りも抑えられてるし、使うならこっちかな。

---
今回はここまで。UiPath×AIと言いつつUiPathからAPI呼んでみただけなのでタイトル詐欺かもしれない。

ガンガンQiitaに投稿していた１年前に比べ、今は社内にUiPathがだいぶ普及してきたので自分がオートメーションを開発する必要が無くなり、気づけば「前にStudioを立ち上げたのっていつだろう？」状態。
最近は社内のUiPathライセンスの管理やリセラーさんとのコストダウン交渉～契約発注みたいなオジサン仕事ばかりで開発力がめっきり落ちているので、せめて家では何とか新しい開発ネタにチャレンジして投稿していきたい！

というわけでAI連携はまだまだ遊べそうなので、次回もVision AIを使って面白い事をやりたいと思います。