Azure Computer Vision APIとFace APIをPythonから利用する

はじめに

最近はAIや機械学習を活用したサービスも普及しており、 そのようなインテリジェントでスマートな機能を使ったアプリケーションを作りたいな〜 とお思いの方も多いのではないでしょうか? しかし、機械学習を利用した機能を実際に構築しようとすると、 利用したい手法の知識やその学習を行うための高いマシンリソース、 そして学習用の教師データの用意などが必要となり、 簡単に実現するのは難しいという状況も多くあります。

今回は、特別な知識やデータの用意をする必要がなく、 簡単にAI的機能を利用することができる、 AzureのCognitive Servicesという機能を紹介していきたいと思います。

Azure Cognitive Servicesの概要

提供されている機能

Microsoft Azure Cognitive Services 公式

MicrosoftがAzure上で提供している、インテリジェントなアプリケーションのサービスで、 APIを通して外部からその機能を利用することができるようになっています。 そのため、たとえば画像の分類などのような、 自前で実装しようとした場合に深層学習の利用や多くの教師データが必要となってしまう機能についても、 気軽にAPIを通して利用することが可能です。

提供されている各機能は取り扱うデータと機能によって、以下のように分類されています。

  • 視覚(画像分類、文字認識、顔認識、感情認識など)
  • 音声(音声認識)
  • 言語(構文解析、翻訳、文章分析など)
  • 知識(学術文献、レコメンデーションなど)
  • 検索(Bingの検索機能)

このように、かなり広い機能に関するAPIが公開されており、 これらの機能を組み合わせることで、 インテリジェントなアプリケーションを比較的低コストに作成することができるようになっています。

今回は、この中でも特に画像に関連するAPIについて、 AzureポータルからAPIキーを取得する流れ、 及びPythonを使ってAPIにリクエストする方法を例として紹介していきたいと思います。

視覚(画像・動画)に関連するAPI

現在(2018年1月)、視覚(画像、動画)に関連するサービスとしては、 以下の機能が公開されています。

Computer Vision API画像の分類、画像の内容説明、OCR、手書き文字認識など
Face API顔認識や顔からわかる情報の取得
Content Moderator画像、動画、テキストから、暴力的・成人向けの内容や侮蔑表現などを検出・評価する機能
Emotion API人間の顔から感情を推定する。プレビュー版だがAzureポータルから利用可能。
Custom Vision Service自前で教師データを用意することで、分類内容をカスタマイズできる画像分析API。 現時点(2018年1月)ではプレビュー版のため、Azureポータルには実装されておらず、 個別のポータルサイトから利用する。
Video Indexer動画に関連する分析のAPI。 現時点(2018年1月)ではプレビュー版のため、Azureポータルには実装されておらず、 個別のポータルサイトから利用する。

今回は以上の画像・動画系APIの内、 Computer Vision API Face API について、外部からPythonを使ってリクエストする流れについて以下で順に説明していきます。

AzureポータルからのAPIキー入手手順

それでは「Computer Vision API」を例にして、APIキー取得の流れを説明していきます。 このキーの取得に関する基本操作はCognitive Servicesの各APIでほぼ共通です (追加でモデルの設定をしたりなど、若干追加操作が必要なものもあります)。 Azure ポータルでの操作の流れは以下のようになります。

  • (1)Azureポータル上で該当機能のリソースを新規作成
  • (2)作成したリソースの設定画面からAPIキーを取得

まず、APIのリソースを作成する流れを説明します。 Azureポータル上から「新規」 → 「AI+Cognitive Services」を選択します。 この段階で「おすすめ」にCognitive Servicesの代表的な機能が表示されます。 ここでは「Computer Vision API」を選択してください。

(注)今回紹介する機能については直接関係しませんが、 「おすすめ」には現在利用可能な全てのCognitive Servicesの機能が 表示されてはいません。全ての機能を表示するためには「すべて表示」を選択し、 新たに表示されたメニュー画面の下部にある「Cognitive Services」の項目の「さらに表示」 を選択する必要があります。

「Computer Vision API」の項目を選択すると、作成リソースの設定画面が開きます。 あまり難しい設定項目はないですが、 少し気にする点として以下のリージョンと料金についてがあるかもしれません。

  • (1)現在(2018年1月)、東日本リージョンが無いので海外のリージョンを選ぶ必要がある
  • (2)サービスの料金設定に「F0 Free」, 「S1 Standard」がある。 「F0 Free」は無料だが、transactionが有料の場合より制限される。 S1は有料オプションで、transactionの回数によって従量課金される。

ここではひとまず、リージョンは「米国西部」、料金設定は無料の「F0 Free」を選択しています。 他の項目については、サブスクリプションは自身のサブスクリプションを設定し、 「Name」は任意の名称、「Resource group」は「新規作成」か「既存のものを使用」の どちらかを選択して、「I confirm I have read …」に チェックを付けてください。以上の項目を入力し終わったら、最後に「作成」を選択してください。 これでリソースの作成は完了です。

次に作成したリソースの設定画面からAPIキーを取得します。 リソースの作成が完了すると通知に「展開が成功しました」と通知が来るので、 その通知に表示される「リソースに移動」を選択して、 リソースの設定画面に移動してください。 移動すると以下の「Quick start」画面が表示されますので、 「1 Grab your keys」にある「Keys」、 もしくは左側メニューの「RESOURCE MANAGEMENT」以下の項目にある「Keys」の どちらかをクリックしてください。

すると以下の画像のようにAPIキーが表示されるので、 「Key1」, 「Key2」のどちらかの値をコピーして控えておいて下さい (2つありますが片方は予備で、どちらでもAPIを利用できます)。

以上でAPIの利用準備は完了です。

PythonからのAPI利用例

次にPythonを使って、実際にAPIの機能を利用してみます。 以下では「Computer Vision API」、「Face API」をそれぞれ試しています。 「Face API」のAPIキー入手方法は「Computer Vision API」とほぼ同じです。

Computer Vision API

今回は以下の公式APIリファレンスにあるPython 3.2のサンプルコードを流用して、 APIへのリクエストを試してみます。 もしAPIの仕様やパラメータの詳細などが必要な場合は、 こちらのリファレンスを参照すれば把握できると思います(英語ですが)。

Computer Vision API 公式リファレンス(北米西部リージョン)

試してみる機能は「Computer Vision API」の分析(Analyze Image)機能です。 以下はそのサンプルコードを少し修正したもので、 入力画像のURLを指定する形式だった部分について ローカルのファイルを指定する形式に変更し、 更にコメントの追加などを行っています。

以上のコードで「Request headers」部分の「Ocp-Apim-Subscription-Key」にAPIキーを指定し、 「Request body」部分の変数「image_file_path」 に入力したい画像ファイルの場所を指定してください。

それではこちらのコードを実際に以下の画像に対して実行してみます。 画像は次のURL先で提供されているフリー素材 https://www.pexels.com/photo/boats-on-seashore-during-daytime-800721/ から取ってきています。

コードを実行するとレスポンスとして以下のJSON形式の出力が返って来ます。

返ってきた出力の内「categories」が画像全体の分類を表しており、 「tags」はその画像と関連する単語を表しています。 この画像に対しては「categories」として「outdoor_oceanbeach」にスコア0.8125で分類されており、 ある程度全体の内容を把握できているとわかります。 また「tags」についても、「sky」、「outdoor」、「boat」、「water」,「scene」 などが信頼度0.8以上で関連付くと返って来ているので、 細かい画像の内容についても結構認識できているようです。

加えて「description」の「caption」部分は、 自動で画像にあったキャプションを付けてくれるという機能なのですが、 こちらは「a boat sitting on top of a sandy beach」 と出力され、確かにそうですねという感じの説明になっていて、 この画像についてはかなり良く認識出来ている印象です。

さて、どうもこの画像は特徴も多く分類しやすかったようなので、 次は少し分類しにくそうな以下の画像を試してみます。 画像は先程と同様に次のフリー素材 https://www.pexels.com/photo/bright-celebration-crowd-dark-431722/ から持って来ました。

自分も正直この画像の内容は良くわかっていないのですが、 空に火を入れた小さい提灯(呼び方がわからない)の様なものを飛ばすお祭り? みたいなものがあるんですよね、おそらく (調べたところ、スカイランタンやランタン祭りなどと呼ばれるイベントのようです)。

この画像についてコードを実行しAPIにリクエストすると、 結果として以下が出力として返ってきます。

「categories」は空になっており、 どうも(当然?)画像の大きな分類はうまく出来なかったようです。 「tags」は「outdoor」、「group」、「bunch(束、房)」で、 確かになんとなく関連してると言っていい単語かもしれませんが、 具体的な内容としては微妙です。

一方で「description」の「captions」は「a group of fireworks in the sky」です。 この説明については、 確かに言われてみれば花火っぽい感じはあるなと変に納得してしまいました。 「categories」や「tags」に該当する分類や単語が無い場合でも、 何となく近い内容の結果を返えしてくるようです。

さて、以上の様にComputer Vision APIを試してみましたが、 実際に少し使ってみた印象としては、そこそこ高い認識精度があるように感じました。 分類やタグにありそうな内容が含まれた画像についてはかなりうまく認識してくれます。 一方で、これは認識しづらいのでは?という画像(分類やタグになさそうな内容の画像)でも、 ある程度近い、全く知らない人が分類しようとしたらそう見えなくもないかな、 と言った感じの結果は返って来る印象です。

Face API

それでは次に、顔認識機能である「Face API」のDetect機能を使ってみます。 Computer Vision APIと同様に、以下のFace APIの公式リファレンスを参照しています。

Face API 公式リファレンス(北米西部リージョン)

入力画像は以下で、先程と同様に次のフリー素材 https://www.pexels.com/photo/person-man-confident-business-50855/ から持ってきています。

実行するコードは以下です。パラメータとリクエスト先URLが Computer Vision APIと異なっています。

以上のコードを実行すると以下の (リストに入った)JSON形式の出力が返って来ます。

出力のうち、「faceRectangle」は画像内で認識された顔の位置(座標)と範囲を表しています。 「faceAttributes」は認識された顔から分析したその顔の特徴で、 入力するパラメータを指定することにより、分析する内容を変更することが可能です (分析内容を多くするとその分計算時間がかかるようです)。 今回は「age(年齢)」、「gender(性別)」、「smile(笑顔かどうか)」、 「facialHair(髭)」、「emotion」を指定しました。 「age」は31.3、「gender」はmale(男性)、「smile」は1.0、 「facialHair」は全ての値が0.0となっており、 元の画像を見る限りは全てそこそこ正しい結果を返している(年齢は不明ですけど)と言えそうです。

また「emotion」は顔から推定された感情の値で、 出力では「happiness」が1.0となっており、 これも元の画像を見た限りでは、そこそこ正しそうに見えます。

なお「emotion」については、個別のAPIとしてEmotion APIが提供されています。 Face APIの「emotion」と何か違うのか?という部分ですが、 どうも出力結果の数値の桁数が違う様です(Emotion APIの方が桁数が多く、 Face APIでは少ない桁数に四捨五入されています。 もしかしたら他にも何か違いはあるのかもしれませんが)。

さて、それでは最後にFace APIを別の顔の画像でも試してみます。 入力画像は以下で、先程と同様に次のフリー素材 https://www.pexels.com/photo/adult-anger-angry-angry-face-277870/ から持ってきています。 「emotion」が先ほどと異なるように、怒っていそうな表情の写真を選択しました。

Face APIに以上の画像についてリクエストすると、以下の出力が返ってきました。

「emotion」を見てみると、「anger(怒り)」の数値が0.995と高くなっており、 期待した通り表情から「怒り」の感情を認識してくれました。 また今回の画像の人物は髭が生えているため、 「facialHair」の値を見てみると、 「moustache(口髭)」、「beard(あご髭)」、「sideburns(頬髭)」 のどれもが0以上の数値となっており、髭も認識できていることがわかります。 なお、この画像は白黒写真なので、 カラー画像でなくても顔とその特徴をうまく認識出来るということのようです。

終わりに

さて、今回はAzure Cognitive Servicesの一部の画像系機能について紹介しましたが、 外部からAPIにリクエストするだけで、画像認識のように高度な機能を簡単に利用することが出来ました。

今回紹介した画像系のAPIでは、すでに学習済みのアプリケーションを利用するという機能でしたが、 現在プレビュー中の Custom Vision Serviceでは、こちらで学習用のラベル付き画像データを用意することにより、 分類する項目をカスタマイズ出来たりなど、 今後はより個人の要望に合った画像認識機能を容易に利用することができる様になっていくのだろうと期待できます。

参考リンク

Computer Vision API Documentation

Face API Documentation

Cognitive Services: Face APIについて

Cognitive Services: Face APIの顔検出をPythonで試してみた

このページをシェアする: