arrow_back

Cloud Vision API で画像内の物体(ラベル)、顔、ランドマークを検出する

参加 ログイン

Cloud Vision API で画像内の物体(ラベル)、顔、ランドマークを検出する

45分 クレジット: 5

GSP037

Google Cloud セルフペース ラボ

概要

Cloud Vision API を使用すると、高度な機械学習モデルをシンプルな REST API にカプセル化し、画像の内容を把握することができます。

このラボでは画像を Vision API に送信し、物体、顔、ランドマークが検出されることを確認します。

ラボの内容

  • Vision API リクエストを作成し、curl で API を呼び出す

  • Vision API のラベル、顔、ランドマークの検出メソッドを使用する

必要なもの

  • Google Cloud Platform プロジェクト

  • ブラウザ(ChromeFirefox など)

設定と要件

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

この Qwiklabs ハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

必要なもの

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
  • ラボを完了するために十分な時間

注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、ラボでは使用しないでください。

注: Chrome OS デバイスを使用している場合は、シークレット ウィンドウを開いてこのラボを実行してください。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Google Cloud Shell の有効化

Google Cloud Shell は、デベロッパー ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Google Cloud Shell では、コマンドラインで GCP リソースにアクセスできます。

GCP Console の右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

Cloud Shell アイコン

[続行] をクリックします。

cloudshell_continue

環境のプロビジョニングと接続には少し時間がかかります。接続すると、すでに認証されており、プロジェクトは PROJECT_ID に設定されています。例えば:

Cloud Shell 端末

gcloud は Google Cloud Platform のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

次のコマンドを使用すると、有効なアカウント名を一覧表示できます。

gcloud auth list

出力:

ACTIVE: *
ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net
To set the active account, run:
    $ gcloud config set account `ACCOUNT`
	

次のコマンドを使用すると、プロジェクト ID を一覧表示できます。

gcloud config list project
	

出力:

[core]
project = <project_ID>
	

出力例:

[core]
project = qwiklabs-gcp-44776a13dea667a6
	

API キーを作成する

curl を使用して Vision API にリクエストを送信するため、リクエスト URL で渡す API キーを生成する必要があります。

1. API キーを作成するには、Cloud Console で [API とサービス] > [認証情報] に移動します。

api_nav.png

2. [認証情報を作成] ボタンをクリックして、ドロップダウン メニューで [API キー] を選択します。

api_key.png

3. 次に、生成したキーをコピーし、環境変数に保存します。

[進行を確認] をクリックして、目標に沿って進行していることを確認します。

API キーを作成する

現在環境変数に保存します。これは、リクエストのたびに API キーの値を挿入する手間を省くためです。

Cloud Shell で、次のコマンドを実行し、先ほどコピーした <your_api_key> をキーに置き換えます。

export API_KEY=<YOUR_API_KEY>

Cloud Storage バケットに画像をアップロードする

Cloud Storage バケットを作成する

画像検出のために Vision API に画像を送信する方法は 2 つあります。base64 でエンコードされた画像文字列を API に送信する方法と、Google Cloud Storage に保存されたファイルの URL を渡す方法です。このラボでは Cloud Storage の URL を使用します。これを行うには、最初に画像を保存するための Google Cloud Storage バケットを作成する必要があります。

1. プロジェクトの Cloud Console で [ナビゲーション メニュー] > [Cloud Storage] の順に移動し、[バケットを作成] をクリックします。

CloudStorage.png

2. バケットに一意の名前を付けます。

create_bucket.png

3. バケットに名前を付けたら、[オブジェクトへのアクセスを制御する方法を選択する] をクリックします。

[このバケットに対する公開アクセス禁止を適用する] のチェックを外し、[きめ細かい管理] の円を選択します。

fine-grained.png

4.バケットの他のすべての設定は、デフォルト設定のままにすることができます。[作成] をクリックします。

バケットに画像をアップロードする

1. 次のドーナツの画像を右クリックし、[Save image as] をクリックして、donuts.png という名前でパソコンに保存します。

test_image.png

2. 先ほど作成したバケットに移動して [ファイルをアップロード] をクリックします。次に、donuts.png を選択します。

Bucket_mybucket_upload_files.png

バケットにこのファイルが表示されます。

3. 次に、この画像を公開する必要があります 。画像の 3 つのドットをクリックして、[権限を編集] を選択します。

Bucket_donut_public.png

4. [エントリを追加] をクリックしてから次の項目を入力します。

エンティティ: Public

名前: allUsers

アクセス権: Reader

bucket_object_public_perm.png

5. 最後に [保存] をクリックします。

これで、ファイルをバケットに保存できました。次は Vision API リクエストを作成し、Vision API にこのドーナッツの画像の URL を渡します。

[進行を確認] をクリックして、目標に沿って進行していることを確認します。

Cloud Storage バケットに画像をアップロードする

Vision API リクエストを作成する

ここでは、Cloud Shell 環境で request.json ファイルを作成します。

1. Cloud Shell コード エディタ(Cloud Shell リボンの鉛筆アイコンをクリック)、

pencil.png

またはお好みのコマンドライン エディタ(nanovim、または emacs)を使用して、request.json ファイルを作成します。

2. 次のコードをファイルに入力するか貼り付けます。

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          }
        },
        "features": [
          {
            "type": "LABEL_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

3. ファイルを保存します。

ラベル検出

最初に、Cloud Vision API のラベル検出機能について見てみましょう。このメソッドは、画像に含まれる物体のラベル(単語)のリストを返します。

curl を使用して Vision API を呼び出します。

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

次のようなレスポンスが表示されます。

{
  "responses": [
    {
      "labelAnnotations": [
        {
          "mid": "/m/01dk8s",
          "description": "Powdered sugar",
          "score": 0.9861496,
          "topicality": 0.9861496
        },
        {
          "mid": "/m/01wydv",
          "description": "Beignet",
          "score": 0.9565117,
          "topicality": 0.9565117
        },
        {
          "mid": "/m/02wbm",
          "description": "Food",
          "score": 0.9424965,
          "topicality": 0.9424965
        },
        {
          "mid": "/m/0hnyx",
          "description": "Pastry",
          "score": 0.8173416,
          "topicality": 0.8173416
        },
        {
          "mid": "/m/02q08p0",
          "description": "Dish",
          "score": 0.8076026,
          "topicality": 0.8076026
        },
        {
          "mid": "/m/01ykh",
          "description": "Cuisine",
          "score": 0.79036003,
          "topicality": 0.79036003
        },
        {
          "mid": "/m/03nsjgy",
          "description": "Kourabiedes",
          "score": 0.77726763,
          "topicality": 0.77726763
        },
        {
          "mid": "/m/06gd3r",
          "description": "Angel wings",
          "score": 0.73792106,
          "topicality": 0.73792106
        },
        {
          "mid": "/m/06x4c",
          "description": "Sugar",
          "score": 0.71921736,
          "topicality": 0.71921736
        },
        {
          "mid": "/m/01zl9v",
          "description": "Zeppole",
          "score": 0.7111677,
          "topicality": 0.7111677
        }
      ]
    }
  ]
}

API によって、ドーナツの具体的な種類(ベニエ)が特定されました。Vision API で検出されたラベルごとに、次のような結果が返されます。

  • description: アイテムの名前。

  • score: 説明と画像の内容がどの程度一致しているかの信頼度を示す 0~1 の数字。

  • mid: Google のナレッジグラフのアイテムの mid に対応する値。ナレッジグラフ API を呼び出すときに mid を使用すると、アイテムに関する詳細情報を取得できます。

ウェブ検出

Vision API を使うと、画像の内容に関するラベルを取得することができます。また、特定の画像の詳細情報をインターネットで検索することもできます。API の webDetection メソッドを使用することで、以下のようなさまざまな興味深いデータを取得できます。

  • ご使用の画像に含まれるエンティティのリスト(類似画像を含むページのコンテンツに基づく)
  • ウェブ上で見つかった完全一致画像と部分一致画像の URL、およびそれらの画像を含むページの URL
  • 画像を使用した検索などで得られた、類似画像の URL

ウェブ検出を試してみましょう。同じベニエの画像を使用して request.json ファイルの 1 行を変更します(まったく異なる画像を使用することもできます)。

1. features リストの下で、typeLABEL_DETECTION から WEB_DETECTION に変更します。request.json は次のようになります。

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/donuts.png"
          }
        },
        "features": [
          {
            "type": "WEB_DETECTION",
            "maxResults": 10
          }
        ]
      }
  ]
}

ファイルを保存します。

2. これを Vision API に送信するには、前と同じように curl コマンドを使用します(Cloud Shell で ↑ キーを押すだけです)。

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

次は、webEntities で始まるレスポンスを調べてみましょう。この画像が返したエンティティをいくつか示します。

 {
  "responses": [
    {
      "webDetection": {
        "webEntities": [
          {
            "entityId": "/m/0z5n",
            "score": 0.8868,
            "description": "Application programming interface"
          },
          {
            "entityId": "/m/07kg1sq",
            "score": 0.3139,
            "description": "Encapsulation"
          },
          {
            "entityId": "/m/0105pbj4",
            "score": 0.2713,
            "description": "Google Cloud Platform"
          },
          {
            "entityId": "/m/01hyh_",
            "score": 0.2594,
            "description": "Machine learning"
          },
          ...
        ]

この画像は Cloud ML API の多くのプレゼンテーションで使用されているため、API はエンティティ「Machine learning」や「Google Cloud Platform」を検出しました。

fullMatchingImagespartialMatchingImagespagesWithMatchingImages の下の URL を調べると、多くの URL がこのラボサイトを参照していることがわかります。

他のベニエの画像が必要であるものの、まったく同じ画像は必要ではないものとします。その場合は、API レスポンスの visuallySimilarImages 部分が役に立ちます。次のような視覚的に類似した画像が検出されます。

"visuallySimilarImages": [
          {
            "url": "https://media.istockphoto.com/photos/cafe-du-monde-picture-id1063530570?k=6&m=1063530570&s=612x612&w=0&h=b74EYAjlfxMw8G-G_6BW-6ltP9Y2UFQ3TjZopN-pigI="
          },
          {
            "url": "https://s3-media2.fl.yelpcdn.com/bphoto/oid0KchdCqlSqZzpznCEoA/o.jpg"
          },
          {
            "url": "https://s3-media1.fl.yelpcdn.com/bphoto/mgAhrlLFvXe0IkT5UMOUlw/348s.jpg"
          },
          ...
]

これらの URL にアクセスすれば、類似の画像を確認できます。

result1.png result2.png result3.png

本物のベニエが食べたくなりますね。これは、Google 画像検索の画像による検索と似ています。

Cloud Vision を使用すると、使いやすい REST API で画像検索機能にアクセスし、それをアプリケーションに統合することができます。

顔の検出

次に、Vision API の顔の検出メソッドについて説明します。

  • 顔の検出メソッドは、画像内で検出された顔に関するデータを返します。返されるデータには、その顔の感情や画像内での位置も含まれます。

新しい画像をアップロードする

この 2 つのメソッドを使用するため、顔とランドマークを含む新しい画像を Cloud Storage バケットにアップロードします。

1. 次の画像を右クリックし、[Save image as] をクリックして、selfie.png という名前でパソコンに保存します。

selfie.png

2. 次に、前と同じ方法で画像を Cloud Storage バケットにアップロードして、公開します。

[進行を確認] をクリックして、目標に沿って進行していることを確認します。

顔検出用の画像を Cloud Storage バケットにアップロードする

リクエスト ファイルを更新する

1. 次に、request.json ファイルを以下のように更新します。新しい画像の URL が追加され、ラベル検出ではなく顔検出とランドマーク検出が使用されています。my-bucket-name の部分は、Cloud Storage バケットの名前に置き換えてください。

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://my-bucket-name/selfie.png"
          }
        },
        "features": [
          {
            "type": "FACE_DETECTION"
          },
          {
            "type": "LANDMARK_DETECTION"
          }
        ]
      }
  ]
}

2. ファイルを保存します。

Vision API を呼び出してレスポンスを解析する

これで、上で使用したものと同じ curl コマンドを使用して Vision API を呼び出す準備ができました。

curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

レスポンスの faceAnnotations オブジェクトを確認すると、画像内に見つかった顔(この場合は 3 つ)に関して、API がオブジェクトを返していることがわかります。レスポンス(抽出したもの)を次に示します。

{
      "faceAnnotations": [
        {
          "boundingPoly": {
            "vertices": [
              {
                "x": 669,
                "y": 324
              },
              ...
            ]
          },
          "fdBoundingPoly": {
            ...
          },
          "landmarks": [
            {
              "type": "LEFT_EYE",
              "position": {
                "x": 692.05646,
                "y": 372.95868,
                "z": -0.00025268539
              }
            },
            ...
          ],
          "rollAngle": 0.21619819,
          "panAngle": -23.027969,
          "tiltAngle": -1.5531756,
          "detectionConfidence": 0.72354823,
          "landmarkingConfidence": 0.20047489,
          "joyLikelihood": "POSSIBLE",
          "sorrowLikelihood": "VERY_UNLIKELY",
          "angerLikelihood": "VERY_UNLIKELY",
          "surpriseLikelihood": "VERY_UNLIKELY",
          "underExposedLikelihood": "VERY_UNLIKELY",
          "blurredLikelihood": "VERY_UNLIKELY",
          "headwearLikelihood": "VERY_LIKELY"
        }
        ...
     }
}
  • boundingPoly は、画像内の顔(頭を含む)周囲の x 座標と y 座標を示します。
  • fdBoundingPoly は顔の肌部分にフォーカスした、boundingPoly よりも小さなボックスです。
  • landmarks は、それぞれの顔の特徴を表すオブジェクトの配列です(聞き慣れないものも含まれているかもしれません)。この値からは、ランドマークの種類とともに、その特徴の 3 次元の位置(x, y, z 座標)がわかります。この z 座標は奥行きを示しています。残りの値からは、喜びや悲しみ、怒り、驚きの感情の尤度など、顔に関する情報がわかります。

上のレスポンスは、画像の最も奥に立っている人物のものです。彼はおどけた表情をしていますが、それが joyLikelihoodPOSSIBLE という値に表れています。

ランドマークアノテーション

  • ランドマークの検出メソッドを使うと、一般的なランドマーク「および不明」を識別することができます。ランドマークの名前、その緯度と経度の座標、ランドマークが識別された画像内の位置が返されます。
  • 新しい画像をアップロードします。

    この方法を使用するには、何人かの顔が写っている画像を Cloud Storage バケットにアップロードします。

    1. 画像を右クリックし、[Save image as] をクリックし、city.png という名前を付けてパソコンに保存します。

    city.png

    2. 次に、アップロードした画像を前と同じ方法で Cloud Storage バケットにアップロードして、公開します。

    [進行を確認] をクリックして、目標に沿って進行していることを確認します.

    ランドマーク アノテーションの画像を Cloud Storage バケットにアップロードする

    リクエストファイルを更新します。

    1. 次のようにrequest.jsonファイルを更新します。これには新しい画像の URL が含まれ、ラベル検出の代わりに顔とランドマークの検出が使用されます。my-bucket-name の部分を Cloud Storage バケットの名前に置き換えてください。

    {
      "requests": [
          {
            "image": {
              "source": {
                  "gcsImageUri": "gs://my-bucket-name/city.png"
              }
            },
            "features": [
              {
                "type": "LANDMARK_DETECTION",
                "maxResults": 10,
              }
            ]
          }
      ]
    }
    

    Vision API を呼び出してレスポンスを解析する

    これで、上で使用したものと同じ curl コマンドを使用して Vision API を呼び出す準備ができました。

    curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}
    

    次にレスポンスの landmarkAnnotations 部分を見てみましょう。

    "landmarkAnnotations": [
            {
              "mid": "/m/041cp3",
              "description": "Boston",
              "score": 0.788803,
              "boundingPoly": {
                "vertices": [
                  {
                    "y": 576
                  },
                  {
                    "x": 1942,
                    "y": 576
                  },
                  {
                    "x": 1942,
                    "y": 1224
                  },
                  {
                    "y": 1224
                  }
                ]
              },
    ...
    

    ここで Vision API は、この写真がボストン遺跡で撮影されたことを認識し、正確な場所の地図を提供します。このレスポンスに含まれる値は、前述の labelAnnotations のレスポンスに類似しています。

    • mid: ランドマークの値。

    • description: ランドマークの名前。

    • score: 信頼度。

    • boundingPoly: ランドマークが特定された画像内の領域。

    • Locations キー:は、画像の緯度経度座標を示します

    その他の Vision API メソッドの詳細を確認する

    Vision API のラベル、顔、ランドマークの検出メソッドを見てきましたが、他にもまだ取り上げていないメソッドが 3 つあります。他の 3 つの検出メソッドについて詳しくは、こちらの資料をご確認ください。

    • ロゴの検出: 画像に含まれる一般的なロゴとその位置を特定します。

    • セーフサーチ検出: 画像に不適切コンテンツが含まれているかどうかを検出します。このメソッドは、ユーザー作成コンテンツを扱うすべてのアプリケーションで役立ちます。アダルト、医療、暴力、なりすましの 4 つの要因に基づいて画像をフィルタします。

    • テキスト検出: OCR を実行して画像からテキストを抽出します。画像内に含まれているテキストの言語を識別することもできます。

    お疲れさまでした

    このラボでは、Vision API を使って画像を分析する方法について学びました。例では、API に対象画像の URL(Google Cloud Storage のもの)を渡しましたが、別の方法として、base64 でエンコードされた画像文字列を渡すこともできます。

    学習した内容

    • Cloud Storage バケット内の画像の URL を Vision API に渡し、curl を使用して Vision API を呼び出す
    • Vision API のラベル、顔、ランドマークの検出メソッドを使用する

    ml_quest_icon.png ML-Image-Processing-badge.png

    クエスト終了

    このセルフペース ラボは、Qwiklabs のクエストである Machine Learning APIIntro to ML: Image Processing の一部です。クエストとは、学習パスを構成する一連のラボのことです。完了すると成果が認められて上のバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントからリンクすることができます。このラボを終えて こちらのクエストに登録すると、すぐにクレジットを受け取ることができます。受講可能なその他の Qwiklabs のクエストもご覧ください

    次のラボを受講する

    Natural Language API によるエンティティ感情分析Awwvision: Kubernetes クラスタからの Cloud Vision API など、他の Machine Learning API のラボもお試しください。

    次のステップと詳細情報

    Google Cloud Training & Certification

    Google Cloud 技術を最大限に活用できるようになります。このクラスでは、必要な技術力とベスト プラクティスを習得し、継続的に学習することができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、仮想環境など、多忙なスケジュールに対応できるオプションが用意されています。認定資格を取得することで、Google Cloud の技術のスキルと知識を証明できます。

    マニュアルの最終更新日: 2021 年 7 月 22 日
    ラボの最終テスト日: 2021 年 7 月 22 日

    Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。