Image search
Last updated
Last updated
https://habr.com/ru/articles/703796/
Привет, Хабр!
Меня зовут Владимир Паймеров, я Data Scientist и являюсь участником профессионального сообщества NTA.
Играл ли ты в детстве в игру, в которой необходимо было найти отличия на изображениях? Сегодня рассмотрю похожую задачу, называемую поиском изображений, в которой нужно будет найти все похожие изображения из датасета на загруженную фотографию из того же датасета.
Модель поиска похожих изображений
Поиск похожих изображений - очень активная и быстро развивающаяся область исследований в последнее десятилетие. Исследования в данной области позволили разработать модели, которые могут помочь в работе в различных областях, например:
чтобы найти похожие изображения;
поиск фотографий-плагиатов;
создание возможностей для обратных ссылок;
знакомство с людьми, местами и продуктами;
поиск товаров по фотографии;
обнаружение поддельных аккаунтов, поиск преступников и т.д.
Наиболее известными системами являются Google Image Search и Pinterest Visual Pin Search. Познакомлю с созданием очень простой системы поиска похожих изображений с использованием специального типа нейронной сети, называемой автоэнкодер.
Изображения в данном способе не используют меток, т.е. дополнительных текстовых или числовых элементов, которые классифицируют изображения по категориям. Извлечение признаков из изображения будет происходить только с помощью их визуального содержимого (текстуры, формы, ...). Этот тип извлечения изображений называется поиск изображений на основе содержимого (CBIR), в отличие от поиска ключевых слов или изображений на основе текста.
CBIR при использовании глубокого обучения и поиска изображений можно назвать формой обучения без учителя:
При обучении автоэнкодера не используется никаких меток для классов
Автоэнкодер используется для преобразования изображения в векторное представление (т. е. нашего “вектора признаков” для данного изображения)
Затем, во время поиска похожих изображений, вычисляется расстояние между векторами преобразованных изображений — чем _меньше** расстояние, тем **более релевантными/визуально похожими_** являются два изображения.**
Расскажу информацию по следующим разделам:
Для построения модели нужны данные – изображения, с которыми будет проведена работа. В качестве данных был использован открытый набор изображений, который называется Caltech-101, который содержит около 9000 изображений, которые разделены на 101 тему (самолеты, машины, животные и т.д.).
Работа начинается с импорта необходимых библиотек и модулей из Keras и Tensorflow.
После импорта библиотек нужно загрузить сами изображения. Для этого нужно полностью прописать путь до папки, где хранятся изображения, и создать список из путей до каждого изображения.
Далее, при помощи написанной функции было загружено 200 изображений (для экономии времени и ресурсов компьютера, если характеристики компьютера позволяют, то можно загрузить все 9000). Для этого были выполнены следующие шаги:
Чтение изображений с помощью открытого модуля cv2;
Преобразование изображений из BGR (синий, зеленый, красный) в RGB (красный, зеленый, синий);
Изменение размера формы изображения на (224,224,3);
Нормализация данных.
В датасете почти ~ 9 тыс. изображений. Загрузка его в оперативную память и обработка каждого изображения с любым другим изображением потребует больших вычислительных затрат и может привести к сбою системы (GPU или TPU), или запуск модели будет очень дорогостоящим с вычислительной точки зрения.
Таким образом, в качестве решения можно интегрировать как сверточные нейронные сети, так и идеи автоэнкодирования для уменьшения информации из данных на основе изображений. Это будет рассматриваться как этап предварительной обработки для применения к кластеру.
Сверточные автоэнкодеры (CAEs) - это тип сверточных нейронных сетей. Основное различие между ними заключается в том, что CAE - это неконтролируемые модели обучения (без учителя).
Он пытается сохранить пространственную информацию входных данных изображения такой, какая она есть, и аккуратно извлекать информацию.
Энкодеры: преобразование входного изображения в представление скрытого пространства с помощью серии сверточных операций.
Декодеры: пытаются восстановить исходное изображение из скрытого пространства с помощью серии операций свертки с повышением дискретизации / транспонирования. Также известен как деконволюция.
Подробнее о сверточных автокодерах можно прочитать здесь.
Сам автоэнкодер строится при помощи соединения сверточных слоев и слоёв пуллинга, которые уменьшают размерность изображения (сворачивают его) и извлекают наиболее важные признаки. На выходе возвращаются encoder и decoder. Для задачи кодирования изображения в вектор, нам нужен слой после автоэнкодера, т.е. векторное представление изображения, которое в дальнейшем будет использоваться для поиска похожих изображений.
Применение функции summary() к модели покажет описание работы модели слой за слоем. Нужно следить за тем, чтобы размер изображения на входе соответствовал размеру изображения на выходе декодера.
Параметры и обучение модели:
В качестве оптимизатора модель использует ‘adamax’, в качестве функции потерь метрику mse. Автоэнкодер проходит 10 эпох (т.е. 10 раз) по данным для лучшего обучения.
Извлечение признаков из изображения, как было сказано выше, состоит из того, что после того как сработал энкодер и перед обратным декодированием, нужно взять слой из модели, который отвечает за кодирование изображения и сохранить его. Таким образом, сохраняться все кодированные представления изображения.
После получения представления сжатых данных всех изображений мы можем применить алгоритм N-ближайших соседей для поиска похожих изображений. Он основан на расчете евклидового расстояния между изображениями, те расстояния, которые будут меньше всего, будут означать, что изображения похожи.
Для отображения похожих изображений были написаны две функции, которые показывают 5 ближайших/похожих фотографий на ту, с которой идет сравнение.
Результаты работы автоэнкодеров можно оценить положительно, т.к. были найдены похожие фотографии:
(первое изображение то же самое, т.к. фотография сравнивает с изображениями из одного датасета)
Помимо использования автоэнкодеров для получения признаков из изображения можно использовать уже предобученные модели для классификации. Таких моделей очень много, и они также используют сверточные слои и слои пуллинга для получения признаков. Возникает логичный вопрос, зачем же тогда использовать автоэнкодеры?
Во-первых, предобученные модели могли быть созданы для других целей и могут не подойти по входным параметрам или по самой конструкции нейронной сети для вашей задачи, поэтому придется её перестраивать или строить сеть самому.
Во-вторых, предобученные модели на выходе могут получать не тот размер изображения, который нужен и при загрузке датасета и преобразовании изображений в вектор может не хватить памяти и мощности компьютера, а также это будет занимать много времени. Поэтому, если использовать предобчуенные модели, то нужно использовать метод понижения размерности PCA, который уменьшит размерность полученных векторов и позволит не нагружать компьютер. При этом автоэнкодеры сразу понижают размерность и можно его настроить таким образом, чтобы на выходе получался вектор необходимого размера.
Плюсами применения предобученных моделей является то, что нет необходимости строить нейронную сеть, настраивать сверточные слои, нужно просто взять нужный слой и использовать его для своих целей. Также такие модели были обучены на больших датасетах и имеют лучшие веса (настройки) для извлечения необходимых признаков, они лучше выделяют важные области на изображении.
Для того, чтобы использовать предобученные модели, для начала их нужно загрузить. В качестве примеры, была взята модель VGG16 – сверточная сеть, с 13-ю слоями, которая была обучена на миллионных датасетах.
Для загрузки изображений была написана специальная функция:
Модель VGG16 используется для классификации изображений, т.е. определение темы, к которой относится изображение (самолет, вертолет и т.д.), поэтому в конце она имеет слой для классификации. Все предыдущие слои сворачивают и кодируют изображение в вектор, поэтому они нужны. Данную модель можно полностью скопировать с удалением последнего слоя, таким образом получим модель, которая только кодирует изображение в вектор.
После того как модель построена, применяем её к данным, получаем вектор признаков каждого изображения, применяем метод понижения размерности PCA.
Следующий код показывает, как случайно выбирается картинка из датасета, сравнивается расстояние от этой картинки до всех изображений в датасете, данные расстояния сортируются по возрастанию расстояния и выбираются наиболее близкие/похожие.
Как можно заметить предобученные модели также хорошо справляются с поставленной задачей по поиску похожих изображений.
Таким образом был построен алгоритм для распознавания и поиска похожих изображений в наборе данных при помощи кодирования изображений в векторную форму. Данный алгоритм хорошо работает, но его всегда можно улучшить, например, путем добавления новых слоев или предварительной обработки изображений. В целом алгоритм можно представить следующими шагами:
Шаг 1: Берем имя файла или URL-адрес и преобразуем это изображение в нужную векторную форму.
Шаг 2: используя эту форму, извлекаем признаки важные признаки из изображения и преобразуем его в вектор при помощи автоэнкодера или предобученной модели.
Шаг 3: извлеченные признаки-вектора сравниваются с набором других векторов и находятся похожие изображения на основе расстояний: чем меньше расстояния, тем более похожи изображения.
Шаг 4: Отображение результатов.
http://www.vision.caltech.edu/datasets/ - ссылки на датасет
https://pgaleone.eu/neural-networks/2016/11/24/convolutional-autoencoders/ - о сверточных автоэнкодерах
https://habr.com/ru/post/348000/ - про построение сверточных нейронных сетей