Николай Уаранчай, Михир Дешпанде, Шрикар Ланка, Маскан Агарвал, Анушка Айер

Обнаружение полосы движения для автономного вождения было одной из самых больших проблем в системах предупреждения об отклонении от полосы движения (LDWS). Традиционные методы обработки изображений, такие как обнаружение краев Канни, правдоподобие формы изображения, B-Snake и т. д., хорошо работали, когда областью обнаружения полосы движения было соответствие линиям вдоль прямых участков дорог на автомагистралях, но терпели неудачу, когда в более общих обстоятельствах требовались LDWS. например, городские пейзажи с кривыми дорогами, частично заблокированными видами или разграничением разных типов полос движения. С появлением сверточных нейронных сетей и концепций, таких как паноптическая сегментация и сегментация экземпляров, а также аппаратной архитектуры, которая могла бы их поддерживать, создание высоконадежных моделей для целей обнаружения дорожек внезапно стало доступным.

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

Чтобы исследовать пространство методов обработки изображений, мы попробовали свои силы в реализации Canny Edge Detection.

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

Изучив традиционные методы обработки изображений, мы хотели развернуть модель сверточной нейронной сети и, следовательно, изучить более надежный подход. Мы решили подойти к развертыванию тремя способами —

а) Протестируйте модель, используя только предварительно обученные веса
б) Обучите модель с нуля на нашем наборе данных и посмотрите на производительность, взвешенную по времени обучения
в) Обучите модель поверх предварительно обученных весов. -тренированные веса в нашем наборе данных и сравните их с эффективностью двух предыдущих подходов (передача обучения)

Прежде чем двигаться дальше, мы столкнулись с двумя основными вопросами:

  1. Какую из сотен доступных моделей мы выбрали для определения полосы движения?
  2. Какой набор данных мы используем для обучения этой модели?

Чтобы ответить на первый вопрос, мы рассмотрели множество различных предварительно обученных моделей, доступных для публичного использования, таких как ResNet, YOLOv7, Faster RCNN, Очень глубокие сверточные сети для крупномасштабного распознавания изображений VGG-16 (мы использовали часть этой модели, поскольку вы узнаете далее в статье). Мы хотели идентифицировать каждое появление полосы на изображении, где полосы могут быть изогнутыми, частично загороженными и т. д. На изображении может быть одна полоса, параллельная автомобилю, а другая полоса может быть перпендикулярной (например, на перекрестке). Точное расположение и направление этих дорожек может быть трудно определить с помощью традиционных ограничивающих рамок, используемых CNN для обнаружения/классификации объектов. Поэтому мы решили рассмотреть модели, реализующие концепцию сегментации экземпляров.

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

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

В то время как многие из популярных моделей с открытым исходным кодом, такие как YOLOv7, ResNet, имели некоторые возможности для сегментации экземпляров, модель, которую мы выбрали для реализации, была LaneNet, как описано в документе «На пути к сквозному обнаружению дорожек: подход к сегментации экземпляров». Дэви Невен, Берт Де Брабандере, Стаматиос Георгулис, Марк Проэсманс, Люк Ван Гул (подробнее об этом далее в статье). Это многозадачная сеть, в которой используются кодировщики для извлечения признаков, а также комбинация масок бинарной сегментации и вложений с использованием однократного метода, основанного на дистанционном метрическом обучении, предложенном Де Брабандере, который можно легко интегрировать со стандартными сетями прямой связи и который специально разработан для приложений реального времени.

После выбора модели LaneNet, которую мы хотели реализовать, нам нужно было выбрать подходящий набор данных для обучения модели.

Набор данных

Мы выбрали комплексный набор данных Berkeley Deep Drive (BDD100K) для обучения и тестирования модели LaneNet. Berkeley Deep Drive (BDD100K) — одна из крупнейших открытых баз данных, предназначенная для разработки алгоритмов распознавания изображений, таких как определение полосы движения и управляемая зона для автономного вождения. Это коллекция из 100 000 видеороликов о вождении (или изображений с 10-й секунды каждого видео), собранных из более чем 50 000 поездок. Каждое видео длится 40 секунд и содержит более 100 миллионов кадров. Что делает его очень полезным, так это разнообразные сцены с городских улиц, жилых районов и автомагистралей, а также различные погодные условия в разное время дня, которые он охватывает.

Для нашей цели мы выбрали обработку изображений 100 000, поскольку массивный набор данных 100 000 видео объемом 1,5 ТБ был невозможен для масштаба этого проекта. Мы использовали https://www.bdd100k.com/ для загрузки набора данных по академической лицензии.

100 тыс. изображений были дополнительно разделены на обучающие (70 тыс.), проверочные (10 тыс.) и тестовые (20 тыс.) наборы данных. Набор данных поезда и проверки дополнительно сопровождался соответствующими файлами меток JSON, которые содержали такую ​​информацию, как различные объекты и их ограничивающие рамки, время суток, погодные условия и, что наиболее важно, полигоны, разграничивающие полосы движения и проезжие части. Мы использовали это для фильтрации изображений с проезжими участками и полосами движения из набора данных поезда и проверки, что было важно для нашей цели обнаружения полосы движения.

Предварительная обработка данных

В то время как наш набор данных содержал в общей сложности 80 тысяч помеченных изображений, подсчеты в категориях полос и проезжей части выше из-за того, что на данном изображении с пометками может быть более одной полосы. Следовательно, если изображение содержит 5 дорожек, количество будет равно 5 для одного и того же. Таким образом, мы наблюдаем в общей сложности 65 тысяч изображений в нашем обучающем наборе и примерно 9000 изображений в нашем проверочном наборе, содержащем как полосы движения, так и проезжие области.

После того, как мы выбрали набор данных и обработали его по мере необходимости, мы могли перейти к фактической реализации наших моделей.

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

1) Обнаружение хитрых краев

Первым подходом, который мы рассмотрели, был простой метод обработки изображений под названием Canny Edge Detection.
Наш набор данных содержит изображения, которые в основном сняты с точки зрения водителя, и полосы на дороге хорошо видны. Поэтому, прежде чем двигаться вперед со сложной нейронной сетью для определения полос, мы рассмотрели подход, основанный на обработке изображений, для определения полос.
Мы использовали обнаружение границ, чтобы идентифицировать края на нашем изображении, а затем попытались отфильтровать полосы. оттуда. В частности, мы использовали оператор, известный как детектор краев Канни, для обнаружения краев.
Идея состоит в том, чтобы определить те области изображения, где градиент интенсивности изменяется больше всего.

Методология:

Сначала мы читаем изображение в формате RGB. Дорожки в нашем наборе данных имеют желтый и белый цвета, поэтому мы хотели выбрать только те части изображения. Для этого мы сначала преобразовали изображение в цветовое пространство HLS (оттенок, свет и насыщенность) из цветового пространства RGB. Это упростило нам определение желтых и белых областей на изображении. Мы создали две маски — белую и желтую на изображении и делаем побитовую — и, чтобы получить и желтые, и белые пиксели на нашем изображении. Чтобы найти края, нам нужно было найти области, в которых градиент интенсивности максимален, и способ максимизировать это изменение состоит в том, чтобы иметь только белые и черные пиксели различной интенсивности. Следовательно, мы преобразовали изображение только с желтыми и белыми пикселями в пространство в оттенках серого. Края изображения чувствительны к шуму и могут затруднить обнаружение детектором краев изображения. Следовательно, после преобразования изображения в изображение в градациях серого мы пропустили изображение через фильтр Гаусса, чтобы сделать его гладким.

Затем мы сгладили изображение и нашли следующие градиенты:

После того, как все градиенты краев рассчитаны, мы нашли локальные максимумы в определенной окрестности и удалили оставшиеся пиксели. Если значение градиента края ниже нижнего порога, оно отклоняется. Если значение градиента находится между двумя порогами, то оно принимается только в том случае, если оно связано с пикселем, значение которого выше верхнего порога.

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

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

2) LaneNet — подход к сегментации экземпляров

Первичные методы обработки изображений, которые мы рассматривали, были слишком ограничены в своих возможностях, чтобы их можно было использовать в реальном сценарии. Мы можем обратиться к гораздо более надежному решению — сверточной нейронной сети. Как мы обсуждали ранее, простые сверточные сети с кодировщиком, декодером и глубокими нейронными сетями не будут работать для сегментации экземпляра. Мы приняли модель LaneNet, основанную на сегментации экземпляров с двумя ветвями, основанную на сверточной нейронной сети, изложенную в статье На пути к сквозному обнаружению дорожек: подход к сегментации экземпляров Дэви Невена, Берта Де Брабандере, Стаматиоса Георгулиса, Марк Проэсманс, Люк Ван Гул (прочитайте, если у вас есть время).

Вот выдержка из реферата статьи -

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

Модель рассматривает каждую дорожку как отдельный экземпляр и идентифицирует несколько вхождений каждой дорожки на изображении. Давайте посмотрим на общую структуру модели LaneNet —

Давайте кратко попробуем понять принципы, лежащие в основе этой модели, а затем рассмотрим реализованные нами подходы.

Кодер

Первым этапом, как и в любой CNN, является кодер. Это работает как этап извлечения признаков. По умолчанию модель LaneNet использует тот же кодировщик, что и VGG16 (который мы использовали), но дает нам возможность использовать кодировщик BiseNetv2 или собственный кодировщик.

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

Отделение сегментации

Теперь самое интересное. После этапа кодирования модель разбивается на две индивидуально обученные ветви. Каждая из этих ветвей выполняет разные функции. Начнем с ветки сегментации!

Ветке сегментации поручено создать маску сегментации из изображения. Во-первых, он определяет, какие пиксели принадлежат дорожке, а какие нет. Затем он присваивает значение (255,255,255) пикселям, принадлежащим дорожке, и (0,0,0) пикселям, не принадлежащим дорожке. Он эффективно создает черно-белую маску, идентифицирующую пиксели, относящиеся к дорожке.

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

Отделение встраивания

Эта ветвь отображает или встраивает каждый пиксель изображения в более высокое измерение. Это преобразование выполняется таким образом, чтобы все пиксели, принадлежащие дорожке, находились в относительной близости друг к другу. В сочетании с информацией из маски бинарной сегментации (удалить все пиксели, не принадлежащие дорожкам, и оставить только пиксели, принадлежащие дорожкам), у нас есть кластеры точек в более высоком измерении, где каждый кластер содержит пиксели из определенного экземпляра. полосы на изображении.

Затем мы можем запустить базовый алгоритм кластеризации, идентифицировать кластеры и назначить каждый пиксель кластеру, где кластер соответствует полосе на изображении. Следовательно, у нас есть каждый пиксель экземпляра полосы, и Bada Bing Bada Boom мы идентифицировали отдельные экземпляры дорожек в изображении на выходе.

Это чрезмерное упрощение дает вам базовое представление о том, как работает модель.

Теперь давайте посмотрим на подходы, которые мы использовали для реализации модели.

Первый подход — бег с заранее подготовленными весами

Что, если лучшей моделью будет та, с которой мы начали? Бритва Оккама, да? Хотя жизнь не была к нам так добра, мы хотели посмотреть, как модель будет работать с весами по умолчанию. Обратите внимание, что модель ранее обучалась на наборе данных tuSimple, который представляет собой набор изображений, сделанных на шоссе в условиях яркого солнечного света. Однако набор данных BDD100K содержит изображения городских пейзажей в различных погодных условиях, в ночное время и т. д.

Мы загрузили предварительно обученные веса с официальной страницы реализации GitHub и протестировали производительность. Насколько хорошо это получилось?

Да, примерно так плохо, как вы ожидали. Когда мы протестировали его на изображении из набора данных tusimple (в образце), бинарная маска сегментации была довольно хорошо сформирована, а окончательная маска сегментации экземпляра идеально идентифицировала каждую дорожку. Однако, когда мы попытались протестировать его на изображении из набора данных BDD100K, мы сначала хотели протестировать его на изображении, похожем на набор данных tusimple. Хотя он показал хорошие результаты, обе маски имеют некоторые проблемы с неправильной классификацией (часть эстакады была идентифицирована как полоса движения). Когда мы тестируем его на изображении, полностью взятом из выборки (ночной городской пейзаж), модель не попадает в цель и не может идентифицировать какую-либо часть переулка.

Мы явно не можем использовать это как окончательную модель. Итак, давайте посмотрим на наш следующий подход — насколько хорошо работает модель, когда вы обучаете ее с нуля на наборе данных BDD100K?

Второй подход: обучение с нуля

Мы проверяем, нужны ли предварительно обученные веса. Поэтому мы обучили модель с нуля, не используя предварительно обученные веса, и проверили производительность.

Мы использовали следующие параметры обучения:

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

В качестве показателя потерь используется разреженная энтропия SoftMax. Давайте посмотрим, как меняются точность обучения и потери по отношению к нет. эпох (мы использовали tensorboard для мониторинга статистики) -

Мы наблюдаем точность ~ 0,35 и потерю ~ 0,02 после обучения модели в течение 250 эпох (14,5 часов). Это может показаться низким, но давайте посмотрим, насколько хорошо модель обнаружила дорожки в тестовых данных.

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

Третий подход: трансферное обучение

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

Ниже показано сравнение точности предварительно обученной модели и модели трансфертного обучения до 50 эпох.

Мы могли видеть, что выступления были очень похожи к концу. Модель трансферного обучения работала лучше (более высокая точность) в начальные эпохи, чего и следовало ожидать. Однако несоответствие между их точностью уменьшилось как никакое. эпох возросло. Это может быть связано с множеством причин -
1) Существовала погрешность в предварительно обученных весах, которая постепенно устранялась по мере обучения на наборе данных BDD100K.
2) Изменение погодных условий. , городские пейзажи, частично загороженные полосы движения и т. д. не оказывали столь сильного влияния на параметры модели (т. е. набор данных, на котором она ранее обучалась, и набор данных BDD100K не сильно перекрывались).

Резюме и заключение

Мы изучили различные подходы, принятые для обнаружения полосы движения в системах предупреждения об отклонении от полосы движения (LDWS), начиная с простых методов обработки изображений, таких как обнаружение Canny Edge. Извлекая уроки из этих методов, мы внедрили модель CNN LaneNet на основе сегментации экземпляров, чтобы создать более надежную модель для обнаружения полос движения. Мы исследовали три разных подхода:
1) только с использованием предварительно обученных весов
2) обучение с нуля
3) перенос обучения
Мы заметили, что модель, развернутая с предварительно тренированные веса были очень восприимчивы к выбросам. Он не смог обнаружить ни одного экземпляра полос на ночном изображении городского пейзажа. При обучении с нуля общее время обучения 14,5 часов с использованием общих ресурсов графического процессора, развернутых в Google Colab, привело к точности ~ 0,35 (функция потерь была SoftMax Sparse Entropy) с потерями ~ 0,02. Несмотря на то, что точность может показаться низкой, мы увидели, что модель идентифицировала полосы на тестовых изображениях с разумной ошибкой.
Однако третий подход к трансфертному обучению показал незначительное увеличение точности по сравнению с усилиями, затраченными на его предварительное обучение. Это был бы предпочтительный метод, если требуется быстрое повышение точности вашей модели, и даже одна эпоха требует больших вычислительных ресурсов. Однако если у вас есть ресурсы для запуска сотен или тысяч эпох, точность обучения с нуля и модель трансферного обучения в конечном итоге останутся на том же уровне.

Будущая сфера

В этом проекте мы протестировали только одну модель сегментации экземпляров. Однако, учитывая множество предварительно обученных моделей обнаружения объектов, мы хотели бы проверить производительность набора данных BDD100K на большем количестве из них. Например. YOLOv7 — одна из самых больших моделей обнаружения объектов, обученных на наборе данных MS COCO. Хотя основной целью этой модели является обнаружение объектов, ее можно модифицировать для выполнения паноптической сегментации или сегментации экземпляров. Использование таких моделей в сочетании с LaneNet также может стать возможностью в будущем.

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

В целом, мы довольно много узнали о различных методах обработки изображений, сверточных нейронных сетях и сегментации изображений. Пожалуйста, не стесняйтесь обращаться к нам, если у вас есть какие-либо вопросы о проекте!

Рекомендации

Ссылка на Google Colab для Canny Edge Detection
Github Code для реализации LaneNet

Документ LaneNet — https://arxiv.org/abs/1802.05591

Ссылки на репозитории Github -
https://github.com/shirokunet/lane_segmentation/tree/4ac7b75c27d35415f01b295abf495dc02fea9480
https://github.com/MaybeShewill-CV/lanenet-lane-detection

https://github.com/naokishibuya/car-finding-lane-lines/blob/master/Finding_Lane_Lines_on_the_Road.ipynb

Статьи и публикации -

https://journals.sagepub.com/doi/full/10.1177/17298814211008752

https://ieeexplore.ieee.org/document/7906248

https://www.researchgate.net/publication/316450089_Lane_Departure_detection_using_image_processing_techniques#:~:text=These%20video%20systems%20use%20image,boundary%20lines%20using%20artificial%20vision.

https://engineering.matterport.com/splash-of-color-instance-segmentation-with-mask-r-cnn-and-tensorflow-7c761e238b46







https://en.wikipedia.org/wiki/Canny_edge_detector



«Семантическая сегментация: полное руководство
Автор(ы): Гаурав Шарма Семантическая сегментация: полное руководство Изображение: автор В компьютерном зрении семантика…towardsai. сеть"