Перейти к содержимому
Compvision.ru

Recommended Posts

Добрый день!

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

 

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


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

А что вообще есть на входе? Обычно трекинг понимается в 2-х ипостасях:

1. Visual objects tracking (VOT). Всё это направление подразумевает, что на первом кадре объект как-то нашёлся (детектором, классификатором или был выделен оператором), а дальше на каждом кадре его ищет исключительно сам трекер. Тут можно посмотреть на модуль tracking из opencv_contrib, в частности на CSRT оттуда. Другой классический метод - это STAPLE, но лидеры на сегодняшний день - сиамские нейронные сети (там и датасет, и результаты, и победители).

2. Tracking by detection. Тут принцип другой: непрерывно на видео работает детектор, объект(ы) находится достаточно регулярно. Если объект не находится, то его траектория интерполируется (фильтр Кальмана), он доискивается с помощью VOT и т.д. Когда объект снова находится, то срабатывает какой-то re-id, чтобы узнать, что найден именно тот самый объект (re-id - это сравнение размеров, гистограмм, нейросети и т.д.). Если используется трекинг сразу нескольких объектов, то необходим алгоритм межкадрового связывания: для двух кадров Венгерский алгоритм или аналоги, но популярнее сейчас поиск максимального потока в графе, например.

  • Like 1

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


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

Потолок этого помещения состоит из множества разноцветных люстр и прожекторов. Когда человек перемещается необходимо управлять освещением и подсвечивать человека. Трудность состоит в том, что для детектора движения невозможно создать background из-за постоянно изменяющегося освещения. Для любого объекта, который перемещается в кадре, нужно вычислять координаты и управлять освещением. Людей может быть много, они могут уходить и приходить.

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


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

То есть никакого детектора нет? Есть возможность снимать камерой с датчиком глубины? Или камерой в ИК диапазоне?

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


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

То есть никакого детектора нет? Есть возможность снимать камерой с датчиком глубины? Или камерой в ИК диапазоне?

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

Я сам пришел к выводу, что нужна камера в ИК-диапазоне, но нужно несколько дней доставка/установка/запись видео. Но остается теоретический вопрос, можно ли построить детектор движения с обычной камерой в таких условиях?

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


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

я бы поступил банальным образом.

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

Пример как это у меня работает (на arm)

 

  • Like 1

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


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

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

Очевидно, что классическое вычитание фона тут не справится, потому что оно смотрит на изменение интенсивности пикселей. Первая мысль - избавиться от цвета, то есть перейти в цветовое пространство типа HSV или Lab, а далее работать исключительно с каналом интенсивности (V или L). Далее использовать dense optical flow, например Farneback, получить поле векторов. Далее это поле уже сегментировать (kmeans или что-то сложнее). Результатом сегментации должны стать уже блобы и фон.

Это так, взгляд со стороны.

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


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

я бы поступил банальным образом.

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

Пример как это у меня работает (на arm)

А можно ли вашу программу запустить на этом видео? Если работает - могу дать Вам контакты заказчика.

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


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

А можно ли вашу программу запустить на этом видео? Если работает - могу дать Вам контакты заказчика.

К сожалению скачать ролик с ютуба не могу, пишет запрещен доступ.

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


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

Очевидно, что классическое вычитание фона тут не справится, потому что оно смотрит на изменение интенсивности пикселей. Первая мысль - избавиться от цвета, то есть перейти в цветовое пространство типа HSV или Lab, а далее работать исключительно с каналом интенсивности (V или L). Далее использовать dense optical flow, например Farneback, получить поле векторов. Далее это поле уже сегментировать (kmeans или что-то сложнее). Результатом сегментации должны стать уже блобы и фон.

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

kmeans - тормознутый алгоритм, а нужен реал-тайм.

5 минут назад, LexaP сказал:

К сожалению скачать ролик с ютуба не могу, пишет запрещен доступ.

Могу сбросить на почту. Напишите в личку.

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


Ссылка на сообщение
Поделиться на других сайтах
10 minutes ago, 2expres said:

kmeans - тормознутый алгоритм, а нужен реал-тайм.

Вариантов много.
Ну и реал-тайм - это не требования. Правильное требование: процессор + память + видеокарта, разрешение видео и сколько времени на обработку одного кадра. А то может оказаться, что детекцию нейросетями надо будет делать на слабом CPU и 25 кадров/сек на видео 6МП. Хотя тут тоже можно натренировать tiny YOLO или MobileNet SSD.

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


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

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

Это видео облегченные условия. Здесь прекрасно работает мой детектор движения. Но значительно быстрее, обрабатывает 25 кадров с загрузкой 15%. Но с резким изменением освещенности он не работает.

 

  • Like 1

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


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

Выполнил включение освещение сцены чисто по детектору движения, без трекинга. Камера работает в ИК-диапазоне. Для управления освещением использовал midi-протокол (библиотека rtmidi), виртуальный драйвер midi, который управляет освещением сцены (стандартная программа QLC+). На видео Вы можете видеть квадрат на полу, который имитирует размеры люстры.  Вот что получилось:

Обрабатываются все 25 кадров в секунду.

 

В 04.06.2019 at 14:00, Nuzhny сказал:

популярнее сейчас поиск максимального потока в графе, например.

Хотелось бы реализовать трекинг. Но приведенная ссылка является научной статьей, у которой еще 50 ссылок на другие статьи. Мне необходимо усреднять 5 соседних кадров для устранения дерганий и пропадания объекта. Как правильно это сделать?

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


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

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

1. выгнать всех с площадки, выключить свет.

2. включать по очереди по одному прожектору, фоткать что получилось.

3. во время трекинга синтезировать фоновое изображение, сложением изображений включенных в данный момент прожекторов ( предполагаем известным)

4. применяем вычитание фона.

5. ..... т.д.

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


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

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

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


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

во время трекинга синтезировать фоновое изображение, сложением изображений включенных в данный момент прожекторов ( предполагаем известным)

Рад Вас видеть!

Хорошая идея зная какие ветки люстры включены подставлять нужный фон, заранее сформированный.

Проблема в том что мы выполняем часть работы: даем команду какую ветку включать в соответствии с перемещаемыми людьми. Другие ребята делают еще какие то эффекты (меняют цвета, освещенность) и у меня нет информации о фоне.

3 часа назад, Nuzhny сказал:

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

Спасибо Nuzhny за Ваши ответы!

Можно для меня разжевать? Мне действительно не понятно. Венгерский алгоритм - это задача о оптимизации.  После обработки кадра из 3 МБайт(Full HD) информации я получаю массив не более 256 байт (1 объект 16 байт), поэтому могу позволить сделать не оптимально. Хочу понять суть. Получается я должен сравнить 2 соседних кадра. Предположим на 1-кадре 4 сегмента, а на 2 кадре тоже 4 сегмента. Я должен назначить назначить привязку сегментов к объектам. На первом кадре назначаю номер сегмента равным номеру объекта. На втором кадре допустим для простоты (выбор метрики сейчас не важен можно площадь пересечения или как предлагают по ссылке искать коэффициенты https://cyberleninka.ru/article/v/algoritm-trekinga-obektov-v-realnom-vremeni-s-obrabotkoy-oshibok) ищу минимальное расстояние между центрами сегментов и объектов. Далее присваиваю сегменту номер ближайшего объекта. С этим понятно. Понятно, если появился или исчез объект на краях кадра. А что делать, если появился или исчез сегмент в центре кадра? Как определить это глюк, или 2 человека рядом дошли до середины сцены и разделились? Или наоборот зашли с разных концов сцены и объединились?

 

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


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

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

Также можно в каждом объекте хранить его модель движения: в простейшем виде это просто скорость: сколько пикселей за 1 кадр он проходит по Х и по У. Чуть сложнее - линейный фильтр Калмана из OpenCV или самому. Тогда, если 2 человека объединились в 1 объект, один человек станет типа потерян. Но на каждом кадре всё равно изменять его последние координаты с помощью известных скоростей или фильтра Калмана. Получится, что в момент разделения потерянный объект "пройдёт" это расстояние сам по инерции.

  • Like 1

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


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

Также можно в каждом объекте хранить его модель движения: в простейшем виде это просто скорость: сколько пикселей за 1 кадр он проходит по Х и по У.

Многое стало понятно, введу максимальную скорость перемещения объекта, что позволит отсекать глюки.

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

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


Ссылка на сообщение
Поделиться на других сайтах
В 03.07.2019 at 18:42, 2expres сказал:

Рад Вас видеть!

Взаимно :) , еще пока не совсем вернулся, но надеюсь скоро втянусь по полной. 

  • Like 1

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×