Итак, вот мы и подошли к последнему проекту перед окончательным проектом 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 строк кода — потрясающе!

Ссылки