car-number-detection
car-number-detection copied to clipboard
Car's plate detection and car's colour detection with YOLO5 and LPRnet
Сar-number-detection
Проект реализуется в рамках курса по глубокому обучению.
Задача
Задача стояла в следующем: Существует предприятие, директора интересуют автомобильные номера. Есть камера, она шлет поток, мы из него выделяем фото. Распознаем:
- Российские номера
- Тип автомобиля
- Цвет автомобиля
- Кто из работников уезжает домой пораньше
Quick Start
Чтобы запустить проект локально, необходимо:
- Создать виртуальное окружение
- Установить зависимости из requirements.txt:
pip install -r requirements.txt
- Проверить пути до весов/видео
-
python main.py
Решение
Для распознавания автомобиля по типам и номерного знака на изображении была дообучена YOLOv5. Пайплайн выглядит следующим образом:
- Сначала определяется, что бокс номера лежит внутри бокса машины, тогда номерной знак присваивается этой машине
- Записывается тип машины и координаты номера и бокса автомобиля
- Затем происходит распознавание номера машины и проверка распознанного номера по регулярному выражению
- Производится распознование цвета автомобиля
Пример распознавания:
При запуске программы можно остановить ее, нажав на клавишу "q", также можно остановиться на определенном фрейме на пять секунд во время возпроизведения видео, нажав на клавишу "s".
Производительность алгоритма:
На CPU алгоритм обрабатывает 2.7577 изображения в секунду (FPS). Эксперименты проводились на компьютере с 2,2 GHz Intel Core i7
![Снимок экрана 2022-10-09 в 13 36 12](https://user-images.githubusercontent.com/27068383/194752096-7be94ab1-7f43-4a9b-9314-9ff58d9016a6.png)
![Снимок экрана 2022-10-09 в 13 35 48](https://user-images.githubusercontent.com/27068383/194752086-e0f2957b-a509-46d9-a11d-eebafa9f8725.png)
Распознавание номера
Для распознавания номера на номерных знаках сначала использовался tesseract, но точность получилась низкая:
После этого было принято решение обучить нейросеть архитектуры LPRnet. Точность распознавания текста 89,6%.
Детекция цвета
Для распознавания цвета каждый бокс машины сначала разбивался на вектора трех цветов: красный, синий, зеленый (с помощью метода OpenCV split()). Затем брались максимумы из каждого из векторов и значение максимума записывалось в общее значение цвета изображения в формате BGR (то есть максимальное значение из синего, из зеленого и из красного записывалось в общее значение).
Затем то же самое производится с изображениями из обучающего датасета (директория training_data). Каждое из изображений находится в папке соответствующего цвета (так происходит разметка датасета). Таким образом, в файл training.data сохраняются значения BGR для каждого изображения из обучающей выборки и тот цвет, который представлен на изображении.
В файл test.data сохраняется значение BGR для изображения, цвет которого мы детектируем. Затем с применением KNN-классификации определяется, какой цвет у машины.
Дерево проекта
├── colour_detection
│ ├── detect_color.py
│ └── training_dataset
│ ├── black
│ │ ├── black1.png
│ │ ├── black10.png
│ │ ...
│ ├── blue
│ │ ├── blue.jpg
│ │ ├── blue1.jpg
│ │ ...
│ ├── green
│ │ ├── green1.jpg
│ │ ...
│ ├── orange
│ │ ├── orange1.png
│ │ ├── orange10.png
│ │ ...
│ ├── red
│ │ ├── red1.jpg
│ │ ├── red10.jpg
│ │ ...
│ ├── violet
│ │ ├── violet1.png
│ │ ├── violet10.png
│ │ ...
│ ├── white
│ │ ├── white1.png
│ │ ├── white10.jpg
│ │ ...
│ └── yellow
│ ├── yellow1.jpg
│ ├── yellow2.png
│ ...
├── lpr_net
│ ├── data
│ │ ├── NotoSansCJK-Regular.ttc
│ │ ├── __init__.py
│ │ └── load_data.py
│ ├── model
│ │ ├── __init__.py
│ │ ├── lpr_net.py
│ │ └── weights
│ │ ├── Final_LPRNet_model.pth
│ │ └── LPRNet__iteration_2000_28.09.pth
│ └── rec_plate.py
├── main.py
├── object_detection
│ ├── YOLOS_cars.pt
│ └── detect_car_YOLO.py
├── requirements.txt
├── settings.py
├── test
│ └── videos
│ ├── test.mp4
│ └── test2.mp4
└── track_logic.py
Датасет
Датасет состоит из 4 классов:
- 0 - номера автомобилей
- 1 - легковые автомобили
- 2 - грузовые автомобили
- 3 - общественный транспорт
Train/test split
В обучающей выборке: 1200 изображений (92%)
В тестовой выборке: 103 изображения (8%)
Описание обученных моделей
В задаче распознавания объектов на изображении были проведены эксперименты с обучением моделей на сетях с разной архитектурой. Все гиперпараметры в YOLO изначально подобраны оптимальным образом, мы меняли только архитектуру, чтобы получить наиболее точную.
Модель YOLOv5n
Класс | mAP50 | mAP50-95 |
---|---|---|
Для всех | 0.855 | 0.708 |
0 (Номерные знаки) | 0.907 | 0.641 |
1 (Легковые автомобили) | 0.851 | 0.76 |
2 (Грузовые автомобили) | 0.87 | 0.75 |
3 (Общественный транспорт) | 0.792 | 0.682 |
Модель YOLOv5s
Класс | mAP50 | mAP50-95 |
---|---|---|
Для всех | 0.807 | 0.709 |
0 (Номерные знаки) | 0.91 | 0.691 |
1 (Легковые автомобили) | 0.827 | 0.786 |
2 (Грузовые автомобили) | 0.777 | 0.723 |
3 (Общественный транспорт) | 0.712 | 0.635 |
Модель YOLOv5m
Модель была обучена на 19 эпохах, так как размер датасета был слишком маленьким для сети такого размера.
Класс | mAP50 | mAP50-95 |
---|---|---|
Для всех | 0.848 | 0.726 |
0 (Номерные знаки) | 0.932 | 0.69 |
1 (Легковые автомобили) | 0.859 | 0.795 |
2 (Грузовые автомобили) | 0.839 | 0.762 |
3 (Общественный транспорт) | 0.761 | 0.658 |