Привет, Хабр! Сегодня я хочу рассказать о второй части проекта сервиса для идентификации и классификации произведений искусства. Напомню, что мы решали две основные задачи:  Сегодня мы рассмотрим применение сверточной нейронной сети для классификации изображений по стилю и жанру. Поможем Даше разобраться в современном искусстве? Из почти 250 000 картин в базе БД Артхив менее 20% присвоен жанр, стиль или техника, зачастую классы, выставленные в базе данных, не соответствуют истинным значениям, много классов, содержащих слишком мало изображений. Кажется, есть даже классы, содержащие единицы изображений. Видимо, некоторые авторы считают необходимым создание названия для своего собственного стиля.

В общей сложности в базе было выделено около 75 стилей, однако для нашей работы заказчиком были выбраны 27 обязательных стилей (к которым впоследствии был добавлен еще один), которые система обязательно должна распознавать.

По ним распределение наполнения оказалось весьма неравномерным. Перед нами задача классификации изображений, но выбрать какие-то простые признаки вручную мы не можем. Значит, будем использовать глубокое машинное обучение, при котором такие сложные признаки выделяются автоматически в процессе обучения.  Рассмотрим сеть inception v3. В ее архитектуре (да и в любой другой глубокой сети) можно условно выделить две основные составляющие – Feature Extractor и Predictor.

Feature Extractor отображает входное цветное изображения в многомерное пространство признаков (многоканальную карту признаков). Карта признаков сохраняет пространственную информацию – то есть это трехмерный тензор с размерами по ширине, высоте и количеству каналов признаков, здесь еще не применен окончательный пулинг, который полностью устранит информацию о взаимном расположении признаков на исходном изображении. Feature Extractor сети Inception v3 получает на вход изображение размером 2992993, а на выходе формирует карту признаков размером 17172048. Размер входа можно варьировать, что приведет к изменениям размеров карты признаков и может быть полезно для уменьшения вычислительных затрат при работе с сетью.

Predictor — это сеть, формирующая выходные данные на основе карты признаков, сформированной Feature Extractor-ом. Как правило, для задачи классификации Predictor представляет собой полносвязанный слой нейронов, количество выходов которого совпадает с количеством классов задачи. 

Классический transfer learning предполагает, что мы берем обученную сеть, отделяем от нее Feature Extractor и дополняем его новым предиктором с нужным нам числом классов. Полученная сеть обучается с небольшой скоростью с частично или полностью замороженными весами слоев Feature Extractor-а. Применим transfer learning для классификации стилей. Возьмем сеть Inception-v3 обученную на наборе данных imagenet и заменим в ней выходной слой нейронов, классифицирующий входные изображения в число выбранных стилей. Полученную сеть мы обучали на изображениях разных стилей, заморозив обучение всех слоев, кроме последнего. Для анализа данных мы отображали распределение валидационного набора по классам.



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

Для лучшей наглядности исключим главную диагональ и заново нормируем значения каждой строки.



Кроме того попробуем отобразить распределение по стилям на двухмерное пространство с помощью TSNE.

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

Многие изображения в стиле модернизма (который хоть и был отмечен заказчиком как обязательный, но вообще-то не является стилем, скорее направлением в искусстве в целом) фактически дублировались в других стилях, особенно в модерне (а вот это уже стиль). В стиле соцреализма присутствовали абстрактные изображения, например, произведения Лисицкого. По всей видимости, они попали туда благодаря работе Лисицкого над советским плакатом, который к соцреализму имеет весьма косвенное отношение. Во многом это действительно ошибки, но иногда причина в дискуссионности вопроса выделения некоторых, особенно современных, стилей. Стоит учитывать, что база наполняется различными пользователями, и среди них порой нет единого мнения. 

Ошибки в данных приводят к соответствующим ошибкам классификации изображений сетью. В процессе чистки базы как нами, так и экспертом-искусствоведом со стороны заказчика, разметка для обучающей выборки была значительно улучшена. Однако, основная масса ошибок классификации сетью (по общему количеству) относится к более-менее устоявшимся стилям, таким как рококо, классицизм, реализм. Отнесение произведений к этим стилям, как правило, происходит на основе эпохи или авторства и, похоже, не вызывает сомнений и споров. Почему же сеть не способна различить их стиль? Основная причина кроется в использовании предобученной сети для извлечения признаков. Дело в том, что эта сеть была обучена классифицировать объекты, определять, что именно изображено, при этом отбрасывая несущественную для задачи информацию о том, как оно изображено. Например, с точки зрения сети на всех изображениях в начале статьи, в общем-то, изображен человек. Для решения этой проблемы мы сделали сеть с промежуточными выходами – считается, что признаки становятся все сложнее по мере продвижения их по сети, а несущественная информация исчезает постепенно. Попытаемся извлечь из промежуточных слоев то, что было несущественно для классификации imagenet. Существует и еще одна проблема — графика, гравюры, эскизы. В imagenet, на котором была предобучена сеть inception попросту нет ничего подобного, соответственно и признаки, выделяемые сетью, не подходят для классификации таких изображений. С другой стороны, красиво повисли отдельным облаком картины в стиле Укие-э — разновидность гравюры, получившая распространение в японии с XVII века. Хоть первоначально их и не было в нашем обязательном списке, мы их туда добавили. После работы с данными удалось добиться лучшего распределения по классам. Из общего числа жанров были выбраны 13 (выделены жирным) В основном сокращение числа жанров достигнуто сокращением жанров различных сцен — "религиозная","мифологическая", "аллегорическая", "литературная" и объединением их под общим названием "жанровая сцена". Мы пришли к выводу, что разделение этих жанров вряд ли может быть выполнено с достаточной точностью без значительного культурологического анализа.

Например, для аллегорической сцены по определению предполагается наличие скрытого смысла в изображении, использование переносного значения у изображаемых предметов. Есть своя сложность и с "религиозной сценой": весьма вероятно, что сеть, обученная выдавать такой класс, будет называть им в том числе и карикатурные изображения (например, пародирующие "Тайную вечерю" да Винчи), а это может кого-то и оскорбить.  Разметка данных по жанрам изначально кажется неплохой, если не считать нескольких жанров, по которым в базе мало изображений. Поискав в интернете мы смогли немного расширить количество изображений в жанрах (в основном батальная сцена, цакли и ведута).
После объединения трудных жанров в общую "жанровую сцену" мы сразу попытались обучить сеть "в лоб", используя transfer learning сети inception.  Видно, что точки, соответствующие изображениям разных жанров, смешиваются. Для этих изображений сеть выдает высокие значения вероятностей принадлежности сразу к нескольким жанрам, а жанр с наибольшей вероятностью определяется почти случайно. Причина видимо в том, что жанры, в отличие от стилей, имеют более выраженную иерархию. Мы попытались разобраться в этих связях, у нас получилась такая карта жанров:  
 Дочерние и родительские жанры иерархии часто имеют общие признаки с точки зрения сети (да и с нашей точки зрения тоже). Например, батальная сцена на суше в целом обладает теми же признаками, что и обычный пейзаж — изображение большого открытой местности или города, а батальная сцена на море больше похожа на жанр марина. Поэтому мы разделили жанр батальной сцены на два — на суше и на море. Другой пример: портреты, жанровая сцена и изображения ню с точки зрения предобученной сети все имеют общий признак — наличие людей. В базе данных же картины сходного содержания зачастую относятся то к дочернему, то к родительскому жанру, в зависимости от того, куда ее определял эксперт, вносивший картины в базу данных. В связи с этим была проведена масштабная чистка и переразметка базы с учетом возможной иерархии жанров, занявшая достаточно много усилий (у нас получилось ее автоматизировать, но не сильно). Для того чтобы перенести иерархию жанров на сеть, мы отказались от one-hot представления и выставили единицу для изображений не только в одном жанре, но и в его родителе, если таковой имеется, а так же заменили целевую функцию процесса обучения и функцию активации выходного слоя. Таким образом задача стала Multilabel классификации (входное изображение может принадлежать к нескольким классам).  Как нам кажется, здесь не хватает еще одного жанра — абстракция. Строго говоря, это не совсем жанр. По крайней мере эксперты настаивали, что такого жанра нет. Для того, чтобы сеть не выдавала на абстрактные изображения случайные ответы, к общему разбиению жанров был добавлен еще один под названием "не удалось определить", включающий абстрактные и спорные изображения. В целом удалось добиться удовлетворительной точности классификации стилей и жанров изображений, однако есть куда улучшать. К сожалению, классификация стилей и техник не была доведена до конца — поддержка в сервисе не реализована.