Вступление

Если 20 лет назад создание надежной системы автоматического распознавания номерных знаков (ALPR) можно было рассматривать как степень магистра или доктора в области компьютерного зрения. В настоящее время рост машинного обучения (ML), особенно с формированием нейронной сети и библиотек ML с открытым исходным кодом (Keras, Pytorch, MXNet и т. Д.), Дал нам значительную доступность для копирования и развертывания этих современных художественные программы. Если вы введете «Автоматическое распознавание номерных знаков с помощью машинного обучения» в строке поиска Google, может быть возвращено более 10 миллионов связанных результатов. Однако, хотя клонировать и запускать репозиторий Github с открытым исходным кодом легко, вы можете задаться вопросом что происходит в системе и как можно отменить инженер, чтобы создать собственное приложение.

По этой причине данное руководство создано, чтобы дать вам пошаговые инструкции по развертыванию типичной системы ALPR с использованием предварительно обученной модели Wpod-Net, методов компьютерного зрения с OpenCV и Распознавание символов с помощью нейронной сети.

Дорожная карта этого руководства разделена на три части:

  • Часть 1. Внедрение предварительно обученной модели под названием Wpod-Net для обнаружения и извлечения номерных знаков с изображениями транспортных средств из 10 разных стран (Германия, Вьетнам, Япония, Таиланд, Саудовская Аравия). , Россия, Корея, США, Индия, Китай).

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

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

Для кого это руководство:

  • Любой, кто только начал заниматься машинным обучением и компьютерным зрением (CV).
  • Тот, кто хочет получить практический опыт в развертывании проектов машинного обучения и резюме, прежде чем углубляться в эти области.
  • Базовые навыки программирования на Python являются преимуществом, но не обязательным условием.

Инструменты и библиотеки:

  • Python 3.7
  • Керас 2.3.1
  • Тензорфлоу 1.14.0
  • Блокнот Jupyter
  • Numpy 1.17.4
  • Матплотлиб 3.2.1
  • OpenCV 4.1.0

Прежде чем двигаться дальше, вам нужно будет установить все вышеперечисленные предварительные условия самостоятельно, поскольку это не входит в объем данного руководства. Однако это довольно просто, и есть масса ресурсов, на которые вы можете ссылаться в Интернете.

Репозиторий Github

Записная книжка части 1

Обнаружение номерного знака с Wpod-Net

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

$ git clone 
https://github.com/quangnhat185/Plate_detect_and_recognize.git

Затем откройте новую записную книжку и импортируйте все необходимые библиотеки и пакеты. Краткие описания и их функции показаны ниже:

  • cv2: библиотека компьютерного зрения, также известная как OpenCV, которую мы будем использовать для выполнения методов обработки изображений.
  • numpy: библиотека поддерживает работу с многомерными массивами и матрицами.
  • matplotlib: библиотека поддерживает построение и визуализацию наших данных.
  • local_utils: сценарий Python включает некоторые функции, которые будут использоваться для обработки данных из Wpod-Net.
  • os.path / glob: пакет / библиотека интерфейса операционной системы для python. Мы будем использовать их для работы с каталогами и файловой системой.
  • keras.models: мы будем использовать пакет model_from_json из этой библиотеки, чтобы загрузить архитектуру нашей модели в формате JSON.

Следующим шагом нам нужно будет загрузить нашу модель из предварительно обученной. Эта модель была создана sergiomsilva, и вы можете сослаться на его исходный код здесь. В моем репозитории Github вы можете найти два файла: wpod-net.h5 (сохраненные веса нашей обученной сети) и wpod-net.json (архитектура модели). После этого шага вы должны получить уведомление Загрузка модели успешно….

Впоследствии нам нужно создать функцию с именем preprocess_image для чтения и предварительной обработки изображений наших пластин. Эта функция в основном считывает анализируемое изображение (строка 2), преобразует его в RGB (строка 3) и нормализует данные изображения до диапазона 0–1 (строка 4), чтобы оно могло быть совместимо с matplotlib. Кроме того, мы можем установить resize = True, чтобы изменить размер всех изображений до одного и того же размера (ширина = 224, высота = 224) для визуализации цели на следующем шаге.

На этом этапе мы визуализируем наш набор данных автомобиля. Этот набор данных содержит 20 изображений транспортных средств с номерами, полученными из 10 разных стран (Германия, Вьетнам, Япония, Таиланд, Саудовская Аравия, Россия, Корея, США, Индия, Китай). В следующем блоке кода будут отображаться изображения наших тарелок и названия их стран на рисунке, состоящем из 5 столбцов и 4 строк. Вы можете попробовать поиграть с размером фигуры (строка 6), а также с количеством столбцов и строк (строки 7 и 8). Рисунок 1 иллюстрирует результат визуализации.

Found 20 images...

Теперь давайте напишем функцию с именем get_plate, которая обрабатывает необработанное изображение, отправляет его в нашу модель и возвращает изображение пластины (LpImg) и его координаты (cor). Если номерной знак не обнаружен, программа предупредит вас об ошибке «Номерной знак не найден!». В этом случае попробуйте увеличить значение Dmin, чтобы отрегулировать размер границы. Следует отметить, что Wpod-Net может обнаруживать только стандартные номера (черный символ, белый фон), и если изображение слишком размытое или пластина скрыта препятствиями, модель может не предсказать этого.

Затем мы реализуем эту функцию на тестовом изображении и получаем результат, показанный на рисунке 2.

Detect 1 plate(s) in china_car_plate
Coordinate of plate(s) in image: 
 [array([[253.34864037, 508.28028195, 497.12277873, 242.19113715],
       [471.69134945, 526.6670509 , 635.22632653, 580.25062507],
       [  1.        ,   1.        ,   1.        ,   1.        ]])]

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

Наконец, давайте выполним функцию get_plate (строка 11) для всех изображений транспортных средств и построим полученные изображения номеров, как показано как рисунок 4 со следующим кодом:

Бонус!

До сих пор мы знали, как извлечь изображение номера, а также его координаты из изображения транспортного средства, используя предварительно обученную модель Wpod-Net. Если вы заметили, мы обнаружили только один номерной знак с каждого изображения. Однако Wpod-Net может обнаруживать несколько номерных знаков в одном кадре, как показано на рисунке 5. Вы можете обратиться к следующему коду, чтобы узнать, как мы можем обнаружить несколько номерных знаков:

Detect 2 plate(s) in multiple_plates

Что следующее?

В этом уроке мы узнали, как предварительно обработать изображения автомобилей и получить номерные знаки, используя предварительно обученный режим Wpod-Net. Как видите, Wpod-Net - мощный инструмент, так как он смог прилично обнаруживать и извлекать номерные знаки из 10 разных стран. Тем не менее, это не означает, что Wpod-Net точен на 100%. Скорее всего, модель может возвращать некоторые похожие на номерные знаки объекты (рекламные щиты, дорожные знаки и т. Д.) Вместе с правильными. Мы можем отфильтровать эти неожиданные объекты, используя несколько методов резюме, но это выходит за рамки данной статьи.

Возможность извлекать номерной знак из изображения автомобиля - это «круто», но изображение номера не дает нам много информации… пока. В следующем уроке мы узнаем, как сегментировать каждый символ из изображения пластины в Части 2 и возвращать его в цифровой текст в Части 3.

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

Wpod-Net Paper

Обнаружение и распознавание номерных знаков в неограниченных сценариях

Ссылка на всю серию:

Часть 1: Обнаружение номерного знака с Wpod-Net

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

Часть 3: Распознавание автомобильных номерных знаков с помощью OpenCV и глубокого обучения