Привет! Мы в Macroscop разрабатываем ПО для систем видеонаблюдения, которое умеет распознавать автономера, чекать спецодежду на рабочих, детектировать по видео задымленность и возгорания и решать еще около 20 задач, касающихся анализа видео.
Один из фокусов нашей команды - разработка собственной видеоаналитики, а также постоянное ее улучшение, выражающееся в росте точности, функциональности и производительности. 

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

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

Все смешалось – люди, кони кошки...

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

Кошка, ошибочно определяемая как человек
Кошка, ошибочно определяемая как человек

Недолгое расследование вывело нас на виновника ошибок - обучающий датасет. Причина крылась в том, что у очень маленьких изображений людей, попавших в исходную разметку, ноги оставались самым значимым признаком, позволявшим отличить их от большинства других объектов, но не от кошек/собак в указанном ракурсе. И вот таких изображений кошек/собак не было в достаточном количестве в датасете, на котором была обучена предыдущая версия нашего детектора-классификатора.
Тогда мы дополнили датасет недостающими изображениями животных в «опасных» позах и провели переобучение. Контрольные замеры после этого подтвердили решение проблемы с путаницей. 

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

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

Одним выстрелом – двух зайцев

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

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

Ранее для отслеживания объектов мы использовали трекер MOSSE. Он обладает многими достоинствами - устойчив к изменениям освещения, масштаба объекта, позы и т.д., но в нашем случае дает хорошую точность отслеживания, только когда объект перемещается между соседними кадрами незначительно (примерно на половину своего размера), что приводит к необходимости анализировать кадры с высокой частотой.
Кроме того, MOSSE нельзя назвать легковесным решением: под капотом — преобразования Фурье и другие ресурсоемкие вычисления, что приводит к существенной нагрузке на процессор. В результате трекинг с MOSSE требовал либо мощного оборудования, либо ограничивал количество одновременно обрабатываемых видеопотоков.

Изучив проблему под разными углами, мы решили, что снизить вычислительную нагрузку можно за счет уменьшения частоты обработки кадров. Но MOSSE не позволял сделать это с сохранением высокой точности.
Кроме MOSSE для нашего трекинга потенциально подходили следующие алгоритмы: SORT - Simple Online Realtime Tracking и его вариации (DeepSORT, ByteTrack, OC-SORT и др.), DCF, вариации трекингов на сиамских нейросетях (SiamFC,SiamRPN и др.).
Но вновь ни один из готовых вариантов не обеспечивал достаточной точности при низком fps. Поэтому мы взяли за основу один из существующих алгоритмов и значительно его модернизировали, адаптировав к работе с видео невысокой частоты кадров.

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

Улучшение трекинга – больше, чем просто трекинг

Обновление классификатора и алгоритма повлияло не только на трекинг, но и «задело» другие модули видеоанализа.

В нашем продукте есть несколько интеллектуальных функций, которые в своей работе решают схожие с трекингом задачи и частично используют его алгоритмы: обнаруживают объект в кадре > следят за ним некоторое время > набирают статистику > генерируют срабатывание.
Это модули контроля спецодежды, поиска объектов, обнаружения спецтранспорта. И замена в них соответствующих алгоритмов на обновленные из трекинга также дали свои положительные плоды: модуль контроля спецодежды вырос по точности и производительности, а модули поиска объектов и обнаружения спецтранспорта – по производительности (от 2 до 3,5 раз по сравнению с предыдущими версиями).

Локальное улучшение – системный эффект

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

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

А пока - пусть ваша видеоаналитика будет точной, а кошки и люди – никогда не теряются ?

Комментарии (0)