-
Notifications
You must be signed in to change notification settings - Fork 651
Fine tuning TrackerSettings
При создании класса CTracker необходимо указать параметры всех методов и алгоритмов, которые будут участвовать в процессе его работы, с помощью структуры TrackerSettings. Данная структура содержит следующие опции по настройке:
1 Метод SetDistance задаёт способ вычисления расстояния между отслеживаемыми трэками и объектами, найденными на текущем кадре. Метод принимает своим параметром одно из значений перечисления tracking::DistType:
1.1 DistCenters. Вокруг текущего центра трэка описывается эллипс, диагонали которого равны его тройной скорости (скорость получается из матрицы состояния фильтра Калмана). Вычисляется отношение евклидового расстояния между центром объекта и центром эллипса к расстоянию от центра до границы эллипса. Если центр объекта совпадает с центром эллипса, то итоговое значение расстояния будет равно D(c) = 0; если на границе или за эллипсом, то D(c) = 1; в остальных случаях расстояние лежит в интервале (0; 1).
1.2 DistRects. В данном случае итоговое расстояние D(R) является взвешенной суммой трёх величин: расстояние из пункта выше D(c), отношения ширины объекта к ширине трэка D(W) = min(W(obj), W(tr)) / max(W(obj), W(tr)) и отношения высоты объекта к высоте трэка D(H) = min(H(obj), H(tr)) / max(H(obj), H(tr)). То есть D(R) = 1 - (1 - D(c)) * (D(W) + D(H)) / 2. Очевидно, что D(R) также лежит на отрезке [0; 1].
1.3 DistJaccard. Расстояние Жаккара или IoU (intersection over union) – отношение площади пересечения к площади объединения прямоугольников объекта и трэка, D(J) также лежит на отрезке [0; 1]. Данный тип расстояния нет смысла использовать при отслеживании маленьких объектов и/или объектов, которые за один кадр могут сдвинуться более чем на свой размер.
1.4 DistHist. Внутри прямоугольника объекта на текущем кадре и внутри прямоугольника трэка на кадре, на котором он в последний раз был задетектирован, строятся 2 гистограммы, которые сравниваются методом Бхаттачарья. Полученное расстояние D(Hist) по определению находится на отрезке [0; 1]. Данное расстояние вычислительно самое тяжёлое из всех перечисленных. Его имеет смысл использовать только для достаточно больших по размеру объектов, которые должны значительно друг от друга отличаться. При этом стоит учитывать тот факт, что описывающий прямоугольник может захватывать часть фона и разные объекты с одним фоном могут быть более похожи друг на друга, чем один объект, который перешёл с одного фона на другой.
2 Метод SetDistances служит для совместного использования перечисленных выше видов расстояний. Их можно комбинировать друг с другом, используя совместно, например DistCenters и DistHist. В данном случае, итоговым расстоянием между объектами будет считаться линейная комбинация указанных расстояний. При этом необходимо, чтобы сумма коэффициентов линейной комбинации была равна 1.
3 Параметр m_distThresh указывает максимально допустимый порог для расстояния между объектом и трэком.
4 Параметр m_minAreaRadiusPix задаёт минимальные значения в пикселях для диагоналей эллипса, используемого при вычислении расстояний D(c) и D(R). Это ограничение необходимо для неподвижных или медленных объектов, чтобы они при шумной детекции смогли проассоциироваться с детекциями. Например, можно предположить, что на 1 кадр объект может сместиться на 1/20 часть от ширины кадра, тогда m_minAreaRadius = frameWidth / 20. Данное значение используется, если оно больше либо равно 0.
5 Параметр m_minAreaRadiusK также как и m_minAreaRadiusPix задаёт минимальные значения для диагоналей эллипса, но задаёт не в пикселях, а в пропорциях к размеру объекта. Это может быть полезно при ориентировке камеры к горизонту, где объекты (например, автомобили) могут уезжать в даль, постепенно уменьшаясь, а также подъезжать близко к камере. В таком случае константный параметр m_minAreaRadiusPix не будет адекватно работать только в одном месте кадра. m_minAreaRadiusK используется, если m_minAreaRadiusK < 0.
6 Параметр m_maximumAllowedSkippedFrames задаёт время жизни трэка без детекций, то есть число подрядидущих кадров, на которых трэк не ассоциируется ни с одним детектируемым объектом. Если количество кадров превышает данный порог, то трэк удаляется.
7 Параметр m_maxTraceLength отвечает за максимальную длину траектории трэка, которая сохраняется и отображается на экране. При превышении данного значения более ранние точки траектории заменяются более поздними.
8 Параметр m_kalmanType обозначает, какой тип фильтра Калмана будет использоваться для сглаживания траектории трэка и предсказания его будущего положения, если трэк не ассоциируется с детектируемыми объектами. Доступные значения параметра задаются в перечислении tracking::KalmanType:
8.1 KalmanLinear – используется линейный фильтр Калмана (cv::KalmanFilter), вектор состояния которого задаёт координаты, скорость и, опционально, размер объекта.
8.2 KalmanUnscented — используется Unscented фильтр Калмана (cv::tracking::UnscentedKalmanFilter) который дополнительно задаёт ускорение объекта. Особых преимуществ перед линейным фильтром Калмана не замечено.
9 Параметр m_useAcceleration позволяет выбрать между моделью движения, используемой в линейном фильтре Калмана: равномерное или равноускоренное движение.
10 Параметр m_dt задаёт скорость адаптации фильтра Калмана к детекциям, скорость его инерции. Данный параметр главным образом используется в матрице перехода (transition matrix) линейного фильтра Калмана. Чем меньше значение параметра, тем медленнее будет фильтр Калмана реагировать на новые измерения. Физический смысл данного параметра — квант времени между измерениями. Однако из-за того, что все объекты находятся на разных расстояниях от камеры и трекинг происходит не в мировой системе координат, а в системе координат изображения, то данный параметр не отражает свой реальный физический смысл: далёкие и близкие объекты, движущиеся в реальном мире с одинаковой скоростью, на изображении будут двигаться с разной. Для исправления этой проблемы в реализации используется автоматическая коррекция данного параметра во время работы алгоритма: если фильтр Калмана сильно не успевает за объектом, то в небольших пределах m_dt увеличивается до тех пор, пока предсказания не перестанут отставать от детекций. В этом случае параметр начнёт возвращаться к своему первоначальному значению. Такой подход позволяет корректно сопровождать объекты, которые с быстрой скоростью движутся на оператора — например автомобили проезжающие под камерой.
11 Параметр m_accelNoiseMag задаёт шум фильтра Калмана. Настройке подлежит слабо и имеет физический смысл при знании реальных значений шума измерений.
12 Параметр m_filterGoal определяет, что именно будет содержаться в векторе состояния фильтра Калмана (tracking::FilterGoal):
12.1 FilterCenter — фильтроваться будут исключительно координаты центра объекта и скорость его перемещения. В данном случае при отсутствии сопоставления трэка с детекциями, его размеры будут постоянными, равными последним обнаруженным значениям.
12.2 FilterRect — фильтроваться также будут и размеры объекта, они включаются в матрицу перехода (transition matrix). Важным отличием данного случая является запоминание фильтром скорости изменения объектом своих размеров: если он удалялся и перестал детектироваться, то размер трэка будет уменьшаться с той же скоростью (линейной). Проблема данного фильтра кроется именно в линейности его работы: при приближении объекта к камере или удалении от неё к горизонту размер реального объекта меняется нелинейно. Если объект несколько кадров не будет детектироваться, то размер трэка изменится слишком сильно по отношению к реальному размеру. Поэтому данный тип фильтрации приемлем не для всех типов установки видеокамеры.
13 Параметр m_lostTrackType определяет способ, которым трэк будет предсказывать своё положение на кадре, если он не проассоциировался ни с одним детектируемым объектом. В таком случае трэк запоминает координаты объекта на кадре, на котором он детектировался в последний раз, и ищет своё новое положение на последующих кадрах без детекций. Доискивание объекта на кадре происходит при каждой потере объекта и может создавать серьёзную вычислительную нагрузку. Используется только в том случае, если m_filterGoal равен FilterRect, то есть трекер может уточнять не только положение, но и размер объекта. Способ поиска — визуальный по картинке (VOT, visual object tracking) может принимать одно из следующих значений (tracking::LostTrackType):
13.1 TrackNone — не использовать доискивание, положение на кадре определяется исключительно предсказанием фильтра Калмана.
13.2 TrackKCF — использование алгоритма cv::TrackerKCF, достаточно быстрый и в меру точный уровня 2014 года. Способен адаптироваться к изменению размера объекта.
13.3 TrackMIL - использование алгоритма cv::TrackerMIL, достаточно быстрый, но не точный.
13.4 TrackMedianFlow — использование алгоритма cv::TrackerMedianFlow, медленный.
13.5 TrackGOTURN - использование алгоритма cv::TrackerGOTURN. Нейросетевой метод, очень медленный на CPU – нет смысла использовать.
13.6 TrackMOSSE — использование алгоритма cv::TrackerMOSSE, достаточно быстрый и в меру точный, где-то на уровне KCF.
13.7 TrackCSRT - использование алгоритма cv::TrackerCSRT, немногим медленнее KCF, но значительно устойчивее. Был лучшим в VOT challenge несколько лет назад, затем полностью уступив первенство сиамским нейросетям.
13.8 TrackDAT — использование встроенного алгоритма DAT, по всем параметрам хуже CSRT.
13.9 TrackSTAPLE — использование встроенного алгоритма STAPLE, который по своим параметрам ближе к CSRT, но может быть точнее благодаря ручному отбросу кадров, где объект был найден с низким confidence. Реализация только для x86 архитектуры.
13.10 TrackLDES — использование встроенного алгоритма LDES, главным отличием которого является обнаружение угла наклона объекта (cv::RotatedRect). Реализация только для x86 архитектуры.
14 Параметр m_matchType определяет метод, которым будет решаться задача ассоциации между трэками и объектами на текущем кадре согласно матрице расстояний. В данный момент поддерживается 2 алгоритма (tracking::MatchType):
14.1 MatchHungrian – Венгерский алгоритм (Kuhn–Munkres algorithm). Работает за полиноминальное время O(N^3) и осуществляет матчинг всех трэков ко всем объектам. В нём нельзя задать ограничение в виде предельных значений расстояний между объектом и трэком. Такие мэтчинги отсеиваются уже постфактум после работы алгоритма.
14.2 MatchBipart — решение задачи ассоциации при помощи поиска максимального потока в двудольном графе. В данном случае вершины первой доли графа являются трэками, а второй — детектируемыми на текущем кадре объектами. Рёбра между ними — расстояния между объектом и треком, которые меньше предустановленного порога m_distThres. Таким образом, число рёбер M будет значительно меньше, чем число объектов N. И сложность решения задачи ассоциации будет ниже, чем у Венгерского алгоритма O(N^2 * M). Также можно ожидать, что решение будет точнее за счёт того, что недопустимые связи (рёбра в графе) будут в принципе отсутствовать.
15 Метод AddNearTypes позволяет задать соответствия между различными типами объектов, которые визуально похожи друг на друга, но являются различными. Такие типы объектов детектор может перепутать между собой (определяется в confusion matrix при обучении детектора), следовательно они будут сопровождаться как разные объекты. Например, часто путаются между собой типы «человек» и «ребёнок», «грузовик» и «автобус», «мотоциклист» и «велосипедист» и другие. Такие типы можно «связать» друг с другом с помощью данного метода и они будут сопоставляться при трекинге. Последний параметр метода указывает, что связь между типами может быть симметричной (объект1 может сопоставляться с объектом2 и наоборот) или асимметричной (объект1 может сопоставляться с объектом2, а объект2 с объектом1 - нет).
16 Параметры m_useAbandonedDetection, m_minStaticTime, m_maxStaticTime, m_maxSpeedForStatic позволяют настроить детектор оставленных предметов или остановившихся объектов. Они задают: m_minStaticTime - время в секундах, после которого неподвижный объект считается оставленным, m_maxStaticTime - время в секундах, после которого оставленный предмет удаляется из списка сопровождаемых, m_maxSpeedForStatic - критерий принадлежности объекта к оставленным предметам, а именно порог скорости движения объекта в пикселях.