博客爲隨筆筆記類,便於加深理解以及比較各模型不同。若想要系統學習yolo系列,建議閱讀論文或詳解博客
PS:
!!!!yolo的bounding box和ssd的anchor box不一樣!!!他不是在圖中每一個座標點生成了一系列的盒子,這個盒子我們把它叫做Anchor,也就是先驗盒子!!yolo,沒有先驗的概念,而是將圖片分成了一系列的格子!! 而這個格子直接預測到的目標的定位的框就是我們所說的bounding box,boungbox的信息直接用途中的格子表示 如:
他沒有anchor 也沒有default
正文:
yolo核心思想:利用整張圖作爲網絡的輸入,直接在輸出層迴歸bounding box的位置和其所屬類別。yolo利用全圖作爲context信息,背景錯誤比較少。
yolo將一幅圖分成s×s個格子(grid cell),如果某個object的中心落在這個格子,那麼這個網格就負責這個object。
每個網格負責預測b個bounding box。每一個boundbox包含了x y h w自身的位置信息以及一個confidence。這個con代表了所預測的box中含有object的置信度以及這個box預測的有多準兩種信息。計算如下:
其中,如果有object落在一個grid cell裏,第一項取1,否則取0。第二項則是bounding box和 gt box之間的IOU
每個bounding box要預測5個值,而每個網格還要預測一個類別信息。記爲C類。則S×S個網格每個網格要預測B個boundbox還要預測C個catagories。輸出就是:S x S x (5*B+C)的一個tensor。
此處注意:class信息是針對每個網格的,confidence信息是針對bounding box的(這也是之後要改進的地方)
網絡如下:
損失函數共包含5個部分:
在這個損失中: 只有當某個網格中右object時纔對class error進行懲罰
只有當某個box prediction對某個gt box負責時,纔會對corrd error進行懲罰。而是否負責則根據IOU值推算。
yolo v2:
V2借鑑了faster的思想,引入了anchor,就像之前說的yolo需要改進的地方,bounding box對一個格子多個目標的預測能力很差。並且刪除了yolo的全連接層,使用anchor預測bounging box
模型如下:
網絡使用了darknet19 具體如下:
其網絡設計對於v1沒有太大改變,主要是:
在每個卷積層後引入BN層,代替dropout,加速收斂。
移除全連接層。
在16層開始分爲兩條路徑,將底層特徵連接到高層,提高模型性能。
使用Anchor:
每個anchor包括25個信息,是否有目標,目標位置,目標種類。
計算如下:
。其中每個cell包括5個anchor,這5個anchor具有不同尺寸的預設,該預設可以通過手動指定。也可通過在訓練集上獲得。在v2中,預設尺寸是通過在測試集上進行類聚獲得的。
yolo v3:
yolov3 對於檢測兩個距離很近的物體,又或者是距離很近的不同類物體魯棒性很好,全面超越SSD512。
v1 v2都不如SSD300
總的來說 v3比v2性能提高很大,但速度卻沒有下降,況且對於小目標魯棒性很強。
yolo v3對於yolo以及v2的改變:
loss不同:作者v3替換了v2的softmax loss 變成logistic loss,而且每個ground truth只匹配一個先驗框。
網絡結構改變: 由darknet19變爲darknet53,跳層現象越來越普遍,使用殘差結構。
激活不同:激活函數由softmax改爲sigmoid
anchor不同:anchor的數量由5個變爲3個,提高了IOU
detection的策略不同:v2只有一個detection,v3一下變成了3個,分別是一個下采樣的,feature map爲13*13,還有2個上採樣的eltwise sum,feature map爲26*26,52*52,也就是說v3的416版本已經用到了52的feature map,而v2把多尺度考慮到訓練的data採樣上,最後也只是用到了13的feature map,這應該是對小目標影響最大的地方。
backbone不同:這和上一點是有關係的,v2的darknet-19變成了v3的darknet-53,爲啥呢?就是需要上採樣啊,卷積層的數量自然就多了,另外作者還是用了一連串的3*3、1*1卷積,3*3的卷積增加channel,而1*1的卷積在於壓縮3*3卷積後的特徵表示,這波操作很具有實用性,一增一減,效果棒棒。
結構如下:
網絡可能沒有使用pool 直接使用conv stride=2進行下采樣