О том, как мы искали поезд

в 13:27, , рубрики: Блог компании Синезис, видеоаналитика, видеонаблюдение, Работа с видео, метки: ,

О том, как мы искали поезд Все время, что мы занимались разработкой видеоаналитических модулей, нам не давали покоя поезда. Наши разработки давно и успешно используются на самых разных объектах, в том числе и на вокзалах, и на ж/д развязках, и в метро. И нам удалось в своих алгоритмах добиться очень высокой точности, например, при детектировании падения объекта (человека, предмета) на рельсовое пространство или «застревании» автомобиля на переезде, или детектировании драки на платформе метро. Но задача осложняется тем, что, как правило, требуется не детектирование поезда, а полное его игнорирование в кадре. Согласитесь, трудно игнорировать объект, занимающий половину экрана. Вот и наш обычный детектор движения плохо справлялся: при появлении движущегося состава мы получали ложные срабатывания из-за множества артефактов, появлявшихся вместе с ним. Если говорить конкретнее, ложные объекты детектируются и в самом поезде, и вокруг него, что обусловлено возникающими тенями, светом и другими искажениями, которые «движутся» вместе с составом…

Получалось и не очень

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

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

«Попробуем аппаратный метод!» – решили мы. И преуспели, ведь замыкание поездом контактов под рельсами дало нам точность в 100%. Вот только воплощение этого метода повсеместно оказалось проблемой, и мы вновь задумались над алгоритмическим решением.
Если кратко, то для достижения итоговой цели мы должны были решить две подзадачи: сперва надежно детектировать поезд, а затем определенным образом «подавить» и сам поезд, и связанные с ним артефакты.

Эврика!

Не учитывать поезд нельзя, учитывать поезд трудно. Что же отличает его от иных объектов в кадре, кроме габаритов? Правильно, движение по рельсам!

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

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

О том, как мы искали поезд

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

О том, как мы искали поезд

Но и это еще не все. В расчет мы включили не только примерные размеры поезда и его расположение, но и направление движения. Это условие исключает ложные срабатывания в случаях, когда в кадре двигается крупный объект (например, при движении транспорта через ж/д переезд) и траектория его не совпадает с направлением движения поезда.

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

О том, как мы искали поезд

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

Ура, мы победили! Вот, собственно, как выглядит работа детектора:

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

Автор: blackcat87

Источник

Поделиться

* - обязательные к заполнению поля