Система распознавания дорожных знаков: Система распознавания дорожных знаков: описание и принцип работы

Содержание

Проверяем системы распознавания знаков в деле — журнал За рулем

Дальняя дорога замыливает глаз. Того и гляди прозеваешь очередной дорожный знак. Хорошо, если все обойдется, а попробуй-ка объяснить полицейскому, что нарушил не нарочно. Мы отправились в пробег по Подмосковью — посмотреть на знаки электронными глазами.

Подача информации «баварцем» выше всяких похвал: цветные знаки транслируются на проекционный дисплей вместе с текущим значением скорости. Информация о запрете и разрешении обгонов выскакивает отдельными символами — пропустить или перепутать невозможно.

Подача информации «баварцем» выше всяких похвал: цветные знаки транслируются на проекционный дисплей вместе с текущим значением скорости. Информация о запрете и разрешении обгонов выскакивает отдельными символами — пропустить или перепутать невозможно.

Подача информации «баварцем» выше всяких похвал: цветные знаки транслируются на проекционный дисплей вместе с текущим значением скорости. Информация о запрете и разрешении обгонов выскакивает отдельными символами — пропустить или перепутать невозможно.

У видеокамеры переднего обзора достаточно работы. Тем не менее список объектов, которые она фиксирует, продолжает расти. Образы автомобилей и пешеходов, дорожная разметка, а теперь еще и знаки. Разумеется, не все. Чтобы система не распылялась по пустякам, разработчики вложили в электронную память минимум символов: ограничение максимальной скорости, запрет обгона и сопряженные с ними таблички с временем и зоной действия, знаки отмены. Их и распознает система, передавая изображение на панель приборов. Машин с такой опцией пока немного, среди поставляемых к нам еще меньше. На тест попали БМВ 3‑й серии и «Опель-Инсигния». И хотя задачи у этих систем одинаковые, различий в работе набралось предостаточно.

ПРЕДМЕТ И МЕТОД

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

В отличие от большинства электронных ассистентов, ответственный за распознавание знаков устроен сравнительно просто. Камера выхватывает и сверяет со своей картотекой таблички, схожие по форме, набору и расположению символов. На похожие ограничения максимальной массы или высоты автомобиля (тоже крупные цифры в красной окантовке) сканеры не реагируют. Правда, доходит до курьезов. При обгоне очередного грузовика «Опель» неожиданно высветил на дисплее «30». Оказалось, сканер считал миниатюрный знак ограничения скорости на цистерне поливальной машины.

2Оба сканера распознают знаки, нарисованные на прямоугольниках временных щитов, — ведь важна форма рисунка, а не подложка. Кроме того, системы четко выхватывают ограничения скорости, горящие на свето-диодных табло (хотя цвета не совпадают с таковыми на обычных дорожных знаках), на растяжках и металлических фермах.

Оба сканера распознают знаки, нарисованные на прямоугольниках временных щитов, — ведь важна форма рисунка, а не подложка. Кроме того, системы четко выхватывают ограничения скорости, горящие на свето-диодных табло (хотя цвета не совпадают с таковыми на обычных дорожных знаках), на растяжках и металлических фермах.

Оба сканера распознают знаки, нарисованные на прямоугольниках временных щитов, — ведь важна форма рисунка, а не подложка. Кроме того, системы четко выхватывают ограничения скорости, горящие на свето-диодных табло (хотя цвета не совпадают с таковыми на обычных дорожных знаках), на растяжках и металлических фермах.

БМВ известны знаки запрета обгона и ограничения скорости, а также их отмены. В инструкции упоминаются еще дополнительные информационные таблички «Влажная дорога» и «Зона действия». Забегая вперед, скажем, что первые нам за время прохождения маршрута не попались, а на другие машина попросту не отреагировала. «Опель», даром что попроще брендом, несет более весомый багаж знаний. Например, выучил знаки «Автомагистраль», «Дорога для автомобилей», «Пешеходная зона», да и таблички, сопутствующие основным знакам, камера «Опель ай» (Opel Eye) не игнорирует.

ПРОВЕРКА НА ДОРОГАХ

БМВ разочаровывает в первые минуты: знаки «80» на правой обочине широких московских магистралей он замечает редко. «Опель» чуть внимательнее. Но чувствуется, что для систем эти условия нештатные: на столь широкой дороге нужно дублировать информацию на растяжках, верхней рампе или разделительном барьере.

За городом помощники заработали увереннее: отвлекающей информации меньше, а знаки гораздо ближе. Однако и в этом горшочке меда не обошлось без дегтя. «Опель» чувствителен к ориентации знака. Если тот чуть наклонен или развернут, камера пропускает его. У БМВ свои причуды. В штатной навигации «баварца» зашиты ограничения скорости для всех дорог. Если сканер не видит придорожных знаков, компьютер опирается на данные дорожных карт. Но лучше бы он этого не делал! Электронный Сусанин не всегда четко отслеживает границы населенных пунктов, переключая лимиты «60» и «90». А иной раз высвечивает совершенно необъяснимые ограничения в 50 или 70 км/ч, причем смена происходит в лесу или чистом поле. Система «Опель ай» лишена привязки к навигации, отслеживает только реальную придорожную информацию, а потому и дезинформирует водителя реже.

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

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

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

От системы БМВ, которой помогает навигация, мы ожидали более интеллектуального подхода. А именно — что она будет точнее отслеживать зоны запретов обгона или ограничения скорости. Ведь часто эти знаки действуют до ближайшего перекрестка, которые как раз отлично распознает навигатор. Но почему-то в этом случае от его помощи отказались. В итоге знак горит, пока не появится его отмена, метка в электронной карте с иным ограничением скорости или окончание заданного временного интервала. Последний нам точно определить не удалось: знаки горели на панели разное время, выявить какую-либо зависимость мы не смогли. Кстати, так же поступает и «Инсигния». А вот знак, запрещающий обгон, машина гасит четко спустя 15 секунд. К чему такая спешка? Жирный минус за подачу информации.

ДЕФЕКТЫ ЗРЕНИЯ

Кратковременный, но сильный дождь подпортил «Опелю» оценку за точность. Капли на стекле, которые не успевают смахивать щетки, снижают бдительность ассистента вдвое. Аналогично влияет на остроту его зрения и включенный в ночное время дальний свет: электроника стабильно игнорировала знаки, попадающие в свет фар. БМВ таких капризов себе не позволяет.

Но не надейтесь, что система предупредит вас о знаке заранее. При заявленной стометровой дальнобойности, камеры и «Опеля», и БМВ передают информацию на дисплеи не раньше, чем знак поравняется с передним бампером. А «баварец» и вовсе выдерживает театральную паузу и выдает сообщение, лишь когда столбик замаячит в зеркале заднего вида. Причем это не зависит от погодных условий или времени суток.

Второе поколение камеры «Опель ай» стало компактнее, однако упитанную «тушку» салонное зеркало все равно не скрывает. Из-за этого страдает и без того не лучшая обзорность.

Второе поколение камеры «Опель ай» стало компактнее, однако упитанную «тушку» салонное зеркало все равно не скрывает. Из-за этого страдает и без того не лучшая обзорность.

Второе поколение камеры «Опель ай» стало компактнее, однако упитанную «тушку» салонное зеркало все равно не скрывает. Из-за этого страдает и без того не лучшая обзорность.

Кроме того, если знак хотя бы немного перекрыт стоящим на обочине грузовиком (человеческий глаз отлавливает его и в этом случае), сканеры бессильны. Даже если дорожный «леденец» расположен чуть поодаль, гарантированно система засечет его только на невысокой скорости. Вообще чем выше забирается стрелка спидометра, тем хуже становится реакция ассистентов. Например, при разрешенных на магистрали 110 км/ч сбои в работе случались даже в идеальных условиях.

А если оценивать точность срабатывания по итогам всего теста, БМВ справился примерно с 90% встретившихся знаков, «Опель» — с 75%.

Посовещавшись, вынесли общий вердикт. Вреда опробованные системы не приносят, а в некоторых случаях их подсказки полезны. Ведь при всей внимательности и опыте все мы люди, которым, известное дело, свойственно ошибаться. Да что далеко ходить — за время 600-километрового теста мы пару-тройку раз пропускали важную информацию. Тут-то лишние электронные глаза совсем не мешали. А что иногда сбиваются — простительно. Ведь они — как начинающие водители, только набираются опыта. И, к счастью, те оплошности, которые они допускают, — это не грубые ошибки, а свойственные новичкам помарки.

Кирилл Милешкин:

Кирилл Милешкин

«Появляющиеся на проекционном дисплее цветные символы запрета обгона и его отмены просмотреть невозможно, а вот реа

Как работает система распознавания дорожных знаков?

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

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

Система распознавания дорожных знаковСистема распознавания дорожных знаков

Основное назначение

Стоит понимать, что большинство ДТП происходит по вине водителя, который не соблюдает скоростной режим. А делается это зря, так как ограничения вводятся не просто так: скорость автомобиля должна быть такой, чтобы водитель мог успеть выполнить все принимаемые им решения, будь то маневр или экстренное торможение. Поэтому и начались разработки специальных систем, которые могут помочь водителю принимать решение или контролировать свои действия. Сейчас система распознавания дорожных знаков встречается на разных автомобилях, в том числе и таких дорогих, как BMW, Mercedes-Benz, Audi, Ford, Opel, Volkswagen и еще многие другие. Эта технология является одной из основных в системе безопасности автомобиля, которой сейчас комплектуется большинство автомобилей. Примером можно назвать Opel Eye от, соответственно, Опель. Эта система признана одной из лучших на протяжении нескольких последних лет. Mercedes-Benz же назвали свою систему Speed Limit Assist, а специализируется она на предупреждении водителя о превышении им скоростного лимита на данном участке дороге в конкретное время.

Конструкция системы

Как правило, все эти конструкции от любого производителя имеют типичный набор инструментов и устройств в своем распоряжении.

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

  • Специальная чувствительная видеокамера.
  • Экран или некое другое приспособление, на котором система отчитывается перед водителем.
  • Блок управления, который и выполняет основную работу.

Видеокамера располагается рядом с ветровым стеклом в салоне автомобиля. На некоторых моделях, где эта возможность интегрирована во весь автомобиля камера может быть спрятана где-то под стеклом или, например, в уплотнителе стекла, чтобы камера не заслоняла часть лобового стекла и не закрывала обзор. Камер направлена так, чтобы ей было удобно снимать пространство впереди машины, в местах, где стоят знаки по ходу движения, то есть немного справа от дороги. Далее, отснятое видео передается в блок управления, микропроцессор которого в режиме реального времени анализирует его содержимое. Также эта камера используется и другими системами безопасности, такими как система обнаружения пешеходов, на проезжей части и система помощи движения по ряду или полосе в потоке машин.

Алгоритм распознавания

Электронный блок управления системы инициирует специальный механизм, программно заложенный в его систему. В виде последовательности его можно представить так:

  1. Опознавание формы дорожного знака (а они у нас бывают очень разные).
  2. Определение надписи на знаке.
  3. Распознавание цвета знака.
  4. Проверка наличия таблички информации.

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

Очень интересным новшеством является совместная работа системы распознавания дорожных знаков вместе с навигатором автомобиля.

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

Инструменты для препроцессинга изображений / Блог компании New Professions Lab / Хабр

Привет, Хабр! Продолжаем серию материалов от выпускника нашей программы Deep Learning, Кирилла Данилюка, об использовании сверточных нейронных сетей для распознавания образов — CNN (Convolutional Neural Networks)

Введение


За последние несколько лет сфера компьютерного зрения (CV) переживает если не второе рождение, то огромный всплеск интереса к себе. Во многом такой рост популярности связан с эволюцией нейросетевых технологий. Например, сверточные нейронные сети (convolutional neural networks или CNN) отобрали себе большой кусок задач по генерации фич, ранее решаемых классическими методиками CV: HOG, SIFT, RANSAC и т.д.

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


MultiNet как пример нейронной сети (трех в одной), которую мы будем использовать в одном из следующих постов. Источник.

Предполагается, что читатель имеет общее представление о работе нейронных сетей. В сети есть огромное количество постов, курсов и книг на данную тему. К примеру:

  • Chapter 6: Deep Feedforward Networks — глава из книги Deep Learning от I.Goodfellow, Y.Bengio и A.Courville. Очень рекомендую.
  • CS231n Convolutional Neural Networks for Visual Recognition  — популярный курс от Fei-Fei Li и Andrej Karpathy из Стэнфорда. В курсе содержатся отличные материалы сделан упор на практику и проектирование.
  • Deep Learning  — курс от Nando de Freitas из Оксфорда.
  • Intro to Machine Learning  — бесплатный курс от Udacity для новичков с доступным изложением материала, затрагивает большое количество тем в машинном обучении.

Совет: чтобы убедиться в том, что вы владеете основами нейронных сетей, напишите свою сеть с нуля и поиграйте с ней!

Вместо того, чтобы повторять основы, данная серия статей фокусируется на нескольких конкретных архитектурах нейронных сетей: STN (spatial transformer network), IDSIA (сверточная нейросеть для классификации дорожных знаков), нейросеть от NVIDIA для end-to-end разработки автопилота и MultiNet для распознавания и классификации дорожной разметки и знаков. Приступим!

Тема данной статьи — показать несколько инструментов для предобработки изображений. Общий пайплайн обычно зависит от конкретной задачи, я же хотел бы остановиться именно на инструментах. Нейросети — совсем не те магические черные ящики, какими их любят преподносить в медиа: нельзя просто взять и «закинуть» данных в сетку и ждать волшебных результатов. По правилу shit in — shit out в лучшем случае, вы получите score хуже на несколько пунктов. А, скорее всего, просто не сможете обучить сеть и никакие модные техники типа нормализации батчей или dropout вам не помогут. Таким образом, работу нужно начинать именно с данных: их чистки, нормализации и нормировки. Дополнительно стоит задуматься над расширением (data augmentation) исходного картиночного датасета с помощью аффинных преобразований типа вращения, сдвигов, изменения масштаба картинок: это поможет снизить вероятность переобучения и обеспечит лучшую инвариантность классификатора к трансформациям.

Инструмент 1: Визуализация и разведочный анализ данных


В рамках этого и следующего постов мы будем использовать GTSRB  —  датасет по распознаванию дорожных знаков в Германии. Наша задача — обучить классификатор дорожных знаков, используя размеченные данные из GTSRB. В общем случае, лучший способ получить представление об имеющихся данных — построить гистограмму распределения train, validation и/или test наборов данных:

Базовая информация о нашем датасете:

Number of training examples = 34799
Number of validation examples = 4410
Number of testing examples = 12630
Image data shape = (32, 32, 3)
Number of classes = 43

На данном этапе matplotlib — ваш лучший друг. Несмотря на то, что используя лишь pyplot можно отлично визуализировать данные, matplotlib.gridspec позволяет слить 3 графика воедино:
gs = gridspec.GridSpec(1, 3, wspace=0.25, hspace=0.1)
fig = plt.figure(figsize=(12,2))
ax1, ax2, ax3 = [plt.subplot(gs[:, i]) for i in range(3)]

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


В результате всего один график может сказать о нашем наборе данных очень многое. Ниже указаны 3 задачи, которые можно решить с помощью грамотно построенного графика:

  • Визуализация изображений. По графику сразу видно множество слишком темных или слишком светлых изображений, поэтому должна быть проведена своего рода нормализация данных, чтобы устранить вариацию яркости.
  • Проверка выборки на несбалансированность. В случае, если в выборке превалируют экземпляры какого-либо класса, необходимо использовать методы undersampling или oversampling.
  • Проверить, что распределения train, validation и test выборок похожи.
    Это можно проверить, взглянув на гистограммы выше, либо используя ранговый коэффициент корреляции Спирмена. (через scipy)

Инструмент 2: IPython Parallel для scikit-image


Для того, чтобы улучшить сходимость нейронной сети, нужно привести все изображения к единому освещению путем (как рекомендовано в статье LeCun о распознавании дорожных знаков) преобразования их цветовой гаммы в градации серого. Это можно сделать как с помощью OpenCV, так и с помощью отличной библиотеки на Python scikit-image, которая может быть легко установлена с помощью pip (OpenCV же требует самостоятельной компиляции с кучей зависимостей). Нормализация контрастности изображений будет осуществляться с помощью адаптивной нормализации гистограммы (CLAHE, contrast limited adaptive histogram equalization):
skimage.exposure.equalize_adapthist.

Отмечу, что skimage обрабатывает изображения одно за другим, используя лишь одно ядро процессора, что, очевидно, неэффективно. Чтобы распараллелить предобработку изображений, используем библиотеку IPython Parallel (

ipyparallel). Одно из преимуществ этой библиотеки — простота: реализовать распараллеленный CLAHE можно всего несколькими строчками кода. Сначала в консоли (с установленной ipyparallel) запустим локальный кластер ipyparallel:

$ ipcluster start

Наш подход к распараллеливанию очень прост: мы разделяем выборку на батчи и обрабатываем каждую партию независимо от остальных. Как только все батчи будут обработаны, мы сливаем их обратно в один набор данных. Моя реализация CLAHE приведена ниже:

from skimage import exposure

def grayscale_exposure_equalize(batch_x_y):
    """Processes a batch with images by grayscaling, normalization and
    histogram equalization.
    
    Args:
        batch_x_y: a single batch of data containing a numpy array of images
            and a list of corresponding labels.
    
    Returns:
        Numpy array of processed images and a list of labels (unchanged).
    """
    x_sub, y_sub = batch_x_y[0], batch_x_y[1]
    x_processed_sub = numpy.zeros(x_sub.shape[:-1])
    for x in range(len(x_sub)):
        # Grayscale
        img_gray = numpy.dot(x_sub[x][...,:3], [0.299, 0.587, 0.114])
        # Normalization
        img_gray_norm = img_gray / (img_gray.max() + 1)
        # CLAHE. num_bins will be initialized in ipyparallel client
        img_gray_norm = exposure.equalize_adapthist(img_gray_norm, nbins=num_bins)
        
        x_processed_sub[x,...] = img_gray_norm
    return (x_processed_sub, y_sub)

Теперь, когда сама трансформация готова, напишем код, который применяет ее к каждому батчу из обучающей выборки:
import multiprocessing
import ipyparallel as ipp
import numpy as np

def preprocess_equalize(X, y, bins=256, cpu=multiprocessing.cpu_count()):
    """ A simplified version of a function which manages multiprocessing logic. 
    This function always grayscales input images, though it can be generalized
    to apply any arbitrary function to batches.
    Args:
        X: numpy array of all images in dataset.
        y: a list of corresponding labels.
        bins: the amount of bins to be used in histogram equalization.
        cpu: the number of cpu cores to use. Default: use all.
    Returns:
        Numpy array of processed images and a list of labels.
    """
    rc = ipp.Client()

    # Use a DirectView object to broadcast imports to all engines
    with rc[:].sync_imports():
        import numpy
        from skimage import exposure, transform, color        

    # Use a DirectView object to set up the amount of bins on all engines
    rc[:]['num_bins'] = bins

    X_processed = np.zeros(X.shape[:-1])    
    y_processed = np.zeros(y.shape)

    # Number of batches is equal to cpu count
    batches_x = np.array_split(X, cpu)
    batches_y = np.array_split(y, cpu)
    batches_x_y = zip(batches_x, batches_y)

    # Applying our function of choice to each batch with a DirectView method
    preprocessed_subs = rc[:].map(grayscale_exposure_equalize, batches_x_y).get_dict()

    # Combining the output batches into a single dataset
    cnt = 0
    for _,v in preprocessed_subs.items():
        x_, y_ = v[0], v[1]
        X_processed[cnt:cnt+len(x_)] = x_
        y_processed[cnt:cnt+len(y_)] = y_
        cnt += len(x_)
    
    return X_processed.reshape(X_processed.shape + (1,)), y_processed

Наконец, применим написанную функцию к обучающей выборке:
# X_train: numpy array of (34799, 32, 32, 3) shape
# y_train: a list of (34799,) shape
X_tr, y_tr = preprocess_equalize(X_train, y_train, bins=128)

В результате мы используем не одно, а все ядра процессора (32 в моем случае) и получаем значительное увеличение производительности. Пример полученных изображений:


Результат нормализации изображений и переноса их цветовой гаммы в градации серого


Нормализация распределения для изображений формата RGB (я использовал другую функцию для rc[:].map)

Теперь весь процесс предобработки данных проходит за несколько десятков секунд, поэтому мы можем протестировать разные значения числа интервалов num_bins, чтобы визуализировать их и выбрать наиболее подходящий:


num_bins: 8, 32, 128, 256, 512

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

Наконец, используем ipython magic %store, чтобы сохранить результаты для дальнейшего использования:

# Same images, multiple bins (contrast augmentation)
%store X_tr_8
%store y_tr_8
# ...
%store X_tr_512
%store y_tr_512

Инструмент 3: Онлайн-аугментация данных


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

Для начала обозначим все планируемые преобразования, используя numpy и skimage:

import numpy as np
from skimage import transform
from skimage.transform import warp, AffineTransform

def rotate_90_deg(X):    
    X_aug = np.zeros_like(X)
    for i,img in enumerate(X):
        X_aug[i] = transform.rotate(img, 270.0)
    return X_aug

def rotate_180_deg(X):    
    X_aug = np.zeros_like(X)
    for i,img in enumerate(X):
        X_aug[i] = transform.rotate(img, 180.0)
    return X_aug

def rotate_270_deg(X):    
    X_aug = np.zeros_like(X)
    for i,img in enumerate(X):
        X_aug[i] = transform.rotate(img, 90.0)
    return X_aug

def rotate_up_to_20_deg(X):
    X_aug = np.zeros_like(X)
    delta = 20.
    for i,img in enumerate(X):
        X_aug[i] = transform.rotate(img, random.uniform(-delta, delta), mode='edge')
    return X_aug

def flip_vert(X):
    X_aug = deepcopy(X)
    return X_aug[:, :, ::-1, :]

def flip_horiz(X):
    X_aug = deepcopy(X)
    return X_aug[:, ::-1, :, :]

def affine_transform(X, shear_angle=0.0, scale_margins=[0.8, 1.5], p=1.0):
    """This function allows applying shear and scale transformations
    with the specified magnitude and probability p.
    
    Args:
        X: numpy array of images.
        shear_angle: maximum shear angle in counter-clockwise direction as radians.
        scale_margins: minimum and maximum margins to be used in scaling.
        p: a fraction of images to be augmented.
    """
    X_aug = deepcopy(X)
    shear = shear_angle * np.random.rand()
    for i in np.random.choice(len(X_aug), int(len(X_aug) * p), replace=False):
        _scale = random.uniform(scale_margins[0], scale_margins[1])
        X_aug[i] = warp(X_aug[i], AffineTransform(scale=(_scale, _scale), shear=shear), mode='edge')
    return X_aug

Масштабирование и рандомные повороты rotate_up_to_20_deg увеличивают размер выборки, сохраняя принадлежность изображений к исходным классам. Отражения (flips) и вращения на 90, 180, 270 градусов могут, напротив, поменять смысл знака. Чтобы отслеживать такие переходы, создадим список возможных преобразований для каждого дорожного знака и классов, в которые они будут преобразованы (ниже приведен пример части такого списка):
label_class label_name rotate_90_deg rotate_180_deg rotate_270_deg flip_horiz flip_vert
13 Yield 13
14 Stop
15 No vehicles 15 15 15 15 15
16 Vehicles over
3.5 ton
prohibited
17 No entry 17 17 17
Часть таблицы преобразований. Значения в ячейках показывают номер класса, который примет данное изображение после трансформации. Пустые ячейки означают, что данное преобразование недоступно для этого класса.

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

import pandas as pd

# Generate an augmented dataset using a transform table
augmentation_table = pd.read_csv('augmentation_table.csv', index_col='label_class')

augmentation_table.drop('label_name', axis=1, inplace=True)
augmentation_table.dropna(axis=0, how='all', inplace=True)

# Collect all global functions in global namespace
namespace = __import__(__name__)

def apply_augmentation(X, how=None):
    """Apply an augmentation function specified in `how` (string) to a numpy array X.
    
    Args:
        X: numpy array with images.
        how: a string with a function name to be applied to X, should return 
            the same-shaped numpy array as in X.
    
    Returns:
        Augmented X dataset.
    """
    assert augmentation_table.get(how) is not None
    
    augmentator = getattr(namespace, how)
    return augmentator(X)

Теперь мы можем построить пайплайн, который применяет все доступные функции (преобразования), перечисленные в augmentation_table.csv ко всем классам:
import numpy as np

def flips_rotations_augmentation(X, y):
    """A pipeline for applying augmentation functions listed in `augmentation_table`
    to a numpy array with images X.
    """
    # Initializing empty arrays to accumulate intermediate results of augmentation
    X_out, y_out = np.empty([0] + list(X.shape[1:]), dtype=np.float32), np.empty([0])
    
    # Cycling through all label classes and applying all available transformations
    for in_label in augmentation_table.index.values:
        available_augmentations = dict(augmentation_table.ix[in_label].dropna(axis=0))
        images = X[y==in_label]

        # Augment images and their labels
        for kind, out_label in available_augmentations.items():
            X_out = np.vstack([X_out, apply_augmentation(images, how=kind)])
            y_out = np.hstack([y_out, [out_label] * len(images)])

    # And stack with initial dataset
    X_out = np.vstack([X_out, X])
    y_out = np.hstack([y_out, y])
    
    # Random rotation is explicitly included in this function's body
    X_out_rotated = rotate_up_to_20_deg(X)
    y_out_rotated = deepcopy(y)

    X_out = np.vstack([X_out, X_out_rotated])
    y_out = np.hstack([y_out, y_out_rotated])

    return X_out, y_out

Отлично! Теперь у нас есть 2 готовые функции аугментации данных:
  • affine_transform: кастомизируемые аффинные преобразования без вращения (название я выбрал не очень удачное, потому что, что вращение является одним из аффинных преобразований).
  • flips_rotations_augmentation: случайные вращения и преобразования на основе augmentation_table.csv, меняющие классы изображений.

Финальный шаг — это создать генератор батчей:
def augmented_batch_generator(X, y, batch_size, rotations=True, affine=True,
                              shear_angle=0.0, scale_margins=[0.8, 1.5], p=0.35):
    """Augmented batch generator. Splits the dataset into batches and augments each
    batch independently.
    
    Args:
        X: numpy array with images.
        y: list of labels.
        batch_size: the size of the output batch.
        rotations: whether to apply `flips_rotations_augmentation` function to dataset.
        affine: whether to apply `affine_transform` function to dataset.
        shear_angle: `shear_angle` argument for `affine_transform` function.
        scale_margins: `scale_margins` argument for `affine_transform` function.
        p: `p` argument for `affine_transform` function.
    """
    X_aug, y_aug = shuffle(X, y)
    
    # Batch generation
    for offset in range(0, X_aug.shape[0], batch_size):
        end = offset + batch_size
        batch_x, batch_y = X_aug[offset:end,...], y_aug[offset:end]
        
        # Batch augmentation
        if affine is True:
            batch_x = affine_transform(batch_x, shear_angle=shear_angle, scale_margins=scale_margins, p=p)
        if rotations is True:
            batch_x, batch_y = flips_rotations_augmentation(batch_x, batch_y)
        
        yield batch_x, batch_y

Объединив датасеты с разным числом num_bins в CLAHE в один большой train, подадим его в полученный генератор. Теперь у нас есть два вида аугментации: по контрастности и с помощью аффинных трансформаций, которые применяются к батчу на лету:


Сгенерированные с помощью augmented_batch_generator изображения

Замечание: аугментация нужна для train-сета. Test-сет мы тоже предобрабатываем, но не аугментируем.

Давайте проверим, что мы нечаянно не нарушили распределение классов на расширенном трейне по сравнению с исходным датасетом:


Слева: гистограмма распределения данных из augmented batch generator. Справа: изначальный train. Как видно, значения различаются, но распределения схожи.

Переход к нейронным сетям


После того, как выполнена предобработка данных, все генераторы готовы и датасет готов к анализу, мы можем перейти к обучению. Мы будем использовать двойную свёрточную нейронную сеть: STN (spatial transformer network) принимает на вход предобработанные батчи изображений из генератора и фокусируется на дорожных знаках, а IDSIA нейросеть распознает дорожный знак на изображениях, полученных от STN. Следующий пост будет посвящён этим нейросетям, их обучению, анализу качества и демо-версии их работы. Следите за новыми постами!


Слева: исходное предобработанное изображение. Справа: преобразованное STN изображение, которое принимает на вход IDSIA для классификации.

Система распознавания дорожных знаков TSR

По статистике превышение скорости является одной из весьма распространенных причин ДТП, которые могут закончиться тяжелыми последствиями для водителя и пассажиров. Разработанная TSR или система распознавания дорожных знаков (Traffic Sign Recognition) создана с тем, чтобы водитель не забывал придерживаться разрешенной скорости согласно правилам дорожного движения. Устройство считывает и распознает дорожные знаки, регламентирующие скорость, напоминая при этом водителю о максимальной разрешенной скорости на определенном участке дороги, если его автомобиль едет быстрее, чем допустимо.

фото Traffic Sign Recognition

Устанавливаемая на авто система распознавания дорожных знаков конструктивно состоит из видеокамеры, блока управления и устройства подачи информации.

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

фото Traffic Sign Recognition

Электронный блок управления предназначен для осуществления следующих функций:

  • Определение конфигурации дорожного знака круглой формы.
  • Определение красного цвета знака на белом фоне.
  • Определение допустимой величины скорости, обозначенной на знаке.
  • Определение табличек, определяющих время и зону действия знака, а также вид транспортного средства.
  • Определение реальной скорости авто.
  • Сопоставление реальной скорости автомобиля с максимально разрешенной указанной на знаке.
  • Предупреждение водителя звуковым или световым сигналом.

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

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

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

  • Запрещающих въезд.
  • Пересечения с главной дорогой.
  • Проезд без остановки запрещен.
  • Начало и конец населенного пункта.
  • Начало и конец скоростной магистрали.
  • Знак, информирующий о въезде в жилую зону.
  • Окончание зоны ограничения знака.

СИСТЕМА РАСПОЗНАВАНИЯ ДОРОЖНЫХ ЗНАКОВ TSR — ЗА БАРАНКОЙ

По статистике превышение скорости является одной из весьма распространенных причин ДТП, которые могут закончиться тяжелыми последствиями для водителя и пассажиров. Разработанная TSR или система распознавания дорожных знаков (Traffic Sign Recognition) создана с тем, чтобы водитель не забывал придерживаться разрешенной скорости согласно правилам дорожного движения. Устройство считывает и распознает дорожные знаки, регламентирующие скорость, напоминая при этом водителю о максимальной разрешенной скорости на определенном участке дороги, если его автомобиль едет быстрее, чем допустимо.

Устанавливаемая на авто система распознавания дорожных знаков конструктивно состоит из видеокамеры, блока управления и устройства подачи информации.

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

Электронный блок управления предназначен для осуществления следующих функций:

  • Определение конфигурации дорожного знака круглой формы.
  • Определение красного цвета знака на белом фоне.
  • Определение допустимой величины скорости, обозначенной на знаке.
  • Определение табличек, определяющих время и зону действия знака, а также вид транспортного средства.
  • Определение реальной скорости авто.
  • Сопоставление реальной скорости автомобиля с максимально разрешенной указанной на знаке.
  • Предупреждение водителя звуковым или световым сигналом.

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

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

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

  • Запрещающих въезд.
  • Пересечения с главной дорогой.
  • Проезд без остановки запрещен.
  • Начало и конец населенного пункта.
  • Начало и конец скоростной магистрали.
  • Знак, информирующий о въезде в жилую зону.
  • Окончание зоны ограничения знака.

Понравилась статья? Подпишитесь на канал, чтобы быть в курсе самых интересных материалов

ПодписатьсяПроект Python

по распознаванию дорожных знаков с точностью 95% с использованием CNN & Keras

Проект Python — Распознавание дорожных знаков

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

В мире искусственного интеллекта и развития технологий многие исследователи и крупные компании, такие как Tesla, Uber, Google, Mercedes-Benz, Toyota, Ford, Audi и т. Д., Работают над автономными транспортными средствами и беспилотными автомобилями.Таким образом, для достижения точности в этой технологии автомобили должны иметь возможность интерпретировать дорожные знаки и принимать соответствующие решения.

Это восьмой проект DataFlair из 20 проектов Python. Я рекомендую вам добавить в закладки предыдущие проекты:

  1. Обнаружение фейковых новостей Python Project
  2. Обнаружение болезни Паркинсона Python Project
  3. Обнаружение цвета Python Project
  4. Речевое распознавание эмоций Python Project
  5. Python Project Classification Cancer
  6. Age and Gender Detection Проект Python
  7. Распознавание рукописных цифр Проект Python
  8. Проект Python чат-бота
  9. Обнаружение сонливости драйвера Проект Python
  10. Распознавание дорожных знаков Проект Python
  11. Генератор подписей к изображениям Проект Python

Что такое распознавание дорожных знаков?

Существует несколько различных типов дорожных знаков, таких как ограничение скорости, запрет на въезд, светофоры, поворот налево или направо, переход детей, запрещение проезда тяжелых транспортных средств и т. Д.Классификация дорожных знаков — это процесс определения того, к какому классу принадлежит дорожный знак.

Распознавание дорожных знаков — о проекте Python

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

traffic sign recognition python project idea

Набор данных проекта Python

Для этого проекта мы используем общедоступный набор данных, доступный на Kaggle:

Набор данных дорожных знаков

Набор данных содержит более 50 000 изображений различных дорожных знаков.Далее он подразделяется на 43 различных класса. Набор данных весьма разнообразен: некоторые классы содержат много изображений, а некоторые классы — несколько изображений. Размер набора данных составляет около 300 МБ. В наборе данных есть папка поезда, которая содержит изображения внутри каждого класса, и тестовая папка, которую мы будем использовать для тестирования нашей модели.

Python Project on Traffic Signs Recognition Meme

Предварительные требования

Этот проект требует предварительного знания Keras, Matplotlib, Scikit-learn, Pandas, PIL и классификации изображений.

Чтобы установить необходимые пакеты, используемые для этого проекта Python по науке о данных, введите в своем терминале следующую команду:

 pip install tensorflow keras sklearn matplotlib pandas pil 

Хотите стать профессионалом в Python?

Ознакомьтесь с 270+ бесплатными учебными пособиями по Python

Шаги по созданию проекта Python

Чтобы начать работу с проектом, загрузите и распакуйте файл по этой ссылке — Zip-файл распознавания дорожных знаков

И извлеките файлы в папку, например что у вас будет шлейф, тест и метапапка.

Python Project Dataset

Создайте файл сценария Python и назовите его traffic_signs.py в папке проекта.

Наш подход к построению этой модели классификации дорожных знаков описывается в четыре этапа:

  • Изучение набора данных
  • Создание модели CNN
  • Обучить и проверить модель
  • Протестировать модель с помощью тестового набора данных

Шаг 1 : Изучите набор данных

Наша папка «поезд» содержит 43 папки, каждая из которых представляет отдельный класс.Диапазон папки от 0 до 42. С помощью модуля ОС мы перебираем все классы и добавляем изображения и их соответствующие метки в список данных и меток.

Библиотека PIL используется для открытия содержимого изображения в массив.

exploring dataset in python project

Наконец, мы сохранили все изображения и их метки в списках (данные и метки).

Нам нужно преобразовать список в массивы numpy для подачи в модель.

Форма данных — (39209, 30, 30, 3), что означает, что имеется 39 209 изображений размером 30 × 30 пикселей, а последние 3 означают, что данные содержат цветные изображения (значение RGB).

В пакете sklearn мы используем метод train_test_split () для разделения данных обучения и тестирования.

Из пакета keras.utils мы используем метод to_categorical для преобразования меток, присутствующих в y_train и t_test, в быстрое кодирование.

splitting dataset in python project

Шаг 2: Создайте модель CNN

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

Архитектура нашей модели:

  • 2 слоя Conv2D (filter = 32, kernel_size = (5,5), Activation = ”relu”)
  • MaxPool2D layer (pool_size = (2,2))
  • Dropout layer (rate = 0.25)
  • 2 Conv2D layer (filter = 64, kernel_size = (3,3), activate = «relu»)
  • MaxPool2D layer (pool_size = (2,2))
  • Dropout layer (rate = 0,25)
  • Сглаживайте слой, чтобы сжать слои до одного измерения
  • Плотный Полностью связанный слой (256 узлов, активация = «relu»)
  • Выпадающий слой (коэффициент = 0.5)
  • Плотный слой (43 узла, активация = «softmax»)

Мы компилируем модель с помощью оптимизатора Adam, который работает хорошо, и потери — «categoryorical_crossentropy», потому что у нас есть несколько классов для категоризации.

cnn model in python data science project

Шаги 3: Обучение и проверка модели

После построения архитектуры модели мы затем обучаем модель с помощью model.fit (). Я пробовал использовать размер партии 32 и 64. Наша модель показала лучшие результаты при размере партии 64. И через 15 эпох точность была стабильной.

training the model in project in python

Наша модель имеет точность 95% на обучающем наборе данных. С помощью matplotlib мы строим график точности и потерь.

plotting accuracy in python project example

Точность построения

accuracy & loss in python machine learning project

Графики точности и потерь

Шаг 4: Протестируйте нашу модель с помощью тестового набора данных

Наш набор данных содержит тестовую папку, а в файле test.csv у нас есть подробности, связанные с путем к изображению и соответствующие им метки классов. Мы извлекаем путь к изображению и метки с помощью панд.Затем, чтобы предсказать модель, мы должны изменить размер наших изображений до 30 × 30 пикселей и создать массив, содержащий все данные изображения. Из sklearn.metrics мы импортировали precision_score и наблюдали, как наша модель предсказывает фактические метки. В этой модели мы достигли точности 95%.

testing accuracy in advanced python project

В конце мы собираемся сохранить модель, которую мы обучили с помощью функции Keras model.save ().

 model.save (‘traffic_classifier.h5’) 

Полный исходный код:

 import numpy as np
импортировать панд как pd
импортировать matplotlib.pyplot как plt
импорт cv2
импортировать тензорный поток как tf
из PIL импорта изображения
импорт ОС
из sklearn.model_selection import train_test_split
from keras.utils import to_categorical
из keras.models import Sequential, load_model
from keras.layers импортировать Conv2D, MaxPool2D, Dense, Flatten, Dropout

данные = []
label = []
классы = 43
cur_path = os.getcwd ()

# Получение изображений и их этикеток
для i в диапазоне (классы):
    путь = os.path.join (cur_path, 'поезд', str (i))
    images = os.listdir (путь)

    для изображений в:
        пытаться:
            image = Изображение.открытый (путь + '\\' + a)
            image = image.resize ((30,30))
            изображение = np.array (изображение)
            #sim = Image.fromarray (изображение)
            data.append (изображение)
            label.append (i)
        Кроме:
            print ("Ошибка загрузки изображения")

# Преобразование списков в массивы numpy
data = np.array (данные)
label = np.array (метки)

печать (data.shape, labels.shape)
# Разделение набора данных для обучения и тестирования
X_train, X_test, y_train, y_test = train_test_split (данные, метки, test_size = 0,2, random_state = 42)

печать (X_train.shape, X_test.shape, y_train.shape, y_test.shape)

# Преобразование этикеток в одну горячую кодировку
y_train = to_categorical (y_train, 43)
y_test = to_categorical (y_test, 43)

# Построение модели
model = Последовательный ()
model.add (Conv2D (фильтры = 32, размер_ядра = (5,5), активация = 'relu', input_shape = X_train.shape [1:]))
model.add (Conv2D (фильтры = 32, размер_ядра = (5,5), активация = 'relu'))
model.add (MaxPool2D (размер_пул = (2, 2)))
model.add (Отсев (коэффициент = 0,25))
model.add (Conv2D (фильтры = 64, размер_ядра = (3, 3), активация = 'relu'))
модель.добавить (Conv2D (фильтры = 64, размер_ядра = (3, 3), активация = 'relu'))
model.add (MaxPool2D (размер_пул = (2, 2)))
model.add (Отсев (коэффициент = 0,25))
model.add (Flatten ())
model.add (Плотный (256, активация = 'relu'))
model.add (Отсев (коэффициент = 0,5))
model.add (Плотный (43, активация = 'softmax'))

# Составление модели
model.compile (loss = 'category_crossentropy', optimizer = 'adam', metrics = ['precision'])

эпох = 15
history = model.fit (X_train, y_train, batch_size = 32, epochs = epochs, validation_data = (X_test, y_test))
модель.сохранить ("my_model.h5")

# построение графиков для точности
plt.figure (0)
plt.plot (history.history ['точность'], label = 'точность обучения')
plt.plot (history.history ['val_accuracy'], label = 'val precision')
plt.title ('Точность')
plt.xlabel ('эпохи')
plt.ylabel ('точность')
plt.legend ()
plt.show ()

plt. рисунок (1)
plt.plot (history.history ['потеря'], label = 'потеря обучения')
plt.plot (history.history ['val_loss'], label = 'val loss')
plt.title ('Потеря')
plt.xlabel ('эпохи')
plt.ylabel ('потеря')
plt.legend ()
plt.show ()

# проверка точности на тестовом наборе данных
из склеарна.метрики импорт precision_score

y_test = pd.read_csv ('Test.csv')

label = y_test ["ClassId"]. значения
imgs = y_test ["Путь"]. значения

данные = []

для img в imgs:
    image = Image.open (img)
    image = image.resize ((30,30))
    data.append (np.array (изображение))

X_test = np.array (данные)

pred = model.predict_classes (X_test)

# Точность с тестовыми данными
из sklearn.metrics импортировать precision_score
печать (оценка_точности (метки, пред))

model.save (‘traffic_classifier.h5’) 

ПОДОЖДИТЕ! Вы проверили наш последний учебник по OpenCV и компьютерному зрению

GUI классификатора дорожных знаков

Теперь мы собираемся создать графический пользовательский интерфейс для нашего классификатора дорожных знаков с помощью Tkinter.Tkinter — это набор инструментов с графическим интерфейсом в стандартной библиотеке Python. Создайте новый файл в папке проекта и скопируйте приведенный ниже код. Сохраните его как gui.py, и вы можете запустить код, набрав python gui.py в командной строке.

В этот файл мы сначала загрузили обученную модель «traffic_classifier.h5» с помощью Keras. Затем мы создаем графический интерфейс для загрузки изображения, и для классификации используется кнопка, вызывающая функцию classify (). Функция classify () преобразует изображение в размер формы (1, 30, 30, 3).Это связано с тем, что для прогнозирования дорожного знака мы должны предоставить тот же размер, который мы использовали при построении модели. Затем мы прогнозируем класс, model.predict_classes (image) возвращает нам число от (0 до 42), которое представляет класс, к которому он принадлежит. Мы используем словарь, чтобы получить информацию о классе. Вот код файла gui.py.

Код:

 импорт tkinter as tk
из диалога импорта файлов tkinter
из tkinter import *
из PIL импортировать ImageTk, Image

import numpy
# загрузить обученную модель для классификации знака
из кераса.модели импортировать load_model
модель = load_model ('traffic_classifier.h5')

#dictionary для обозначения всех классов дорожных знаков.
classes = {1: 'Ограничение скорости (20 км / ч)',
            2: «Ограничение скорости (30 км / ч)»,
            3: «Ограничение скорости (50 км / ч)»,
            4: «Ограничение скорости (60 км / ч)»,
            5: «Ограничение скорости (70 км / ч)»,
            6: «Ограничение скорости (80 км / ч)»,
            7: «Конец ограничения скорости (80 км / ч)»,
            8: «Ограничение скорости (100 км / ч)»,
            9: «Ограничение скорости (120 км / ч)»,
            10: «Нет прохождения»,
            11: «Нет прохождения более 3.5 тонн »,
            12: «Полоса отвода на перекрестке»,
            13: "Приоритетная дорога",
            14: 'Урожайность',
            15: "Стоп",
            16: «Нет транспортных средств»,
            17: «Veh> 3,5 тонны запрещены»,
            18: «Вход запрещен»,
            19: 'Общее предостережение',
            20: 'Опасный поворот налево',
            21: 'Опасный поворот вправо',
            22: 'Двойная кривая',
            23: 'Неровная дорога',
            24: 'Скользкая дорога',
            25: "Дорога сужается справа",
            26: «Дорожные работы»,
            27: "Светофоры",
            28: "Пешеходы",
            29: 'Детский переход',
            30: «Велосипедный переход»,
            31: 'Остерегайтесь льда / снега',
            32: «Переход диких животных»,
            33: «Конечная скорость + ограничения прохождения»,
            34: "Поверните направо",
            35: "Поверните налево",
            36: 'Только вперед',
            37: "Иди прямо или направо",
            38: "Идите прямо или налево",
            39: "Держись правее",
            40: "Держись левее",
            41: "Обязательный круговой транспорт",
            42: 'Конец непроходимости',
            43: 'End no pass veh> 3.5 тонн »}

#initialise GUI
top = tk.Tk ()
top.geometry ('800x600')
top.title ('Классификация дорожных знаков')
top.configure (background = '# CDCDCD')

label = Label (вверху, background = '# CDCDCD', font = ('arial', 15, 'bold'))
sign_image = Метка (вверху)

def classify (путь к файлу):
    global label_packed
    image = Image.open (путь к файлу)
    image = image.resize ((30,30))
    image = numpy.expand_dims (изображение, ось = 0)
    image = numpy.array (изображение)
    pred = model.predict_classes ([изображение]) [0]
    знак = классы [пред + 1]
    печать (подпись)
    метка.настроить (передний план = '# 011638', текст = знак)

def show_classify_button (путь к файлу):
    classify_b = Кнопка (вверху, text = "Классифицировать изображение", command = lambda: classify (file_path), padx = 10, pady = 5)
    classify_b.configure (background = '# 364156', foreground = 'white', font = ('arial', 10, 'bold'))
    classify_b.place (relx = 0,79, rely = 0,46)

def upload_image ():
    пытаться:
        file_path = filedialog.askopenfilename ()
        uploaded = Image.open (путь к файлу)
        uploaded.thumbnail (((top.winfo_width () / 2.25), (top.winfo_height () / 2.25)))
        im = ImageTk.PhotoImage (загружено)

        sign_image.configure (изображение = им)
        sign_image.image = im
        label.configure (текст = '')
        show_classify_button (путь к файлу)
    Кроме:
        проходить

upload = Button (вверху, text = "Загрузить изображение", command = upload_image, padx = 10, pady = 5)
upload.configure (background = '# 364156', foreground = 'white', font = ('arial', 10, 'bold'))

upload.pack (side = BOTTOM, pady = 50)
sign_image.pack (side = BOTTOM, expand = True)
label.pack (side = BOTTOM, expand = True)
heading = Label (вверху, text = "Знай свой дорожный знак", pady = 20, font = ('arial', 20, 'bold'))
заголовок.настроить (фон = '# CDCDCD', передний план = '# 364156')
heading.pack ()
top.mainloop () 

Выход:

graphical user interface for project in python

Сводка

В этом проекте Python с исходным кодом мы успешно классифицировали классификатор дорожных знаков с точностью 95%, а также визуализировали, как наша точность и потери меняются со временем , что довольно неплохо для простой модели CNN.

Пора стать следующим разработчиком Python

Запишитесь на онлайн-курс Python в DataFlair прямо сейчас!

Если вам понравился проект Python по классификации дорожных знаков, поделитесь им в социальных сетях с друзьями и коллегами.Чтобы увидеть больше подобных проектов, продолжайте посещать DataFlair.

.

Распознавание дорожных знаков — Повторная публикация в Википедии // WIKI 2

Распознавание дорожных знаков (ограничения скорости)

Распознавание дорожных знаков (TSR) — это технология, с помощью которой транспортное средство может распознавать дорожные знаки, установленные на дороге, например «ограничение скорости» или «дети» или «поворот вперед». Это часть функций, которые вместе называются ADAS. Эта технология разрабатывается различными поставщиками автомобилей. Он использует методы обработки изображений для обнаружения дорожных знаков.Способы обнаружения в целом можно разделить на методы на основе цвета, формы и методы обучения.

Энциклопедия YouTube

  • ✪ Распознавание дорожных знаков и видеорегистратор для автомобиля на смартфоне или умная Android-навигация — приложение Roadar

  • ✪ Автономный автомобиль, Распознавание полос движения, Распознавание дорожных знаков — Румыния

  • ✪ Интеллектуальная система распознавания дорожных знаков

Содержание

История

Венская конвенция о дорожных знаках и сигналах — это договор, подписанный в 1968 году, который позволил стандартизировать дорожные знаки в разных странах.Этот договор подписали около 52 стран, в том числе 31 страна Европы. Конвенция в целом разделила дорожные знаки на семь категорий, обозначенных буквами от A до H. Эта стандартизация стала основным стимулом для помощи в разработке систем распознавания дорожных знаков, которые могут использоваться во всем мире.

A speed limit sign in the United States

Знак ограничения скорости в США

Распознавание дорожных знаков впервые появилось в форме распознавания знаков ограничения скорости в 2008 году для Vauxhall Insignia 2009 года. [1] Позже, в 2009 году, они появились на новом BMW 7 серии, а в следующем году на Mercedes-Benz S-Class. В то время эти системы обнаруживали только круглые знаки ограничения скорости, встречающиеся по всей Европе (например, [2] ).

Системы второго поколения также могут обнаруживать ограничения обгона. Он был представлен в 2008 году в моделях Opel Insignia, [3] , позже последовали Opel Astra и Saab 9-5. Эта технология также доступна на Volkswagen Phaeton [4] 2011 года выпуска и, с 2012 года, на Volvo S80, V70, XC70, XC60, S60, V60 и V40 в качестве технологии, называемой Road Sign Information . [5] Они не могут распознавать городские ограничительные знаки, которые в большинстве европейских стран ассоциируются с ограничением скорости, поскольку они слишком похожи на указатели.

Ожидается, что такие системы станут обязательными для новых автомобилей, продаваемых в ЕС с мая 2022 года. [6] [7]

Реализация

Как работает система распознавания дорожных знаков?

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

An example algorithm for traffic-sign detection

Пример алгоритма обнаружения дорожных знаков

Современные системы распознавания дорожных знаков разрабатываются с использованием сверточных нейронных сетей, в основном отвечающих требованиям автономных транспортных средств и беспилотных автомобилей.В этих сценариях система обнаружения должна определять различные дорожные знаки, а не только ограничения скорости. Здесь на помощь приходит Венская конвенция о дорожных знаках и сигналах. Сверточную нейронную сеть можно обучить воспринимать эти предопределенные дорожные знаки и «учиться» с помощью методов глубокого обучения.

Нейронная сеть, в свою очередь, использует обработку изображений и компьютерное зрение для обучения сети ее потенциальным результатам. Обученную нейронную сеть затем можно использовать в реальном времени для обнаружения новых дорожных знаков в реальном времени.Компании по производству беспилотных автомобилей, включая Waymo и Uber, создают и передают на аутсорсинг наборы данных дорожных знаков вместе с картографическими и навигационными компаниями, такими как Tom Tom. [8] Современные методы компьютерного зрения и нейронные сети делают эту цель высокоэффективной и достижимой в реальном времени.

An example implementation of the image preprocessing steps in a traffic-sign detection algorithm

Пример реализации этапов предварительной обработки изображения в алгоритме обнаружения дорожных знаков

Существуют различные алгоритмы распознавания дорожных знаков. Распространенными являются те, которые основаны на форме вывески.Типичные формы вывески, такие как шестиугольники, круги и прямоугольники, определяют различные типы знаков, которые можно использовать для классификации. Другие основные алгоритмы распознавания символов включают в себя функции, подобные Хаару, код Freeman Chain, обнаружение AdaBoost и методы нейронных сетей глубокого обучения. Функции, подобные Хаару, можно использовать для создания каскадных классификаторов, которые затем могут помочь обнаружить символы вывески.

Глубокое обучение может быть включено в систему обнаружения дорожных знаков. Полигональная аппроксимация цифровых кривых с использованием алгоритма Рамера – Дугласа – Пекера может использоваться для определения формы вывесок, а такие методы, как Support Vector Machines и Byte-MCT с классификатором AdaBoost, были использованы в одном из методов обнаружения дорожных знаков. [9]

Список литературы

См. Также

An example implementation of the image preprocessing steps in a traffic-sign detection algorithm Эта страница последний раз была отредактирована 30 августа 2020 в 04:23 .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *