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

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

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


Победить конкурентов и увеличить выручку: кейс горизонтального масштабирования клиники

Рассказываем путь развития стоматологической клиники к повышению выручки на 40% с сохранением рентабельности.
Read More

Руководство по CI/CD в GitLab для новичка

В статье разбираем, как устроена практика CI/CD, какие у нее нюансы и преимущества использования. А также расписываем пошаговый процесс использования...
Read More

Что такое GitLab, кому нужен, как пользоваться

GitLab — платформа для совместной разработки. Она позволяет командам организовывать свои процессы от планирования до мониторинга и может работать в...
Read More

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

Рассказываем, как работает теория поколений и чем она оказывается полезной для маркетинга в малом и среднем бизнесе.
Read More

Как привлечь новую аудиторию и победить конкурентов. 3 кейса-стратегии

На примере трёх кейсов разбираем трансформацию продуктов на основе методологии jobs-to-be-done.
Read More

Что стоит автоматизировать в бизнесе с самого начала

Экономить силы, время и деньги – это база, а не привилегия. Автоматизируйте процессы и уделяйте внимание стратегическим задачам.
Read More

Как составить бизнес-план: пошаговая инструкция

Бизнес-план — стратегия развития проекта, без которой не стоит начинать ни один бизнес. Рассказываем, как правильно его составить.
Read More

Сильная презентация для инвесторов: от содержания до выступления

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

Дёшево и эффективно: как малому бизнесу продвигать свой сайт

Как выделиться среди конкурентов и получить внимание потенциальных клиентов. Бюджетные методы продвижения сайта – в этом обзоре.  
Read More

Как перевести бизнес в онлайн: 7 шагов

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