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

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

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

Улучшаем изображение с плохим освещением с помощью нейросети

Улучшаем изображение с плохим освещением с помощью нейросети

Что такое фотография с точки зрения физики? Это отпечаток, возникающий на светочувствительной матрице при отражении от объекта источника света: солнца,...
Read More
Как ускорить Data Science с помощью GPU

Как ускорить Data Science с помощью GPU

Аналитикам данных нужны вычислительные мощности. Обрабатываете ли вы большой датасет в Pandas или перемножаете множество матриц с Numpy — вам...
Read More
Стэнфордский курс: лекция 5. Свёрточные нейронные сети

Стэнфордский курс: лекция 5. Свёрточные нейронные сети

На прошлой лекции мы узнали, как метод обратного распространения ошибки помогает находить градиент для сложных функций, а также провели параллели...
Read More
Джон Макафи: создатель антивируса McAfee и один из самых неоднозначных IT-предпринимателей XX века

Джон Макафи: создатель антивируса McAfee и один из самых неоднозначных IT-предпринимателей XX века

В 1987 году Джон Макафи запустил программу, названную в честь себя, — McAfee Virus Scan. ПО быстро стало лидирующим решением для...
Read More
Интерпретация строения мозга с помощью рекуррентных нейронных сетей

Интерпретация строения мозга с помощью рекуррентных нейронных сетей

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

Учим нейросети рассуждать о том, что они видят

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

Всем игрокам приготовиться: обзор доменов в играх

Компьютерные игры становятся всё более похожими на реальную жизнь. За последние годы в них значительно улучшилась графика, искусственный интеллект неигровых...
Read More
Let's cook: как приготовить ИИ до золотистой нейронной корочки

Let's cook: как приготовить ИИ до золотистой нейронной корочки

Сегодня на нашей кухне необычное блюдо под названием «обучение нейросети». В этом рецепте эксперт в области искусственного интеллекта Андрей Карпатый...
Read More
На что обратить внимание при создании сайта-галереи

На что обратить внимание при создании сайта-галереи

Рассказать миру своём творчестве проще, чем кажется! Если всё это время вы рисовали картины, снимали фото или видео “в стол”,...
Read More
Стэнфордский курс: лекция 4. Введение в нейронные сети

Стэнфордский курс: лекция 4. Введение в нейронные сети

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