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

【誰でも参加歓迎】ProtoOutハッカソン -テーマ:リモートワーク #ProtoOut - connpass
で、サポートしていたところ、ちょっとハマったところがあったり、axiosの非同期 await/async のコードで書いたこと無かったなあということで、まとめてみました。
参考にしたドキュメント
最近は、Microsoft Learnが、単純な手順書でだけでなく、知識的な部分もしっかりしたものがあるので以下を勧めました。
Azure Cognitive Services の Computer Vision API を使用した顔と表情の識別 - Learn | Microsoft Docs
こちらを進めると、Azureでサブスクリプションも作れて、 顔検出 API のテスト の演習では、様々な Face API を試すことが可能です。
ありがたい。
エンドポイントのところを気を付ける
いいドキュメントなんですが、たぶんこれ、Azureポータルでの表記と、教材と、その他もろもろでの整合性を撮るのって大変なんでしょうね。

2020/04/19 現在ですが、Azureのエンドポイントの表記が、リージョンごとではなく、リソースごとの名前になっていて、ここは気をつけましょう。(きれいにハマりました)
Cognitive Services APIs Reference
を見るほうが分かりやすくて、冒頭に、エンドポイントについて触れられています。

とあるように、各リージョン単位でエンドポイントを読み替えて使うと良いです。
たとえば、米国西部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 で動かしています。
は自分のサブスクリプションキーを指定します。FACE_API_ENDPOINT_URLについては、上記のAPIのテストでうまくいったURLを試しましょう。
今回は、
- returnFaceId
- true
- recognitionModel
- detection_02
- detectionModel
- detection_02
で試しました。detection_02は、検出モデルの指定方法で触れられている通り、

このような違いがあります。感情の属性など知りたい場合は、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':''
}
}
// 画像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');
こちらを実行すると、

と、顔を検出できます。
やはり、非同期で書くと読みやすくていいですね。