如今咱們有一個視頻流,能夠拆解出 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
爲了實現目標追蹤,咱們按照如下步驟進行:資源
目標跟蹤可讓咱們對於每個追蹤的目標指定一個惟一的 ID,因此讓咱們能夠對視頻中的跟蹤物體進行計數,應用於計算人數的場景;部署
一個理想化的目標追蹤算法可以實現:
上圖 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 了;
步驟一:對於某幀取特徵框並計算質心
對於視頻流,經過檢測算法對於每幀圖像進行檢測;
好比上圖中有兩個特徵框 / 或者咱們假定兩個特徵框給它,分別爲 ID #1 和 ID #2,能夠計算出兩個特徵框的質心,分別獲得位置座標 (x,y);
以實際視頻流爲例:
步驟二:計算新舊目標特徵框質心的歐氏距離
對於視頻流中的後續幀,咱們利用檢測算法來計算特徵框,可是咱們不會再去給對於每個檢測到的物體添加新的 ID 或者標記什麼的(只作檢測,不作識別),而是但願將新的目標可以和舊目標聯繫起來;
咱們經過計算每對新舊目標的歐式距離來獲得這些目標之間的關係;
以下圖所示,好比幀 N 時候有兩個目標(綠色),幀 N+1 時候有三個目標(紅色),因此對於咱們但願知道,這兩個舊目標(綠色),在後續幀中變成了哪個新目標(紅色);
因此咱們想知道以下質心之間的關係:
步驟三:更新已知目標的質心座標
質心追蹤算法的前提是:對於一個給定目標,將會在後續幀中都出現,並且在第 N 幀和 N+1 幀中的質心歐氏距離,要小於不一樣目標之間的歐式距離;
所以咱們在視頻流的連續幀之間,根據歐氏距離最小原則,將這些幀中特徵框的質心聯繫起來,能夠獲得一個目標 X 在這些連續幀中的變化聯繫,就達到了咱們目標追蹤的目的;
步驟四:註冊新目標
有時候會有新目標的加入,好比幀 N 的時候有 x 個目標,而幀 N+1 的時候有 x+1 個目標,增長了一個目標;
因此對於這個新增的目標,咱們按照如下順序進行註冊:
而後從步驟二開始,對於視頻流中的每一幀進行計算歐氏距離,更新座標等步驟;
步驟五:註銷舊目標
一個目標在後續幀中可能會消失,咱們的目標追蹤算法也要可以處理這種狀況;
可是對於消失目標的處理方法,要根據於你實際部署應用的場景;
由於每次從新註冊的成本(進行檢測/識別)的成本要大於歐氏距離比對進行目標追蹤的成本;
這篇介紹 OT 的理論部分,接下來會介紹如何用 Python + OpenCV 去實現 OT;
# 請尊重他人勞動成果,轉載或者使用源碼請註明出處:http://www.cnblogs.com/AdaminXie
# 歡迎關注個人 Github:https://github.com/coneypo/
# 若有問題請留言或者聯繫郵箱: coneypo@foxmail.com