Вопрос или проблема
Я довольно нов в области глубокого обучения и действительно надеюсь, что вы сможете мне помочь.
Я хочу написать программу на Python, которая позволит мне выбрать область на эталонном изображении. Этот подизображение переменного размера затем должно быть использовано для поиска в базе данных изображений. Затем должны быть предоставлены части изображений с наибольшим сходством с эталонным подизображением. Однако у меня большие проблемы с размером эталонных и базовых изображений. Я пытался изучить предобученные глубокие нейронные сети (например, VGG19) и использовать признаки последнего слоя для вычисления сходства. Но эти нейронные сети, похоже, принимают входные массивы только в определенных разрешениях.
Должен ли я тогда изменить масштаб эталонного изображения? Изображения в базе данных, скорее всего, будут намного больше, чем эталонное. Должен ли я тогда разбить все изображения в базе данных на меньшие подмножества? Или использовать алгоритм единственного выстрела, например, YOLO?
Поскольку существует так много различных алгоритмов, я буду очень благодарен за любой комментарий или идею.
Лассе
На данный момент это невозможно.
Не существует такой базы данных, которая поддерживала бы произвольный индексированный поиск изображений по содержимому или запросы изображений. Базы данных изображений (IDB) индексируются с использованием семейства R-деревьев или членов семейства квадродеревьев. Они поддерживают только ограниченные SQL (текстовые) запросы.
Вам придется искать изображение за изображением для каждого запрашиваемого изображения, что разрушит смысл наличия базы данных.
Сеть, такая как VGG19, имеет часть, которая генерирует представление изображения, за которой следуют слои классификации. Вы можете использовать ту часть, которая создает представление, и выполнить эту операцию для всех ваших подизображений, а также для всех изображений в вашей базе данных, которые вы хотите сравнить. Затем вы можете сравнить представления, чтобы найти наиболее похожее изображение, например, используя метод ближайшего соседа (просто найдите пример с наименьшим расстоянием в пространстве представлений, но есть более быстрые способы сделать это, чем просто каждую раз вычислять все расстояния).
Сети, такие как VGG19, требуют фиксированного размера/разрешения изображений. Вы можете использовать специализированные сети, которые не требуют этого, но попробуйте это позже. На данный момент просто измените масштаб ваших изображений или обрежьте их, или и то, и другое (вы можете обрезать по нескольким способам, чтобы получить несколько представлений, которые все указывают на одно и то же оригинальное изображение).
Последний шаг. Вместо использования ближайших соседей для поиска наиболее похожего представления, вы можете обучить слои классификации делать это за вас. Я не уверен, что это поможет вашим результатам, но думаю, что это стоит попробовать.
Ответ или решение
Для решения вашей задачи по поиску схожести изображений с использованием предобученной глубокой нейронной сети (DNN), например, VGG19, вам необходимо учесть несколько важных аспектов. Я постараюсь объяснить процесс пошагово.
1. Извлечение признаков из изображений
Первое, что нужно сделать, это использовать предобученную нейронную сеть для извлечения признаков из изображений. VGG19 и аналогичные сети требуют, чтобы входные изображения имели фиксированный размер (например, 224×224 пикселя).
Подготовка изображений
- Масштабирование: Вы можете изменить размер ваших изображений до требуемого размера. Обычно это проще всего и работает достаточно эффективно. Например, используйте
cv2.resize()
из библиотеки OpenCV:import cv2 img_resized = cv2.resize(img, (224, 224))
- Кадрирование: Если у вас есть изображения, которые значимо больше, чем целевой размер, вы можете использовать кадрирование. Это может быть полезно для сохранения важных деталей в изображении.
2. Обработка подизображения
Когда пользователь выбирает область из референсного изображения, вам нужно обрезать это подизображение и затем также изменить его размер до 224×224 пикселей перед тем, как передавать его в модель.
3. Извлечение признаков
После того как ваши изображения (референсное и из базы данных) будут подготовлены, извлеките из них признаки. Вы можете использовать VGG19 без верхнего слоя классификации, чтобы получить вектор признаков:
from keras.applications import VGG19
from keras.applications.vgg19 import preprocess_input
from keras.models import Model
import numpy as np
# Загрузка предобученной модели VGG19
base_model = VGG19(weights='imagenet', include_top=False)
model = Model(inputs=base_model.input, outputs=base_model.output)
# Предобработка изображения
img_preprocessed = preprocess_input(img_resized[np.newaxis, ...])
# Извлечение признаков
features = model.predict(img_preprocessed)
Теперь у вас есть вектор признаков для каждого изображения.
4. Поиск по схожести
Чтобы найти наиболее похожие изображения, вам необходимо сравнить векторы признаков. Один из простейших способов — использовать метрики расстояния, такие как Евклидово расстояние или косинусное сходство. Например:
from sklearn.metrics.pairwise import cosine_similarity
# features_ref - вектор признаков референсного изображения
# features_db - векторы признаков изображений из базы данных
similarities = cosine_similarity(features_ref.reshape(1, -1), features_db)
5. Оптимизация поиска
Для ускорения поиска по базе данных вы можете использовать такие структуры данных, как KD-деревья или LSH (Locality-Sensitive Hashing). Это значительно сократит время на сравнение векторов признаков.
6. Дополнительные шаги
- Классификация: Если вы хотите добавить шаг классификации, вы можете дообучить последние слои DNN на ваших данных, чтобы улучшить результаты по схожести.
- Пакетная обработка: Для обработки нескольких изображений одновременно, вы можете использовать мини-батчи, что позволит значительно ускорить извлечение признаков.
Заключение
Таким образом, вы можете использовать предобученные модели для извлечения признаков изображений и применить методы поиска по схожести для идентификации наиболее похожих изображений в вашей базе данных. Если у вас возникнут дополнительные вопросы или сложности, не стесняйтесь спрашивать! Удачи в вашей работе!