以AI影象多人臉檢測跟蹤演算法及紅外熱成像技術為基礎打造的百度AI測溫系統為復工返校提供了便利,下面我們來談一談目標跟蹤演算法。

什麼是目標跟蹤(Visual Tracking)?

單目標跟蹤問題:在第一幀中目標會透過一個矩形給出,一旦給出這個目標之後,接下來要做的就是在每一幀中找到這個目標 能拿到的只有第一幀給到的矩形框 可以實時執行目標跟蹤演算法。

比如我想在影片中跟蹤這個小孩的臉,第一幀中會給出這個紅色的框告訴追蹤者目標就是這個小孩的臉,之後小孩會不斷地變化,設定的跟蹤器會告訴你他具體在哪裡。

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

目標跟蹤主要應用的領域:

基於計算機視覺的目標跟蹤演算法

智慧交通

基於計算機視覺的目標跟蹤演算法

機器人

基於計算機視覺的目標跟蹤演算法

智慧監控

目標跟蹤演算法有很多種,本篇先介紹一下KCF演算法。它對於其餘的濾波跟蹤演算法是一種奠基,很具有代表性。所謂的相關濾波方法就是根據當前幀的資訊和之前幀的資訊訓練出一個相關濾波器,然後與新輸入的幀進行相關性計算,得到的置信圖就是預測的跟蹤結果,顯然,得分最高的那個點(或者塊)就是最可能的跟蹤結果。

相關操作是用來衡量兩個訊號是否相關,當兩個訊號越相似,相關性越強的時候,它們做相關操作的響應度就越強。用於跟蹤就是,兩個框裡面的目標越相似的時候它們的響應一定是越高的。

基於計算機視覺的目標跟蹤演算法

接下來是迴圈矩陣,利用其對角化性質可以得到

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

迴圈矩陣的計算可以直接把所有的樣本都轉換為對角矩陣進行處理,因為在迴圈矩陣對樣本進行處理的時候,樣本並不是真實存在的樣本,存在的只是虛擬的樣本,可以直接利用迴圈矩陣所特有的特性,直接把樣本矩陣轉換為對角矩陣進行計算, 這樣可以大幅度加快矩陣之間的計算,因為對角矩陣的運算只需要計算對角線上非零元素的值即可。

基於計算機視覺的目標跟蹤演算法

時間複雜度下降

基於計算機視覺的目標跟蹤演算法

迴圈圖片示例

上方是迴圈圖片的示例,本來是中間那個樣子的圖,然後向下移動15個單位得到左邊的圖,如果移動30個畫素就是最左邊的圖。右邊是向上移動的結果圖。這樣算是直接增加了樣本的數量,然後用來對分類器進行訓練,更多的樣本肯定能夠訓練的分類器的效果就更好了。

KCF在做訓練的時候用到的分類器是嶺迴歸,線上性的情況下,嶺迴歸的最佳化目標方程是這樣的

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

Solution(closed)

非線性情況下

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

Solution(closed)

檢測出跟蹤結果,就是當前輸入的幀和濾波器求相關性,相關性最大的即為跟蹤結果。

基於計算機視覺的目標跟蹤演算法

基於計算機視覺的目標跟蹤演算法

化簡過程

基於計算機視覺的目標跟蹤演算法

KCF結果

最後結果是0。732,較已有演算法有大幅提升。

接下來是一些具體程式碼

影象特徵提取

if

features

hog

%

HOG

features

from

Piotr

s

Toolbox

x

=

double

fhog

single

im

/

255

cell_size

features

hog_orientations

));

x

end

=

[];

%

remove

all

-

zeros

channel

“truncation feature”

end

if

features

gray

%

gray

-

level

scalar

feature

x

=

double

im

/

255

x

=

x

-

mean

x

));

end

響應運算和中心座標預測

switch

kernel

type

case

gaussian

kzf

=

gaussian_correlation

zf

model_xf

kernel

sigma

);

case

polynomial

kzf

=

polynomial_correlation

zf

model_xf

kernel

poly_a

kernel

poly_b

);

case

linear

kzf

=

linear_correlation

zf

model_xf

);

end

response

=

real

ifft2

model_alphaf

*

kzf

));

%

equation

for

fast

detection

vert_delta

horiz_delta

=

find

response

==

max

response

)),

1

);

if

vert_delta

>

size

zf

1

/

2

%

wrap

around

to

negativ

vert_delta

=

vert_delta

-

size

zf

1

);

end

if

horiz_delta

>

size

zf

2

/

2

horiz_delta

=

horiz_delta

-

size

zf

2

);

end

pos

=

pos

+

cell_size

*

vert_delta

-

1

horiz_delta

-

1

];

參考: