Создание нейросети по распознаванию лиц на фотографиях из вконтакте

Результат

Теперь вы видите, что с точки зрения кода задача теперь стала весьма простой. Но это всё благодаря развитию нейросетей и добрым экспериментаторам, которые выкладывают предобученные модели в интернет, иначе вам пришлось бы это всё самим обучать очень долго и мучительно.

А что в результате получилось? С моим результатом вы можете ознакомиться на сайте kawaii-search, исходники которого доступны на github. Всё это крутиться на сервере google-cloud n1-standard-1 c 3.75GB RAM чего не хватает и пришлось добавить еще столько же swap. Так как задача предсказания не сильно сложная, то видеокарта не нужна.

А в каком смысле теперь определено “похоже”. В случае с fashion датасетом, похожими считаются изображения, на которых есть объекты одних классов. Например, фотографии с только с портфелями, только с обувью одного типа, портреты, прически, руки. Смотрите сами:

Портфели

Обувь

Колье, чокер

Что здесь интересного? Сеть сама решила что для нее похожее. Мы это не контролировали, оно получилось само. Мы потеряли некоторый контроль, но мы можем его вернуть, если сделаем обучения сами. И меня впечатляет то, что я не знаю как можно всё это сделать обычными алгоритмическими методами.

Кстати, на загруженных пользователем фотографиях поиск тоже работает

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

Похож = есть один и тот же предмет

Вариант 1: Компьютер или ноутбук

Проще всего осуществлять поиск человека по фото в Одноклассниках через браузер, открытый на компьютере или ноутбуке. В этом случае юзеру доступны популярные методы поиска совпадений на изображениях, с чем мы и предлагаем ознакомиться в следующих инструкциях.

Способ 1: Поиск по фото в Яндекс

Сперва рассмотрим отечественную поисковую систему, поскольку ее алгоритмы поиска по картинке сейчас на порядок лучше, чем у Google.

  1. Щелкните по кнопке выше и после загрузки страницы откройте форму загрузки изображения.

  2. Перетащите файл в выделенную область или нажмите «Выбрать файл» для его ручного открытия через «Проводник».

  3. Дождитесь загрузки и посмотрите на результат в выдаче. Если искомый человек — знаменитость или в сети присутствуют достоверные сведения о нем, под надписью «Кажется, на изображении» появится имя персоны, от которого вы и можете отталкиваться при дальнейшем поиске страницы в Одноклассниках.

  4. Если речь идет об актере или другой известной личности, у них не всегда есть страницы в Одноклассниках, но ведутся официальные группы, в которых и публикуются новости или какая-либо другая информация о персоне.

Способ 2: Поиск по фото в Google

Поисковик от Google имеет раздел с картинками, в котором можно использовать функцию «Поиск по картинке». Она находит совпадения и одинаковые изображения, сравнивая результаты с загруженным файлом. Иногда это помогает отыскать человека по фото в Одноклассниках, однако отметим, что алгоритмы Гугла в этом плане гораздо хуже, чем Яндекса, поэтому способ будет актуален только как дополнительный.

  1. Нажмите кнопку выше, чтобы оказаться на нужной странице поисковика. Щелкните по пиктограмме фотоаппарата для открытия соответствующей формы.

  2. В ней перейдите на вкладку «Загрузить изображение».

  3. Нажмите кнопку «Выберите файл».

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

  5. Ожидайте завершения загрузки файла, его обработки и выдачи результатов.

  6. На экране появится информация с совпадениями и предположением, кто именно может быть на фотографии.

  7. Если среди результатов не появилась ссылка на страницу в Одноклассниках, но у вас есть полное имя юзера, используйте его, чтобы через поисковик отыскать профиль.

  8. К тому же при просмотре картинок вы можете перейти к похожим результатам, чтобы найти ссылку на профиль в социальной сети. Особенно это актуально, если пользователь загружает много личных снимков.

Способ 3: Search4Faces

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

Откройте главную страницу сайта и выберите базу данных «Аватарки ВКонтакте и Одноклассников», нажав кнопку «Перейти».

Щелкните по «Загрузить» для отправки изображения.

Перетащите его в выделенную область или откройте как файл через «Проводник».

Отредактируйте ориентацию, яркость и контраст, если в этом есть смысл.

Дополнительно укажите любую известную информацию о человеке, чтобы сделать поиск более точным, после чего щелкните по «Найти».

Прокрутите страницу до блока «Совпадения» и найдите в выдаче страницы из Одноклассников. Нажимайте по фотографиям, чтобы переходить на страницы юзеров и смотреть их содержимое более детально

Обращайте внимание, что на каждой фото слева вверху помечена соцсеть, к которой принадлежит результат. В вашем случае следует открывать только результаты с пометкой «ok00».

Есть и похожие на этот сайты, поэтому используйте любой из них. Но будьте бдительны: никогда не вводите на таких веб-ресурсах логин и пароль от своей страницы в Одноклассниках, поскольку эти данные для поиска не требуются, а если ее запрашивают, значит, сайт может оказаться мошенническим и вы рискуете лишиться своего профиля.

Сервисы для поиска фотографий

  • New Old Stock Photos — абсолютно бесплатные и не требующие копирайтов и от этого ещё более потрясающие винтажные фотографии из публичных архивов.
  • Gratiso Photography — бесплатная коллекция стоковых изображений. Новые фотографии добавляются каждую неделю.
  • Refe Photos — если высокое разрешение для вас не принципиально, то этот сервис поможет вам найти лучшие фотографии, сделанные на мобильный телефон. Все бесплатно для любых целей использования, можно оформить подписку на обновления.
  • Wellcome Images — огромная коллекция фотографий с удобным поиском.
  • Pixabay — бесплатный сервис по поиску фотографий, поддерживает русский язык.
  • Picjumbo — абсолютно бесплатные фотографии для любых целей использования. Множество категорий, ежедневное обновление.

Как найти оригинал заданного изображения

Например, у Вас есть какая-то фотография, возможно кадрированная, пожатая, либо отфотошопленная, а Вы хотите найти её оригинал, или вариант в лучшем качестве. Как это сделать? Проводите поиск в Яндекс и Гугл, как описано выше, либо средствами PhotoTracker Lite и получаете список всех найденных изображений. Далее руководствуетесь следующим:

  1. Оригинальное изображение, как правило имеет больший размер и лучшее качество по сравнению с измененной копией, полученной в результате кадрирования. Конечно можно в фотошопе выставить картинке любой размер, но при его увеличении относительно оригинала, всегда будут наблюдаться артефакты. Их можно легко заметить даже при беглом визуальном осмотре.
  2. Оригинальные фотографии часто имеют водяные знаки, обозначающие авторство снимка (фамилия, адрес сайта, название компании и пр.). Конечно водяной знак может добавить кто угодно на абсолютно на любое изображение, но в этом случае можно поискать образец фото на сайте или по фамилии автора, наверняка он где-то выкладывает своё портфолио онлайн.
  3. И наконец, совсем простой признак. Если Ваш образец фото черно-белый (сепия и пр.), а Вы нашли такую же, но полноцветную фотографию, то у Вас явно не оригинал. Добавить цветность ч/б фотографии гораздо более сложнее, чем перевести цветную фотографию в черно-белую 🙂

Классификация изображений

На качественно ином уровне задачу классификации изображений начали решать с 2013 года. Тогда на наборе данных ImageNet пробили барьер в 15% ошибок классификации тысячи видов объектов. С тех пор за 5 лет было спроектировано и натренированно очень много разных моделей нейросетей, и был пробит барьер в 5% ошибок. Самыми успешными из них считаются: VGG16, ResNet50, Inception, GoogLeNet и много других. Большинство их них построено на основе свёрточных нейросетей.

На рисунке вы можете посмотреть как выглядит схематически архитектура VGG16.

VGG16

Слои нейросети на изображении состоят из набора разных фильтров-сверток. Каждый из фильтров отвечает за поиск определенного шаблона, и когда он находит некоторый участок изображения, в котором есть этот узор, то фильтр посылает сигнал в следующий слой. В свою очередь сигналы предыдущего слоя составляют новое изображение для следующего слоя. На рисунке архитектуры VGG16 вы можете видеть, что сначала было цветное RGB изображение размера 224×224 пикселей с 3 каналами(red, green, blue). Потом после прохода первого слоя сверток у нас получилось изображение размера 224×224 пикселей с 64 каналами. Эти каналы уже представляют не цвета, а результаты работы каждого из 64 фильтров-свёрток. И так далее, до изображения 7×7 пикселей с 512 каналами.

Свёртка ищет бублик: https://www.youtube.com/watch?v=p_7GWRup-nQ

Строя каскады свёрточных слоёв и обучая модель, вы получаете слои, содержащие в себе абстракции изображений. Первые слои в себе могут содержать мелкие детали: линии. Далее идут комбинации деталей — фигуры. Следующие слои уже могут содержать формы, а в конце целые объекты.

Feature Visualization of Convnet trained on ImageNet from

Обратите внимание еще на одну интересную особенность свёрточных слоев в этой модели: каждый следующий слой “толще”, так как в нём больше фильтров, но “меньше”, так как изображение специально уменьшают с помощью операции MaxPooling (субдискретизация). Используют этот прием по следующей причине: важнее факт детекции некоторого признака-объекта, чем знание точного расположения этого объекта на изображении

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

Max Pool 2×2, http://cs231n.github.io/convolutional-networks/

Ближе к выходу модели у нас имеется маленькое изображение — карта признаков размера 7×7 пикселей с 512 фильтрами. По этой трёхмерной карте всё еще невозможно сделать предсказания классов объектов на изображении — котик или собака. Для того чтобы перейти уже к предсказаниям классов, эту карту укладывают на плоскости с помощью операции Flatten и соединяют с полносвязным скрытым слоем из 4096 нейронов. А дальше классическая схема: еще один скрытый слой с 4096 нейронами и выходной слой с 1000 нейронами, каждый из которых выдает вероятность принадлежности к одному из 1000 классов в задаче ImageNet.

Поиск похожего методом kNN

Далее нам нужно реализовать поиск ближайших векторов к целевому вектору с помощью косинусной метрики. В мире маш.обуча. не принято писать такие низкоуровневые задачи, поэтому мы переиспользуем код для алгоритма обучения без учителя — ближайшие соседи. В библиотеке sklearn есть специальный класс NearestNeighbors, которому можно указать метрику по которой он будет искать ближайших соседей к целевому объекту. Подготовка этого компонента будет выглядеть следующим образом:

from sklearn.neighbors import NearestNeighborsknn = NearestNeighbors(metric='cosine', algorithm='brute')vecs = load_images_vectors() #  а это мы уже сделали!knn.fit(vecs)

Мы выбрали метрику и активировали полный перебор, загрузили все вектора в методом . Обычно этот метод запускает обучение, но в данном случае он просто сохранит все вектора внутри объекта , так как это алгоритм обучения без учителя.

Чтобы получить ближайших соседей, то есть похожие изображения, пишем следующе:

filenames = load_images_filenames()vec = load_target_image()dist, indices = knn.kneighbors(vec, n_neighbors=10)similar_images = ], dist) for i in range(len(indices))]

В у нас будет лежать массив из 10 пар: имя файла и значение похожести по метрике, которая чем меньше, тем более похожее изображение к целевому. Всё, теперь этот список можно отдавать на фронтенд и рисовать красивую галерею. Изменяя параметр можно менять количество возвращаемых соседей, которые упорядочены по увеличению метрики, то есть дальше будут более непохожие картинки.

Тонкий момент. Функция возвращает список файлов ровно в том же порядке, в котором они перечислены в массиве , так как нам нужно точное соответствие вектора картинке.

Поиск на Aliexpress с компьютера

Поиск по фото с компьютера делится на 2 вида: с помощью поисковых систем и с помощью различных расширений для браузера. Рассмотрим каждый вариант детальнее.

Через Яндекс

Чтобы найти нужную картинку через поисковую систему Яндекс, нужно сделать следующее:

  1. Идем на yandex.ru/images
  2. У нас есть 3 варианта дальнейших действий: drag-n-drop, загрузить картинку, указать на нее ссылку.
  3. Drag—n—drop: берем картинку с какого-либо сайта, наводим на нее курсор мыши, зажимаем левую кнопку мыши, перетаскиваем картинку на вкладку, на которой открыты Яндекс.Картинки. Вверху появится поле «Перетащите картинку сюда» – тащим туда картинку, отпускаем левую кнопку мыши.
  4. Появится выдача – разные размеры, похожие картинки, сайты, на которых встречается это изображение.
  5. Загрузка изображения: на вкладке Яндекс.Картинок жмем на отдельную кнопку поиска.
  6. В открывшемся меню жмем на «Выберите файл», выбираем фото или сохраненную картинку. Получаем результат поиска.
  7. Поиск по интернету с помощью адреса картинки: жмем на изображение правой кнопкой мыши, в контекстном меню выбираем «Копировать URL».
  8. Как и в предыдущем случае, жмем на круглую кнопку поиска на вкладке с изображениями Яндекса.
  9. Нажимаем левой кнопкой мыши на поле справа, жмем «Ctrl + V». Нажимаем на кнопку поиска.
  10. Получаем результат.

У поиска через Яндекс есть один существенный недостаток – нельзя искать по картинке конкретно внутри Алиэкспресса, вы получите все похожие изображения в интернете. Помочь с этой проблемой может Гугл.

Через Google

У поиска Google есть специальные «вшитые» команды, с помощью которых поиск можно сделать более детальным – этим мы и воспользуемся. Итак, что мы делаем:

Через расширение

Поиск через поисковые системы – надежный, но не самый удобный способ. Если вам нужно один раз найти товар по изображению – поисковые системы сгодятся, но если вы постоянно что-то ищете, манипуляции с изображениями-вкладками станут утомительными. Чтобы облегчить вам жизнь, различные разработчики создали расширения, которые помогают в 1-2 клика найти нужный товар на Алиэкспрессе. Как этим способом воспользоваться (на примере Google Chrome, для остальных браузеров действия аналогичны):

  1. Пишем в поисковике «Поиск товара на Алиэкспресс по фото плагин».
  2. Первая же ссылка ведет на заветное расширение.
  3. Жмем «Установить», устанавливаем.
  4. Жмем правой кнопкой мыши на любой картинке. В появившемся контекстном меню теперь есть новая опция – «Найти товар на Али по этой картинке». Выбираем эту опцию.
  5. Получаем поисковую выдачу.

Другие способы

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

  • AliRadar. Позволяет не только находить похожие товары, но и показывает историю цен на конкретное предложение за большой срок, собирает все данные о надежности продавца (длительность работы, частоту задержек доставки, отзывы и так далее), показывает подробные обзоры с фото и видео на это предложение, а также позволяет получать уведомления, если цена на какое-либо предложение резко опустится. Работает с Google Chrome и
  • AliUp. Дает детальную статистику по рейтингу продавца (как долго находится на площадке, насколько довольны покупатели, насколько реальный товар соответствует описанию, как быстро продавец отвечает в спорных ситуациях), показывает историю цены и позволяет за ней следить, позволяет добавлять товары в избранное, ищет похожие вещи и показывает на них цены. Работает с Google Chrome.
  • Aliexpress: поиск похожих товаров. У плагина мало функционала, он с большего ориентирован именно на нахождение совпадений, но есть одна приятная деталь – кнопка для поиска аналогичных вещей расположена прямо на странице товара, не нужно каждый раз открывать плагин.

На этом список доступных плагинов далеко не заканчивается. Есть одна проблема, о которой вам следует знать – по некоторым сведениям, плагины для анализа цены иногда подменяют ваши куки-файлы в браузере, забирая себе таким образом ваш кэшбэк. Поэтому будьте предельно аккуратны – если понадобилось что-то отыскать, то включите расширение -> найдите нужное -> выключите расширение -> оформляйте покупку.

Собираем модель как конструктор

Отлично, мы знаем теорию, знаем как получить представление нейросети об изображениях, знаем как сравнивать эти представления. Осталось дело за малым — собрать всё воедино.

Я предлагаю построить веб-приложение, похожее на Google Image Search. Для его построения нам понадобятся следующие библиотеки для Python3:

  • Keras и Tensorflow для работы с нейросетями;
  • Numpy (a.k.a np) для математических функций;
  • Sklearn для алгоритма ближайших соседей и косинусной метрики;
  • Flask для веба;
  • Pandas, pillow, scipy, h5py для разных вспомогательных нужд.

Ещё нужно откуда-то взять много изображений на одну тематику. Я скачал все фотографии из блога tokio-fashion (около 50 тысяч фото), надеясь что нейросеть будет находить похожие образы или позы или еще что-нибудь. Кстати анализ fashion-индустрии это отдельная интересная область исследований!

Опишем базовые use-cases, которые мы хотим реализовать:

  • пользователь заходит на страницу;
  • пользователь жмёт кнопку “мне повезет”, тем самым выбирая случайную картинку из всего набора данных;
  • сервер ищет методом ближайших соседей K самых близких вектора к случайно выбранному, эти K векторов будут описывать самые похожие картинки;
  • пользователь видит на странице исходную картинку и 9 похожих с метрикой похожести в подписи.

Как делать веб часть и так все знают, поэтому рассмотрим наиболее неясные шаги.

Поиск похожих изображений с помощью нейросети

Как мы поняли из предыдущего параграфа, срезанная нейросеть производит по своей сути извлечение признаков из изображения и переводит изображение в осмысленный вектор. Получение такого вектора раньше требовало экспертной оценки и придумывания очередного алгоритма хеширований. Полученные теми методами вектора (64-битные хешсуммы) заключали в себе информацию, в лучшем случае, о контурах и простых формах в целом. Нейросеть же даёт как минимум 4096-мерное представление, в котором заключена и форма, и цвет, и целые объекты.

Хорошо, нами получен вектор признаков изображения, что мы делаем дальше? Считать расстояние Хэмминга, как мы это делали с хешами, тут бессмысленно. Здесь мы должны использовать другой подход. Представьте, каждый из векторов куда-то направлен в пространстве, это направление характеризует изображение. Если мы посчитаем вектора для множества картинок, то логично предположить, что похожие картинки будут иметь вектора характеристик расположенные в пространстве близко. Отличной метрикой близости векторов в многомерном пространстве служит , хорошо себя зарекомендовавшая в задачах классификации текстов.

Косинусная метрика

Чем меньше метрика, тем ближе объекты в векторном пространстве, тем больше похожи изображения по “мнению” нейросети.

Сервисы для поиска изображений

  • 500px — популярный ресурс среди фотографов и дизайнеров. Позволяет использовать материалы сайта на основе Creative Commons 3.0.
  • Flickr — множество изображений, доступных для бесплатного использования на условиях Creative Commons 3.0.
  • Tumblr — популярный блог, в котором каждый день можно найти только что созданные фотографии. Разрешает публиковать материалы на других ресурсах на основе Creative Commons 3.0.
  • Comp Fight — самый быстрый способ найти нужные изображения для вашего блога или сайта.
  • Wikimedia Commons — хранилище медиафайлов (не только фото, но и аудио- и видеороликов). Страницы проекта точно свободно доступны для редактирования, как и на Википедии. Любой пользователь может свободно копировать, использовать и изменять любые находящиеся здесь файлы при условии упоминания источника и авторов.
  • Dotspin — красивый и удобный сервис с удобным поиском. Есть шаринг с социальными сетями, можно заливать свои собственные фото.

Собираем модель как конструктор

Отлично, мы знаем теорию, знаем как получить представление нейросети об изображениях, знаем как сравнивать эти представления. Осталось дело за малым — собрать всё воедино.

Я предлагаю построить веб-приложение, похожее на Google Image Search. Для его построения нам понадобятся следующие библиотеки для Python3:

  • Keras и Tensorflow для работы с нейросетями;
  • Numpy (a.k.a np) для математических функций;
  • Sklearn для алгоритма ближайших соседей и косинусной метрики;
  • Flask для веба;
  • Pandas, pillow, scipy, h5py для разных вспомогательных нужд.

Ещё нужно откуда-то взять много изображений на одну тематику. Я скачал все фотографии из блога tokio-fashion (около 50 тысяч фото), надеясь что нейросеть будет находить похожие образы или позы или еще что-нибудь. Кстати анализ fashion-индустрии это отдельная интересная область исследований!

Опишем базовые use-cases, которые мы хотим реализовать:

  • пользователь заходит на страницу;
  • пользователь жмёт кнопку “мне повезет”, тем самым выбирая случайную картинку из всего набора данных;
  • сервер ищет методом ближайших соседей K самых близких вектора к случайно выбранному, эти K векторов будут описывать самые похожие картинки;
  • пользователь видит на странице исходную картинку и 9 похожих с метрикой похожести в подписи.

Как делать веб часть и так все знают, поэтому рассмотрим наиболее неясные шаги.

Векторизация базы фотографий

Как мы уже знаем, для векторизации нам нужно отрезать один из последних слоев предобученной нейросети. Это операция распространенная, поэтому в библиотеке Keras нам уже доступны из коробки, во-первых, сама и, во-вторых, возможность не включать последний слой. Это делается следующим образом:

from keras.applications import VGG19model = VGG19(weights='imagenet', include_top=False)

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

from keras.applications import VGG19from keras.engine import Modelbm = VGG19(weights='imagenet')model = (inputs=bm.input, outputs=bm.get_layer('fc1').output)

После того как у вас загружена модель, она, кстати, будет реально загружать из интернета веса, можно конвертировать все изображения в вектора с помощью метода , что логично, так как мы “предсказываем” этот вектор.

from keras.preprocessing import imagefrom keras.applications.vgg19 import preprocess_inputimg = image.load_img(path, target_size=(224, 224)) # чтение из файлаx = image.(img)  # сырое изображения в векторx = np.expand_dims(x, axis=0)  # превращаем в вектор-строку (2-dims)x = (x) #  библиотечная подготовка изображенияvec = model.predict(x).ravel()# ... PROFIT!

Теперь всё тайное стало явью, и осталось дело техники — итерироваться по всем изображениям и для каждого из него произвести векторизацию

Потом сохранить эти вектора в БД или csv файла, не важно. Это мы оставим за кулисами

Fine Tuning и переиспользование модели

Как оказалось, сети обученные на данных ImageNet можно переиспользовать для других задач компьютерного зрения. Например, у нас задача отличать кошку от собаки. Вам не надо создавать свою модель CatDogVGG, искать миллионы картинок и обучать с нуля сеть. Всё куда проще! Вы берёте предобученную модель VGG, срезаете последние полносвязные слои нейронов, отвечающие за финальную классификацию(да, так можно), оставляя только внутренние 4096 нейронов, которые соединяете со своими 2 нейрона для выхода кошка-собака. Получается, что вам нужно будет только дообучить модель этим 2*4096 связям, что делается легко и быстро.

Какой физический смысл в срезании последнего слоя сети и подстановки нового? Оказывается, что все слои свертки внутри себя заключают способность “понимать” изображение. А поскольку обучение происходило на тысяче разных классов, то и обобщающая способность этих слоев достаточно сильная. В итоге внешние 4096 нейронов на самом деле выдают вектор характеристик(признаков) любого изображения в целом. Поэтому для того чтобы проходила наша классификация, отличная от изначальной, нам остается дообучить нейросеть только и только переводить этот 4096-мерный вектор в наш вектор предсказаний принадлежности классов, не меняя существующую глубокую свёрточную сеть.

Подобный финт можно провернуть не только с VGG, но и с другими свёрточными архитектурами распознавания изображений. Для этой цели в библиотеке Keras есть даже специальные конструкты, которые вы можете изучить это в разделе keras-applications. Распознавание образов еще никогда не было таким простым!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector