『壹』 目標跟蹤檢測演算法(一)——傳統方法
姓名:劉帆;學號:20021210609;學院:電子工程學院
https://blog.csdn.net/qq_34919792/article/details/89893214
【嵌牛導讀】目標跟蹤演算法研究難點與挑戰在於實際復雜的應用環境 、背景相似干擾、光照條件的變化、遮擋等外界因素以及目標姿態變化,外觀變形,尺度變化、平面外旋轉、平面內旋轉、出視野、快速運動和運動模糊等。而且當目標跟蹤演算法投入實際應用時,不可避免的一個問題——實時性問題也是非常的重要。正是有了這些問題,才使得演算法研究充滿著難點和挑戰。
【嵌牛鼻子】目標跟蹤演算法,傳統演算法
【嵌牛提問】利用目標跟蹤檢測演算法要達到何目的?第一階段的單目標追蹤演算法包括什麼?具體步驟有哪些?它們有何特點?
【嵌牛正文】
第一階段
目標跟蹤分為兩個部分,一個是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一個是對目標特徵進行跟蹤。
1、靜態背景
1)背景差: 對背景的光照變化、雜訊干擾以及周期性運動等進行建模。通過當前幀減去背景圖來捕獲運動物體的過程。
2)幀差: 由於場景中的目標在運動,目標的影像在不同圖像幀中的位置不同。該類演算法對時間上連續的兩幀或三幀圖像進行差分運算,不同幀對應的像素點相減,判斷灰度差的絕對值,當絕對值超過一定閾值時,即可判斷為運動目標,從而實現目標的檢測功能。
與二幀差分法不同的是,三幀差分法(交並運算)去除了重影現象,可以檢測出較為完整的物體。幀間差分法的原理簡單,計算量小,能夠快速檢測出場景中的運動目標。但幀間差分法檢測的目標不完整,內部含有「空洞」,這是因為運動目標在相鄰幀之間的位置變化緩慢,目標內部在不同幀圖像中相重疊的部分很難檢測出來。幀間差分法通常不單獨用在目標檢測中,往往與其它的檢測演算法結合使用。
3)Codebook
演算法為圖像中每一個像素點建立一個碼本,每個碼本可以包括多個碼元(對應閾值范圍),在學習階段,對當前像素點進行匹配,如果該像素值在某個碼元的學習閾值內,也就是說與之前出現過的某種歷史情況偏離不大,則認為該像素點符合背景特徵,需要更新對應點的學習閾值和檢測閾值。
如果新來的像素值與每個碼元都不匹配,則可能是由於動態背景導致,這種情況下,我們需要為其建立一個新的碼元。每個像素點通過對應多個碼元,來適應復雜的動態背景。
在應用時,每隔一段時間選擇K幀通過更新演算法建立CodeBook背景模型,並且刪除超過一段時間未使用的碼元。
4)GMM
混合高斯模型(Gaussian of Micture Models,GMM)是較常用的背景去除方法之一(其他的還有均值法、中值法、滑動平均濾波等)。
首先我們需要了解單核高斯濾波的演算法步驟:
混合高斯建模GMM(Gaussian Mixture Model)作為單核高斯背景建模的擴展,是目前使用最廣泛的一種方法,GMM將背景模型描述為多個分布,每個像素的R、G、B三個通道像素值的變化分別由一個混合高斯模型分布來刻畫,符合其中一個分布模型的像素即為背景像素。作為最常用的一種背景建模方法,GMM有很多改進版本,比如利用紋理復雜度來更新差分閾值,通過像素變化的劇烈程度來動態調整學習率等。
5)ViBe(2011)
ViBe演算法主要特點是隨機背景更新策略,這和GMM有很大不同。其步驟和GMM類似。具體的思想就是為每個像素點存儲了一個樣本集,樣本集中采樣值就是該像素點過去的像素值和其鄰居點的像素值,然後將每一個新的像素值和樣本集進行比較來判斷是否屬於背景點。
其中pt(x)為新幀的像素值,R為設定值,p1、p2、p3….為樣本集中的像素值,以pt(x)為圓心R為半徑的圓被認為成一個集,當樣本集與此集的交集大於設定的閾值#min時,可認為此為背景像素點(交集越大,表示新像素點與樣本集越相關)。我們可以通過改變#min的值與R的值來改變模型的靈敏度。
Step1:初始化單幀圖像中每個像素點的背景模型。假設每一個像素和其鄰域像素的像素值在空域上有相似的分布。基於這種假設,每一個像素模型都可以用其鄰域中的像素來表示。為了保證背景模型符合統計學規律,鄰域的范圍要足夠大。當輸入第一幀圖像時,即t=0時,像素的背景模型。其中,NG(x,y)表示空域上相鄰的像素值,f(xi,yi)表示當前點的像素值。在N次的初始化的過程中,NG(x,y)中的像素點(xi,yi)被選中的可能次數為L=1,2,3,…,N。
Step2:對後續的圖像序列進行前景目標分割操作。當t=k時,像素點(x,y)的背景模型為BKm(x,y),像素值為fk(x,y)。按照下面判斷該像素值是否為前景。這里上標r是隨機選的;T是預先設置好的閾值。當fk(x,y)滿足符合背景#N次時,我們認為像素點fk(x,y)為背景,否則為前景。
Step3:ViBe演算法的更新在時間和空間上都具有隨機性。每一個背景點有1/ φ的概率去更新自己的模型樣本值,同時也有1/ φ的概率去更新它的鄰居點的模型樣本值。更新鄰居的樣本值利用了像素值的空間傳播特性,背景模型逐漸向外擴散,這也有利於Ghost區域的更快的識別。同時當前景點計數達到臨界值時將其變為背景,並有1/ φ的概率去更新自己的模型樣本值(為了減少緩慢移動物體的影響和攝像機的抖動)。
可以有如下總結,ViBe中的每一個像素點在更新的時候都有一個時間和空間上隨機影響的范圍,這個范圍很小,大概3x3的樣子,這個是考慮到攝像頭抖動時會有坐標的輕微來回變化,這樣雖然由於ViBe的判別方式仍認為是背景點,但是也會對後面的判別產生影響,為了保證空間的連續性,隨機更新減少了這個影響。而在樣本值保留在樣本集中的概率隨著時間的增大而變小,這就保證了像素模型在時間上面的延續特性。
6)光流
光流是由物體或相機的運動引起的圖像對象在兩個連續幀之間的視在運動模式。它是2D矢量場,其中每個矢量是一個位移矢量,顯示點從第一幀到第二幀的移動。
光流實際上是一種特徵點跟蹤方法,其計算的為向量,基於三點假設:
1、場景中目標的像素在幀間運動時亮度(像素值或其衍生值)不發生變化;2、幀間位移不能太大;3、同一表面上的鄰近點都在做相同的運動;
光流跟蹤過程:1)對一個連續視頻幀序列進行處理;2)對每一幀進行前景目標檢測;3)對某一幀出現的前景目標,找出具有代表性的特徵點(Harris角點);4)對於前後幀做像素值比較,尋找上一幀在當前幀中的最佳位置,從而得到前景目標在當前幀中的位置信息;5)重復上述步驟,即可實現目標跟蹤
2、運動場(分為相機固定,但是視角變化和相機是運動的)
1)運動建模(如視覺里程計運動模型、速度運動模型等)
運動學是對進行剛性位移的相機進行構型,一般通過6個變數來描述,3個直角坐標,3個歐拉角(橫滾、俯仰、偏航)。
Ⅰ、對相機的運動建模
由於這個不是我們本次所要討論的重點,但是在《概率機器人》一書中提出了很多很好的方法,相機的運動需要對圖像內的像素做位移矩陣和旋轉矩陣的坐標換算。除了對相機建立傳統的速度運動模型外,也可以用視覺里程計等通關過置信度的更新來得到概率最大位置。
Ⅱ、對於跟蹤目標的運動建模
該方法需要提前通過先驗知識知道所跟蹤的目標對象是什麼,比如車輛、行人、人臉等。通過對要跟蹤的目標進行建模,然後再利用該模型來進行實際的跟蹤。該方法必須提前知道要跟蹤的目標對象是什麼,然後再去跟蹤指定的目標,這是它的局限性,因而其推廣性相對比較差。(比如已知跟蹤的物體是羽毛球,那很容易通過前幾幀的取點,來建立整個羽毛球運動的拋物線模型)
2)核心搜索演算法(常見的預測演算法有Kalman(卡爾曼)濾波、擴展卡爾曼濾波、粒子濾波)
Ⅰ、Kalman 濾波
Kalman濾波器是通過前一狀態預測當前狀態,並使用當前觀測狀態進行校正,從而保證輸出狀態平穩變化,可有效抵抗觀測誤差。因此在運動目標跟蹤中也被廣泛使用。
在視頻處理的運動目標跟蹤里,每個目標的狀態可表示為(x,y,w,h),x和y表示目標位置,w和h表示目標寬高。一般地認為目標的寬高是不變的,而其運動速度是勻速,那麼目標的狀態向量就應該擴展為(x,y,w,h,dx,dy),其中dx和dy是目標當前時刻的速度。通過kalman濾波器來估計每個時刻目標狀態的大致過程為:
對視頻進行運動目標檢測,通過簡單匹配方法來給出目標的第一個和第二個狀態,從第三個狀態開始,就先使用kalman濾波器預測出當前狀態,再用當前幀圖像的檢測結果作為觀測值輸入給kalman濾波器,得到的校正結果就被認為是目標在當前幀的真實狀態。(其中,Zt為測量值,為預測值,ut為控制量,Kt為增益。)
Ⅱ、擴展卡爾曼濾波(EKF)和無跡卡爾曼濾波(UKF)
由於卡爾曼濾波的假設為線性問題,無法直接用在非線性問題上,EKF和UKF解決了這個問題(這個線性問題體現在用測量量來計算預測量的過程中)。EKF是通過構建線性函數g(x),與非線性函數相切,並對每一時刻所求得的g(x)做KF,如下圖所示。
UKF與EKF去求解雅可比矩陣擬合線性方程的方法不同,通過對那個先驗分布中的採集點,來線性化隨機變數的非線性函數。與EKF所用的方法不同,UKF產生的高斯分布和實際高斯分布更加接近,其引起的近似誤差也更小。
Ⅲ、粒子濾波
1、初始狀態:基於粒子濾波的目標追蹤方法是一種生成式跟蹤方法,所以要有一個初始化的階段。對於第一幀圖像,人工標定出待檢測的目標,對該目標區域提出特徵;
2、搜索階段:現在已經知道了目標的特徵,然後就在目標的周圍撒點(particle), 如:a)均勻的撒點;b)按高斯分布撒點,就是近的地方撒得多,遠的地方撒的少。論文里使用的是後一種方法。每一個粒子都計算所在區域內的顏色直方圖,如初始化提取特徵一樣,然後對所有的相似度進行歸一化。文中相似性使用的是巴氏距離;
3、重采樣:根據粒子權重對粒子進行篩選,篩選過程中,既要大量保留權重大的粒子,又要有一小部分權重小的粒子;
4、狀態轉移:將重采樣後的粒子帶入狀態轉移方程得到新的預測粒子;
5、測量及更新:對目標點特徵化,並計算各個粒子和目標間的巴氏距離,更新粒子的權重;
6、決策階段:每個粒子都獲得一個和目標的相似度,相似度越高,目標在該范圍出現的可能性越高,將保留的所有粒子通過相似度加權後的結果作為目標可能的位置。
3)Meanshift演算法
MeanShift演算法屬於核密度估計法,它不需要任何先驗知識而完全依靠特徵空間中樣本點的計算其密度函數值。對於一組采樣數據,直方圖法通常把數據的值域分成若干相等的區間,數據按區間分成若干組,每組數據的個數與總參數個數的比率就是每個單元的概率值;核密度估計法的原理相似於直方圖法,只是多了一個用於平滑數據的核函數。採用核函數估計法,在采樣充分的情況下,能夠漸進地收斂於任意的密度函數,即可以對服從任何分布的數據進行密度估計。
Meanshift演算法步驟
1、通過對初始點(或者上一幀的目標點)為圓心,繪制一個半徑為R的圓心,尋找特徵和該點相似的點所構成的向量;
2、所有向量相加,可以獲得一個向量疊加,這個向量指向特徵點多的方向;
3、取步驟二的向量終點為初始點重復步驟一、二,直到得到的向量小於一定的閾值,也就是說明當前位置是特徵點密度最密集的地方,停止迭代,認為該點為當前幀的目標點;
4)Camshift演算法
Camshift演算法是MeanShift演算法的改進,稱為連續自適應的MeanShift演算法。Camshift 是由Meanshift 推導而來 Meanshift主要是用在單張影像上,但是獨立一張影像分析對追蹤而言並無意義,Camshift 就是利用MeanShift的方法,對影像串列進行分析。
1、首先在影像串列中選擇目標區域。
2、計算此區域的顏色直方圖(特徵提取)。
3、用MeanShift演演算法來收斂欲追蹤的區域。
4、通過目標點的位置和向量信息計算新的窗口大小,並標示之。
5、以此為參數重復步驟三、四。
Camshift 關鍵就在於當目標的大小發生改變的時候,此演算法可以自適應調整目標區域繼續跟蹤。
3、小結
第一階段的單目標追蹤演算法基本上都是傳統方法,計算量小,在嵌入式等設備中落地較多,opencv中也預留了大量的介面。通過上面的兩節的介紹,我們不難發現,目標檢測演算法的步驟分為兩部分,一部分是對指定目標尋找可以跟蹤的特徵,常用的有顏色,輪廓,特徵點,軌跡等,另一部分是對目標特徵進行跟蹤,如上文所提及的方法。所以目標檢測方法的發展,也可總結為兩個方面,一個是如何去獲得更加具有區分性的可跟蹤的穩定特徵,另一個是如何建立幀與幀之間的數據關聯,保證跟蹤目標是正確的。
隨著以概率為基礎的卡爾曼濾波、粒子濾波或是以Meanshift為代表向量疊加方法在目標檢測的運用,使得目標檢測不再需要假設自身的一個狀態為靜止的,而是可以是運動的,更加符合復雜場景中的目標跟蹤。
『貳』 計算機視覺——典型的目標檢測演算法(OverFeat演算法)(二)
【嵌牛導讀】目標檢測在現實中的應用很廣泛,我們需要檢測數字圖像中的物體位置以及類別,它需要我們構建一個模型,模型的輸入一張圖片,模型的輸出需要圈出圖片中所有物體的位置以及物體所屬的類別。在深度學習浪潮到來之前,目標檢測精度的進步十分緩慢,靠傳統依靠手工特徵的方法來提高精度已是相當困難的事。而ImageNet分類大賽出現的卷積神經網路(CNN)——AlexNet所展現的強大性能,吸引著學者們將CNN遷移到了其他的任務,這也包括著目標檢測任務,近年來,出現了很多目標檢測演算法。
【嵌牛鼻子】計算機視覺
【嵌牛提問】如何理解目標檢測演算法——OverFeat
【嵌牛正文】
一、深度學習的典型目標檢測演算法
深度學習目標檢測演算法主要分為 雙階段檢測演算法 和 單階段檢測演算法 ,如圖1所示。
雙階段目標檢測演算法先對圖像提取候選框,然後基於候選區域做二次修正得到檢測結果,檢測精度較高,但檢測速度較慢;單階段目標驗測演算法直接對圖像進行計算生成檢測結果,檢測速度快,但檢測精度低。
1、雙階段目標檢測演算法
雙階段目標檢測方法主要通過選擇性搜索(Selective Search)或者Edge Boxes等演算法對輸入圖像選取可能包含檢測目標的候選區域(Region Proposal),再對候選區域進行分類和位置回歸以得到檢測結果。
1.1 OverFeat 演算法
《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》
Sermanet 等改進AlexNet 提出 OverFeat 演算法。該演算法結合AlexNet通過多尺度滑動窗口實現特徵提取功能,並且共享特徵提取層,應用於圖像分類、定位和目標檢測等任務。
關鍵技術:
1、FCN( 全卷積神經網路 )
對於一個各層參數結構都設計好的網路模型,要求輸入圖片的尺寸是固定的(例如,Alexnet要求輸入圖片的尺寸為227px*227px)。如果輸入一張500*500的圖片,希望模型仍然可以一直前向傳導,即一個已經設計完畢的網路,可以輸入任意大小的圖片,這就是FCN。
FCN的思想在於:
1、從卷積層到全連接層,看成是對一整張圖片的卷積層運算。
2、從全連接層到全連接層,看成是採用1*1大小的卷積核,進行卷積層運算。
如上圖所示,綠色部分代表卷積核大小。假設一個CNN模型,其輸入圖片大小是14*14,通過第一層卷積後得到10*10大小的圖片,然後接著通過池化得到了5*5大小的圖片。像但是對於像素值為5*5的圖片到像素值為1*1的圖片的過程中:
(1)傳統的CNN:如果從以前的角度進行理解的話,那麼這個過程就是全連接層,我們會把這個5*5大小的圖片,展平成為一維向量進行計算。
(2)FCN:FCN並不是把5*5的圖片展平成一維向量再進行計算,而是直接採用5*5的卷積核,對一整張圖片進行卷積運算。
二者本質上是相同的,只是角度不同,FCN把這個過程當成了對一整張特徵圖進行卷積,同樣,後面的全連接層也是把它當做是以1*1大小的卷積核進行卷積運算。
當輸入一張任意大小的圖片,就需要利用以上所述的網路,例如輸入一張像素為16*16的圖片:
根據上圖,該網路最後的輸出是一張2*2的圖片。可見採用FCN網路可以輸入任意大小的圖片。同時需要注意的是網路最後輸出的圖片大小不在是一個1*1大小的圖片,而是一個與輸入圖片大小息息相關的一張圖片。
Overfeat就是把採用FCN的思想把全連接層看成了卷積層,在網路測試階段可以輸入任意大小的圖片。
2、offset max-pooling
簡單起見,不用二維的圖像作為例子,而是採用一維作為示例:
如上圖所示,在X軸上有20個神經元,並且選擇池化size=3的非重疊池化,那麼根據之前所學的方法應該是:對上面的20個神經元,從1位置開始進行分組,每3個連續的神經元為一組,然後計算每組的最大值(最大池化),19、20號神經元將被丟棄,如下圖所示:
或者可以在20號神經元後面,添加一個數值為0的神經元編號21,與19、20成為一組,這樣可以分成7組:[1,2,3],[4,5,6]……,
[16,17,18],[19,20,21],最後計算每組的最大值。
如果只分6組,除了以1作為初始位置進行連續組合之外,也可以從位置2或者3開始進行組合。也就是說其實有3種池化組合方法:
A、△=0分組:[1,2,3],[4,5,6]……,[16,17,18];
B、△=1分組:[2,3,4],[5,6,7]……,[17,18,19];
C、△=2分組:[3,4,5],[6,7,8]……,[18,19,20];
對應圖片如下:
以往的CNN中,一般只用△=0的情況,得到池化結果後,就送入了下一層。但是該文獻的方法是,把上面的△=0、△=1、△=2的三種組合方式的池化結果,分別送入網路的下一層。這樣的話,網路在最後輸出的時候,就會出現3種預測結果了。
前面所述是一維的情況,如果是2維圖片的話,那麼(△x,△y)就會有9種取值情況(3*3);如果我們在做圖片分類的時候,在網路的某一個池化層加入了這種offset 池化方法,然後把這9種池化結果,分別送入後面的網路層,最後的圖片分類輸出結果就可以得到9個預測結果(每個類別都可以得到9種概率值,然後我們對每個類別的9種概率,取其最大值,做為此類別的預測概率值)。
演算法原理:
文獻中的演算法,就是把這兩種思想結合起來,形成了文獻最後測試階段的演算法。
1、論文的網路架構與訓練階段
(1)網路架構
對於網路的結構,文獻給出了兩個版本——快速版、精確版,一個精度比較高但速度慢;另外一個精度雖然低但是速度快。下面是高精度版本的網路結構表相關參數:
表格參數說明:
網路輸入:圖片大小為221px*221px;
網路結構方面基本上和AlexNet相同,使用了ReLU激活,最大池化。不同之處在於:(a)作者沒有使用局部響應歸一化層;(b)然後也沒有採用重疊池化的方法;(c)在第一層卷積層,stride作者是選擇了2,這個與AlexNet不同(AlexNet選擇的跨步是4,在網路中,如果stride選擇比較大得話,雖然可以減少網路層數,提高速度,但是卻會降低精度)。
需要注意的是把f7這一層,看成是卷積核大小為5*5的卷積層,總之就是需要把網路看成前面所述的FCN模型,去除了全連接層的概念,因為在測試階段可不是僅僅輸入221*221這樣大小的圖片,在測試階段要輸入各種大小的圖片,具體請看後面測試階段的講解。
(2)網路訓練
訓練輸入:對於每張原圖片為256*256,然後進行隨機裁剪為221*221的大小作為CNN輸入,進行訓練。
優化求解參數設置:訓練的min-batchs選擇128,權重初始化選擇高斯分布的隨機初始化:
然後採用隨機梯度下降法,進行優化更新,動量項參數大小選擇0.6,L2權重衰減系數大小選擇10-5次方。學習率初始化值為0.05,根據迭代次數的增加,每隔幾十次的迭代後,就把學習率的大小減小一半。
然後就是DropOut,這個只有在最後的兩個全連接層,才採用dropout,dropout比率選擇0.5。
2、網路測試階段
在Alexnet的文獻中,預測方法是輸入一張圖片256*256,然後進行multi-view裁剪,也就是從圖片的四個角進行裁剪,還有就是一圖片的中心進行裁剪,這樣可以裁剪到5張224*224的圖片。然後把原圖片水平翻轉一下,再用同樣的方式進行裁剪,又可以裁剪到5張圖片。把這10張圖片作為輸入,分別進行預測分類,在後在softmax的最後一層,求取個各類的總概率,求取平均值。
然而Alexnet這種預測方法存在兩個問題:
一方面這樣的裁剪方式,把圖片的很多區域都給忽略了,這樣的裁剪方式,剛好把圖片物體的一部分給裁剪掉了;
另一方面,裁剪窗口重疊存在很多冗餘的計算,像上面要分別把10張圖片送入網路,可見測試階段的計算量還是較大的。
Overfeat演算法:
訓練完上面所說的網路之後,在測試階段不再是用一張221*221大小的圖片了作為網路的輸入,而是用了6張大小都不相同的圖片,也就是所謂的多尺度輸入預測,如下表格所示:
當網路前向傳導到layer 5的時候,就利用了前面所述的FCN、offset pooling這兩種思想的相結合。現以輸入一張圖片為例(6張圖片的計算方法都相同),講解layer 5後面的整體過程,具體流程示意圖如下:
步驟一:
對於某個尺度的圖片,經過前五層的卷積後得到特徵圖。上圖中特徵圖的解析度是20x23,256個通道。
步驟二:
對於該特徵圖,重復多次使用非重疊的池化,每次池化的偏置不同,有行偏置和列偏置。上圖中偏置池化3次,偏置分別為為(0,1,2)。這就是offset pooling,也被稱為fine stride。offset pooling得到的特徵圖的維度為6x7x3x3xD,其中6x7是特徵圖的解析度,3x3是偏置池化的次數,D是通道數。上圖中是以1維顯示的。
步驟三:
池化後得到的特徵圖將被送入分類器。
步驟四:
分類器的輸入是的5x5xD,輸出是C(類別數)維向量。但是offset pooling後得到的特徵圖並不是5x5xD,比如上圖中的特徵圖大小為6x7xD,因此分類器以滑動窗口的方式應用在特徵圖上,每個滑動窗口經過分類器輸出一個C維向量。比如上圖中輸入的6x7xD的特徵圖最終得到2x3xC的輸出,其中2x3是滑動窗口的個數。
步驟五:
而2x3xC只是一組偏置池化的輸出,總的輸出為2x3x3x3xC,將輸出的張量reshape,得到6x9xC輸出張量。最終輸出分類張量為3d張量,即兩個解析度維度 x C維。
然後需要在後面把它們拉成一維向量,這樣在一個尺度上,可以得到一個C*N個預測值矩陣,每一列就表示圖片屬於某一類別的概率值,並且求取每一列的最大值,作為本尺度的每個類別的概率值。
最後一共用了6種不同尺度(文獻使用了12張,另外6張是水平翻轉的圖片)進行做預測,然後把這六種尺度結果再做一個平均,作為最最後的結果。
從上面過程可以看到整個網路分成兩部分:layer 1~5這五層稱之為特徵提取層;layer 6~output稱之為分類層。
六、定位任務
用於定位任務的時候,就把分類層(上面的layer 6~output)給重新設計一下,把分類改成回歸問題,然後在各種不同尺度上訓練預測物體的bounding box。
『叄』 目標檢測
什麼是目標檢測?
我們先來看一張圖片
我相信大家看完這張圖片已經知道什麼是目標檢測了
目標檢查有什麼用呢?
目標檢測可以用於標注物體,就像上圖一樣dog是dog,car是car有了它就能很好的將物體從一張圖片中將他們分類出來。
在實際生活中它我還知道它現在用於闖紅燈的車輛檢測,它會把闖紅燈的車牌給記錄下來,還會用於。並且運用在了無人駕駛的技術上。
此外應該還有很實際的多用處。
如何實現目標檢測?
1、區域選擇
傳統的方法是窮舉法,仔細想想我們給計算機一張圖片它不知道目標在哪兒,也不知道目標有多大,於是就事先給定一個范圍然後在這張圖片上按照這個給定的尺寸一行一行一列一列的去找,如果沒有找到又要從新更改給定的尺寸一直這樣循環。這個就是窮舉法,窮舉法耗時耗力,影響程序運行效率。
那麼有沒有解決的辦法呢?答案是肯定有的。
2、特徵提取
特徵提取就是把圖片中物體的特徵提取出來,比如人類的特徵就有很多會穿衣服啊、直立行走啊、有的人近視眼還會戴眼鏡啊,使用神經網路可以有效的提取出比較優秀的特徵出來,。
3、分類器
分類器就是根據提取出來的特徵進行分類,比如區分綠葉和花朵,它們的特徵就有一項非常不一樣,那就是它們的顏色一個是綠色一個常常是鮮艷的顏色,假設只是分類綠葉和花朵的話,那麼只需要區分他們的顏色就好了。
『肆』 目標檢測演算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)
深度學習目前已經應用到了各個領域,應用場景大體分為三類:物體識別,目標檢測,自然語言處理。 目標檢測可以理解為是物體識別和物體定位的綜合 ,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。
2014年R-CNN演算法被提出,基本奠定了two-stage方式在目標檢測領域的應用。它的演算法結構如下圖
演算法步驟如下:
R-CNN較傳統的目標檢測演算法獲得了50%的性能提升,在使用VGG-16模型作為物體識別模型情況下,在voc2007數據集上可以取得66%的准確率,已經算還不錯的一個成績了。其最大的問題是速度很慢,內存佔用量很大,主要原因有兩個
針對R-CNN的部分問題,2015年微軟提出了Fast R-CNN演算法,它主要優化了兩個問題。
R-CNN和fast R-CNN均存在一個問題,那就是 由選擇性搜索來生成候選框,這個演算法很慢 。而且R-CNN中生成的2000個左右的候選框全部需要經過一次卷積神經網路,也就是需要經過2000次左右的CNN網路,這個是十分耗時的(fast R-CNN已經做了改進,只需要對整圖經過一次CNN網路)。這也是導致這兩個演算法檢測速度較慢的最主要原因。
faster R-CNN 針對這個問題, 提出了RPN網路來進行候選框的獲取,從而擺脫了選擇性搜索演算法,也只需要一次卷積層操作,從而大大提高了識別速度 。這個演算法十分復雜,我們會詳細分析。它的基本結構如下圖
主要分為四個步驟:
使用VGG-16卷積模型的網路結構:
卷積層採用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然後經過13個conv-relu層,其中會穿插4個max-pooling層。所有的卷積的kernel都是3x3的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。
MxN的圖片,經過卷積層後,變為了(M/16) x (N/16)的feature map了。
faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經過3x3的卷積運算,然後分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然後softmax來判斷是前景還是背景,然後reshape恢復為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實現,後面再詳細講。兩路計算結束後,挑選出前景候選框(因為物體在前景中),並利用計算得到的候選框位置,得到我們感興趣的特徵子圖proposal。
卷積層提取原始圖像信息,得到了256個feature map,經過RPN層的3x3卷積後,仍然為256個feature map。但是每個點融合了周圍3x3的空間信息。對每個feature map上的一個點,生成k個anchor(k默認為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機還是汽車,只用區分它是前景還是背景即可)。anchor有[x,y,w,h]四個坐標偏移量,x,y表示中心點坐標,w和h表示寬度和高度。這樣,對於feature map上的每個點,就得到了k個大小形狀各不相同的選區region。
對於生成的anchors,我們首先要判斷它是前景還是背景。由於感興趣的物體位於前景中,故經過這一步之後,我們就可以舍棄背景anchors了。大部分的anchors都是屬於背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計算量。
對於經過了3x3的卷積後得到的256個feature map,先經過1x1的卷積,變換為18個feature map。然後reshape為一維向量,經過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數據可以進行softmax計算。然後輸出識別得到的前景anchors。
另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標值。如下圖所示,紅色代表我們當前的選區,綠色代表真實的選區。雖然我們當前的選取能夠大概框選出飛機,但離綠色的真實位置和形狀還是有很大差別,故需要對生成的anchors進行調整。這個過程我們稱為bounding box regression。
假設紅色框的坐標為[x,y,w,h], 綠色框,也就是目標框的坐標為[Gx, Gy,Gw,Gh], 我們要建立一個變換,使得[x,y,w,h]能夠變為[Gx, Gy,Gw,Gh]。最簡單的思路是,先做平移,使得中心點接近,然後進行縮放,使得w和h接近。如下:
我們要學習的就是dx dy dw dh這四個變換。由於是線性變換,我們可以用線性回歸來建模。設定loss和優化方法後,就可以利用深度學習進行訓練,並得到模型了。對於空間位置loss,我們一般採用均方差演算法,而不是交叉熵(交叉熵使用在分類預測中)。優化方法可以採用自適應梯度下降演算法Adam。
得到了前景anchors,並確定了他們的位置和形狀後,我們就可以輸出前景的特徵子圖proposal了。步驟如下:
1,得到前景anchors和他們的[x y w h]坐標。
2,按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個anchors,比如前6000個
3,剔除非常小的anchors。
4,通過NMS非極大值抑制,從anchors中找出置信度較高的。這個主要是為了解決選取交疊問題。首先計算每一個選區面積,然後根據他們在softmax中的score(也就是是否為前景的概率)進行排序,將score最大的選區放入隊列中。接下來,計算其餘選區與當前最大score選區的IOU(IOU為兩box交集面積除以兩box並集面積,它衡量了兩個box之間重疊程度)。去除IOU大於設定閾值的選區。這樣就解決了選區重疊問題。
5,選取前post_nms_topN個結果作為最終選區proposal進行輸出,比如300個。
經過這一步之後,物體定位應該就基本結束了,剩下的就是物體識別了。
和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導致沒法做全連接。全連接計算只能對確定的shape進行運算,故必須使proposal大小形狀變為相同。通過裁剪和縮放的手段,可以解決這個問題,但會帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個問題。
ROI pooling中,如果目標輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特徵圖。
ROI Pooling層後的特徵圖,通過全連接層與softmax,就可以計算屬於哪個具體類別,比如人,狗,飛機,並可以得到cls_prob概率向量。同時再次利用bounding box regression精細調整proposal位置,得到bbox_pred,用於回歸更加精確的目標檢測框。
這樣就完成了faster R-CNN的整個過程了。演算法還是相當復雜的,對於每個細節需要反復理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數據集上可以達到83.8%的准確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達不到實時性要求。
針對於two-stage目標檢測演算法普遍存在的運算速度慢的缺點, yolo創造性的提出了one-stage。也就是將物體分類和物體定位在一個步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實現one-stage。通過這種方式, yolo可實現45幀每秒的運算速度,完全能滿足實時性要求 (達到24幀每秒,人眼就認為是連續的)。它的網路結構如下圖:
主要分為三個部分:卷積層,目標檢測層,NMS篩選層。
採用Google inceptionV1網路,對應到上圖中的第一個階段,共20層。這一層主要是進行特徵提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception mole結構,而是用一個1x1的卷積,並聯一個3x3的卷積來替代。(可以認為只使用了inception mole中的一個分支,應該是為了簡化網路結構)
先經過4個卷積層和2個全連接層,最後生成7x7x30的輸出。先經過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個網格,每個網格要預測兩個bounding box的坐標(x,y,w,h)和box內包含物體的置信度confidence,以及物體屬於20類別中每一類的概率(yolo的訓練數據為voc2012,它是一個20分類的數據集)。所以一個網格對應的參數為(4x2+2+20) = 30。如下圖
其中前一項表示有無人工標記的物體落入了網格內,如果有則為1,否則為0。第二項代表bounding box和真實標記的box之間的重合度。它等於兩個box面積交集,除以面積並集。值越大則box越接近真實位置。
分類信息: yolo的目標訓練集為voc2012,它是一個20分類的目標檢測數據集 。常用目標檢測數據集如下表:
| Name | # Images (trainval) | # Classes | Last updated |
| --------------- | ------------------- | --------- | ------------ |
| ImageNet | 450k | 200 | 2015 |
| COCO | 120K | 90 | 2014 |
| Pascal VOC | 12k | 20 | 2012 |
| Oxford-IIIT Pet | 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每個網格還需要預測它屬於20分類中每一個類別的概率。分類信息是針對每個網格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內是否有物體,而不需要預測物體是20分類中的哪一個,故只需要2個參數。雖然分類信息和confidence都是概率,但表達含義完全不同。
篩選層是為了在多個結果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低於閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體演算法可以回顧上面faster R-CNN小節)。這樣就得到了最終的最合適的幾個box和他們的類別。
yolo的損失函數包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:
誤差均採用了均方差演算法,其實我認為,位置誤差應該採用均方差演算法,而分類誤差應該採用交叉熵。由於物體位置只有4個參數,而類別有20個參數,他們的累加和不同。如果賦予相同的權重,顯然不合理。故yolo中位置誤差權重為5,類別誤差權重為1。由於我們不是特別關心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權重為0.5,包含物體的權重則為1。
Faster R-CNN准確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但准確率和漏檢率不盡人意。SSD綜合了他們的優缺點,對輸入300x300的圖像,在voc2007數據集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。
SSD網路結構如下圖:
和yolo一樣,也分為三部分:卷積層,目標檢測層和NMS篩選層
SSD論文採用了VGG16的基礎網路,其實這也是幾乎所有目標檢測神經網路的慣用方法。先用一個CNN網路來提取特徵,然後再進行後續的目標定位和目標分類識別。
這一層由5個卷積層和一個平均池化層組成。去掉了最後的全連接層。SSD認為目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下。
每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到 多尺度檢測 的目的,可以克服yolo對於寬高比不常見的物體,識別准確率較低的問題。而yolo中,只在最後一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對於yolo能提高准確率的一個關鍵所在。
如上所示,在每個卷積層上都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。
和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區域的中心點。以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置參數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:
另外,在訓練階段,SSD將正負樣本比例定位1:3。訓練集給定了輸入圖像以及每個物體的真實區域(ground true box),將default box和真實box最接近的選為正樣本。然後在剩下的default box中選擇任意一個與真實box IOU大於0.5的,作為正樣本。而其他的則作為負樣本。由於絕大部分的box為負樣本,會導致正負失衡,故根據每個box類別概率排序,使正負比例保持在1:3。SSD認為這個策略提高了4%的准確率
另外,SSD採用了數據增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,並對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的准確率。
和yolo的篩選層基本一致,同樣先過濾掉類別概率低於閾值的default box,再採用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。
SSD基本已經可以滿足我們手機端上實時物體檢測需求了,TensorFlow在Android上的目標檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD演算法實現的。它的基礎卷積網路採用的是mobileNet,適合在終端上部署和運行。
針對yolo准確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結合SSD的特點,提出了yoloV2。它主要還是採用了yolo的網路結構,在其基礎上做了一些優化和改進,如下
網路採用DarkNet-19:19層,裡麵包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結構如下
yolo和yoloV2隻能識別20類物體,為了優化這個問題,提出了yolo9000,可以識別9000類物體。它在yoloV2基礎上,進行了imageNet和coco的聯合訓練。這種方式充分利用imageNet可以識別1000類物體和coco可以進行目標位置檢測的優點。當使用imageNet訓練時,只更新物體分類相關的參數。而使用coco時,則更新全部所有參數。
YOLOv3可以說出來直接吊打一切圖像檢測演算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)准確率更高或相仿,速度是其1/3.。
YOLOv3的改動主要有如下幾點:
不過如果要求更精準的預測邊框,採用COCO AP做評估標準的話,YOLO3在精確率上的表現就弱了一些。如下圖所示。
當前目標檢測模型演算法也是層出不窮。在two-stage領域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 演算法,將對抗學習引入到目標檢測領域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。
one-stage領域也是百花齊放,2017年首爾大學提出 R-SSD 演算法,主要解決小尺寸物體檢測效果差的問題。清華大學提出了 RON 演算法,結合 two stage 名的方法和 one stage 方法的優勢,更加關注多尺度對象定位和負空間樣本挖掘問題。
目標檢測領域的深度學習演算法,需要進行目標定位和物體識別,演算法相對來說還是很復雜的。當前各種新演算法也是層不出窮,但模型之間有很強的延續性,大部分模型演算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經典模型的特點,這些tricks是為了解決什麼問題,以及為什麼解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標檢測領域主要的難點如下:
一文讀懂目標檢測AI演算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2
從YOLOv1到v3的進化之路
SSD-Tensorflow超詳細解析【一】:載入模型對圖片進行測試 https://blog.csdn.net/k87974/article/details/80606407
YOLO https://pjreddie.com/darknet/yolo/ https://github.com/pjreddie/darknet
C#項目參考:https://github.com/AlturosDestinations/Alturos.Yolo
項目實踐貼個圖。
『伍』 目標檢測演算法是什麼
目標檢測演算法是先通過訓練集學習一個分類器,然後在測試圖像中以不同scale的窗口滑動掃描整個圖像;每次掃描做一下分類,判斷一下當前的這個窗口是否為要檢測的目標。檢測演算法的核心是分類,分類的核心一個是用什麼特徵,一個是用哪種分類器。
(5)目標檢測傳統方法python擴展閱讀:
目標檢測演算法可以分為:
1、背景建模法,包含時間平均模型、混合高斯模型、動態紋理背景、PCA模型、時一空聯合分布背景模型
2、點檢測法,包含Moravec檢測器、Harris檢測器 、仿射不變點檢測、S IFT
3、圖像分割法,包含Mean Shift方法 、Graph-cut方法、Active Contours方法
4、聚類分析法,包含支持向量機、神經網路、Adaptive Boosting
5、運動矢量場法,包含基於運動矢量場的方法
『陸』 小目標檢測相關技巧總結
小目標問題在物體檢測和語義分割等視覺任務中一直是存在的一個難點,小目標的檢測精度通常只有大目標的一半。
CVPR2019論文: Augmentation for small object detection 提到了一些應對小目標檢測的方法,筆者結合這篇論文以及查閱其它資料,對小目標檢測相關技巧在本文進行了部分總結。
小目標的定義: 在MS COCO數據集中,面積小於 32*32 的物體被認為是小物體。
小目標難以檢測的原因: 解析度低,圖像模糊,攜帶的信息少。由此所導致特徵表達能力弱,也就是在提取特徵的過程中,能提取到的特徵非常少,這不利於我們對小目標的檢測。
1、由於小目標面積太小,可以放大圖片後再做檢測,也就是在尺度上做文章,如FPN(Feature Pyramid Networks for Object Detection),SNIP(An Analysis of Scale Invariance in Object Detection – SNIP)。
Feature-Fused SSD: Fast Detection for Small Objects, Detecting Small Objects Using a Channel-Aware Deconvolutional Network 也是在多尺度上做文章的論文。
2、在Anchor上做文章(Faster Rcnn,SSD, FPN都有各自的anchor設計),anchor在設置方面需要考慮三個因素:
anchor的密度: 由檢測所用feature map的stride決定,這個值與前景閾值密切相關。
anchor的范圍: RetinaNet中是anchor范圍是32~512,這里應根據任務檢測目標的范圍確定,按需調整anchor范圍,或目標變化范圍太大如MS COCO,這時候應採用多尺度測試。
anchor的形狀數量: RetinaNet每個位置預測三尺度三比例共9個形狀的anchor,這樣可以增加anchor的密度,但stride決定這些形狀都是同樣的滑窗步進,需考慮步進會不會太大,如RetinaNet框架前景閾值是0.5時,一般anchor大小是stride的4倍左右。
該部分anchor內容參考於: https://zhuanlan.hu.com/p/55824651
3、在ROI Pooling上做文章,文章SINet: A Scale-Insensitive Convolutional Neural Network for Fast Vehicle Detection 認為小目標在pooling之後會導致物體結構失真,於是提出了新的Context-Aware RoI Pooling方法。
4、用生成對抗網路(GAN)來做小目標檢測:Perceptual Generative Adversarial Networks for Small Object Detection。
1、從COCO上的統計圖可以發現,小目標的個數多,佔到了41.43%,但是含有小目標的圖片只有51.82%,大目標所佔比例為24.24%,但是含有大目標的圖像卻有82.28%。這說明有一半的圖像是不含小目標的,大部分的小目標都集中在一些少量的圖片中。這就導致在訓練的過程中,模型有一半的時間是學習不到小目標的特性的。
此外,對於小目標,平均能夠匹配的anchor數量為1個,平均最大的IoU為0.29,這說明很多情況下,有些小目標是沒有對應的anchor或者對應的anchor非常少的,即使有對應的anchor,他們的IoU也比較小,平均最大的IoU也才0.29。
如上圖,左上角是一個anchor示意圖,右上角是一個小目標所對應的anchor,一共有隻有三個anchor能夠與小目標配對,且配對的IoU也不高。左下角是一個大目標對應的anchor,可以發現有非常多的anchor能夠與其匹配。匹配的anchor數量越多,則此目標被檢出的概率也就越大。
實現方法:
1、Oversampling :我們通過在訓練期間對這些圖像進行過采樣來解決包含小對象的相對較少圖像的問題(多用這類圖片)。在實驗中,我們改變了過采樣率和研究不僅對小物體檢測而且對檢測中大物體的過采樣效果
2、Copy-Pasting Strategies:將小物體在圖片中復制多分,在保證不影響其他物體的基礎上,增加小物體在圖片中出現的次數(把小目標扣下來貼到原圖中去),提升被anchor包含的概率。
如上圖右下角,本來只有一個小目標,對應的anchor數量為3個,現在將其復制三份,則在圖中就出現了四個小目標,對應的anchor數量也就變成了12個,大大增加了這個小目標被檢出的概率。從而讓模型在訓練的過程中,也能夠有機會得到更多的小目標訓練樣本。
具體的實現方式如下圖:圖中網球和飛碟都是小物體,本來圖中只有一個網球,一個飛碟,通過人工復制的方式,在圖像中復制多份。同時要保證復制後的小物體不能夠覆蓋該原來存在的目標。
網上有人說可以試一下lucid data dreaming Lucid Data Dreaming for Multiple Object Tracking ,這是一種在視頻跟蹤/分割裡面比較有效的數據增強手段,據說對於小目標物體檢測也很有效。
基於無人機拍攝圖片的檢測目前也是個熱門研究點(難點是目標小,密度大)。
相關論文:
The Unmanned Aerial Vehicle Benchmark: Object Detection and Tracking(數據集)
Drone-based Object Counting by Spatially Regularized Regional Proposal Network
Simultaneously Detecting and Counting Dense Vehicles from Drone Images
Vision Meets Drones: A Challenge(數據集)
1: https://zhuanlan.hu.com/p/55824651
2: https://zhuanlan.hu.com/p/57760020
3: https://www.hu.com/question/269877902/answer/548594081
4: https://zhuanlan.hu.com/p/60033229
5: https://arxiv.org/abs/1902.07296
6: http://openaccess.thecvf.com/content_cvpr_2017/papers/Li_Perceptual_Generative_Adversarial_CVPR_2017_paper.pdf
7: http://openaccess.thecvf.com/content_cvpr_2017/papers/Lin_Feature_Pyramid_Networks_CVPR_2017_paper.pdf
『柒』 目標跟蹤(5)使用 Opencv 和 Python 進行對象跟蹤
在本教程中,我們將學習如何基於 Opencv 和 Python 實現對象跟蹤。
首先必須明確目標檢測和目標跟蹤有什麼區別:
我們將首先討論對象檢測,然後討論如何將對象跟蹤應用於檢測。
可能有不同的應用,例如,計算某個區域有多少人,檢查傳送帶上有多少物體通過,或者計算高速公路上的車輛。
當然,看過本教程後,您會很容易地想到數以千計的想法應用於現實生活或可能應用於工業。
在本教程中,我們將使用 3 個文件:
首先我們需要調用highway.mp4文件並創建一個mask:
正如您在示例代碼中看到的,我們還使用了 函數,該函數返回背景比率(background ratio),然後創建mask。
mask可視化結果:
但是,如您所見,圖像中有很多噪點。因此,讓我們通過刪除所有較小的元素來改進提取,並將我們的注意力集中在大於某個面積的對象上。
使用 OpenCV 的cv2.drawContours函數繪制輪廓,我們得到了這個結果。
就本教程而言,分析整個窗口並不重要。我們只對計算在某個點通過的所有車輛感興趣,因此,我們必須定義一個感興趣的區域 ROI 並僅在該區域應用mask。
結果可視化如下:
函數 cv2. 是在開始時添加的,沒有定義參數,現在讓我們看看如何進一步改進我們的結果。history是第一個參數,在這種情況下,它設置為 100,因為相機是固定的。varThreshold改為 40,因為該值越低,誤報的可能性就越大。在這種情況下,我們只對較大的對象感興趣。
在繼續處理矩形之前,我們對圖像進行了進一步的清理。為此,閾值函數就派上用場了。從我們的mask開始,我們告訴它我們只想顯示白色或黑色值,因此通過編寫254, 255,只會考慮 254 和 255 之間的值。
然後我們將找到的對象的坐標插入到 if 條件中並繪制矩形
這是最終結果:
我們現在只需導入和集成跟蹤功能。
一旦創建了對象,我們必須獲取邊界框的每個位置並將它們插入到單個數組中。
通過在屏幕上顯示結果,您可以看到所有通過 ROI 的通道是如何被識別的,以及它們的位置是如何插入到特定的數組中的。顯然,識別的摩托車越多,我們的數組就越大。
現在讓我們將帶有位置的數組傳遞給tracker.update()。我們將再次獲得一個包含位置的數組,但此外,將為每個對象分配一個唯一的 ID。
從代碼中可以看出,我們可以使用 for 循環分析所有內容。此時我們只需要繪制矩形並顯示車輛 ID。
在圖像中,您可以看到結果
main.py
從視頻中也可以看到,我們已經獲得了我們在本教程開始時設置的結果。
但是,您必須將其視為練習或起點,因為關於這個主題有很多話要說,而本教程的目的只是讓您了解對象跟蹤的原理。
如果你想將 Object Tracking 集成到你的項目中,你應該使用更可靠和先進的對象檢測方法,以及跟蹤方法。
完整代碼地址:私信「333」直接獲取或者「鏈接」
『捌』 高大上的YOLOV3對象檢測演算法,使用python也可輕松實現
繼續我們的目標檢測演算法的分享,前期我們介紹了SSD目標檢測演算法的python實現以及Faster-RCNN目標檢測演算法的python實現以及yolo目標檢測演算法的darknet的window環境安裝,本期我們簡單介紹一下如何使用python來進行YOLOV3的對象檢測演算法
YOLOV3的基礎知識大家可以參考往期文章,本期重點介紹如何使用python來實現
1、初始化模型
14-16 行:
模型的初始化依然使用cv下的DNN模型來載入模型,需要注意的是CV的版本需要大於3.4.2
5-8行:
初始化模型在coco上的label以便後期圖片識別使用
10-12行:
初始化圖片顯示方框的顏色
2、載入圖片,進行圖片識別
輸入識別的圖片進行圖片識別,這部分代碼跟往期的SSD 以及RCNN目標檢測演算法類似
19-20行:輸入圖片,獲取圖片的長度與寬度
25-29行:計算圖片的blob值,輸入神經網路,進行前向反饋預測圖片
只不過net.forward裡面是ln, 神經網路的所有out層
3、遍歷所有的out層,獲取檢測圖片的label與置信度
遍歷out層,獲取檢測到的label值以及置信度,檢測到這里YOLOV3以及把所有的檢測計算完成,但是由於yolov3對重疊圖片或者靠的比較近的圖片檢測存在一定的問題,使用YOLOV3使用非最大值抑制來抑制弱的重疊邊界
竟然把墨鏡識別了手機,體現了YOLOV3在重疊圖片識別的缺點
4、應用非最大值抑制來抑制弱的重疊邊界,顯示圖片
56: 使用 非最大值抑制來抑制弱的重疊邊界
58-59行:遍歷所有圖片
61-62行:提取檢測圖片的BOX
64-68行:顯示圖片信息
70-71行:顯示圖片
利用python來實現YOLOV3,與SSD 以及RCNN代碼有很多類似的地方,大家可以參考往期的文章進行對比學習,把代碼執行一遍
進行視頻識別的思路:從視頻中提取圖片,進行圖片識別,識別完成後,再把識別的結果實時體現在視頻中,這部分代碼結合前期的視頻識別,大家可以參考多進程視頻實時識別篇,因為沒有多進程,檢測速度很慢,視頻看著比較卡
1、初始化模型以及視頻流
2、從視頻中提取圖片,進行圖片的blob值計算,進行神經網路的預測
3、提取檢測到圖片的置信度以及ID值
4、 應用非最大值抑制來抑制弱的重疊邊界,顯示圖片
5、關閉資源,顯示圖片處理信息
每個目標檢測演算法都有自己的優缺點,個人感覺,在精度要求不是太高的情況下SSD檢測演算法可以實現較快的速度實現,畢竟精度差不多的情況下,我們希望速度越快越好
『玖』 目標檢測-YOLOv3
傳統的目標檢測演算法適用的場景有限,而且維護成本很大。深度學習方法應用於目標檢測,不僅演算法適應性好,還可以進行遷移學習,降低成本。
深度學習目標檢測演算法中,基於錨框(Anchor)的方法主要分為 一階段 方法和 兩階段 方法。
兩階段 方法先對感興趣的區域進行選擇,然後進一步對候選框內做分類和回歸,最終輸出選擇的框以及對應的分類。兩階段的模型有R-CNN系列,比如 R-CNN,Fast-RCNN,Faster-RCNN 等。兩階段模型的優點是精度高,但是速度及較慢。
一階段 方法直接對anchor進行回歸和分類,得到最終目標框和類別,演算法有 YOLOv2,v3,SSD,RetinaNet 等。一階段模型的推理速度較快,但是相對的精度會下降一些。
此外還有一些 anchor-free 的方法,包括基於關鍵點的檢測演算法以及基於中心檢測演算法等。
下面是一些基礎概念和縮寫:
BBox :Bounding Box 邊界框
Anchor :錨框
RoI : Region of Interest 特定的感興趣區域
Region Proposal : 候選區域
RPN : Region proposal network 提取候選區域的網路
IoU : Intersaction over Union (Area of Overlap/ Area of Union) 交並比,預測框的質量
mAP :mean average precision
NMS :non-maximum suppression 非極大值抑制
YOLO系列的模型在保有一定精度的基礎上擁有很快的推理速度,在下面圖中YOLOv3的推理速度遠超其他模型,因此在實時監測領域中有很好的應用。
YOLO的名字來源於you only look once,從名字上就道出了YOLO的精髓。
YOLOv1將圖像劃分為S*S個網路,物體真實框的中心落在哪個網格上,哪個網格對應的錨框就負責檢測物體。
每個網格會預測一個邊界框以及對應的置信度,這里的置信度反映的是模型認為這個框里包含著物體的把握以及它預測到這個物體的精確程度。所以置信度就等於 。如果物體不存在,那麼置信度應該等於零。
每個邊界框會預測5個值 。(x,y)坐標表示框相對於網格單元邊界的中心。 w,y是相對於整個圖像預測寬度和高度。 最後,置信度預測表示預測框與任何真實框之間的IOU。
YOLOv2在v1的基礎上進行了優化,骨幹網路使用了DarkNet19,並且將輸入圖片給尺寸從224增大到448,並且將網路結構設為全卷積網路結構加上Batch Norm,使用了Kmeans聚類方法來計算anchor,引入了多尺度訓練,使網路在訓練過程中學習不同尺度的圖像。不過待改進的地方有在小目標上召回率不高,靠近的群體目標檢測效果不好,檢測精度還有優化空間。
YOLOv3使用了更加深的骨幹網路DarkNet53,同時加入了多尺度預測,在COCO數據集上聚類; 9中不同尺度的anchor,在分類上使用sigmoid激活函數,支持了目標的多分類。YOLOv3的優點是推理速度快,性價比高,通用性強;缺點是召回率較低,定位精度較差,對於靠近或者遮擋的群體、小物體的檢測能力相對較弱。
YOLOv3在v1的基礎上做了很多改動。
邊界框預測
YOLOv3使用聚類預測到的邊界框作為錨框。網路為邊界框預測4個坐標值 ,如果單元格從圖像的左上角偏移了 ,並且先驗邊界框的寬度和高度為 ,則預測如下圖:
YOLOv3給每個邊界框用邏輯回歸預測一個objectness score,如果某個邊界框和真實框重合度比其他都高,那麼它的objectness score應該是1。而其他框雖然也與真實框有重疊,會被忽略掉。
類別預測
使用的是sigmoid函數,沒有用softmax因為沒必要。
不同尺度的預測
YOLOv3使用k-means聚類來確定bounding box priors,選擇了9個clusters和3個scales,然後在整個scales上均勻分割clusters。在COCO數據集上,9個cluster分別為(10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90) ,(156×198),(373×326)。
特徵提取
YOLOv3使用了Darknet-53,特點是加入了殘差,比之前的網路更深了(有53層卷積層所以叫Darknet-53)。
借一張圖看一下YOLOv3的整個流程:
每個輸出分支上對應著三個尺寸的先驗框(總共3 3=9種尺度)。經過32倍下采樣的網格,每一個網格對應著輸入圖像上32 32的區域,適合檢測尺寸較大的目標,而8倍下采樣的網格適合檢測尺寸小的目標。
輸出特徵的高度H和寬度W,相當於將圖像劃分為H*W個網格,而不是直接在圖像上畫網格。也就是說32倍下采樣之後得到的 ,相當於在輸入圖像上劃一個 的網格,每一個網格對應著輸出特徵圖上的一個點。
特徵圖的C通道上表示預測框的信息,包括坐標信息 ,目標置信度,分類。
C=B*(1+4+class_num),B為特徵圖上分配的錨框個數。
損失函數有三個,分類損失,定位損失和objectness損失。分類使用sigmoid激活函數,loss是sigmoid cross entropy。定位損失在x,y上使用sigmoid函數和sigmoid cross entropy損失,在w,h上使用L1損失。objectness損失用的是sigmoid激活函數和sigmoid cross entropy損失。
對於與真實框重疊的框,三種損失都要計算
對於沒有真實框重疊的框,只計算objectness(0);對於與真實框重疊但不是最匹配的框,忽略它們。