[БЕЗ_ЗВУКА] В этом видео мы разберем еще несколько практических задач, и начнем с задачи детекции объектов. До этого мы разговаривали с вами про задачу классификации, когда нужно про картинку целиком сказать, к какому классу она принадлежит. В случае детекции объектов нам нужно не только сказать, к какому классу принадлежит картинка, но и найти, где на картинке данный объект расположен. Как это можно делать? Один из первых, традиционных подходов — скользящее окно. Мы уже обсуждали скользящее окно в контексте фильтрации изображений, здесь примерно то же самое. У нас есть некое окно, которое перемещается по картинке, к каждому такому окну мы можем применить классификационную нейронную сеть, которая предобучена на тех классах, объекты которых нам нужно детектировать, и, таким образом, если классификационная сеть говорит, что в данном окошке объект есть, то он и помечается соответствующей рамкой и классом. Но в этом подходе есть определенный недостаток: чтобы пройти скользящим окном, да еще и на разных масштабах, по изображению, нужно многократно применить классификационную нейронную сеть. А это означает, что данный процесс будет очень медленным. Поэтому были придуманы разнообразные эвристики, как данный процесс ускорить. Один из очевидных способов: давайте применять не тяжелую классификационную сеть, а некий более легкий классификатор, который будет отбрасывать те окна, в которых явно нету объектов, которые нам интересны. Такой подход предложен в статье, которая называется R-CNN. Использовался метод предложения гипотез про окна объектов, который называется Selective Search, и рассматривались альтернативы, а после этого на предложенных окнах запускалась классификационная сеть. Метод достаточно простой и до сих пор используется как некий baseline задачи детекции объектов. Но, несмотря на то, что метод достаточно хорошо себя показал, есть пространство для его улучшения. Собственно, та же группа авторов предложила метод под названием Faster R-CNN, и заключался он в следующем: а давайте для предложения гипотез про окна использовать не какой-то внешний классификатор, а использовать нейронную сеть не только для классификации, но и для гипотез про есть ли в данном окне объект. Вторая инновация, которая была здесь сделана: гипотеза говорилась не только про класс объекта в окне, но и нейронная сеть уточняла расположение объекта внутри окна, то есть выдавался не только класс, но и рамки прямоугольника, который ограничивает данный объект. Идея объединить предсказание объекта, его положение и класс в одной сети оказалась достаточно успешной, и данный метод сейчас является лучшим по предсказанию объектов. Аналогичную идею использовать единую нейронную сеть для предсказания класса объекта и ограничивающего прямоугольника высказал Джозеф Редмон и группа соавторов, и они назвали свой метод YOLO. В чем преимущество YOLO? Он еще более простой, нежели Faster R-CNN, картинка делится на несколько ячеек, в каждой ячейке классификатор применяется отдельно, и после этого строится предсказание, где находится объект и где находится ограничивающий прямоугольник. Работает это очень быстро, и в данной таблице мы можем увидеть результаты сравнения. Например, Faster R-CNN показывает лучший результат по качеству, но при этом скорость работы порядка 7 кадров в секунду. В то же время метод YOLO работает с качеством на 10 % хуже, зато скорость работы достигается порядка 150 кадров в секунду. Соответственно, этот метод можно использовать в реальном времени с большим запасом для детектирования объектов. Соответственно, мы видим, что существуют разные подходы для детекции объектов, и в их выборе можно использовать разные требования как к качеству, так и к скорости работы, и в ближайшее время стоит ожидать многочисленных применений таких детекторов в реальных приложениях. До этого мы обсуждали с вами нейронные сети, которые по картинке выдают некие параметры: либо класс объекта, либо координаты ограничивающего прямоугольника. Существует другой класс нейронных сетей, так называемые генеративные нейронные сети, которые из векторов признаков или неких параметров умеют генерировать изображения. Интересный пример был рассказан в работе, которая представлена на слайде. На вход нейронной сети подавалось положение объекта, его класс и с какой стороны мы на него смотрим, а нейронная сеть должна была сгенерировать данный объект. В частности, в качестве таких объектов использовались стулья, и выглядело это следующим образом. На данной картинке мы видим в самом левом и в самом правом столбце стулья из коллекции, а промежуточные стулья, они сгенерированы с помощью нейронной сети, их в коллекции не было. Мы видим, что все промежуточные результаты, они в том или ином виде похожи на стул. Если бы мы делали простое усреднение, то картинки были бы размазанные, и ничего общего со стульями не было. Это означает, что нейронная сеть в процессе обучения осознала форму стула и использует данные знания для генерации картинок. Давайте посмотрим несколько примеров, как такие нейронные сети можно использовать в различных приложениях. Задача семантической сегментации. Изначально мы рассматривали задачу классификации, когда мы говорили что-то про картинку целиком. В сегодняшнем видео мы обсудили задачу детекции объектов, когда мы находим на картинке конкретные объекты и говорим про них, а можно пойти дальше и про каждый пиксель на изображении сказать, к какому классу он принадлежит. В данной картинке класс закодирован цветом, это фотография с улицы какого-то европейского города. Мы видим такие объекты дорожной инфраструктуры, как, собственно, дорога, тротуар, велосипедисты, трамвай, люди, дорожные знаки. Собственно, задача — найти все такие классы на изображении. Есть несколько методов, которые решают данную задачу. Один из таких методов — полностью сверточные сети. Что это значит? Мы, когда говорили про нейронную сеть, она чаще всего состоит из нескольких сверточных слоев, а потом идут несколько полносвязных слоев. На самом деле, нам почти ничего не мешает заменить последние полносвязные слои на сверточные слои. В чем прелесть сверточных слоев? В том, что у нас не фиксирован размер входной картинки, а выходная картинка будет пропорциональна входной. Итак, когда мы используем нейронную сеть, которая состоит только из сверточных слоев, то выход данной сети будет просто пропорционален входу. Например, если мы используем архитектуру, похожую на AlexNet, и заменяем последние полносвязные слои на сверточные, то выход будет в 32 раза меньше, чем вход. Если мы возьмем достаточно большую картинку, выход будет содержать достаточно много информации, после этого нам можно будет использовать простые алгоритмы повышения размерности и получить изображение, которое, разрешение которого равно разрешению входа. После того, как у нас нейронная сеть такой архитектуры появилась, нам ничего не мешает в явном виде решать задачу семантической сегментации, то есть на входе — картинка размера фиксированного, на выходе картинка такого же размера, но вместо исходных пикселей — номера классов, к которым принадлежит каждый пиксель. Мы знаем обучающую выборку и в явном виде такую нейронную сеть можем обучать. Но в чем проблема такого подхода? Выход нейронной сети намного меньше, чем необходимое разрешение, и увеличение размерности в 32 раза, на самом деле, достаточно сильно испортит качество. Поэтому авторы подхода предлагают следующее решение: давайте использовать выходы не только последнего слоя, но и промежуточные выходы. Они меньше чем вход не в 32 раза, а, соответственно, в 16 и 8 раз. Агрегируя все эти выходы в единый ответ, мы можем получить достаточно хорошее качество, и данная нейронная сеть, она в некотором смысле эмулирует применение сети на разных масштабах. Соответственно, чем раньше мы забираем выход, тем на большем масштабе мы его применяем ко входу. Другой пример метода, который решает задачу семантической сегментации — это так называемый Segnet. Что сделали авторы? Они взяли обычную архитектуру, которая уменьшает размерность, развернули ее. Но главный вопрос: как делать увеличение размерности? Когда мы размерность понижаем, мы используем max-pooling, то есть мы выбираем из окрестности 2 x 2 максимальное значение и используем только его. Соответственно, каждый max-pooling уменьшает нам размерность в 2 раза, несколько max-pooling'ов уменьшают размерность соответственно. Как повышать размерность? Есть несколько методов, один из них — просто запоминать индекс максимума, который мы брали при max-pooling'е, пробрасывать эти индексы до обратных max-pooling'ов и выбирать именно значения с таким же индексом. Соответственно, вся эта конструкция работает достаточно хорошо и показывает, на самом деле, результаты даже более качественные, чем полностью сверточная нейронная сеть. Соответственно, существуют разнообразные эвристики, как улучшать данный подход, но в целом кажется, что нейронные сети такой природы достаточны интересны, и с помощью них можно решать не только семантическую сегментацию, но и множество других задач. Мы посмотрели несколько примеров использования нейронных сетей для детекции объектов и семантической сегментации, а в следующем видео мы обсудим задачи стилизации.