Bildeinbettungen einbinden

Mit Bild-Embeddern lassen sich Bilder in einen hochdimensionalen Merkmalsvektor einbetten, der die semantische Bedeutung eines Bildes darstellt. Dieser Vektor kann dann mit dem Merkmalsvektor anderer Bilder verglichen werden, um ihre semantische Ähnlichkeit zu bewerten.

Im Gegensatz zur Bildersuche ermöglicht der Image-Embedder die Berechnung der Ähnlichkeit zwischen Bildern im laufenden Betrieb, anstatt einen vordefinierten Index zu durchsuchen, der aus einem Korpus von Bildern erstellt wurde.

Mit der Task Library-API ImageEmbedder können Sie Ihren benutzerdefinierten Image-Embedder in Ihren mobilen Apps bereitstellen.

Wichtige Funktionen der ImageEmbedder API

  • Verarbeitung von Eingabebildern, einschließlich Drehung, Größenänderung und Farbraumkonvertierung.

  • Der Bereich des Eingabebilds, der von Interesse ist.

  • Integrierte Dienstprogrammfunktion zum Berechnen der Kosinusähnlichkeit zwischen Featurevektoren.

Unterstützte Modelle für das Einbetten von Bildern

Die folgenden Modelle sind garantiert mit der ImageEmbedder API kompatibel.

Inferenz in C++ ausführen

// 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());

Weitere Optionen zum Konfigurieren von ImageEmbedder finden Sie im Quellcode.

Inferenz in Python ausführen

Schritt 1: TensorFlow Lite Support-PyPI-Paket installieren

Sie können das TensorFlow Lite Support-PyPI-Paket mit dem folgenden Befehl installieren:

pip install tflite-support

Schritt 2: Modell verwenden

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)

Weitere Optionen zum Konfigurieren von ImageEmbedder finden Sie im Quellcode.

Beispielergebnisse

Die Kosinusähnlichkeit zwischen normalisierten Feature-Vektoren ergibt einen Wert zwischen -1 und 1. Je höher der Wert, desto besser. Eine Kosinusähnlichkeit von 1 bedeutet, dass die beiden Vektoren identisch sind.

Cosine similarity: 0.954312

Testen Sie das einfache CLI-Demotool für ImageEmbedder mit Ihrem eigenen Modell und Ihren eigenen Testdaten.

Anforderungen an die Modellkompatibilität

Für die ImageEmbedder API ist ein TFLite-Modell mit optionalen, aber dringend empfohlenen TFLite-Modellmetadaten erforderlich.

Die kompatiblen Modelle für das Einbetten von Bildern sollten die folgenden Anforderungen erfüllen:

  • Ein Eingabebildtensor (kTfLiteUInt8/kTfLiteFloat32)

    • Bild-Eingabe der Größe [batch x height x width x channels].
    • Die Batch-Inferenz wird nicht unterstützt (batch muss 1 sein).
    • Es werden nur RGB-Eingaben unterstützt (channels muss 3 sein).
    • Wenn der Typ kTfLiteFloat32 ist, müssen NormalizationOptions an die Metadaten für die Eingabenormalisierung angehängt werden.
  • Mindestens ein Ausgabetensor (kTfLiteUInt8/kTfLiteFloat32)

    • mit N Komponenten, die den N Dimensionen des zurückgegebenen Feature-Vektors für diese Ausgabeschicht entsprechen.
    • Entweder 2 oder 4 Dimensionen, d.h. [1 x N] oder [1 x 1 x 1 x N].