Azure Face API を Node.js axios await/async でやり取りするメモ

Azure Face API を Node.js axios await/async でやり取りするメモです。

背景

image

【誰でも参加歓迎】ProtoOutハッカソン -テーマ:リモートワーク #ProtoOut – connpass

で、サポートしていたところ、ちょっとハマったところがあったり、axiosの非同期 await/async のコードで書いたこと無かったなあということで、まとめてみました。

参考にしたドキュメント

最近は、Microsoft Learnが、単純な手順書でだけでなく、知識的な部分もしっかりしたものがあるので以下を勧めました。

Azure Cognitive Services の Computer Vision API を使用した顔と表情の識別 – Learn | Microsoft Docs

こちらを進めると、Azureでサブスクリプションも作れて、 顔検出 API のテスト の演習では、様々な Face API を試すことが可能です。

ありがたい。

エンドポイントのところを気を付ける

いいドキュメントなんですが、たぶんこれ、Azureポータルでの表記と、教材と、その他もろもろでの整合性を撮るのって大変なんでしょうね。

image

2020/04/19 現在ですが、Azureのエンドポイントの表記が、リージョンごとではなく、リソースごとの名前になっていて、ここは気をつけましょう。(きれいにハマりました)

Cognitive Services APIs Reference

を見るほうが分かりやすくて、冒頭に、エンドポイントについて触れられています。

image

とあるように、各リージョン単位でエンドポイントを読み替えて使うと良いです。

たとえば、米国西部2の場合は West US 2 なので、 westus2.api.cognitive.microsoft.com です。ここさえ、押さえたら、あとは大丈夫でした。

ということで、Node.js axiosで呼び出してみる

あとは、

Cognitive Services APIs Reference

の各APIのページで、さきほどのエンドポイントと自分のサブスクリプションキーで動かしてみます。

動くことを確認したら、

node i axios

で、axiosライブラリを準備。

以下のソースを動かします。Node.js v13.8.0 で動かしています。

{{ Key }} は自分のサブスクリプションキーを指定します。FACE_API_ENDPOINT_URLについては、上記のAPIのテストでうまくいったURLを試しましょう。

今回は、

  • returnFaceId
    • true
  • recognitionModel
    • detection_02
  • detectionModel
    • detection_02

で試しました。detection_02は、検出モデルの指定方法で触れられている通り、

image

このような違いがあります。感情の属性など知りたい場合は、detection_01を選ぶとよいでしょう。

const axios = require('axios');

const sendCognitive = async (_url) => {
    // エンドポイント
    // 米国西部2の場合は West US 2 なので、 westus2.api.cognitive.microsoft.com
    //
    // 設定
    // returnFaceId true
    // recognitionModel detection_02
    // detectionModel detection_02
    const FACE_API_ENDPOINT_URL = 'https://westus2.api.cognitive.microsoft.com/face/v1.0/detect?returnFaceId=true&returnFaceLandmarks=false&recognitionModel=recognition_02&returnRecognitionModel=false&detectionModel=detection_02';

    // サブスクリプションをOcp-Apim-Subscription-Keyヘッダーに
    // JSONで送るのでContent-typeヘッダーにapplication/json指定
    const config = {
        headers: {
            'Content-type': 'application/json',
            'Ocp-Apim-Subscription-Key':'{{ Key }}'
        }
    }
    // 画像URLを判定する
    const postData = {
        url: _url
    }

    // axiosの送信設定
    try {
        // POSTリクエストで送る
        const response = await axios.post(FACE_API_ENDPOINT_URL, postData, config);
        console.log("post OK");
        // データ送信が成功するとレスポンスが来る
        console.log(response.data);
    } catch (error) {
        console.log("post Error");
        // ダメなときはエラー
        console.error(error);
    }

}

// 教材で使われている画像URLを指定
sendCognitive('https://docs.microsoft.com/learn/data-ai-cert/identify-faces-with-computer-vision/media/clo19_ubisoft_azure_068.png');

こちらを実行すると、

image

と、顔を検出できます。

やはり、非同期で書くと読みやすくていいですね。