שילוב של מחפשי תמונות

חיפוש לפי תמונה מאפשר לחפש תמונות דומות במסד נתונים של תמונות. החיפוש מתבצע על ידי הטמעת שאילתת החיפוש בווקטור רב-ממדי שמייצג את המשמעות הסמנטית של השאילתה, ואז מתבצע חיפוש דמיון באינדקס מותאם אישית שהוגדר מראש באמצעות ScaNN (Scalable Nearest Neighbors).

בניגוד לסיווג תמונות, כדי להגדיל את מספר הפריטים שאפשר לזהות לא צריך לאמן מחדש את כל המודל. כדי להוסיף פריטים חדשים, פשוט בונים מחדש את האינדקס. בנוסף, אפשר לעבוד עם מסדי נתונים גדולים יותר של תמונות (100,000 פריטים ומעלה).

משתמשים ב-Task Library ImageSearcher API כדי לפרוס את הכלי המותאם אישית לחיפוש תמונות באפליקציות לנייד.

התכונות העיקריות של ImageSearcher API

  • הצומת מקבל תמונה אחת כקלט, מבצע חילוץ של הטמעה וחיפוש של השכן הקרוב ביותר באינדקס.

  • עיבוד תמונת הקלט, כולל סיבוב, שינוי גודל והמרה של מרחב הצבעים.

  • אזור העניין בתמונת הקלט.

דרישות מוקדמות

לפני שמשתמשים ב-API‏ ImageSearcher, צריך ליצור אינדקס על סמך מאגר תמונות מותאם אישית שאפשר לחפש בו. אפשר לעשות זאת באמצעות Model Maker Searcher API. כדי לעשות זאת, פועלים לפי ההוראות במדריך ומתאימים אותן לצרכים שלכם.

לשם כך, תצטרכו:

אחרי השלב הזה, אמור להיות לכם מודל חיפוש עצמאי של TFLite (למשל, mobilenet_v3_searcher.tflite), שהוא מודל ההטמעה המקורי של התמונה עם האינדקס שמצורף למטא-נתונים של מודל TFLite.

הסקת מסקנות ב-Java

שלב 1: מייבאים את התלות ב-Gradle והגדרות אחרות

מעתיקים את קובץ המודל של .tflite searcher לספריית הנכסים של מודול Android שבו המודל יופעל. מציינים שהקובץ לא צריך להיות דחוס, ומוסיפים את ספריית TensorFlow Lite לקובץ build.gradle של המודול:

android {
    // Other settings

    // Specify tflite index file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // Other dependencies

    // Import the Task Vision Library dependency
    implementation 'org.tensorflow:tensorflow-lite-task-vision:0.4.4'
    // Import the GPU delegate plugin Library for GPU inference
    implementation 'org.tensorflow:tensorflow-lite-gpu-delegate-plugin:0.4.4'
}

שלב 2: שימוש במודל

// Initialization
ImageSearcherOptions options =
    ImageSearcherOptions.builder()
        .setBaseOptions(BaseOptions.builder().useGpu().build())
        .setSearcherOptions(
            SearcherOptions.builder().setL2Normalize(true).build())
        .build();
ImageSearcher imageSearcher =
    ImageSearcher.createFromFileAndOptions(context, modelFile, options);

// Run inference
List<NearestNeighbor> results = imageSearcher.search(image);

אפשר לעיין בקוד המקור וב-Javadoc כדי לראות עוד אפשרויות להגדרת ImageSearcher.

הרצת הסקה ב-C++‎

// Initialization
ImageSearcherOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_path);
options.mutable_embedding_options()->set_l2_normalize(true);
std::unique_ptr<ImageSearcher> image_searcher = ImageSearcher::CreateFromOptions(options).value();

// Create input frame_buffer from your inputs, `image_data` and `image_dimension`.
// See more information here: tensorflow_lite_support/cc/task/vision/utils/frame_buffer_common_utils.h
std::unique_ptr<FrameBuffer> frame_buffer = CreateFromRgbRawBuffer(
      image_data, image_dimension);

// Run inference
const SearchResult result = image_searcher->Search(*frame_buffer).value();

אפשר לעיין בקוד המקור כדי לראות עוד אפשרויות להגדרת ImageSearcher.

הרצת הסקה ב-Python

שלב 1: מתקינים את חבילת TensorFlow Lite Support Pypi.

אפשר להתקין את חבילת TensorFlow Lite Support Pypi באמצעות הפקודה הבאה:

pip install tflite-support

שלב 2: שימוש במודל

from tflite_support.task import vision

# Initialization
image_searcher = vision.ImageSearcher.create_from_file(model_path)

# Run inference
image = vision.TensorImage.create_from_file(image_file)
result = image_searcher.search(image)

אפשר לעיין בקוד המקור כדי לראות עוד אפשרויות להגדרת ImageSearcher.

תוצאות לדוגמה

Results:
 Rank#0:
  metadata: burger
  distance: 0.13452
 Rank#1:
  metadata: car
  distance: 1.81935
 Rank#2:
  metadata: bird
  distance: 1.96617
 Rank#3:
  metadata: dog
  distance: 2.05610
 Rank#4:
  metadata: cat
  distance: 2.06347

אתם יכולים לנסות את כלי ההדגמה הפשוט של CLI ל-ImageSearcher עם המודל ונתוני הבדיקה שלכם.