2expres 7 Report post Posted June 3, 2019 Добрый день! Необходимо отслеживать перемещения людей (идеально головы человека), при постоянно изменяющемся освещении. Цвет может быть красным, зеленым, синим, дневное освещение и может постоянно меняться. Можно ли стандартными методами и какими решить данную задачу? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted June 4, 2019 А что вообще есть на входе? Обычно трекинг понимается в 2-х ипостасях: 1. Visual objects tracking (VOT). Всё это направление подразумевает, что на первом кадре объект как-то нашёлся (детектором, классификатором или был выделен оператором), а дальше на каждом кадре его ищет исключительно сам трекер. Тут можно посмотреть на модуль tracking из opencv_contrib, в частности на CSRT оттуда. Другой классический метод - это STAPLE, но лидеры на сегодняшний день - сиамские нейронные сети (там и датасет, и результаты, и победители). 2. Tracking by detection. Тут принцип другой: непрерывно на видео работает детектор, объект(ы) находится достаточно регулярно. Если объект не находится, то его траектория интерполируется (фильтр Кальмана), он доискивается с помощью VOT и т.д. Когда объект снова находится, то срабатывает какой-то re-id, чтобы узнать, что найден именно тот самый объект (re-id - это сравнение размеров, гистограмм, нейросети и т.д.). Если используется трекинг сразу нескольких объектов, то необходим алгоритм межкадрового связывания: для двух кадров Венгерский алгоритм или аналоги, но популярнее сейчас поиск максимального потока в графе, например. 1 Share this post Link to post Share on other sites
2expres 7 Report post Posted June 4, 2019 Потолок этого помещения состоит из множества разноцветных люстр и прожекторов. Когда человек перемещается необходимо управлять освещением и подсвечивать человека. Трудность состоит в том, что для детектора движения невозможно создать background из-за постоянно изменяющегося освещения. Для любого объекта, который перемещается в кадре, нужно вычислять координаты и управлять освещением. Людей может быть много, они могут уходить и приходить. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted June 4, 2019 То есть никакого детектора нет? Есть возможность снимать камерой с датчиком глубины? Или камерой в ИК диапазоне? Share this post Link to post Share on other sites
2expres 7 Report post Posted June 4, 2019 1 час назад, Nuzhny сказал: То есть никакого детектора нет? Есть возможность снимать камерой с датчиком глубины? Или камерой в ИК диапазоне? Я не знаю, как построить детектор движения с обычной камерой в условиях резкого изменения освещения. Я сам пришел к выводу, что нужна камера в ИК-диапазоне, но нужно несколько дней доставка/установка/запись видео. Но остается теоретический вопрос, можно ли построить детектор движения с обычной камерой в таких условиях? Share this post Link to post Share on other sites
LexaP 5 Report post Posted June 4, 2019 я бы поступил банальным образом. Обучил сетку искать головы, адаптировал под железо. Обучение на разных цветовых моделях. Пример как это у меня работает (на arm) 1 Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted June 4, 2019 На первый взгляд кажется, что можно - мы же глазами видим движение по изображению с этой камеры. Очевидно, что классическое вычитание фона тут не справится, потому что оно смотрит на изменение интенсивности пикселей. Первая мысль - избавиться от цвета, то есть перейти в цветовое пространство типа HSV или Lab, а далее работать исключительно с каналом интенсивности (V или L). Далее использовать dense optical flow, например Farneback, получить поле векторов. Далее это поле уже сегментировать (kmeans или что-то сложнее). Результатом сегментации должны стать уже блобы и фон. Это так, взгляд со стороны. Share this post Link to post Share on other sites
2expres 7 Report post Posted June 4, 2019 12 минуты назад, LexaP сказал: я бы поступил банальным образом. Обучил сетку искать головы, адаптировал под железо. Обучение на разных цветовых моделях. Пример как это у меня работает (на arm) А можно ли вашу программу запустить на этом видео? Если работает - могу дать Вам контакты заказчика. Share this post Link to post Share on other sites
LexaP 5 Report post Posted June 4, 2019 6 минут назад, 2expres сказал: А можно ли вашу программу запустить на этом видео? Если работает - могу дать Вам контакты заказчика. К сожалению скачать ролик с ютуба не могу, пишет запрещен доступ. Share this post Link to post Share on other sites
2expres 7 Report post Posted June 4, 2019 8 минут назад, Nuzhny сказал: Очевидно, что классическое вычитание фона тут не справится, потому что оно смотрит на изменение интенсивности пикселей. Первая мысль - избавиться от цвета, то есть перейти в цветовое пространство типа HSV или Lab, а далее работать исключительно с каналом интенсивности (V или L). Далее использовать dense optical flow, например Farneback, получить поле векторов. Далее это поле уже сегментировать (kmeans или что-то сложнее). Результатом сегментации должны стать уже блобы и фон. Интенсивность, к сожалению будет тоже разной (интенсивность подсветки разная). На мой взгляд нужно сравнивать 2 соседних кадра и каким то образом не сравнивать кадры с большими изменениями. Но как будет работать при большом количестве людей? kmeans - тормознутый алгоритм, а нужен реал-тайм. 5 минут назад, LexaP сказал: К сожалению скачать ролик с ютуба не могу, пишет запрещен доступ. Могу сбросить на почту. Напишите в личку. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted June 4, 2019 10 minutes ago, 2expres said: kmeans - тормознутый алгоритм, а нужен реал-тайм. Вариантов много. Ну и реал-тайм - это не требования. Правильное требование: процессор + память + видеокарта, разрешение видео и сколько времени на обработку одного кадра. А то может оказаться, что детекцию нейросетями надо будет делать на слабом CPU и 25 кадров/сек на видео 6МП. Хотя тут тоже можно натренировать tiny YOLO или MobileNet SSD. Share this post Link to post Share on other sites
2expres 7 Report post Posted June 4, 2019 1 час назад, LexaP сказал: Обучил сетку искать головы, адаптировал под железо. Обучение на разных цветовых моделях. Это видео облегченные условия. Здесь прекрасно работает мой детектор движения. Но значительно быстрее, обрабатывает 25 кадров с загрузкой 15%. Но с резким изменением освещенности он не работает. 1 Share this post Link to post Share on other sites
2expres 7 Report post Posted July 2, 2019 Выполнил включение освещение сцены чисто по детектору движения, без трекинга. Камера работает в ИК-диапазоне. Для управления освещением использовал midi-протокол (библиотека rtmidi), виртуальный драйвер midi, который управляет освещением сцены (стандартная программа QLC+). На видео Вы можете видеть квадрат на полу, который имитирует размеры люстры. Вот что получилось: Обрабатываются все 25 кадров в секунду. В 04.06.2019 at 14:00, Nuzhny сказал: популярнее сейчас поиск максимального потока в графе, например. Хотелось бы реализовать трекинг. Но приведенная ссылка является научной статьей, у которой еще 50 ссылок на другие статьи. Мне необходимо усреднять 5 соседних кадров для устранения дерганий и пропадания объекта. Как правильно это сделать? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted July 3, 2019 Может и несколько фантастичный вариант, но в качестве направления для подумать. 1. выгнать всех с площадки, выключить свет. 2. включать по очереди по одному прожектору, фоткать что получилось. 3. во время трекинга синтезировать фоновое изображение, сложением изображений включенных в данный момент прожекторов ( предполагаем известным) 4. применяем вычитание фона. 5. ..... т.д. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted July 3, 2019 Ну, результаты детекции выглядят очень неплохо. Просто применить классический венгерский алгоритм разве не получится? В качестве метрики между объектами использовать расстояние Жаккарда (IoU) - отношение пересечения прямоугольников к объединению. Кажется, что работать будет и быстро, и точно Share this post Link to post Share on other sites
2expres 7 Report post Posted July 3, 2019 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 человека рядом дошли до середины сцены и разделились? Или наоборот зашли с разных концов сцены и объединились? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted July 4, 2019 Да, всё верно, сегменты привязываются к объектам. Каждый объект может хранить у себя не только последние координаты, но и число-счётчик: на скольких последних кадрах он был найден. Если потеряется в середине кадра и не найдётся, скажем, в течение секунды, то считать потеряным и удалять. Если найдётся, то обнулять счётчик. В реальности его можно ещё и доискивать, если не найден, но это уже может быть не реалтайм. Также можно в каждом объекте хранить его модель движения: в простейшем виде это просто скорость: сколько пикселей за 1 кадр он проходит по Х и по У. Чуть сложнее - линейный фильтр Калмана из OpenCV или самому. Тогда, если 2 человека объединились в 1 объект, один человек станет типа потерян. Но на каждом кадре всё равно изменять его последние координаты с помощью известных скоростей или фильтра Калмана. Получится, что в момент разделения потерянный объект "пройдёт" это расстояние сам по инерции. 1 Share this post Link to post Share on other sites
2expres 7 Report post Posted July 4, 2019 4 часа назад, Nuzhny сказал: Также можно в каждом объекте хранить его модель движения: в простейшем виде это просто скорость: сколько пикселей за 1 кадр он проходит по Х и по У. Многое стало понятно, введу максимальную скорость перемещения объекта, что позволит отсекать глюки. Возникли новые технические трудности: информация с потоков может поступать не по-порядку. Вначале информация о настоящем кадре, а затем о предыдущем. Необходимо еще реализовать буфер для выравнивания последовательности поступающих кадров. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted July 16, 2019 В 03.07.2019 at 18:42, 2expres сказал: Рад Вас видеть! Взаимно , еще пока не совсем вернулся, но надеюсь скоро втянусь по полной. 1 Share this post Link to post Share on other sites