Pull to refresh
VK
Building the Internet

Распознавание сцен на изображениях с помощью глубоких свёрточных нейронных сетей

Reading time 10 min
Views 16K
Многие продукты нашей компании работают с изображениями. Некоторое время назад мы решили добавить в такие сервисы «умный» поиск по фотографиям, их теггирование. Такая функциональность будет входить в Computer Vision API для дальнейшего использования в продуктах компании. Одним из важных способов теггирования изображений является теггирование по сценам, когда в результате мы получаем что-то такое:



В сообществе Computer Vision достаточно хорошо изучена задача распознавания объектов (Object recognition). Одно из главных соревнований в области машинного зрения — ImageNet, и алгоритмы (свёрточные нейронные сети с 2012 года), которые побеждали в дисциплине распознавания объектов, как правило, становились state-of-the-art. Однако распознавание сцен исследовано значительно меньше, только с прошлого года эта задача входит в ImageNet. Главное отличие распознавания сцен (Scene recognition, Place recognition, Place classification) от распознавания объектов заключается в том, что сцены — более комплексные сущности. Например, для того чтобы определить, что на картинке изображён котёнок, алгоритму необходимо детектировать и распознать одну сущность — непосредственно котёнка.



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

Современные Computer Vision API умеют работать со сценами. Убедимся в этом на примерах CV API от Google и Microsoft. Оба включают в себя в числе прочего тегирование по сценам. Примеры работы Google CV API:



И Microsoft CV API:



Как видно из приведённых выше примеров, оба сервиса включают в себя распознавание сцен и находят на тестовой картинке ресторан. Наша задача состояла в том, чтобы добавить схожую функциональность в наше Computer Vision API.

Данные


Распознавание сцен стало активно развиваться параллельно с началом бума свёрточных нейронных сетей (convolutional neural networks, CNN), т. е. примерно с начала 2010-х годов, когда стали появляться в свободном доступе базы данных. Так как наша модель — это глубокая CNN, то для её обучения нам требовались достаточно большие и разнообразные датасеты. В таблице представлены основные базы данных.

База SUN LSUN Places2-Standard Places2-Challenge
Количество категорий 397 10 365 365
Количество изображений 108 754 9 895 373 1 803 486 8 026 628
Изображений на класс > 100 168 103 — 3 033 042 3068 — 5000 3068 — 40 000

В 2014 году появилась база Places, а в 2016-м — её вторая, расширенная версия Places2 от MIT. Эту базу можно скачать в двух видах: Places2-Standard и Places2-Challenge. Places2-Standard представляет собой уменьшенную версию Places2-Challenge, в которой классы более сбалансированы. В ImageNet 2016 года было включено соревнование Scene classification, основанное на Places2-Challenge. Лучший результат в этом соревновании с top-5 ошибки 9,01 % показала китайская команда Hikvision Research Institute. Примеры из базы Places2 приведены ниже, на таких данных происходило обучение нашей сети.



Обучение современной глубокой CNN даже на Places2-Standard занимает несколько суток. Для того чтобы протестировать и отладить различные архитектуры и подобрать параметры модели и обучения за приемлемое время, мы решили пойти по пути, который активно используется в Object recognition. Там модели сначала проверяют и отлаживают на небольших базах CIFAR-10 и CIFAR-100, а затем лучшие из них обучают на большом датасете из ImageNet. Мы урезали базу SUN до 89 классов, 50 тысяч изображений в тренировочном множестве и 10 тысяч в валидационном. На полученном датасете SUN Reduce сеть обучается порядка 6—10 часов и даёт представление о своём поведении при обучении на Places2.

При детальном исследовании Places2 мы решили избавиться от некоторых классов. Причинами для этого послужили отсутствие необходимости в этих классах в production и слишком маленькое количество данных, что создавало перекос в обучающей выборке. Примеры таких категорий — aqueduct, tree house, barndoor. В итоге после чистки получилась база Places Sift, которая состоит из 314 классов, Standard train множество включает в себя около 1,5 миллиона изображений, Challenge train множество — около 7,5 миллиона изображений. Также при изучении категорий стало ясно, что их слишком много и они чересчур подробные для использования «в бою». Поэтому мы объединили некоторые из них в одну, назвав эту процедуру Scene mapping. Вот примеры объединения классов:

  • bamboo forest, forest broadleaf, forest path, forest road, rainforest -> forest;
  • hospital, hospital room, nursery, operating room -> hospital;
  • hotel outdoor, hotel room, inn outdoor, youth hostel -> hotel.

Scene mapping применяется только при выводе результатов пользователю и только в некоторых задачах, где это имеет смысл. Обучение CNN происходит на оригинальных классах Places Sift. Также в CV API есть выдача embedding из сети для того, чтобы на основе нашей модели можно было дообучать новые.

Подходы, решения


С 2012 года (победа в ImageNet команды Университета Торонто, которая использовала CNN AlexNet) свёрточные нейронные сети стали де-факто state-of-the-art во многих областях Computer Vision и демонстрируют значительный потенциал для дальнейшего прогресса, поэтому в наших экспериментах мы рассматривали только этот тип моделей. Я не буду вдаваться в описание основ CNN, этому уже посвящены отдельные посты, например. Для общего представления на картинке ниже изображена классическая сеть LeNet от Яна Лекуна:



Чтобы определиться с архитектурой сети, мы отбирали CNN, основываясь на результатах ImageNet и Places2 за последнюю пару лет. Топовые модели на этих двух соревнованиях можно с некоторой долей условности разделить на семейство Inception (GoogLeNet, Inception 2—4, Inception-ResNet и производные от них) и на семейство Residual Networks (ResNet и различные способы его улучшения). В результате наших экспериментов по распознаванию сцен лучше всех себя показали модели из семейства ResNet, поэтому дальнейшее повествование будет связано с ними.

Residual Networks, сокращённо ResNet (можно перевести как «остаточные сети») появились в конце 2015 года и победили в ImageNet 2015. Их изобретатели — команда из азиатского подразделения Microsoft Research. Они смогли построить и успешно обучать сети очень большой глубины, т. е. с большим количеством слоёв. Сравнение победителей разных лет по этому параметру от авторов:



Основной элемент ResNet — Residual-блок (остаточный блок) с shortcut-соединением, через которое данные проходят без изменений. Res-блок представляет собой несколько свёрточных слоёв с активациями, которые преобразуют входной сигнал $x$ в $F(x)$. Shortcut-соединение — это тождественное преобразование $x \rightarrow x$.



В результате такой конструкции Res-блок учит, как входной сигнал $x$ отличается от $F(x)$. Поэтому если на некотором слое сеть уже достаточно хорошо аппроксимировала исходную функцию, порождающую данные, то на дальнейших слоях оптимизатор может в Res-блоках делать веса близкими к нулю, и сигнал будет почти без изменений проходить по shortcut-соединению. В некотором смысле можно сказать, что CNN сама определяет свою глубину.

Важнейший вопрос в такой архитектуре сети — построение Res-блока. Большинство исследований и улучшений в ResNet связаны с этой темой. В 2016 году вышла статья тех же авторов, в которой они предложили новый способ построения Res-блока.



При таком подходе предлагается внести последнюю активацию (ReLU) в Res-блок и переместить слои нормализации (batch normalization) и активации перед свёрточными слоями. Такая конструкция позволяет сигналу без изменений протекать от одного Res-блока к другому. В статье авторы дают математическое объяснение тому, что этот трюк способствует борьбе с затухающим градиентом и, следовательно, позволяет строить сети очень большой глубины. Например, авторы успешно обучили ResNet с 1001 слоем.

Для наших исследований был выбран фреймворк PyTorch из-за его гибкости и скорости работы. Сравнение обучаемых моделей проводилось по замерам top-1 и top-5 ошибки на трёх тестах:

  1. Places val — валидационное множество из Places Sift.
  2. Places val Scene map — валидационное множество из Places Sift + Scene mapping.
  3. Manual test — изображения, предоставленные нашими коллегами из их облаков, размеченные вручную. Этот тест ближе всего к «боевому» применению CNN, однако из-за относительно малого количества данных он менее робастный.

В результате экспериментов было обучено две модели: ResNet-50 и ResNet-200. Обе сети были дотюнены с ImageNet, так как этот подход показал значительное преимущество в нашей задаче перед обучением с нуля. Обученные модели мы сравнили на тестах с benchmark моделью ResNet-152, которую предоставили авторы базы Places2. Top-1 ошибки:



И top-5 ошибки:



Как видно из графиков, ResNet-200 почти везде побеждает, что, в принципе, и неудивительно.

Wide Residual Network


Конечно, мы не остановились на стандартном ResNet и после получения результатов продолжили исследования по повышению качества нашей CNN. Простое увеличение количества слоёв не даёт улучшения. В статье авторы показывают, что Residual Network — это ансамбль менее глубоких сеток. Ниже приведена иллюстрация из статьи по представлению ResNet в виде ансамбля.



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

Появившаяся в 2016 году Wide Residual Network делает именно это. Автор работы берёт обычный ResNet и увеличивает количество каналов в свёртках в Res-блоках, достигая с меньшим количеством параметров качества более глубоких ResNet. Мы использовали модель Wide ResNet-50-2 (WRN-50-2), обученную на ImageNet, которая представляет собой ResNet-50 с увеличением каналов в два раза. Сам автор наглядно проиллюстрировал отличие Wide Res-блока (слева) от классического Res-блока (справа):



WRN-50-2 показывает близкие результаты к ResNet-200 на ImageNet: 21,9 % top-1 ошибки против 21,7 %. При этом WRN-50-2 почти в два раза быстрее, чем ResNet-200.

Для дальнейшего разбора архитектуры Wide ResNet вернёмся на пару шагов назад к стандартному Res-блоку. Чтобы увеличить эффективность вычислений и уменьшить количество параметров для больших сетей, таких как ResNet-50/101/152, авторы применили подход, который появился в модели Network In Network, а затем был внедрен в Inception-модель. Идея заключается в использовании 1 × 1 свёртки для уменьшения числа каналов перед более дорогой операцией 3 × 3 свёртки, а затем в восстановлении исходного числа каналов посредством ещё одной 1 × 1 свёртки. Res-блок с таким трюком называется bottleneck. Ниже приведено сравнение исходного (слева) и bottleneck-блоков (справа).



В Wide ResNet увеличение числа каналов происходит как раз для «внутренних» свёрток в bottleneck-блоках. В WRN-50-2 цифра 64 на рисунке справа увеличивается до 128.

Приведём сравнение обученных WRN на наших тестах. Top-1 ошибки:



Top-5 ошибки:



Лучшей моделью оказалась WRN-50-2, затюненная с ImageNet и обученная на Places Sift Challenge. Она превзошла ResNet-200, работая при этом почти в два раза быстрее. Замеры скорости работы мы проводили на одной GPU Maxwell Titan X, cuDNN 5.0.05 на батче из 16 изображений. WRN-50-2 показала 83 мс против 154 мс у ResNet-200. Такое увеличение скорости при близком количестве параметров можно объяснить «шириной» Res-блока и, следовательно, большими возможностями для распараллеливания вычислений в нём. Обучение WRN-50-2 заняло около двух недель.

Примеры работы


Приведём несколько примеров работы нашей CNN с использованием Scene mapping. Примеры успешной работы (в формате предсказание и соответствующий ему скор):



Predicted Scene mapping
  • restaurant 0,33
  • pub/indoor 0,11
  • beer_hall 0,1
  • food_court 0,08
  • dining_hall 0,07

  • restaurant 0,62
  • dining room 0,07




Predicted Scene mapping
  • mountain_path 0,2
  • rainforest 0,17
  • forest_path 0,08
  • creek 0,07
  • valley 0,06

  • forest 0,22
  • mountain path 0,2
  • creek 0,07
  • valley 0,06




Predicted:

  • harbor 0,42
  • coast 0,13
  • cliff 0,12
  • promenade 0,07
  • ocean 0,04

Пример неудачной работы:



Predicted:

  • palace 0,21
  • museum 0,16
  • plaza 0,12
  • yard 0,1
  • church 0,13

Другие ResNet


Семейство ResNet продолжает увеличиваться. Мы попробовали использовать несколько последних представителей этого семейства для распознавания сцен. Один из них — сеть PyramidNet, которая показала многообещающие результаты на CIFAR-10/100 и на ImageNet. Основная идея этой CNN заключается в том, чтобы постепенно увеличивать количество каналов в свёртках, а не резко в несколько раз, как это происходит в обычных ResNet. Варианты PyramidNet:



Авторы оригинального ResNet также думают над расширением сети. Они создали модель ResNeXt, которая предлагает «умное» расширение Res-блока. Основная идея заключается в разложении числа каналов в Res-блоке на несколько параллельных потоков, например 32 блока по 4 канала = 128 каналов вместо оригинальных 64 из обычного Res-блока (слева), как показано на картинке ниже.



Такой подход похож на Inception, но все параллельные блоки одинаковы. При той же сложности модели, что и у ResNet, получаем улучшение качества.

К сожалению, ни PyramidNet, ни ResNeXt не смогли превзойти по качеству на наших тестах WRN-50-2 и показали близкие результаты.

«Креативные» подходы к улучшению CNN


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

Первый из подходов основывается на Class activation map (CAM). Рассмотрим Global average pooling (GAP) — слой нашей сети, после которого идёт Softmax-слой. Обозначим $f(x,y)$ как выход свёрточного слоя перед GAP, $k$ — номер канала, $x$ и $y$ — пространственные координаты, $w^c$ — веса в слое после GAP, соответствующий $c$-ому классу. Тогда:



Основная идея заключается в том, что экземпляры одной сцены должны иметь в качестве CAM похожие объекты. Пример CAM для некоторых классов из Places2 после отображения их на исходное изображение:



Для реализации этого подхода мы использовали две сети. Пусть сеть 1 — это новая CNN, например ResNet-50, обученная на ImageNet, а сеть 2 — это наша обученная на Places Sift WRN-50-2. Мы попробовали два вида обучения. Первый алгоритм:

  1. Входное изображение прогоняется через сеть 2, и на него отображается CAM.
  2. Полученный CAM прогоняется через сеть 1.
  3. Результат сети 1 добавляется в функцию потерь сети 2.
  4. Сеть 2 обучается с этой новой функцией потерь.

Второй алгоритм состоит из следующих шагов:

  1. Входное изображение прогоняется через сеть 2, и на него отображается CAM.
  2. Полученный CAM прогоняется через сеть 1.
  3. Обучается только сеть 1.
  4. При выводе используется ансамбль из сетей 1 и 2.

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

Следующий подход, который мы применяли к нашей модели, — это Visual recurrent attention (VRA). Алгоритм достаточно сложен, и за подробностями я предлагаю обратиться к статье, а здесь расскажу об основных его шагах и о том, как мы использовали его в нашей задаче. Основная идея VRA — он «смотрит» на различные патчи изображения, последовательность которых определяется рекуррентной сетью, и делает вывод о классификации всего изображения по этой последовательности. В целом алгоритм выглядит так:



На шаге A из изображения $X_t$ вырезаются несколько патчей в масштабе с центром в поступившей точке $l_{t-1}$. На этапе B эти патчи вместе с координатами точки $l_{t-1}$ прогоняются через две небольшие сети, в результате чего получается их общее векторное представление $g_t$. Оно поступает в рекуррентную сеть $f_h$, которая на каждой итерации выдаёт решение о классификации $a_t$ и новую точку центра патчей $l_t$. $f_h$ проходит некоторое заданное количество шагов.

Мы экспериментировали с VRA, подавая ему на вход не изображение, а карту признаков с одного из слоёв сети WRN-50-2 после прогона через неё входного изображения. Наша идея состояла в том, что механизм Attention поможет выделить характерные для сцены предметы. Однако такой алгоритм очень долго учится, и нам не удалось поднять качество выше 20 % за приемлемое время.

В статье, которую мы рассматривали в разделе про Wide ResNet, есть наблюдение, что некоторые Res-блоки можно выкидывать без сильной потери в качестве. Мы провели эксперименты по удалению нескольких Res-блоков из ResNet-200, однако даже при увеличении таким образом скорости её работы WRN-50-2 остался лучшим выбором модели.

Заключение


Сейчас наша команда продолжает эксперименты в области Scene recognition. Мы обучаем новые архитектуры CNN (в основном из семейства ResNet), пробуем другие варианты CAM, настраиваем Visual Recurrent Attention и пробуем различные подходы с более хитрой обработкой патчей изображения.

В этом посте мы рассмотрели основные наборы данных для Scene recognition, различные подходы к решению этой задачи, выяснили, что Wide ResNet пока показывает лучший результат, и рассмотрели некоторые методы для улучшения модели.

В заключение могу сказать, что Scene recognition — это нужная, но пока относительно малоизученная область Computer Vision. Задача очень интересная, и в ней можно экспериментировать с различными подходами, которые могут не подходить для классического Object recognition (например, CAM или VRA).
Tags:
Hubs:
+31
Comments 2
Comments Comments 2

Articles

Information

Website
vk.com
Registered
Founded
Employees
5,001–10,000 employees
Location
Россия
Representative
Миша Берггрен