基于深度學習的運動目標檢測(一)
- 1.YOLO算法檢測流程
- 2.YOLO算法網絡架構
- 3.網絡訓練模型
- 3.1 訓練策略
- 3.2 代價函數的設定
2012年,隨著深度學習技術的不斷突破,開始興起基于深度學習的目標檢測算法的研究浪潮。
2014年,Girshick等人首次采用深度神經網絡實現目標檢測,設計出R-CNN網絡結構,實驗結果表明,在檢測任務中性能比DPM算法優越。同時,何愷明等人針對卷積神經網絡(Convolutional Neural Network,CNN)計算復雜度高的問題,引入空間金字塔池化層,設計出基于SPP-Net的目標檢測網絡,不但提高了目標檢測速度,而且支持任意尺寸大小的圖像輸入。
2015年,Girshick在R-CNN目標檢測網絡的基礎上針對候選框特征重復提取進行優化,提出了Fast R-CNN(Fast Regions with CNN,Fast R-CNN)網絡結構,實現了端對端式的訓練,并且所有網絡層的參數在不斷更新。任少卿和何愷明等人采用區域建議網絡(Region Proposal Network,RPN)和Fast R-CNN網絡結合的方式,設計出新的目標檢測網絡,該網絡使得目標檢測精度和速度得到很大的提升。
傳統的目標檢測算法的基本思路一般都是先對圖像進行預處理,然后使用滑動窗口策略在整個圖像均勻間隔的區域上提取特征,最后利用機器學習中的分類器判斷是否存在目標,比如之前的DMP系統不但檢測流程復雜,而且檢測過程中卷積計算量較大,無法滿足現實生活中檢測的實時性。對于該算法的不足,Joseph Redmon等人提出了YOLO算法,主要利用的是將目標檢測任務的問題轉換為回歸問題,其設計的網絡只要進行一次計算,就能直接得到完整圖像中目標的邊界框和類別概率。同時,該網絡結構單一,實現端對端式的訓練。因此,YOLO檢測算法的檢測速度可滿足實際的檢測需求。下面我們從檢測流程、網絡架構、網絡訓練模型3個角度來分析YOLO算法。
基于YOLO算法的目標檢測流程大致可分為3個步驟:
(1)把待檢測的圖像調整大小為448×448。
(2)將圖像放到CNN輸出待檢測目標邊界框的坐標信息和類別概率。
(3)使用非極大抑制算法去除冗余的標注框,篩選出最終的目標檢測結果。
1.YOLO算法檢測流程
YOLO算法的整體檢測思路為:首先將待檢測圖像劃分為S×S個網格,然后對每個網格都預測B個邊界框(bounding boxes)和這些邊界框所對應的自信得分(confidence scores)。YOLO算法具體的檢測示意圖如圖所示。
此時,若有目標的中心點落在某個格子單元中,則該格子將負責檢測這個目標,而confidence score負責檢測該網絡模型的單元格中是否有目標,以及對預測位置的精確度。當單元格中沒有目標時,confidence score為0,如果存在目標,則為預測的boxes與真實的boxes之間的IoU值。
每個邊界框都包含了5個預測值:x,y,w,h,confidence。其中,坐標(x,y)代表邊界框的中心坐標,與網格單元對齊(相當于當前網格單元的偏移值),使得范圍變成[0,1];坐標(w,h)代表預測的邊框相對于整個圖像的高度和寬度的比例。每個網格還要預測一個類別信息,記為C類,則C個類別條件概率值為Pr( | )。在測試階段,每個邊界框的具體類別的自信得分計算公式如下:
上式得到的結果中既包含了邊界框中預測類別的概率信息,也反映了邊界框中是否含有目標和邊界框位置的精確度。
2.YOLO算法網絡架構
通過上述分析YOLO的檢測流程可以看出,YOLO算法將格子數S設置為7×7的大小,網絡方面采用GooleNet的思想,其中包含了24個卷積層和2個全連接層,如圖所示。卷積層主要用來提取特征,全連接層主要用來預測類別概率和坐標,與GooleNet的不同之處在于YOLO檢測網絡沒有采用Inception結構,而采用1×1和3×3的卷積層代替了Inception。從上述網絡檢測流程的分析可以看出,每個單元需要預測(B×5+C)值,假設將輸入圖像劃分為S×S個網格單元,那么最終的預測值為S×S×(B×5+C)大小的張量,對于PASCAL VOC數據,最終的預測結果為7×7×30大小的張量。
可以看出,網絡的最終輸出為7×7×30大小的張量,這和前面的分析一致。該張量所代表的具體含義如圖所示。對于每一個單元格,最后20個元素代表類別概率值,其中前面10個中有兩個是邊界框置信度,兩者的乘積就是類別置信度,剩下8個元素代表邊界框的(x,y,w,h)。
3.網絡訓練模型
3.1 訓練策略
在訓練之前,先在ImageNet上進行預訓練,其預訓練的分類模型采用圖15-12中前20個卷積層,然后添加一個average-pool層和全連接層。預訓練之后,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連接層。由于檢測任務一般需要更高清的圖片,因此將網絡的輸入從224×224增加到448×448。整個網絡的流程如圖所示。
YOLO算法開始并沒有像Goole Net那樣直接構建24層的卷積網絡,而是構建20層的卷積網絡,然后在ImageNet數據集上預訓練了前面的20層卷積層。Ren等人采用將卷積層和全連接層添加到預訓練網絡中的策略,進一步提高了網絡的性能。因此,YOLO采用基于該原理在初始的20層卷積網絡基礎上,隨機初始化后面的4層卷積層和2層全連接層。由于在檢測中需要更詳細的視覺信息,因此YOLO將網絡模型的輸入圖像大小由224×224調整為448×448。網絡最終預測輸出結果的邊界框的信息是(x,y,w,h),但是坐標(x,y)用對應網格的偏移量表示,然后歸一化到(0,1)之間,坐標(w,h)用圖像width和height歸一化到(0,1)之間。由于在訓練的過程中一般的激活函數Sigmoid會出現梯度消失、梯度爆炸的現象,因此YOLO采用LeakyReLU線性激活函數作為激活函數,其函數表達式如下:
3.2 代價函數的設定
YOLO算法的最終輸出結果包含邊界框的坐標、置信度得分、類別概率值3個部分,代價函數的設計目標是讓這三方面達到很好的平衡。剛開始,YOLO簡單地采用平方和誤差作為代價函數,通過梯度下降法很容易達到最優化,但是這種代價函數的設計最終導致的結果是模型的擬合能力很差,主要原因在于代價函數的設定不合適,同時造成的不足之處有以下兩個方面:
(1)8維的坐標誤差和20維的類別概率誤差,采用平方差誤差時,兩者視為同等重要,這顯然是不合理的。
(2)在一幅圖像中,如果一個網絡中沒有目標,就將這些網絡中的格子單元的置信度設置為0。相比于較少的有目標的網絡,這種方法是不可取的,會導致網絡不穩定甚至不收斂。基于上述的不足,YOLO進一步改進代價函數,更重視8維坐標預測的誤差損失,對其賦予更大的權值,同時減小不包含目標的單元格的置信度預測的權值。對于包含目標的單元格的置信度和類別概率預測的誤差損失保持不變,同時將其權值設定為1。平方和誤差同時對大邊界框和小邊界框中的誤差采用相同的權值,改進后小邊界框中的微小偏差顯得尤為重要。因此,網絡的代價函數將原來的w、h分別用[插圖]和[插圖]代替,這樣做的好處在于進一步降低了敏感度之間的差異。最終,代價函數設計如下:
其中,第一項是邊界框中心坐標的誤差項,[插圖]用于判斷第i個網格中第j個邊界框是否檢測該目標,λcoord表示邊界框坐標誤差損失的權值,[插圖]用于判斷目標是否出現在網格中,λnoobj表示不包含目標邊界框的置信度預測的誤差權值。在上述代價函數中,只有當某個網絡中有目標時才對預測誤差進行懲罰,即增加權重系數。
總之,YOLO算法的缺點有兩個方面:一方面,難以檢測小目標,導致對視頻中運動目標的檢測出現漏檢的現象;另一方面,對目標的定位不準,檢測到的目標與實際目標之間存在偏差。