Разработка видеоаналитики для контроля в общественных бассейнах

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Всем привет! В первой части статьи я делился вредными советами по подготовке датасета для сервисов видеоаналитики.

В ней, очевидно, не хватало технических деталей и кейса. Исправляюсь! Примером выступит разработанный нами ПАК с системой CV для предотвращения утопления в бассейне. 

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

Впереди - сочный лонгрид, на этот раз с картинками, схемами, графиками. Погнали! 

Функциональная архитектура 

Кратко о проекте. Стояла задача спроектировать систему оценки и оповещения об опасности утопления с функцией нейросетевой обработки видеопотока. 

Система – прототип программно-аппаратного комплекса (ПАК), который должен анализировать всю деятельность человека в воде: время над водой, скорость движения, типичные и нетипичные позиции человека в воде. ПАК должен оценивать угрозу утопления и передавать эти данные на пункт контроля безопасности.

Функциональная архитектура прототипа ПАК 
Функциональная архитектура прототипа ПАК 

Задачи системы компьютерного зрения (CV) 

Основной задачей являлось определение степени утопления. Как только человек переходит от стабильного поведения к опасному, система должна информировать пост безопасности. 

Для установки критериев степени утопления обратился к ГОСТ Р 59219-2020, где для автоматизированных систем установлены уровни определения опасности утопления: 

– Желтый: прекращение движения объекта по поверхности зеркала воды;

– Оранжевый: пассивное погружение объекта в толщу воды;

– Красный - нахождение объекта на дне ванны бассейна.

ПАК должен определять указанные уровни и решать задачи по аналитике:

– детектирование человека в кадре;

– трекинг над водой;

– получение информации об уровне угрозы на основе позы человека.

Расположение камер в бассейне 

От схемы установки камер требовалась относительная универсальность, позволяющая устанавливать ПАК в большинстве бассейнов.Стандартная конфигурация бассейнов – несколько дорожек длиной 25 м и шириной 2,7 м.

Решили задачу, разбив площадь поверхности воды в бассейне на условные части и сформировали систему модулями, покрывающими одну стандартную ячейку, учитывая, что дальность видимости камеры около 7-8 метров.

В итоге получили базовую схему из 2 подводных и 1 надводной камер.

Схема покрытия бассейна системой безопасности 
Схема покрытия бассейна системой безопасности 

Программная архитектура 

1) Входящий видеопоток формируется из двух видеопотоков, поступающих с подводной и надводной камер. Используется протокол прикладного уровня RTSP. Дальнейшая конвертация происходит в HLS для удобства просмотра в браузере. Используется Docker compose — инструмент для определения и запуска многоконтейнерных приложений Docker. 

Docker compose состоит из функциональных контейнеров:

● контейнер кадрирования и предобработки видеопотока;

● контейнер алгоритмов нейронных сетей для подводной камеры;

● контейнер алгоритмов нейронных сетей для надводной камеры;

● контейнер базы данных;

● контейнер RTSP/HLS/WEBRTC плеера;

2) Видеопоток передается в контейнер кадрирования и предобработки видеопотока, где осуществляется его преобразование в последовательность изображений формата JPG, над которой проводится предобработка для выделения полезной информации.

3) Данные, поступившие из контейнера кадрирования и предобработки видеопотока, направляются в соответствующий им контейнер алгоритмов нейронных сетей для решения задач распознавания и трекинга объектов;

4) Данные, поступившие в контейнеры алгоритмов нейронных сетей, последовательно обрабатываются алгоритмами для обнаружения объектов и проведения аналитики.

5) Обработанные кадры при помощи ffmpeg попадают в контейнер RTSP/HLS/WEBRTC плеера. Далее для каждой камеры они соединяются в единый видеопоток, доступный к просмотру по адресу в локальной сети.

6) Телеметрия пловцов, а также статус безопасности передаются вместе с временными метками в базу данных. 

7) Контейнер WEB-сервиса, в свою очередь, позволяет просматривать HLS видеопотоки вместе с дополнительной аналитикой в WEB-интерфейсе браузера.

Архитектура взаимодействия докер контейнеров 
Архитектура взаимодействия докер контейнеров 

Подготовка датасета: ошибки и удачные решения 

Для обучения собран датасет из >3000 кадров подводной съемки и 4000 надводных кадров, где 65% были тренировочной выборкой, 35% валидационной.

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

Формирование датасета проводили используя видео с открытых камер видеонаблюдения в бассейнах и видео с YouTube. Кадры брались с интервалом 1,5 секунды.

Разметку проводили в Supervisely — бесплатной платформе для разработки систем компьютерного зрения. Она позволяет легко размечать датасеты, в том числе для задачи object detection, контролировать время работы разметчиков, получать статистику и визуализацию данных. 

Разметку на платформе разбивали на отдельные задачи, чтобы организовать одновременную работу нескольких разметчиков. Полученный датасет экспортировали в форматы, подходящие для обучения YOLO.

Использование открытых данных позволило получить достаточную выборку. Тем не менее, мы допустили ряд ошибок:

● все видео имели максимально разные ракурсы съемки и углы обзора;

● видео зачастую имели низкую освещенность и высокий уровень шума, что впоследствии повлияло на способность системы распознавать объекты. К примеру, система принимала отражения на поверхности воды за человека под водой;

● видеокадры с подводных камер имели низкое разнообразие и снизили возможность ПАК распознавать движения человека под водой; 

● видеокадры датасета были сняты на разные камеры. На испытаниях ПАК мы использовали камеру с большим углом обзора и высоким разрешением, но это не позволило улучшить качество распознавания. 

● основная задача ПАК – распознавать признаки утопления. Видеокадров случаев утопления в сети минимальное количество, что также отразилось на определении характерных движений. 

Предобработка данных с надводных камер 

Для решения задачи были проведены работы по корректировке полученного датасета: корректировка освещенности, смазанности изображений и подавление шумов, улучшения качества изображения. 

Предобработка включала шаги:

● изменение размера изображений с исходного HD 1280x720 р до 640x640 р для передачи на вход модели YOLOv8;

● использование CLAHE позволило улучшить видимость деталей изображения за счет изменения контрастности в требуемых частях. Для применения CLAHE на цветном изображении цветовая модель RGB была переведена в HSV. CLAHE применялась к V (Value) каналу;

● удаление шумов на изображениях датасета;

● увеличение резкости Value канала HSV модели;

В рамках аугментации было реализовано:

● преобразование случайных 25% выборки к градациям серого;

● уменьшение и увеличение яркости и экспозиции на случайную величину от -25% до +25% для всех изображений датасета.

Аугментация увеличила размер тренировочной выборки до 9100 изображений с надводных камер.

Модель определения человека для надводной детекции 

В качестве модели определения человека была выбрана YOLOv8 (наиболее актуальная на момент реализации проекта). Это позволило обеспечивать единую структуру для обучения моделей для выполнения обнаружения объектов. Ниже приведены полученные метрики качества и значения функций ошибок.

Графики полученных метрик и значений функций ошибок 
Графики полученных метрик и значений функций ошибок 

Метрики precision и recall на валидационной выборке увеличивались в процессе обучения, а ошибки уменьшались, не считая незначительного увеличения dfl_loss к концу обучения.

PR, R и P кривые 
PR, R и P кривые 

Видно, что площадь Precision-Recall кривой близка к единице, Recall и Precision кривые имеют чётко выраженное плато и спуск/подъём, что может быть одним из признаков хорошего качества детекции.

Калибровка камеры 

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

Важный параметр, который требует корректировки – изгибы прямых линий бортов бассейна на кадре, которые появляются при видеосъемке. 

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

Для корректировки мы осуществили калибровку камеры с помощью встроенных функций библиотеки OpenCV и шахматной доски.

Пример калибровочного изображения 
Пример калибровочного изображения 

Шахматная доска добавляется в изображение с камеры в соответствии с разметкой дорожек. Изображение доски размещалось в разных частях чаши бассейна.

Калибровка камеры осуществляется единожды, при этом матрица калибровки записывается в отдельный файл и может быть использована в дальнейшем.

Было 
Было 
Стало 
Стало 

Ограничительные линии стали значительно ровнее, что позволило нам повысить точность расчета метрик.

Результаты работы 

Для отслеживания детекций используется state-of-the-art библиотека ByteTRACK. Определенные моделью YOLOv8 координаты bounding box и значения confidence передаются в ByteTRACK. На выходе получаем объект, содержащий id детекции, координаты bounding box и другую сопроводительную информацию.

Модель быстро научилась определять человека в бассейне, даже тогда, когда на поверхности воды видно только его очертания.

Пример распознавания надводных объектов моделью
Пример распознавания надводных объектов моделью
И еще один пример
И еще один пример

Модель хорошо определяла объекты, траектории движения, скорость и расстояние, которое проплыл человек. При этом на испытаниях выявили проблемы, связанные с обучением:

● низкое исходное разнообразие датасета влияло на качество детекции;

● влияние высокой освещенности в бассейне на качество детекции (засветы, блики).

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

Однако, когда мы приступили к испытаниям, оказалось, что в помещение бассейна проникало большое количество солнечного света, что оставляло существенные блики на картинке. 

Эти два фактора отразились на работе модели. Качество детекции оказалось приемлемым, но не идеальным.

Тима Михайлов, лидер проекта

Предобработка данных с подводных камер 

В рамках предобработки выполнили действия, аналогичные предобработке данных с надводных камер. В рамках аугментации:

● преобразовали 25% случайных изображений к градациям серого;

● уменьшили и увеличили яркость и экспозицию на случайную величину от -25% до +25% для всех изображений.

С помощью предобработки удалось убрать «дымку» характерную для подводной съемки и увеличить контрастность. Аугментация увеличила размер тренировочной выборки до 5000 изображений.

Модель определения человека и позиций в воде для подводной детекции 

Основная задача обработки данных подводной камеры – корректная детекция человека и распознавание его позы. Для реализации используется state-of-the-art модель YOLOv7-pose. Она позволяет одновременно производить детекцию человека и определять координаты 17 частей тела.

Для обучения детектора был собран и размечен датасет из более чем 3000 кадров, где 65% тренировочная, 35% валидационная выборка. 

На графиках видно, что в процессе обучения значения функции потерь уменьшаются. Также на графиках прослеживается, что функции потерь почти достигают плато к концу обучения.

Графики функций потерь модели подводной детекции 
Графики функций потерь модели подводной детекции 

Для оценки качества алгоритмов модели построены кривые PR, R и P.

PR, R и P кривые 
PR, R и P кривые 

Площадь PR кривой близка к единице. R и P кривые находятся в корректных диапазонах, т.к. изгиб находится на больших значениях precision и recall.

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

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

Тима Михайлов, лидер проекта

Алгоритмы определения опасности утопления 

Чтобы подсчитать количество движений человека используются данные изменений позиции конечности человека между кадрами.

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

Число N задаётся в соответствии с временем срабатывания и FPS алгоритма. Если условие выполняется, человеку в соответствии с его ID присваивается статус yellow static. Если сумма изменений по оси Y за N кадров оказывается меньше нуля, условие выполняется и человеку в соответствии с его ID присваивается статус yellow down. Если оба условия выполняются, то человеку в соответствии с его ID присваивается статус orange.

Красный статус опасности (red) присваивается только тогда, когда человеку присвоен статус orange и координата середины bounding box находится ниже уровня воды более 1 секунды.

Если условие хотя бы одного из уровней опасности перестает выполняться, то все дочерние уровни также сбрасываются.

Испытания показали, что модель показывает достаточно высокие показатели детектирования на сложных изображениях. Желтый и оранжевый уровень опасности система определяет в течение 1,5 с, красный – 0,5 с. 

Результаты работы 

Модель точно фиксирует человека и осуществляет локализацию ключевых точек. На изображении фиксируются линии воды и линии дна бассейна и динамически меняются уровни опасности: green, yellow (static, down), orange и red.

Результаты работы YOLOv7 Pose
Результаты работы YOLOv7 Pose
И еще
И еще

Испытания в бассейне: опыт, сын ошибок трудных 

Наш путь с тестированием в бассейне был весьма тернистым.

1. Договориться со спортивным центром 

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

2. Подготовиться к испытаниям

Мы составили список необходимых вещей, где руководствовались собственным опытом. И конечно, были упущения:

● для настройки системы использовал ноутбук, на котором система никогда ранее не настраивалась;

● заранее не сделал тесты на этом ноутбуке. Было неожиданно, но система не заработала, так как мы ожидали; 

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

Кронштейн для камеры, kolhoz custom 
Кронштейн для камеры, kolhoz custom 

3. Подготовить оборудования на объекте

● сделали монтаж надводных и подводных камер, выполнили настройку ПАК, включили камеры. И запись …не началась. Ни одного сохраненного видео с испытаний не было получено. Вывод: проверяйте и перепроверяйте запись в течении процесса. 

● изначально мы записывали как screencast, так как сырой поток. Но в процессе настройки прототипа у нас вылетала подводная камера, поэтому, раз за разом начиная запись, мы забыли включить запись сырого потока.

Монтаж подводной камеры
Монтаж подводной камеры
Монтаж надводной части ПАК
Монтаж надводной части ПАК
И еще
И еще

В итоге, нам пришлось проводить повторные испытания. На этот раз мы учли ошибки и выполнили полноценное тестирование.

Что в итоге 

Типовое поведение записали с камер посредством наблюдения за посетителями. А вот ситуации утопления нужно было имитировать... 

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

Видеоряд с подводной камеры с присвоением объекту уровня угрозы утопления

Имитируя ситуации утопления, мы подтвердили корректную работу модели. Надводная детекция также показала хорошие результаты.

Видеоряд с подводной камеры
Видеоряд с подводной камеры

Работа над прототипом еще не закончена. В планах увеличить дальность подводной детекции с использованием новой модели YOLOv8 pose и увеличить разрешение надводной модели для лучшей детекции в бассейнах длиной 50 м. 

Спасибо! Бомбите комменты, буду рад обсудить ваше мнение. 

Кстати, проект выполнен с привлечением финансирования Фонда содействия развитию малых форм предприятий в научно-технической сферы.

Источник: https://habr.com/ru/articles/747630/


Интересные статьи

Интересные статьи

В новом выпуске обучение iOS-разработке и цена управления памятью, правила дизайна и гниение кода, бэкенд, мобилки, ремесло, гвозди, зоопарк трансформеров и многое другое. В нашем Telegram-канале ...
В нашем блоге Q# мы часто сосредотачиваемся на инструментах, включенных в Quantum Development Kit, новых функциях или конкретных приложениях. На этот раз давайте сделаем шаг назад и посмотрим на рабоч...
В предыдущей статье https://habr.com/ru/post/557242/ была описана схемотехника контроллера резервного питания. Такой контроллер может пригодится в разнообразных техническ...
В ноябре 2019 года я уволился с работы и решил посвятить несколько месяцев изучению нового навыка, которому я уже давно хотел научиться. В то время я работал веб-разработчиком. До этого я изуча...
При походе в кинотеатр первое на что мы обращаем внимание это картинка. Яркие цвета, четкое изображение без каких-либо огрехов имеют огромное значение для нашего восприятия того фильма, что м...