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

Это программное обеспечение было создано для демонстрационных целей и в некоторых случаях оно не способно выявлять соответствующие нарушения. В случае дальнейшего развития он сможет автоматически обнаруживать большинство видов нарушений ПДД, а не только те, которые связаны с пересечением сплошной линией и красным светом. Далее я описываю технические детали реализации и делаю некоторые иллюстрации.

При разработке этого проекта целью было как можно быстрее получить MVP. Поэтому в некоторых случаях вместо лучшего подхода выбирается какой-то подход, чтобы сэкономить время. Проект был реализован путем повторного использования доступных алгоритмов и доступной кодовой базы с открытым исходным кодом в максимально возможной степени, чтобы писать как можно меньше кода и тратить как можно меньше времени. Проект был разработан на Python3 с широким использованием SciPy [https://www.scipy.org/] и OpenCV [https://opencv.org/]. Пользовательский интерфейс основан на GTK [https://www.gtk.org/].

Для анализа видео и выявления нарушений, присутствующих в ролике, был использован следующий подход. Сначала модели дороги и движения транспортных средств получаются путем обработки видеопотока. Во-вторых, эти модели объединяются и анализируются для выявления нарушений ПДД.

Анализ дороги

Для анализа структуры дороги используется ручной подход. В этом проекте анализируются прямые линии дорожной разметки. Сплошные прямые линии играют ключевую роль в структурировании дороги. Такими линиями являются стоп-линии, кромочные линии, двойные линии и другие.

Сначала фоновое изображение видео извлекается с помощью алгоритма извлечения фона / переднего плана [https://sagi-z.github.io/BackgroundSubtractorCNT/]. Извлечение фона позволяет исключить из видео движущиеся объекты и получить четкое изображение дороги. Во-вторых, фоновое изображение анализируется для обнаружения прямых линий дороги.

Один из самых популярных способов найти прямые линии на изображении - это предварительно обработать изображение с помощью алгоритма детектора краев, а затем применить преобразование Hough [https://en.wikipedia.org/wiki/Hough_transform, https: // docs. opencv.org/3.0-beta/modules/imgproc/doc/feature_detection.html?highlight=houghline#cv2.HoughLinesP ] для идентификации линий. Реализации этих алгоритмов доступны в библиотеке OpenCV. Хотя этот алгоритм является довольно общим, он не дал требуемых результатов. Проблема заключалась в том, что параллельно с обнаружением прямых линий, которые видны на изображении, другие участки изображения, содержащие много краев, также идентифицировались как линии. В случае увеличения пороговых значений для линии дороги также часто не идентифицируются. Конечно, с дальнейшей предварительной обработкой изображения, например удалив небольшие непрямые кромки, можно было бы получить лучший результат, но выбран другой подход.

Для обнаружения линий сначала применяется алгоритм LSD [http://www.ipol.im/pub/art/2012/gjmr-lsd/article.pdf]. Реализация этого алгоритма также доступна в библиотеке OpenCV [https://docs.opencv.org/3.0-beta/modules/line_descriptor/doc/LSDDetector.html]

Затем, после обнаружения сегментов линии, чтобы определить, находятся ли несколько сегментов на одной линии, график составляется из обнаруженных сегментов. Узлы связаны друг с другом, когда соответствующие сегменты находятся почти на одной линии и достаточно близко. Затем идентифицируются компоненты связности графа, применяя соответствующий алгоритм [. Дж. Пирс, «Улучшенный алгоритм поиска сильно связанных компонентов ориентированного графа», Технический отчет, 2005 г.], реализация которого доступна в SciPy [https://docs.scipy.org/doc/scipy/reference/generated /scipy.sparse.csgraph.connected_components.html]. Наконец, соединенные компоненты обозначаются прямыми линиями.

Отслеживание транспортных средств

Следующим шагом будет получение модели положений и движений транспортного средства. Для обнаружения транспортных средств нейронная сеть YOLO обрабатывает кадры видеопотока [https://pjreddie.com/darknet/yolo/].

Чтобы идентифицировать транспортные средства и сглаживать колебания прогнозируемых местоположений в последовательности обнаружений, к обнаружениям применяется алгоритм SORT. [https://arxiv.org/pdf/1602.00763.pdf, https://github.com/abewley/sort]. Этот алгоритм использует элементарную комбинацию методов, таких как фильтр Калмана и венгерский алгоритм для отслеживания компонентов, но в то же время этот подход обеспечивает точность, сравнимую с современными онлайн-трекерами. После этого на основе результатов отслеживания составляется траектория движения транспортного средства, и она сглаживается.

Логика нарушения

До этого я описал, как получаются модели траектории движущегося транспортного средства и линий разметки дороги. После обнаружения линий они отображаются в окне приложения, и пользователь может установить любой тип линии (лицевая, параллельная) или оставить его без указания типа. Передние линии предназначены для использования поперек проезжей части, а параллельные - вдоль проезжей части. Пересечение линий считается нарушением. В случае линии фронта также можно выбрать цвет светофора, чтобы определить, является ли пересечение этой линии в определенный момент нарушением или нет.

Иллюстрации

Следующие видео демонстрируют работу программного обеспечения. Видео создаются на основе прямых трансляций с камер видеонаблюдения на YouTube. Поскольку в течение короткого периода времени обычно бывает мало нарушений ПДД, линии обычно устанавливаются на красный (красный свет), чтобы создать искусственные нарушения. Можно заметить, что не все соответствующие нарушения выявляются. В некоторых случаях это связано с тем, что YOLO не обнаруживает автомобили. Это может быть значительно улучшено за счет дополнительного обучения нейронной сети на изображениях, снятых с камер дорожного движения. В других случаях путь нарушившего транспортного средства фактически не пересекает линию, что можно улучшить, настроив логику нарушения. Например, рассматривая 2D-проекцию 3D-сцены, простое возможное улучшение пересечения передней линии состоит в том, чтобы продлить линии до верхнего направления камеры. Я решил прекратить линейный анализ на этом этапе, потому что в процессе производства я планирую использовать другой подход для получения модели дороги, которая даст более точное и подробное представление.

Код проекта доступен на GitHub https://github.com/partus/traffic-violation-detection-demo.

Особая благодарность Арсену Мамиконяну, Тиграну Геворгяну и Сааку Агамиряну за полезные обсуждения.