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 で動かしています。
{{ Key }} は自分のサブスクリプションキーを指定します。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':'{{ 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');
こちらを実行すると、
と、顔を検出できます。
やはり、非同期で書くと読みやすくていいですね。