Pocket

はい。やりたいことは記事のタイトルの通りです。

  1. SharePoint Online のドキュメント ライブラリに保存されている画像を利用する
  2. Microsoft Flow を利用して Face API を呼び出す
  3. Face API の結果をドキュメント ライブラリの列に書き戻す

といったことを実現してみようという記事です。最初に謝っておくのは、この記事では Face API 自体の解説は行わないのと、Face API の顔画像の学習はあらかじめ済ませた状態から説明をスタートします。また、注意点としては Face API を Azure 側で作成する場合、米国西部のデータセンターに作成した方が Microsoft Flow からの利用がトラブルが少ないように思います。

まずは結果から

それでも記事が長くなりそうなので結果から書きますと、ドキュメント ライブラリに保存した任意の画像を選択し、コマンド バーから [Flow]-[Face Detect] をクリックしてフローを実行します。

上手く動くと次のように「Who?」列に Face API で判別した人物の名前が入ります。

ドキュメント ライブラリを作っただけでは、もちろんこんな列はありませんので、「Who?」列を追加しておきます。

Microsoft Flow でフローを作る

それではさっそく Microsoft Flow を開きフローを作成します。Microsoft Flow に環境を複数作っている場合は、「既定」の環境を使うのが良さそうです。既定以外の環境だと、上手くドキュメント ライブラリのコマンド バーに追加されないかもしれません。

さて、顔を識別するのに「Face API」コネクタの「Face API – Detect faces」アクションを利用できそうかな?と思うわけですが、実はこのアクションは「image Url」しか指定できず、また、ドキュメント ライブラリに保存している画像では URL を指定しても上手く動きません。そのため今回作成するフローでは「HTTP」コネクタを利用して Face API を REST API で呼び出し、ドキュメント ライブラリに保存している画像のバイナリ データを渡して処理させるフローにしました。

まず、トリガーとして選択するのは「SharePoint」コネクタの「SharePoint – 選択したアイテムの場合」トリガーです。このトリガーを利用することで、ドキュメント ライブラリのコマンド バーから Microsoft Flow に作成したフローを実行できるようになります。

ところが、トリガーに「サイトのアドレス」を指定して、「リスト名」からドキュメント ライブラリを選択できるのかと思いきや…、残念ながらできません…。

すでに挫折しかけているわけですが、ここにはドキュメント ライブラリの GUID を指定すると上手く動きます。その GUID ですが、ドキュメント ライブラリを開いて「ライブラリの設定」を開くと URL の最後に「List=%7B3c0b74a4-4d02-45f3-892f-21ae5174eac0%7D」という文字列があり、この赤字のところが GUID になっているので、これをコピーして Flow のトリガーにある「リスト名」にペーストします。

画像のバイナリ データを取得するためにはもう少しアクションの追加が必要です。

まず追加するのは「SharePoint」コネクタの「SharePoint – ファイルのプロパティの取得」アクションです。「サイトのアドレス」を指定して、「ライブラリ名」からドキュメント ライブラリを選択します。肝心の「ID」には、「選択したアイテムの場合」トリガーの出力にある「ID」を指定します。

次に追加するのは「SharePoint」コネクタの「SharePoint – ファイル コンテンツの取得」アクションです。ここでも「サイトのアドレス」を指定して、聞きなれない「ファイル識別子」には先ほどの「ファイルのプロパティの取得」アクションの出力にある「識別子」を指定します。

このアクションの出力として、画像のバイナリ データが取得できるので、いよいよ Face API を REST API を使って呼び出します。

そのために追加するアクションは「HTTP」コネクタの「HTTP – HTTP」アクションです。Face API のリファレンスを見ながら設定します。「本文」には「ファイル コンテンツの取得」の出力にある「ファイル コンテンツ」を指定します。

この「HTTP」アクションからは出力として REST API のレスポンスである JSON を取得できます。Face API の顔を検出する API では、複数の人物が写っていた場合に備えて「faceId」が配列で返ってくるわけですが、今回は簡単にするため配列の先頭にある「faceId」だけを利用したいと思います。

この「faceId」から「誰か?」を特定するために、再び「HTTP」コネクタの「HTTP – HTTP」アクションを追加し Face API を呼び出します。「本文」の「faceIds」配列には「式」を利用して配列の先頭にある「faceId」を指定します。

body('HTTP')?[0]['faceId']

ちょっとややこしくなってきましたね。

この「HTTP」アクションからは出力として「誰か?」を示す「personId」の配列が JSON で取得できます。これを「Face API」コネクタの「Face API – Get a person」アクションに渡してあげると人物名に解決できます。ここだけは「Face API」コネクタを利用できますね。

ここでも「式」を利用して配列の先頭にある「personId」を指定します。

body('HTTP_2')?[0]['candidates']?[0]['personId']

そして最後に「SharePoint」コネクタの「SharePoint – ファイルのプロパティの更新」アクションで、「Who?」列に「Face API – Get a person」アクションの出力にある「Name」を指定します。

これでフローが完成です。長かった。これを例えば「Face Detect Flow」と名前を付けて保存すると、最初に書いた通り動作すると思います。

さいごに

こんな感じで Microsoft Flow では、Azure Cognitive Services と連携できますし、また、REST API の使い方と JSON の読み方さえ理解できれば、「HTTP」コネクタを利用して Microsoft Flow で用意されているコネクタには含まれていない処理を実現することができます。

本音を言うと「HTTP」コネクタで作成した部分も「Face API」コネクタを利用できると嬉しいのですけど…。