画像エンベッダーを使用すると、画像の意味を表す高次元の特徴ベクトルに画像を埋め込むことができます。この特徴ベクトルを他の画像の特徴ベクトルと比較して、意味的類似性を評価できます。
画像検索とは異なり、画像エンベッダーを使用すると、画像のコーパスから構築された事前定義済みのインデックスを検索するのではなく、画像間の類似性をオンザフライで計算できます。
Task Library ImageEmbedder API を使用して、カスタム画像エンベッダーをモバイルアプリにデプロイします。
ImageEmbedder API の主な機能
回転、サイズ変更、色空間変換などの入力画像処理。
入力画像の対象領域。
特徴ベクトル間のコサイン類似度を計算する組み込みのユーティリティ関数。
サポートされている画像エンベッダー モデル
次のモデルは、ImageEmbedder API との互換性が保証されています。
Kaggle Models の Google Image Modules コレクションの特徴ベクトル モデル。
モデルの互換性要件を満たすカスタムモデル。
C++ で推論を実行する
// Initialization
ImageEmbedderOptions options:
options.mutable_model_file_with_metadata()->set_file_name(model_path);
options.set_l2_normalize(true);
std::unique_ptr<ImageEmbedder> image_embedder = ImageEmbedder::CreateFromOptions(options).value();
// Create input frame_buffer_1 and frame_buffer_2 from your inputs `image_data1`, `image_data2`, `image_dimension1` and `image_dimension2`.
// See more information here: tensorflow_lite_support/cc/task/vision/utils/frame_buffer_common_utils.h
std::unique_ptr<FrameBuffer> frame_buffer_1 = CreateFromRgbRawBuffer(
image_data1, image_dimension1);
std::unique_ptr<FrameBuffer> frame_buffer_2 = CreateFromRgbRawBuffer(
image_data2, image_dimension2);
// Run inference on two images.
const EmbeddingResult result_1 = image_embedder->Embed(*frame_buffer_1);
const EmbeddingResult result_2 = image_embedder->Embed(*frame_buffer_2);
// Compute cosine similarity.
double similarity = ImageEmbedder::CosineSimilarity(
result_1.embeddings[0].feature_vector(),
result_2.embeddings[0].feature_vector());
ImageEmbedder を構成するその他のオプションについては、ソースコードをご覧ください。
Python で推論を実行する
ステップ 1: TensorFlow Lite Support Pypi パッケージをインストールします。
TensorFlow Lite Support Pypi パッケージは、次のコマンドを使用してインストールできます。
pip install tflite-support
ステップ 2: モデルを使用する
from tflite_support.task import vision
# Initialization.
image_embedder = vision.ImageEmbedder.create_from_file(model_path)
# Run inference on two images.
image_1 = vision.TensorImage.create_from_file('/path/to/image1.jpg')
result_1 = image_embedder.embed(image_1)
image_2 = vision.TensorImage.create_from_file('/path/to/image2.jpg')
result_2 = image_embedder.embed(image_2)
# Compute cosine similarity.
feature_vector_1 = result_1.embeddings[0].feature_vector
feature_vector_2 = result_2.embeddings[0].feature_vector
similarity = image_embedder.cosine_similarity(
result_1.embeddings[0].feature_vector, result_2.embeddings[0].feature_vector)
ImageEmbedder を構成するその他のオプションについては、ソースコードをご覧ください。
検索結果の例
正規化された特徴ベクトル間のコサイン類似度は、-1 から 1 までのスコアを返します。値が高いほど優れています。つまり、コサイン類似度が 1 の場合、2 つのベクトルは同一です。
Cosine similarity: 0.954312
独自のモデルとテストデータを使用して、シンプルな ImageEmbedder 用の CLI デモツールを試してください。
モデルの互換性要件
ImageEmbedder API は、オプションですが強く推奨される TFLite モデル メタデータを含む TFLite モデルを想定しています。
互換性のある画像エンベッダー モデルは、次の要件を満たしている必要があります。
入力画像テンソル(kTfLiteUInt8/kTfLiteFloat32)
- サイズ
[batch x height x width x channels]の画像入力。 - バッチ推論はサポートされていません(
batchは 1 である必要があります)。 - RGB 入力のみがサポートされます(
channelsは 3 である必要があります)。 - 型が kTfLiteFloat32 の場合、入力正規化のメタデータに NormalizationOptions を付加する必要があります。
- サイズ
少なくとも 1 つの出力テンソル(kTfLiteUInt8/kTfLiteFloat32)
- この出力レイヤの返された特徴ベクトルの
Nディメンションに対応するNコンポーネント。 - 2 つまたは 4 つのディメンション(
[1 x N]または[1 x 1 x 1 x N])。
- この出力レイヤの返された特徴ベクトルの