Используйте глубокое обучение, чтобы научить вас, как реализовать «поиск изображения по изображению».

Keras

Исходный код в этой статье можно получить, ответив на «Поиск изображений» в фоновом режиме общедоступной учетной записи WeChat «01 Binary».

предисловие

в предыдущей статье«Серия поиска изображений — использование Python для обнаружения сходства изображений»В статье мы вводим алгоритм, который очень часто используется в области поиска изображений.Алгоритм перцептивного хеширования. Это очень простой и быстрый алгоритм, принцип которого заключается в том, чтобы генерировать определенный «отпечаток пальца» для каждой картинки, а затем измерять сходство, чтобы получить сходство двух картинок.

Однако с появлением глубокого обучения развитие поля изображений значительно продвинулось.С точки зрения извлечения признаков нейронные сети в настоящее время имеют незаменимые преимущества. В предыдущей статье мы также представили, что поиск изображений часто основан на сравнении признаков изображений, чтобы увидеть, насколько хорошо совпадают признаки, чтобы получить изображения с высоким сходством. И определяя особенности изображения, VGG16 имеет уникальные преимущества.

Далее в этой статье будет реализован гаджет для извлечения изображений на основе глубокого обучения на простом примере.

Готов к работе

Как обычно, давайте подготовим инструменты, которые нам понадобятся на этот раз:

  • IDE: Пичарм
  • Питон: 3.7
  • Пакеты: Keras + TensorFlow + Pillow + Numpy

keras

Keras — это высокоуровневый API нейронной сети, Keras написан на чистом Python и основан наTensorflow,Theanoа такжеCNTKзадняя часть. Проще говоря, keras — это еще одна инкапсуляция TF и ​​других фреймворков, делающая его более удобным в использовании.

Извлечение функций изображения на основе сети vgg16Мы все знаем, что сеть vgg имеет широкий спектр приложений в области изображений. Многие последующие модели с более глубокими слоями и более широкими сетями основаны на этом расширении. Сеть vgg может хорошо извлекать полезные функции изображения. Эта реализация на основе Keras Для достижения извлечения последний слой сверточных функций.

идеи

Основная идея основана на статье CVPR2015.«Глубокое изучение двоичных хэш-кодов для быстрого поиска изображений»Реализована контентная система поиска изображений по массивным данным. Проще говоря, он извлекает признаки (обычно в виде векторов признаков) из каждого изображения в базе данных изображений, сохраняет их в базе данных, извлекает тот же вектор признаков для извлекаемого изображения, а затем вычисляет расстояние между вектором и вектор в базе данных (аналогичный расчет степени), узнать некоторые из ближайших векторов признаков, а соответствующие картинки являются результатами поиска. Как показано ниже:

Пользовательский запрос и часть предварительной обработки — это, в основном, то, что должен делать веб-сервер, и мы не будем здесь обсуждаться.Затем мы в основном реализуем часть маркировки красной линией.

Практичный

Извлечь функции изображения

Керас в своемкитайский документДемонстрация использования VGG16 для извлечения функций приведена в

from keras.applications.vgg16 import VGG16
from keras.preprocessing import image
from keras.applications.vgg16 import preprocess_input
import numpy as np

model = VGG16(weights='imagenet', include_top=False)

img_path = 'elephant.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

features = model.predict(x)

Здесь нам нужно внести в него простую модификацию и инкапсулировать в класс для последующего вызова. Как показано ниже:

Учитывая длину, многие комментарии были удалены из изображений кода в статье.Если вы хотите узнать подробную информацию о комментариях, вы можете ответить на «Поиск изображений» в фоновом режиме общедоступной учетной записи WeChat «01 Binary», чтобы получить исходный код. То же ниже

Сохраните функцию и соответствующее имя файла как файл h5.

что такое файл h5

Файл h5 представляет собой версию пятого поколения формата иерархических данных (HDF5), которая используется для хранения и организации крупномасштабных данных.

H5 упрощает файловую структуру до двух основных типов объектов:

  1. Набор данных — это многомерный массив однотипных данных.

  2. Групповая группа представляет собой контейнерную структуру, которая может содержать наборы данных и другие группы.Если в файле хранятся наборы данных разных типов, для управления этими наборами данных используется группа

Для интуитивного понимания вы можете обратиться к нашей файловой системе.Разные файлы хранятся в разных каталогах:

Каталог — это группа в файле hdf5, которая описывает классификационную информацию набора данных DataSet, а также эффективно управляет и разделяет различные наборы данных в группе. Файл представляет собой набор данных в файле hdf5 с указанием конкретных данных.

На следующем рисунке показана связь между наборами данных и группами:

В Python мы обычно используем библиотеку h5py для работы с файлами .h5, а специальные методы чтения и записи предоставляются Baidu, которые здесь не демонстрируются.

Извлеките функции изображения из набора данных и сохраните их в файлы h5.

Мы называем папку базы данных как набор данных в корневом каталоге проекта, а затем пишем метод для получения изображений в папке:

def get_imlist(path):
    return [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.jpg')]

Затем мы можем читать данные один за другим, а затем извлекать их функции один за другим и сохранять их в файл. Как показано ниже:

На этом мы завершили обучение модели.

Выберите тестовое изображение, чтобы проверить эффект поиска

После вышеописанных операций мы сохранили признаки всех изображений в наборе данных в модель, а остальное — извлечь признаки тестируемых изображений, а затем сравнить сходство (косинусное сходство) между векторами с функции в наборе функций одну за другой. , а затем вернуть его пользователю в порядке сходства.

Советы: вы можете обратиться к представлению Python о различных сходствах.Python Numpy вычисляет различные расстояния

Взяв некий пакет в качестве тестового образа, результаты вывода следующие:

В PyCharm вы можете легко просмотреть изображения, созданные matplotlib.Первое изображение — тестовое изображение, а последние три изображения — поисковые изображения.Видно, что эффект довольно хороший.

Советы: Если вы хотите использовать Resnet или Densenet для извлечения функций, вам нужно только внести соответствующие изменения в приведенный выше код, удалить комментарии и изменить часть кода. Подробности смотрите в исходном коде.

Наконец

Пока что мы реализовали небольшой инструмент для извлечения изображений с помощью глубокого обучения. Как совместить его с веб/приложением, выходит за рамки этой статьи. Если вам интересно, вы можете скачать исходный код этой статьи и изменить его самостоятельно. , или отсканируйте QR-код ниже. Подпишитесь на общедоступную учетную запись WeChat «01 Binary», чтобы связаться со мной.

Ссылаться на

  1. Глубокое обучение и компьютерное зрение (11)_Быстрая система поиска изображений на основе глубокого обучения
  2. Система массового поиска изображений на базе VGG-16 (модернизированная версия поиска по изображению)
  3. Реализация функции поиска изображений на основе глубокого обучения
  4. Реализация Python различных вычислений подобия
  5. Применение
  6. Python Numpy вычисляет различные расстояния
  7. знакомство с файлом h5