Bot FrameworkとTranslator Text APIを使って簡単な翻訳Botを作ってみる ①準備編

こんにちは、Michaelです。
今回から数回に分けて、Microsoftの「Bot Framework」を使った、簡単なChat Botを作っていきます。せっかくなのでCognitive ServicesのTranslator Text APIも組み合わせて、入力されたテキストを翻訳して返すBotを作成してみようと思います。
1回目の今回は準備編として、Bot Frameworkの開発環境の準備と入力した言葉をそのまま返す「オウム返しBot」を作成します。

Bot Frameworkについて

Bot FrameworkはMicrosoftが2016年4月に公開したコミュニケーションツール用のBot開発フレームワークで、SkypeやSlack等と連携したBotを簡単に作成することができます。
Bot Frameworkは、「Bot Connector」と「Bot Application」という2つの要素によって構成されており、Bot Applicationが文章の処理や、応対を、Bot Connectorが各種コミュニケーションツールとの接続をそれぞれ担っています。Bot Connectorに関しては、コミュニケーションツールの接続設定がプリセットされているため、実質的にBot Applicationの開発さえすれば、Chat Botを作成することができようになっています。

Bot開発のフロー

Bot Frameworkを使ったBotの開発フローは大まかに以下のようになります。

1. Bot Applicationの開発 (C#、Node.js)
2. Bot Framework Emulatorによるローカルデバッグ
3. Azure App Service等へのデプロイ
4. Bot Connectorへの登録、連携

今回は開発の手始めとして上記フローの1, 2までを実施して、ローカル環境で動く簡単な翻訳Botを作成してみます。

開発環境の準備

開発環境には、ローカルのWindows 10にNode.jsをインストールしたものを用意しました。
Node.jsは、こちらからダウンロードしてインストールをしておきます。
Botを作成するディレクトリをコマンドプロンプトで開き、下記のコマンドでnpmの初期設定を実行します。

[crayon-6080b1d166205831349026/]

初期設定が終わったら、Bot Framework SDKの「Bot Builder」とAPIサーバーとして機能させるための「Restify」をnpmでそれぞれインストールします

[crayon-6080b1d16620c663744711/]
最後に作成したBotのテスト用にBot Framework Emulatorをインストールします。
Bot Framework Emulatorはこちらからダウンロードしてインストールをしておきます。

以上が完了したら、Bot Applicationの本体を作成していきます。

オウム返しBotの作成

Bot Applicationのスクリプトは、APIサーバーの設定と対話フローの設定の部分に分けられます。APIサーバーの設定に関しては決められた書式で記述すれば動作するため、Bot開発には対話フローをいかに設計するかが重要になります。
ただし、今回は単なるオウム返しのBotのため、下記のようにシンプルなスクリプトで実現できてしまいます。

・bot.js

[crayon-6080b1d16620f272785790/]
上記のスクリプトではBots Dialogsで対話フローを設定していますが、session.sendにsession.message.textを設定することで、入力されたメッセージをそのまま返すように設定しています。

Botのテスト

作成したBotをテストしてみます。
Bot Applicationを保存したディレクトリをコマンドプロンプトで開き、下記コマンドで作成したBot Applicationを起動します。

[crayon-6080b1d166211555900135/]

続いてBot Framework Emulatorを開いてBot Applicationと接続します。
画面上部のURL欄に下記アドレスを入力し、「CONNECT」をクリックします。
URL: http://localhost:3978/api/messages


いくつか、テキストを入力するとそれと同じ言葉がBotから帰ってきていることが確認できました。


今回は、Bot Frameworkで簡単なオウム返しBotを作成ましたが、Bot Applicationでは、Bots Dialogsの部分をCognitive ServicesのAPIと組み合わせることで、様々な機能を付け加えることができます。
次回は、Cognitive ServicesのTranslator Text APIを使用して、オウム返しBotに翻訳機能を追加してみます。
お楽しみに。


Bot FrameworkとTranslator Text APIを使って簡単な翻訳Botを作ってみる ② 機能追加編

こんにちは、Michaelです。
前回、Microsoftの「Bot Framework」を使って、簡単な「オウム返しBot」を作成しました。今回は、オウム返しBotにTranslator Text APIを付け加え、入力した言葉を外国語に翻訳するBotを作っていきます。

Translator Text APIによる翻訳機能の作成

Translator Text APIについては以前、Pythonによる簡易的な実装をご紹介しました。今回のBot FrameworkはNode.jsを使用しているため、コードをNode.jsに変更して対応させる必要があります。
基本的なリクエストは言語によって変わるわけではないため、以下のようなコードで翻訳機能を作成してみました。今回は、諸国語を英語に変換するように設定しています。

・translator.js
[crayon-6080b1d166ca8419390525/]
試しにこれをNode.jsで動かしてみると、ドイツ語の「Wo ist die Toilette? (トイレはどこですか?)」が「Where is the toilet?」と英語に翻訳されました。

翻訳Botの作成とテスト

翻訳機能ができたので前回作成したオウム返しBotに翻訳機能を移植します。
作成した翻訳用の関数をオウム返しBotにペーストして、メッセージの処理部分に翻訳関数を組み込みました。

translator_bot.js
[crayon-6080b1d166caf301090669/]
ローカル環境のNode.jsで動作を確認してみます。
Bot Framework Emulatorで翻訳Botにテキストを送信してみると、日本語、ドイツ語とも英語に変換されていることが確認できました。


言語設定を「de (ドイツ語)」に変更すると、ドイツ語に翻訳するように変更することもできます。


また、メッセージの処理部分を少し変更し、記号を使って翻訳先の言語を指定できるようにしてみました。Translator Text APIは入力した言語を自動で判別できるため、知らない国の言葉を指定の言語に翻訳できるBotを作ることもできました。

今回は、Translator Text APIを付け加え、簡易的な翻訳Botを作成してみました。
Bot Framework自体はルールベースの応答プログラムであるため、Cognitive ServicesのAPIを組み合わせることで、簡単に機能の追加をすることができます。
次回は、作成したBot ApplicationをAzure Bot Serviceにデプロイしてみます。
お楽しみに。


Cognitive Services: HoloLens で撮影した動画をVideo APIでブレ補正してみた① 準備編 (プレビュー)

こんにちは、Michaelです。
今回から2回に分けて、Video APIの「Stabilization」機能を使って動画のブレ補正を試してみます。
1回目は、準備編としてVideo APIの概要とAPIキーの取得まで進めていきます。

Video APIの「Stabilization」機能

Video APIは、その名の通り動画から顔や風景の変化を分析、検知することのできるAPIで、機能として以下の4機能が提供されています。

機能 内容
Face Detection and Tracking 最大64の顔の検出と追跡をする
Motion Detection 動画内で変化のある領域を検出する
Stabilization 動画のブレを補正する
Thumbnail サムネイル動画を自動作成する

今回使用する「Stabilization」機能は動画のブレを補正するもので、カメラやスマートフォンで撮影した動画のブレを検出、補正して滑らかな動画に変換することができる機能です。
ブレ補正自体は、光学式または電子式手振れ補正のように、一部の民生用カメラやスマートフォンにも搭載されており、今回撮影に使用したHoloLensにも電子式手振れ補正機能が搭載されています。そのため、一般的なカメラでもそれなりにブレの少ない動画を撮影することはできますが、歩く、振り返るなどを大きな動作を行うと大幅なブレが発生してしまいます。特にHoloLensの場合は、頭に装着して撮影することや電子式手振れ補正の性質上、その影響が顕著に出やすく、見る人によっては乗り物酔いのような酔いを誘う動画となってしまいます。
そこで、Stabilization機能を使ってHoloLensで撮影した動画をブレ補正して滑らかな動画に変換してみます。

APIキーの取得

Video APIの利用を始めるには、他のAPIと同様にAPIキーの取得が必要です。
ただし、Video APIは2016年8月現在プレビュー版のため、Azureポータルでは登録できず、試用版の利用申請をしてAPIキーの取得を行います。
Video APIの製品ページ
に移動したら「試用版」をクリックします。

「API を選択」からVideo APIの「APIキーの取得」をクリックします。


「Microsoft Cognitive Services 使用条件」が表示されたら「国/地域」を「日本」とし、以下画像のように2か所のチェックボックスにチェックを入れて「次へ」をクリックします。

「サインインしてAPIを作成する」で紐づけるアカウントを選択し、アカウントにサインインします。


API一覧からVideo APIを探し、項目の「キー1」または「キー2」に記載されている文字列がAPIキーとなるため、キーを控えておきます。

APIキーが取得できたので、次回は実際にVideo APIを使用して動画のブレ補正をしていきます。
次回もお楽しみに。


Cognitive Services: OCR機能で名刺読み取りプログラムを作ってみた

Michaelです。
今回は、Microsoft Cognitive ServicesのComputer Vision APIで利用できるOCR機能を使って名刺読み取りプログラムを作ってみました。

名刺のデータ化について

お客様との打ち合わせや展示会に参加すると必ず交換される「名刺」ですが、SFAやCRMで管理するために、貰った名刺をデータ化する必要があります。今では、名刺読み取り専用のスキャナーやスマートフォンアプリが販売されており、名刺を簡単にデータ化できますが、そういったツールを持たなければ手入力で名刺の内容を打ち込まなければなりません。
それこそ、数百枚単位で名刺が交換される展示会の後では、名刺のデータ化だけで結構な時間をとられてしまうことも多いのではないでしょうか。
この悩みをCognitive ServicesのOCR機能で解決してみたいと思います。

名刺読み取りのアルゴリズム

名刺は各社でフォーマットが異なり、氏名、会社名等の配置が異なるため、読み取りは難しいようにも見えますが、名刺を見ていると一定の法則性があることがわかります。

・名刺の法則性

項目
会社名 会社名の行にはほぼ「会社」の単語が入る。(「株式会社」、「有限会社」等)
氏名 フォントサイズは「企業ロゴ」、「氏名」、「会社名」の順で大きい傾向にあり、行の高さ上位3位には「氏名」が入る
電話番号 行に「Tel」、「Phone」、「電話」、「直通」のいずれかが入っている
Fax番号 行に「Fax」の単語が必ず入る。
電話番号とFax番号は同じ行になることが多いが、Fax番号が電話番号より前に記載されることはない
住所 ほとんどの場合で、都道府県名が入る。
入らない場合も県庁所在地など、一目で都道府県がわかるものが多い。

E-mail 必ず「@」が入る。
URL 「http」、「www」のいずれかは必ず入る

Computer Vision APIのOCR機能では、行単位とテキストと、テキストエリアの大きさを取得できるため、名刺の各行について法則性に基づいたデータ抽出を行えば、必要な情報を取得できると考えられます。

名刺読み取り機能の作成

上述の法則性を基に名刺読み取りのスクリプトを作成してみました。
基本的に画像から読み取ったテキスト行に特定の単語が含まれるかどうかを判定するだけのため、Computer Vision APIのレスポンス形式がわかっていれば1日もかからず作成できてしまいます。
(Computer Vision APIについては「Cognitive Services: OCR機能で印刷物の写真からテキストのデータ化をしてみる」もご参考ください)

都道府県、県庁所在地を取得するための「prefecture.json」も単に都道府県名と県庁所在地名をJSON形式の配列で保存しているだけで、簡単に作成できます。

・sample.py

[crayon-6080b1d1675b8979391219/]

・prefecture.json
[crayon-6080b1d1675c3493620805/]

上記コードで、以下のサンプルの名刺画像から情報を取得してみました。

・入力画像

上の名刺画像を読み取った結果、見込み通りに必要なデータを取得できていました。
部分的にハイフンが長音記号になっているところがありますが、簡単な手直しで済み、1枚2秒程度で処理できるため、手入力に比べてはるかに効率的にデータ化ができそうです。

・読み取り結果

name0 田中太郎
name1 節owled
name2 ommunrcatton
fax .047-700-5005
tel tel.047ー397ー8897
url http//www.knowledgecommunication.jp
company 株式会社ナレッジコミュニケーション
address 〒272ー0143千葉県市川市相之川3ー13ー23丸伝小川ビル3F
mail E-mail:t-tanaka@knowledgecommunication.jp

今回は、Computer Vision APIのOCR機能を使用して名刺読み取りプログラムを作成してみましたが、簡単なスクリプトでも案外良好に名刺のデータ化をすることができました。

サンプルでは、名刺の画像で試していますが、いくつか実際の名刺の写真で試してみても同様にデータ化ができており、完全ではないにせよデータ入力のサポートになるものには仕上がっているように思いました。
今回は名刺でしたが、フォーマットや規則さえ分かっていれば他の紙ベースの文書にも適応できるので、ぜひ試してみてください。
次回もお楽しみに。


Cognitive Services: Translator Text APIでテキスト翻訳を試してみる

こんにちは、Michaelです。
今回は、Cognitive ServicesのTranslator Text APIを使って、テキスト翻訳を試してみます。

Cognitive Servicesの翻訳APIについて

Cognitive Servicesの翻訳APIは、もともと「Microsoft Translator」というサービスだったものがCognitive Servicesに統合されたもので、「Translator Text API」と「Translator Speech API」の2つのAPIが展開されています。今回使用する「Translator Text API」はテキスト翻訳用のAPIで「任意の言語」のテキストを「指定した言語」に翻訳することができ、Google翻訳のような翻訳機能をサービスに簡単に組み込むことができます。
Translator Text APIは2017年5月現在、61言語の相互翻訳に対応しており、うち下記に示す11言語については「ニューラルネットワークモデル」を使った従来よりも自然な翻訳に対応しています。

・ニューラルネットワークモデル対応言語

Arabic Chinese (Mandarin) English
French German Italian
Japanese Korean Portuguese
Russian Spanish

Translator Text APIの価格

Translator Text APIの価格は、翻訳文字数による完全従量課金制のS1と月額課金制のS2 ~ S4の4レベルが設定されています。月額課金制S2 ~ S4については所定の最大文字数を超過した分に対しては従量課金となっており、実質的に料金前払いのディスカウント価格といえます。また、200万文字まで使用できる無料レベルもあり、検証用に使用できます。

APIキーの取得

Translator Text APIの利用を始めるには、他のAPIと同様にAzureポータルで登録し、APIキーを取得します。APIの登録、およびキーの取得に関しては「Cognitive Services: Face APIの顔検出をPythonで試してみた」を参照ください。

Translator Text APIの使用

Translator Text APIは、これまでに紹介したFace APIやComputer Vision API等の「Project Oxford」とは異なるサービスから統合されたAPIのためか、認証の方法やリクエスト本文の形式等のAPI仕様が異なります。
最も基本的なGETメソッドを使った単文のテキスト翻訳を行う場合であっても、以下の操作が必要になります。

1. APIキーで一時アクセス用トークンの発行
2. トークンでAPIの認証を行い、翻訳機能を使用

また、レスポンスもJSONではなくXML形式となるため、レスポンスデータを扱う場合にも注意が必要になります。
以上の内容を考慮して、翻訳された文章を出力するPythonスクリプトを作成すると以下のようになります。

- Python 2.7サンプルスクリプト
[crayon-6080b1d167e38754856870/]
リクエストに関しては、翻訳する文章と翻訳先の言語の設定が必須になります。
翻訳元の言語は自動的に判定されるため、特に必要でない限りは設定しなくてもかまいません。
試しに上記スクリプトで、翻訳する文章に「駅はどこですか?」、翻訳先の言語に「de」(ドイツ語)を設定してリクエストをすると「Wo ist der Bahnhof?」とドイツ語訳された文章が出力できました。

[tta-01.png]

今回は、Translator Text APIを使ってテキスト翻訳を試してみましたが、便利な翻訳機能を簡単に実装できるため、サービスの多言語対応などに効果的ではないかと感じました。
Cognitive ServicesのAPIでありながら他のAPIとはリクエスト、レスポンスが異なるため、使用に際しては少し戸惑うこともあるかと思いますが、興味のある方はぜひ使ってみてください。
次回は、Microsoftの「Bot Framework」とTranslator Text APIを使用して簡単な翻訳ボットを作っていきます。
お楽しみに!


Azure Functions: BlobコンテナーをトリガーとするPython関数を作成してみる

こんにちは、Michaelです。
今回は、前回作成したAzure FunctionsのPython関数でトリガー設定を変更し、Azure StorageのBlobコンテナーにデータがアップロードされた場合に動作する関数を検証します。

トリガー設定の変更

前回作成したPython関数では、ストレージキューを監視して関数が動作するようにトリガーが設定されていました。今回はトリガーをBlobコンテナーとするため、トリガー設定の変更を行い、アップロードされたテキストファイルの内容を表示するように設定します。
Azureポータルで前回作成したFunction Appの関数エディタを開きます。設定を変更するPython関数を選択すると、関数にサブメニューが表示されるため、サブメニューから「統合」をクリックします。

「統合」を開くと、「トリガー」に「Azure Queue Storage trigger」が設定されているため、削除をクリックしてトリガー設定を解除します。


「+新しいトリガー」をクリックすると、新たにトリガーを設定できます。今回は、Blobコンテナーを監視するため、一覧から「Azure Blobストレージ」を選択します。


Azure Blobストレージtriggerの設定が表示されたら、「BLOBパラメータ名」、「パス」、「ストレージアカウント接続」をそれぞれ設定します。「BLOBパラメータ名」には任意の名称、「パス」、「ストレージアカウント接続」には監視を行うBlobコンテナーのパスとそのストレージアカウントを設定します。「パス」ではBlob名のパターンを設定することができ、今回は「(コンテナー名)/{name}.txt」としてテキストファイル(.txt)がアップロードされた場合を監視するように設定しています。最後に、「保存」をクリックして設定を適応させます。

トリガーを設定したら、入力したテキストファイルの内容をログ画面に出力するようスクリプトにも変更を加えます。os.evironのキーをトリガーで設定した「BLOBパラメータ名」に変更すると、Function Appの一時ファイルのパスが取得できます。一時ファイルにはアップロードしたデータのコピーが格納されるため、以下の簡易的なスクリプトでアップロードしたテキストの内容を表示します。スクリプトを変更したら「保存および実行」をクリックし、関数を開始します。

[crayon-6080b1d168637013402173/]

試しに、「Hey Cortana!!」と入力した「test01.txt」というファイルをトリガー設定したBlobコンテナーにアップロードすると、アップロード時刻の約10秒後に関数が開始され、ログにテキストが表示されました。


一方、「Hey,Cortana!!」と入力した「test02.csv」というCSVファイルをアップロードした場合には、40秒以上経っても関数は開始されず、Blob名のパターンに合わせて処理が行われていることがわかりました。

今回は、Blobコンテナーをトリガーに実行する関数を作成しました。これを利用すれば、Blobコンテナーにアップロードされた画像を、そのままCognitive Servicesで分析、振り分けするといった用途にも応用できるのではないでしょうか。
次回もお楽しみに!


Azure Machine Learning: Experimentのリージョン間コピーを試してみる。(プレビュー)

こんにちは、Michaelです。
今回は、Azure Machine Learning (Azure ML)のWorkspaceを別リージョンに移行する方法として、Experimentのリージョン間コピーを検証します。

Experimentのリージョン間コピー方法

昨年2016年11月から東日本リージョンでもAzure MLが利用できるようになりました。従来、米国中南部など海外リージョンでしか利用できなかったAzure MLが国内リージョンでも使えるようになったことで、東日本リージョンに移行したいというようなニーズもあるかもしれません。
しかし、Azure MLでは、Workspaceをそのまま別リージョンへ移動、コピーすることができないため、別リージョンにWorkspaceを移行したい場合には、使用したいリージョンに新たなWorkspaceを作成し、Experimentをコピーする方法が現状では最善の方法となります。
また、Azure Machine Learning Studio (ML Studio)のコピー機能では、Experimentのリージョン間コピーに対応していないため、Experimentをリージョン間でコピーするには、下記のいずれかの方法を行わなければなりません。

・Cortana Intelligence Galleryの非公開ギャラリーへの発行
・PowerShellの「Azure MLPS」モジュールの使用

このうち、Cortana Intelligence Galleryを使用する方法では、ML Studio上でExperimentごとにギャラリー発行を繰り返す必要があり、多くのExperimentを持つWorkspaceを移行する場合には操作が大変になります。
そこで、今回はPowerShellの「Azure MLPS」モジュールを使用し、スクリプトでWorkspace上のExperimentをすべて別リージョンのWorkspaceにコピーする方法を試してみます。

Azure MLPSによるリージョン間コピー

今回は、米国中南部リージョンの既存Workspaceから、東日本リージョンに新たに作成したWorkspaceへのExperimentの移行を検証します。
Azure MLPSを使ったExperimentの移行に関しては、以下のような手順で行います。

1. 米国中南部Workspaceと東日本WorkspaceのWorkspace ID、Authorization Tokenを取得
2. 米国中南部Workspaceの全Experiment、Datasetの情報を取得 (Get-AmlExperiment)
3. Experimentの移行 (Copy-AmlExperiment)

それでは、Azure MLPSを使って、Workspaceの移行を試みます。
まず、Azure MLPSでWorkspaceの操作をするにあたり、Workspace ID、Authorization Tokenの情報を取得、設定します。Workspace ID、Authorization Tokenの取得は「AZURE MACHINE LEARNINGをPOWERSHELLで操作してみた」の手順に準じますが、今回は2つのWorkspaceを操作するため、米国中南部Workspaceと東日本Workspaceの両方について情報を取得しておきます。
取得したWorkspace ID、Authorization Tokenのうち移行元である米国中南部Workspaceの情報は、Azure MLPSのconfig.jsonに設定し、東日本Workspaceの情報については、PowerShellスクリプト上で$destinationの連想配列として設定しておきました。

・config.json (Azure MLPS用)
[crayon-6080b1d168e39185068814/]
・PowerShell
[crayon-6080b1d168e3f884910164/]
続いて、米国中南部Workspaceの全Experimentの情報を取得します。Experimentの情報はGet-AmlExperimentコマンドレットで取得できます。
[crayon-6080b1d168e41488363521/]
移行元Workspaceの全Experiment情報が取得できたら、 Copy-AmlExperimentコマンドレットを使用しExperimentのコピーを行います。コピーはExperimentごとに行われるため、ループ処理にて移行元Workspaceの全Experimentについてコピーを行います。

[crayon-6080b1d168e43305399183/]
以上の操作を1つのps1ファイルにまとめると以下のようになります。

・sample.ps1
[crayon-6080b1d168e46680646249/]
上記スクリプトを実行すると、順次Experimentが新しいWorkspaceにコピーされ、東日本リージョンのWorkspaceでコピーされたExperimentを確認することができました。


以上で、Experimentの移行は完了です。Dataset、Trained Model (学習済みモデル)もExperimentで使われているものであれば同時にコピーされるため、Experimentに欠損が生じるなどの心配もありませんでした。ただし、Classic Web Serviceのコピーには対応しないため、移行後にWeb Serviceの再発行やNew Web Serviceへの移行など追加の作業が必要になるようです。

今回は、Experimentのリージョン間コピーを試しましたが、わずかなスクリプトでWorkspace内すべてのExperimentを移行させることができました。Web Serviceのコピーに対応しないため、実運用に入っているシステムではなかなか手を付けにくい部分ですが、データ転送などで東日本リージョンへの移行を考えている方はぜひ試してみてください。
次回もお楽しみに!!


Azure Storage編 ~Microsoft Azure Storage ExplorerでAzure Storageを操作してみた~

今回は、「Microsoft Azure Storage Explorer」を使い、MicrosoftアカウントによりAzure Storageを操作・管理する方法をご紹介します。
前回、「AZURE STORAGE編 ~【RE:NEW】5分でわかるAZURE STORAGE アップロードとダウンロード~」として、ストレージアカウントキーによりコンテナーの管理を行いましたが、今回はMicrosoftアカウントを使うことで、より詳細なコンテナーの管理を紹介します。

Microsoftアカウントの登録

Microsoft Azure Storage Explorerは他のサードパーティ製ツールとは異なり、Microsoftアカウントを使用してAzure Storageを登録、管理することができます。Microsoftアカウントであれば、ログイン情報だけで保有するすべてのストレージアカウントを一度に登録できるため、Azure Storage を一括管理する場合にはこの方法がおすすめです。

MicrosoftアカウントでAzure Storageを登録するには、左上の人型のアイコンをクリックし、「Add an account...」をクリックします。

Azureのログイン画面が表示されるため、アカウント情報を入力してログインします。


ログインを済ませるとアカウントがリストに追加されます。
Microsoft Azure Storage Explorerに保有するストレージアカウントを表示させるには、追加するユーザーのサブスクリプションにチェックを入れ、「Apply」をクリックします。


ストレージのツリーに指定したサブスクリプションが追加され、保有するすべてのストレージアカウントが表示されました。

Shared Access Signature (SAS)の生成
ストレージのリソースを他人と共有する場合、セキュリティや誤操作防止のため「Shared Access Signature (SAS)」と呼ばれる一時アクセス権限を発行します。
SASは、共有させる範囲に応じてストレージアカウント、コンテナー、BLOB(ファイル)の各レベルで生成することができますが、今回はストレージアカウントレベルのSASを生成して共有をしてみます。
(※ストレージアカウントレベルのSASはMicrosoftアカウントを登録した場合にのみ生成できます。)

ストレージアカウントレベルのSASを生成する場合は、共有したいストレージアカウントを選択し、右クリックより「Get Shared Access Signature...」を選択します。


SASの設定画面が表示されたら、「Start time」、「Expiry time」で共有期間、「Permissions」、「Services」、「Resource types」で操作許可や利用できるサービス、リソースの範囲を設定し、「Create」をクリックします。
(※「Permissions」のListおよび「Resource types」のServiceには必ずチェックを入れてください。)


SASが生成されるので「Connection String」をコピーして、共有対象者に通知してします。


SASを登録する場合は、画面左上にあるプラグ型のアイコンをクリックします。


テキストボックスに通知されたSASを入力し、「Next」をクリックします。


接続情報の確認が表示されるので、共有終了日時、アクセス権限を確認して「Connect」をクリックします。

ストレージアカウントが登録され、SASの設定通りBLOBコンテナーのみ閲覧できるようになりました。

BLOBコンテナーのコピー

Microsoft Azure Storage Explorerでは、Azureポータル上ではできないストレージアカウント間のコンテナーのコピーができます。
コンテナーのコピーをする場合、コピーしたいコンテナーを右クリックして「Copy Blob Container」をクリックします。


コピー先のストレージアカウントの「Blob Containers」を右クリックし、「Paste Blob Container」するとコンテナーがコピーされます。同名のコンテナーが存在する場合は、元のコンテナーと統合されます。


いかがでしたか?
多くのストレージアカウントを持っていてもMicrosoft Azure Storage Explorerを使うと簡単に管理できるので、Azure Storageを利用されているのであればぜひ使ってみてください。
次回もお楽しみに!


Cognitive Services: Face APIの顔認証機能を試してみた

今回は、Face APIの1機能であるVerify (顔認証)機能をPythonで試してみます。

Verify機能のリクエストとレスポンス

Verify機能はFind Similar機能と同じく、似た顔を検出し、人物の認証を行う機能で、Request bodyとリクエスト先のURLが異なる以外は、基本的にFind Similar機能とリクエストの形式は変わりません。

・Python 2.7サンプル
[crayon-6080b1d169704595250307/]

Verify機能がFind Similar機能と大きく異なる点は、Find Similarが1対多で顔を比較するのに対し、Verify機能では1対1で顔を比較し、検出、認証を行うことにあります。そのため、Request bodyには比較したい2つのfaceIdのみを記述します。
Verify(認証)という言葉からもわかるように、あくまで顔認証に特化しており、個人の認証を行うことを目的とした機能であることがうかがえます。

[crayon-6080b1d16970a877574383/]
また、Verify機能では比較対象としてpersonIdというIDを使うことができます。
personIdは、Find Similar機能で使用できるFace Listと同じように永続的に顔の情報を保持できるIDで、Face Listがグループ単位なのに対し、個人レベルの名前や顔を保存しておくことができます。そのため、個人とpersonIdを紐づけておくことで、Verify機能を使った顔認証システムを簡単に構築できます。

[crayon-6080b1d16970d290250491/]
Verify機能のレスポンスはいたってシンプルで、"isIdentical"に比較した2つの顔が同一人物かどうかのブーリアン、"confidence"にその信頼性を0から1の数値で表示します。
[crayon-6080b1d16970f040894160/]
Verify機能とFind Similar機能は、内部的には同じアルゴリズムで顔の一致をスコアリングしているようで、同じ画像を入力し、"confidence"の値を比較してみると、両者はほぼ同じ値を示します。
このことから、Find Similar機能をVerify機能の代わりとして使用することもでき、利用場面や発生するトランザクション量によって使い分けをすることができそうです。

personIdの登録

それでは実際にVerify機能を試してみますが、今回はpersonIdを使って個人の特定を行うため、はじめにpersonIdの登録を行います。
※ 以降の操作は、Face APIのPython SDKを使用しています。

まず、personIdを格納するPerson Groupの作成を行います。CF.person_group.createの関数にPerson GroupのIDと名前を設定して実行すると、Cognitive ServicesのFace StorageにPerson Groupが作成されます。Person Groupの作成時にはレスポンスがないため、CF.person_group.getの関数で作成されたかの確認をしています。

[crayon-6080b1d169712097648562/]


続いて作成したPerson GroupにPersonを追加します。CF.person.createの関数に追加先のPerson Groupとユーザー名、オプションでそのユーザーの情報を設定し、実行します。
Personが作成されるとレスポンスとしてpersonIdが返されます。

[crayon-6080b1d169715504278003/]

personIdは取得できましたが、作成されたばかりのものでは顔が登録されていないため、Verify機能には使えません。そのため、personIdに対して顔の登録を行います。
CF.person.add_faceの関数にPerson GroupのIDと先ほど取得したpersonId、登録する顔の画像URLを設定して実行すると、ParsonにpersistedFaceIdが登録されます。この顔情報は、1つのPersonに対して248個まで登録でき、角度を変えた画像などを複数登録することで精度が高められると推測されます。

[crayon-6080b1d169717427782268/]

以上の操作を行うことで、Verify機能にpersonIdを使用することができます。

Verify機能を使った顔の認証

ここからは実際にFace Verify機能を使って写真から人物の判定をしてみます。
今回は、以下の画像をpersonIdに登録し、比較する画像がその人物かどうかを判定してみます。

・personIdに登録した画像

特定人物の検出には下記のコードを使用しました。Face Verify機能は単体では使えないため、Face Detect機能を併用します。
[crayon-6080b1d16971a585994602/]
上記コードを以下の画像で実行すると以下のような結果が出力されました。「"isIdentical": true, "confidence": 0.71539」と確かに同一人物と判定されました。



同じように、別の写真を使って判定させてみましたが、正しく同一人物の身を認証することができており、カメラを使って簡単に顔認証ができることがわかりました。


今回は、Face APIの顔認証を検証しましたが、Find Similar機能と同様、簡単に人物判定ができました。特にVerify機能は個人の認証に特化しているため、カードリーダにカメラを付け足して、カード認証と顔認証の併用といった使い方ができるのではないでしょうか。
次回は、Find Similar、Verify機能の検出の精度を検証していきます。
お楽しみに!


Cognitive Services: Face APIで2つの画像から共通する人物を探してみた

こんにちは、Michaelです。
今回は、Face APIの1機能であるFind Similar機能を使って2つの画像に共通する人物を探してみます。

Find Similar機能について

Find Similar機能は、その名の通り2つの画像に共通する似た顔を検出してスコアリングすることができる機能で、特定の人物を写真から見つけ出したいときに利用できます。
Face APIのリファレンスによると、Find Similar機能をPythonで利用する場合、以下のようなコードを使用します。リクエスト先のURLやパラメータが異なりますが、基本的にはPOSTリクエストのため、リファレンスに沿ってheader、body、parameterを記述してリクエストをすれば利用できます。

[crayon-6080b1d16a035690253414/]

Request bodyに"faceId"と"faceIds"というパラメータがあるようにFind Similarでは、特定したい1つの顔に対して複数の顔を一度に比較し、類似の顔を検出することができます。"faceId"と"faceIds"にはFace Detect(顔検出)機能で取得する顔のIDを設定することになるため、Face Detectとセットで使用することになります。

[crayon-6080b1d16a03c579227507/]
また、"faceIds"のパラメータは、Face APIのFace Listという機能で置き換えることができ、下記のようにも記述をすることができます。
Face Detectで出力されるfaceIdは、24時間で無効になるという制約がありますが、 Face Listに保存されたfaceIdは、永続的に保持されるため、長期にわたり使用する場合にはこの機能を活用することで、トランザクションを減らすことができます。
[crayon-6080b1d16a03f212167602/]
レスポンスには、特定したい対象と似ている顔のfaceIdとその信頼性(0~1の数値)が配列として返されます。
[crayon-6080b1d16a041356012703/]
もちろんFace APIのPython SDKでも利用でき、APIキーとRequest bodyの情報があれば、上記と同じ情報が得られます。

[crayon-6080b1d16a043486883652/]

Find Similar機能を使った人物特定

ここからは実際にFind Similar機能を使って写真から特定人物の検出を試してみます。
今回は4人の集合写真と特定する対象の1人の写真を使って、集合写真から特定人物を検出してみます。

・集合写真

・特定対象の写真

特定人物の検出には下記のコードを使用しました。Find Similar機能は単体では使えないため、Face Detect機能を併用して検出を行います。
[crayon-6080b1d16a045434431463/]

上記コードを実行すると以下のような結果が出力されました。
Find Similar機能は類似性の高いfaceIdを出力しますが、結果には集合写真に含まれるfaceIdが出力されており、人物を特定できていることが分かります。

上記の情報だけでは集合写真のどの人物を似ていると判断しているかわからないため、Open CVを使い出力情報を画像上で可視化してみました。Face Detectで出力された"faceRectangle"の情報を基に、出力されたfaceIdの人物の顔に四角の枠を追加すると、確かに同一人物に枠が追加されており、人物特定ができていることがわかりました。


また、特定する人物を2人に増やして試してみました。
上記のコードでは、特定する人物ごとにFind Similar機能を使用するようになっているため、複数人でもそれぞれの人物を判定することができました。


これを応用すると、特定の人物以外の人物にモザイクをかけるといったこともできます。
ニュースなどでよくある、見知らぬ通行人にモザイクをかけるということも概ね自動でできてしまうのではないでしょうか。

今回は簡単ながらFind Similar機能を使って顔の比較を行いました。
Find Similar機能がどの程度まで類似の顔を検出できるかは、またの機会に検証してみます。
次回は、Face APIのFind Similarと似た機能であるVerify (顔認証)機能を検証していきます。
お楽しみに!