物體檢測的兩個步驟可以概括為:
(1)檢測目標位置(生成矩形框)
(2)對目標物體進行分類
物體檢測的主流算法框架大致分為one-stage與two-stage。two-stage算法代表的有R-CNN系列,one-stage算法代表的有YOLO系列。按筆者理解,two-stage算法將步驟一與步驟二分開執行,輸入圖像先經過候選框生成網絡(例如faster rcnn中的RPN網絡),再經過分類網絡; one-stage算法將步驟一與步驟二同時執行,輸入圖像只經過一個網絡,生成的結果中同時包含位置與類別信息。two-stage與one-stage相比,精度高,但是計算量更大,所以運算較慢。
YOLO特點
(1)YOLO很快,因為用回歸的方法,並且不用復雜的框架。
(2)YOLO會基於整張圖片信息進行預測,而其他滑窗式的檢測框架,只能基於局部圖片信息進行推理。
(3)YOLO學到的圖片特征更為通用。
YOLOV1算法原理
網絡結構:輸入圖像大小為448×448,經過若干個卷積層與池化層,變為7×7×1024張量,最后經過兩層全連接層,輸出張量維度為7×7×30,這就是YOLOV1的整個神經網絡結構,和一般的卷積物體分類網絡沒有太多的區別,最大的不同就是:分類網絡最后的全連接層,一般連接一個一維向量,向量的不同位代表不同的類別。YOLO的backbone網絡結構,受啟發於googleNet,也是V2、V3中darknet的先鋒。本質上沒有什么特別,沒有使用BN層,用了一層Dropout。除了最后一層的輸出使用了線性激活函數,其他層全部使用Leaky ReLU激活函數。
網絡輸出張量維度
(1)7×7的含義:7×7是指圖片被分成7×7個格子,在YOLO中,如果一個物體的中心點落在了某個格子中,那么這個格子將負責預測這個物體。這個設定就好比該網絡在一開始就將整個圖片上的預測任務進行了分工,一共設定7×7個按照方陣列隊的檢測人員,每個人員負責檢測一個物體,大家的分工界限就是看被檢測物體的中心落在誰的格子里。當然,是7×7還是9×9,可以自己修改,精度和性能會隨之有些變化。
(2)30的含義
在YOLOV1論文中,30是由(4+1)×2+20得到的。其中(4+1)是矩形框的中心點坐標x,y,長寬w,h以及是否屬於備件測物體的置信度c; 2是一個格子共回歸兩個矩形框,每個矩形框分別產生5個預測值(x,y,w,h,c);20代表預測20個類別。
這里有幾點需要注意:(1)每個方格(grid)產生2個預測框,2也是參數,可以調,但是一旦設定為2以后,那么每個方格只產生兩個矩形框,最后選定置信度更大的矩形框作為輸出,也就是最終每個方格只輸出一個預測矩形框。(2)每個方格只能預測一個物體。雖然可以通過調整參數,產生不同的矩形框,但這只能提高矩形框的精度。所以當有很多物體的中心點落在了同一個格子里,該格子只能預測一個物體。也就是格子數為7×7時,該網絡最多預測49個物體。
如上所述,在強行施加了格點限制以后,每個格點只能輸出一個預測結果,所以該算法最大的不足,就是對一些臨近的小物體的識別效果不是太好,例如成群結隊的小鳥。
LOSS函數
看到這里讀者或許會有疑問,YOLO里的每個格點,是怎么知道該預測哪個物體的?這就是神經網絡算法的能力。首先拿到一批標注好的圖片數據集,按照規則打好標簽,之后讓神經網絡去擬合訓練數據集。訓練數據集中的標簽是通過人工標注獲得,當神經網絡對數據集擬合的足夠好時,那么就相當於神經網絡具備了一定的和人一樣的識別能力。
神經網絡結構確定之后,訓練效果好壞,由Loss函數和優化器約定。YOLOV1使用普通的梯度下降法作為優化器。

注意點:預測框的寬高(w,h),這里對(w, h)在損失函數中的處理分別取根號,原因在於如果不取根號,損失函數往往更傾向於調整尺寸比較大的預測框。
一些技巧:
(1)回歸offset代替直接回歸坐標
(x,y)不直接回歸中心點坐標數值,而是回歸相對於格點左上角坐標的位移值。
bounding box的預測包括xywh四個值。xy表示bounding box的中心相對於cell左上角坐標偏移,寬高則是相對於整張圖片的寬高進行歸一化的。
xywh為什么要這么表示呢?實際上經過這么表示之后,xywh都歸一化了,它們的值都是在0-1之間。我們通常做回歸問題的時候都會將輸出進行歸一化,否則可能導致各個輸出維度的取值范圍差別很大,進而導致訓練的時候,網絡更關注數值大的維度。因為數值大的維度,算loss相應會比較大,為了讓這個loss減小,那么網絡就會盡量學習讓這個維度loss變小,最終導致區別對待。
(2)同一個點的不同預測框有不同作用
在損失函數的計算中,只對和真實物體最接近的框計算損失,其余框不進行修正。這樣操作之后,作者發現,一個格點的兩個框在尺寸、長寬比、或者某些類別上逐漸有所分工,總體的召回率有所提升。
(3)使用非極大值抑制生成預測框
通常來說,在預測的時候,格點與格點並不會沖突,但是在預測一些大物體或者鄰近物體時,會有多個格點預測同一個物體。此時采用非極大值抑制技巧,過濾掉一些重疊的矩形框。但是mAP並沒有顯著提升。
(4)推理時將p*c作為輸出置信度
在推理時,使用物體的類別預測最大值p乘以預測框的最大值C,作為輸出預測物體的置信度。這樣可以過濾掉一些大部分重疊的矩形框。輸出檢測物體的置信度,同時考慮了矩形框與類別,滿足閾值的輸出更加可信。
YOLOV1同其他算法比較
backbone同為VGG-16,YOLO比Faster R-CNN少了將近7個點mAP,但是速度變為三倍,Fast Yolo和Yolo相比,少11點mAP,但是速度可以達到155張圖片每秒。后續的yolov3中,准確率和速度綜合再一次提升,所以V1的性能不能再過多分析。
