ML-подходы по поиску похожих изображений |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2023-04-06 12:31 Привет, Хабр! Меня зовут Паймеров Владимир, я Data Scientist и участник профессионального сообщества NTA. Компьютерное зрение (computer vision, CV) — активно развивающаяся научная область, Навигация по материалу
Введение Ежедневно посетители интернета оставляют на разных сайтах и в социальных сетях свои персональные данные: e?mail, имя, телефон, возраст, фотографии. Закон 152-ФЗ запрещает собирать, хранить и обрабатывать персональные данные человека без его согласия. Но владельцы некоторых сайтов, которые с полным основанием можно назвать мошенническими, игнорируют этот закон и не задумываются об ответственности. В банковской сфере паспорта используются для идентификации клиентов. Мошенники могут подделывать паспорта, использовать старые недействительные паспорта для получения кредита, и проведения других операций, которые означают потерю прибыли для компании и потерю уважения клиентов, так как мошенниками могут быть затронуты их денежные средства. При этом мошенники используют паспорт с лицом одного и того же человека, меняя незначительные детали (цвет волос, форма ушей, добавление усов). Таким образом, возникла потребность в проверке паспортов, чтобы выявить: на фото в паспорте один и тот же человек или это разные люди и паспорт был подделан, для того чтобы вычислить мошенников и уберечь денежные средства клиентов. В данном посте будет рассмотрена задача, называемая поиском похожих изображений, в которой нужно будет найти все похожие изображения из датасета на загруженную фотографию из того же датасета. Модель поиска похожих изображений Поиск похожих изображений — активная и быстро развивающаяся область исследований в последнее десятилетие. Исследования в данной области позволили разработать модели, которые могут помочь в работе в различных областях, например:
Наиболее известными системами являются Google Image Search и Pinterest Visual Pin Search. Мы познакомимся с легкими и популярными подходами поиска похожих изображений, а именно:
Изображения в данных подходах не используют меток, т. е. дополнительных текстовых или числовых элементов, которые классифицируют изображения по категориям. Извлечение признаков из изображения будет происходить только с помощью их визуального содержимого (текстуры, формы, и т. д.). Этот тип извлечения изображений называется поиск изображений на основе содержимого (CBIR), в отличие от поиска ключевых слов или изображений на основе текста. CBIR при использовании глубокого обучения и поиска изображений можно назвать формой обучения без учителя:
Загрузка, обработка и работа с данными Для построения модели нужны данные — изображения, с которыми будет проведена работа. В целях безопасности будем использовать изображения известных личностей вместо фотографий реальных людей из паспортов. Качество входных данных проверялось вручную и при помощи инструмента ABBYY FineReader PDF15. Работа проводилась на виртуальном окружении RAPIDS.AI CUDA 11.0.3 (cuDNN 8.0.5) TensorFlow, PyTorch Geometric с использованием графического процессора A100, ОП в 4 Гб, с 2 ядрами процессора. Перед началом работы необходимо провести импорт библиотек и модулей из Keras и Tensorflow. Развернуть код После импорта библиотек загружаем сами изображения. Для этого нужно полностью прописать путь до папки, где хранятся изображения, и создать список из путей до каждого изображения. Для того, чтобы получить изображение лица с фотографии в паспорте, pdf?сканы необходимо перевести в формат изображения, для этого была написана следующая функция: Далее получаем путь до всех обработанных изображений из pdf?сканов и применяем функцию «face_recog_pdf» для того, чтобы вырезать область где находится лицо на фотографии. Сохраняем результат в отдельную папку. При помощи функций extract_images_from_pdf() и face_recog_pdf(), (с использованием библиотеки OpenCV) из 20 000 pdf?сканов паспортов было обнаружено около 10 000 паспортов с фотографиями (в сканах присутствовали изображения без фото). После обработки pdf?сканов, приводим все полученные изображения к одному формату и преобразовываем в вектора (этот метод применяется для подхода с использованием сверточных автоэнкодеров), для этого используем функцию: В результате, после выполнения функций мы получили изображения вырезанных из паспортов лиц. Следующий этап — преобразование их в вектора (для подхода с использованием сверточных автоэнкодеров функция указана выше — image2array), в последствии вектора будем использовать для сравнения и получения наборов похожих изображений. В следующих разделах рассмотрим основные подходы для решения поставленной задачи по поиску похожих изображений. Свёрточные автоэнкодеры для извлечения признаков из изображения Сверточные автоэнкодеры (CAEs) — это тип сверточных нейронных сетей. Автоэнкодер состоит из:
Подробнее о сверточных автокодерах можно прочитать здесь. Сам автоэнкодер строится при помощи соединения сверточных слоев и слоев пуллинга, которые уменьшают размерность изображения (сворачивают его) и извлекают наиболее важные признаки. На выходе возвращаются encoder и decoder. Для задачи кодирования изображения в вектор, нам нужен слой после автоэнкодера, т.е. векторное представление изображения, которое в дальнейшем будет использоваться для поиска похожих изображений. Применение функции summary() к модели покажет описание работы модели слой за слоем. Нужно следить за тем, чтобы размер изображения на входе соответствовал размеру изображения на выходе декодера. Развернуть код Параметры и обучение модели: В качестве оптимизатора модель использует «adamax» (русско?язычная документация; англо?язычная документация), в качестве функции потерь метрику mse. Обучение проводится 10 эпох (т. е. 10 раз). Получение изображения в виде вектора с помощью сверточных автоэнкодеров происходит за счет того, что энкодер кодирует изображение, но обратное декодирование не нужно и берется слой из модели, который отвечает за кодирование изображения и сохраняется. Таким образом, сохраняются все кодированные представления изображения. Построение модели подобия изображений при помощи K-ближайших соседей (NearestNeighbours) После получения представления сжатых данных всех изображений мы можем применить алгоритм K?ближайших соседей для поиска похожих изображений. Он основан на расчете евклидового расстояния между векторами: те расстояния, которые будут меньше всего, будут означать, что изображения похожи. Для того, чтобы увидеть, какие изображения модель считает похожими, были написаны две функции, которые показывают 5 и более ближайших/похожих фотографий на ту, с которой идёт сравнение. Преимущества и недостатки использования сверточных автоэнкодеров Преимущества: Подход с использованием сверточных автоэнкодеров применим для обучения модели на данных, которые были выбраны для определенной задачи, если хотим «с нуля» построить свой алгоритм под конкретную задачу и нас не устраивают способы, заложенные в предобученных моделях или готовых решениях. Недостатки:
Использование предобученных моделей для извлечения признаков из изображения Помимо использования автоэнкодеров для получения признаков из изображения можно использовать уже предобученные модели для классификации. Таких моделей очень много, и они также используют сверточные слои и слои пуллинга для получения признаков. Возникает логичный вопрос, зачем же тогда использовать автоэнкодеры? Во?первых, предобученные модели могли быть созданы для других целей и могут не подойти по входным параметрам или по самой конструкции нейронной сети для вашей задачи, поэтому придется её перестраивать или строить сеть самому. Во?вторых, предобученные модели на выходе могут получать не тот размер изображения, который нужен и при загрузке датасета и преобразовании изображений в вектор может не хватить памяти и мощности компьютера, а также это будет занимать много времени. Поэтому, если использовать предобученные модели, то нужно использовать метод понижения размерности PCA. При этом автоэнкодер понижает размерность и можно его настроить таким образом, чтобы на выходе получался вектор необходимого размера. Плюсами применения предобученных моделей является то, что нет необходимости строить нейронную сеть, настраивать сверточные слои, нужно просто взять нужный слой и использовать его для своих целей. Также такие модели были обучены на больших датасетах и имеют готовые веса (настройки) для извлечения необходимых признаков, они лучше выделяют важные области на изображении. Для того, чтобы использовать предобученные модели, для начала их нужно загрузить. В качестве примера, берем модель VGG16 — сверточная сеть, с 13-ю слоями, которая была обучена на датасетах с большим количеством входных данных (14 миллионов изображений, принадлежащих к 1000 классам). Для загрузки изображений используем функцию: Модель VGG16 используется для классификации изображений, т. е. класса, к которой относится изображение (самолет, вертолет и т. д.), поэтому на выходе модель использует слой для классификации. Все предыдущие слои кодируют изображение в вектор. Данную модель можно полностью скопировать с удалением последнего слоя, таким образом получим модель, которая только кодирует изображение в вектор. После того как модель построена, применяем её к нашим данным. Затем, получаем вектор признаков каждого изображения и используем метод понижения размерности PCA. Следующий код показывает, как случайно выбирается вектор из датасета (вектор, полученный на предыдущем этапе), сравнивается расстояние от этого вектора до всех векторов в датасете, данные расстояния сортируются по возрастанию и выбираются наиболее близкие/похожие. Использование готовых библиотек Поставленную задачу (поиск похожих изображений) можно также решить при помощи готовых библиотек, одной из таких является библиотека face_recognition, основанная на библиотеке dlib. После того, как мы получили изображения с лицами, нужно перевести изображения в вектор, для этого в библиотеке face_recognition есть функция face_encodings, а для сравнения векторов, и соответственно, похожих изображений используется функция compare_faces. Сама библиотека работает также, как и нейронные сети, т. е. был обучен датасет изображений (173 Мб в gzip?файле), но в отличие от предыдущего способа, датасет состоял только из изображений лиц (в предыдущем способе использовались разные изображения, в т.ч. животные и транспорт). Развернуть код
Данный подход хорошо находит похожие фотографии в датасете. Для задачи сравнения изображений точность оказалась около 80%. В качестве оценки использовалась своя придуманная метрика, стоит уточнить, что данные были размечены (т. е. изображения были просмотрены и разделены на похожие и нет): если модель находит все похожие изображения и количество непохожих изображений не превышает двух, то результат оценивался как правильный. У каждого pdf?скана паспорта было свое название, и в результате получаем список из названий похожих изображений в паспортах, в видеExcel?файла. Для этого была написана функция для сохранения названий похожих изображений: Развернуть код Выводы В итоге были проверены подходы для поиска похожих изображений в наборе данных при помощи кодирования изображений в векторную форму. Данные алгоритмы показали, что способны решать поставленную задачу, но их всегда можно улучшить, например, путем добавления новых слоев или предварительной обработки изображений. Для решения нашей задачи мы прошли следующие шаги: Шаг 1: Обработали изображения, преобразовали в нужный формат. Шаг 2: Преобразовали изображения в вектор при помощи автоэнкодера, предобученной модели или готовых библиотек. Шаг 3: Извлеченные признаки?вектора сравнили с набором других векторов и нашли похожие изображения на основе расстояний: чем меньше расстояния, тем более похожи изображения. Шаг 4: Сохранили и выгрузили результаты (Excel?файл). Из трех рассмотренных нами подходов готовые библиотеки лучше всех отработали на точность (80–85%). Автоэнкодеры дали точность в 61%, а предобученные модели показали точность в 70%. Данные подходы позволили обнаружить поддельные и старые паспорта и запустить процесс проверки по клиентам, чьи паспорта модель определила как поддельные. Результаты разработки алгоритмов по поиску похожих изображений пригодятся также для реализации следующих задач:
Весь представленный код можно найти по ссылке. Полезные ссылки: Про построение сверточных нейронных сетей Источник: habr.com Комментарии: |
|