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

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

Контроль полосы движения — одна из наиболее приоритетных задач систем помощи водителю и автономных автомобилей. Они следят за движением машины по выбранному маршруту и предупреждают о возможном съезде с заданного пути. В этой статье мы представим простой метод распознавания дорожной разметки с помощью 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.

Преобразование текста в речь с помощью нейросети

Преобразование текста в речь с помощью нейросети

Для преобразования текста в речь (Text To Speech, TTS) большинству систем необходимы качественные образцы голоса, согласованные фонемы и лингвистические признаки....
Read More
Запасайтесь попкорном: краткий обзор доменов в сериалах

Запасайтесь попкорном: краткий обзор доменов в сериалах

Как и в реальном мире, герои сериалов пользуются Интернетом. А где Интернет — там сайты и домены. Некоторые продюсеры дают возможность...
Read More
Хакатон на РИФ: персональные данные под защитой

Хакатон на РИФ: персональные данные под защитой

РИФ.Хакатон впервые проходил на площадке Российского интернет-форума 2019. В течение 48 часов команды работали над проектами, которые должны решить проблемы...
Read More
Реалистичные пейзажи из рисунков от NVIDIA: глубокое погружение

Реалистичные пейзажи из рисунков от NVIDIA: глубокое погружение

Многие уже слышали про нейросеть GauGAN от NVIDIA, которая умеет создавать потрясающие пейзажи из примитивных набросков. Мы решили детально разобраться,...
Read More
Простой алгоритм распознавания дорожной разметки

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

Контроль полосы движения — одна из наиболее приоритетных задач систем помощи водителю и автономных автомобилей. Они следят за движением машины...
Read More
Как не потерять домен: пошаговая инструкция

Как не потерять домен: пошаговая инструкция

Прим. ред: Наши друзья из компании Онлайн Патент подготовили инструкцию о том, как юридически защитить свой домен. Изучайте советы и...
Read More
Как ИИ меняет медицину

Как ИИ меняет медицину

Медицина постоянно развивается: появляются новые препараты и способы лечения, выращиваются искусственные органы и ткани. Нейронные сети в развитии здравоохранения играют...
Read More
Глубокое обучение и безопасность полётов

Глубокое обучение и безопасность полётов

Статистика несчастных случаев показывает, что около половины авиакатастроф происходят в конце полёта — во время захода на посадку и самой...
Read More
Серьёзный бизнес или развлечения? Для чего клиенты REG.RU создают сайты

Серьёзный бизнес или развлечения? Для чего клиенты REG.RU создают сайты

Привет читателям нашего блога! Сегодня в жизни REG.RU очень важное событие — компании исполняется 13 лет. И этот год будет точно...
Read More
Панды в Премьер-лиге

Панды в Премьер-лиге

Очень жаль, но панды не играют в футбол. Поэтому в этой статье речь пойдёт о возможностях библиотеки “Pandas”, название которой...
Read More