ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: эта статья требует базовых знаний о нейронных сетях

Члены нашей команды: Апурва Редди, Пушан Шах, Шан Цинь, Серена Ду, Тееру Гупта

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

Как вы понимаете, восприятие окружающей среды - довольно сложная проблема. По сути, это одна из самых сложных проблем, существующих сегодня. Итак, для такой сложной задачи мы используем нейронные сети для достижения качественных результатов. Если быть точным, воспользуемся ГЛУБОКОМ ОБУЧЕНИЕМ! В восторге? Тогда не теряйте времени и читайте дальше! Если вам интересно, где взять данные для разработки и обучения нейронных сетей для такой задачи. Существует соревнование Kaggle с данными изображений объемом около 96 ГБ с двух автомобильных камер. Набор данных состоит из изображений, содержащих различные объекты с предварительно помеченными классами. Мы используем эти многочисленные предварительно маркированные изображения (более 39 000) для обучения сети и около 1900 изображений для оценки точности работы сети.

Пример данных обучения:

Для начала мы провели некоторый исследовательский анализ данных по набору данных. Используя модуль сегментации scikit-image, dask и matplotlib, мы смогли отобразить исходное изображение и цветные метки.

Мы также провели базовую проверку температуры для типов объектов в наших данных. На графиках ниже показаны результаты.

Как и ожидалось, на большинстве изображений изображены люди и автомобили, а в большинстве изображений менее 50 объектов, а максимальное количество изображений - три класса объектов.

А теперь давайте поговорим о технических деталях.

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

Это лучше видно на изображении ниже:

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

Есть два типа семантических сегментов:

  1. Пиксель за пикселем: выполнение мультиклассовой классификации на уровне пикселей (что мы и выполняем в этой задаче)
  2. Сегментация экземпляров: выполнение мультиклассовой классификации на уровне пикселей и определение экземпляров каждого класса. Например, модель теперь видит два экземпляра тротуара и два экземпляра растительности.

Поскольку проблема является такой популярной и интригующей, в отрасли существует множество архитектур нейронных сетей для семантической сегментации (последними и наиболее крупными из них являются PSPNet и DeepLab v3 от Google). Для нашей реализации мы решили использовать PSPNet, а также более традиционную модель под названием UNet.

После более глубокого понимания проблемы следующим шагом будет вычисление и хранение данных. Логичный вывод - использовать облако. У нас было два варианта: Amazon Web Services (AWS) и Google Cloud Platform (GCP). Мы выбрали GCP, потому что у него больше бесплатных кредитов, а также легкий доступ к графическому процессору (графические процессоры необходимы для задач глубокого обучения). Чтобы избежать трудоемкого процесса установки драйверов графического процессора, мы создали образ этих драйверов с помощью этой замечательной статьи от Stanford Computer Vision class. Однако при этом устанавливается более старая версия keras. Чтобы исправить это и установить последние версии, мы использовали следующие команды:

псевдоним sudo = ’sudo env PATH = $ PATH’

sudo pip install keras == 2.2.4

Вместе с тем, реальные размеры изображений тоже были проблемой. Поскольку наш набор данных включает множество изображений с высоким разрешением, предварительная обработка данных заняла почти 50% нашего времени! Мы попробовали несколько способов уменьшить размер изображения и ускорить обработку. Первый метод очень простой: мы просто изменили форму изображения до более низкого разрешения. Во втором методе мы увеличили толщину границ объектов на изображении на один пиксель и предоставили эту новую границу в качестве входных данных для сети. Это позволило создать более сегментированные изображения и помочь сети лучше идентифицировать различные объекты.

Теперь перейдем к алгоритмам. Сначала мы попробовали UNets:

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

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

Результаты для UNet:

Ниже представлен результат модели UNet, которую мы построили с нуля. Мы использовали Mean IoU (пересечение по объединению) для оценки нашей модели. Среднее значение IoU - широко используемый показатель для задач семантической сегментации. Он в основном измеряет перекрытие между целевой маской и нашим прогнозным результатом, беря область перекрытия и разделяя область объединения как от наших прогнозируемых, так и от истинных меток. Среднее значение IoU для нашей модели было около 0,49.

Давайте обсудим более современную архитектуру PSPNet:

Большинство методов семантической сегментации имеют схожую архитектуру с сетью кодировщика, за которой следует декодер, но очень немногие учитывают контекст сцены, то есть глобальные априорные значения. Глобальные приоры пригодятся, потому что они придают сцене здравый смысл. Информация из глобальных априорных точек может исправить недостатки других сетей, которые часто ошибочно принимают объекты, имеющие схожие пространственные характеристики (лодка против автомобиля), принадлежащие к категориям путаницы (здание против небоскреба, стена против дома, столб против светофора) или аналогичные совпадения. фоны. Это включено в сеть PSPNet, которая использует FCN плюс средний пул для классификации и сопоставление пространственных пирамид для понимания сцены.

Первый шаг PSPNet, то есть карта характеристик, получается из предварительно обученной модели ResNet, и уровни пирамиды наверху этой карты строятся для разделения ее на разные субрегионы и формирования объединенного представления для разных мест. Эти 4-уровневые объединения пирамид покрывают все, половину и небольшие части изображения для разных мест. Затем мы повышаем дискретизацию карты объектов низкой размерности до того же размера, что и исходная карта объектов, с помощью метода билинейной интерполяции. Затем масштабированные объекты добавляются обратно к исходной карте объектов, и делаются окончательные прогнозы.

Результаты для PSPNet:

В нашем проекте мы использовали веса из предварительно обученной сети PSPNet, полученные из аналогичного набора данных изображений вождения под названием Cityscapes. Поскольку эта модель, как известно, довольно надежна, мы протестировали ее на нескольких наших изображениях, и точность оказалась отличной. В настоящее время мы находимся в процессе внедрения трансферного обучения, но поскольку эта модель является новой и еще не интегрирована с приложением Keras, мы столкнулись со многими проблемами, которые обсуждаются позже в наших задачах. Но на данный момент с текущей моделью мы получаем точность более 90% во всех случаях.

Обзор результатов:

Как видно выше, мы видим разные результаты, полученные как для PSPNet: ›90% точности, так и для UNet: 49% MIoU. Значит, PSPNet лучше?
К сожалению, мы не знаем наверняка. Сложно сравнивать модели, основанные на разных функциях потерь. Возникает вопрос: «Почему мы не можем использовать одни и те же функции потерь для обоих?». Мы совершенно уверены, что вы могли бы, однако, это потребует гораздо более глубокого и более глубокого понимания семантической сегментации, а также PSPNet. Но из этого проекта мы лучше понимаем, как различные модели выполняют семантическую сегментацию, и трудности, возникающие при проблемах сегментации изображений. Это подводит нас к нашей первой из многих проблем, с которыми мы столкнулись в ходе этого проекта:

ЗАДАЧА 1. Начать с попиксельной сегментации для беспилотных автомобилей - все равно что играть в FIFA в легендарном режиме, когда вы даже не знаете, что такое футбол

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

ПРОБЛЕМА 2. Невозможно воспроизвести ЛЮБЫЕ уже установленные результаты из данных скриптов и кода.

Когда мы запускали каждый из найденных ресурсов, мы столкнулись с очень запутанной проблемой, заключающейся в невозможности получить ЛЮБЫЕ результаты, которые мы должны были получить. Когда мы должны были получить прогнозы для изображения тестового набора PSPNet, мы получали бы только черный экран независимо от того, сколько мы тренировали модель; когда мы пытались обучить модель UNet, она обучала все 70 ГБ данных за 5 минут и давала нам 0% потерь (что, очевидно, неверно, если мы на самом деле не гении). Из-за этих ошибок мы просто решили взять одну предварительно обученную модель (PSPNet) и посмотреть, сможем ли мы выполнить переносное обучение на основе наших собственных знаний, а также разработать модель UNet с нуля.

ВЫЗОВ 3: «Подождите, подождите, подождите… PSPNet не в Керасе ????? Как мы должны что-то делать ?! »

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

На протяжении всего процесса мы столкнулись с большим количеством препятствий: некоторые мы смогли перепрыгнуть, а некоторые запутались на вершине, но мы никогда не сдавались. Поскольку мы никогда не сдавались, мы узнали гораздо больше, чем если бы наши модели работали с первого раза. Вот наши основные выводы, которые, по нашему мнению, спасут вас от поломки ноутбука из-за разочарования:
1. Начните с основ.
Оглядываясь назад, можно сказать, что наш подход к решению нашей проблемы был немного ошибочным. Вместо того, чтобы работать с нашим набором данных и строить поверх него модель, мы начали с модели и пошли в обратном направлении, чтобы понять набор данных и то, что мы делаем. Для нас было бы разумнее заняться проблемой обнаружения объектов, а затем попытаться интегрировать попиксельную сегментацию, как только мы разберемся, как работает обнаружение изображений и что необходимо для успеха.
2. Узнайте, как использовать Google Cloud Platform или любую другую облачную платформу.
GCP стал нашим спасителем, когда нам пришлось иметь дело с более чем 90 ГБ данных для этой проблемы. Наши ноутбуки не справились даже с 10 ГБ. Так что будьте осторожны, чем извиняйтесь, и убедитесь, что у вас больше места для хранения и оперативной памяти, чем вам нужно, чтобы не потратить 48 часов на выполнение кода, который в конечном итоге сообщает «Ошибка памяти».

3. Продвинутые модели не всегда подходят для решения всех задач.

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

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

В связи с этим мы настолько увлеклись этим проектом и хотим, чтобы он увенчался успехом, что создали список задач, в которых указаны необходимые шаги в будущем. Во-первых, мы хотим по-прежнему сосредоточиться на модели UNet, созданной с нуля. Поскольку у нас есть наибольший контроль над этой моделью, наша цель - увеличить среднее значение IoU для этой модели. Далее мы хотим выяснить, как полностью реализовать трансферное обучение в нашей модели PSPNet. Это потребует от нас потратить намного больше времени на понимание мелких нюансов, связанных с моделью, и выяснить, как именно получить доступ к весам. Наконец, если мы добьемся успеха в наших двух предыдущих задачах, мы хотим реализовать этот проект с DeepLab версии 3 - новейшей и самой популярной реализацией модели семантической сегментации для беспилотных автомобилей. Это то, что еще не было сделано с нашим текущим набором данных, и мы ожидаем отличных результатов, если нам это удастся.

Ссылка на код: https://github.com/apoorva1995reddy/Semantic-Segmentation---APM

Использованная литература:

  1. Сасанк Чиламкурти. «Руководство по семантической сегментации с глубоким обучением, 2017 г.» Блог Qure.ai, 5 июля 2017 г., blog.qure.ai/notes/semantic segmentation-deep-Learning-review # pspnet, дата обращения 14 декабря 2018 г.
  2. Сборник лекций | Сверточные нейронные сети для визуального распознавания . YouTube, загружено Инженерной школой Стэнфордского университета, 11 августа 2017 г., www.youtube.com/playlist?list=PL3FW7Lu3i5JvHM8ljYj-zLfQRF3EO8sYv.
  3. Хэншуан Чжао, Цзяньпин Ши, Сяоцзюань Ци, Сяоган Ван, Цзяя Цзя. «Сеть анализа сцены пирамиды». Конференция IEEE 2017 г. по компьютерному зрению и распознаванию образов (CVPR), 27 апреля 2017 г., arxiv.org / pdf / 1612.01105.pdf. По состоянию на 14 декабря 2018 г.
  4. Gunjit Khera. 5 способов сохранить удаленные сеансы и процессы SSH после отключения. TecMint, 17 февраля 2016 г., «www.tecmint.com/keep-remote-ssh-sessions-running-after-disconnection/. По состоянию на 14 декабря 2018 г.
  5. Учебное пособие по Google Cloud. CS231n Сверточные нейронные сети для визуального распознавания, cs231n.github.io / gce-tutorial /. По состоянию на 14 декабря 2018 г.
    C4W1L01 Computer Vision. YouTube, загружено Deeplearning.ai 7 ноября 2017 г., www.youtube.com/watch?v=ArPaAX_PhIslist=PLkDaE6sCZn6Gl29AoE31iwdVwSG-
    KnDzF.
  6. Нэнси Гуптон. Наука самоуправляемых автомобилей. Институт Франклина,
    www.fi.edu/science- самоуправляемых автомобилей. По состоянию на 14 декабря 2018 г.
  7. CVPR 2018 WAD Video Segmentation Challenge. Kaggle, июнь 2018 г.,
    www.kaggle.com/c/cvpr-2018-autonomous-driving. По состоянию на 14 декабря 2018 г.
  8. «U-Net: сверточные сети для сегментации биомедицинских изображений». Распознавание образов и обработка изображений, lmb.informatik.uni-freiburg.de/people/ronneber/u-net/. Проверено 14
    декабря 2018 г.
  9. Кевин Мадер. Предварительная обработка данных и сегментация UNet (GPU). Kaggle, март 2018 г., www.kaggle.com/kmader/data-preprocessing-and-unet-segmentation-gpu. По состоянию на 14 декабря 2018 г.
  10. Кевин Мадер. Предварительно обученный PSPNet по сценам вождения. Kaggle, март 2018 г., www.kaggle.com/kmader/pretrained-pspnet-on-driving-scenes/notebook. По состоянию на 14 декабря 2018 г.
  11. Эндрю Рибейро. Восстановление видео. Kaggle, март 2018 г.,
    www.kaggle.com/andrewrib/recovering-the-videos. Доступ 14 декабря 2018 г.
  12. КУАССИ Конан Жан-Клод. WAD-Video-Full-Implementation-AtoZ-TFKeras. Kaggle, март 2018 г., «www.kaggle.com/kjeanclaude/wad-video-full-implementation-atoz-tfkeras Фак, по состоянию на 14 декабря 2018 г.