本文依次講解YOLOv1,v2,v3撵溃。博客地址https://blog.csdn.net/hancoder/article/details/87994678
YOLOv11.1 Introduction1.2 Unified Detection1.3 網(wǎng)絡(luò)框架1.4 Loss解讀:1.5 test附:NMS示例:1.7 YOLOv1結(jié)語(yǔ)待解決問題YOLOv22.1 Better更好2.1.1 Batch Normalization:2.1.2 High resolution classifier2.1.3 Convolution with anchor boxes2.1.4 Dimension clusters2.1.5 Direct location prediction2.1.6 Fine-Grained Features2.1.7 Multi-Scale Training2.2 Faster2.2.1 Darknet-192.2.2 Training for classification預(yù)訓(xùn)練2.2.3 Training for detection微調(diào)訓(xùn)練2.3 Stronger2.3.1 Hierarchical classification2.3.2 Datasets combination with wordtree2.3.3 Joint classification and detectionYOLOv33.1 YOLOv3與YOLOv2比較3.1.1 與YOLOv2相同的地方3.1.2 YOLOv3與YOLOv2顯著區(qū)別3.2 分類網(wǎng)絡(luò) darknet-533.3 檢測(cè)網(wǎng)絡(luò)3.4 實(shí)驗(yàn)效果
YOLOv1
1.1 Introduction
名字解釋:You Only Look Once: Unified, Real-Time Object Detection
You Only Look Once說的是只需要一次CNN運(yùn)算苦始,Unified指的是這是一個(gè)統(tǒng)一的框架诲祸,提供end-to-end的預(yù)測(cè)捡鱼,而Real-Time體現(xiàn)是Yolo算法速度快拐叉。
前情回顧:不同于滑動(dòng)窗口和region proposal-based techniques们何,YOLO在訓(xùn)練和測(cè)試階段直接看整張圖片萄焦,所以它隱式地編碼了類別的上下文contextual信息,還有他們的外觀冤竹。Faster R-CNN因?yàn)樗床坏礁蟮纳舷挛男畔⒎鞣猓园褕D像中的背景塊誤認(rèn)為object。
1.2 Unified Detection
我們先大概看一下YOLO的模型鹦蠕,我們剛開始只需知道輸出是7730就好冒签。然后我們一步步分析為什么輸出是7730,這輸出代表什么钟病?
YOLO可以同時(shí)預(yù)測(cè)一張圖片中的所有類別和框萧恕,先簡(jiǎn)單看一下下圖效果刚梭。在這里我們看看輸出是3個(gè)框效果還不錯(cuò)就好。
我們可能乍看會(huì)有很多疑問:這些黑線代表什么票唆?這么多種大小朴读、比例的框是怎么畫出來的?窮舉惰说?顯然暴力又不合適磨德。為什么這么多框最后大多都被淘汰了?傳統(tǒng)的分類網(wǎng)絡(luò)總是最后連接一個(gè)全連接而輸出固定長(zhǎng)度的向量來單一分類吆视,而對(duì)于目標(biāo)檢測(cè)來說圖中物體的數(shù)量是不確定的典挑,那全連接似乎不能用了?為什么Faster R-CNN是二階段的啦吧,而YOLO卻可以是單階段的您觉。
上面那么多黑人問號(hào)可能會(huì)使你煩躁,所以我們先設(shè)問一下吧:我們訓(xùn)練出來的目標(biāo)檢測(cè)網(wǎng)絡(luò)是萬能的嗎授滓?----當(dāng)然不是琳水,只能分辨出訓(xùn)練過的種類。
好了般堆,接下來我們就切入正題了在孝。
[圖片上傳失敗...(image-65f8bc-1559829345528)]
結(jié)合著上面這個(gè)我們之前看過的圖,我們先熟悉一些內(nèi)容:我們會(huì)把圖分成7*7的小圖淮摔,而【每個(gè)小圖】會(huì)關(guān)聯(lián)著2個(gè)形狀不規(guī)則的【bounding box】框私沮。既然有兩個(gè)box,那么就得由兩組坐標(biāo)來表示和橙,所以【每個(gè)box】有5個(gè)參數(shù)(=4+1):中心點(diǎn)的xywh+【每個(gè)box】還有1個(gè)置信度confidence仔燕,它的作用我們可以暫且簡(jiǎn)單理解為畫的框與真實(shí)框groundtruth框的交并比IoU;【每個(gè)小圖】有一組條件類別概率(個(gè)數(shù)等于訓(xùn)練類別數(shù)目20個(gè))魔招。
不知道有沒有細(xì)心的同學(xué)有這樣的疑惑:上面不應(yīng)該是【每個(gè)box】都有一組類別概率嗎晰搀?怎么是【每個(gè)小圖】呢?其實(shí)這也是YOLOv1的缺點(diǎn)办斑,每個(gè)小圖是不允許有兩種類別的外恕。這可能出于速度、準(zhǔn)確度等考慮乡翅。
我們把上面的話變得專業(yè)一點(diǎn):把小圖稱作網(wǎng)格單元grid cell吁讨,每個(gè)小圖grid cell 的 邊界框bounding box數(shù)目是B。置信度confidence峦朗,類別為class,這兩個(gè)單詞開頭都是C排龄,大小c用法不是很統(tǒng)一波势。
即可表述為:
YOLO它將圖像分成?(S=7)的網(wǎng)格grid cell翎朱,并且每個(gè)網(wǎng)格單元負(fù)責(zé)預(yù)測(cè)?(B=2)個(gè)邊界框box。加上每個(gè)邊界框box的置信度confidence尺铣,每個(gè)網(wǎng)格的?個(gè)條件類別概率拴曲,grid cell內(nèi)有物體時(shí),每個(gè)網(wǎng)格即可最后被編碼長(zhǎng)度輸出為?的張量凛忿。
[圖片上傳失敗...(image-1af8c8-1559829345528)]
上圖即目標(biāo)檢測(cè)的輸出維度澈灼。
<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">每個(gè)網(wǎng)格并不是只要有物體就要為之畫框的。而是只有當(dāng)物體的【中心】落到那個(gè)網(wǎng)格grid cell里店溢,那個(gè)網(wǎng)格grid cell才負(fù)責(zé)檢測(cè)那個(gè)物體</mark>叁熔。在形式上,我們將<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">置信度confidence定義為</mark>?床牧。如果該網(wǎng)格中不存在目標(biāo)的中心荣回,則置信度分?jǐn)?shù)應(yīng)是零(因?yàn)镻r(Object)=0)。否則戈咳,我們希望<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">置信度分?jǐn)?shù)等于預(yù)測(cè)框與真實(shí)值之間聯(lián)合部分的交集(IOU)</mark>(即Pr(Object)應(yīng)趨向1心软,因而Confidence=IoU)。
注意:上面2個(gè)相乘的是置信度著蛙,下面還有類似3個(gè)相乘的稱為類別置信度删铃,注意區(qū)分。
每個(gè)邊界框包含5個(gè)預(yù)測(cè):?踏堡,?猎唁,?,?和置信度c暂吉,即自身bounding box位置+confidence胖秒。<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="6.156ex" height="2.811ex" viewBox="0 -906.7 2650.4 1210.2" role="img" focusable="false" style="vertical-align: -0.705ex;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(961,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">,</text></g></g></svg>?坐標(biāo)表示邊界框的中心點(diǎn)相對(duì)于這個(gè)grid cell左上角的偏移(因?yàn)閤y代表的是框的中心慕的,所以我們經(jīng)常用?表示框的坐標(biāo))阎肝。xywh都會(huì)被歸一化(0,1)區(qū)間的。wh歸一化比較簡(jiǎn)單:w=框的寬度/圖片總寬度肮街。因?yàn)閤y只是中心點(diǎn)的相對(duì)于grid cell左上角的偏移风题。具體而言,xy是如下圖
[圖片上傳失敗...(image-75070d-1559829345528)]
?
?
解讀 :?代表先把圖分成7份嫉父,?是每個(gè)grid寬度沛硅,?代表?包含幾點(diǎn)幾個(gè)小grid,再?代表?在單個(gè)grid里的相對(duì)位置
通常情況下绕辖,YOLO不預(yù)測(cè)邊界框中心的絕對(duì)坐標(biāo)摇肌。它預(yù)測(cè)的是偏移量,預(yù)測(cè)的結(jié)果通過一個(gè)sigmoid函數(shù)仪际,迫使輸出的值在0和1之間围小。例如昵骤,考慮上圖中狗的情況。如果對(duì)中心xy的預(yù)測(cè)是(0.4,0.7)肯适,那么這意味著中心位于13×13特征地圖上的(2.4,5.7)变秦。 (因?yàn)榧t細(xì)胞的左上角坐標(biāo)是(2,5))。 但如果預(yù)測(cè)的x框舔,y坐標(biāo)大于1蹦玫,會(huì)發(fā)生什么情況,比如(1.2,0.7)刘绣。這意味著中心位于(3.2,5.7)樱溉。注意現(xiàn)在中心位于我們的紅色區(qū)域或第2排的第5個(gè)單元格的右側(cè)。這打破了YOLO背后的理論额港,因?yàn)槿绻覀兗僭O(shè)紅色區(qū)域負(fù)責(zé)預(yù)測(cè)狗饺窿,狗的中心必須位于紅色區(qū)域中,而不是位于紅色區(qū)域旁邊的其他網(wǎng)格里移斩。 因此肚医,為了解決這個(gè)問題,輸出是通過一個(gè)sigmoid函數(shù)傳遞的向瓷,該函數(shù)在0到1的范圍內(nèi)壓扁輸出肠套,有效地將中心保持在預(yù)測(cè)的網(wǎng)格中。下面的這個(gè)公式詳細(xì)展示了預(yù)測(cè)結(jié)果如何轉(zhuǎn)化為最終box的預(yù)測(cè)的猖任。
即?,?,?,?
(這里可能)
[圖片上傳失敗...(image-e5040c-1559829345528)]
在test階段需要反向解碼得到原始的框你稚,相關(guān)解碼代碼在darknet框架detection_layer.c中的get_detection_boxes()函數(shù),關(guān)鍵部分如下:
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="c++" cid="n5175" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 0px; margin-top: 15px; width: inherit;"> boxes[index].x = (predictions[box_index + 0] + col) / l.side * w;
boxes[index].y = (predictions[box_index + 1] + row) / l.side * h;
boxes[index].w = pow(predictions[box_index + 2], (l.sqrt?2:1)) * w;
boxes[index].h = pow(predictions[box_index + 3], (l.sqrt?2:1)) * h;
//w和h就是圖像寬高朱躺,l.side是上文中提到的S刁赖。</pre>
以上就是YOLO的模型,簡(jiǎn)單來說就是輸入 原圖长搀,輸出7730的張量宇弛,重點(diǎn)是了解其每個(gè)維度的意義。
由于輸出層為全連接層源请,因此在檢測(cè)時(shí)枪芒,YOLO訓(xùn)練模型只支持與訓(xùn)練圖像相同的輸入分辨率。
雖然每個(gè)格子可以預(yù)測(cè)B個(gè)bounding box谁尸,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測(cè)輸出舅踪,即每個(gè)格子最多只預(yù)測(cè)出一個(gè)物體。當(dāng)物體占畫面比例較小良蛮,如圖像中包含畜群或鳥群時(shí)抽碌,每個(gè)格子包含多個(gè)物體,但卻只能檢測(cè)出其中一個(gè)决瞳。這是YOLO方法的一個(gè)缺陷货徙。
1.3 網(wǎng)絡(luò)框架
受GoogLeNet啟發(fā)泽裳,YOLOv1有24個(gè)卷積層+2個(gè)全連接層(fastYOLO版本中只適應(yīng)9個(gè)conv)。沒有用Inception模塊破婆,而是用1×1卷積+3×3卷積
YOLOv1在ImageNet1000類上預(yù)訓(xùn)練,預(yù)訓(xùn)練的時(shí)候只使用網(wǎng)絡(luò)的錢20個(gè)卷積層+一個(gè)全連接胸囱。
預(yù)訓(xùn)練后用到檢測(cè)網(wǎng)絡(luò)上祷舀,加了4個(gè)卷積層和兩個(gè)全連接
1.4 Loss
知道了模式之后我們面對(duì)更難的問題是面對(duì)30維如此多的參數(shù),我們?nèi)绾味x與ground truth的距離烹笔。
Loss = λcoord ×坐標(biāo)預(yù)測(cè)誤差 + (含object的box confidence預(yù)測(cè)誤差 + λnoobj ×不含object的box confidence預(yù)測(cè)誤差) + 類別預(yù)測(cè)誤差
展開就是
對(duì)比圖:其中:C為confidence裳扯,?表示目標(biāo)的中心是否出現(xiàn)在網(wǎng)格單元?中,?表示網(wǎng)格單元?中的第?個(gè)邊界框預(yù)測(cè)器“負(fù)責(zé)”該預(yù)測(cè)谤职。每個(gè)網(wǎng)格的30維的對(duì)應(yīng)關(guān)系如圖所示饰豺。(這個(gè)1可以在后面理解)
每個(gè)網(wǎng)格單元還預(yù)測(cè)?個(gè)條件類別概率?。這些概率以包含目標(biāo)的網(wǎng)格單元為條件允蜈。每個(gè)網(wǎng)格單元grid cell我們只預(yù)測(cè)的一組類別概率冤吨,而不管邊界框的的數(shù)量?是多少。(這里的一組指的是只保留一組(20個(gè))分類饶套,所以最后每個(gè)網(wǎng)格的維度是5(xywhc)+5(xywhc)+20(class)漩蟆,省略了另外一個(gè)20)。
解讀:
Loss=回歸檢測(cè)框 + 預(yù)測(cè)置信度(物體性)+ 預(yù)測(cè)是背景的分?jǐn)?shù)+預(yù)測(cè)物體類別
我們使用平方和衡量坐標(biāo)誤差妓蛮,因?yàn)樗苋菀走M(jìn)行優(yōu)化怠李,但是它并不完全符合我們最大化平均精度的目標(biāo)。
分類誤差與定位誤差的權(quán)重是一樣的蛤克,這可能并不理想捺癞。
另外滚澜,在每張圖像中申窘,許多網(wǎng)格單元不包含任何對(duì)象。這將導(dǎo)致這些單元格的“置信度”分?jǐn)?shù)趨向零维蒙,通常壓倒了包含目標(biāo)的單元格的梯度儿倒。這可能導(dǎo)致模型不穩(wěn)定版保,從而導(dǎo)致訓(xùn)練早期發(fā)散。
權(quán)重的分配:為了解決上述問題夫否,在loss函數(shù)中增加了邊框坐標(biāo)的loss彻犁,讓loss更注重調(diào)整位置;減小了不含物體框的置信度的loss凰慈。用λcoord=5和λnoobj=0.5來完成這個(gè)過程汞幢。有物體的box 的置信度loss和網(wǎng)格的類別loss權(quán)重為1。
權(quán)重的理解:簡(jiǎn)言之就是大多數(shù)網(wǎng)格與box并不包含object微谓,正負(fù)樣本不均衡森篷,比如輸出7730的張量中可能大多數(shù)無物體confidence是代入
框與gt的匹配:雖然YOLO每個(gè)網(wǎng)格預(yù)測(cè)多個(gè)框前联,但是在訓(xùn)練的時(shí)候功戚,<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">對(duì)于每個(gè)物體,我們只想讓一個(gè)框去負(fù)責(zé)預(yù)測(cè)這個(gè)物體似嗤。我們就讓與這個(gè)gt框有最高IOU值的框負(fù)責(zé)預(yù)測(cè)這個(gè)物體</mark>啸臀。這將讓框預(yù)測(cè)更specialization。每個(gè)預(yù)測(cè)更好地預(yù)測(cè)固定的大小烁落,比率或者物體類表乘粒,提供了整體召回率。
?與?的理解:?表示由第i個(gè)網(wǎng)格中第j個(gè)邊界框預(yù)測(cè)器負(fù)責(zé)預(yù)測(cè)顽馋,結(jié)合分配gt的理解方式即?的個(gè)數(shù)等于gt框的個(gè)數(shù)谓厘。此外需要注意的是如果box所在的框不是物體的中心,只會(huì)代入loss中的
如果某個(gè)單元格中沒有目標(biāo),則不對(duì)分類誤差進(jìn)行反向傳播;B個(gè)bbox中與GT具有最高IoU的一個(gè)進(jìn)行坐標(biāo)誤差的反向傳播,其余不進(jìn)行.
大小框誤差規(guī)模的解決:對(duì)于大box來說與groundtruth差1毫米可能無所謂巾陕,但對(duì)于小box來說偏差很謹(jǐn)慎讨跟。small deviations in large boxes matter less than in small boxes. 為了部分解決這個(gè)問題,我們直接預(yù)測(cè)邊界框<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">寬度和高度的平方根</mark>鄙煤,而不是寬度和高度晾匠。(聯(lián)想根號(hào)x圖像:小box 的橫軸值較小,發(fā)生偏移時(shí)梯刚,反應(yīng)到y(tǒng)軸上相比大 box 要大凉馆,較小的坐標(biāo)誤差比較大的邊界框更重要,更敏感。)
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n5208" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> ?
class_loss, 計(jì)算類別的損失,p
class_delta = response * (predict_classes - classes)#response查看哪個(gè)cell負(fù)責(zé)標(biāo)記object
class_loss = tf.reduce_mean( #平方差損失函數(shù)
tf.reduce_sum(tf.square(class_delta), axis=[1, 2, 3]),
name='class_loss') * self.class_scale # self.class_scale為損失函數(shù)前面的系數(shù)
?
有目標(biāo)的時(shí)候澜共,置信度損失函數(shù)
object_delta = object_mask * (predict_scales - iou_predict_truth)
用iou_predict_truth替代真實(shí)的置信度向叉,真的妙,佩服的5體投遞
object_loss = tf.reduce_mean( #平方差損失函數(shù)
tf.reduce_sum(tf.square(object_delta), axis=[1, 2, 3]),
name='object_loss') * self.object_scale
?
沒有目標(biāo)的時(shí)候嗦董,置信度的損失函數(shù)
noobject_delta = noobject_mask * predict_scales
noobject_loss = tf.reduce_mean( #平方差損失函數(shù)
tf.reduce_sum(tf.square(noobject_delta), axis=[1, 2, 3]),
name='noobject_loss') * self.noobject_scale
?
框坐標(biāo)的損失母谎,只計(jì)算有目標(biāo)的cell中iou最大的那個(gè)框的損失,即用這個(gè)iou最大的框來負(fù)責(zé)預(yù)測(cè)這個(gè)框京革,其它不管销睁,乘以0
coord_mask = tf.expand_dims(object_mask, 4) # object_mask其維度為:[batch_size, 7, 7, 2], 擴(kuò)展維度之后變成[batch_size, 7, 7, 2, 1]
boxes_delta = coord_mask * (predict_boxes - boxes_tran) #predict_boxes維度為: [batch_size, 7, 7, 2, 4]存崖,這些框的坐標(biāo)都是偏移值
coord_loss = tf.reduce_mean( #平方差損失函數(shù)
tf.reduce_sum(tf.square(boxes_delta), axis=[1, 2, 3, 4]),
name='coord_loss') * self.coord_scale</pre>
使用了0.5的dropout。數(shù)據(jù)增強(qiáng)
至此睡毒,我們就訓(xùn)練好了網(wǎng)絡(luò)来惧。而當(dāng)測(cè)試的時(shí)候,我們還要做一些改變演顾。
Pr(Object)是不是就是上面的1ij
1.5 test
定義:類別置信度 = 條件類別概率 * 置信度供搀,?
即每個(gè)網(wǎng)格預(yù)測(cè)的class信息乘以每個(gè)bounding box預(yù)測(cè)的confidence信息。這得到了 每個(gè)bounding box特定類別的置信度分?jǐn)?shù)(暫且叫做:類別置信度)钠至。類別置信度包含了類別在框中出現(xiàn)的概率以及預(yù)測(cè)框與物體的擬合程度葛虐。
左式第一項(xiàng)為每個(gè)網(wǎng)格預(yù)測(cè)的類別信息,第二棉钧、三項(xiàng)為每個(gè)bounding box預(yù)測(cè)的confidence屿脐。
它為我們提供了<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);"><u style="box-sizing: border-box;">每個(gè)bounding box特定類別</u>的置信度分?jǐn)?shù)(暫且叫做:類別置信度)</mark>。
得到每個(gè) box 的 class-specific confidence score 以后宪卿,設(shè)置閾值的诵,濾掉得分低的 boxes,對(duì)保留的 boxes 進(jìn)行 NMS 處理佑钾,就得到最終的檢測(cè)結(jié)果西疤。
類別置信度表示屬于特定類別(狗,貓休溶,香蕉代赁,汽車等)的檢測(cè)對(duì)象的概率。 在v3之前兽掰,YOLO曾經(jīng)用softmax評(píng)分芭碍。
但是,該設(shè)計(jì)選擇已經(jīng)在V3中被刪除禾进,作者選擇使用sigmoid豁跑。 原因是Softmax會(huì)假設(shè)預(yù)測(cè)是相互排斥的。 簡(jiǎn)而言之,如果一個(gè)對(duì)象屬于一個(gè)類艇拍,那么它保證它不能屬于另一個(gè)類狐蜕。
但是,如果類別中有woman和preson兩個(gè)類別卸夕,那么softmax最終的預(yù)測(cè)只有一個(gè)层释,woman或者person,但是sigmoid可以實(shí)現(xiàn)woman和person快集。 這就是作者們避免使用Softmax激活的原因贡羔。
類別置信度在輸出的7730張量并沒有直觀表示的,而是需要我們計(jì)算得出个初。如下圖乖寒,對(duì)于每個(gè)網(wǎng)格grid cell。
如上倆圖所示院溺,同一個(gè)grid cell有2個(gè)box楣嘁,所以得到2組類別置信度。每組類別置信度是用每個(gè)box的confidence乘以同一網(wǎng)格的類別概率得到的珍逸。這里還想說明的是既然后面乘的是同一組概率逐虚,那么兩組類別置信度還是與置信度乘正比的,因?yàn)槌说母怕室欢ㄗ簧拧R驗(yàn)楦怕实淖畲笾祵?duì)應(yīng)的類別是確定的叭爱,所以兩組類別置信度算出來的box只能被網(wǎng)絡(luò)認(rèn)為是同一分類,不可能出現(xiàn)同一grid cell不同分類的情況的漱病。
雖然每個(gè)格子可以預(yù)測(cè) B 個(gè) bounding box买雾,但是最終只選擇 IOU 最高的 bounding box 作為物體檢測(cè)輸出,即每個(gè)格子最多只預(yù)測(cè)出一個(gè)物體杨帽。當(dāng)物體占畫面比例較小凝果,如圖像中包含畜群或鳥群時(shí),每個(gè)格子包含多個(gè)物體睦尽,但卻只能檢測(cè)出其中一個(gè)器净。這是 YOLO 方法的一個(gè)缺陷。
接著每個(gè)網(wǎng)格都計(jì)算出了2個(gè)置信度向量当凡,如下面3張流程圖山害,注意找不同。
共得到772=98個(gè)類別置信度向量(豎條黃色線)沿量。
接下來我們從每類的視角分析類別置信度浪慌,比如對(duì)于狗類來說,狗的類別置信度都是在類別置信度向量的第一個(gè)位置朴则。(狗是橫條紅虛線)
第一步我們先將每一橫條中少于一定閾值thresh的數(shù)值置為0权纤,比如小于0.2,這步稱為set zero。然后以豎條為單位汹想,將狗的類別置信度(紅線)從大到小排列外邓,這樣大值在前,最后是0古掏,這步稱為sort descending损话。然后對(duì)狗進(jìn)行非極大值抑制NMS操作,以防止同一物體被幾個(gè)框同時(shí)圈到槽唾,很多余丧枪。
得到每個(gè) box 的 類別置信度class-specific confidence score 以后,首先設(shè)置閾值庞萍,濾掉得分低的 boxes拧烦,然后對(duì)保留的 boxes 進(jìn)行 NMS 處理,就得到最終的檢測(cè)結(jié)果钝计。(設(shè)置閾值代表20種class中只會(huì)留很少的class屎篱,NMS非極大值抑制的主要作用是某個(gè)物體被幾個(gè)框選擇到了,我們把多余的框過濾只要最準(zhǔn)確的那個(gè)框)葵蒂。NMS是通過類別置信度來篩選的。
注:
NMS原理: 首先從所有的預(yù)測(cè)框中找到置信度最大的那個(gè)bbox(已經(jīng)排好序放到最前面了)重虑,然后挨個(gè)計(jì)算其與剩余bbox的IOU践付,如果IoU值大于一定閾值(重合度過高,如0.5)缺厉,那么就將該類別置信度值置為0永高,把該bbox剔除;然后對(duì)剩余的預(yù)測(cè)框重復(fù)上述過程提针,直到處理完所有的檢測(cè)框命爬。
雖然每個(gè)格子可以預(yù)測(cè) B 個(gè) bounding box,但是最終只選擇只選擇 IOU 最高的 bounding box 作為物體檢測(cè)輸出辐脖,即<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">每個(gè)格子最多只預(yù)測(cè)出一個(gè)物體</mark>饲宛。當(dāng)物體占畫面比例較小,如圖像中包含畜群或鳥群時(shí)嗜价,每個(gè)格子包含多個(gè)物體艇抠,但卻只能檢測(cè)出其中一個(gè)。這是 YOLO 方法的一個(gè)缺陷*久锥。
附:NMS示例:
狗類別的置信度效果如圖所示NMS進(jìn)行后,很多類別置信度被置為0了瑟由。(實(shí)際上我此時(shí)也不清楚到底內(nèi)存空間里里有沒有存放類別置信度絮重,我覺得很可能沒用,這里“類別置信度置為0”只是把之前的置信度confidence置為0了,同樣的效果)青伤。然后我們就可以如上圖算NMS后的督怜,每個(gè)box的類別置信度向量,其中每一條的最大值即為這個(gè)box的預(yù)測(cè)類別潮模。(很多box都沒0稱為背景了)亮蛔。
然后我們依次計(jì)算每個(gè)box的最大值,每1豎條的最大值即該box的預(yù)測(cè)類別擎厢。下圖表示第一個(gè)box是物體1.7 YOLOv1結(jié)語(yǔ)
YOLO的特點(diǎn):
YOLO 對(duì)相互靠的很近的物體动遭,還有很小的群體檢測(cè)效果不好芬探,這是因?yàn)橐粋€(gè)網(wǎng)格中只預(yù)測(cè)了兩個(gè)框,并且只屬于一類厘惦。
同一類物體出現(xiàn)的新的不常見的長(zhǎng)寬比和其他情況時(shí)偷仿,泛化能力偏弱。
由于損失函數(shù)的問題宵蕉,定位誤差是影響檢測(cè)效果的主要原因酝静。尤其是大小物體的處理上,還有待加強(qiáng)羡玛。
速度特別快别智,泛化能力強(qiáng),提供速度稼稿,降低了精度
但小物體薄榛,重疊物體無法檢測(cè)
v1對(duì)于整個(gè)yolo系列的價(jià)值,即v2/v3還保留的特性让歼,可以總結(jié)為3點(diǎn):
leaky ReLU敞恋,相比普通ReLU,leaky并不會(huì)讓負(fù)數(shù)直接為0谋右,而是乘以一個(gè)很小的系數(shù)(恒定)硬猫,保留負(fù)數(shù)輸出,但衰減負(fù)數(shù)輸出改执;公式如下: y=x,x>0浦徊;y=0.1x,otherwise
分而治之,用網(wǎng)格來劃分圖片區(qū)域天梧,每塊區(qū)域獨(dú)立檢測(cè)目標(biāo)盔性;
端到端訓(xùn)練。損失函數(shù)的反向傳播可以貫穿整個(gè)網(wǎng)絡(luò)呢岗,這也是one-stage檢測(cè)算法的優(yōu)勢(shì)冕香。
待解決問題
最后為什么要用全連接蛹尝? 直接從7×7×1024卷積到7×7×30不就可以了?為什么中間要有個(gè)4096全連接悉尾?
后續(xù):YOLOv2(9000)突那,YOLOv3
YOLOv1參考:
翻譯:http://www.reibang.com/p/a2a22b0c4742(md格式)
解讀:https://blog.csdn.net/guleileo/article/details/80581858
代碼:https://github.com/gliese581gg/YOLO_tensorflow
視頻:https://www.bilibili.com/video/av23354360
PPT:https://drive.google.com/file/d/164mVbMBhoMzY5pkaEOdK3IIcIwTOj2B-/view
解讀:https://blog.csdn.net/baidu_27643275/article/details/82789212
解讀:https://zhuanlan.zhihu.com/p/31427164
解讀:https://blog.csdn.net/leviopku/article/details/82660381
YOLOv2
YOLOv2快過Faster R-CNN,SSD
這篇文章一共介紹了YOLO v2和YOLO9000兩個(gè)模型构眯,二者略有不同愕难。前者主要是YOLOv1的升級(jí)版,后者的主要檢測(cè)網(wǎng)絡(luò)也是YOLO v2惫霸,同時(shí)對(duì)數(shù)據(jù)集做了融合猫缭,使得模型可以檢測(cè)9000多類物體。而提出YOLO9000的原因主要是目前檢測(cè)的數(shù)據(jù)集數(shù)據(jù)量較小壹店,因此利用數(shù)量較大的分類數(shù)據(jù)集來幫助訓(xùn)練檢測(cè)模型猜丹。
Better,F(xiàn)aster部分講YOLOv2硅卢;Stronger講YOLOv3
2.1 Better更好
2.1.1 Batch Normalization:
使用 Batch Normalization 對(duì)網(wǎng)絡(luò)進(jìn)行優(yōu)化射窒。對(duì)網(wǎng)絡(luò)的每一層的輸入都做了歸一化,這樣網(wǎng)絡(luò)就不需要每層都去學(xué)數(shù)據(jù)的分布将塑,讓網(wǎng)絡(luò)提高了收斂性脉顿,更快收斂,同時(shí)還消除了對(duì)其他形式的正則化(regularization)的依賴点寥。
使用 Batch Normalization 可以從模型中去掉 Dropout艾疟,而不會(huì)產(chǎn)生過擬合。
通過對(duì) YOLO 的每一個(gè)卷積層增加 Batch Normalization开财,最終使得 mAP 提高了 2%,同時(shí)還使模型正則化误褪。YOLO3代均采用BN责鳍。
2.1.2 High resolution classifier
目前業(yè)界標(biāo)準(zhǔn)的檢測(cè)方法,都要先把分類器(即卷積分類網(wǎng)絡(luò))放在ImageNet上進(jìn)行預(yù)訓(xùn)練兽间,這樣卷積網(wǎng)絡(luò)對(duì)物體更敏感历葛。在預(yù)訓(xùn)練的基礎(chǔ)上對(duì)網(wǎng)絡(luò)進(jìn)行改進(jìn)與進(jìn)一步訓(xùn)練。從 Alexnet 開始嘀略,大多數(shù)的分類器都運(yùn)行在小于 256×256 的圖片上恤溶,因?yàn)橐话闶穷A(yù)訓(xùn)練的ImageNet。而現(xiàn)在 YOLO 從 224×224 增加到了 448×448帜羊,這就意味著網(wǎng)絡(luò)需要適應(yīng)新的輸入分辨率咒程。
為了適應(yīng)新的分辨率,YOLO v2 的分類網(wǎng)絡(luò)以 448×448 的分辨率先在 ImageNet上進(jìn)行微調(diào)讼育,微調(diào) 10 個(gè) epochs帐姻,讓網(wǎng)絡(luò)有時(shí)間調(diào)整濾波器(filters)稠集,好讓其能更好的運(yùn)行在新分辨率上,還需要調(diào)優(yōu)用于檢測(cè)的 Resulting Network饥瓷。最終通過使用高分辨率剥纷,mAP 提升了 4%。
2.1.3 Convolution with anchor boxes
YOLO 一代包含有全連接層呢铆,從而能直接預(yù)測(cè) Bounding Boxes 的坐標(biāo)值晦鞋。 Faster R-CNN 只用卷積層與 Region Proposal Network 來預(yù)測(cè) Anchor Box 偏移值offset與置信度(前景得分),而不是直接預(yù)測(cè)坐標(biāo)值棺克。作者發(fā)現(xiàn)通過預(yù)測(cè)偏移量offset而不是坐標(biāo)值能夠簡(jiǎn)化問題悠垛,讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)起來更容易。
所以 YOLOv2 去掉了全連接層逆航,使用 Anchor Boxes 來預(yù)測(cè) Bounding Boxes鼎文。作者去掉了網(wǎng)絡(luò)中一個(gè)全連接和一個(gè)池化層,這讓卷積層的輸出能有更高的分辨率因俐。
用 416×416 大小的輸入代替原來448×448拇惋。由于圖片中的物體都傾向于出現(xiàn)在圖片的中心位置,特別是那種比較大的物體抹剩,所以有一個(gè)單獨(dú)位于物體中心的位置用于預(yù)測(cè)這些物體撑帖。YOLO 的卷積層采用 32 這個(gè)值來下采樣圖片,所以通過選擇 416×416 用作輸入尺寸最終能輸出一個(gè) 13×13 的特征圖澳眷。(416/2^5=13)
使用 Anchor Box 會(huì)讓精確度稍微下降胡嘿,但用了它能讓 YOLOv2 能預(yù)測(cè)出大于一千個(gè)框,同時(shí) recall 達(dá)到88%钳踊,mAP 達(dá)到 69.2%衷敌。
without anchor | 69.5 mAP | 81% recall |
---|---|---|
with anchor | 69.2 mAP:降低0.3 | 88% recall:提升7. |
2.1.4 Dimension clusters
之前 Anchor Box 的尺寸是手動(dòng)選擇的(一般指faster rcnn中的anchor),所以尺寸還有優(yōu)化的余地拓瞪。 為了優(yōu)化缴罗,在訓(xùn)練集的 Bounding Boxes 上跑一下 k-means聚類,來為anchor找到一個(gè)比較好的初始值祭埂。(anchor基本等同于prior)
如果我們用標(biāo)準(zhǔn)的歐式距離的 k-means面氓,尺寸大的框比小框產(chǎn)生更多的錯(cuò)誤。因?yàn)槲覀兊哪康氖翘岣?IOU 分?jǐn)?shù)蛆橡,我們對(duì)好壞的標(biāo)準(zhǔn)是IOU值舌界,而與 Box 的大小無關(guān),所以距離度量的使用下面公式更好:
?
通過分析實(shí)驗(yàn)結(jié)果(Figure 2)泰演,左圖:在模型復(fù)雜性與 high recall 之間權(quán)衡之后呻拌,選擇聚類分類數(shù) K=5。
結(jié)果是矮寬框較少睦焕,而高瘦框多柏锄。
Table1 表面用k聚類和原始的anchor box時(shí)的平均IOU酿箭。(這個(gè)平均IOU是與gt框最接近的prior的IOU的平均數(shù))可以看出使用5個(gè)prior的平均IOU(61%)就好過了原來使用8個(gè)anchor的平均準(zhǔn)確率(60.9%)。當(dāng)選用9個(gè)prior時(shí)趾娃,效果更明顯缭嫡,平均準(zhǔn)確率達(dá)到了67.2%,可見用k聚類很有效抬闷。
Box Generation | # | Avg IOU |
---|---|---|
Cluster SSE | 5 | 58.7 |
Cluster IOU | 5 | 61 |
Anchor Boxes | 9 | 60.9 |
Cluster IOU | 9 | 67.2 |
cfg文件中的內(nèi)容
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)
應(yīng)該是很對(duì)于卷積圖13×13
2.1.5 Direct location prediction
用 Anchor Box 的方法妇蛀,會(huì)讓 model 變得不穩(wěn)定,尤其是在最開始的幾次迭代的時(shí)候笤成。大多數(shù)不穩(wěn)定因素產(chǎn)生自預(yù)測(cè) Box 的(x,y)位置的時(shí)候评架。
因?yàn)橄裨赗PN網(wǎng)絡(luò)中使用的offset策略:?,?】挥荆可想而知纵诞,只要t=-1和1這個(gè)框就可能偏移了整張圖像,這使訓(xùn)練話費(fèi)較長(zhǎng)時(shí)間趨于穩(wěn)定培遵。
與RPN不同浙芙,YOLOv2還是像YOLOv1一樣,預(yù)測(cè)的t是與網(wǎng)格相關(guān)的籽腕。假設(shè)一個(gè)網(wǎng)格的大小是1嗡呼,只要在t輸出之前加一個(gè)sigmoid即可讓比例t在0-1之間,從而讓框的中心點(diǎn)限制在一個(gè)網(wǎng)格中皇耗。
每個(gè)網(wǎng)格負(fù)責(zé)預(yù)測(cè)5個(gè)priors南窗,即預(yù)測(cè)框。每個(gè)框有5個(gè)坐標(biāo) tx郎楼,ty万伤,tw,th呜袁,t0敌买。令cx,cy為網(wǎng)格左上角的坐標(biāo)傅寡,pw,ph為prior的寬高放妈,to是置信度(置信度:含有物體的概率 × 與gt的IOU)北救。即可得到預(yù)測(cè)框的計(jì)算公式:
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="93.268ex" height="3.044ex" viewBox="0 -906.7 40157.1 1310.7" role="img" focusable="false" style="vertical-align: -0.755ex; margin-bottom: -0.183ex; max-width: 79900px;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(8028,0)"><g transform="translate(-15,0)"><g transform="translate(0,-31)"><g transform="translate(23645,0)"><text font-family="STIXGeneral,'Arial Unicode MS',serif" stroke="none" transform="scale(50.259) matrix(1 0 0 -1 0 0)">荐操,</text></g></g></g></g></g></svg>
因?yàn)槭褂昧讼拗谱寯?shù)值變得參數(shù)化,也讓網(wǎng)絡(luò)更容易學(xué)習(xí)珍策、更穩(wěn)定托启。使用聚類Dimension clusters和直接位置預(yù)測(cè)Direct location prediction的方法,使 YOLO 比其他使用 Anchor Box 的版本提高了近5%攘宙。
別處說:從第四行可以看出屯耸,anchor機(jī)制只是試驗(yàn)性在yolo_v2上鋪設(shè)拐迁,一旦有了dimension priors就把a(bǔ)nchor拋棄了。最后達(dá)到78.6mAP的成熟模型上也沒用anchor boxes疗绣。
沒有anchor哪來的pw线召?
2.1.6 Fine-Grained Features
經(jīng)YOLOv1修改后的YOLOv2,在13×13的特征圖上進(jìn)行預(yù)測(cè)(YOLOv1是7×7)多矮。雖然這對(duì)大物體檢測(cè)來說用不著這么細(xì)粒度的特征圖缓淹,但他更多的是使用細(xì)粒度特征對(duì)定位小物體有好處。
Faster-RCNN塔逃、SSD 都使用了多尺寸的特征圖來進(jìn)行預(yù)測(cè)讯壶,以獲得不同的分辨率。而YOLOv2僅僅在26×26的特征層上添加一個(gè)<mark style="box-sizing: border-box; background: rgb(255, 255, 0); color: rgb(0, 0, 0);">passthrough層</mark>湾盗。這個(gè)層像之前ResNet中的identity mappings一樣伏蚊,堆疊concat(聯(lián)系)高分辨率特征與地分辨率特征,stacking adjacent features into different channels instead of spatial locations格粪。這使 26×26×512 特征層變成 13×13×2048躏吊,然后就可以堆疊到后一層特征圖上了。
passthrough層與ResNet網(wǎng)絡(luò)的shortcut類似匀借,以前面更高分辨率的特征圖為輸入颜阐,然后將其連接到后面的低分辨率特征圖上。前面的特征圖維度是后面的特征圖的2倍吓肋,passthrough層抽取前面層的每個(gè) ?的局部區(qū)域凳怨,然后將其轉(zhuǎn)化為channel維度,對(duì)于 ?的特征圖是鬼,經(jīng)passthrough層處理之后就變成了 ?的新特征圖(特征圖大小降低4倍肤舞,而channles增加4倍),這樣就可以與后面的?(最后一層) 特征圖連接在一起形成 ? 大小的特征圖均蜜,然后在此特征圖基礎(chǔ)上卷積做預(yù)測(cè)李剖。在YOLO的C源碼中,passthrough層稱為reorg layer囤耳。在TensorFlow中篙顺,可以使用tf.extract_image_patches或者tf.space_to_depth來實(shí)現(xiàn)passthrough層:
<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="python" cid="n5363" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 0px; margin-top: 15px; width: inherit;"> out = tf.extract_image_patches(in, [1, stride, stride, 1], [1, stride, stride, 1], [1,1,1,1], padding="VALID")
// or use tf.space_to_depth
out = tf.space_to_depth(in, 2)</pre>
另外,作者在后期的實(shí)現(xiàn)中借鑒了ResNet網(wǎng)絡(luò)充择,不是直接對(duì)高分辨特征圖處理德玫,而是增加了一個(gè)中間卷積層,先采用64個(gè) ?卷積核進(jìn)行卷積椎麦,然后再進(jìn)行passthrough處理宰僧,這樣 ?的特征圖得到 ? 的特征圖。這算是實(shí)現(xiàn)上的一個(gè)小細(xì)節(jié)观挎。使用Fine-Grained Features之后YOLOv2的性能有1%的提升琴儿。
2.1.7 Multi-Scale Training
作者希望 YOLOv2 能健壯地運(yùn)行于不同尺寸的圖片之上段化,所以把這一想法用于訓(xùn)練模型中。 簡(jiǎn)單地說就是輸入大小的圖像不一樣來訓(xùn)練造成。檢測(cè)數(shù)據(jù)集fine tune時(shí)候才這么做显熏,預(yù)訓(xùn)練不改變。
區(qū)別于之前固定圖片尺寸的做法,YOLOv2 每迭代幾次都會(huì)改變網(wǎng)絡(luò),修改最后檢測(cè)層的處理褒搔。每 10 個(gè) Batch,網(wǎng)絡(luò)會(huì)隨機(jī)地選擇一個(gè)新的圖片尺寸履肃。由于使用了下采樣參數(shù)是 32,所以不同的尺寸大小也選擇為 32 的倍數(shù) {320坐桩,352…..608}(分別是10尺棋,11...19倍),最小 320×320绵跷,最大 608×608膘螟,網(wǎng)絡(luò)會(huì)自動(dòng)改變尺寸,并繼續(xù)訓(xùn)練的過程碾局。
這一策略讓網(wǎng)絡(luò)在不同的輸入尺寸上都能達(dá)到一個(gè)很好的預(yù)測(cè)效果荆残,同一網(wǎng)絡(luò)能在不同分辨率上進(jìn)行檢測(cè)。當(dāng)輸入圖片尺寸比較小的時(shí)候跑的比較快净当,輸入圖片尺寸比較大的時(shí)候精度高内斯,所以你可以在 YOLOv2 的速度和精度上進(jìn)行權(quán)衡。
輸入分辨率高的時(shí)候準(zhǔn)確率高
2.2 Faster
一張224×224的圖片通過VGG16要經(jīng)過306.9億浮點(diǎn)運(yùn)算像啼,為了更快俘闯,網(wǎng)絡(luò)沒必要像VGG16這么復(fù)雜。
YOLOv2用基于GoogleNet的自定義的網(wǎng)絡(luò)忽冻,一次前向傳播只要85.2億次浮點(diǎn)運(yùn)算真朗,雖然準(zhǔn)確率較VGG16有所下降,在ImageNet上從90%下降到了88%僧诚。
2.2.1 Darknet-19
也是用3×3的卷積遮婶,池化后的通道數(shù)也變?yōu)?倍。像Network-in-Network NIN一樣湖笨,采用全局平均池化旗扑,在3×3卷積直接用1×1的過濾器壓縮特征表達(dá)。用了BN加速收斂赶么,穩(wěn)定訓(xùn)練肩豁,正則化模型脊串。
因?yàn)橛?9個(gè)卷積層和5個(gè)最大池化辫呻,所以叫Darknet-19清钥。表6即為模型。處理一張圖片只需要55.8億次運(yùn)算放闺,在Imagenet上72.9%的top-1準(zhǔn)確率祟昭,91.2%的top-5.
這個(gè)網(wǎng)絡(luò)包含19個(gè)卷積層和5個(gè)max pooling層,而在YOLO v1中采用的GooleNet怖侦,包含24個(gè)卷積層和2個(gè)全連接層篡悟,因此Darknet-19整體上卷積卷積操作比YOLO v1中用的GoogleNet要少,這是計(jì)算量減少的關(guān)鍵匾寝。最后用average pooling層代替全連接層進(jìn)行預(yù)測(cè)搬葬。這個(gè)網(wǎng)絡(luò)在ImageNet上取得了top-5的91.2%的準(zhǔn)確率。
2.2.2 Training for classification預(yù)訓(xùn)練
training for classification都是在ImageNet上進(jìn)行預(yù)訓(xùn)練艳悔,主要分兩步:
從頭開始在ImageNet1000上預(yù)訓(xùn)練160epoch急凰,此時(shí)的輸入圖像大小是224×224,初始學(xué)習(xí)率0.1猜年,權(quán)重衰減0.0005抡锈,動(dòng)量0.9。數(shù)據(jù)增強(qiáng)方式包括隨機(jī)裁剪乔外,旋轉(zhuǎn)以及色度床三,亮度的調(diào)整等。
在224×224上預(yù)訓(xùn)練后杨幼,再拿448×448的輸入訓(xùn)練撇簿,訓(xùn)練參數(shù)與上相同,不同處在于10個(gè)epoch差购,初始學(xué)習(xí)率為0.001补疑。
結(jié)果表明fine-tuning后的top-1準(zhǔn)確率為76.5%,top-5準(zhǔn)確率為93.3%歹撒。
而原來的訓(xùn)練方式莲组,Darknet-19的top-1準(zhǔn)確率是72.9%,top-5準(zhǔn)確率為91.2%暖夭。因此可以看出第1,2兩步分別從網(wǎng)絡(luò)結(jié)構(gòu)和訓(xùn)練方式兩方面入手提高了主網(wǎng)絡(luò)的分類準(zhǔn)確率锹杈。
2.2.3 Training for detection微調(diào)訓(xùn)練
之前training for classification的操作相當(dāng)于是預(yù)訓(xùn)練,只是簡(jiǎn)單地進(jìn)行分類迈着,沒有檢測(cè)的過程竭望。所以遷移到檢測(cè)的網(wǎng)絡(luò)上時(shí)需要對(duì)網(wǎng)絡(luò)做一些修改,而保持主題框架的權(quán)重不變裕菠,這使網(wǎng)絡(luò)對(duì)物體已經(jīng)有了一定的敏感程度咬清。
所以此處去掉最后一個(gè)卷積,池化層和softmax層,
新增3個(gè)3×3×1024的卷積旧烧,再加一個(gè)1×1卷積影钉。輸入的維度為anchors×(5+classes)。還加了一個(gè)passthrouth層掘剪,起始點(diǎn)為3×3×512層的最后一層到倒數(shù)第二層平委。
對(duì)于VOC數(shù)據(jù),由于每個(gè)grid cell我們需要預(yù)測(cè)5個(gè)box夺谁,每個(gè)box有5個(gè)坐標(biāo)值和20個(gè)類別值廉赔,所以每個(gè)grid cell有125個(gè)filter。有5個(gè)預(yù)測(cè)框anchor匾鸥,每個(gè)預(yù)測(cè)框有5個(gè)坐標(biāo)t和20類蜡塌,所以一共有5×(5+20)=125個(gè)通道。
T=(batchsize,13,13,125)reshape成(batchsize,13,13,5,25)勿负。所以T[...,0:4]為邊界框的位置和大小岗照,T...,4]為對(duì)應(yīng)的置信度。T[...,5:]為該框?qū)?yīng)的預(yù)測(cè)值笆环。
匹配規(guī)則(分配lavel):對(duì)于訓(xùn)練圖片的gt攒至,由該gt中心點(diǎn)所在的網(wǎng)格cell進(jìn)行預(yù)測(cè),5個(gè)中與gt有最大IOU的那個(gè)anchor負(fù)責(zé)預(yù)測(cè)躁劣,剩余4個(gè)不與該gt匹配迫吐。
匹配原則,對(duì)于某個(gè)ground truth账忘,首先要確定其中心點(diǎn)要落在哪個(gè)cell上志膀,然后計(jì)算這個(gè)cell的5個(gè)先驗(yàn)框與ground truth的IOU值(YOLOv2中bias_match=1),計(jì)算IOU值時(shí)不考慮坐標(biāo)鳖擒,只考慮形狀溉浙,所以先將先驗(yàn)框與ground truth的中心點(diǎn)都偏移到同一位置(原點(diǎn)),然后計(jì)算出對(duì)應(yīng)的IOU值蒋荚,IOU值最大的那個(gè)先驗(yàn)框與ground truth匹配戳稽,對(duì)應(yīng)的預(yù)測(cè)框用來預(yù)測(cè)這個(gè)ground truth。
YOLOv1中采用的是平方根以降低boxes的大小對(duì)誤差的影響期升,而YOLOv2是直接計(jì)算惊奇,但是根據(jù)ground truth的大小對(duì)權(quán)重系數(shù)進(jìn)行修正:l.coord_scale * (2 - truth.w*truth.h)(這里w和h都?xì)w一化到(0,1)),這樣對(duì)于尺度較小的boxes其權(quán)重系數(shù)會(huì)更大一些播赁,可以放大誤差颂郎,起到和YOLOv1計(jì)算平方根相似的效果(參考YOLO v2 損失函數(shù)源碼分析)。
YOLOv2的官方訓(xùn)練權(quán)重文件轉(zhuǎn)換了TensorFlow的checkpoint文件(下載鏈接)
這里訓(xùn)練的參數(shù)如下:160個(gè)epoch容为,學(xué)習(xí)率0.001乓序,并且在第60和90epoch的時(shí)候?qū)W(xué)習(xí)率除以10寺酪,weight decay采用0.0005,動(dòng)量0.9替劈。也有數(shù)據(jù)增強(qiáng)的內(nèi)容:crop寄雀,color shifting等
2.3 Stronger
這里只是為了可以預(yù)測(cè)9000個(gè)類,簡(jiǎn)略看看即可抬纸。總結(jié)一句話就是這么多類其實(shí)是一個(gè)樹耿戚,根節(jié)點(diǎn)是物體的概率湿故。樹下結(jié)點(diǎn)的概率是每個(gè)類的概率,但是這個(gè)概率是在上一層數(shù)概率的基礎(chǔ)上膜蛔,即條件概率坛猪。因?yàn)槭菞l件概率,所以任一節(jié)點(diǎn)下的同層子節(jié)點(diǎn)可以用softmax函數(shù)歸一化皂股。如果要算某個(gè)結(jié)點(diǎn)類的概率墅茉,即該結(jié)點(diǎn)到根節(jié)點(diǎn)所有概率值相乘,這也是和條件概率公式符合的呜呐。
檢測(cè)數(shù)據(jù)集只有普通的標(biāo)簽就斤,如“貓”,“狗”蘑辑。但是分類數(shù)據(jù)集有更具體的標(biāo)簽洋机,如把狗細(xì)分為”哈士奇“,”牛頭寡蠡辏“绷旗,”金毛狗“等。如果想在兩個(gè)數(shù)據(jù)集上訓(xùn)練副砍,需要一個(gè)一致性的方法融合這些標(biāo)簽衔肢。
眾多分類方法采用了softmax進(jìn)行計(jì)算概率分布。用了softmax是假設(shè)了各個(gè)類別是獨(dú)立的豁翎。你不想盲目地混合數(shù)據(jù)集角骤,因?yàn)榘袸mageNet中的金毛狗和COCO里的狗當(dāng)做不同類別是不合適的。
我們采用多標(biāo)簽?zāi)P腿〗M合這些數(shù)據(jù)集心剥,并且假設(shè)類別不是獨(dú)立的启搂,假定一張圖片可以由多個(gè)分類。
2.3.1 Hierarchical classification
ImageNet的標(biāo)簽名字是來自于WordNet刘陶,這是一個(gè)語(yǔ)言庫(kù)胳赌。
如 “Norfolk terrier” 和“Yorkshire terrier” 都是 “terrier” 活潑的狗的“下義詞”,而他是獵犬的一種匙隔,而獵犬是狗dog的一種疑苫,dog是犬科canine的一種。
WordNet 的結(jié)構(gòu)是一種直接圖表directed graph,而不是樹的一種捍掺,因?yàn)檎Z(yǔ)言是很復(fù)雜的撼短。比如狗同時(shí)是犬科和家畜的子集。但沒有使用全圖挺勿,而是建立了等級(jí)樹去簡(jiǎn)化問題曲横。
為了建立這個(gè)等級(jí)樹(分層樹),首先檢查 ImagenNet 中出現(xiàn)的名詞不瓶,再在 WordNet 中找到這些名詞禾嫉,再找到這些名詞到達(dá)他們根節(jié)點(diǎn)的路徑(在這里設(shè)所有的根節(jié)點(diǎn)為實(shí)體對(duì)象(physical object)。在 WordNet 中蚊丐,大多數(shù)同義詞只有一個(gè)路徑熙参,所以首先把這寫路徑中的詞全部都加到分層樹中。接著迭代地檢查剩下的名詞麦备,把他們添加到分層樹上孽椰,但要讓樹成長(zhǎng)盡可能少。比如由兩條路徑到底根節(jié)點(diǎn)凛篙,那么一條路徑添加了3條邊黍匾,而另一條僅添加了1條邊,添加的原則是取最短路徑加入到樹中呛梆。
最終結(jié)果是一個(gè)WordTree膀捷。在每個(gè)結(jié)點(diǎn)上預(yù)測(cè)了每個(gè)下義詞的條件概率,比如下"terrier"這個(gè)結(jié)點(diǎn)上我們預(yù)測(cè):
Pr(Norfolk terrierjterrier) Pr(Yorkshire terrierjterrier) Pr(Bedlington terrierjterrier)
....
如果我們想要計(jì)算一個(gè)特定結(jié)點(diǎn)的絕對(duì)概率削彬,我們僅需要簡(jiǎn)單地沿著該結(jié)點(diǎn)要根結(jié)點(diǎn)的路徑全庸,相乘,即可得到絕對(duì)該融痛。所以壶笼,比如我們想要知道Norfolk terrier 的概率時(shí),我們可以如下計(jì)算
Pr(Norfolk terrier) = Pr(Norfolk terrierjterrier) ?Pr(terrierjhunting dog) ? ... ? ?Pr(mammaljP r(animal) ?Pr(animaljphysical object)
對(duì)于分類雁刷,我們假定了圖像包含一個(gè)物體覆劈,Pr(physical object) = 1
為了沿著這個(gè)方法,我們用ImageNet-1000在Darknet-19模型上訓(xùn)練沛励。為了建立 WordtTree 1K责语,把所有中間詞匯加入到 WordTree 上,把標(biāo)簽空間從 1000 擴(kuò)大到了 1369目派。在訓(xùn)練過程中坤候,我們傳播gt類標(biāo),如果有一個(gè)圖片的標(biāo)簽是“Norfolk terrier”企蹭,那么這個(gè)圖片還會(huì)獲得”狗“(dog)以及“哺乳動(dòng)物”(mammal)等標(biāo)簽白筹≈悄總之現(xiàn)在一張圖片是多標(biāo)記的,標(biāo)記之間不需要相互獨(dú)立徒河。
為了計(jì)算條件概率系馆,我們模型預(yù)測(cè)一個(gè)1369個(gè)值的向量。之前的 ImageNet 分類是使用一個(gè)大 softmax 進(jìn)行分類顽照。而現(xiàn)在由蘑,WordTree 只需要對(duì)同一概念下的同義詞進(jìn)行 softmax 分類。
這種方法的好處:在對(duì)未知或者新的物體進(jìn)行分類時(shí)代兵,性能降低的很優(yōu)雅(gracefully)尼酿。比如看到一個(gè)狗的照片,但不知道是哪種種類的狗奢人,那么就高置信度(confidence)預(yù)測(cè)是”狗“谓媒,而其他狗的種類的同義詞如”哈士奇“”牛頭瓜海“”金毛“等這些則低置信度何乎。
2.3.2 Datasets combination with wordtree
用 WordTree 把數(shù)據(jù)集合中的類別映射到分層樹中的同義詞上,例如上圖 Figure 6土辩,WordTree 混合 ImageNet 與 COCO支救。
2.3.3 Joint classification and detection
作者的目的是:訓(xùn)練一個(gè) Extremely Large Scale 檢測(cè)器。所以訓(xùn)練的時(shí)候使用 WordTree 混合了 COCO 檢測(cè)數(shù)據(jù)集與 ImageNet 中的 Top9000 類拷淘,混合后的數(shù)據(jù)集對(duì)應(yīng)的 WordTree 有 9418 個(gè)類各墨。另一方面,由于 ImageNet 數(shù)據(jù)集太大了启涯,作者為了平衡一下兩個(gè)數(shù)據(jù)集之間的數(shù)據(jù)量贬堵,通過過采樣(oversampling) COCO 數(shù)據(jù)集中的數(shù)據(jù),使 COCO 數(shù)據(jù)集與 ImageNet 數(shù)據(jù)集之間的數(shù)據(jù)量比例達(dá)到 1:4结洼。
YOLO9000 的訓(xùn)練基于 YOLO v2 的構(gòu)架黎做,但是使用 3 priors 而不是 5 來限制輸出的大小。當(dāng)網(wǎng)絡(luò)遇到檢測(cè)數(shù)據(jù)集中的圖片時(shí)則正常地反方向傳播松忍,當(dāng)遇到分類數(shù)據(jù)集圖片的時(shí)候蒸殿,只使用分類的 loss 功能進(jìn)行反向傳播。同時(shí)作者假設(shè) IOU 最少為 0.3鸣峭。最后根據(jù)這些假設(shè)進(jìn)行反向傳播宏所。
使用聯(lián)合訓(xùn)練法,YOLO9000 使用 COCO 檢測(cè)數(shù)據(jù)集學(xué)習(xí)檢測(cè)圖片中的物體的位置摊溶,使用 ImageNet 分類數(shù)據(jù)集學(xué)習(xí)如何對(duì)大量的類別中進(jìn)行分類爬骤。
為了評(píng)估這一方法,使用 ImageNet Detection Task 對(duì)訓(xùn)練結(jié)果進(jìn)行評(píng)估莫换。
評(píng)估結(jié)果:
YOLO9000 取得 19.7 mAP盖腕。 在未學(xué)習(xí)過的 156 個(gè)分類數(shù)據(jù)上進(jìn)行測(cè)試赫冬, mAP 達(dá)到 16.0。
YOLO9000 的 mAP 比 DPM 高溃列,而且 YOLO 有更多先進(jìn)的特征劲厌,YOLO9000 是用部分監(jiān)督的方式在不同訓(xùn)練集上進(jìn)行訓(xùn)練,同時(shí)還能檢測(cè) 9000個(gè)物體類別听隐,并保證實(shí)時(shí)運(yùn)行补鼻。
YOLOv3
3.1 YOLOv3與YOLOv2比較
3.1.1 與YOLOv2相同的地方
框的表示方式:聚類anchor,預(yù)測(cè)的是t
激活函數(shù)leakly relu
端到端訓(xùn)練雅任,一個(gè)loss函數(shù)
batch normalization+leakly relu接在每層卷積之后
多尺度訓(xùn)練
3.1.2 YOLOv3與YOLOv2顯著區(qū)別
darknet-19改成darknet-53风范。后者還提供了tiny darknet版本,想要速度快就改用tiny darknet
-
類FPN結(jié)構(gòu):輸出3個(gè)尺度的feature map沪么,多尺度預(yù)測(cè)硼婿,每個(gè)尺度3個(gè)prior。prior聚類結(jié)果
10,13, 16,30, 33,23, 30,61, 62,45, 59,119, 116,90, 156,198, 373,326
殘差結(jié)構(gòu)禽车,v2沒有
3.2 分類網(wǎng)絡(luò) darknet-53
步長(zhǎng)為2的卷積也算入其中:53=1+1+ 1×2+1 + 2×2+1 + 8×2+1 + 8×2+1 + 4×2 + 1寇漫。最后的1可能是把FC算進(jìn)去了,在檢測(cè)網(wǎng)絡(luò)中會(huì)去掉變成darknet-52殉摔,但仍叫darknet-53
沒有池化層州胳,池化層是通過步長(zhǎng)為2的3×3卷積代替的。5次步長(zhǎng)為2的卷積逸月,與YOLOv2一樣縮放了32倍栓撞,所以輸入尺寸得是32的倍數(shù)。416/32=13
表一網(wǎng)絡(luò)中有些內(nèi)容沒有體現(xiàn)碗硬,比如Batch Normalization和leakly relu瓤湘,和YOLOv2一樣每個(gè)卷積后面都有著兩個(gè)步驟。所以我們把這3個(gè)內(nèi)容記為一個(gè)基本單元:DBL=卷積conv+BN+激活函數(shù)Leakly relu恩尾。我們記做大寫CONV弛说,與conv相區(qū)別。CONV中的卷積都是3×3的特笋,步長(zhǎng)為1或2剃浇。conv是1×1的,步長(zhǎng)為1猎物。
框內(nèi)的內(nèi)容為類似resnet的內(nèi)容虎囚。8×代表重復(fù)8次,有8次res連接蔫磨,res連接的具體內(nèi)容為先用CONV1×1卷積降低通道數(shù)淘讥,再用CONV3×3通道數(shù)恢復(fù)原來的通道數(shù),以減少一些浮點(diǎn)數(shù)運(yùn)算堤如,再與這兩個(gè)卷積之前的特征圖對(duì)應(yīng)元素相加蒲列。除了輸入大小外窒朋,在每個(gè)stage(即每種大小的特征圖)上都有res模塊,所以我們把步長(zhǎng)為2的類pooling的卷積+res模塊連在一起蝗岖,記為resn侥猩,n代表pooling后又幾個(gè)res模塊,即表1中的1.2.8.8.4抵赢∑劾停可參照下圖理解
3.3 檢測(cè)網(wǎng)絡(luò)
檢測(cè)網(wǎng)絡(luò)就比原來分類網(wǎng)絡(luò)darknet多了個(gè)類FPN結(jié)構(gòu)。FPN解讀:https://blog.csdn.net/hancoder/article/details/89048870
類FPN結(jié)構(gòu)只用了3個(gè)stage的特征圖铅鲤。
y1:darknet-53輸入后+(5個(gè)3×3CONV)+(1個(gè)3×3CONV+1×1conv)
y2:上采樣y1過程中的(darknet-53輸入后+5個(gè)3×3CONV)划提,上采樣填充的元素是通道中同一位置的元素,即上采樣2倍后通道數(shù)會(huì)縮小2×2=4倍邢享。然后與上個(gè)stage的最后一層輸出concat鹏往,即特征圖同樣大小的情況下在通道方向上拼接,通道數(shù)增大骇塘。拼接后同y1的步驟一樣伊履,再通過(5個(gè)3×3CONV)+(1個(gè)3×3CONV+1×1conv)
y3:同理,再次說明上采樣的地方是深層特征圖的5個(gè)3×3CONV后绪爸。concat后同樣再(5個(gè)3×3CONV)+(1個(gè)3×3CONV+1×1conv)
concat類似于python中的tf.concat和torch.cat
Total252=add23+BN72+leaklyrelu72+convat2+conv75+UpSampling2+ZeroPadding5
當(dāng)輸入為416×416時(shí)湾碎,3個(gè)輸出的通道數(shù)都是255=3×(5+80)宙攻,3個(gè)輸出的特征圖邊長(zhǎng)分別為13,26,52
https://github.com/marvis/pytorch-yolo3 該界面有具體每層輸入輸出
3.4 實(shí)驗(yàn)效果
YOLOv3 在 Pascal Titan X 上處理 608x608 圖像速度可以達(dá)到 20FPS奠货,在 COCO test-dev 上 mAP@0.5 達(dá)到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網(wǎng)絡(luò))的結(jié)果相近座掘,并且速度快 4 倍.
YOLOv3 不使用 Softmax 對(duì)每個(gè)框進(jìn)行分類递惋,主要考慮因素有:
- Softmax 使得每個(gè)框分配一個(gè)類別(得分最高的一個(gè)),而對(duì)于 Open Images這種數(shù)據(jù)集溢陪,目標(biāo)可能有重疊的類別標(biāo)簽萍虽,因此 Softmax不適用于多標(biāo)簽分類。
- Softmax 可被獨(dú)立的多個(gè) logistic 分類器替代形真,且準(zhǔn)確率不會(huì)下降杉编。
- 分類損失采用 binary cross-entropy loss.
使用softmax強(qiáng)行讓每個(gè)框有1個(gè)類,這通常是不符生活經(jīng)驗(yàn)的
3.5參考