1. 程式人生 > >[AI開發]目標跟蹤之計數

[AI開發]目標跟蹤之計數

基於視訊結構化的應用中,目標在經過跟蹤演算法後,會得到一個唯一標識和它對應的運動軌跡,利用這兩個資料我們可以做一些後續工作:測速(交通類應用場景)、計數(交通類應用場景、安防類應用場景)以及行為檢測(交通類應用場景、安防類應用場景)。我會寫三篇文章依次介紹這三個主題。

(1)目標跟蹤之速度計算

(2)目標跟蹤之計數

(3)目標跟蹤之行為檢測

後面會陸續新增連結。

本篇文章以交通類應用場景為例,介紹車輛斷面計數方法。

 

人工計數方式

設想一個場景,你蹲在地下通道旁邊,要統計穿過這條通道最近5分鐘的人流量,你實際的做法是什麼?目光是停留在一個人身上,從TA進入通道直到離開嗎?當然不是,因為這樣的話你根本沒有那麼多雙眼睛。正常人會在通道中某個位置想象出來一條虛擬分界線,目光緊盯這條線附近區域即可,有人跨線計數就加一。他們是不會關注這條直線兩邊稍遠區域的目標,因為那裡有什麼、有多少目標都不會影響最終的計數結果。

如上圖,對於A區域和B區域範圍內的目標,觀察者是不需要考慮的,只有經過黃色虛擬計數線的目標才會納入計數範疇。在A和B區域出現的目標停留、調頭等都不影響最終的計數結果。

 

自動計數原理

自動計數原理其實跟人工計數一致,計數演算法應該同樣假設出一條虛擬的分界線,目標穿過這條虛擬的分界線時,總計數加一。前面提到過,目標經過跟蹤演算法處理後,會得到一個唯一目標標識和對應的運動軌跡座標點集合,通過這兩個資料可以很快判斷某個目標是否穿越某條直線。2D平面中判斷一個點(X,Y)在一條直線(X1, Y1)(X2, Y2)左側還是右側的演算法很簡單,下面是對應程式碼:

 1 // check if point at one side of line
 2 bool LeftOfLine(Point p, Point p1, Point p2)
 3 {
 4     if (p1.X == p2.X)
 5     {
 6         return p.X < p1.X;
 7     }
 8 
 9     if (p1.Y == p2.Y)
10     {
11         return p.Y < p1.Y;
12     }
13 
14     if (p2.X < p1.X)
15     {
16         Point tmp = p2;
17         p2 = p1;
18         p1 = tmp;
19     }
20 
21     int ret = (p2.Y - p.Y) * (p2.X - p1.X) - (p2.Y - p1.Y) * (p2.X - p.X);
22     return ret < 0;
23 }    

上面程式碼可以判斷點P是否在P1和P2組成直線的左側,如果是返回True,否則返回False。(直線左側和右側並不太恰當,在實際使用過程中,如果P1和P2已經確定,該方法返回True代表點在直線的一側,返回False代表點在直線的另一側)。目標剛出現時,我們通過以上方法判斷它在直線的某一側(方法返回結果為A),目標在移動過程中,會不斷得到新的位置點(軌跡點集合中最新的一點),我們還是通過以上方法來判斷目標在直線的某一側(方法返回結果為B),如果A!=B,說明目標跨越了直線,此時計數應該加一。已經參與計數的目標設定一個Flag,後面不再參與計數邏輯。

下面給出5種情況,說明自動計數邏輯中,目標參與計數和不參與計數的規則:

(1)理想情況下,目標從監控畫面底部P1進入時,即可被檢測演算法檢測到,並被跟蹤演算法跟蹤到,之後連續跟蹤,直到離開監控區域,從P2處消失。目標跨域虛擬計數線(圖中紅色虛線),計數生效。

(2)檢測演算法準確性不高,目標到特定位置P1才被檢測到,直到離開監控區域,從P2處消失。目標跨域虛擬計數線,計數生效。

(3)檢測演算法準確性不高,目標還未跨越虛擬計數線就不能被檢測到了。計數不生效。

(4)檢測演算法準確性不高,或者跟蹤演算法準確性不高,目標雖然被跟蹤到,但是跟蹤到的軌跡並不是連續的,並且軌跡剛好在虛擬計數線那裡斷掉了。計數不生效。

(5)檢測演算法準確性不高,目標軌跡沒有跨域虛擬計數線,這個情況跟(3)一致。

注意,以上舉例都是假設目標從監控畫面底部進入視野(去向),當目標從監控畫面頂部進入視野時(來向),情況類似。

 

影響自動計數準確性的因素

根據前面的討論,其實影響自動計數準確性的因素很好歸納:

(1)檢測演算法準確性。目標如果還未跨越虛擬計數線時,檢測演算法就檢測不到該目標了,那麼計數肯定丟失;

(2)跟蹤演算法準確性。跟蹤演算法效果不好時,目標軌跡不連續,很可能剛好在虛擬計數線那裡斷掉;

(3)虛擬計數線的位置。虛擬計數線不能太遠,很多檢測演算法對遠處的小目標檢測效果不理想;當然也不能太近,我們在計數時,為了過濾錯誤的檢測目標,要求必須保證目標軌跡點的數量要大於某個值,比如目標在跨越計數線時,要求目標軌跡點集合中的點數量大於25(必須被連續跟蹤超過1秒,假設FPS為25),如果虛擬計數線太近,目標從監控畫面下方進入時並且速度很快,那麼它不會被連續跟蹤超過1秒。

以上是目標跟蹤中關於計數的詳細說明,有問題留言私信皆