Vision APIで画像認識してみる② ~実行編~

Vision APIで画像認識してみる② ~実行編~

目次

はじめに

前回、機械学習サービスの1つである「Google Cloud Vision API 」についての簡単なご紹介と、
Vision API を使用するための設定等を行いました。

今回は、クライアントライブラリ(Python)をインストールし、コードを実行して画像内のラベルを検出していきたいと思います。

Pythonのインストール

では早速、公式の手順に従ってクライアント ライブラリ(Python)をインストールしていきたいと思います。
コマンドプロンプトを立ち上げ、以下のコマンドを入力します。

pip install --upgrade google-cloud-vision

これで Vision API を使用して画像の情報をリクエストできるようになりました。準備完了になります!

ラベル検出やってみた

それでは、さっそく画像に関連するラベル(単語)を検出させようと思います。

①画像を用意

まずは、こちらの標準的な猫で検証したいと思います。凛々しい猫です。
(標準的な猫、完全に私の主観です・・・)

私のローカル環境は、以下のようなディレクトリ構成にしています。こちらの猫の画像はdataフォルダ配下に配置しました。

 ai_test_2022/
  ├ data/
  │  └ cat
  └ test1

②コーディング

それでは、test1.py に Python でコードを書いていきます。サンプルソースコードが公式のページに載っていますので、それを自分の環境に合わせて微修正します。

このコードを見ていくと、「ImageAnnotatorClient」というクラスを使用しています。
公式ページを参照しますと、顔、ランドマーク、ロゴ、ラベル、テキスト検出など、クライアント画像に対してGoogle CloudVisionAPI検出タスクを実行するもののようです。

※ 前回も少し触れましたが、「アノテーション」とは、画像、テキスト、音声、動画など様々な対象に対する「ラベルづけ」のことです。機械学習においては教師データを作る上で欠かせないものになります。


また、コードに「label_detection」 とありますが、こちらも公式ページを参照しますと、以下のように説明があります。

リクエストが成功すると、サーバーはレスポンスを JSON 形式で返します。
LABEL_DETECTION レスポンスには、検出されたラベル、スコア、トピカリティ、不透明ラベル ID が含まれます。

項目名内容
mid存在する場合は、このエンティティの Google Knowledge Graph エントリに対応する MID(Machine-generated Identifier)が格納されます。
descriptionラベルの説明
score信頼スコア。0(信頼できない)から 1(信頼度が非常に高い)の範囲で示されます。
topicality画像に対する ICA(Image Content Annotation)ラベルの関連度。
ページの全体的なコンテキストに対するラベルの重要度 / 関連度を測定します。


それでは、どういった結果が表示されるか、Pythonを実行してみます。

結果

①猫

コマンドプロンプトを開き、「C:\ai_test_2022\code」のディレクトリで、以下のコマンドを実行します。

python test1.py

すると、

Labels:
Head	 
Cat	 
Eye	 
Felidae	 
Carnivore	 
Window	 
Small to medium-sized cats	 
Whiskers	 
Snout	 
Terrestrial animal

こんな感じでラベルが表示されました。窓・・・?!

これだけだとラベルごとの信頼度がよく分かりませんので、
先ほどの LABEL_DETECTION の項目の「score(信頼スコア)」も表示させるようにしようと思います。

「label.score」を追記して、再度コマンドを実行します。

Labels:
Head : 0.9724438786506653	 
Cat : 0.9499096274375916	 
Eye : 0.9413082003593445	 
Felidae : 0.9108079671859741	 
Carnivore : 0.9009854793548584	 
Window : 0.8666111826896667	 
Small to medium-sized cats : 0.8550629615783691	 
Whiskers : 0.837993323802948	 
Snout : 0.7689116597175598	 
Terrestrial animal : 0.7306946516036987

猫の頭であるということはしっかり判定されたみたいです。窓の信頼スコアは86%というなかなか衝撃です。
この猫は窓にも見えるのですね。面白いです。

猫単体で検証してみましたが、公式のサンプル画像を見る限り情報量が多いものの方が良さそうなので、
次は風景の画像で検証してみようと思います。

②神戸市街

身近な場所の画像にしてみました!こちらは神戸の旧居留地の街並みです。

コードを実行すると・・・

Labels:
Daytime : 0.9449639347543012
Plant : 0.91240783869672301
Building : 0.9059518428573618
Road surface : 0.8938178224254723
Infrastructure : 0.8926476254931465
Tree : 0.8509724431022829
Urban design : 0.8439324512785221
Neighbourhood : 0.84277351225065779
Window : 0.8308643807676993
Sidewalk : 0.8130733120821403

この画像は夜ですが、明度を判断して「 Daytime 」がラベルとして検出されているのですね~。
「 Plant 」「 Building 」「 Road surface 」「 Tree 」「 Window 」「 Sidewalk 」など、的確に画像内の情報を言語化してくれています。

③ゴッホ「星月夜」

次に、絵の場合はどのように表示されるのか気になりましたので、検証してみたいと思います。

コードを実行すると・・・

Labels:
Paint : 0.9022921919822693
Nature : 0.8995094299316406
Azure : 0.8969144225120544
Painting : 0.8764228224754333
Textile : 0.8721943497657776
Vegetation : 0.8497583270072937
Art : 0.8485283851623535
Tree : 0.8345407843589783
Grass : 0.8320682644844055
Sky : 0.8287011981010437

「Paint」だと認識されています!この画像の質感から読み取ったのでしょうか。
今回のように分かりやすい絵画だとこのように認識されるのですね。

もう少し具体的なラベルは検出できないか気になったので、検証してみたいと思います。

④エリンギ

キノコ類は様々種類がありますが、キノコと一括りにされず「エリンギ」と判定されるのでしょうか。

コードを実行すると・・・

Labels:
Fawn : 0.8150516748428345
Wood : 0.7822701930999756
Beige : 0.6253003478050232
Mushroom : 0.6122145652770996
Plant : 0.563472330570221
Natural material : 0.5484763383865356
Metal : 0.5299309492111206
Fashion accessory : 0.5243878960609436
Still life photography : 0.5126955509185791
Ingredient : 0.5060304999351501

「 Mushroom 」で一括りにされていますね。具合的な単語の検出は不可能なのでしょうか。

⑤バラ

もう少し見た目が分かりやすいもので検証してみます。「花」と一括りにされず「バラ」のラベルは検出されるのでしょうか。

コードを実行すると・・・

Labels:
Flower : 0.9811161756515503
Plant : 0.9586992859840393
Petal : 0.9024657607078552
Hybrid tea rose : 0.8716349005699158
Rose : 0.8099624514579773
Garden roses : 0.7800278663635254
Flowering plant : 0.7686492204666138
Rose family : 0.7467091679573059
Rose order : 0.7344076633453369
Floribunda : 0.7274734377861023

「Rose」として認識されているようです!そのうえ「Hybrid tea rose」というラベルまでも検出されています。
事前に定義されてあるもの/ないものの線引きは難しそうですね。

終わりに

今回のように「Google Cloud Vision API」を使用することで、機械学習の教師データを作成せずとも簡単に画像認識を行うことができます。風景の画像などから簡易な情報を取得するのには十分適しているように思います。
一方で 、事前定義済みカテゴリにはないラベルの検出はできず、定義されてあるもの/ないものの線引きも難しいため、より具体的な情報が知りたいのであれば他の方法で行うのがよさそうです。

独自の画像認識を実現できるよう、今後は機械学習モデルを自分で作成してみたいと思いました。
調べてみた中で、「Google Cloud AutoML Vision」 を使って機械学習モデルの作成を行う方法もあるそうなので、折を見てやってみたいと思います!