Wyszukiwanie obrazów umożliwia wyszukiwanie podobnych obrazów w bazie obrazów. Działa poprzez osadzenie wyszukiwanego hasła w wielowymiarowym wektorze reprezentującym semantyczne znaczenie zapytania, a następnie wyszukiwanie podobieństwa we wstępnie zdefiniowanym, niestandardowym indeksie przy użyciu ScaNN (Scalable Nearest Neighbours).
W przeciwieństwie do klasyfikacji obrazów , zwiększenie liczby elementów, które można rozpoznać, nie wymaga ponownego uczenia całego modelu. Nowe elementy można dodawać po prostu odbudowując indeks. Umożliwia to także pracę z większymi (ponad 100 tys. pozycji) bazami danych obrazów.
Użyj interfejsu API ImageSearcher
biblioteki zadań, aby wdrożyć niestandardową wyszukiwarkę obrazów w aplikacjach mobilnych.
Najważniejsze cechy API ImageSearcher
Pobiera pojedynczy obraz jako dane wejściowe, przeprowadza wyodrębnianie osadzania i wyszukiwanie najbliższego sąsiada w indeksie.
Przetwarzanie obrazu wejściowego, w tym obracanie, zmiana rozmiaru i konwersja przestrzeni kolorów.
Obszar zainteresowania obrazu wejściowego.
Warunki wstępne
Przed użyciem interfejsu API ImageSearcher
należy zbudować indeks na podstawie niestandardowego korpusu obrazów, które mają być przeszukiwane. Można to osiągnąć za pomocą interfejsu API Model Maker Searcher, postępując zgodnie z tutorialem i dostosowując go.
Do tego będziesz potrzebować:
- model osadzania obrazu TFLite, taki jak mobilenet v3 . Zobacz więcej wstępnie wytrenowanych modeli osadzania (inaczej modeli wektorów funkcji) z kolekcji Google Image Modules w TensorFlow Hub .
- Twój korpus obrazów.
Po tym kroku powinieneś mieć samodzielny model wyszukiwarki TFLite (np. mobilenet_v3_searcher.tflite
), który jest oryginalnym modelem osadzającym obraz z indeksem dołączonym do metadanych modelu TFLite .
Uruchom wnioskowanie w Javie
Krok 1: Zaimportuj zależność Gradle i inne ustawienia
Skopiuj plik modelu wyszukiwarki .tflite
do katalogu zasobów modułu Android, w którym model będzie uruchamiany. Określ, że plik nie powinien być kompresowany i dodaj bibliotekę TensorFlow Lite do pliku build.gradle
modułu:
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 (NNAPI is included)
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'
}
Krok 2: Korzystanie z modelu
// 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);
Zobacz kod źródłowy i javadoc, aby uzyskać więcej opcji konfiguracji ImageSearcher
.
Uruchom wnioskowanie w 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();
Zobacz kod źródłowy , aby uzyskać więcej opcji konfiguracji ImageSearcher
.
Uruchom wnioskowanie w Pythonie
Krok 1: Zainstaluj pakiet Pypi obsługujący TensorFlow Lite.
Możesz zainstalować pakiet TensorFlow Lite Support Pypi za pomocą następującego polecenia:
pip install tflite-support
Krok 2: Korzystanie z modelu
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)
Zobacz kod źródłowy , aby uzyskać więcej opcji konfiguracji ImageSearcher
.
Przykładowe wyniki
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
Wypróbuj proste narzędzie demonstracyjne CLI dla ImageSearcher z własnym modelem i danymi testowymi.