Cloud Vision API と Cloud AutoML Vision を使用する画像検索アプリケーション

この記事では、Vision APIAutoML Vision を使用して画像検索分類アプリケーションを強化する方法について説明します。これらのサービスを他の Google Cloud Platform(GCP)サービスと組み合わせると、次のことが簡単にできます。

  • 画像内で検出されたオブジェクトやシーンを検索します。
  • 検出された画像ラベルに基づいて画像をさまざまなカテゴリに分類します。
  • 画像ラベルとカテゴリを検索ファセットとして使用します。

Vision API は、Google のディープ ラーニング モデルを利用し、次のような高度な画像処理機能を提供します。

  • ラベル検出
  • 顔とランドマークの検出
  • 光学式文字認識(OCR)
  • 不適切なコンテンツの検出

AutoML Vision を使用すると、Google のニューラル アーキテクチャ検索と最先端の転移学習を使用して、カスタムラベル検出を行うための高品質モデルをトレーニングできます。これらのテクノロジーを使用すると、必要な最小限の機械学習スキルで、トレーニング データを基に自分のビジョンモデルを作成できます。

REST API を使用すると、これらの機能を新しいアプリケーションや既存のアプリケーションに統合できます。

この記事で説明するアプリケーションの構築方法については、Cloud Vision API と Cloud AutoML Vision を使用した画像検索アプリケーションの構築をご覧ください。

ラベル検出を使用して画像を検索可能にする

ラベル検出は、Vision API および AutoML Vision の画像アノテーション機能です。この機能は、画像を記述する最も適切なラベルを予測します。この機能は、何千ものオブジェクト カテゴリにわたる幅広いオブジェクト セットを識別し、ラベル アノテーションまたは画像内で検出された各ラベルを返します。また、以下も返します。

  • ラベル識別子: ラベルの不透明エンティティ ID(例: "/m/0bt9lr")。
  • ラベルの説明: テキスト形式のラベルの説明(例: 「dog」)。
  • 信頼スコア: 返されたラベル アノテーションごとに関連付けられている数字。ラベルの精度の Vision API の評価を表します。信頼スコアは、0(信頼できない)~1(信頼度が非常に高い)の範囲で示されます。

AutoML Vision では、カスタムラベル検出を実行するモデルを自分のラベルでトレーニングするために、ラベル付きのデータセットを備えています。ラベル検出と検索インデックスを組み合わせることで、画像を新しい方法で検索可能にします。次の図はこの方法を表しています。

ラベルの検出と検索インデックス

このソリューション アーキテクチャでは、次の処理が行われます。

  1. ユーザーがクライアント アプリケーションから Cloud Storage バケットに画像をアップロードします。
  2. 新しい画像がバケットに保存されると、Cloud Pub/Sub通知を生成します。
  3. Cloud Pub/Sub 通知には新しい画像ファイルの詳細が含まれます。通知に使用される Cloud Pub/Sub トピックは、App Engine エンドポイントへの push 配信用に構成されています。
  4. App Engine バックエンドで、新しいファイルの存在が認識されるようになりました。App Engine が、アップロードされた画像に対して Vision API を呼び出し、ラベルを処理して追加します。これらのラベルは検索インデックスにも追加されます。
  5. (省略可)App Engine が、AutoML Vision を使用して検出されたカスタムラベルを検索インデックスに追加します。
  6. (省略可)App Engine は AI Platform を呼び出して、検出されたラベルを使用して画像をユーザー定義のカテゴリに分類します。このカテゴリも検索インデックスに追加されます。
  7. 検出された画像ラベルを App Engine の Search API を使用して検索します。Search API は、キーワード検索やファセット検索など、さまざまな機能を提供します。

ファセット検索にラベルを使用する

ファセット検索を使用すると、Vision API と AutoML Vision ラベル(この記事では画像ラベルと呼ばれる)を検索インターフェースに表示できます。ファセット検索では、検索結果と一緒に画像ラベルとラベルの数が、操作可能な検索ファセットとして表示されます。ユーザーが異なるインデックス フィールドにクエリを実行して一般的なキーワード検索を開始した後、検索ファセットを使用すると、検索結果を絞り込み、特定のラベルを含む画像のみを表示できます。

また、検索インターフェースには、ラベルごとの結果の数も表示されます。ファセット検索は、検索結果に多くの共通ラベルが含まれている場合に有効です。

ファセット検索の例

「city」のような単純なキーワードを使用して画像を検索すると、検索結果に数千の画像が表示されます。この場合、結果を絞り込むためにキーワードを追加する必要がありますが、追加するキーワードがわからないこともあります。ファセット検索では、「city」というキーワードで見つかった画像に付随するラベルも収集されます。このラベルはファセットとして扱われ、頻出するファセットが選択リストの候補リストに表示されます。

たとえば、ファセット検索で、検索画像によく使用されているラベルの上位 10 個を表示できます。このリストを使用すると、事前入力されたリストから追加のキーワードを選択できます。次に、デプロイされたサンプルのスクリーンショットを示します。

デプロイされたファセット検索

このスクリーンショットは、画像ラベルが検索ファセットとしてどのように公開されているかを示しています。ユーザーが検索を実行すると、一致するドキュメントのセットから検出された画像ラベルが、クリック可能な検索ファセットとして検索結果と一緒に表示されます。この例では、画像ラベル ファセットが表示されています。画像ラベルのリンクの 1 つを選択すると、検索クエリの絞り込みが実行され、選択したラベルを含む画像(「cityscape」や「night」など)のみが返されます。

さらに、App Engine の Search API を使用して、画像ラベルがドキュメントのインデックス フィールドに追加されます。この例では、追加のキーワードのリストとして、所定の画像カテゴリMapped Category ファセットと Most Similar Category ファセット)も表示されています。次のセクションでは、この機能の実装方法について説明します。

画像分類にラベルを使用する

アプリケーションでラベルを直接公開したほうがよい場合もあれば、ラベルを直接公開するのではなく、検出されたラベルの画像を所定のカテゴリに分類したほうがよい場合もあります。

たとえば、画像ラベルを直接検索するのではなく、「nature」や「cityscapes」などのカテゴリに一致する画像を検索したい場合もあります。この場合、画像ラベルをさまざまな方法で使用して、最も適切な画像カテゴリを導き出すことができます。

Vision API と AutoML Vision を使用してこのシナリオを有効にできます。

  • Vision API のラベル検出は、API でカテゴリがすでに認識されていて、画像ラベルとして返される場合に最適です。また、ラベル検出は、Vision API による幅広い理解を活用する、多様な対象分野に関連する画像をアプリケーションで処理する場合にも有用です。

    いずれの場合も、「pollution」、「factory」、「landfill」、「iceberg」などの、Vision API から返される画像ラベルを使用して、さまざまな方法で幅広いカテゴリのコンテキストを判定できます。また、「climate change」などのより広いカテゴリの判定にも使用できます。詳細については、このドキュメント後半の Vision API を使用した画像の分類をご覧ください。

  • AutoML Vision は、ユーザーが提供するラベル付きトレーニング セットによるカスタム画像分類に最適です。AutoML Vision のカスタムラベル検出機能は、トレーニング セットに含まれるユーザー定義ラベルを返します。このラベルを使用して、カスタム画像カテゴリを作成できます。

    Vision API のラベル検出が分類タスクに適切なラベルを返さない場合、AutoML Vision を使用してカスタム画像モデルをトレーニングすることをおすすめします。詳細については、このドキュメントの後半の AutoML Vision を使用した画像の分類をご覧ください。

Vision API を使用した画像の分類

Vision API は、抽象的なものから具体的なものまで、数千の異なるカテゴリのオブジェクトを検出します。この幅広い理解は、アプリケーションに役立つ所定のカテゴリに画像を分類するために使用できます。

このシナリオを有効にするには、Vision API 画像ラベルを特定のカテゴリに関連付ける方法を実装する必要があります。以下のセクションでは、次の 2 つの方法について説明します。

  • 検出されたラベルを所定のカテゴリにマッピングする。
  • 単語ベクトルで類似したカテゴリを検索する。

どちらの方法でも、Vision API の画像ラベルは、画像を分類するための適切なコンテキストを提供します。

検出されたラベルを所定のカテゴリにマッピングする

ストックフォトを販売するウェブサイトを開発しているとしましょう。ユーザー インターフェースで、wildlifenaturecityscapes などの定義済みカテゴリで画像を検索または閲覧できるようにします。Vision API で「giraffe」、「elephants」、「savanna」などの画像ラベルが返された場合、これらの画像が wildlife カテゴリに自動的に分類されるようにします。

Vision API のラベル検出は、具体的な所定のカテゴリのスコアではなく、画像内のさまざまなカテゴリを返します。ラベルをカテゴリにマッピングする簡単な方法は、Vision API ラベルを特定のカテゴリにマッピングすることです。この場合、各カテゴリは 1 つ以上の特定の Vision API ラベルに関連付けられます。(このソリューションの残りの部分では、この方法を固定ラベルからカテゴリへのマッピングと呼ぶことにします)。このスキーマでは、Vision API から返されたラベルが、各カテゴリを定義する単語のリストと比較されます。また、画像ラベルの信頼スコアで決まる最適カテゴリの画像とも比較されます。

Vision API は、1 つの画像に対して複数のラベルを返す場合があります。それぞれの画像について、検出された画像ラベルが所定のカテゴリを定義する単語と比較されます。1 つ以上の一致が見つかると、一致したラベルの Vision API 信頼スコアが合計され、各カテゴリの信頼スコアが作成されます。このスコアは、所定のカテゴリを定義する単語と返された画像の Vision API ラベルの一致度を数値で表現したものです。信頼度が最も高いカテゴリが画像カテゴリとして選択され、検索インデックスに追加されます。スコアが同じ場合は、適切なカテゴリにイメージを追加するか、イメージを単一のカテゴリに分類できるように追加のヒューリスティックを定義します。

次の図は、事前に設定されたカテゴリの小さなセットを使用して、この方法を実装する方法を示しています。

所定のカテゴリへのマッピング

検出されたラベルをカテゴリにマッピングする方法では、各カテゴリに関連付けられた特定の画像ラベルを予測できる場合、つまり、単語のセットで所定のカテゴリの多くを定義できる場合に、ラベルが返される確率が高くなります。たとえば、「dog」、「cat」、「bird」などの組み合わせがラベルとして検出される画像が多い場合は、これらのラベルを使用してカテゴリを定義することで、「animals」というカテゴリを簡単に定義できます。画像にさまざまなラベル付いている場合、これらのラベルを特定のカテゴリにマップする方法を決めることは困難になります。前の例では、ラベルとして「horse」が検出されますが、「dog」、「cat」、「bird」は検出されません。「animals」カテゴリを定義している単語セットに含まれていないため、先ほどの画像は正しく分類されません。

また、検出される画像ラベルが複数のカテゴリに関連する可能性があり、画像を最高得点と比較する作業がさらに複雑になることがあります。たとえば、複数のカテゴリが類似した「ラベルからカテゴリへの固定マッピング」を共有する場合、これらの画像ラベルのカテゴリ信頼スコアは同じ結果になります。画像を一意のカテゴリに配置することが重要な場合は、カテゴリ固有のラベル マッピングを探し、カテゴリスコアの差を増やす必要があります。しかし、正確なマッチングを行うために、一意のラベルを特定することは難しいかもしれません。

単語ベクトルで類似した最適なカテゴリを見つける

Vision API によって返される検出されたラベルの種類によっては、ラベルとカテゴリの間で固定マッピングを行うことが難しい場合もあります。この場合、ラベル値を直接比較するのではなく、ラベル間で概念の類似性を測定するという別の方法を使用できます。

検出された画像ラベルとして、「bird」、「parrot」、「vertebrate」、「fauna」が返されたとします。これらのラベルは、所定のカテゴリセットの代表的なラベルと比較できます。

カテゴリ ラベル 1 ラベル 2 ラベル 3 ラベル 4 ラベル 5 類似性
Animal cat animal parakeet canine horse
Vehicle automobile truck car tram ship ×

この表のカテゴリラベルのどれもが、返された画像ラベルと完全に一致するものはありませんが、Animal カテゴリが最も近い概念です。つまり、検出されたラベルは、Vehicle カテゴリを定義する単語よりも、Animal カテゴリを定義する単語に似ています。システムがこの類似性を認識し、画像を Animal として正しく分類するようにします。

自然言語処理では、個々の単語をベクトル表現に変換することが少なくありません。これらのベクトルを数学的に操作して、単語間の相関関係を特定できます。word2vecGloVe などのトレーニング済みの単語の埋め込み辞書では、一般的な単語が実数のベクトル表現にすでに変換されています。これらのベクトル表現を使用すると、画像ラベルとカテゴリラベルの間の類似度スコアを計算できます。画像と最も類似したスコアを持つカテゴリが画像に関連付けられます。

GloVe を使用した画像とカテゴリ ベクトルの計算

画像の実数ベクトルを生成するため、検出されたラベルが GloVe で同等のベクトル表現に変換されます。さらに、個々の単語ベクトルが加算され、単一の合成ベクトルに短縮されます。前の例では、画像の検出ラベル(「bird」、「parrot」、「vertebrate」、「fauna」)が個々の単語ベクトルに変換されます。合成された単語ベクトルは、各ラベルスコアの単語ベクトルの線形合成によって作成されます。このようにして、複数のラベルを持つ画像がその全体的な意味を表す合成ベクトルに変換されます。

各カテゴリの合成ベクトルは、そのカテゴリを最もよく表す単語ベクトルの和でも計算されます。この合成ベクトルは、カテゴリを定義するすべての単語である必要はありません。多くの場合、関連するサブセットになります。単語を画像とカテゴリの両方のベクトルに変換するには、画像ラベルとカテゴリ要素の両方が、事前に作成された GloVe の埋め込みに存在する必要があります。

各カテゴリを定義する単語の数は一定ではありません。1 つのカテゴリに複数の単語が使用されている場合、単語ベクトルの合計は、カテゴリ内のすべての単語を合わせた意味に近くなります。1 つのカテゴリに 1 つの単語を使用することもできます。

カテゴリの合成ベクトルを生成するために単語を選択する場合は、カテゴリ間で同様の意味を持つ単語を使用しないでください。このような単語を使用すると、カテゴリ間の曖昧さを取り除くことが難しくなります。代わりに、カテゴリを一意に表す単語を選択します。たとえば、BuildingsRoads というカテゴリ間の場合、「concrete」と「asphalt」という単語には曖昧さが残ります。対照的に、「house」と「street」という単語は区別しやすくなります。

カテゴリを定義する単語の数と値は状況によって異なります。さまざまな組み合わせを試すことで最適な結果を見つけることができます。

画像ベクトルとカテゴリ ベクトルの類似度の計算

特定のカテゴリの画像を分類する場合、合成された画像ベクトルとカテゴリ ベクトルのコサイン類似度を計算することができます。類似度が高いほど、画像とカテゴリとの相関が高くなります。次の図に、このプロセスを示します。

画像ベクトルとカテゴリ ベクトルの類似度の計算

ここで、GloVe からの単語ベクトルが、合成された画像ベクトルおよびカテゴリ ベクトルの計算に使用されます。合成された画像ベクトルとカテゴリ ベクトルのコサイン類似性が等価の判断に使用されます。この場合、意味スコアは比較的近く(0.75)、これは picture.jpgAnimals カテゴリに関連している可能性が高いことを示しています。

この方法を実装するには、簡単な TensorFlow モデルを AI Platform にデプロイします。このモデルは、Vision API から検出されたラベルを受け入れ、検出されたラベルを合成ベクトル表現に変換し、合成されたカテゴリ ベクトルごとのコサイン類似度を計算します。TensorFlow モデルでは、事前トレーニング済みの単語の埋め込みを使用して、画像とカテゴリラベルをベクトル化します。追加のトレーニングは不要です。

次の図は、AI Platform を組み込んだ最新のソリューション アーキテクチャを示しています。

ML を組み込んだアーキテクチャ

App Engine のバックエンドをトリガーする

App Engine のバックエンドをトリガーすることは、固定ラベルとカテゴリのマッピングを使用した前述の方法と似ています。この方法では、Cloud Storage バケットに新しい画像をアップロードすると、App Engine エンドポイントがトリガーされます。トリガーされたエンドポイントは、Vision API を使用して画像のラベル検出をリクエストし、AI Platform で予測モデルを呼び出して、画像ラベルをベクトル表現に変換します。次に、予測モデルが、画像ベクトルと各カテゴリ ベクトルのコサイン類似度スコアを計算します。類似度が最も高いカテゴリが画像に適用され、検索インデックスに追加されます。

方法の違い

次のスクリーンショットは、カテゴリを派生する 2 つの方法を比較しています。左側は固定ラベルからカテゴリへマッピングする方法、右側は単語ベクトルを使用する方法です。

ラベルからカテゴリへのマッピング 単語ベクトル

この例では、Mapped Category: animals(固定ラベルからカテゴリへのマッピングを使用)は、「dog」、「cat」、「fish」、「horse」、「animal」、「bird」、「parrot」、「budgie」といった単語セットにより定義されます。cat.jpg の場合は、AutoML Vision によって「fauna」、「wildlife」、「zoo」といったラベルが返されます。

左側のスクリーンショットでは、Mapped Category: animals ファセット値が選択されたときに、猫の画像が欠落しています。Mapped Category: animals は、固定ラベルからカテゴリへのアプローチを表します。カテゴリの要素に一致する AutoML Vision ラベルがないため、該当の画像は animals カテゴリには関連付けられていません。カテゴリ類似度スコアを計算するには完全一致が必要になります。この場合、画像とカテゴリとのカテゴリ類似度スコアは 0 で、ラベル要素とカテゴリ要素との間に重複はありません。

GloVe の単語ベクトルを組み込んだ右のスクリーンショットでは、Most Similar Category: animals に猫の画像が含まれています。単語ベクトルを使用して、Most Similar Category: animals(「animal」、「creature」、「species」、「pet」)を定義する要素が、合成されたカテゴリ ベクトルに変換されます。同様に、cat.jpg で返された画像ラベル(「fauna」、「wildlife」、「zoo」)が、合成された画像ベクトルに変換されます。合成されたカテゴリ ベクトルと画像ベクトルとのコサイン類似性は十分に近いので、意味的な類似性を有すると判定されます。正確な「cat」ラベルが返されていませんが、cat.jpg 画像ラベルは animals カテゴリ要素に十分に類似しているため、TensorFlow モデルが猫画像を正しいカテゴリに配置できます。

どちらのスクリーンショットも、ファセット値の横にある数字は、表示された結果セットに含まれる特定のラベルの合計数を表します。これは、左側のスクリーンショットでは、固定ラベルからカテゴリへのマッピングを使用して、cat.jpganimals に直接マッピングされていないことを示している一方、右側のスクリーンショットで、Mapped Category ファセット内に animals(1) が表示されている理由を示します。

AutoML Vision を使用した画像の分類

Vision API のラベル検出では、画像内のさまざまなカテゴリセットが検出されますが、Vision API が検出しないカテゴリが必要な場合もあります。これらのカテゴリには、特定用途(専用機械の部品の分類など)用の分野の固有性が高いラベルが含まれている場合があります。この場合は、AutoML Vision を使用して、ユーザーが提供したデータセットを使用してカスタム画像モデルをトレーニングすることをおすすめします。

AutoML Vision を使用してカスタム画像モデルをトレーニングする場合は、トレーニング画像が AutoML Vision に適していて、予測に使用される画像を代表していることを確認します。この要件を明示するために、動物の検出を目的とするが、4 つ足の動物の写真のみでトレーニングされる画像モデルでは、鳥を動物として識別することはありません。比較のため、Vision API の既存のラベル検出は、「animal」を特定のラベルとして返すか、または正しいカテゴリを派生できる関連ラベルを返すことによって、この違いを説明するのに十分な幅広さを備えています(前述の Vision API を使用した画像の分類をご覧ください)。

次の図は、AutoML Vision を画像検索アプリケーションに組み込んだソリューション アーキテクチャを示しています。下の例では、トレーニング データセットのユーザー定義ラベルが画像カテゴリとして直接使用されています。

AutoML Vision を組み込んだアーキテクチャ

このアプローチでは、Vision API の分類と同様に、Cloud Storage バケットにアップロードされた新しい画像が App Engine エンドポイントをトリガーします。トリガーされたエンドポイントは、AutoML Vision を使用した画像のカスタムラベル検出をリクエストします。信頼スコアが最も高い画像ラベルが画像カテゴリとして割り当てられ、検索インデックスに追加されます。

AutoML Vision を Vision API とともに使用して、両方の機能を組み合わせることができます。たとえば、多様な対象分野にわたるファセット検索に Vision API ラベル検出を使用し、カスタム画像ラベルに基づいた画像の分類のために AutoML Vision を使用します。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...