はじめに
今回は前回に引き続き、人工知能(AI)をサービスとして扱うことのできるAzure AI Servicesから、画像分析関連サービスであるComputer Visionについて紹介します。
前回はComputer Visionの機能の一つである光学文字認識(OCR)について詳しく紹介しました。OCRでは、画像に含まれる文字を抽出してデジタルテキストに変換できることをVision StudioやComputer Vision SDKを使った実装を通して確認することができました。
今回はComputer Visionの画像分析について紹介していきます。
画像分析(Image Analysis)とは
Computer Visionの画像分析では、画像から様々な視覚的特徴を抽出することができます。画像分析で取得できるものについては以下のようなものがあります。
・画像のタグ付け、分類
画像に含まれるオブジェクト(人や動物や建物など)を認識し、タグを付与することができます。またタグに似たもので分類(カテゴリー)と呼ばれるものがあります。カテゴリーは親子階層で表現されており、画像の内容を抽象的に捉えることができます。またタグは膨大な種類が存在するのに対しカテゴリーは86種類に絞られているため、用途によってタグと分類を使い分けることができます。
・画像の説明
上記のタグ付けの内容をもとに、画像の内容を文章で表現したものです。
・特定のブランドの商標やロゴなどの要素の認識
Computer Visionに登録されている企業やサービスなどの商標やロゴを認識して検出することができます。また検出できない商標やロゴはAzure AI Custom Visionという画像認識サービスによってトレーニングさせることで検出することができるようになります。
・人の顔の検出
画像内の人物を検出し、人物の年齢や性別を推測することができます。なお以前は感情の予測を行う機能が含まれていましたが、悪用の可能性があるため感情予測は現在廃止されています。
・成人向けコンテンツが画像に含まれるか
画像に含まれる成人向けのコンテンツを検出し、表示を制限することができます。
これらの分析結果はそれぞれ信頼度スコアといった数値を持ちます。これらは分析した内容がどれくらい正しいのかの判断材料として使うことができるため、信頼度が低いものについては使用しない等の制御に使用することができます。
Vision Studioを使って画像分析を体験してみよう
ここからはブラウザからComputer Visionの機能を利用できるVision Studioを使って画像分析でできることを確認していきます。
なお、画像分析の機能のうちいくつかはリージョンの制限があるため、「Azure AI services multi-service account」のリソースを「East US」リージョンで作成する必要があります。まだリソースを作成されていない場合や、前回異なるリージョンでリソースを作成されている場合は以下の手順でリソースを作成して下さい。
Azure AI services multi-service accountの作成(East USリージョンに作成)
Azureポータルから「Azure AI services multi-service account」のリソースを作成していきます。ポータル上部の検索バーに「ai service」と入力し、表示された「Azure AI services multi-service account」を選択します。
サービスのトップ画面が表示されたら、「作成」または「Azure AI services multi-service accountの作成」を選択します。
リソースの作成画面が表示されたら、必要な内容を入力します。 「サブスクリプション」、「リソースグループ」は任意のものを選択します。「リージョン」には「East US」を設定して下さい。「名前」にはこのリソースの名称を入力します。「価格レベル」は「Standard S0」を選択します。最後に契約条件に同意するためチェックボックスにチェックを入れて「確認と作成」ボタンを選択します。
確認画面が表示されたら内容を確認し、「作成」ボタンを選択してリソースの作成を開始します。しばらく待つとリソースの作成が完了します。
Vision Studioで画像分析を体験する
「Azure AI services multi-service account」のリソースをEast USリージョン上に作成することができたら、Vision Studioにアクセスしましょう。画面右上の「Sign in」を選択してサインインをしたら、まずは作成したリソースがデフォルトとなるように設定していきます。
同じく画面右上にある歯車のマークを選択し、「Select a resource to work with」という画面を表示します。この画面で、先ほど作成したリソース(zerokara-ai-service-eastus)にチェックを入れた状態で画面下部の「Select as default resource」ボタンを選択します。
ボタンを選択しても画面上何も変化がない場合がありますが、これでデフォルトリソースが切り替えられました。この状態でVision Studioのトップページに戻ります。
画面の中央付近にVision Studioで試すことができる機能のギャラリーが表示されています。ここから「Image analysis」を選択すると、画像分析のサンプルを確認することができます。
まずは「Extract common tags from images」を選択してみます。「Try it out」の表記の下にある「デモでリソースの使用料が発生することを了承する」旨のチェックボックスにチェックを入れ、「Choose your language」で出力結果に使用される言語を指定します。この状態でサンプルとして表示されている画像のどれかを選択すると、画面右側に画像から抽出されたタグ情報が表示されます。
画像に含まれるオブジェクトを識別し、タグとして羅列されていることが分かります。また、それぞれのタグには信頼度スコアが%で付与されています。例えば「人」、「衣類」、「家具」など明確に識別できるものはスコアが高く、「コーヒー」など画像からは特定が難しいものについてはスコアが低くなっていることが分かります。
ギャラリーに戻って、次は「Add captions to images」を選択します。先ほどと同様にチェックボックスにチェックを入れ、サンプル画像の一つを選択します。
「岩の上でサーフボードを持つ男性」という説明が出力されました。「男性」、「サーフボード」、「岩」といったタグ情報をもとに、「岩の上」や「サーフボードを持つ」といった画像の内容に沿った文脈が付与されていることが分かります。
最後に「Remove backgrounds from images」を試してみます。
人物や人物が持っている物、付近にあるもの以外は除去され透過状態になっていることが分かります。 ここまでの例で見たように、Computer Visionの画像分析では画像に含まれるオブジェクトを細かく分類することで、画像に対する情報の付加や除去に応用できることが分かったかと思います。
Computer Visionを使って画像分析を実装してみよう
ここからはComputer Vision SDKを使った画像分析の実装を行ってみます。Vision Studioで確認したように、画像からタグ情報や説明文が抽出できるかを確かめてみます。
Computer Visionクライアントライブラリのインストール
今回もアプリケーションはPythonで実装していきます。まずは、必要となるComputer Vision関連のライブラリをコマンドラインからインストールします。前回までにこの手順を実施している場合は不要です。
Computer Visionの関連ライブラリのインポート
$ pip install --upgrade azure-cognitiveservices-vision-computervision
$ pip install pillow
前回のOCRと同じくComputer Visionに共通のクライアントライブラリを使用していきます。
画像分析アプリの実装
任意のフォルダに「image-analysis.py」というファイル名でファイルを作成して実装を進めます。
ライブラリのインポート・Computer Visionの接続情報の追加(image-analysis.py)
# 関連ライブラリのインポート・・・①
from azure.cognitiveservices.vision.computervision import ComputerVisionClient
from azure.cognitiveservices.vision.computervision.models import VisualFeatureTypes
from msrest.authentication import CognitiveServicesCredentials
# Computer Visionの接続情報・・・②
subscription_key = "Computer Visionのサブスクリプションキー"
endpoint = "Computer VisionのエンドポイントURL"
# Computer Visionの接続情報をもとにクライアントを作成する・・・③
computervision_client = ComputerVisionClient(endpoint, CognitiveServicesCredentials(subscription_key))
まずはComputer Visionおよび認証関連のライブラリをインポートします(①)。続いてComputer Visionの接続情報を定義し、クライアントを作成します(②、③)。ここで設定するキーとエンドポイントの情報は、今回East USリージョンに作成した「Azure AI services multi-service account」のものを使用します。
Azureポータルで「Azure AI services multi-service account」から該当のリソースを選択し、「キーとエンドポイント」メニューに表示されている「キー 1」と「エンドポイント」の内容をコピーして使用します。
次に分析対象となる画像ファイルの指定と、画像分析の実行部分を実装します。
画像ファイルの指定と読み込み(image-analysis.py)
# 画像ファイルのパスを指定・・・④
remote_image_url = "https://live.staticflickr.com/7337/9809491426_699a56e934_c_d.jpg"
# 画像解析のためのリクエストを送信・・・⑤
results = computervision_client.analyze_image(remote_image_url,
visual_features=[VisualFeatureTypes.description, VisualFeatureTypes.categories, VisualFeatureTypes.tags])
画像ファイルはローカルマシン上にあるものか、インターネット上にあるものを参照して分析できます。今回はインターネット上の画像を参照する方法をとります(④)。
Computer Visionのクライアントインスタンス(computervision_client)のanalyze_imageメソッドで画像分析を実行することができます(⑤)。第一引数に画像ファイルのパスを設定し、「visual_features」引数に分析したい内容を配列で指定します。分析内容は「VisualFeatureTypes」というクラスで定義されています。今回は説明文、カテゴリー、タグを分析して取得できるように指定しています。
最後に分析結果を出力する部分の実装です。
画像の分析結果の出力(image-analysis.py)
# 分析結果を表示・・・⑥
# キャプション(説明文)の取得・・・⑥-1
print("画像の説明:")
if (len(results.description.captions) > 0):
for caption in results.description.captions:
print(f"- {caption.text} (信頼度: {caption.confidence})")
else:
print("説明文が見つかりませんでした。")
# カテゴリー(分類)の取得・・・⑥-2
print("\nカテゴリー:")
if (len(results.categories) > 0):
for category in results.categories:
print(f"- {category.name} (信頼度: {category.score})")
else:
print("カテゴリーが見つかりませんでした。")
# タグの取得・・・⑥-3
print("\nタグ:")
if (len(results.tags) > 0):
for tag in results.tags:
print(f"- {tag.name} (信頼度: {tag.confidence})")
else:
print("タグが見つかりませんでした。")
⑤での分析結果はresults変数に格納されるので、そこから情報を取得します(⑥)。まずはキャプションを「results.description.captions」から取得します(⑥-1)。「results.description.captions」は配列のため、for文でキャプションを一つずつ取得して出力します。「caption.text」には説明文が、「caption.confidence」には信頼度スコアが含まれています。
またキャプション配列の長さが0だった場合に備えて、else句では説明文が取得できなかった旨の文言を出力するようにしています。
同様の仕組みで、カテゴリー(⑥-2)とタグ(⑥-3)もそれぞれ名称と信頼度スコアを出力するように実装しています。
この内容で一度動作確認を行ってみます。
画像分析の実行結果
> python image-analysis.py
- a large stone building with many arches with Colosseum in the background (信頼度: 0.3689325153827667)
カテゴリー:
- building_ (信頼度: 0.40625)
- building_arch (信頼度: 0.51171875)
- outdoor_ (信頼度: 0.0078125)
タグ:
- building (信頼度: 0.9993324279785156)
- outdoor (信頼度: 0.9870928525924683)
- sky (信頼度: 0.9869253635406494)
- stadium (信頼度: 0.9750896692276001)
- historic site (信頼度: 0.9537228345870972)
- ancient roman architecture (信頼度: 0.9349187612533569)
- tree (信頼度: 0.9333333969116211)
- ancient rome (信頼度: 0.9306117296218872)
- landmark (信頼度: 0.9159619808197021)
- ancient history (信頼度: 0.9079694747924805)
- history (信頼度: 0.8783908486366272)
- monument (信頼度: 0.8755813837051392)
- classical architecture (信頼度: 0.8714768886566162)
- wonders of the world (信頼度: 0.8450595736503601)
- ruins (信頼度: 0.8424156904220581)
画像の説明、カテゴリー、タグの情報がそれぞれ取得できました。また信頼度スコアも取得できています。現在は分析結果がすべて英語で取得されていますが、日本語に変更することも可能です。
分析結果を日本語で出力するように修正(image-analysis.py)