Изучение сокровищницы художественных изображений Метрополитен-музея и предсказание происхождения картины.

Из-за пандемии Covid-19 многие музеи по всему миру закрыли свои двери, и Метрополитен-музей в Нью-Йорке не стал исключением. «Метрополитен», как обычно называют музей, представляет обширную коллекцию, охватывающую 5000 лет истории искусства, в двух местах: на 5-й авеню в Верхнем Ист-Сайде и в Метрополитен-Клойстерс. Его коллекция намного больше, чем экспонаты, которые выставляются публике каждый год, и включает сотни тысяч драгоценных артефактов.

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

Об API

API художественной коллекции Метрополитена предоставляет доступ к сокровищнице данных о коллекции музея. Для данного произведения искусства в коллекции данные о произведении искусства, такие как его категория, название, регион происхождения, культура, к которой оно принадлежит, и даже год или период времени, когда произведение искусства было создано.

Возможно, еще более захватывающим является то, что многие фрагменты также содержат изображение фрагмента, сохраненное в виде ссылки как часть метаданных каждого объекта.

О проекте

Простой в использовании API Met предоставляет прекрасную возможность опробовать методы распознавания изображений с использованием данных из открытых источников.

В этой серии (часть 2 здесь) мы рассмотрим, как использовать данные из открытых источников, такие как данные, полученные через API Met, и как подготовить изображения для автоматического распознавания изображений с помощью сверточной нейронной сети. Затем мы обсудим обучение этой модели для предсказания того, из какой культуры картина.

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

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

Доступ к данным с помощью API

Первым шагом в этом проекте, конечно же, является доступ к данным, доступным через API Met.

API очень прост и удобен в использовании: он не требует регистрации или токена доступа. Все объекты в коллекции Met организованы с помощью ключа под названием objectID. Первая конечная точка API, называемая «Объекты», просто возвращает список всех возможных идентификаторов объектов для каждого возможного объекта. Затем, используя этот список, мы можем вызвать следующую конечную точку API с именем «Объект», которая принимает идентификатор объекта отдельного объекта и возвращает данные об этом объекте.

Наконец, чтобы получить изображения для объектов, мы делаем вызов ссылки, сохраненной в поле данных с именем «primaryImageSmall» в данных каждого объекта. Если ссылка существует, мы можем использовать ее для загрузки файла .jpg, на который она ссылается.

Этот процесс доступа к данным показан в коде ниже:

Как и в случае парсинга веб-страниц, при доступе к API иногда могут возникать ошибки обработки. В коде для доступа к данным мы видим, что возникли проблемы и их нужно было решать, в основном с условными операторами и исключениями. Например, не все элементы имеют связанное с ними изображение. Кроме того, не все URL-ссылки на изображения работали. Решение этих проблем с новым набором данных всегда связано с пробами и ошибками.

Изучение и анализ данных

Теперь, когда мы загрузили все данные Met из их бесплатного API, пришло время взглянуть на то, что у нас есть.

Всего мы получили данные примерно для 130 000 объектов с изображениями. В дополнение к изображениям объектов данные также содержат 57 столбцов метаданных о произведениях искусства. В таблице ниже показаны данные, найденные в этих столбцах для данного примера произведения искусства, гравюры из Японии:

Мы видим, что для данного произведения искусства только некоторые столбцы метаданных содержат данные.

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

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

Наша первая визуализация представляет собой сетку случайной выборки данных изображения, показанную ниже.

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

Далее мы исследуем состав наших данных. Наша цель — ответить на такие вопросы, как: сколько у нас произведений искусства из каждой культуры? Сколько картин в нашем наборе данных? Сколько рисунков? Сколько скульптур? Какой носитель используется чаще всего?

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

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

Учитывая, что существует более 450 различных категорий произведений искусства, мы решили, что их будет слишком много, чтобы пытаться их классифицировать, особенно с учетом того, что во многих категориях не было большого количества образцов. Вместо этого мы выбрали только один тип произведений искусства, Живопись, и попытались предсказать, из какой страны картина. Страна фактически содержится в переменной под названием «культура».

Следующая визуализация показывает количество картин, которые у нас есть для каждой страны.

Мы видим, что большинство картин прибывает из Китая или Америки, а Япония занимает третье место. Есть также много картин из разных регионов Индии.

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

Затем мы хотели посмотреть, сможем ли мы распознать разницу между картинами разных культур нашими «наивными» человеческими глазами. Для этого мы создали сетку изображений с картинами каждой из 4-х культур. Эти сетки показаны ниже.

Удивительно видеть разницу в стилях из 4 культур в нашем наборе обучающих данных. Цвета, используемые в картинах из Индии, например, совершенно разные, и они часто содержат рамку вокруг картины. Американские картины, как правило, содержат много портретов и пейзажей. Китайские и японские картины включают в себя более минималистичные сцены природы, например, изображающие один или два цветка или птиц. Многие картины обеих культур также включают элемент каллиграфии на одной стороне картины. Однако мы согласились с тем, что нашему неискушенному западному зрению может быть трудно сразу распознать, из Японии или Китая картина. Будет очень интересно посмотреть, сможет ли наша модель распознать разницу лучше, чем мы!

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

Подготовка данных для моделирования

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

OpenCV содержит инструменты и функции для выполнения практически каждого шага предварительной обработки, необходимого для подготовки данных изображения к моделированию. Более того, большинство этих команд можно объединить всего в одну строку кода. Это можно увидеть в функции ниже.

Давайте рассмотрим, что делают различные части этого кода.

Во-первых, мы определяем новый размер изображений. Необработанные изображения имеют разные размеры, но модели машинного обучения требуют, чтобы размеры входных данных оставались согласованными. Здесь мы преобразуем все изображения в квадрат размером 150x150 пикселей. Это делается с помощью функции cv2.resize(). Обратите внимание, что мы передаем эти определенные строки и столбцы в качестве второго аргумента этой функции. Первый аргумент — это вывод другой функции openCV, cv2.image. Эта функция считывает изображение. Мы используем параметр cv2.IMREAD_COLOR, чтобы сообщить openCV, что изображение является цветным, а не черно-белым. Последний аргумент, который мы передаем cv2.resize(), это интерполяция. Именно так и происходит изменение размера. Подробнее о различных вариантах этого параметра можно прочитать здесь.

Эта строка функций openCV возвращает трехмерный массив numpy формы (150, 150, 3). Это означает, что он содержит 3 матрицы, каждая 150x150. Каждый из этих 3 содержит данные для одного цветового канала, красного, зеленого и синего (RGB). Мы добавляем каждый из этих трехмерных массивов в массив наших обучающих данных, называемый x. В то же время мы добавляем метку данных в массив меток с именем y.

Теперь, когда мы изменили размер и сохранили данные, мы можем применить еще один шаг предварительной обработки, который дополняет и улучшает наши данные, слегка изменяя изображения путем масштабирования, смещения изображения и т. д. Это делается с помощью класса Keras с именем ImageDataGenerator(). . Что делает этот класс, так это применяет эти небольшие изменения к тренировочным изображениям, создавая в процессе некоторые дополнительные данные. Самое приятное в этом классе то, что его выходные данные могут быть напрямую переданы в нашу модель ML в качестве входных данных.

Код для применения генератора данных изображения показан ниже.

Обратите внимание, что нам нужны 2 разных генератора: один для создания дополнительных обучающих данных, а другой — для использования с данными контрольного теста. Генератор тестовых данных применяет масштабирование только к пикселям изображения и не генерирует никаких дополнительных данных. Также обратите внимание, что в генераторе тестовых данных мы меняем размер пакета на 1. Это делается для того, чтобы генератор возвращал только одно изображение за раз и чтобы изображения оставались выровненными с нашими метками прогноза.

Настройка модели и обучение

Теперь, когда мы подготовили наши генераторы обучающих и тестовых данных, пришло время настроить и обучить нашу модель!

Для построения нашей модели мы будем использовать популярную среду глубокого обучения keras. Keras построен на основе TensorFlow и предназначен для предоставления более простого API для работы, чем собственный TensorFlow.

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

Обратите внимание, что последний слой сети имеет выходной размер 4: это выбрано, потому что у нас есть 4 потенциальных категории, которые можно предсказать, наши 4 культуры Японии, Америки, Китая и Индии. Каждый из выходных узлов представляет вероятность того, что изображение принадлежит одному классу. Если бы это была задача бинарной классификации, например, классификация спама по электронной почте, наш последний уровень имел бы выходной размер 2, где один выход представляет вероятность того, что электронная почта принадлежит к положительному классу (является спамом), а другой — вероятность того, что он не относится к положительному классу (не спам).

Точно так же мы используем функцию активации softmax в конце, поскольку она наиболее распространена для задач классификации нескольких классов. Для задач бинарной классификации мы бы изменили это значение на sigmoid.

Мы выбрали categorical_crossentropy в качестве функции потерь, так как это проблема множественной классификации. Этот отличный пост в блоге дает больше информации о выборе функции потерь для других типов задач, к которым вы применяете глубокое обучение.

Используя эту довольно шаблонную архитектуру, мы были готовы приступить к обучению нашей модели. Мы начали всего с 50 тренировочных эпох, но затем увеличили их до 100, когда стало казаться, что модель все еще обучается после 50 эпох.

На приведенном ниже графике показано, как точность обучения и проверки улучшилась за период обучения.

Мы видим, что к концу обучения точность проверки колебалась около 80%.

Завершение

Чего мы достигли на данный момент? Мы проанализировали данные, загруженные с помощью API Met, и решили задачу прогнозирования с использованием этих данных. Мы решили ограничиться только изображениями живописи и предсказать, какой из 4-х культур принадлежат картины: Китаю, Японии, Индии или Америке. Затем мы предварительно обработали изображения и передали их в сверточную нейронную сеть с 4 выходными узлами, по одному для каждой категории.

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

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