Поиск по сайту Поиск

Простой алгоритм распознавания дорожной разметки

Контроль полосы движения — одна из наиболее приоритетных задач систем помощи водителю и автономных автомобилей. Они следят за движением машины по выбранному маршруту и предупреждают о возможном съезде с заданного пути. В этой статье мы представим простой метод распознавания дорожной разметки с помощью Python и OpenCV.

Конвейер

Чтобы распознать полосы разметки необходимо:

  1. Преобразовать исходное изображение в  grayscale.
  2. Затемнить полученное изображение (это помогает уменьшить контраст от обесцвеченных участков дороги).
  3. Преобразовать исходное изображение в  цветовое пространство HLS (Hue, Lightness, Saturation — тон, свет, насыщенность).
  4. Изолировать жёлтый цвет из HLS для получения маски (для жёлтой разметки).
  5. Изолировать  белый цвет из HLS (для белой разметки).
  6. Выполнить побитовое «ИЛИ» жёлтой и белой масок для получения общей маски.
  7. Выполнить побитовое «И» маски и затемнённого изображения.
  8. Применить Гауссово размытие.
  9. Применить детектор границ Canny (пороги устанавливаются методом проб и ошибок).
  10. Определить область интереса (помогает отсеять нежелательные края, обнаруженные детектором Canny).
  11. Получить линии Хафа.
  12. Объединить и экстраполировать линии Хафа; отобразить их на исходном изображении.

Исходные тестовые изображения

Преобразование в оттенки серого

Это поможет увеличить контраст разметки по отношению к дороге, чтобы потом было легче выделить жёлтые и белые полосы.

Затемнение

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

Преобразование в цветовое пространство HLS

Исходные RGB-изображения переводятся в пространство HLS. По сравнению с HSV (Hue, Saturation, Value — тон, насыщенность, значение), HLS помогает получить лучший цветовой контраст разметки и дороги. Впоследствии это поможет выделить нужные цвета для определения полос движения.


RGB против HSV и HLS

Выделение цвета

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

Для жёлтой маски:

— Использовались значения оттенка между 10 и 40.

— Установлена более высокая насыщенность (100–255), чтобы отфильтровать жёлтый цвет земли и холмов.

Для белой маски:

— Установлено более высокое значение яркости (200–255).

После этого мы выполняем операцию побитового «ИЛИ» обеих масок, чтобы скомбинировать их.

На снимках ниже показан результат побитового «И» между комбинированной маской и затемнённым изображением.

Гауссово размытие

Размытие (или сглаживание) по Гауссу — это этап предварительной обработки для уменьшения шума. Мы удаляем лишние края на изображении и оставляем только наиболее заметные.

Для размытия с помощью GaussianBlur из OpenCV необходимо указать размер ядра (нечётное значение). Испробовав несколько вариантов, мы выбрали 7.

Применение детектора границ Canny

Теперь к размытым снимкам применяется детектор Canny. Canny Edge Detection — алгоритм, который обнаруживает края на основе изменения градиента. Хотя первым его шагом по умолчанию является сглаживание изображения с размером ядра 5, мы всё равно используем явное размытие по Гауссу на предыдущем этапе. Другие шаги детектора включают в себя:

— нахождение градиента интенсивности изображения;

— подавление максимумов;

— пороговый гистерезис.

Выделение области интереса

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

Обратите внимание, что координата [0, 0] находится в левом верхнем углу, номера строк увеличиваются сверху вниз, а столбцов — слева направо.

Предполагается, что камера остаётся неподвижной, а полосы — ровными, поэтому мы можем «угадать» интересующую область.

Обнаружение линий преобразования Хафа

Преобразование Хафа — способ извлечения линии из изображения. Это можно сделать, представив линии в виде параметризованных точек, а точки — в виде линий/синусоид (в зависимости от декартовой/полярной систем координат). Если несколько линий или синусоид пересекаются друг с другом в одной точке, мы можем сделать вывод, что они относятся к одной линии на изображении.

После обнаружения линий Хафа в области интереса мы отрисовываем их на оригинальных снимках.

Экстраполяция линий Хафа

На предыдущем изображении видно, что разметка отобразилась не полностью. Нам хотелось бы её дополнить. Для этого сначала нужно определить левую и правую полосу:

левая полоса: если мы увеличим координаты столбцов, то координаты строк уменьшатся (отрицательный градиент)

правая полоса: если увеличить координаты столбцов, координаты строк тоже увеличатся (положительный градиент)

— будем игнорировать вертикальные линии.

После определения левой и правой полос мы экстраполируем их:

  1. Если для одной полосы обнаружено несколько параллельных линий, мы усредняем строки.
  2. Если полоса состоит из частично обнаруженных линий, мы объединяем их.

Применение конвейера к видео

Теперь давайте протестируем наш алгоритм на записи с видеорегистратора.

Он неплохо работает для прямых полос разметки:

Но не очень хорошо справляется с искривлениями:

Недостатки

— Обнаружение прямых линий Хафа не очень хорошо работает для изогнутой дороги/полосы.

— Параметры устанавливаются методом подбора. Область интереса предполагает, что камера остаётся неподвижной, а полосы — ровными. Таким образом, для определения вершин многоугольника требуется либо «угадывание», либо хардкодинг.

— На дорогах без разметки алгоритм не будет работать.

Будущие улучшения

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

— Даже имея в наличии информацию из предыдущих кадров, усреднять её — не всегда хорошая стратегия. Лучше использовать средневзвешенные или приоритетные значения.

Исходный код

Исходный код доступен на GitHub. В проекте доступны два каталога: CarND-LaneLines-Р1 и CarND-Advanced-Lane-Lines. В первом находится проект конвейера, описанного в этой статье (скрипт P1.ipynb). Второй каталог предлагает улучшенный вариант алгоритма, в котором используется калибровка камеры и обнаружение кривых линий разметки. Вы можете протестировать один из них (или оба), используя свои варианты настройки параметров, и предложить улучшения.

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

С оригинальной статьёй можно ознакомиться на портале towardsdatascience.com.


Domains weekly: самые опасные зоны, проблемы доменов для взрослых и недоступный Whois

Domains weekly: самые опасные зоны, проблемы доменов для взрослых и недоступный Whois

В сегодняшней подборке расскажем, в каких доменных зонах больше всего ботнетов, как коронавирус повлиял на индустрию для взрослых, что стало...
Read More
Поведенческие факторы ранжирования и их влияние на SEO: взгляд изнутри

Поведенческие факторы ранжирования и их влияние на SEO: взгляд изнутри

Редакция блога продолжает цикл образовательных SEO-статей. Сегодня вместе с SEO-специалистом REG.RU Евгением Сметаниным мы расскажем, что такое поведенческие факторы ранжирования,...
Read More
Безвозмездно, то есть даром: что можно получить бесплатно в REG.RU

Безвозмездно, то есть даром: что можно получить бесплатно в REG.RU

В REG.RU мы постоянно работаем над развитием и улучшением сервисов, и на первое место всегда ставим заботу о клиентах. У...
Read More
Domains weekly: неудавшийся захват Domovoy.ru, гранты от ICANN и домен, приносящий богатство

Domains weekly: неудавшийся захват Domovoy.ru, гранты от ICANN и домен, приносящий богатство

Сегодня поделимся новостями о том, как сеть супермаркетов не смогла заполучить желаемый домен, почему в Китае ценятся числовые адреса и...
Read More
Шпаргалка по Python для Django

Шпаргалка по Python для Django

В Python очень много полезных функций, библиотек и других элементов, перечислить которые в одном материале очень сложно. Мы поделимся базовой...
Read More
Domains weekly: безопасное инвестирование, открытие зоны .NEW и блокчейн‑домены

Domains weekly: безопасное инвестирование, открытие зоны .NEW и блокчейн‑домены

Дайджест домейнера с новостями о безопасном способе инвестирования в домены, политике ICANN в отношении доменных споров, открытии общедоступной регистрации .NEW...
Read More
Как подготовить и провести вебинар на любую тему: стратегия из 8 шагов от REG.RU

Как подготовить и провести вебинар на любую тему: стратегия из 8 шагов от REG.RU

Харизматичный спикер, интересная тема, качественная презентация, внимательные слушатели — что же ещё нужно для хорошего вебинара? В этом материале мы...
Read More
Domains weekly: популярные ccTLDs в России, 17‑летняя ошибка Microsoft и уязвимости аукционных доменов

Domains weekly: популярные ccTLDs в России, 17‑летняя ошибка Microsoft и уязвимости аукционных доменов

Сегодня расскажем о том, как изменился рынок доменных имён в 2019 году, какие национальные домены кроме .RU и .РФ используют...
Read More
10 фишек Облачных серверов REG.RU

10 фишек Облачных серверов REG.RU

Если вы выбрали для своего проекта VPS, то наверняка знаете об их особенностях. Но что, если мы скажем, что Облачные...
Read More
Настраиваем шифрование жесткого диска, чтобы избежать утечек данных

Настраиваем шифрование жесткого диска, чтобы избежать утечек данных

В каждой компании есть сотрудники, которые хранят на рабочем компьютере конфиденциальную информацию, и её утечка может оказаться катастрофой. Среди таких...
Read More