Вступление
Если 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
Прежде чем двигаться дальше, вам нужно будет установить все вышеперечисленные предварительные условия самостоятельно, поскольку это не входит в объем данного руководства. Однако это довольно просто, и есть масса ресурсов, на которые вы можете ссылаться в Интернете.
Обнаружение номерного знака с 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.
Ресурсы и ссылки
Обнаружение и распознавание номерных знаков в неограниченных сценариях
Ссылка на всю серию:
Часть 1: Обнаружение номерного знака с Wpod-Net
Часть 2: Сегментация символов пластин с помощью OpenCV
Часть 3: Распознавание автомобильных номерных знаков с помощью OpenCV и глубокого обучения