目標追蹤(Object Tracking)概念的簡要介紹

如今咱們有一個視頻流,能夠拆解出 N 個幀出來,這時候初始幀/某一幀中出現了一個咱們感興趣目標,咱們但願在後續幀中對這個目標進行追蹤,這時候就須要 CV 中的目標追蹤;git

目標追蹤的效果以下:github

 

雖然效果看起來和實時人臉檢測識別效果同樣,可是其實只對初始幀進行了人臉檢測和識別,後續幀只須要進行檢測,不須要再進行識別;算法

 

Q: 那麼問題來了,爲何不直接對每一幀進行檢測+識別?3d

A: 由於識別所佔用的資源要遠遠大於檢測;能夠看到下圖中,左邊進行實時的檢測+識別,在無 GPU,CPU=i7-8700K 的狀況下,FPS 只有 1.8;視頻

而右圖中若是換成目標追蹤的方法(只對初始幀作識別,後續幀只作跟蹤),FPS 能夠達到了 28,得到了差很少 15 倍的提高;對象

   

左圖:檢測 + 識別,https://github.com/coneypo/Dlib_face_recognition_from_camera/blob/master/face_descriptor_from_camera.pyblog

右圖:檢測 + OT,https://github.com/coneypo/Dlib_face_recognition_from_camera/blob/master/face_reco_from_camera_ot_single_person.pyip

 

爲了實現目標追蹤,咱們按照如下步驟進行:資源

  1. 對於初始幀(視頻流中的第一幀),輸入/經過檢測算法,獲得一系列目標的位置座標;
  2. 爲這些 ROI 建立 ID;
  3. 在視頻流中的後續幀,尋找幀之間目標對象的關係,將幀之間的目標關聯起來;

 

目標跟蹤可讓咱們對於每個追蹤的目標指定一個惟一的 ID,因此讓咱們能夠對視頻中的跟蹤物體進行計數,應用於計算人數的場景;部署

 

一個理想化的目標追蹤算法可以實現:

  1. 只須要初始化的時候進行目標檢測;
  2. 處理速度可以很快;
  3. 能夠處理被跟蹤目標,消失或者超過邊界的狀況;
  4. 能夠處理幀之間目標消失,而後再出現的特殊狀況;

 

上圖 gif 中只有一個目標,因此其實後續幀中的檢測出來的目標,若是仍是一個,確定就是咱們第一幀中識別出來的 person_X;

可是每每是一幀中出現多目標,咱們就須要對於先後幀中的多目標進行比對匹配;

如下圖爲例,好比左邊是第 N 幀 ,有兩個目標,咱們檢測識別出來是 ID#1 和 ID#2,在 N+1 幀中,也檢查出來兩個目標,咱們知道這兩個目標就是 ID#1 和 ID#2,可是不知道到底哪一個是 ID#1 哪一個是 ID#2;

 

因此就須要 質心追蹤算法(Centroid Tracking)來進行斷定後續幀中的 ID:

 

 

質心追蹤算法(Centroid Tracking,依賴於在視頻流的連續幀中,比較已知目標和新出現目標之間質心的歐氏距離;

總體的處理邏輯流程以下,但願可以只在第一幀/初始幀進行檢測識別,並試圖將第 N+1 幀中的目標,與第 N 幀的目標關聯起來,這樣對於後續幀,再也不須要進行識別,只須要進行檢測就能夠獲得目標的 ID 了;

  • 第 N 幀:目標檢測,目標識別
  • 第 N+1 幀:目標檢測,目標追蹤
  • 第 N+2 幀:目標檢測,目標追蹤
  • 第 N+2 幀:目標檢測,目標追蹤
  • ...

 

 

 

步驟一:對於某幀取特徵框並計算質心

 

對於視頻流,經過檢測算法對於每幀圖像進行檢測;

好比上圖中有兩個特徵框 / 或者咱們假定兩個特徵框給它,分別爲 ID #1 和 ID #2,能夠計算出兩個特徵框的質心,分別獲得位置座標 (x,y);

以實際視頻流爲例:

 

 

步驟二:計算新舊目標特徵框質心的歐氏距離

對於視頻流中的後續幀,咱們利用檢測算法來計算特徵框,可是咱們不會再去給對於每個檢測到的物體添加新的 ID 或者標記什麼的(只作檢測,不作識別),而是但願將新的目標可以和舊目標聯繫起來;

咱們經過計算每對新舊目標的歐式距離來獲得這些目標之間的關係;

以下圖所示,好比幀 N 時候有兩個目標(綠色),幀 N+1 時候有三個目標(紅色),因此對於咱們但願知道,這兩個舊目標(綠色),在後續幀中變成了哪個新目標(紅色);

因此咱們想知道以下質心之間的關係:

  • 綠1->紅1,綠1->紅2,綠1->紅3;
  • 綠2->紅1,綠2->紅2,綠2->紅3;

 

步驟三:更新已知目標的質心座標

質心追蹤算法的前提是:對於一個給定目標,將會在後續幀中都出現,並且在第 N 幀和 N+1 幀中的質心歐氏距離,要小於不一樣目標之間的歐式距離;

所以咱們在視頻流的連續幀之間,根據歐氏距離最小原則,將這些幀中特徵框的質心聯繫起來,能夠獲得一個目標 X 在這些連續幀中的變化聯繫,就達到了咱們目標追蹤的目的;

 

步驟四:註冊新目標

有時候會有新目標的加入,好比幀 N 的時候有 x 個目標,而幀 N+1 的時候有 x+1 個目標,增長了一個目標;

因此對於這個新增的目標,咱們按照如下順序進行註冊:

  1. 給這個新目標一個目標 ID;
  2. 儲存這個目標特徵框的質心位置;

 

而後從步驟二開始,對於視頻流中的每一幀進行計算歐氏距離,更新座標等步驟;

 

步驟五:註銷舊目標

一個目標在後續幀中可能會消失,咱們的目標追蹤算法也要可以處理這種狀況;

可是對於消失目標的處理方法,要根據於你實際部署應用的場景;

  • 第 N 幀丟失目標,註銷舊目標
  • 第 N 幀丟失目標,並且第 N 幀中的後續 n 幀中都沒有找回來,那就註銷舊目標

由於每次從新註冊的成本(進行檢測/識別)的成本要大於歐氏距離比對進行目標追蹤的成本;

 

這篇介紹 OT 的理論部分,接下來會介紹如何用 Python + OpenCV 去實現 OT;

 

# 請尊重他人勞動成果,轉載或者使用源碼請註明出處:http://www.cnblogs.com/AdaminXie

# 歡迎關注個人 Github:https://github.com/coneypo/

# 若有問題請留言或者聯繫郵箱: coneypo@foxmail.com