Если у вас есть 100 000 изображений и вы можете найти 10 изображений, наиболее похожих на одно из них, что бы вы сделали? Не сдавайтесь легко и не просматривайте один за другим. С Python это тоже легко сделать.
сомневаться
"Как распознавать изображения с помощью Python и глубоких нейронных сетей?После написания этой статьи я получил отзывы от многих читателей. Один из самых частых вопросов:
Есть ли хороший способ идентифицировать одинаковые или похожие изображения?
Хотя я рад помочь читателям решить проблемы, я, честно говоря, сначала не совсем понимал эту потребность.
Образцы фотографий в моей статье (Дораэмон и Валл-И) взяты из Интернета. Если вам нужно найти изображение, похожее на определенное изображение в Интернете, вы можете использовать функцию Google «поиск изображения по изображению».
Вскоре я внезапно проснулся.
Это требование часто заключается не в том, чтобы найти иголку в стоге сена в Интернете, а в том, чтобы найти похожие картинки. но вчастныйНайдите примерное изображение в огромной коллекции изображений.
Эта коллекция изображений может быть научными данными вашей команды. Например, вы изучаете птиц. Однажды, просматривая изображения, присланные с полевого съемочного оборудования, я неожиданно обнаружил новый вид.
Итак, вы хотите узнать, когда появилась эта птица, условия ее жизни и т. д. Для этого требуется найти похожие картинки (скорее всего, одну и ту же птицу) из большого количества картинок.
Эта коллекция изображений, возможно, данных социального обеспечения. Например, если вы находитесь в отделе по борьбе с терроризмом, система вдруг обнаруживает, что в секретной зоне появляется подозреваемый террорист. Каждый раз появление этого парня сопровождается возникновением злостных уголовных дел, представляющих серьезную угрозу безопасности жизни и имущества людей.
В это время очень важно искать сходство их одежды, внешности или средств передвижения.
В приведенном выше примере, поскольку вы не загрузили изображение в Интернет, механизм Google «Поиск по изображению» очень мощный, но он ничего не может сделать.
Что ж, есть смысл решить эту проблему.
Естественно возникает следующий вопрос: сложно ли удовлетворить такой спрос?
Нужно ли для этого преодолевать очень высокий технический порог? Вам нужно потратить много денег, чтобы нанять специалистов для его завершения?
В этой статье я покажу вам, как решить эту проблему с 10 линиями Python Code.
данные
Для удобства пояснения мы по-прежнему используем «Как распознавать изображения с помощью Python и глубоких нейронных сетей?"Коллекция изображений Дораэмона и ВАЛЛ-И, использованных в этой статье.
Я подготовил для вас 119 фотографий Дораэмона и 80 фотографий Валл-И. Картинка загружена наЭтот проект на гитхабе.
Пожалуйста, нажмитеэта ссылка, загрузите сжатый пакет. Затем разархивируйте его локально. как нашдемонстрационный каталог.
После распаковки вы увидите папку с изображениями в каталоге, который содержит два подкаталога, doraemon и walle.
В каталоге doraemon есть всевозможные изображения синего толстяка.
Картинки в каталоге Wall-E выглядят так:
Данные уже доступны, давайте подготовим конфигурацию среды.
окрестности
В этой статье нам нужно использовать TuriCreate, платформу машинного обучения Apple.
Обратите внимание, что TuriCreate вышла не так давно, текущий список поддерживаемых операционных систем выглядит следующим образом:
Это означает, что если ваша операционная система — Windows 7 и ниже, TuriCreate в настоящее время не поддерживается. Есть два способа его использования:
Сначала обновитесь до Windows 10 и используйте WSL. О том, как использовать WSL, я нашел один для васучебник китайского языка. Пожалуйста, следуйте инструкциям шаг за шагом, чтобы завершить установку.
Второй — использовать виртуальную машину. Рекомендуется использовать виртуальную машину Virtualbox, которая является бесплатной и с открытым исходным кодом. Кроме того, я также нашел для вас очень подробную установку Virtualbox для Ubuntu Linux.учебник китайского языка. Вы можете обратиться к нему, чтобы установить Linux.
Решив проблему совместимости системы, давайте установим интегрированную среду выполнения Python Anaconda в систему, поддерживаемую TuriCreate.
пожалуйста, перейдите кэтот URLЗагрузите последнюю версию Анаконды. Прокрутите страницу вниз, чтобы найти место загрузки. В зависимости от системы, которую вы используете в настоящее время, веб-сайт автоматически порекомендует вам подходящую версию для загрузки. Я использую macOS, а формат загружаемого файла — pkg.
В левой части страницы загрузки указана версия Python 3.6, а в правой части — версия 2.7. Пожалуйста, выберите версию 2.7.
Дважды щелкните загруженный файл pkg и установите его шаг за шагом в соответствии с подсказками на китайском языке.
После установки Anaconda устанавливаем TuriCreate.
Пожалуйста, зайдите в свой «терминал» и войдите в каталог примеров, который мы только что загрузили и распаковали.
Выполните следующую команду, чтобы создать виртуальную среду Anaconda с именем turi. Если бы вы следовали за мной раньшеКак распознавать изображения с помощью Python и глубоких нейронных сетей?"Эта виртуальная среда была создана в статье, пожалуйста, пропустите ее здесь.
conda create -n turi python=2.7 anaconda
Затем мы активируем виртуальную среду turi.
source activate turi
В этой среде мы устанавливаем (или обновляем) последнюю версию TuriCreate.
pip install -U turicreate
После установки выполнить:
jupyter notebook
Это входит в среду ноутбука Jupyter. Давайте создадим новую записную книжку Python 2.
В браузере появился пустой блокнот.
Щелкните имя записной книжки в верхнем левом углу и измените его на осмысленное имя записной книжки «demo-python-image-similarity».
Теперь, когда подготовка завершена, мы можем приступить к написанию программ.
код
Во-первых, мы читаем в пакете TuriCreate.
import turicreate as tc
Указываем папку image, где находятся изображения. Пусть TuriCreate прочитает все файлы изображений и сохранит их во фрейме данных.
data = tc.image_analysis.load_images('./image/')
Давайте посмотрим на содержимое фрейма данных:
data
data содержит два столбца информации, первый столбец — это адрес изображения, а второй столбец — описание длины и ширины изображения.
Ниже мы просим TuriCreate добавить номер строки к каждой строке во фрейме данных. Это будет использоваться в качестве маркера для изображения, который можно использовать позже при поиске изображения.
data = data.add_row_number()
Взгляните на содержимое фрейма данных в это время:
data
Давайте посмотрим на картинки, соответствующие информации во фрейме данных.
data.explore()
TuriCreate откроет страницу с содержимым фрейма данных.
Наведите указатель мыши на миниатюру, чтобы увидеть более крупное и четкое изображение.
Первая картинка - Дораэмон:
Вторая картинка - ВАЛЛ-И:
Далее главное событие. Мы позволяем TuriCreate построить модель распознавания сходства изображений на основе входного набора изображений.
model = tc.image_similarity.create(data)
Выполнение этого оператора может занять некоторое время. Если вы используете TuriCreate впервые, может также потребоваться загрузить некоторые данные из Интернета. Пожалуйста подождите.
Resizing images...
Performing feature extraction on resized images...
Completed 199/199
Обратите внимание на приведенные здесь советы: TuriCreate автоматически помогает нам выполнять предварительную обработку, например, настройку размера изображения, и выполняет извлечение признаков для каждого изображения.
После долгого или короткого ожидания модель была успешно построена.
Далее давайте попробуем дать модели изображение, и пусть TuriCreate поможет нам выбрать 10 наиболее похожих изображений из текущей коллекции изображений.
Для удобства мы выбираем первое изображение в качестве входных данных запроса.
мы используемshow()
Функция отображает это изображение.
tc.Image(data[0]['path']).show()
Подтверждено, это все еще Дораэмон.
Теперь давайте запросим, мы позволим модели найти 10 изображений, наиболее похожих на это изображение.
similar_images = model.query(data[0:1], k=10)
Вскоре система подсказывает нам, что мы его нашли.
Сохраняем результат вsimilar_images
В переменной давайте посмотрим, какие в них картинки.
similar_images
Всего возвращается 10 строк. В соответствии с нашими требованиями.
Каждая строка данных содержит 4 столбца. Они есть:
- тег изображения запроса
- получить тег результата
- Расстояние между изображением результата и изображением запроса
- Значение ранжирования сходства между изображением результата и изображением запроса
Вооружившись этой информацией, мы можем точно увидеть, какие изображения больше всего похожи на изображение входного запроса.
Обратите внимание, что первое изображение результата на самом деле является нашим исходным изображением. Нет смысла думать об этом.
Мы извлекаем значения тегов (индексов) всех полученных изображений, игнорируя первое (я).
similar_image_index = similar_images['reference_label'][1:]
Теги для оставшихся 9 изображений находятся в результате:
similar_image_index
dtype: int
Rows: 9
[194, 158, 110, 185, 5, 15, 79, 91, 53]
Ниже мы надеемся, что TuriCreate поможет нам визуализировать содержимое этих 9 изображений.
Мы хотим отфильтровать теги вышеупомянутых 9 изображений в индексном списке всех изображений:
filtered_index = data['id'].apply(lambda x : x in similar_image_index)
Взгляните на результаты отфильтрованного индекса:
filtered_index
dtype: int
Rows: 199
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, ... ]
Вы сами можете посчитать, где эти позиции картинки отмечены как 1, а мы храним вsimilar_image_index
Соответствуют ли числа в.
После завершения проверки выполните следующую инструкцию. Мы снова вызываем TuriCreateexplore()
Функция для отображения изображения результата запроса на сходство.
data[filtered_index].explore()
Появится следующее диалоговое окно:
Мы видим, что на всех картинках результатов запроса появляется только Дораэмон. Ни одна из фотографий ВАЛЛ-И не появилась.
Успешный поиск похожих изображений!
Поработав с образцами данных в этой статье, вы можете попробовать свои собственные данные.
принцип
Теперь, когда мы показали вам, как найти похожие графики в 10 строках кода Python, давайте поговорим о принципах, лежащих в основе этой мощности и простоты.
Если вам не интересен принцип, пропустите этот раздел и посмотрите «Резюме».
Хотя мы только что построили модель с помощью одного оператора:
model = tc.image_similarity.create(data)
Однако на самом деле TuriCreate многое делает для нас за кулисами.
Во-первых, он вызывает очень сложную модель, обученную на огромном наборе данных.
"Как распознавать изображения с помощью Python и глубоких нейронных сетей?«В статье мы представили, что эта модель является последней строкой на рисунке выше. Его зовут Resnet-50, у него 50 слоев, миллионы обучающих картинок, и время обучения очень велико.
Здесь нужно быть остроумным, чтобы задать вопрос: есть ли Дораэмон и Валл-И на этих миллионах предтренировочных картинок?
нет.
Это странно, не так ли?
Если эта сложная модель никогда раньше не видела Дораэмона и Валл-И, откуда она знает, как отличить их друг от друга? Как вы можете сказать, что разница между двумя Дораэмонами должна быть меньше, чем разница между Дораэмоном и Валли?
"Как распознавать изображения с помощью Python и глубоких нейронных сетей?«В статье я предложил вам дать ключевое слово: трансферное обучение.
Здесь мы не будем вдаваться в технические подробности. Я собираюсь объяснить это вам только на концептуальном уровне.
Помните эту схему, описывающую компьютерное зрение (сверточные нейронные сети)?
Перед полносвязным слоем (Fully Connected Layer) вы, возможно, выполнили несколько сверток, семплирование, свертку, сэмплирование... Эти промежуточные слои помогают нам описать некоторые основные характеристики изображения, например форму края. основные цвета блока и т.д.
На полносвязном уровне у вас остается набор данных, который может быть очень длинным, который извлекает все функции ваших входных данных.
Если вы вводите кошку, полностью подключенный слой в это время описывает различную информацию о кошке, такую как цвет шерсти, расположение компонентов лица, форму краев...
Эта модель может помочь вам выделить черты кошки, но она не знает, что такое понятие «кошка».
Вы можете, естественно, использовать его для извлечения характеристик собаки для вас.
Точно так же фотографии Дораэмона, как и фотографии кошек, представляют собой двухмерные изображения, и все они наслоены разными цветами.
Может ли модель, обученная на других фотографиях, извлечь черты из фотографий Дораэмона?
Конечно вы можете!
Ключом к использованию трансферного обучения является замораживание всех результатов обучения промежуточного процесса и непосредственное использование изображения в процессе обучения.другие картинкиМодель, обученная на наборе, преобразуется в результат описания признаков.
В следующей работе только последнее описание функции (полный уровень соединения) используется для обработки классификации и расчета сходства.
Предыдущие десятки уровней итеративного обучения параметров опущены.
Неудивительно, что такая высокая точность может быть получена с таким небольшим набором данных, и неудивительно, что результаты интегрированной модели могут быть получены за такой короткий период времени.
Способность переносить опыт и знания, накопленные при выполнении определенной задачи, на другую аналогичную новую задачу называется трансферным обучением.
Люди более сильны в трансферном обучении, чем машины.
Хао Цзинфан, автор премии Хьюго, описал эту мощную способность людей к обучению в недавней статье:
Дети могут быстро учиться, учиться на небольших данных и получить понятие «класс». Дети легко могут отличить понятие «утка» от каждой конкретной утки. Первый — абстрактный «класс», а второй — конкретная вещь. Детям не нужно смотреть на множество изображений уток, чтобы получить представление об абстрактном «классе» «утки».
Чтобы описать это идиомой, это, вероятно, «по аналогии».
Если люди не умеют переносить обучение и учатся всему в жизни как новому с нуля, последствия невообразимы. По сравнению с общим объемом информации, который мы можем обработать за всю жизнь, эта когнитивная нагрузка была бы невыносимой.
Возвращаясь к нашей проблеме, если модель может помочь нам превратить каждую картинку в длинную строку чисел (признаков) на полносвязном слое, то нам становится слишком легко различать сходство этих картинок. Потому что это становится простой проблемой пространственно-векторного расстояния.
Нам, людям, может показаться утомительным заниматься такими простыми числовыми вычислениями. Но когда дело доходит до компьютеров, это очень весело.
Отсортируйте по расстоянию, найдите наименьшие векторы, и описываемые ими картинки оцениваются моделью как наиболее похожие.
резюме
существует"Как распознавать изображения с помощью Python и глубоких нейронных сетей?На основе статьи эта статья далее вводит следующее содержание:
- Как использовать TuriCreate для быстрого построения модели подобия изображений;
- Как запросить k изображений, наиболее похожих на определенное изображение;
- Как визуализировать результаты сбора изображений запроса;
- Принцип классификации графов TuriCreate и расчета сходства;
- Основные концепции трансферного обучения.
Если вы не читали"Как распознавать изображения с помощью Python и глубоких нейронных сетей?, настоятельно рекомендую прочитать. Процесс чтения может помочь вам лучше понять, как работает компьютерное зрение на основе глубоких нейронных сетей.
обсуждать
Сталкивались ли вы когда-нибудь с иголкой в стоге сена, ища работу, напоминающую картину? Как вы с этим справились? Какие хорошие инструменты и методы вы использовали? В чем их преимущества по сравнению с этой статьей? Добро пожаловать, чтобы оставить сообщение, поделиться своим опытом и мыслями со всеми, мы обменяемся и обсудим вместе.
Лайк пожалуйста лайк. Вы также можете подписаться на мой публичный аккаунт в WeChat и закрепить его."Юшу Чжилань" (нкваншуйи).
Если вы интересуетесь наукой о данных, вы можете прочитать мою серию постов с учебными указателями "Как эффективно начать работу с наукой о данных?", есть более интересные задачи и решения.