\documentclass[a4paper,fontsize=14bp]{article}

\input{../common-preamble}
\input{../fancy-listings-preamble}
\input{../bmstu-preamble}
\numerationTop

\begin{document}
\thispagestyle{empty}
\makeBMSTUHeader

\makeReportTitle{домашней}{№ 1}{Создание оригинального алгоритма регенерации характерных признаков}{Цифровая обработка изображений}{}{Большаков В.Э.}
\newpage
\thispagestyle{empty}
\tableofcontents
\newpage
\pagestyle{fancy}
\section{Задание}
\begin{enumerate}
\item На языке Python 3.х подключить библиотеку opencv;
\item Дать пошаговое описание работы метода Лукаса-Канаде(ЛК);
\item Подготовить видеопоток с медленно движущимся объектом по горизонтали;
\item Запрограммировать отслеживание объекта с использованием ЛК метода (использовать функцию \code{cv2.calcOpticalFlowPyrLK()});
\item Сделать перевод статьи Tracking of Moving Objects With Regeneration of Object Feature Points;
\item Подготовить второй видеопоток на основе для создания условий потери характерных точек ЛК при движении объекта;
\item Разработать и запрограммировать оригинальный алгоритм регенерации характерных признаков ЛК (по аналогии со статьей).
\item Провести эксперимент по регенерации характерных признаков ЛК с визуализацией результатов.
\item Провести эксперимент по отслеживанию объектов с визуализацией результатов (в том числе визуализацией применения характерных признаков на изображении). Сравнить надежность отслеживания с регенерацией и без нее.
\end{enumerate}
\section{Теоретическая часть}
Для обнаружения объектов на видео используется несколько методов: Ши-Томаси (поиск опорных точек) и Лукаса-Канаде (слежение за опорными точками в оптическом потоке).
\subsection{Метод поиска опорных точек Ши-Томаси}
Основная идея заключается в том, что углы могут быть обнаружены путем поиска значительных изменений во всех направлениях. Сначала рассматривается небольшое окно на изображении, затем сканируем всё изображение в поисках углов. Смещение окна в любом направлении приведет к значительному изменению внешнего вида, если это конкретное окно окажется над углом. То есть если мы замечаем, что есть область, в которой происходят значительные изменения, независимо от того, в каком направлении производится сканирование, то есть высокая вероятность, что в этом месте находится угол. Метод Ши-Томаси основан на методе детектирования углов Харриса (подробнее в подразделе \hrf{appendix:harris}) заключается в поиске соседних областей со значительным изменением интенсивности расматриваемого параметра (например, яркости). Метод производит оценку изображения и выставляет коэффициенты изменения областям. Выставление корректного порога оценки является ключевым фактором в правильном определении. Метод Ши-Томаси принципиально отличается только формулой оценки (подробнее в подразделе \hrf{appendix:shi-tomasi}) выбирающей не разницу произведения и суммы $\lambda_1$ и $\lambda_2$, а минимум из этих двух значений. 
\subsection{Метод Лукаса-Канаде}
Оптический поток - это изображение видимого движения объектов, получаемое в результате перемещения объекта относительно наблюдателя. Выборочный поток - поток, который учитывает сдвиг отдельных заданных точек (например, некоторых характерных точек, предварительно найденных одним из алгоритмов детектирования таких точек). Алгоритм Лукаса-Канаде использует выборочный поток на первом кадре и после оценивает их расположение на последующем кадре. Алгоритм использует следующие данные: 

\begin{itemize}
\item Два кадра, следующие друг за другом (кадры полученные видео);
\item Массив начального набора характеристических точек;
\item Массив результирующих точек;
\item Массив который показывает статус поиска каждой точки;
\item Массив погрешностей для каждой операции поиска;
\item Размер окна по которому производится гауссово усреднение;
\item Дополнительные флаги, которые можно использовать для установки начального приближения потока или выбрать метод оценки погрешности, а также пороговое значение градиента.
\end{itemize}

Важное допущения, для использования метода Лукаса-Канаде:
\begin{itemize}
\item Значения пикселей переходят из одного кадра в следующий кадр без изменений. Таким образом, мы делаем допущение, что пиксели, относящиеся к одному и тому же объекту, могут сместиться в какую-либо сторону, но их значение останется неизменным;
\item В алгоритме используется только производная первого порядка для аппроксимации функции движения выборочного потока
\end{itemize}

\subsection{Регенерация точек}
Мы можем попытаться регенерировать точки после препятствия, потому что предполагаем что точки продолжат движение с вероятностью, которую можно найти, как максимум функции правдоподобия. То есть, из всего пространства возможных элементарных перемещений точек мы выбираем те, при которых функция правдоподобия достигает своего максимума. Функция правдоподобия зависит от значений положения опорных точек до препятствия и после (можно сказать, что это априорное положение опорной точки и апостериорное). Так как явный вид такой функции неизвестен, мы предполагаем что функция плотности вероятности является нормальной случайной величиной и, по этой причине, с вероятностью $\pm34.13\%$ опорная точка продолжит движение со среднеквадратичным отклонением скорости, численно равным средней скорости всех опорных точек до препятствия
\section{Практическая часть}
Входящими в алгоритм данными является видеофайл (поток из видеокадров) содержащий статический фон (камера не двигается), некоторое препятствие (неподвижный объект, находящийся между камерой и отслеживаемым объектом) и достаточно медленно перемещающийся объект. Результат работы алгоритма - это наложенные поверх видео отметки о характерных точках движущегося объекта. С точки зрения реализации, работа по распознаванию характерных точек в видеокадрах разделена на четыре основные части:
\begin{enumerate}
\item преобразование изображения в градации серого производится стандартной функцией библиотеки \code{OpenCV}.
  \begin{lstlisting}[language=Python,style=PyCodeStyle]
    # ...
    prevGrayscale = cv2.cvtColor(prevFrame, cv2.COLOR_BGR2GRAY)
    # ...
    frameGrayscale = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    # ...
  \end{lstlisting}
  В результате работы функции алгоритмы будут далее использовать изображения как, например, на рис. \hrf{pic:first}.
\begin{figure}[H]
  \centering
  \includegraphics[width=14cm]{01-dip-hw-first.png}
  \caption{Первый кадр изображения}
  \label{pic:first}
\end{figure}

\item поиск характерных точек методом Ши-Томаси,
  \begin{lstlisting}[language=Python,style=PyCodeStyle]
    # ...
    p0 = cv2.goodFeaturesToTrack(prevGrayscale, mask=mask_rect, **shiTomasiParameters)
    # ...
  \end{lstlisting}
  Характерные точки ищутся внутри выделенной области (рис. \hrf{pic:bounding-box}). Внутрь функции передаются параметры, представленные в листинге \hrf{src:shi-tomasi-param}.
  \begin{lstlisting}[language=Python,style=PyCodeStyle,label={src:shi-tomasi-param}]
    # ...
    shiTomasiParameters = dict(maxCorners=1000,
                               qualityLevel=0.3,
                               minDistance=5)
    # ...
  \end{lstlisting}
  где
  \begin{itemize}
  \item [] \code{maxCorners} - количество углов (точек), которые мы хотим найти;
  \item [] \code{qualityLevel} - значение порога, ниже которого углы будут отклонены;
  \item [] \code{minDistance} - расстояние, на котором будут отброшены все менее качественные углы.
  \end{itemize}
\begin{figure}[H]
  \centering
  \includegraphics[width=14cm]{01-dip-hw-manual.png}
  \caption{Определение окна объекта}
  \label{pic:bounding-box}
\end{figure}
  
\item отслеживание характерных точек методом Лукаса–Канаде (рис. \hrf{pic:tracking}) - производится встроенной функцией из библиотеки OpenCV, также на монохромном изображении. Функция принимает на вход предыдущий и текущий кадр, а также параметры, представленные в листинге

  \begin{lstlisting}[language=Python,style=PyCodeStyle,label={src:lucas-kanade-param}]
lucasKanadeParameters = dict(winSize=(10, 10),
                             maxLevel=2,
                             criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
# ...
p1, st, err = cv2.calcOpticalFlowPyrLK(prevGrayscale, frameGrayscale, p0, None, **lucasKanadeParameters)
  \end{lstlisting}
  где
  \begin{itemize}
  \item [] \code{winSize} - размеры окна поиска;
  \item [] \code{maxLevel} - количество уровней пирамиды поиска;
  \item [] \code{criteria} - критерии окончания поиска итеративным алгоритмом.
  \end{itemize}

  и для вызова функции
  \begin{itemize}
  \item [] \code{prevGrayscale} - предыдущий кадр в градациях серого;
  \item [] \code{frameGrayscale} - текущий кадр в градациях серого;
  \item [] \code{p0} - набор из найденных на предыдущем кадре точек;
  \item [] \code{p1} - набор из найденных (отслеженных) на текущем кадре точек;
  \item [] \code{st} - вектор статуса точек (1 точка отслежена и подтверждена, 0 точка потеряна).
  \end{itemize}

\begin{figure}[H]
  \centering
  \includegraphics[width=14cm]{01-dip-hw-frame-before.png}
  \caption{Отслеживание характерных точек}
  \label{pic:tracking}
\end{figure}
\item попытка регенерации потерянных из-за наличия препятствия характерных точек по методу Лычкова-Алфимцева-Сакулина. По условию задачи объект двигается горизонтально, его скорость невелика, как и любой иной объект он имеет свойство сохранять своё движение и за препятствием (когда опорные точки явно пропадают из вида), тогда мы можем предположить, что точки продолжат двигаться с некоторой скоростью, которую они имели до попадания объекта за препятствие, так называемая средняя скорость в физике. Применяя это понятие производим суммирование по всем точкам объекта и вычисляем среднюю скорость до попадания за препятствие, делим на количество таких точек, получим среднюю скорость, далее, когда объект окажется за препятствием - добавляем к тем точкам которые прекратили своё движение в горизонтальном направлении (упёрлись в препятствие) эту среднюю скорость, как добавочную, и считаем что они продолжают движение с этой скоростью. Далее как только объект вновь покажется после препятствия, метод Лукаса-Канаде снова найдёт опорные точки в потоке и продолжит следовать за ними (рис \hrf{pic:regeneration}). То есть, делаем экстраполяцию (прогноз) движения опорных точек. Код, осуществляющий такое вычисление представлен в листинге \hrf{src:regeneration}.

  \begin{figure}[H]
    \includegraphics[width=14cm]{01-dip-hw-frame-after.png}
    \caption{Регенерация характерных точек}
    \label{pic:regeneration}
  \end{figure}

  \begin{lstlisting}[language=Python,style=PyCodeStyle,label={src:regeneration}]
goodPoints = 0
badPoints = 0
badPointArray = []

k = 0.1
meanXVelocity = 0.0
xVelocity = 0.0
for i in range(len(pointsInFrame)):
    if abs(pointsInFrame[i][0] - pointsInPrevFrame[i][0]) <= k:
        badPointArray.append(i)
        badPoints += 1
    else:
        goodPoints += 1
        xVelocity += abs(pointsInPrevFrame[i][0] - pointsInFrame[i][0])
if goodPoints != 0:
    meanXVelocity = xVelocity / goodPoints
for i in badPointArray:
    pointsInFrame[i][0] += meanXVelocity
  \end{lstlisting}

\end{enumerate}

\section{Заключение и выводы}
В результате выполнения работы были изучены базовые методы цифровой обработки изображений и отслеживания объектов в видеопотоке. Объект был зафиксирован и отслеживался на протяжении всего пути, несмотря на препятствие. При проходе объекта за препятствием без применения регенерации все точки были потеряны, в то время как регенерация позволила сохранить большую их часть. Для увеличения числа сохранённых точек возможно описать более надёжный алгоритм регенерации с учётом направления движения характерной точки и добавления некоторой дельты скоростей (на случай изменения скорости движения объекта, пока он находится вне зоны видимости).
\newpage
\appendix
\section*{Приложения}
\addcontentsline{toc}{section}{Приложения}
\renewcommand{\thesubsection}{\Asbuk{subsection}}

\subsection{Полный листинг программы}
\begin{lstlisting}[language=Python,style=PyCodeStyle]
import numpy as np
import cv2
from matplotlib import pyplot as plt


def mainScript(videoName):
    cap = cv2.VideoCapture(videoName)
    shiTomasiParameters = dict(maxCorners=1000,
                               qualityLevel=0.3,
                               minDistance=7)

    lucasKanadeParameters = dict(winSize=(10, 10),
                                 maxLevel=2,
                                 criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))

    plt.figure(figsize=(10, 10))
    ret, prevFrame = cap.read()
    plt.imshow(prevFrame)
    plt.show()

    prevGrayscale = cv2.cvtColor(prevFrame, cv2.COLOR_BGR2GRAY)
    mask_rect = [[0] * int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))] * int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    mask_rect = np.asarray(mask_rect)
    mask_rect = mask_rect.astype(np.uint8)
    x0 = 0
    y0 = 450
    dx = 130
    dy = 130
    mask_rect[y0:y0 + dy, x0:x0 + dx] = 255
    p0 = cv2.goodFeaturesToTrack(prevGrayscale, mask=mask_rect, **shiTomasiParameters)
    p0_cor = np.int0(p0)

    plt.figure(figsize=(10, 10))
    cv2.rectangle(prevFrame, (x0, y0), (x0 + dx, y0 + dy), 255, 2)
    for i in p0_cor:
        x, y = i.ravel()
    cv2.circle(prevFrame, (x, y), 1, 255, -1)
    plt.imshow(prevFrame)
    plt.show()

    mask = np.zeros_like(prevFrame)
    color = np.random.randint(0, 255, (100, 3))

    while True:
        ret, frame = cap.read()
        if not ret:
            break
        frameGrayscale = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
        p1, st, err = cv2.calcOpticalFlowPyrLK(prevGrayscale, frameGrayscale, p0, None, **lucasKanadeParameters)

        # Select good points
        pointsInFrame = p1[st == 1]
        pointsInPrevFrame = p0[st == 1]

# Regeneration
        goodPoints = 0
        badPoints = 0
        badPointArray = []

        k = 0.1
        meanXVelocity = 0.0
        xVelocity = 0.0
        for i in range(len(pointsInFrame)):
            if abs(pointsInFrame[i][0] - pointsInPrevFrame[i][0]) <= k:
                badPointArray.append(i)
                badPoints += 1
            else:
                goodPoints += 1
                xVelocity += abs(pointsInPrevFrame[i][0] - pointsInFrame[i][0])
        if goodPoints != 0:
            meanXVelocity = xVelocity / goodPoints
        for i in badPointArray:
            pointsInFrame[i][0] += meanXVelocity
# End Regeneration

        # draw the tracks
        for i, (new, old) in enumerate(zip(pointsInFrame, pointsInPrevFrame)):
            a, b = new.ravel()
            c, d = old.ravel()
            mask = cv2.line(mask, (int(a), int(b)), (int(c), int(d)), color[i].tolist(), 2)
            frame = cv2.circle(frame, (int(a), int(b)), 1, color[i].tolist(), -1)
        img = cv2.add(frame, mask)

        cv2.imshow('frame', img)
        k = cv2.waitKey(30) & 0xff
        if k == 27:
            break

        # Now update the previous frame and previous points
        prevGrayscale = frameGrayscale.copy()
        p0 = pointsInFrame.reshape(-1, 1, 2)

    cv2.destroyAllWindows()
    cap.release()


if __name__ == '__main__':
    mainScript('IMG_9680.MOV')
\end{lstlisting}


\subsection{Детектирование углов Харриса} \label{appendix:harris}
\href{https://docs.opencv.org/4.x/dc/d0d/tutorial_py_features_harris.html}{OpenCV: Документация}

\begin{multicols}{2}
  Углы — это области изображения с большим разбросом интенсивности во всех направлениях. Одна из первых попыток найти углы в цифровом изображении была предпринята Крисом Харрисом и Майком Стивенсом в их статье «Комбинированный детектор углов и краев» в 1988 году, поэтому теперь она называется детектором углов Харриса. Он описал эту идею в математической форме. В основном, он находит разницу в интенсивности для смещения $(u, v)$ во всех направлениях. Это выражается следующим образом:
  
  \begin{equation*}
    \begin{gathered}      
E(u,v)= \\ =\sum_{x,y} w(x,y) [I(x+u,y+v) − I(x,y)]^2
    \end{gathered}
  \end{equation*}

  где $w(x,y)$ - это оконная функция, $I(x+u,y+v)$ - смещённая интенсивность, $I(x,y)$ - интенсивность. Оконная функция представляет собой либо прямоугольное окно, либо окно Гаусса, которое дает вес пикселям под ним.

Мы должны максимизировать функцию $E(u,v)$ для обнаружения углов. Это означает, что мы должны максимизировать второй член. Применяя разложение в ряд Тейлора к приведенному выше уравнению и используя некоторые математические шаги, мы получаем окончательное уравнение вида:
  \begin{equation*}
E(u,v)\approx [u,v] M \begin{bmatrix} u\\v \end{bmatrix}
  \end{equation*}
  где
  \begin{equation*}
    M = \sum_{x,y} w(x,y) \begin{bmatrix}
      I_xI_x & I_xI_y\\
      I_xI_y & I_yI_y
    \end{bmatrix}
  \end{equation*}
  
Здесь $I_x$ и $I_y$ — производные изображения в направлениях $x$ и $y$ соответственно. (Их можно найти с помощью функции \code{cv.Sobel()}).

Затем идет основная часть. Предварительные действия создали оценочную функцию, то есть, фактически, уравнение, которое определяет, может ли окно содержать угол или нет.
  \begin{equation*}
R = det(M) - k(trace(M))^2
  \end{equation*}
где

\begin{itemize}
\item [] $det(M) = \lambda_1\lambda_2$
\item [] $trace(М) = \lambda_1 + \lambda_2$
\item [] $\lambda_1$ и $\lambda_2$ — собственные значения оператора M
\end{itemize}
Таким образом, величины этих собственных значений определяют, является ли область углом, краем или плоскостью.

\begin{itemize}
\item Когда $|R|$ мал, что бывает при малых $\lambda_1$ и $\lambda_2$, область плоская.
\item При $R < 0$, что бывает при $\lambda_1 \gg \lambda_2$ или наоборот, область является краевой.
\item Когда $R$ велико, что происходит, когда $\lambda_1$ и $\lambda_2$ велики и $\lambda_1 \sim \lambda_2$, область представляет собой угол.
\end{itemize}

Таким образом, результатом Harris Corner Detection является изображение в градациях серого с оценками. Указание корректных пороговых значений для таких оценок даёт углы изображения.
\end{multicols}

\subsection{Детектирование углов Ши-Томаси} \label{appendix:shi-tomasi}
\href{https://docs.opencv.org/3.4/d4/d8c/tutorial_py_shi_tomasi.html}{OpenCV: Документация}
\begin{multicols}{2}
В 1994, J. Shi и C. Tomasi немного изменили метод Харриса, что было отражено в их работе «Good Features to Track» которая показыват лучшие результаты, чем детектор углов Харриса. Оценочная функция в детекторе углов Харриса дана как:

  \begin{equation*}
R = \lambda_1\lambda_2 - k(\lambda_1+\lambda_2)^2
  \end{equation*}

Вместо этого, Ши-Томаси предложили:
  \begin{equation*}
R = \min(\lambda_1, \lambda_2)
  \end{equation*}

Если значение больше порогового, область считается углом.
\end{multicols}

\subsection{Метод вычисления Лукаса-Канаде} \label{appendix:lucas-kanade}
\href{http://cecas.clemson.edu/~stb/klt/lucas_bruce_d_1981_1.pdf}{Оригинальная статья}

\href{https://en.wikipedia.org/wiki/Lucas–Kanade_method}{Wikipedia}
\begin{multicols}{2}
В компьютерном зрении метод Лукаса-Канаде является широко используемым дифференциальным методом для оценки оптического потока. Он предполагает, что поток практически постоянный в локальной окрестности рассматриваемого пикселя, и решает основные уравнения оптического потока для всех пикселей в этой окрестности по критерию наименьших квадратов. Комбинируя информацию от нескольких соседних пикселей, метод Лукаса-Канаде часто может разрешить присущую обработке оптического потока неоднозначность. Он также менее чувствителен к шуму изображения, чем точечные методы. С другой стороны, поскольку это чисто локальный метод, он не может предоставить информацию о потоках внутри однородных областей изображения.

Метод Лукаса–Канаде предполагает, что смещение содержимого изображения между двумя близкими моментами (кадрами) мал\'{о} и примерно постоянно в окрестности рассматриваемой точки $p$. Таким образом, можно предположить, что уравнение оптического потока выполняется для всех пикселей в пределах окна с центром в точке $p$. А именно, локальный вектор потока изображения (скорости) $(V_x, V_y)$ должен удовлетворять
\begin{equation*}
  \begin{gathered}
I_{x}(q_{1})V_{x}+I_{y}(q_{1})V_{y}=-I_{t}(q_{1})\\
I_{x}(q_{2})V_{x}+I_{y}(q_{2})V_{y}=-I_{t}(q_{2})\\
\vdots \\
I_{x}(q_{n})V_{x}+I_{y}(q_{n})V_{y}=-I_{t}(q_{n})\\
  \end{gathered}
\end{equation*}
где

$q_1, q_2, ..., q_n$ — это пиксели внутри окна, а
$I_{x}(q_{i}), I_{y}(q_{i}), I_{t}(q_{i})$ — частные производные изображения $I$ относительно положения $х, у$ и времени $t$, оценённые в точке $q_{i}$ и в настоящее время.

Эти уравнения можно записать в матричной форме $A_v = b$, где
\begin{equation*}
  \begin{gathered}   
  A=
  \begin{bmatrix}
    I_{x}(q_{1}) & I_{y}(q_{1}) \\
    I_{x}(q_{2}) & I_{y}(q_{2}) \\
    \vdots & \vdots \\
    I_{x}(q_{n}) & I_{y}(q_{n})    
  \end{bmatrix}
  v=
  \begin{bmatrix}
    V_x \\ V_y
  \end{bmatrix} \\
  b =
  \begin{bmatrix}
    -I_{t}(q_{1}) \\
    -I_{t}(q_{2}) \\
    \vdots  \\
    -I_{t}(q_{n})        
  \end{bmatrix}
  \end{gathered}
\end{equation*}


В этой системе больше уравнений, чем неизвестных, и поэтому она обычно переопределена, то есть, метод Лукаса–Канаде позволяет получить компромиссное решение по принципу наименьших квадратов. А именно, решает
$2 \times 2$ систему:
\begin{equation*}
  \begin{gathered}
A^{T}Av=A^{T}b \text{или}\\
v = (A^{T}A)^{-1}A^{T}b
  \end{gathered}
\end{equation*}

где
$A^{T}$ - транспонированная матрица $A$. То есть он вычисляет
\begin{equation*}
  \begin{gathered}    
  \begin{bmatrix}
    V_x \\ V_y
  \end{bmatrix} =
  \begin{bmatrix}
    \sum_i^nI_x(q_i)^2 & \sum_i^n I_x(q_i)I_y(q_i)\\
    \sum_i^nI_y(q_i)I_x(q_i) & \sum_i^n I_y(q_i)^2
  \end{bmatrix}^{-1}\\
  \begin{bmatrix}
    \sum_i^n I_x(q_i)I_t(q_i)\\
    \sum_i^n I_y(q_i)I_t(q_i)
  \end{bmatrix}
  \end{gathered}
\end{equation*}

где центральная матрица в уравнении является обратной матрицей. Матрицу $A^TA$ часто называют структурным тензором изображения в точке $p$.

Приведенное выше решение методом наименьших квадратов придает одинаковую важность всем $n$ пикселям $q_{i}$ в окне. На практике обычно лучше придавать больший вес пикселям, расположенным ближе к центральному пикселю $p$. Для этого используется взвешенная версия уравнения наименьших квадратов,
\[А^{Т}WАv = А^{Т}Wb\]

или же
\[v = (A ^ {T} WA) ^ {- 1} A^{T} Wb\]

где $W$ — диагональная матрица $n\times n$, содержащая веса $W_{ii}=w_{i}$, которые должны быть присвоены уравнению пикселя $q_{i}$. То есть вычисляет
\begin{equation*}
  \begin{gathered}    
  \begin{bmatrix}
    V_x \\ V_y
  \end{bmatrix} = \\
  \begin{bmatrix}
    \sum_iw_iI_x(q_i)^2 & \sum_i w_iI_x(q_i)I_y(q_i)\\
    \sum_iw_iI_x(q_i)I_y(q_i) & \sum_i w_iI_y(q_i)^2
  \end{bmatrix}^{-1}\\
  \begin{bmatrix}
    \sum_i w_iI_x(q_i)I_t(q_i)\\
    \sum_i w_iI_y(q_i)I_t(q_i)
  \end{bmatrix}
  \end{gathered}
\end{equation*}


Вес $w_{i}$ обычно устанавливается как функция Гаусса от расстояния между $q_{i}$ и $p$.

\paragraph{Условия использования и методы}
Чтобы уравнение $A^{T}Av=A^{T}b$ было разрешимо, $A^{T}A$ должно быть обратимым, или собственные значения $A^{T}A$ должны удовлетворять $\lambda _{1} \geq \lambda _{2} > 0$. Чтобы избежать проблем с шумом, обычно требуется, чтобы $\lambda_{2}$ не было слишком маленьким. Кроме того, если $\lambda_{1}/\lambda_{2}$ слишком велико, это означает, что точка $p$ находится на ребре, и этот метод страдает от проблемы с апертурой. Таким образом, для правильной работы этого метода необходимо, чтобы $\lambda_{1} и \lambda_{2}$ были достаточно большими и имели одинаковую магнитуду. Это условие также относится к обнаружению углов. Это наблюдение показывает, что можно легко определить, какой пиксель подходит для работы метода Лукаса-Канаде, проверив одно изображение.

Одним из основных предположений для этого метода является то, что движение небольшое (например, менее 1 пикселя между двумя изображениями). Если движение велико, один из методов состоит в том, чтобы сначала уменьшить разрешение изображений, а затем применить метод Лукаса-Канаде. Чтобы добиться отслеживания движения с помощью этого метода, его можно итеративно применять к вектору потока и пересчитывать до тех пор, пока не будет достигнут некоторый порог, близкий к нулю, после чего можно предположить, что окна изображения очень близки по подобию (движутся достаточно медленно). Делая это для каждого последовательного окна отслеживания, точка может отслеживаться на нескольких изображениях, пока она либо не будет скрыта, либо не выйдет за пределы кадра.
\end{multicols}

\subsection{Отслеживание движущихся объектов с регенерацией характерных точек объекта} \label{appendix:alfimtsev-lychkov}
\begin{multicols}{2}
\textbf{Аннотация. Эта статья посвящена отслеживанию движущихся объектов в видео, основанному на технике разреженного оптического потока. Текущие оптические методы отслеживания потока страдают от потери характерных точек. Мы расширили существующий метод отслеживания разреженного оптического потока с помощью новой функции автоматического восстановления характерных точек, использующей принцип биологической регенерации. Кроме того, мы улучшили метод отслеживания для работы с преобразованиями вращения и масштабирования объекта. Мы применили улучшенный метод отслеживания к реальному видео и заметили приемлемую производительность отслеживания. Наш эксперимент показал, что предложенный метод слежения с восстановлением характерных точек обеспечивает более высокую точность отслеживания, чем оригинальный метод отслеживания без восстановления характерных точек когда движущийся объект частично закрыт препятствием.
Ключевые слова - отслеживание движущихся объектов, видеопоток, перекрытие объекта, обнаружение характерных точек, биологическая регенерация.}

\paragraph{1. Введение}
Автоматическое отслеживание движущихся объектов на видео — важная задача, возникающая в таких областях, как безопасность, оборона, робототехника и др. Она заключается в вычислении положения движущегося объекта в последовательности видеокадров по заданному его положению в первом видеокадре последовательности. Автоматическое отслеживание движущихся объектов — сложная задача для видео с окклюзией (перекрытием) объектов и плохим освещением.

\paragraph{2. Обзор литературы}
Можно выделить пять основных подходов к отслеживанию движущихся объектов: отслеживание блобов, отслеживание на основе контуров, отслеживание оптического потока, отслеживание на основе моделей и отслеживание нейронной сети. Отслеживание блоба  использует методы вычитания фона и не подходит для видео, записанных движущейся камерой. Отслеживание нейронной сети требует больших обучающих наборов данных, которые можно найти только для определенных категорий объектов и только для обычных видео. Трудно подготовить большие обучающие наборы данных для видеороликов, производимых инфракрасными камерами или электронными оптическими преобразователями приборов ночного видения. Отслеживание на основе контуров, отслеживание на основе 3D-моделей и отслеживание плотного оптического потока требуют больших вычислительных мощностей, поэтому эти методы не подходят для приложений реального времени. В этой работе мы улучшаем существующий метод отслеживания разреженного оптического потока, основанный на оптическом потоке Лукаса-Канаде, который устраняет необходимость обучения и подходит для приложений в реальном времени.

\paragraph{3. Постановка задачи}
Отслеживание разреженного оптического потока заключается в обнаружении характерных точек в видеокадре и последующем отслеживании обнаруженных характерных точек в серии видеокадров. Из-за несовершенства алгоритмов отслеживания некоторые характерные точки могут быть потеряны. Первоначально в контуре движущегося объекта можно обнаружить несколько характерных точек. Значительная часть пятна изображения вокруг такой характерной точки приходится на фон. Во время отслеживания, эта характерная точка может покинуть область объекта и войти в область фона, что вносит неопределенность в отслеживание движущегося объекта. Кроме того, непрозрачные препятствия могут скрывать некоторые части движущегося объекта и затруднять его правильное отслеживание. Для повышения точности слежения предлагается метод автоматического восстановления потерянных характерных точек путем обнаружения новых характерных точек в пределах области объекта. Основная идея метода восстановления основана на использовании принципов биологической регенерации.

\paragraph{4. Восстановление характерных точек, основанное на биологической регенерации}
Регенерация – это особая способность биологического организма восстанавливать утраченные части своего тела. Рассмотрим три известных принципа биологической регенерации: эпиморфоз, моральфаллакс и эндоморфоз. Эпиморфоз заключается в редукции тканей тела, прилежащих к повреждённой поверхности, разрастании клеток и их последующей дифференцировке. Моральфалакс во многом похож на эпиморфоз, за ​​исключением того, что остальные клетки организма подлежат перестройке. Эндоморфоз заключается в восстановлении поврежденной массы органа за счет деления и гипертрофии клеток.

Вышеупомянутые принципы регенерации могут быть адаптированы для восстановления потерянных характерных точек в задаче отслеживания объектов следующим образом. Эпиморфозы сохраняют исходные геометрические параметры движущихся объектов. Основным критерием для присвоения характерной точки движущемуся объекту является расстояние от этой характерной точки до ближайшего центра объекта. Основная идея моральфаллакса во многом похожа на эпиморфоз, за ​​исключением того, что осуществляется дальнейшая оптимизация, чтобы уменьшить количество плохо отслеживаемых характерных точек. Эндоморфоз учитывает количество характерных точек, которые в настоящее время отслеживаются в ограничивающей рамке объекта.

В данной работе мы предлагаем использовать эпиморфоз в качестве базового принципа восстановления характерных точек. Пользователь задает порог количества отслеживаемых характерных точек в качестве входного параметра метода. Характерные точки изображения отслеживаются в каждом видеокадре с использованием разреженного оптического потока Лукаса-Канаде, а ограничивающие рамки объектов вычисляются с помощью метода отслеживания движущихся объектов, представленного в следующем разделе. Когда количество характерных точек в ограничивающей рамке объекта уменьшится ниже заданного пользователем порога, новые характерные точки будут обнаружены следующим образом. Сначала мы применяем детектор характерных точек Ши-Томаси для обнаружения новых характерных точек в ограничивающей рамке объекта. Во-вторых, мы отбрасываем характерные точки, расположенные на расстоянии менее 5 пикселей от исходных характерных точек объекта, которые в настоящее время отслеживаются. Наконец, мы выбираем необходимое количество характерных точек, которые находятся ближе всего к центру ограничивающей рамки объекта в текущем видеокадре.

\paragraph{5. Метод отслеживания объекта в видео}
Главная проблема отслеживания характерных точек на основе разреженного оптического потока состоит в миграции отдельных характерных точек из области изображения движущегося объекта в область фонового изображения, что вносит ошибки в результаты отслеживания. Чтобы добиться надежного отслеживания движущихся объектов, нам необходимо различать и отбрасывать потерянные характерные точки. Метод слежения за движущимися объектами на основе сети относительного движения позволяет сопоставлять наблюдаемые положения объектов в текущем видеокадре с траекториями объектов в последовательности видеокадров по их относительным смещениям. Для составления оптимального совпадения используется принцип максимального правдоподобия. Оригинальный метод слежения предполагает, что отдельный объект представлен одной характерной точкой в ​​видеокадре, имеет дело только с поступательным движением и не учитывает вращение и масштабирование изображения объекта в кадре во время его движения. В этой работе мы предлагаем модификацию исходного метода отслеживания для работы с вращением и масштабированием объекта.

Входящие данные метода включают набор кадров $Z_t = \{z_t^k\}$ полученный с использованием техники оптического потока, где $t$ это индекс видеокадра, $k$ - индекс характерной точки, $z_t^k = [z_{ut}^k, z_{vt}^k]$ - вектор обзора с координатами $z_{ut}^k$ и $z_{vt}^k$.
Текущее состояние отслеживаемых движущихся объектов представлено набором состояний $X_t = \{(x_t^i, h_t^i)\}$, где $t$ - индекс видеокадра, $i$ - индекс движущегося объекта ($i = 0$ означает фон), $x_t^i = [x_{ut}^i, x_{vt}^i]$ - вектор центров $i$-ых объектов внутри $t$-ого видеокадра, $h_t^i = [h_{ut}^i, h_{vt}^i]$ представляет размер границ распознанного $i$-го объекта.
Для расчёта положения центра объекта и относительного положения различных характерных точек мы составляем относительную модель движения $R_t = \{ (m_j^i, n_j^i), \pi_i \}$, где $(m_j^i,n_j^i), j = 1 : 2N$ это список индексов соответствующих пар характерных точек для $i$-го объекта, $\pi_i$ обозначает индексы основной соответствующей пары характерных точек $(m_{πi}^i, n_{πi}^i)$ которая используется для отслеживания $i$-го объекта на $t$-ом видеокадре. Для начального видеокадра $t = 0$ список индексов объединяется с использованием случайной выборки $2N$ пар характерных точек из общего набора обнаруженных характерных точек.
Затем мы сопоставляем характерные точки с движущимися объектами и находим основные опорные характерные точки объектов по принципу максимального правдоподобия:

\begin{equation}
  \begin{gathered}    
  p(Z_t|X_t,R_{t-1}) = \\ = \max\limits_{A, \pi}\prod_{i,k} p(z_t^k|x_t^i,R_{t-1}^\pi)^{a^{i,k}}
  \end{gathered}
  \label{eq:likehood}
\end{equation}

где $R_{t-1}$ это модель относительного движения для предыдущего видеокадра, $R_{t-1}^\pi$ это модель относительного движения с измененными индексами пар основных опорных точек всех объектов, $A = \{a^{i,k}\}$ и $a^{i,k} \in \{0, 1\}$ представляют совпадающие соответствия точек признаков объектам, $p(z_t^k|x_t^i,R_{t-1}^\pi)$ функция частичного совпадения.

Чтобы упростить проблему оптимизации возможно применить функцию логарифма к правой части (\hrf{eq:likehood}):
\begin{equation}
  \begin{gathered}
  p(Z_t|X_t,R_{t-1}) \sim \\ \sim \max\limits_{A, \pi}\prod_{i,k} a^{i,k} \ln p(z_t^k|x_t^i,R_{t-1}^\pi)
  \end{gathered}
  \label{eq:likehood-ln}
\end{equation}

Модель относительного движения настраивается следующим образом. Решение задачи оптимизации (\hrf{eq:likehood-ln}) дает оптимальные значения элементов матрицы $A$. Можно выбрать пару лучших опорных точек модели $R_{t–1}$ при условии глобального оптимума (\hrf{eq:likehood-ln}) и $(N – 1)$ лучших опорных точек при условии локального максимума правдоподобия для $i$-го объекта:

\begin{equation}
  \begin{gathered}    
  \pi_{i\max} = \\ = \arg \max\limits_{A, \pi}\prod_{i,k} a^{i,k} \ln p(z_t^k|x_t^i,R_{t-1}^\pi)
  \end{gathered}
  \label{eq:likehood-ln-max}
\end{equation}

Остальные $N$ пар выбираются методом случайной выборки из набора характерных точек $i$-го объекта в $t$-м видеокадре. Функция частичного правдоподобия представляется в виде

\begin{equation}
  p(z_t^k|x_t^i,R_{t-1}^\pi) = G(z_\tau^k, y_\tau^k)
  \label{eq:likehood-partial}
\end{equation}

где $G$ - это двумерный Гауссиан

\begin{equation}
  \begin{gathered}    
  G(v, v_0) = \\ = \exp \left\{ -\frac{1}{2}(v-v_0)^T C(v-v_0) \right\}
  \end{gathered}
  \label{eq:gaussian}
\end{equation}

с ковариационной матрицей

\begin{equation}
  C=\begin{bmatrix}
    \sigma_u^2 & \sigma_u\sigma_v\\
    \sigma_u\sigma_v & \sigma_u^2
    \end{bmatrix}
  \label{eq:covariance-matrix}
\end{equation}

и стандартными отклонениями для различных координат

\begin{equation}
  3\sigma_u = \frac{1}{2}h_{u\tau}^i, 3\sigma_v = \frac{1}{2}h_{v\tau}^i
  \label{eq:coord-deviations}
\end{equation}

которые зависят от размера $i$-го объекта и времени $\tau$ обнаружения $k$-й характерной точки.

$y_\tau^k = [y_{u\tau}^k, y_{v\tau}^k]^T$ в (\hrf{eq:likehood-partial}) - это прогнозируемое положение $k$-й характерной точки в $\tau$-м видеокадре, предполагая, что $k$-я характерная точка назначена $i$-му объекту, а модель относительного движения $i$-й характерной точки объекта представляет собой модель аффинного преобразования.

Матрица аффинного преобразования $M_{ti} \in R^{2\times3}$ для $i$-го движущегося объекта определяется использованием следующей системой уравнений

\begin{equation}
  \begin{cases}
    [z_{u\tau}^{p1} z_{v\tau}^{p1}]^Τ = M_{ti} \cdot [z_{u\tau}^{p1} z_{v\tau}^{p1} 1]^Τ\\
    [z_{u\tau}^{p2} z_{v\tau}^{p2}]^Τ = M_{ti} \cdot [z_{u\tau}^{p2} z_{v\tau}^{p2} 1]^Τ,\\
    [z_{u\tau}^{p3} z_{v\tau}^{p3}]^Τ = M_{ti} \cdot [z_{u\tau}^{p3} z_{v\tau}^{p3} 1]^Τ
  \end{cases}
  \label{eq:affine-matrix}
\end{equation}
где $p1, p2, p3$ это индексы характерных точек, присвоенных $i$-му движущемуся объекту.

Предсказанное положение $k$-й характерной точки в $\tau$-м видеокадре вычисляется с использованием матрицы аффинного преобразования $M_{ti}$.
\begin{equation}
  y_{k\tau} = M_{ti} \cdot [z_{u\tau}^{k} z_{v\tau}^{k} 1]^Τ
  \label{eq:affine-equation}
\end{equation}
Характерная точка, переместившаяся из области движущегося объекта в фоновую область, уйдет далеко от движущегося объекта. Её функция частичного правдоподобия (\hrf{eq:likehood-partial}) принимает б\'{о}льшие значения, если характерная точка отнесена к фону, и меньшие значения, если характерная точка отнесена к движущемуся объекту. Таким образом, оптимальное решение для (\hrf{eq:likehood-ln}) дает нам разумное соответствие точек признаков движущимся объектам или фону.

\paragraph{6. Устройство эксперимента и результаты}
Мы записали оригинальное видео с частотой кадров 25 кадров в секунду, продолжительностью 50 секунд и разрешением 720$\times$576 пикселей, которое представляет дорожное движение на дороге. Мы использовали предложенный метод отслеживания объектов для извлечения опорных траекторий для 14 движущихся автомобилей из исходного видео. Начальные точки траектории задавались вручную. Для имитации перекрытия движущихся объектов препятствием мы нанесли на все видеокадры 4 вертикальные серые полосы (каждая полоса шириной 12 пикселей), получив модифицированное видео. Мы применили предложенный метод отслеживания объектов к модифицированному видео, таким образом, получив результирующие траектории для 14 движущихся автомобилей в модифицированном видео для двух случаев. В первом случае восстановление характерных точек не производилось, а во втором случае восстановление характерных точек осуществлялось по предложенному способу регенерации. Координатам начальной точки траектории присваивались те же значения, что и для соответствующих опорных траекторий. Затем мы сопоставили полученные траектории с эталонными траекториями и рассчитали две метрики производительности: процент успешно отслеженных объектов и отклонение слежения. Движущийся объект считался успешно отслеженным, если расстояние его положения на результирующей траектории от его положения на опорной траектории не превышает заданного максимального порога расстояния для каждого видеокадра. Порог максимального расстояния задавался вручную в процентах от размера ограничивающей рамки объекта. Процент успешно отслеженных объектов рассчитывался как количество успешно отслеженных объектов, делённый на общее количество опорных траекторий. Отклонение слежения вычислялось как среднее стандартное отклонение полученных траекторий от эталонных траекторий среди всех успешно отслеженных объектов. Количество отслеживаемых характерных точек объекта было установлено вручную равным 10. Результаты эксперимента представлены в таблице в оригинале статьи. Когда пороговое значение максимального расстояния устанавливалось равным 0,5 размера ограничивающей рамки объекта, отслеживание с восстановлением потерянных характерных точек обеспечивало меньшее отклонение отслеживания, чем отслеживание без восстановления потерянных характерных точек. Когда порог максимального расстояния устанавливался на 0,75 размера ограничивающей рамки объекта, отслеживание с восстановлением потерянных характерных точек обеспечивало более высокий процент успешно отслеженных объектов, чем отслеживание без восстановления потерянных характерных точек.

\paragraph{7. Выводы}
В данной работе мы расширили существующий метод отслеживания движущихся объектов в видеороликах функцией автоматического восстановления потерянных характерных точек, основанной на принципе биологической регенерации. Эксперимент, проведенный на реальном видео, показал, что автоматическое восстановление потерянных характерных точек позволяет повысить точность слежения в случае перекрытия движущегося объекта неподвижным препятствием. Использование аффинной модели движения позволяет иметь дело с поворотными и масштабными преобразованиями движущегося объекта при отслеживании.
\end{multicols}
\end{document}

