Детектирование автомобильных номеров на видео

  1. Введение
  2. Установка
  3. Иерархия файлов и папок
  4. Аргументы командной строки
  5. Примеры запуска системы распознавания через командную строку
    1. Запуск видео на CPU
    2. Запуск видео на GPU
    3. Пример работы с онлайн камерой
  6. Описание выходных данных
    1. Обработанное видео
    2. Файл txt со списком номеров
    3. Кадры с номером
  7. Тестирование
  8. Определение точности системы
    1. AccurancyAsk.py
    2. AccurancyChecking.py
    3. AccurancyConclusion.py
  9. Схема работы системы (для понимания логики программы)
  10. Создание частотной heatmap (тепловой карты) нахождения автомобильных номеров
  11. Ссылки

Введение

Сервис распознает автомобильные номера на видео или с онлайн камер. Достаточно указать это в аргументах при запуске сервиса. Чтобы запускать сервис с использованием видеокарты (GPU) необходимо указать это в аргументах при запуске системы.

Сервис основан на базе NomeroffNet.

Установка

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

python >=3.6

opencv >=3.4

git clone https://github.com/ria-com/nomeroff-net.git
cd nomeroff-net
git clone https://github.com/youngwanLEE/centermask2.git
pip3 install torch==1.6
pip3 install PyYAML==5.3
pip3 install 'git+https://github.com/facebookresearch/detectron2.git'
pip3 install torchvision==0.7.0
pip3 install Cython
pip3 install numpy
pip3 install -r requirements.txt

Далее необходимо выйти из директории nomeroff-net и произвести установку данной системы:

cd ..
git clone https://github.com/AnnaVeller/detect-license-plates-python.git

Обратите внимание, если текущий проект будет установлен не в ту же директорию, что и nomeroff-net, то необходимо в файле ModelDetect.py указать верный путь к nomeroff-net.

Иерархия файлов и папок

Все файлы с кодом располагаются в корневом каталоге.

В папке video находятся видео, которые могут быть обработаны. Чтобы их использовать - необходимо указать одно из них в командной строке при запуске скрипта Runprocess.Py (см. раздел аргументы командной строки).

В папку car_numbers попадают обработанные видео. Там же создается новая папка одноименная с видео, которое было обработано. В неё помещаютсяtxt-файлы со списком распознанных номеров на видео, три картинки кадров для каждой машины и с этих же кадров вырезка таблички номера.

car_numbers/:
[название видео]_detect.mp4 - обработанное видео

car_numbers/[название_видео]/:
[название видео].txt - список номеров, найденных на видео
[название видео]_[номер в файле txt]_1.jpg - один из первых кадров, где найден номер 
[название видео]_[номер в файле txt]_1_zone.jpg - табличка с номером с кадра выше
[название видео]_[номер в файле txt]_2.jpg - кадр с середины 
[название видео]_[номер в файле txt]_2_zone.jpg
[название видео]_[номер в файле txt]_3.jpg
[название видео]_[номер в файле txt]_3_zone.jpg
Схематично расположение файлов представлено ниже:

Структура каталога nomeroff-net представлена кратко. Чтобы показать, какие дополнительные директории необходимо скачать с GitHub (Если вы шли по установке выше - они уже скачаны) Структура каталогов проекта

Аргументы командной строки

При запуске Runprocess.Py необходимо указать аргументы:

--video=test.mp4 Название файла видео из папки video или ссылка на онлайн камеру. По умолчанию test.mp4

--file=test.txt Название файла, куда будет записаны координаты номеров (файлы сохраняются в папку car_numbers). По умолчанию [название видео].txt

--type=v или --type=s Тип того, что было передано в --video. v-видео, s-стрим. По умолчанию видео

--sec=0.5 Количество секунд между захватом кадров для обработки. По умолчанию 0.5 секунд

--gpu=False или --gpu=True Используется ли GPU. По умолчанию не используется

Пример запуска системы распознавания через командную строку

Основной файл, через который запускается вся система распознавания - это RunProcess.py.

1. Запуск на CPU:

python3 RunProcess.py --video=multy_mini.MOV --file=multy_mini.txt --type=v --gpu=False

Это будет аналогично из-за дефолтных настроек этому:

python3 RunProcess.py --video=multy_mini.MOV

2. Запуск на GPU

python3 RunProcess.py --video=multy_mini.MOV --sec=0.5 --gpu=True

3. Использование онлайн камеры в качестве видео

python3 RunProcess.py --video=[URL на камеру] --file=camera_online.txt --type=s --gpu=False

Чтобы остановить работу скрипта необходимо нажать Ctrl+c

Описание выходных данных

1. Обработанное видео

Это видео, на котором указан номер, найденный на текущем кадре, итоговый номер, регион автомобиля.

Найденный номер на кадре может быть синего и голубого цвета:

blue l-blue

Cиний номер означает, что такая комбинация символов может быть номером. Голубой обозначает обратное.

Синие номера, при помощи несложного алгоритма соединаются в один номер, который называется итоговым и выделен на каждом кадре красным:

red

Соответсвенно, с каждый кадром, накапливается информация по номерам и красный номер может меняться.

Обработанное видео имеет ту же длину, что и исходное. Однако fps (frames per second) отличается и равно 1/sec. Sec - параметр, переданный в командной строке.

Ниже на изображении ещё раз даны комментарии:

2. Файл txt со списком номеров

Файл содержит все номера, встреченные в видео. На первой строчке даны характеристики видео. Далее идет порядковый номер автомобильного номера и распознанный итоговый номер:

[Высота] [Ширина] [Название видео] [fps]

[порядковый номер] [автомобильный номер]

[порядковый номер] [автомобильный номер]

...

3. Кадры с номером

Для подсчета точности системы нам нужны скриншоты с номерами. Поэтому с каждого распознанного номера мы сохраняем три скриншота: в начале, середине и конце:

Тестирование

Для тестирования были подготовлены видео с КПП и переданы в данную систему. Ниже сделаны скриншоты с видео: test

Определение точности системы

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

1. Сначала запускается AccuracyAsk.py

Аргумент --name- это имя папки с видео = название видео без разрешения = файл со списком номеров без разрешения

python3 AccuracyAsk.py --name=multy_mini

В этом скрипте необходимо на каждый номер из списка выбрать: true/false/unknown:

  • true (можно также написать t/1/yes/y ) - номер на картинке совпадает с номером в названии;

  • false (0/f/no/n) - не совпадает;

  • unknown (-1/?/unknown/x) - номер плохо различим

Так будут выглядеть картинки:

2. Затем можно быстро проверить свои ответы с AccuracyChecking.py

python3 AccuracyChecking.py --name=multy_mini

check

Этот скрипт сделан исключительно чтобы ПРОСМОТРЕТЬ быстро ответы. Для исправления необходимо открыть этот файл и вручную исправить.

3. Получить точность можно с помощью AccuracyConclusion.py

python3 AccuracyChecking.py --name=multy_mini

В итоге в консоль будет выведено:

conclusion

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

Данная UML - диаграмма показывает откуда происходит начало (запуск) системы и какие функции в каких файлах задействует. На диаграмме представлены только основные функции и файлы.

Построение частотной heatmap (тепловой карты) нахождения автомобильных номеров на видео или онлайн камерах

Эта задача нужна, чтобы выделить те регионы, где чаще всего встречаются автомобильные номера. Задача решена в проекте heatmap-location-car-plates. Он устанавливается и запускается отдельно от текущего проекта.

Вот примеры его работы:

heatmap

Ссылки