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

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

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

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

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

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

Краткое введение в глубокое обучение:

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

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

К проекту:

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

Я буду использовать предварительно обученную модель, Wpod-Net и Computer Vision с OpenCV.

В этом проекте 3 части:

Часть 1.Реализация предварительно обученной модели Wpod-Net для обнаружения и извлечения номерных знаков изображений автомобилей в Кении.

Часть 2.Сегментация символов с помощью OpenCV

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

Вот основные инструменты и библиотеки, которые я использовал в Jupyter Notebook:

· Питон

· НумПи

· Матплотлиб

· ТензорФлоу

· Керас

· OpenCV

Также, вот краткое описание и функционал перечисленных выше библиотек:

· os.path/glob: пакет интерфейса операционной системы для Python, используемый для работы с каталогами и файловой системой.

· local_utils: скрипт Python, содержащий несколько функций, которые будут использоваться для обработки данных из Wpod-Net.

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

· Matplotlib: библиотека, позволяющая отображать и визуализировать данные и изображения.

· Keras: библиотека нейронных сетей с открытым исходным кодом, работающая с TensorFlow.

Я буду использовать пакет: model_from_json из библиотеки Keras, чтобы загрузить модель в архитектуру в формате JSON.

· cv2: OpenCV — это библиотека компьютерного зрения, которая будет использоваться для выполнения методов обработки изображений.

Часть 1. Предварительная обработка и извлечение изображений

В этой первой части я предварительно обработаю изображения транспортных средств и получу номерные знаки из изображений, используя предварительно обученную модель Wpod-Net, созданную Серджио Монтаццолли Сильва и Клаудио Розито Юнг.

Wpod-Net — это мощная модель компьютерного зрения, основанная на Keras, способная адекватно обнаруживать и извлекать номерные знаки. Wpod-Net способен в основном обнаруживать стандартные номерные знаки, и если изображение размыто или скрыто препятствиями, модель может не определить и распознать с точностью.

Чтобы загрузить эту модель, я создам вспомогательную функцию с именем load_model, чтобы открыть и прочитать предварительно обученную модель Wpod-Net в формате JSON. Я также загружу веса в эту вспомогательную функцию.

После успешной загрузки модели я предварительно обработаю изображения с помощью вспомогательной функции с именем preprocess_image, которая принимает в качестве аргументов путь к изображению и логическую опцию для изменения размера. Эта функция использует OpenCV для чтения изображений, преобразует цвет в RGB и нормализует пиксели в диапазоне от 0 до 1. Если аргумент для изменения размера равен True, функция изменяет размеры изображений до размеров 224X224 пикселей. Предварительно обработанные изображения возвращаются для визуализации.

Я визуализирую 9 изображений из набора данных моего автомобиля с изображениями кенийских номерных знаков, взятыми из Интернета.

Функция под названием get_plate используется для пересылки изображения через модель и возврата изображения и координат пластины. В случае ошибки будет выведено «Номер не найден!».

Вот вывод функции get_plate для изображения:

Резюме части 1: я извлек номерной знак и его координаты из изображения автомобиля, используя предварительно обученную модель Wpod-Net.

Часть 2. Сегментация символов

Здесь я сегментирую символы из номерного знака, извлеченные в части 1.

Реализация некоторой обработки изображения на извлеченном номерном знаке:

1. Преобразование его в стандартное изображение 8-битного масштаба для уменьшения вычислительной мощности, необходимой для обработки.

2. Преобразование его в изображение в градациях серого, поскольку цвет не имеет значения при сегментации символов.

3. Размойте изображение, чтобы удалить шум и ненужную информацию.

4. Выполнить пороговое значение изображения; таким образом, любое значение пикселя, меньшее порогового, будет преобразовано в 255, а любое значение пикселя, превышающее пороговое, будет преобразовано в 0. Это называется обратной двоичной пороговой обработкой.

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

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

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

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

Резюме части 2: Я сегментировал символы номерного знака и нарисовал на них ограничивающие рамки и отобразил сегментированные символы в сетке.

Часть 3. Распознавание символов путем обучения сверточной нейронной сети

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

Я выполню несколько методов предварительной обработки данных;

1. Уменьшите размер изображения до 80x80, чтобы обеспечить более высокую точность.

2. Выполните кодирование меток для меток, чтобы обеспечить их одинаковое представление.

3. Разделите набор данных на наборы данных для обучения и проверки, чтобы избежать переобучения.

4. Выполните увеличение изображения, используя небольшие базовые методы преобразования, например. вращение, изменение высоты и веса, масштабирование и растяжение и т. д.

Обратите особое внимание во время увеличения изображения, чтобы избежать вертикального или горизонтального вращения чисел, таких как «6» в «9». Модель будет обучена неправильно!

Затем я построю архитектуру MobileNets с предварительно обученными весами в наборе данных ImageNet. Модель импортируется напрямую из библиотеки Keras.

· Я изменил последний выходной слой, чтобы он имел размер столбцов закодированных меток, который равен 36. Этот слой будет выводить предсказанную вероятность каждого из 36 классов с помощью функции активации softmax.

· Затем инициализировать скорость обучения и значение затухания; и составление модели с функцией потерь и метриками: категориальной перекрестной энтропией и точностью соответственно.

Я буду обучать и оценивать модель с этими гиперпараметрами:

· Я выбрал большой размер пакета (300), чтобы снизить затраты вычислительной мощности, но с риском снижения производительности моей модели. Это компромисс, с которым нужно бороться во время тренировок.

· Я использовал 20 эпох для увеличения обучения и противодействия эффекту большого размера партии; следовательно, улучшить производительность моей модели.

· Я реализую некоторые функции обратного вызова для мониторинга метрик:

o EarlyStoppingостановит процесс обучения, если потеря при проверке не улучшится после 5 эпох, в то время как ModelCheckpointбудет сохранять веса модели каждый раз при проверке потеря улучшается.

o Модель приобрела точность 97% на проверочном наборе в конце процесса обучения.

Вот визуализация обучения и проверки: потеря и точность, которая также не показывает переобучения:

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

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

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

Вот другие удачные прогнозы:

Вывод:

Эта модель явно нуждается в улучшении.

Видно, что модель либо недоучилась на «4», либо перетренировалась на «А».

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

Любые другие предложения по улучшению приветствуются в разделе комментариев. Спасибо!

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

Что дальше?

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

Больше приложений? Здорово! Давайте послушаем их в комментариях.

Ресурсы и ссылки

  1. Wpod-Net Paper
  2. Глубокое обучение
  3. Сверточная нейронная сеть