2023年5月16日

【Google Cloud】Vision APIで画像に写っているモノを検出してみよう!


Content
こんにちは。みやてつです。

みなさん、Cloud Vision APIというサービスをご存知でしょうか?
事前にトレーニングされたAIを使用して、気軽に画像を解析できるAPIサービスです。
例えば、看板の文字や人物の顔、物や建物などを検出したりできます。

具体的には、以下の機能があります。(2023年02月現在)

機能

概要

テキスト検出 画像内の文字を検出して抽出できます。
ドキュメント検出 ドキュメントファイル(PDFやTIFF)のテキストを検出して抽出できます。
ランドマーク検出 画像から地理的に目印となる建物やモノを検出して場所を取得できます。
ロゴ検出 画像からロゴを検出して抽出できます。
ラベル検出 画像に含まれる複数の物体や場所、動物、モノなどから画像のカテゴリを抽出できます。
画像プロパティ 画像の色の情報(ドミナントカラー)を抽出できます。
オブジェクトのローカライズ 画像に含まれる複数のモノを検出して抽出できます。
クロップヒント検出 画像を切り抜きするときの領域を抽出できます。
ウェブとエンティティとページ 画像に関連するウェブページを抽出できます。
不適切なコンテンツの検出 不適切なコンテンツ(adult、spoof、medical、violence、racy)に該当するか評価できます。
顔検出 画像から人物の顔や感情を検出できます。

たくさんありますね。
詳細は、公式ドキュメント(機能リスト)に記載されています。

今回は、オブジェクトのローカライズ機能を使って、画像に写っているモノを検出してみようと思います。

Cloud Vision APIを試してみよう!

公式ページにAPIを試すデモがあります。
試しに画像をアップロードしてみましょう。

ちょっと変わった「だるま」と普通の「はさみ」を撮ってアップロードしてみました。

Vision API デモ1
Objectsタブでは、Scissors(はさみ)が検出されています。
この機能が「オブジェクトのローカライズ」です。
「だるま」は、検出されていませんね。残念。

Vision API デモ2
Labelsタブでは、Snips、Tableware、Wood、Hand Tool・・・が検出されています。
この機能は「ラベル検出」です。

Vision API デモ3
Textタブでは、「合格」という文字が検出されています。
この機能は「テキスト検出」です。

Vision API デモ4
Propertiesタブでは、写真の色の情報(ドミナントカラー)が表示されています。
この機能は「画像プロパティ」です。

Vision API デモ5
Safe Searchタブでは、不適切な写真かどうかのレベルが表示されています。
この機能は「不適切なコンテンツの検出」です。
上記の画像は不適切なコンテンツには該当しないとなっていますね。

Cloud Vision APIを使う準備をしよう!

それでは、公式ドキュメントを参考に、Cloud Vision APIを利用できるようにしてみましょう。

詳細な手順は省きますが、以下の通り操作します。
1.Google Cloudのプロジェクトを準備します。
2.プロジェクトに請求先アカウントが設定されていることを確認します。
3.Cloud Vision API を有効にします。
Vision APIを有効にする

4.任意のサービスアカウントを作成します。

公式ドキュメントでは、使用するサービスアカウントのロールは不要と記載されています。

Vision API 自体にはサービス アカウントが必要ですが、使用するロールを作成する必要はありません。有効なサービス アカウントであれば、Vision API が有効になっているプロジェクトで Vision API を呼び出すことができます。

次の章でCloud ShellからAPIを実行して試したところ、ロール「roles/serviceusage.serviceUsageConsumer」が必要というエラーになりました。
そのため、今回は「Service Usage ユーザー」を設定しました。

5.サービスアカウントの認証キーを作成します。

Cloud Vision APIを実行する準備ができました。

Cloud ShellからCloud Vision APIを実行してみよう!

それでは、Cloud ShellからCloud Vison APIを実行します。

1.Cloud Vison APIにアクセスするための、サービスアカウントで認証します。

$ gcloud auth activate-service-account --key-file=サービスアカウントの認証キー.json
Activated service account credentials for: [cloud-vision-api-user@vison-api-XXXXXX.iam.gserviceaccount.com]

2.認証したサービスアカウントがアクティブになっていることを確認します。

$ gcloud auth list
Credentialed Accounts
ACTIVE: *
ACCOUNT: cloud-vision-api-user@vison-api-XXXXXX.iam.gserviceaccount.com
ACTIVE:
ACCOUNT: miyatetsu@XXXXXX.XX.XX
To set the active account, run:
    $ gcloud config set account `ACCOUNT`

3.Cloud Vision APIへのリクエストを作成します。今回は、オブジェクトのローカライズ機能のリクエストを作成します。 公式ドキュメントより、以下のJSONファイルを作成します。

{
  "requests": [
    {
      "image": {
        "content": "BASE64でエンコードした画像データ"
      },
      "features": [
        {
          "maxResults": 最大結果数,
          "type": "OBJECT_LOCALIZATION"
        },
      ]
    }
  ]
}

BASE64でエンコードした画像データは、公式ドキュメントに記載の通り、コマンドで作成しました。

$ base64 画像ファイル -w 0 > テキストファイル

4.Cloud Vison APIにリクエストを送信します。

$ curl -X POST \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "x-goog-user-project: プロジェクトID" \
    -H "Content-Type: application/json; charset=utf-8" \
    -d @上記で作成したリクエストファイル.json \
    "https://vision.googleapis.com/v1/images:annotate"

5.結果です。
画像データは、デモ画面で使用した「だるま」と「はさみ」の写真を使用しました。
また、最大結果数は10を設定しました。

{
  "responses": [
    {
      "localizedObjectAnnotations": [
        {
          "mid": "/m/01lsmm",
          "name": "Scissors",
          "score": 0.86188644,
          "boundingPoly": {
            "normalizedVertices": [
              {
                "x": 0.13141711,
                "y": 0.18253087
              },
              {
                "x": 0.9785101,
                "y": 0.18253087
              },
              {
                "x": 0.9785101,
                "y": 0.9103911
              },
              {
                "x": 0.13141711,
                "y": 0.9103911
              }
            ]
          }
        }
      ]
    }
  ]
}

デモ画面と同じように、Scissors(はさみ)が検出されていますね。
オブジェクトの位置は、4つの座標で取得できます。
画像の左上を(0,0)、右上を(1,0)、右下を(1,1)、左下を(0,1)とした場合のオブジェクトの位置が復帰します(ピクセル座標ではありません)。
下記の画像のように4つの座標を線で結ぶことで検出したモノを四角く切り抜くことができます。
Vision API デモ6

PHPを使ってCloud Vision APIを実行してみよう!

次に、プログラムからCloud Vison APIを実行してみましょう。
今回は、PHPで実装してみました。PHPのバージョンは、8.1を利用しました。

1.PHPのライブラリ管理ツールであるComposerを使用して、Cloud Vision APIのライブラリを追加します。

$ composer require google/cloud-vision

2.Cloud Vision APIを実行するPHPプログラムです。

<?php
require_once "vendor/autoload.php";
use Google\Cloud\Vision\V1\ImageAnnotatorClient;

// サービスアカウントを使用して、ImageAnnotatorClientを生成します。
$option = [];
$option['credentials'] = 'サービスアカウントの認証キー.json';
$imageAnnotatorClient = new ImageAnnotatorClient($option);

// Cloud Vision API に オブジェクトのローカライズ機能のリクエストを行います。
// 画像ファイルは、PHPプログラムと同じフォルダに格納しています。
$imageContent = file_get_contents('daruma_to_hasami.jpg');
$response = $imageAnnotatorClient->objectLocalization($imageContent);

// 結果を表示します。
foreach($response->getLocalizedObjectAnnotations() as $object){
    $name = $object->getName();
    $score = $object->getScore();
    $vertices = $object->getBoundingPoly()->getNormalizedVertices();
    echo 'name=' . $name . ' score=' . $score;
    echo PHP_EOL;
    foreach ($vertices as $vertex) {
            echo '  x=' . $vertex->getX() . ' y=' . $vertex->getY();
            echo PHP_EOL;
    }
    print(PHP_EOL);
}

// ImageAnnotatorClientを閉じます。
$imageAnnotatorClient->close();

3.実行結果です。

$ php vision.php 
name=Scissors score=0.86188644170761
  x=0.13141711056232 y=0.1825308650732
  x=0.97851008176804 y=0.1825308650732
  x=0.97851008176804 y=0.91039109230042
  x=0.13141711056232 y=0.91039109230042

Cloud ShellからCloud Vision APIを実行と同じように結果を取得することができました。
今回はPHPで作成しましたが、さまざまな言語でライブラリが提供されています。
いろいろなアプリケーションに組み込むことができそうですね。

他の言語(Go、Java、Node.js、Python、C#、Ruby)は、公式ドキュメントを参照してください。

まとめ

今回は、Cloud Vision APIのオブジェクトのローカライズ機能を試してみました。
事前にトレーニングされたAIを利用しているため、一般的な形のモノは識別できますが、特殊な形のモノは識別できませんでした。
しかしながら、小難しいAIの知識がなくても、APIを実行するだけでなので、気軽に利用できます。
また、オブジェクトのローカライズ機能以外にも、たくさんの機能があります。
画像から何かを抽出したいときなど、とても便利に利用できるのではないでしょうか。

みなさんも是非、使ってみてくださいね。
最後まで、ご覧いただきありがとうございました。

当社、システムサポートは、Google Cloudの導入・移行・運営支援を行っています。
お問い合わせは以下よりお願いいたします。

Google Cloud導入についてのお問い合わせはこちら

2023年5月16日 【Google Cloud】Vision APIで画像に写っているモノを検出してみよう!

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら