חיפוש לפי תמונה מאפשר לחפש תמונות דומות במסד נתונים של תמונות. החיפוש מתבצע על ידי הטמעת שאילתת החיפוש בווקטור רב-ממדי שמייצג את המשמעות הסמנטית של השאילתה, ואז מתבצע חיפוש דמיון באינדקס מותאם אישית שהוגדר מראש באמצעות ScaNN (Scalable Nearest Neighbors).
בניגוד לסיווג תמונות, כדי להגדיל את מספר הפריטים שאפשר לזהות לא צריך לאמן מחדש את כל המודל. כדי להוסיף פריטים חדשים, פשוט בונים מחדש את האינדקס. בנוסף, אפשר לעבוד עם מסדי נתונים גדולים יותר של תמונות (100,000 פריטים ומעלה).
משתמשים ב-Task Library ImageSearcher API כדי לפרוס את הכלי המותאם אישית לחיפוש תמונות באפליקציות לנייד.
התכונות העיקריות של ImageSearcher API
הצומת מקבל תמונה אחת כקלט, מבצע חילוץ של הטמעה וחיפוש של השכן הקרוב ביותר באינדקס.
עיבוד תמונת הקלט, כולל סיבוב, שינוי גודל והמרה של מרחב הצבעים.
אזור העניין בתמונת הקלט.
דרישות מוקדמות
לפני שמשתמשים ב-API ImageSearcher, צריך ליצור אינדקס על סמך מאגר תמונות מותאם אישית שאפשר לחפש בו. אפשר לעשות זאת באמצעות Model Maker Searcher API. כדי לעשות זאת, פועלים לפי ההוראות במדריך ומתאימים אותן לצרכים שלכם.
לשם כך, תצטרכו:
- מודל להטמעת תמונות ב-TFLite, כמו mobilenet
v3.
אפשר לראות עוד מודלים מוטמעים שעברו אימון מראש (שנקראים גם מודלים של וקטור תכונות) מתוך אוסף מודולי התמונות של Google ב-Kaggle.
- קורפוס התמונות שלכם.
אחרי השלב הזה, אמור להיות לכם מודל חיפוש עצמאי של 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 עם המודל ונתוני הבדיקה שלכם.