Детектирование и распознавание дорожных знаков с помощью библиотеки OpenCV

3.06 (5)

Цель данной работы заключается в разработке алгоритма, осуществляющего решения задачи по распознаванию и идентификации 4 дорожных знаков (Road signs detection and recognitions), а также проверка эффективности работы алгоритмов. Исходные данные получались в виде последовательности изображений, полученные с камеры мобильного телефона Sumsung galaxy S5 с разрешением Full-HD. Основными задачами были получения идентификации дорожного знака а также координаты центра этого знака и фиксирование его на изображении.

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

В процессе анализа возможных подходов рассматривались несколько вариантов: обучающихся и статических подходов.

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

Статический подход распознавания (Static recognition approach).
Данный поход заключает в себя несколько этапов:

  1. преобразование цветового пространства;
  2. удаления шумов;  
  3. нахождения контуров и фильтрация не нужных контуров;
  4. идентификация контура.

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

road_sign_type_opencv

Для извлечения красного или синего цвета из входного изображения используется  цветовое пространство HLS (Hue, Luminance and Saturation). Сначала изображение конвертируется  из цветового пространства rgb в hls.

Преобразования цветового пространства:

rgb_to_hls

Выделения красного и синего цвета  

red+blue

После удаления шумов  находится контуры

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

find_contour_opencv

Дальнейшим этапом является отфильтровать ненужные контуры. Любой дорожный знак можно описать прямоугольником, который будет иметь соответствующие соотношение сторон. Для данных типов знаков соотношение сторон, учитывая наклонность или поворот знака, лежит в диапазоне от 0.7 до 1.3. Соответственно отфильтровав контуры мы получим нужные нам контуры.

Фильтрация контуров

Фильтрация контуров

Идентификация контура происходит путем сравнения контура по шаблону (Template Matching). Для каждого знака был сделан шаблон, с которым сравнивается контур.

Шаблон для поиска дорожных знаков

В результате сравнения мы получали коэффициент совпадения от 0 до 1. Если он был больше 0.5 то можно было говорить о том что данный контур соответствует сравниваемому знаку.

Найденный дорожный знак

Общая схема алгоритма показана ниже.

Блок схема распознавание дорожних знаков

Результаты
Выборка сформирована с изображений как содержащий один знак так и несколько на одной картинке. Тестировалось на изображении разрешения 1920х1080. Протестировано было на 50 изображений. Знак «Уступите дорогу» распознало 7 из 10 , «Проезд запрещен без остановки»  —  11 из 15, «Въезд запрещен» 9 из 14, «Пешеходный переход» —  10 из 13.  Точность обнаружения составляет порядка 70%. 

Выводы
По результатам проведенной работы можно отметить что данный метод работает неплохо в условиях хорошей контрастности и дает точность детектирования и распознавания порядка 70%. 
Однако метод имеет ряд недостатков: 

  • точность идентификации данного метода зависит от правильности найденного контура;
  • данный метод не распознает перекрытых и скаженных знаков;
  • выделения цветового пространства завит от окружения в котором находится знак. Если знак находится на фоне красной машины или дома с красной крышей то данный метод он не работает.   

Поиск дорожный с помощью вейвлет преобразований Хаар (Search traffic signs using Haar wavelet transformation). 

Данный подход заключает в себя несколько этапов:

  • обучения каскада для детектирования
  • поиск знака
  • фильтрация полученного результата

На первом этапе формируется обучающаяся выборка для обнаружения дорожного знака. Для нормального обучения необходимо около 1000 позитивной и 2000 негативной выборки изображений. К позитивной выборке относятся дорожные знаки одного типа, выбранные из реального окружения. К негативной — участки фотографий на которых отсутствует дорожный знак.
Для обучения классификаторов использовалась база изображений однотипных знаков, которые были размечены вручную и вырезаны из реальных фотографий дорожных знаков. Так для знака «Пешеходный переход» было нарезано 900 знаков, «Уступите дорогу» - 550, «Движение без остановки запрещено» - 485, «Въезд запрещен» - 79. 

Позитивная выборка

Негативная выборка

Для обучения каскада использовались утилиты из пакета OpenCv opencv_createsamples и opencv_traincascade. На первом этапе все положительные выборки приводятся к одному общему размеру. Для этого используется утилита opencv_createsamples. На выходе мы получим файл, в котором будут лежать все изображения с размером h*w. 
Для получения итогового каскада используется утилита opencv_traincascade. На выходе мы получим итоговый каскад, который используется в дальнейшем для обнаружения дорожного знака.
При обнаружении дорожного знака возникают моменты когда сигнатура знака встречается в местах, которые не является знаком, поскольку данный метод работает с градацией серого цвета. 

Ложное срабавтывание

Для удаления ложного обнаружения знака используется пост обработка изображения. Для каждого типа знака проверяется наличие контура синего и красного цвета.

Результат  
Выборка сформирована с изображений как содержащий один знак так и несколько на одной картинке. Тестировалось на изображении разрешения 1920х1080. Протестировано было на 50 изображений. Знак «Уступите дорогу» распознало 9 из 10 , «Проезд запрещен без остановки»  —  13 из 15, «Въезд запрещен» 12 из 14, «Пешеходный переход» —  13 из 13.  Точность обнаружения составляет  более 90%. 

Комментарий (0)

Войдите с помощью соцсетей:
или
введите свои данные: