49 сообщений в этой теме

Преамбула

В пору своей молодости (2005 год) я поступил в аспирантуру, где параллельно с работой занимался разработкой детектора движения для цифровой системы видеонаблюдения. К науке охладел довольно быстро, диссертация оказалось слабой и, как следствие, я её не защитил.

В то же время вышла первая версия CUDA, которая хорошо подходила для задач вычитания фона и вообще обработки видео. Я не упустил это событие и попробовал реализовать детектор кроме С++ ещё и на CUDA.

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

Что получилось?

Вот что получилось.

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

Для запуска требуется CMake, Linux|Windows и OpenCV 3.0 (исключительно для захвата видео и вывода результатов). Документации пока нет совсем, комментарии по вполне понятным причинам написаны на русском. CUDA включается опцией в CMake, работоспособность не проверял (точно работало на CUDA 1.0). Есть опции для всякой разной отладки, вывода дополнительных окошек, пока не документированы.

 

P.S.

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

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

Изменено пользователем Nuzhny
2 пользователя нравится это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А сравнивал качество работы с текущими продуктовыми решениями типа того же VIBE'а?

Изменено пользователем BeS

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть в планах. Не уверен на счёт VIBE (мне когда-то автор высылал его реализацию, надо посмотреть), но с тем же MOG из OpenCV сравню (точнее с блоб-трекером на его основе). Знать бы ещё по каким параметрам. Просто скорость работы мало информативна, достаточно взглянуть на многообразие алгоритмов в той же bgslibrary.

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

У меня с былых времён осталась библиотека видео с выставки Интерполитех, на которой производилось тестирование разнообразных детекторов движения из рабочих систем видеонаблюдения (в диссертации есть ссылки и картинки оттуда). Думаю, что можно попробовать организовать полноценное сравнение для начала на этих данных (хотя они далеко не идеальны).

P.S. Сейчас самая большая проблема - это отсутствие свободного времени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ага, хорошо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть такой датасет, разметка объекты + тени.

http://arma.sourceforge.net/shadows/

рядом лежит референсный Foreground Estimation / Background Subtraction для сравнения 

http://arma.sourceforge.net/foreground/

 

Еще сюда можно засабмитить, чтобы алгоритм не пропадал.

https://github.com/andrewssobral/bgslibrary

 

Изменено пользователем mrgloom
1 пользователь нравится это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть такой датасет, разметка объекты + тени.

http://arma.sourceforge.net/shadows/

рядом лежит референсный Foreground Estimation / Background Subtraction для сравнения 

http://arma.sourceforge.net/foreground/

О, спасибо за отличную ссылку. Не слышал о них.

Еще сюда можно засабмитить, чтобы алгоритм не пропадал.

https://github.com/andrewssobral/bgslibrary

Да, я уже упоминал bgslibrary выше (этого тоже раньше не было). Тут загвоздка есть некоторая.

Я разрабатывал не столько алгоритм вычитания фона, сколько детектор движения. У меня получилась система с обратной связью, где модель заднего плана зависит от... модуля сопровождения объектов! Поясню на примере: пусть отслеживается автомобиль на автостоянке. Вот он подъехал, остановился. Что дальше? Дальше трекинг отсчитывает указанный пользователем период времени (например 30 секунд) и в этом месте обновляет модель заднего плана, помещая в неё автомобиль. Такой же подход в отношении отъехавшего автомобиля (что есть борьба с ghost objects). Также модель заднего плана периодически обновляется и без подсказок трекера. Есть ещё несколько таких тонкостей, которые прилеплены к классической схеме блоб-детектора для решения весьма практических задач. Там зависимость от кучи параметров.

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем iskees

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Срочно возникла такая проблема сильный снег и дождь, качание деревьев - как с этим бороться в детекторе движения?

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно erode сделать. Но лучше сначала посмотреть на проблему. Или отсеивать уже на этапе трекинга.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Erode(2) сделал частично но при сильном снегопаде появляются ложники. Вот результат, и последовательность.

Последовательность.ZIP

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Bgslibrary - не помогло. Снега очень много (ложники)

Votr - еще не смотрел

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Думаю, что VOTR тут так сразу и не поможет.

Предлагаю разобраться с тем, как можно исключить объекты на этапе вычитания фона и объединения в объекты.

Во-первый, вычитание фона:

1. Раз ты используешь BackgroundSubtractorMOG, то было бы логично начать с его тюнинга. Ты пробовал увеличить число Гауссианов на пиксель? Теоретически это может привести к тому, что в каждом пикселе будет один гауссиан, отвечающий за снег. И, соответственно, этот снег перестанет детектироваться.

2. Можно попробовать динамически менять чувствительность (порог). Например, пользователь выставляет значение х, а ты его можешь автоматически менять в некоторых небольших пределах: +-0.05 * х. Если детектироваться начнёт слишком много объектов, то программа сама автоматически увеличивает порог, немного ухудшая чувствительность. Например, было значение x = 70 +- 10. Всё нормально, объекты детектируются, ложняков нет. Вдруг в течение некоторого времени алгоритм детектирует слишком много всего, порог автоматически повышается +1, +1, +1.... Пока не дойдёт до 80. Когда в течение некоторого времени сработки детектора прекращаются, порог также по одному медленно возвращается к установленному пользователем значению.

Объединение в объекты. Что используется? Контуры, четырёх-, восьмисвязность?

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

P.S. Я бы ещё взглянул на промежуточный результат - бинарную маску после вычитания фона.

1 пользователь нравится это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем спасибо сделал все, я написал свой трекинг, чуть-чуть поиграл с параметрами  BackgroundSubtractorMOG. И вот результат.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А вот и сам Tracking.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выглядит круто!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 hours ago, Король said:

А вот и сам Tracking.

 

Детектирование убегающих заключенных? Это просто божественный датасет :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, BeS сказал:

Детектирование убегающих заключенных? Это просто божественный датасет :-)

Это мы проверяли как на дистанции дальних и ближних рубежах будет ли работать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Слушай, раз пошла такая пьянка с тестированием. Предлагаю из интереса проверить на этом видео ещё два алгоритма.

Во-первых, мой, который вынесен в начальное сообщение темы.

Во-вторых, ещё один проект - плод труда трёх здешних формучан (Smorodov'a, BeS'a и немножко моего): Multitarget-tracker

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

1 пользователь нравится это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Без проблем. Давай сделаем! Только учти там набор  изображений! x86 win7, VS2010 у меня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можешь показать список изображений (только имена), чтобы научиться его читать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, Nuzhny сказал:

Можешь показать список изображений (только имена), чтобы научиться его читать?

Список это не важно (по текущей дате они складываются в папки) а так я могу переименовать в любой удобный формат с помощью TotalCommanderа. Начиная допустим 0001.jpg. Все теперь до понедельника. Все изображения на работе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Совсем забыл о предложении потестировать: вот детекторы.

Первым параметром указывается путь к исходному видео, вторым - имя видео, куда сохранить реультат. Т.к. для захвата используется ffmpeg, то он может проигрывать и папку с картинками, проблем быть не должно.

Буду благодарен за тестирование, интересно посмотреть результат.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Дальних нарушителей не ловит ни та ни другая программа. Скачал, запустил, сначало не пошло. Ошибка вылетала "MSVCP120.dll" Хорошо узнал где скачивать такие библиотеки   https://ru.dll-files.com/. А вот и само видео как и обещал.

 

1 пользователь нравится это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!


Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу