DataSpider でやり残したこと(不真面目)-その2

ここまでのおさらい

これをやりきらないと退職できないと意気込んで作り始めた「アイドル顔判定器(仮)」。IBM Watson で作り始めたものの、服装によって分類が分けられてしまう結果となったため、Microsoft Cognitive Services Face API を使って再チャレンジ(いまここ)。

API を調べてみる

Face API は以前使ったことがあったものの、かなり機能が多くそれがゆえにどの API を使ったら良いのかがなかなかわからない(難しい)。API リファレンスと格闘した結果、恐らく以下の流れでできそうだと思い作り始めてみる。1 つ 1 つ が 1 つの API に該当しているので、IBM Watson に比べると使う API の種類が多い印象です。

  1. PersonGroup の作成(Create)

  2. PersonGorup に所属する Person の作成(Create)

  3. Person に対して画像を追加(Add)

  4. PersonGroup の学習(Create)

PersonGroup /Person の作成(Create)

先述の通り「どの API を使ったら良いか?」は悩みましたが、API 自体はドキュメントもわかりやすく殆ど躓く箇所がありませんでした。

まず使うのは PersonGroup - Create です。Curl コマンドだとこんな感じ。

curl -v -X PUT "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

使う JSON もシンプルです。userData は任意項目なので、実質は name だけ渡せば良いですね。

{ "name": "idol", "userData": "Japanese Idol Group" }

DataSpider でもアイコン 2 つです。 f:id:dsstsukky:20190325160345j:plain

続いて、ほぼ同様の手順で PersonGroup Person - Create で新しい Person を作成します。本来は同じ人物を判別するための機能ですが、今回は「helloproject」「akb48」「nogizaka46」という人物を作成して、それぞれのグループの画像をその Person に学習させてみます。

Person の作成に成功すると以下のレスポンスがあります。この personId は次で使います。

{"personId":"52f8b199-812c-457f-8976-c2e84969da8a"}

Person に対して画像を追加(Add)

ここまでの手順で、idol という Group とその Group に所属する「helloproject」「akb48」「nogizaka46」という Person の作成が終わりました。あとはそれぞれの Person に対して画像を与えて学習してきます。

使うのは PersonGroup Person - Add メソッドです。

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}/persons/{personId}/persistedFaces?userData={string}&targetFace={string}" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}"

指定した personGroupId(今回は idol) に所属する person (helloproject/akb48/nogizaka46)に対して、json もしくは octet-stream で画像を渡します。ここで先程取得した personId を使用します。

IBM Watson では画像を一括で zip 形式で渡せたのですが、それができないようです。手作業でやると大変ですが DataSpider では指定したフォルダ以下にあるファイルをリスト化し、順に処理する仕組みがあるので(左から 2 番めの list というアイコンです)、苦労せずに実現できました。

f:id:dsstsukky:20190325163812j:plain

途中、wait アイコンがあります。これは最初置いていなかったのですがない状態で実行したところ途中で「429 too many requests」が返されました。調べてみたところ、1 時間 1,200 件を超えると制限がかかるようです。ただ、今回は 1,200 件はどう考えても送っていないので、短時間にアクセスしすぎて怒られたと思い 10 秒のウエイトを置いたら上手くいきました。

こんなウエイトの処理もアイコン 1 つでできるとか DataSpider とハロプロ最高ですね(コード書いても一行でしょうけど)。

上記を 3 つの person それぞれで行い、その後 PersonGroup - Train を実行して与えた画像を元に AI にトレーニングをしてもらう必要があります。

curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}/train" -H "Ocp-Apim-Subscription-Key: {subscription key}"

この PersonGroup Train は非同期のようなので、大量の画像を学習させた後は念の為 PersonGroup - Get Training Status を実行してステータスが「succeeded」になっているのを確認してから次に進むのが良いでしょう。

curl -v -X GET "https://westus.api.cognitive.microsoft.com/face/v1.0/persongroups/{personGroupId}/training" -H "Ocp-Apim-Subscription-Key: {subscription key}"

↓ こんな感じに出力されたら準備完了です。あとは画像を渡してみて確認に移りましょう。

{"status":"succeeded","createdDateTime":"2019-03-26T03:29:08.8868775Z","lastActionDateTime":"2019-03-26T03:29:09.1433051Z","message":null}

(その 3 へ続く)