Итак, вот мы и подошли к последнему проекту перед окончательным проектом Udacity Self-Driving Car Nanodegree. Я так взволнован тем, что я все еще на доске и более-менее успеваю с сабмишнами, но с другой стороны грустно, потому что курс подходит к концу, и я уже привык к его мотивирующему ритму. Без лишних слов давайте перейдем к интересному и сложному проекту о семантической сегментации.
Таким образом, было два пути завершения этого этапа в наностепени: семантическая сегментация или функциональная безопасность. Я чувствовал, что первый вариант мне ближе, так как он был связан с областью глубокого обучения, что давало еще одну возможность провести несколько часов руками над тензорным потоком.
Уроки, предоставленные Udacity совместно со специалистами Nvidia, также были содержательными и дали хороший обзор существующих решений в этой области. На продвинутых уроках глубокого обучения мы прошлись по каноническим моделям, таким как VGG или ResNet, и сосредоточились на более адекватном решении этой проблемы — полностью сверточных сетях. Мы также узнали, как ускорить процесс обучения (оптимизация логического вывода), используя такие методы, как слияние, квантование и снижение точности.
Введение
Итак, давайте проясним, что такое на самом деле семантическая сегментация. В простом определении это задача расширенного понимания объектов на изображении (понимание на уровне пикселей) и кластеризации частей изображения вместе с другими пикселями, принадлежащими одному и тому же объекту. Визуальный результат этого процесса раньше представлялся в виде отдельных цветных областей, как на изображении ниже.
Вы можете рассматривать это как более продвинутое распознавание объектов по сравнению с ограничивающими прямоугольниками, используемыми в проекте по обнаружению транспортных средств в термине 1. Вы, наверное, уже видите преимущества, верно? Семантическая сегментация дает машине возможность более точно понимать сцену и различать объекты, измерять их, а затем, возможно, предсказывать их поведение и корректировать свое собственное поведение и планирование. много информации более высокого уровня.
В проекте нам нужно было кластеризовать только те пиксели, которые были проезжей частью дороги.
Настройка разработки
Как всегда, у нас был начальный шаблон проекта, состоящий из базовых частей проекта, чтобы больше сосредоточиться на фактическом решении для глубокого обучения, а не думать, как начать и почему именно так.
Набор данных, используемый в проекте, был взят из набора данных Kitti Road — мне пришлось зарегистрироваться, чтобы получить собственную копию набора данных. Всего было 1550 изображений для обучения и тестирования. Это небольшое число, но в сочетании с более продвинутой сверточной сетью это создавало большую нагрузку на мою машину. Вместе с набором данных была также поставлена модель VGG весом 537 МБ — эта модель позже использовалась как база для моего FCN.
Сделав несколько итераций разработки кода, я вскоре понял, что моя машина слишком слаба для этого проекта, а процессора недостаточно, чтобы закончить его вовремя и повеселиться, проверяя различные решения. После некоторых трудных времен с моей машиной AWS ранее (от которой я решил отказаться после последнего проекта глубокого обучения), я решил, наконец, настроить собственную машину в своем офисе в Polbyte. Udacity, большое спасибо за то, что вынудили меня сделать это, это было отличное решение! Так что да, мне нужно было определиться с железом — Ник Кондо, спасибо за вашу статью, и да, мне пришлось пройти через сложную настройку, но на этот раз мне повезло, потому что моя установка заработала после первой установки — на этот раз Вивек Ядав спас мой день (дни) с своей статьей. Я не планировал этот переезд, и мне пришлось сделать все это в дороге всего за несколько дней — надеюсь, рядом всегда есть геймеры, и они часто меняют свое снаряжение, поэтому вы всегда можете получить что-то хорошее за полцены. С этого момента моя установка была завершена.
Архитектура
Таким образом, как было предложено в ходе курса и как выяснилось позже после прочтения некоторых статей (см. ссылки в конце этой статьи), полностью сверточная сетевая архитектура потенциально была одним из лучших решений проблемы.
Так почему же эта архитектура так хороша для этой задачи и в чем тут хитрость. Во-первых, он основан на сверточной нейронной сети, которая в настоящее время все еще находится на переднем крае в случае классификации образов изображений — спасибо Yann LeCun. Во-вторых, в сообществе существует небольшая путаница в отношении различий между CNN и FCN. Здесь у нас есть 3 специальных метода, которые использует FCN:
- замена полносвязных слоев (которые не сохраняют пространственную информацию и ограничивают входные изображения одним определенным размером) на сверточные слои с размером ядра свертки 1x1
- повышающая дискретизация за счет использования транспонированных сверточных слоев
- пропускать соединения (слои)
Я настоятельно рекомендую вам прочитать всю статью о FCN — Полностью сверточные сети для семантической сегментации.
После краткого ознакомления с архитектурой нейронной сети VGG16 и некоторых реализаций кода FCN с использованием тензорного потока я начал свою собственную работу по реализации FCN. Я загрузил модель VGG16 с помощью Tensorflow и добавил пропущенные слои, добавив деконволюцию или транспонированные слои с шагами поверх модели VGG. Я использовал AdamOptimizer для этапа оптимизации со скоростью обучения 0,0001. Было 2 класса классификации — пиксель принадлежит проезжей части дороги или не принадлежит ей. Обучение проводилось партиями по 1 из-за большого использования памяти FCN.
Результаты
После многих итераций я добился удовлетворительных результатов — с потерей обучения за 15 эпох на уровне 0,02. Вот несколько изображений результатов из обученной сети:
Вывод
Семантическая сегментация — нетривиальная тема, но с помощью современных инструментов и разработанных архитектур мы можем создавать решения для реальных приложений всего за 200 строк кода — потрясающе!
Ссылки
- Источник статьи: http://sznur.com/semantic-segmentation-using-full-convolutional-network
- Исходный код: GitHub
- https://people.eecs.berkeley.edu/~jonlong/long_shelhamer_fcn.pdf
- http://blog.qure.ai/notes/semantic-segmentation-deep-learning-review
- https://www.facebook.com/yann.lecun/posts/10152820758292143
- http://www.robots.ox.ac.uk/~vgg/
- https://arxiv.org/pdf/1611.08408.pdf