YOLOv1
YOLOv1是單階段目標(biāo)檢測(cè)方法,不需要像Faster RCNN這種兩階段目標(biāo)檢測(cè)方法一樣,需要生成先驗(yàn)框。Yolo算法采用一個(gè)單獨(dú)的CNN模型實(shí)現(xiàn)end-to-end的目標(biāo)檢測(cè)。
整個(gè)YOLO目標(biāo)檢測(cè)pipeline如上圖所示:首先將輸入圖片resize到448x448,然后送入CNN網(wǎng)絡(luò),最后處理網(wǎng)絡(luò)預(yù)測(cè)結(jié)果得到檢測(cè)的目標(biāo)。相比R-CNN系列算法,其是一個(gè)統(tǒng)一的框架,其速度更快,而且Yolo的訓(xùn)練過(guò)程也是end-to-end的。
具體來(lái)說(shuō),YOLO將全圖劃分為 S × S S×S S×S的格子, 每個(gè)格子負(fù)責(zé)對(duì)落入其中的目標(biāo)進(jìn)行檢測(cè),一次性預(yù)測(cè)所有格子所含目標(biāo)的邊界框、置信度、以及所有類(lèi)別概率向量。
論文思想
- 將一幅圖像分成SxS個(gè)網(wǎng)格,如果某個(gè)object的中心落在這個(gè)網(wǎng)格中,則這個(gè)網(wǎng)絡(luò)就負(fù)責(zé)預(yù)測(cè)這個(gè)object
- 每個(gè)網(wǎng)格要預(yù)測(cè)B個(gè)bounding box,每個(gè)bounding box,除了要預(yù)測(cè)位置之外,還要附帶預(yù)測(cè)一個(gè)confidence值。每個(gè)網(wǎng)格還要預(yù)測(cè)c個(gè)類(lèi)別的分?jǐn)?shù)
網(wǎng)格單元(Grid Cell)
YOLO將目標(biāo)檢測(cè)問(wèn)題作為回歸問(wèn)題。會(huì)將輸入圖像分成 S × S S \times S S×S的網(wǎng)格(cell),如果一個(gè)物體的中心點(diǎn)落入到一個(gè)cell中,那么該cell就要負(fù)責(zé)預(yù)測(cè)該物體,一個(gè)格子只能預(yù)測(cè)一個(gè)物體,會(huì)生成兩個(gè)預(yù)測(cè)框。
對(duì)于每個(gè)網(wǎng)格單元cell:
- YOLOv1會(huì)預(yù)測(cè)兩個(gè)邊界框
- 每個(gè)邊界框包含5個(gè)元素: ( x , y , w , h ) (x,y,w,h) (x,y,w,h) 和 邊界框的置信度得分(box confidence score)
- 只負(fù)責(zé)預(yù)測(cè)一個(gè)目標(biāo)
- 預(yù)測(cè) C C C 個(gè)條件概率類(lèi)別(conditional class probabilities)
為了評(píng)估PASCAL VOC,YOLO V1使用 7×7 的網(wǎng)格(S×S),每個(gè)單元格回歸2個(gè)邊界框 和 20個(gè)條件類(lèi)別概率。條件類(lèi)別概率 (conditional class probability) 是檢測(cè)到的目標(biāo)屬于特定類(lèi)別的概率(每個(gè)單元對(duì)每個(gè)類(lèi)別有一個(gè)概率)。
最終的預(yù)測(cè)特征由邊框的位置、邊框的置信度得分以及類(lèi)別概率組成,這三者的含義如下:
- 邊框位置:對(duì)每一個(gè)邊框需要預(yù)測(cè)其中心坐標(biāo)及寬、高這4個(gè)量, 兩個(gè)邊框共計(jì)8個(gè)預(yù)測(cè)值
- 邊界框?qū)挾葁和高度h用圖像寬度和高度歸一化。因此 x , y , w , h x, y, w, h x,y,w,h 都在0和1之間。 x x x 和 y y y 是相應(yīng)單元格的偏移量。
- 置信度得分(box confidence score) c :框包含一個(gè)目標(biāo)的可能性(objectness)以及邊界框的準(zhǔn)確程度。類(lèi)似于Faster RCNN 中是前景還是背景。由于有兩個(gè)邊框,因此會(huì)存在兩個(gè)置信度預(yù)測(cè)值。
- 類(lèi)別概率:由于PASCAL VOC數(shù)據(jù)集一共有20個(gè)物體類(lèi)別,因此這里預(yù)測(cè)的是邊框?qū)儆谀囊粋€(gè)類(lèi)別。
一個(gè)cell預(yù)測(cè)的兩個(gè)邊界框共用一個(gè)類(lèi)別預(yù)測(cè), 在訓(xùn)練時(shí)會(huì)選取與標(biāo)簽IoU更大的一個(gè)邊框負(fù)責(zé)回歸該真實(shí)物體框,在測(cè)試時(shí)會(huì)選取置信度更高的一個(gè)邊框,另一個(gè)會(huì)被舍棄,因此整張圖最多檢測(cè)出49個(gè)物體。
網(wǎng)絡(luò)結(jié)構(gòu)
YOLO輸入圖像的尺寸為 448 × 448 448 \times 448 448×448,經(jīng)過(guò)24個(gè)卷積層,2個(gè)全連接的層(FC),最后在reshape操作,輸出的特征圖大小為 7 × 7 × 30 7 \times 7 \times 30 7×7×30。
- YOLO主要是建立一個(gè)CNN網(wǎng)絡(luò)生成預(yù)測(cè) 7 × 7 × 1024 7 \times 7 \times 1024 7×7×1024 的張量,
- 然后使用兩個(gè)全連接層執(zhí)行線(xiàn)性回歸,以進(jìn)行 7 × 7 × 2 7 \times 7 \times 2 7×7×2 邊界框預(yù)測(cè)。將具有高置信度得分(大于0.25)的結(jié)果作為最終預(yù)測(cè)。
- 在 3 × 3 3 \times 3 3×3的卷積后通常會(huì)接一個(gè)通道數(shù)更低 1 × 1 1 \times 1 1×1的卷積,這種方式既降低了計(jì)算量,同時(shí)也提升了模型的非線(xiàn)性能力。
- 除了最后一層使用了線(xiàn)性激活函數(shù)外,其余層的激活函數(shù)為 Leaky ReLU ;
- 在訓(xùn)練中使用了 Dropout 與數(shù)據(jù)增強(qiáng)的方法來(lái)防止過(guò)擬合。
- 對(duì)于最后一個(gè)卷積層,它輸出一個(gè)形狀為 (7, 7, 1024) 的張量。 然后張量展開(kāi)。使用2個(gè)全連接的層作為一種線(xiàn)性回歸的形式,它輸出 個(gè)參數(shù),然后重新塑形為 (7, 7, 30) 。
損失函數(shù)
YOLO V1每個(gè)網(wǎng)格單元能夠預(yù)測(cè)多個(gè)邊界框。為了計(jì)算true positive的損失,只希望其中一個(gè)框負(fù)責(zé)該目標(biāo),為此選擇與GT具有最高IOU的那個(gè)框
- YOLO正樣本選擇
- 當(dāng)一個(gè)真實(shí)物體的中心點(diǎn)落在了某個(gè)cell內(nèi)時(shí),該cell就負(fù)責(zé)檢測(cè)該物體。
- 具體做法是將與該真實(shí)物體有最大IoU的邊框設(shè)為正樣本, 這個(gè)區(qū)域的類(lèi)別真值為該真實(shí)物體的類(lèi)別,該邊框的置信度真值為1。
- YOLO負(fù)樣本選擇
- 除了上述被賦予正樣本的邊框,其余邊框都為負(fù)樣本。負(fù)樣本沒(méi)有類(lèi)別損失與邊框位置損失,只有置信度損失,其真值為0。
YOLO使用預(yù)測(cè)值和GT之間的誤差平方的求和(MSE)來(lái)計(jì)算損失。 損失函數(shù)包括
- localization loss -> 坐標(biāo)損失(預(yù)測(cè)邊界框與GT之間的誤差)
- classification loss -> 分類(lèi)損失
- confidence loss -> 置信度損失(框里有無(wú)目標(biāo), objectness of the box)
坐標(biāo)損失
坐標(biāo)損失也分為兩部分,坐標(biāo)中心誤差和位置寬高的誤差,其中 1 i j o b j \mathbb{1}^{obj}_{ij} 1ijobj? 表示第i個(gè)網(wǎng)格中的第j個(gè)預(yù)測(cè)框是否負(fù)責(zé)obj這個(gè)物體的預(yù)測(cè),只有當(dāng)某個(gè)預(yù)測(cè)框?qū)δ硞€(gè)物體負(fù)責(zé)的時(shí)候,才會(huì)對(duì)box的coordinate error進(jìn)行懲罰,而對(duì)哪個(gè)物體負(fù)責(zé)就看其預(yù)測(cè)值和GT box的IoU是不是在那個(gè)網(wǎng)格的所有box中最大。
我們可以看到,對(duì)于中心點(diǎn)的損失直接用了均方誤差,但是對(duì)于寬高為什么用了平方根呢?這里是這樣的,我們先來(lái)看下圖:
上圖中,藍(lán)色為bounding box,紅色框?yàn)檎鎸?shí)標(biāo)注,如果W和h沒(méi)有平方根的話(huà),那么bounding box跟兩個(gè)真實(shí)標(biāo)注的位置loss是相同的。但是從面積看來(lái)B框是A框的25倍,C框是B框的81/25倍。B框跟A框的大小偏差更大,所以不應(yīng)該有相同的loss。
如果W和h加上平方根,那么B對(duì)A的位置loss約為3.06,B對(duì)C的位置loss約為1.17,B對(duì)A的位置loss的值更大,這更加符合我們的實(shí)際判斷。所以,算法對(duì)位置損失中的寬高損失加上了平方根。
而公式中的
λ
c
o
o
r
d
\lambda_{coord}
λcoord? 為位置損失的權(quán)重系數(shù),在pascal VOC訓(xùn)練中取5。
置信度損失
置信度也分成了兩部分,一部分是包含物體時(shí)置信度的損失,一個(gè)是不包含物體時(shí)置信度的值。
其中前一項(xiàng)表示有無(wú)人工標(biāo)記的物體落入網(wǎng)格內(nèi),如果有,則為1,否則為0.第二項(xiàng)代表預(yù)測(cè)框bounding box和真實(shí)標(biāo)記的box之間的IoU。值越大則box越接近真實(shí)位置。
confidence是針對(duì)預(yù)測(cè)框bounding box的,由于每個(gè)網(wǎng)格有兩個(gè)bounding box,所以每個(gè)網(wǎng)格會(huì)有兩個(gè)confidence與之相對(duì)應(yīng)。
從損失函數(shù)上看,當(dāng)網(wǎng)格i中的第j個(gè)預(yù)測(cè)框包含物體的時(shí)候,用上面的置信度損失,而不包含物體的時(shí)候,用下面的損失函數(shù)。對(duì)沒(méi)有物體的預(yù)測(cè)框的置信度損失,賦予小的loss weight, 記為在pascal VOC訓(xùn)練中 λ n o o b j \lambda_{noobj} λnoobj?取0.5。有有物體的預(yù)測(cè)框的置信度損失和類(lèi)別的loss的loss weight正常取1。
類(lèi)別損失
類(lèi)別損失這里也用了均方誤差。其中 1 i o b j \mathbb{1}^{obj}_{i} 1iobj? 表示有無(wú)物體的中心點(diǎn)落到網(wǎng)格i中,如果網(wǎng)格中包含有物體object的中心的話(huà),那么就負(fù)責(zé)預(yù)測(cè)該object的概率。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-464573.html
YOLOv1的缺點(diǎn)
由于YOLOV1的框架設(shè)計(jì),該網(wǎng)絡(luò)存在以下缺點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-464573.html
- 每個(gè)網(wǎng)格只對(duì)應(yīng)兩個(gè)bounding box,當(dāng)物體的長(zhǎng)寬比不常見(jiàn)(也就是訓(xùn)練數(shù)據(jù)集覆蓋不到時(shí)),效果較差。
- 原始圖片只劃分為7x7的網(wǎng)格,當(dāng)兩個(gè)物體靠的很近時(shí),效果比較差。
- 最終每個(gè)網(wǎng)格只對(duì)應(yīng)一個(gè)類(lèi)別,容易出現(xiàn)漏檢(物體沒(méi)有被識(shí)別到)。
- 對(duì)于圖片中比較小的物體,效果比較差。這其實(shí)是所有目標(biāo)檢測(cè)算法的通病。
到了這里,關(guān)于yolov1詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!