天天看點

yolo标簽沒有字 windows_對yolo系列的了解

最近看了yolo系列的文章,看完之後感覺有所收獲,就記錄一下,寫的會比較随意些

對于yolov1有幾個點我覺得有必要記錄一下:

(1)一開始,我并不明白yolov1,是怎麼打标簽的,作為一個監督的學習方法,肯定需要打标簽,它是對

grid

打标簽,具體來說yolov1是這麼打标簽的。

首先輸出的7*7次元對應于輸入7*7網格,對于輸入圖像中的每個對象,先找到其中心點,如果中心點落在某一個網格内,則這個網格對應的30維向量中,自行車的機率是1,其他對象的機率是0。所有其他48個網格的30維向量中,該自行車的機率都是0,這就是所謂的“中心點所在的網格對預測該對象負責”,展現在将該對象的機率設為1。注意,這20個對象的機率都是條件機率,即P(

yolo标簽沒有字 windows_對yolo系列的了解

|object),這是對目标機率打标簽。接着是2個boundingbox置信度的問題,根據論文置信度的公式為:confidence = Pr(object)*

yolo标簽沒有字 windows_對yolo系列的了解

,

yolo标簽沒有字 windows_對yolo系列的了解

可以直接計算出來,就是用網絡輸出的兩個boundingbox與對象真實boundingbox一起計算IOU,然後看兩個boundingbox的IOU,哪個比較大,更大的boundingbox所對應的Pr(object)為1,同時對象真實boundingbox的位置也填到對應的位置,另外有關位置的4個值設為0,因為,在預測的時候,預測的位置為(x,y,w,h),其中(x,y)是相對于每個grid左上角坐标點的偏移值,而邊界框的(w,h)是相對于整個圖檔的寬與高的比例,是以标簽也是這個意思。另一個boundingbox所對應的Pr(object)為0,然後根據置信度公式計算置信度即可,但這裡有一點需要說明下,在yolov1的實作中,使用了一個控制參數rescore(預設為1),當其為1時,IOU不是設定為1,而就是計算truth與pred之間的真實值。不過很多複現yolo的項目還是将置信度取為1,想必不會太影響結果。

(2)網絡預測

下面來分析下yolov1的預測過程,這裡我們不考慮batch,認為隻是預測一張輸入圖檔,最終的網絡輸出是7x7x30,但是我們可以将其分割成三個部分:類别機率分為[7,7,20],置信度部分為[7,7,2],而邊界框部分為[7,7,2,4](對于這部分不要忘記根據原始圖檔計算出其真實值)。然後将前兩項相乘(矩陣[7,7,20]乘以[7,7,2]可以各補一個次元來完成,[7,7,1,20]x[7,7,2,1])可以得到類别置信度值為[7,7,2,20],這裡總共預測了7x7x2=98個邊界框。

對于yolov1來說,采用的思路為(從c源碼的的看是這樣的),先使用NMS,然後在确定各個box的類别。其基本過程如圖所示。對98個boxes,首先将小于置信度門檻值的值歸0,然後分類别的對對置信度值采用NMS,這裡NMS處理結果不是剔除,而是将其置信度值歸為0。最後才是确定各個box的類别,當其置信度值不為零時才做出檢測結果輸出。yolov1論文裡說NMS算法對yolo的性能是影響很大的,是以這種政策對yolo更好。但有的人測試使用不同的政策結果是一樣的。

yolo标簽沒有字 windows_對yolo系列的了解

---------------------------------------下面是有關yolov2的了解----------------------------

相比于yolov1,yolov2做了比較大的改進,在繼續保持處理速度的基礎上(其實其速度已經超過yolov1),從預測更準确(Better),速度更快(Faster),識别對象的更多(Stronger)(這個就是屬于yolo9000)這三個方面進行了改進。yolov2之是以比yolov1更好,在于它使用了更多的trick,backbone使用了自己設計的網絡darknet-19(19個卷積層,5個maxpooling層),但是用在檢測模型中的并不是直接用的darknet19,而是對darknet19做了一定的修改,詳情請參考論文。在yolov2中移除了全連接配接層,不在使用dropout,并且借鑒了faster rcnn的anchor機制,采用先驗框後可以使模型更容易學習。yolov2不再是采用448x448圖檔作為輸入,而是采用416x416的大小,因為yolov2模型下采樣的總步長為32,是以最終得到的特征圖大小為13x13。對于yolov1,每個cell都預測2個boxes,每個boxes包含5個值:(x,y,w,h,c),前4個值是邊界框位置與大小,最後一個是置信度(confidence score,包含兩個部分:含有物體的機率以及預測框與ground truth的IOU)。但是每個 cell隻預測一套分類機率值,供2個boxes共享。yolov2使用了anchor之後,每個位置的各個anchor都單獨預測一套分類機率值,這和SSD類似(但SSD沒有預測置信度,而是把background作為一個類别來處理)。對于anchor的設計,作者使用kmeans算法,最終選取5個anchor。對于兩個資料集,5個先驗框的width和height如下圖所示(來源:yolo源碼的cfg檔案):

COCO: (0.57273, 0.677385), (1.87446, 2.06253), (3.33843, 5.47434), (7.88282, 3.52778), (9.77052, 9.16828)

VOC: (1.3221, 1.73145), (3.19275, 4.00944), (5.05587, 8.09892), (9.47112, 4.84053), (11.2364, 10.0071)

但是這裡 先驗框的大小具體指什麼作者并沒有說明,但肯定不是像素點,從代碼實作上看,應該是相對于預測的特征圖的大小(13x13)。對比這兩個資料集,也可以看到coco資料集上的物體相對小點。

boundingbox位置的預測

對于對boundingbox的預測,yolov2沿用了yolov1的方法,就是預測邊界框中心點相對于對應cell左上角位置的相對偏移值,為了将邊界框中心點限制在目前cell中,使用sigmoid函數處理偏移值,這樣預測的偏移值在(0,1)範圍内(每個cell的尺度看做1)。總結來看,根據邊界框預測的4個offsets

yolo标簽沒有字 windows_對yolo系列的了解

yolo标簽沒有字 windows_對yolo系列的了解

yolo标簽沒有字 windows_對yolo系列的了解

yolo标簽沒有字 windows_對yolo系列的了解

(和yolov1預測值是有差別的)可以按如下公式計算出邊界框實際位置和大小:

yolo标簽沒有字 windows_對yolo系列的了解

其中(

yolo标簽沒有字 windows_對yolo系列的了解

yolo标簽沒有字 windows_對yolo系列的了解

)為cell的左上角坐标,如下圖1所示,在計算時每個cell的尺度為1,是以目前cell的左上角為(1,1)。由于sigmoid函數的處理,邊界框的中心位置會限制在目前cell内部,防止偏移過多。而

yolo标簽沒有字 windows_對yolo系列的了解

yolo标簽沒有字 windows_對yolo系列的了解

是先驗框的寬度與長度,前面說過它們的值也是相對于特征圖大小的,在特征圖中每個cell的長和寬均為1.這裡記特征圖的大小為(w,h)(在文中是(13,13)),這樣我們可以将邊界框相對于整張圖檔的位置和大小計算出來(4個值均在0到1之間)

yolo标簽沒有字 windows_對yolo系列的了解

如果在将上面的4個值分别乘以圖檔的寬度和長度(像素點值)就可以得到邊界框的最終位置和大小了。這就是yolov2邊界框的整個解碼過程。限制了邊界框的位置預測值使得模型更容易穩定訓練。

yolo标簽沒有字 windows_對yolo系列的了解

圖1

Fine-Grained Features

yolov2的輸入圖檔大小為416x416,經過5次maxpooling之後得到13x13大小的特征圖,并以此特征圖采用卷積做預測。13x13大小的特征圖對檢測大物體是足夠了,但是對于小物體還需要更精細的特征圖(Fine-Grained Features)。是以SSD使用了多尺度的特征圖來分别檢測不同大小的物體,前面更精細的特征圖可以用來預測小物體。yolov2提出了一種passthrough層來利用更精細的特征圖。yolov2所利用的Fine-Grained Features是26x26大小的特征圖(最後一個maxpooling層的輸入),對于darknet19模型來說就是大小為26x26x512的特征圖。passthrough層與ResNet網絡的shortcut類似,以前面更高分辨率的特征圖作為輸入,然後将其連接配接到後面的低分辨率特征圖上。對于26x26x512的特征圖,經passthrough層處理後就變成了13x13x2048的新特征圖,這樣就可以與後面的13x13x1024的特征圖連接配接在一起形成13x13x3072大小的特征圖,然後在此特征圖上做卷積預測。在yolov2的c源碼中passthrough層稱為reorg layer。

Train

在原論文中作者并沒有給出yolov2的訓練過程的兩個最重要的方面,即先驗框比對以及訓練的損失函數,不過預設按照yolov1的處理方式也是可以的,具體處理方式為:和yolov1一樣,對于訓練圖檔中的groundtruth,若其中心點落在某個cell内,那麼該cell内的5個先驗框所對應的邊界框負責預測他,具體是哪個邊界框預測它,需要在訓練中确定,即由那個與groundtruth的IOU最大的邊界框預測它,而剩餘的4個邊界框不與groundtruth比對。但是實際上yolov2的處理方式好像比yolov1要複雜很多。但是我個人認為,不同的作者可能複現的方式不太一樣,也不必糾結于原作者是怎麼實作的。其實我們可以自定義loss,也可以采用和原作者不同的訓練方式,隻要效果沒什麼太大差異就好。

-------------------------------對于yolov3的了解-------------------------------------

正如作者所說,yolov3僅僅是它們近一年的一個工作報告,不算一個完整的paper,個人認為yolov3最大的變化包括兩點:使用殘差模型和采用FPN架構。yolov3的特征提取器是一個殘差模型,作者說因為包括53個卷積層,是以稱為darknet53,但是我看了看隻有52個卷積層,個人覺得這是一個小錯誤,也有網上解釋說53是包括 全連接配接層的,這裡不再糾結這個問題,因為本身不是太重要。相比于darknet19網絡使用了殘差單元,是以可以建構的更深。另外一個點是采用了3個尺度的特征圖(當輸入為416x416時:(13x13),(26x26),(52x52)),VOC資料集上的yolov3網絡結構如圖2所示,其中紅色部分為各個尺度特征圖的檢測結果,yolov3每個位置使用3個先驗框,是以使用k-means得到9個先驗框,并将其劃分到3個尺度的特征圖上,尺度更大的特征圖使用更小的先驗框,和SSD類似。

yolo标簽沒有字 windows_對yolo系列的了解

yolov3所用的darknet53模型

yolo标簽沒有字 windows_對yolo系列的了解

圖2 yolov3網絡結構示意圖(VOC資料集)

感想:

yolov1到yolov3既有傳承又有改進,感覺寫yolo系列的作者蠻自負的,很多東西不給你說清楚,滿滿的傲驕感。這是我目前對yolo系列的了解,具體更細的細節得需要看源碼研究了。但是真個脈絡清楚後想必了解源碼會相對來說容易些。

感覺陳述的有些亂,如果有讀者看到,勿噴哈!

參考:

小小将:目标檢測|YOLOv2原理與實作(附YOLOv3)​zhuanlan.zhihu.com

yolo标簽沒有字 windows_對yolo系列的了解

X-豬:<機器愛學習>YOLO v1深入了解​zhuanlan.zhihu.com

yolo标簽沒有字 windows_對yolo系列的了解