目标追踪(Object Tracking)概念的简要介绍
現(xiàn)在我們有一個(gè)視頻流,可以拆解出 N 個(gè)幀出來,這時(shí)候初始幀/某一幀中出現(xiàn)了一個(gè)我們感興趣目標(biāo),我們希望在后續(xù)幀中對(duì)這個(gè)目標(biāo)進(jìn)行追蹤,這時(shí)候就需要 CV 中的目標(biāo)追蹤;
目標(biāo)追蹤的效果如下:
雖然效果看起來和實(shí)時(shí)人臉檢測(cè)識(shí)別效果一樣,但是其實(shí)只對(duì)初始幀進(jìn)行了人臉檢測(cè)和識(shí)別,后續(xù)幀只需要進(jìn)行檢測(cè),不需要再進(jìn)行識(shí)別;
Q: 那么問題來了,為什么不直接對(duì)每一幀進(jìn)行檢測(cè)+識(shí)別?
A: 因?yàn)樽R(shí)別所占用的資源要遠(yuǎn)遠(yuǎn)大于檢測(cè);可以看到下圖中,左邊進(jìn)行實(shí)時(shí)的檢測(cè)+識(shí)別,在無 GPU,CPU=i7-8700K 的情況下,F(xiàn)PS 只有 1.8;
而右圖中如果換成目標(biāo)追蹤的方法(只對(duì)初始幀做識(shí)別,后續(xù)幀只做跟蹤),F(xiàn)PS 可以達(dá)到了 28,獲得了差不多 15 倍的提升;
左圖:檢測(cè) + 識(shí)別,https://github.com/coneypo/Dlib_face_recognition_from_camera/blob/master/face_descriptor_from_camera.py
右圖:檢測(cè) + OT,https://github.com/coneypo/Dlib_face_recognition_from_camera/blob/master/face_reco_from_camera_ot_single_person.py
為了實(shí)現(xiàn)目標(biāo)追蹤,我們按照以下步驟進(jìn)行:
對(duì)于初始幀(視頻流中的第一幀),輸入/通過檢測(cè)算法,得到一系列目標(biāo)的位置坐標(biāo);
為這些 ROI 創(chuàng)建 ID;
在視頻流中的后續(xù)幀,尋找?guī)g目標(biāo)對(duì)象的關(guān)系,將幀之間的目標(biāo)關(guān)聯(lián)起來;
目標(biāo)跟蹤可以讓我們對(duì)于每一個(gè)追蹤的目標(biāo)指定一個(gè)唯一的 ID,所以讓我們可以對(duì)視頻中的跟蹤物體進(jìn)行計(jì)數(shù),應(yīng)用于計(jì)算人數(shù)的場(chǎng)景;
一個(gè)理想化的目標(biāo)追蹤算法能夠?qū)崿F(xiàn):
只需要初始化的時(shí)候進(jìn)行目標(biāo)檢測(cè);
處理速度能夠很快;
可以處理被跟蹤目標(biāo),消失或者超過邊界的情況;
可以處理幀之間目標(biāo)消失,然后再出現(xiàn)的特殊情況;
上圖 gif 中只有一個(gè)目標(biāo),所以其實(shí)后續(xù)幀中的檢測(cè)出來的目標(biāo),如果還是一個(gè),肯定就是我們第一幀中識(shí)別出來的 person_X;
但是往往是一幀中出現(xiàn)多目標(biāo),我們就需要對(duì)于前后幀中的多目標(biāo)進(jìn)行比對(duì)匹配;
以下圖為例,比如左邊是第 N 幀 ,有兩個(gè)目標(biāo),我們檢測(cè)識(shí)別出來是 ID#1 和 ID#2,在 N+1 幀中,也檢查出來兩個(gè)目標(biāo),我們知道這兩個(gè)目標(biāo)就是 ID#1 和 ID#2,但是不知道到底哪個(gè)是 ID#1 哪個(gè)是 ID#2;
所以就需要質(zhì)心追蹤算法(Centroid Tracking)來進(jìn)行判定后續(xù)幀中的 ID:
質(zhì)心追蹤算法(Centroid Tracking),依賴于在視頻流的連續(xù)幀中,比較已知目標(biāo)和新出現(xiàn)目標(biāo)之間質(zhì)心的歐氏距離;
整體的處理邏輯流程如下,希望能夠只在第一幀/初始幀進(jìn)行檢測(cè)識(shí)別,并試圖將第 N+1 幀中的目標(biāo),與第 N 幀的目標(biāo)關(guān)聯(lián)起來,這樣對(duì)于后續(xù)幀,不再需要進(jìn)行識(shí)別,只需要進(jìn)行檢測(cè)就可以得到目標(biāo)的 ID 了;
第 N 幀:目標(biāo)檢測(cè),目標(biāo)識(shí)別
第 N+1 幀:目標(biāo)檢測(cè),目標(biāo)追蹤
第 N+2 幀:目標(biāo)檢測(cè),目標(biāo)追蹤
第 N+2 幀:目標(biāo)檢測(cè),目標(biāo)追蹤
...
步驟一:對(duì)于某幀取特征框并計(jì)算質(zhì)心
對(duì)于視頻流,通過檢測(cè)算法對(duì)于每幀圖像進(jìn)行檢測(cè);
比如上圖中有兩個(gè)特征框 / 或者我們假定兩個(gè)特征框給它,分別為 ID #1 和 ID #2,可以計(jì)算出兩個(gè)特征框的質(zhì)心,分別得到位置坐標(biāo) (x,y);
以實(shí)際視頻流為例:
步驟二:計(jì)算新舊目標(biāo)特征框質(zhì)心的歐氏距離
對(duì)于視頻流中的后續(xù)幀,我們利用檢測(cè)算法來計(jì)算特征框,但是我們不會(huì)再去給對(duì)于每一個(gè)檢測(cè)到的物體添加新的 ID 或者標(biāo)記什么的(只做檢測(cè),不做識(shí)別),而是希望將新的目標(biāo)能夠和舊目標(biāo)聯(lián)系起來;
我們通過計(jì)算每對(duì)新舊目標(biāo)的歐式距離來得到這些目標(biāo)之間的關(guān)系;
如下圖所示,比如幀 N 時(shí)候有兩個(gè)目標(biāo)(綠色),幀 N+1 時(shí)候有三個(gè)目標(biāo)(紅色),所以對(duì)于我們希望知道,這兩個(gè)舊目標(biāo)(綠色),在后續(xù)幀中變成了哪一個(gè)新目標(biāo)(紅色);
所以我們想知道如下質(zhì)心之間的關(guān)系:
綠1->紅1,綠1->紅2,綠1->紅3;
綠2->紅1,綠2->紅2,綠2->紅3;
步驟三:更新已知目標(biāo)的質(zhì)心坐標(biāo)
質(zhì)心追蹤算法的前提是:對(duì)于一個(gè)給定目標(biāo),將會(huì)在后續(xù)幀中都出現(xiàn),而且在第 N 幀和 N+1 幀中的質(zhì)心歐氏距離,要小于不同目標(biāo)之間的歐式距離;
因此我們?cè)谝曨l流的連續(xù)幀之間,根據(jù)歐氏距離最小原則,將這些幀中特征框的質(zhì)心聯(lián)系起來,可以得到一個(gè)目標(biāo) X 在這些連續(xù)幀中的變化聯(lián)系,就達(dá)到了我們目標(biāo)追蹤的目的;
步驟四:注冊(cè)新目標(biāo)
有時(shí)候會(huì)有新目標(biāo)的加入,比如幀 N 的時(shí)候有 x 個(gè)目標(biāo),而幀 N+1 的時(shí)候有 x+1 個(gè)目標(biāo),增加了一個(gè)目標(biāo);
所以對(duì)于這個(gè)新增的目標(biāo),我們按照以下順序進(jìn)行注冊(cè):
給這個(gè)新目標(biāo)一個(gè)目標(biāo) ID;
儲(chǔ)存這個(gè)目標(biāo)特征框的質(zhì)心位置;
然后從步驟二開始,對(duì)于視頻流中的每一幀進(jìn)行計(jì)算歐氏距離,更新坐標(biāo)等步驟;
步驟五:注銷舊目標(biāo)
一個(gè)目標(biāo)在后續(xù)幀中可能會(huì)消失,我們的目標(biāo)追蹤算法也要能夠處理這種情況;
但是對(duì)于消失目標(biāo)的處理方法,要根據(jù)于你實(shí)際部署應(yīng)用的場(chǎng)景;
第 N 幀丟失目標(biāo),注銷舊目標(biāo)
第 N 幀丟失目標(biāo),而且第 N 幀中的后續(xù) n 幀中都沒有找回來,那就注銷舊目標(biāo)
因?yàn)槊看沃匦伦?cè)的成本(進(jìn)行檢測(cè)/識(shí)別)的成本要大于歐氏距離比對(duì)進(jìn)行目標(biāo)追蹤的成本;
這篇介紹 OT 的理論部分,接下來會(huì)介紹如何用 Python + OpenCV 去實(shí)現(xiàn) OT;
# 請(qǐng)尊重他人勞動(dòng)成果,轉(zhuǎn)載或者使用源碼請(qǐng)注明出處:http://www.cnblogs.com/AdaminXie
# 歡迎關(guān)注我的 Github:https://github.com/coneypo/
# 如有問題請(qǐng)留言或者聯(lián)系郵箱:coneypo@foxmail.com
總結(jié)
以上是生活随笔為你收集整理的目标追踪(Object Tracking)概念的简要介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (六)ARM状态寄存器-PSR
- 下一篇: 双眼皮全切后怎么知道有没有肉条感