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

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

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

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

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

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

    Эврика!

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

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

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



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



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

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



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

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



    Спасибо за внимание, с удовольствием ответим на ваши вопросы!
    • +28
    • 8,2k
    • 6
    Синезис 45,77
    Компания
    Поделиться публикацией
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 6
    • 0
      а людей в кадре алгоритм детектировал как 1 человека?
      • 0
        Алгоритм определяет движущийся объект и проводит его классификацию (человек или машина) — в данном случае это два идущих рядом человека. 1 — это не количество, а номер объекта.
      • +1
        А что если в кадр въедет одиночный локомотив, остановится за пределами области «въезда», постоит некоторое время, а потом тронется? Будет ли ложное срабатывание в такой ситуации?
        • 0
          Что значит ложное срабатывание? Алгоритм детектирует наличие движущегося поезда в кадре, а не просто поезда.
          • 0
            Ваш алгоритм детектирует (движущийся) поезд, когда он въезжает в кадр, на участках въезда и выезда, как вы объясняли в статье. Эти участки охватывают не весь путь, а только те его части, которые расположены близко к краю кадра. Если остановившийся поезд трогается — то на участках въезда и выезда будет движение, по которому ваш алгоритм детектирует поезд. Но если поезд был короткий (одиночный локомотив) — он целиком находится внутри кадра и не попадает на участки въезда и выезда. При трогании такого локомотива движение на путях будет, а на участках въезда и выезда — нет. Как поведет себя ваш алгоритм в такой ситуации? Сможет ли он правильно определить начало движения такого локомотива?
            • 0
              Наверное мы не совсем точно описали. Но детектирование происходит не только на входе и выходе, а на всем протяжении зоны. В частности на рисунках 3 и 4 видны эти промежуточные области в виде синих квадратиков. Входи и выход задаются оператором при калибровке, а остальные зоны размечаются автоматически.

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

        Самое читаемое