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

Как работают системы слежения за объектами?

Recommended Posts

Под такими системами слежения за объектами я понимаю что-то типа такого:

Причём, "изображение" людей тут пересекаются, при этом система продолжает отлично функционировать и следить.

Вот ещё понравилось такое видео:

Система следит за машиной, а когда из неё выходит человек, система следит за обеими объектами :)

Не очень тут понял, почему система следила именно за этой машиной, когда были и остальные.. походу она следит за всем, что движется или двигалось :)

Вот ещё наглядное видео с какими-то отмеченными точками на объектах:

А какими способами достигается подобное?

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

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


Ссылка на сообщение
Поделиться на других сайтах
Под такими системами слежения за объектами я понимаю что-то типа такого:

Причём, "изображение" людей тут пересекаются, при этом система продолжает отлично функционировать и следить.

Вот ещё понравилось такое видео:

Система следит за машиной, а когда из неё выходит человек, система следит за обеими объектами :)

Не очень тут понял, почему система следила именно за этой машиной, когда были и остальные.. походу она следит за всем, что движется или двигалось :)

Вот ещё наглядное видео с какими-то отмеченными точками на объектах:

А какими способами достигается подобное?

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

Мне думается так:

1) MeanShift + предположение о том где будет объект после пересечения (исходя их текущего вектора скорости)

2) Здесь чисто отделение движущихся объектов от статичной фотографии (машины которые не отслеживаюся сфотканы).

3) MeanShift + оптический поток. Точки - это так называемые GoodFeaturesToTrack или просто "угловые" точки. Используются для разделения объектов в трудных ситуациях.

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


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

А MeanShift это что?

Читал описание функции "GoodFeaturesToTrack", по-моему на этом сайте скачанном.. :)

GoodFeaturesToTrack

Определяет на изображении «сильные»(с относительно большими собственными числами) угловые точки.

А что понимается под сильными угловыми точками и вообще собственными числами?

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


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

Читал описание функции "GoodFeaturesToTrack", по-моему на этом сайте скачанном.. :)

А что понимается под сильными угловыми точками и вообще собственными числами?

Про углы здесь : http://www.compvision.ru/forum/index.php?a...=post&id=87

Про собственные значения и собственные векторы : http://elib.ispu.ru/library/math/sem1/pyartli1/node79.html

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


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

Ещё, кстати, недавно читал, что фильтр Калмана используют для слежения за объектами..

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


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

Сейчас разве это не совсем все роботизировано ? 
просто на датчики движения реагируют камеры и под них подобрано нужное программное обеспечение 
Тут, кстати отличный выбор для таких реший, усмные камеры у них называютсья
У меня знакомый говорил, что писать программы на Си Шарпе для таких систем тот еще гемор... 

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


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

Тема старая, но интересная. Сейчас продолжаю тему "Трекинг человека". 
 На всех видео выше камера закреплена, поэтому можно применить детектор движения, в котором кадры сравниваются с предварительно вычисленным задним фоном - BackGround. Фон адаптируется сравнением с кадром, если интенсивность кадра больше фона, то к фону добавляем константу, меньше - отнимаем. Чем больше константа, тем быстрее обновляется фон. Я выбрал 0,5 и при 25 кадрах в секунду у меня фон полностью обновляется через 10-20 сек (зависит от контрастности кадров).Если изображение 3-канальное (R,G,B), то и BackGround также должен иметь 3 канала.
 Каждый поступающий кадр вычитаю с фоном, возвожу в квадрат и суммирую по 3 составляющим. Суммарную разницу сравниваю с константой-порогом, больше порога - объект, меньше - фон. Получаю бинарное черно-белое изображение, которое сегментирую. При сегментации использую третью константу-минимальное количество точек в сегменте, которая зависит от поставленной задачи. Хотя для слежения за пешеходами можно дополнительно применять и размеры сегмента, причем высота должна быть больше, чем ширина.
 Выполняю привязку полученных сегментов к объектам. Для этого сравниваю таблицу объектов с таблицей сегментов и по минимальному расстоянию делаю назначения. Все просто, если объекты разделены и не пересекаются. Сложности начинаются, когда объекты сходятся в один объект, а затем расходятся, при этом путается нумерация объектов.
 Получается, что нужно предварительно вычислить какие-то признаки объектов, по которым я их мог бы различать. Как это можно сделать, желательно примитивным способом и с высоким быстродействием?   

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


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

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

Ну еще копайте разные фильтры Кальмана и иже с ними.

Есть еще наш с Сергеем Нужным проект: https://github.com/Smorodov/Multitarget-tracker  

правда по коммитам сейчас он много больше его чем мой :) 

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


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

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

Ну еще копайте разные фильтры Кальмана и иже с ними.

Фильтры Калмана также исходят из этого предположения. Для авто это может и подходит, для людей нет. Пример: спортсмен под номером 2 догоняет номер 1 и два объекта некоторое время находятся вместе, затем один обгоняет другого. Фильтр Калмана даст однозначный результат, что это номер 2. А это не всегда так, номер 1 мог ускорится.
 Другой пример у меня в видео по теме. Сцена на которой артисты или танцоры. Их траектории движений абсолютно не предсказуемы.
 Нужны признаки объекта по которым их можно различать.

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


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

Самый простой и быстрый  способ, который используется в том числе в particle filter - это сравнение гистограмм. Построить гистограмму объекта при обнаружении, далее сравнивать с гистограммой объектов на последующих кадрах, при сооттветствии обновить. Рекомендую сравнивать гистограммы методом Бхатачарья (есть в OpenCV) или нессиметричной метрикой из другой области - расстояние Кульбака-Лейблера (нет в OpenCV).

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

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

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

Например, взять 3 метрики: расстояние Жаккара (его называют IoU, intersection over union), расстояние между гистограммами и евклидово расстояние между HOG дескрипторами. Тогда итоговое расстояние будет равно: D = w0 * IoU + w1 * HistDist + w2 * HOGDist, где w0 + w1 + w2 = 1.

Линейной комбинацией может быть такой вариант: w0=0.5, w1=0.2, w2=0.3. То есть мы требуем хорошего пересечения описывающих прямоугольников, из-за проблем со светом влияние похожести гистограмм сводим на минимум, а похожесть HOG'ов влияет средне. Эти коэффициенты надо подбирать не вручную, а написать тесты, разметить ролики и запустить перебор вариантов на достижение наилучшего качества.

Нелинейной комбинацией можно достичь бОльшего. Например, если IoU < 0.1, то уже совсем не считать HistDist  и HOGDist, а сразу говорить, что расстояние равно  D = 0. Вариантов много, для каждого конкретного случая можно подобрать свою удачную комбинацию.

  • Like 1

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


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

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

Привет.

Вот это интересно, есть примеры в реализации?.

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

Но как это применимо в анализе и слежении за объектами?

Или все делаются путем анализа объекта (сетка нашла человека или машину), потом "найденный кусочек" картинки сравнивается с предыдущим кадром "найденных кусочков" на соответствие? 

  • Like 1

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


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

Да, именно последнее. Если посмотретьна результаты трекинга одного объекта в VOT 2018, то в победителях уже сиамские нейросети. У них свои недостатки, например, их реалтайм - это реалтайм на GT 2080 Ti, что совсем грустно.

Реализаций полно на Гитхабе, например тут и тут.

  • Like 2

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


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

Спасибо.

По оптимизации проблем нет, сейчас у нас на расберри 4 кадра в сек в биометрии на БД в 1 млн лиц (используем сиамские сети). Поэтому думаю по треку будет так же.

Спасибо еще раз на наводку, попробую если появится такая задача.

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


Ссылка на сообщение
Поделиться на других сайтах
В 24.08.2019 at 22:50, Nuzhny сказал:

Самый простой и быстрый  способ, который используется в том числе в particle filter - это сравнение гистограмм.

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

Честно, запутался в интегралах, расстояниях Кульбака-Лейблера и Бхатачарья. Интересует сравнение двух гистограмм на подобие. Беру примитивный пример: картинка из двух цвета. Из первой картинки делаю вторую, меняя контрастность (можно яркость). Их гистограммы приведены на рисунке.

gistogramm.JPG.9dcb016507da42596fa858ea2530ccf1.JPG

Если при сравнении применить Евклидово расстояние, то получаю, что картинки сильно отличаются. А мне нужно получить расстояние, близкое к 0. Выше перечисленные методы дадут результат, близкий к 0 и как?

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


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

Надо выбрать правильный размер бина. Если ты знаешь, что яркость картинок может отличаться на 20-30, то и размер бина надо брать не 1, а больше.

Рекомендую Евклидово расстояние вообще не использовать, а для начала просто поиграть со встроенными функциями из OpenCV, убедиться, что они подходят или нет, а уже потом писать самому. Почему не использовать Евклидово расстояние? Потому что гистограмма по своей природе больше похожа не на дескриптор, а на выборку из некоторого распределения. Соответственно и проверять насколько одно распределение похоже на другое. Формула там, кстати, очень простая, распределение дискретной, поэтому никаких интегралов: https://docs.opencv.org/3.4/d8/dc8/tutorial_histogram_comparison.html

 

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


Ссылка на сообщение
Поделиться на других сайтах
В 28.08.2019 at 21:11, Nuzhny сказал:

а для начала просто поиграть со встроенными функциями из OpenCV

Пытался разобраться с методами, искал коэффициент, который отвечает за меру похожести. Например, при 0 коэффициенте должно быть абсолютное совпадение, при 1 очень приблизительное совпадение. Такого коэффициента в формулах нет. 

Проверил практически, создал картинку из 2-х цветов. Затем осветлил и затемнил, получив еще 2 картинки. Результаты: 

Method 0 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1 / 0.974776 / -0.000545 / -0.000545
Method 1 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0 / 0.221103 / 1.3576 / 1.3576
Method 2 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 1.3576 / 1.3576 / 0 / 0
Method 3 Perfect, Base-Half, Base-Test(1), Base-Test(2) : 0 / 0.0956222 / 1 / 1

Т.е. гистограммы картинок абсолютно не похожи, но картинки то похожи по цвету! 

1.png.76a356d56b92994e6bf1a02b0e19decd.png

2.png.5e78b7bec2e179eba6a3ec5a2ac572be.png

3.png.2adbf281ac987de1cdc3bf513be0b342.png

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

Буду проверять свою следующую методику:

Полученную гистограмму, буду размывать по методу Гаусса. Это и будет коэффициентом на подобие, малая размывка гистограммы - проверка на одинаковость, сильная размывка гистограммы - проверка на подобие. Затем применяю любой метод расстояний, даже Евклидово расстояние. Если при сравнении цвета находятся в соседних корзинах, то размывка перебросит часть значений по соседним корзинам и гистограммы начнут совпадать. Может я не вижу подводных камней?

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


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


Непонятно, что за эксперименты ты проводил. Я кидал выше ссылку с экспериментом с рукой, он работает и там сказано, что означает каждый из коэффициентов - каждое из расстояний. Разумеется, что 0 не обязательно означает абсолютное совпадение. Например, корреляции совпадение будет равно 1.

Далее, похожесть по цвету в RGB выразить трудно или невозможно.

Размывать гистограмм у можно, хуже не будет. Но можно просто взять размер бина побольше, что будет равносильно box фильтру.

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

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

  • Like 1

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


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

У меня в этом вопросе есть нерешённая проблема с расстояниями, а именно с тем, как нормировать расстояние между центрами объектов или как для него выбирать правильный порог, не зная физической модели объектов.

Если мы наблюдаем за людьми со стационарной камеры, висящей на потолке помещения, то отличной метрикой будет служить IoU (Жаккара), которое есть отношение площади пересечения прямоугольников к площади объединения и расстояние это будет лежать в интервале [0, 1]. Всё круто: объекты крупные, двигаются медленно, метрика адекватная.

Но тут мы вешаем камеру повыше на улицу, объекты становятся меньше, где-то проносятся машины на большой скорости. Пролетела птица возле камеры и каждый её прямоугольник не пересекается с предыдущим. Или птица летит вдалеке и её прямоугольник настолько мал, что пересечения минимальны или также равны нулю. Поэтому мы начинаем измерять не IoU, а расстояние между центрами прямоугольников на текущем и предыдущем кадрах. Расстояние в пикселях и мы берём порог, равный десятой части кадра, например. Типа объект не может двигаться так быстро, чтобы пролететь/проехать слишком далеко. Но тут появляются сразу две проблемы:

1. Почему мы взяли 10-ю часть кадра? Очевидно, что для далёких объектов это слишком много, а для близких может быть и мало. Такое ощущение, что порог должен быть свой для каждого детектируемого объекта в зависимости от его размеров и  расстояния до камеры. А если мы распознаём тип объекта, то и для типа: автомобиль может проехать с одной максимальной скоростью, а человек нет.

2. Если мы хотим использовать в качестве расстояния не только расстояние между центрами на текущем и предыдущем кадрах, а ещё и расстояние между, скажем, гистограммами, то получится, что они имеют совершенно разные размерности. Одно в пикселях, а другое относительно. Хочется первое тоже как-то нормировать от [0, 1], но непонятно как. Разделить на диагональ кадра будет слишком круто, значения окажутся черезчур маленькими. Как нормировать расстояние в пикселях?

Кажется, что проблему так сходу не решить или решить только костылями. Делать калибровку камеры и считать расстояния не в пикселях, а в метрах. Это может помочь, если бы мы знали тип объекта и его размер, так как посчитать расстояние до него по одной камере не всегда возможно. То есть для людей и машин на одной плоскости это может быть хорошо, а с птицами на расстоянии 10 и 100 метров от камеры будет всё плохо. Да и откалибровать камеру редко когда можно.

Хорошее распознавание может помочь: для людей, легковушек, велосипедов и т.п. можно задать средние размеры и средние скорости, строить модели движения и пороги индивидуально. Но это тоже не всегда выход, если нам надо детектировать всё движение и/или маленькие объекты. Нейросети плохо себя чувствуют, когда есть объект в 4-8 пикселей размером, их либо не задетектит, либо будет ооочень медленно. Да и не во всех задачах нейросети применимы.

Напрашивается ещё решение: применять сначала какой-то средний порог в зависимости от размера объекта. Типа объект не может сдвинуться дальше, чем, скажем, три его диагонали. А далее брать из фильтра Кальмана его скорость и корректировать этот порог исходя ещё из скорости. соответственно и нормировать можно на него.

Вооот. получился не столько вопрос, сколько рассуждения. Если у кого-то есть какие-нибудь мысли или успешный опыт решения проблемы - welcome.

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


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

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

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


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

Smorodov, это то, что называется re-id.  Кажется, что оно может плохо работать, ведь сеть обучается не различать отдельные объекты между собой, а отличать типы объектов. Кажется, что все люди будут близки друг с другом, машины друг с другом, а надо ещё и их различать между собой. Впрочем, я тут ещё не экспериментировал, надо попробовать, раз уж YOLO в проект проинтегрировано, благо и образец имеется.

Надо ещё из OpenVINO потестить, у них есть обученная модель на "Identify Someone in Different Videos". Но это опять таки же сеть специально обученная различать пешеходов между собой. Также там есть "face reidentification" - различать лица между собой.

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


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

Ну тут от сети зависит, есть ведь сети для распознавания лиц, например. Что мешает обучить сеть на пешеходах под разными углами зрения, и научить извлекать признаки для различения их между собой. И соорудить каскад, тип объекта + дескриптор. 

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


Ссылка на сообщение
Поделиться на других сайтах
В 06.09.2019 at 11:51, Nuzhny сказал:

Smorodov, это то, что называется re-id.  Кажется, что оно может плохо работать, ведь сеть обучается не различать отдельные объекты между собой, а отличать типы объектов. Кажется, что все люди будут близки друг с другом, машины друг с другом, а надо ещё и их различать между собой. Впрочем, я тут ещё не экспериментировал, надо попробовать, раз уж YOLO в проект проинтегрировано, благо и образец имеется.

Надо ещё из OpenVINO потестить, у них есть обученная модель на "Identify Someone in Different Videos". Но это опять таки же сеть специально обученная различать пешеходов между собой. Также там есть "face reidentification" - различать лица между собой.

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×