- Lisa Traffic Lights Dataset
-
- Был использован как основной датасет, т.к. не требовал большой работы по очистке и преобразованию данных, понятных нейросети
- DriveU Traffic Light Dataset (DTLD)
-
- Отказались по причине необходимости писать парсинги для извлечения tiff-файлов и калибрации
- Bosch Small Traffic Lights Dataset
-
- Отсутствие внятной документации
- Traffic Light Detection with ConvolutionalNeural Networks and 2D Camera Data
- https://github.com/level5-engineers/system-integration/wiki/Traffic-Lights-Detection-and-Classification
- https://arxiv.org/pdf/1906.11886.pdf
- A Deep Analysis of the Existing Datasets for Traffic Light State Recognition
- В сравнении кодеров-декодеров видео очевидно более быстрой оказалась утилита ffmpeg, в папку modules были добавлен data unpacker.
- LISA была размечена при помощи pandas, были убраны все ненужные параметры (например, на какое видео ссылается кадр). Итоговый датафрейм состоял из frame_id, уникального идентификатора кадра, путь к кадру, бокс светофора, и его состояние (можно найти в datasets/final.csv)
- Первоначальной идеей для модели предсказания было взять уже предобученную CNN, используя Torch Hub. Изучив SOTA в отношении детекции обьектов, мы решили обратить внимание на R-CNN, а конкретно, Faster R-CNN, она имелась в хабе, а значит ее несложно было заимплементить в общий проект, к тому же, была одной из лучших по точности предсказаний. Также, запасным вариантом была YOLO, т.к. была достаточно быстрой и практически везде всплывала. Был дописан переход от боксов Lisa к YOLO, (одна ошибка в котором немного позже стоила нам недели работы). Параметры (x_min, y_min, x_max, y_max) преобразовывались в координаты центра бокса(x, y, ширины width и высоты height).
- Впоследствии выяснилось, что Faster R-CNN совсем не укладывается в необходимое время работы системы, несмотря на наши попытки изменять разрешение кадра и вырезать участки, где расположены большинство светофоров на кадрах.
- После неудачи с Faster R-CNN, мы вернулись к YOLO. Было принято решение всё же собрать архитектуру с нуля по туториалам, используя это, дабы иметь больший контроль над системой. Однако, обработку output'а YOLO, а именно поиск наилучшего бокса,мы решили взять с другой имплементации. Совместить их было гораздо труднее, чем мы ожидали, и впоследствии сменили её на готовую модель.
- Вот тут и всплыла ошибка, описанная на 3-м шаге. Наша текущая на момент реализация YOLO при обучении, в абсолютно случайных местах в датасете выдавала ошибку, что боксы светофоров больше, чем сам кадр (все параметры вывода боксов после yolo не должны выходить за интервал [0, 1] Конечно, проверка боксов в датасете показывала, что все нормально. После длительного перерыва и более глубокого разбора, мы нашли проблему: в текущей имплементации, для аугментаций использовался модуль albumentations, в котором немного странно работает нормализация боксов для YOLO, часть форумов об этом писала. Оказалось, что при делении боксов на разрешение, чтобы получить интервал [0, 1], при нахождении width и height боксов необходимо было не только делить на 2, но и вычитать один пиксель. Иначе Albumentations не принимал наши боксы. Временным решением, пока мы не узнали в чем проблема, было подкорректировать исходный код мудуля augmentations, отвечающего за боксы, bbox_utils, дабы он все боксы, при аугментации выходившие за интервал, возвращал до нуля или единицы.
- В целом, эта реализация имела и ряд других проблем, поэтому, мы решили все же снова сменить имплементацию модели на эту, ставшую уже последней.
- Изменив необходимые параметры для загрузки нашего датасета (в данной имплементации, они выполняются через .yaml-файлы), заморозив backbone-часть сети (а первоначально, мы этот шаг пропустили, за что, естественно, пожалели) мы попытались поучить сеть на домашнем ПК с GTX960 2GB, конечно же, не уложившись по памяти.
- Паралелльно, были размечены кадры с папки проекта phase_I вручную, используя YOLO Annotation Tool. Размеченные 600 кадров были добавлены в валидационную выборку.
- Вернувшись в colab, всё же правильно настроив все параметры, мы начали процесс обучения, но за 20 эпох толкового результата не оказалось. Необходимо было что-то изменить. И возникла интересная, но простая идея: взять обученную YOLO на датасете MS COCO, т.к. там уже присутствует класс 'Traffic_light', и дообучить сеть на датасете LISA. Было дообучено 10 эпох, с замороженной backbone-частью.
- На валидационной выборке мы получили, фактически, отсутствие внятных метрик. Обьясняется это, возможно, багом системы. Это не оказало никакого влияния на эффективность работы нейросети на случайном неразмеченном видео. К тому же, постоянное падение лосса убедило нас не обращать на это внимание.
- Так как по итогу наша сетка размечает светофоры, выделяя непосредственно кружок активного состояния светофора, мы решили определять цвет средствами open-cv. Для этого мы кропаем бокс светофора (кружка), переводим ихображение в формат HSV, что позволяет нам подобрать экспериментально диапазон значений в формате HSV, которые соответствуют каждому из цветов, в случае неопознанного цвета (не желтого/красного/зеленого) мы выводим значение unknown. Получились довольно хорошие результаты. Более того, если наша сетка делает ошибку, в ходе которой размечается объект с цветом отличным от зеленого/красного/желтого, классификатор определяет объект как unknown, что тем самым не вредит метрике.
- Основая проблема нашей сетки - это мигания цвета и выбросы, которые мы решили с помощью постобработки, фактически используем скользящее среднее для сглаживания мигания, а также убираем выбросы, в случае, если они появляются
- В папке datasets находится первоначальный ноутбук обработки LISA, а также метаданные.
- В modules: ранние декодировщик и кодировщик видео, а также класс Dataset для работы с torch.
- train_colab.ipynb - ноутбук, где проходило дообучение
- Project.ipynb - ноутбук, где мы предсказываем видео
- FPSMeter.ipynb - ноутбук для определения фпс (по содержанию такой же как и Project.ipynb, но весь код умещен в 1 cell, чтобы удобнее было определить время работы)
- yolov3 хранит основые файлы проекта:
-
- в папке data - скрипты загрузки датасета MS COCO, yaml-файлы для разметки данных, включая наш - traffic.yaml
-
- models содержит архитектуру yolov3 и её файлы конфигурации, а также код, позволяющий преобразовывать выходные данные модели в боксы
-
- в utils находятся файлы подсчета лосса, метрик, функции для визуализации, работа с датасетами и пр.
-
- weights содержит скрипт, который позволяет подгружать веса предобученной YOLO.
-
- train.py и test.py запускают процесс обучения нейросети и её валидации соответственно, detect_custom.py позволяет визуализировать результаты работы.
https://drive.google.com/file/d/1waoOULCmz1PA0K4pfSkTVHsCe9GYxzte/view?usp=sharing
Видео из 1203 кадров за 57 секунд. Поиск светофоров происходит за 26 секунд, то есть, оптимизировав блоки определения цвета и постобработки, можно добиться реал-тайм системы.