написать впереди
Недавно я тестировал SPTAG, инструмент поиска ближайшего соседа.Я планировал использовать что-то, чтобы проверить и потренировать свои руки, поэтому я подумал о создании индекса предыдущих изображений красоты, чтобы посмотреть, смогу ли я найти нужные изображения красоты.
Необходимая среда выглядит следующим образом:
- python3.7
- СПТАГ (версия Docker)
- MongoDB
См. код:GitHub.com/yourado/MM FI…
Подготовьте картинку
Первый - это подготовить фотографии красивых женщин.Вот несколько фотографий, которые я облазил давным-давно, всего около 10 000 фотографий.
Если нет, вот ссылка для скачивания с Google Диска:/1 из drive.Google.com/file/ — это Z…. Распаковать пароль: nladuo.
фильтр изображений
Затем следующим шагом является предварительная обработка изображения.В основном я собираюсь сделать здесь не весь поиск изображения, а поиск всего изображения будет более хлопотным. Я только здесь ищу лица.
здесь черезface_recognition
Эта библиотека сохраняет изображение только с одним лицом, извлекает лицо и помещает его в mongodb.
cd MMFinder/data_preprocess
python3 filter_images.py
отфильтровать здесь9477
фотографий
разработка функций
Следующим шагом является преобразование изображения в вектор, что представляет собой разработку признаков. Поскольку я не делаю изображения сам, поэтому я не очень хорошо знаю конкретный метод.Я, вероятно, проверил его.Традиционные методы:SIFT
, теперь есть神经网络
.
Если это обычное изображение, просто используйте ImageNet, обученный извлекать вектор последнего слоя в качестве функции. Здесь я нашел предварительно обученную модель, посвященную распознаванию лиц:Цвет FI Start.com/2018/08/06/…, точность должна быть выше.
Модель — VGG, а последний слой — вектор размерности 2622. В процессе обработки все грани преобразуются в вектор длиной 2622, а затем сохраняются в mongodb.
cd MMFinder/data_preprocess
python3 feature_extraction.py
показатель
Следующим шагом является установление индекса ближайшего соседа, также называемого плотным индексом.В системах текстового поиска мы обычно используем TF-IDF, который относится к разреженному индексу, который является инвертированным индексом. Плотный индекс обычно является индексом структуры графа.
Зачем создавать индекс?
На самом деле, это для ускорения поиска.Если мы ищем изображение в обычных условиях, нам действительно нужно вычислить сходство с 9477 векторами в базе данных, чтобы получить точный рейтинг сходства. Временная сложность этого O (N), что не кажется высоким, но каждый поиск - O (N).Предполагая, что есть 100 миллионов изображений, я не знаю, какой год ждать.
С помощью индекса вы можете гарантировать, что результаты поиска возвращаются в фиксированное время O(C), если он все еще медленный, просто добавьте машину.
Установка системы индексации
Что касается выбора индекса, здесь я использую SPTAG, потому что это эффективная и масштабируемая система поиска ближайшего соседа. Похожая система у фэйсбука faiss. Шаги установки можно найти в моей предыдущей статье:Установка и тестирование СПДАГ под Docker
Это на самом деле довольно проблематично для установки.Если вы хотите запустить и поиграть, вы также можете посмотреть KDTree, LSH и другие методы приблизительного поиска ближайшего соседа в scikit-learn.
показатель
После установки SPTAG в Docker экспортируйте все данные изображения во входной формат, указанный SPTAG.
cd MMFinder/index_construction
python3 export_SPTAG_indexbuilder_input.py
docker cp mm_index_input.txt (你的容器ID):/app/Release/
Затем поместите экспортированные данные в контейнер SPTAG-Docker, черезindexbuilder
Создайте индекс.
docker attach (你的容器ID)
./indexbuilder -d 2622 -v Float -i ./mm_index_input.txt -o data/mm_index -a BKT -t 2
После того, как индекс установлен, запустите службу поиска rpc.
python3 SPTAG_rpc_search_service.py
тест запроса
Далее вы можете ввести тест запроса, если вы пользователь Mac, вы можете установить егоimgcat
инструмент для просмотра изображений из командной строки.
python3 search_test.py
Эффект следующий, он все еще чувствует себя хорошо
Демонстрационный дисплей внешнего интерфейса
Наконец, интегрируйте каждый модуль, напишите загрузку, интерфейс поиска и сформируйте полное демо-приложение.
cd web_demo
python3 main.py
Эффект следующий:
(Картинки красоты легко блокируются, вот еще одна подборка картинок в качестве альтернативы)