關(guān)于YOLOv3的一些細(xì)節(jié)

本文是我對(duì)YOLO算法的細(xì)節(jié)理解總結(jié),本文的閱讀前提是已讀過(guò)YOLO相關(guān)論文,文中不會(huì)談及YOLO的發(fā)展過(guò)程,不會(huì)與其他對(duì)象檢測(cè)算法進(jìn)行對(duì)比,也不會(huì)介紹YOLO9000相關(guān)的內(nèi)容,只總結(jié)YOLOv3算法的具體流程和實(shí)現(xiàn)細(xì)節(jié)。所以,下文中所有提到的YOLO,如非特別說(shuō)明,均指YOLOv3。
如果需要了解更多對(duì)象檢測(cè)算法,可以參考以下部分相關(guān)論文:
R-CNN
Fast R-CNN
Faster R-CNN
SSD
YOLOv1
YOLOv2
YOLOv3
RetinaNet
最新關(guān)于對(duì)象檢測(cè)的綜述文獻(xiàn)可以參考這篇論文:
Deep Learning for Generic Object Detection: A Survey

1.概述

在YOLO算法發(fā)表之前,大部分表現(xiàn)比較好的對(duì)象檢測(cè)(Object Detection)算法都是以R-CNN為代表兩階段算法,這樣的算法存在一個(gè)很明顯的問(wèn)題,那就是速度太慢,對(duì)于實(shí)時(shí)性要求很高的應(yīng)用場(chǎng)景是不適用的。YOLO算法的作者沒(méi)有走優(yōu)化算法第一階段或者第二階段的老路子,而是直接提出一步完成預(yù)測(cè),而且是在一個(gè)CNN網(wǎng)絡(luò)模型中完成圖片中所有位置對(duì)象的box和類別預(yù)測(cè),推理速度大大提升,完全可以滿足實(shí)時(shí)對(duì)象檢測(cè)。

YOLO算法創(chuàng)新性地提出了將輸入圖片進(jìn)行N*N的柵格化(每個(gè)小單元叫g(shù)rid cell),然后將圖片中某個(gè)對(duì)象的位置的預(yù)測(cè)任務(wù)交與該對(duì)象中心位置所在的grid cell的bouding box。簡(jiǎn)單理解的話,可以認(rèn)為這也是一種很粗糙的區(qū)域推薦(region proposal),在訓(xùn)練的時(shí)候,我們通過(guò)grid cell的方式告訴模型,圖片中對(duì)象A應(yīng)該是由中心落在特定grid cell 的某個(gè)范圍內(nèi)的某些像素組成,模型接收到這些信息后就在grid cell周圍以一定大小范圍去尋找所有滿足對(duì)象A特征的像素,經(jīng)過(guò)很多次帶懲罰的嘗試訓(xùn)練后,它就能找到這個(gè)準(zhǔn)確的范圍了(說(shuō)明不是瞎找,如滑動(dòng)窗口),當(dāng)然這個(gè)方位不僅是指長(zhǎng)寬的大小范圍,也包括小幅度的中心位置坐標(biāo)變化,但是不管怎么變,中心位置不能越過(guò)該grid cell的范圍。這大大限制了模型在圖片中瞎找時(shí)做的無(wú)用功。這樣將位置檢測(cè)和類別識(shí)別結(jié)合到一個(gè)CNN網(wǎng)絡(luò)中預(yù)測(cè),即只需要掃描一遍(you only look once)圖片就能推理出圖片中所有對(duì)象的位置信息和類別。舉例如下圖。

img1.jpg

以上是我個(gè)人理解的YOLO算法的核心思想,不管是YOLOv1還是v2、v3,其主要的核心還是以上所述,只是在bounding box的擬合方式、骨干網(wǎng)絡(luò)的設(shè)計(jì)、模型訓(xùn)練的穩(wěn)定性、精度方面有所提升罷了。下面對(duì)整個(gè)模型的網(wǎng)絡(luò)結(jié)構(gòu)、實(shí)現(xiàn)和訓(xùn)練細(xì)節(jié)進(jìn)行闡述。

2.訓(xùn)練

既然已經(jīng)有了you only look once的想法,那接下來(lái)就要將這個(gè)想法數(shù)學(xué)化,這樣才能用數(shù)學(xué)的方法訓(xùn)練模型學(xué)習(xí)擬合坐標(biāo)和類別的特征,用于后期的預(yù)測(cè)。YOLO算法幾乎是輸入原圖就直接預(yù)測(cè)出每個(gè)grid cell“附近”是否有某個(gè)對(duì)象和具體的 box位置,那最終這個(gè)想法數(shù)學(xué)化后便體現(xiàn)在loss函數(shù)上,這里我先不給出loss函數(shù)的具體公式,因?yàn)樵谔岢鰈oss函數(shù)之前要先了解三個(gè)概念:anchor box、置信度(confidence)和對(duì)象條件類別概率(conditional class probabilities)。作者提出,在網(wǎng)絡(luò)最后的輸出中,對(duì)于每個(gè)grid cell對(duì)應(yīng)bounding box的輸出有三類參數(shù):一個(gè)是對(duì)象的box參數(shù),一共是四個(gè)值,即box的中心點(diǎn)坐標(biāo)(x,y)和box的寬和高(w,h);一個(gè)是置信度,這是個(gè)區(qū)間在[0,1]之間的值;最后一個(gè)是一組條件類別概率,都是區(qū)間在[0,1]之間的值,代表概率。下面分別具體介紹這三個(gè)參數(shù)的意義。

2.1 anchor box(bounding box prior)

anchor box最初是由Faster RCNN引入的。anchor box(論文中也稱為bounding box prior,后面均使用anchor box)其實(shí)就是從訓(xùn)練集的所有g(shù)round truth box中統(tǒng)計(jì)(使用k-means)出來(lái)的在訓(xùn)練集中最經(jīng)常出現(xiàn)的幾個(gè)box形狀和尺寸。比如,在某個(gè)訓(xùn)練集中最常出現(xiàn)的box形狀有扁長(zhǎng)的、瘦高的和寬高比例差不多的正方形這三種形狀。我們可以預(yù)先將這些統(tǒng)計(jì)上的先驗(yàn)(或來(lái)自人類的)經(jīng)驗(yàn)加入到模型中,這樣模型在學(xué)習(xí)的時(shí)候,瞎找的可能性就更小了些,當(dāng)然就有助于模型快速收斂了。以前面提到的訓(xùn)練數(shù)據(jù)集中的ground truth box最常出現(xiàn)的三個(gè)形狀為例,當(dāng)模型在訓(xùn)練的時(shí)候我們可以告訴它,你要在grid cell 1附件找出的對(duì)象的形狀要么是扁長(zhǎng)的、要么是瘦高的、要么是長(zhǎng)高比例差不多的正方形,你就不要再瞎試其他的形狀了。anchor box其實(shí)就是對(duì)預(yù)測(cè)的對(duì)象范圍進(jìn)行約束,并加入了尺寸先驗(yàn)經(jīng)驗(yàn),從而可以有效解決對(duì)象多尺度的問(wèn)題(Faster RCNN論文中指出的作用)。這篇文章對(duì)anchor box的作用進(jìn)行了另外的解釋,個(gè)人覺(jué)得也很有道理,將部分內(nèi)容翻譯如下:

當(dāng)我們只對(duì)圖片中一個(gè)對(duì)象(且圖片中只有一個(gè)對(duì)象)進(jìn)行box回歸時(shí),我們只需要一個(gè)box回歸器,但是當(dāng)我們對(duì)圖片中多個(gè)對(duì)象進(jìn)行回歸時(shí)(甚至一個(gè)類別會(huì)有多個(gè)對(duì)象),這時(shí)使用多個(gè)box回歸器預(yù)測(cè)多個(gè)對(duì)象位置時(shí)就會(huì)發(fā)生沖突,因?yàn)槊總€(gè)預(yù)測(cè)器都可能不受約束地預(yù)測(cè)圖片中任何一個(gè)對(duì)象的位置和類別。這時(shí),我們就可以使用anchor來(lái)對(duì)每個(gè)回歸器進(jìn)行約束,只讓每個(gè)回歸器負(fù)責(zé)一塊獨(dú)立區(qū)域內(nèi)的對(duì)象box回歸。以YOLO算法舉例,每個(gè)grid cell的位置其實(shí)也可以看做是anchor的位置(這不同于SSD或者Faster RCNN的anchor),如果最終的輸出為13x13,也即有13x13個(gè)grid cell,每個(gè)grid cell有三個(gè)anchor的話,整個(gè)模型就有13x13x3個(gè)回歸器,每個(gè)回歸器只負(fù)責(zé)相應(yīng)grid cell附近的對(duì)象預(yù)測(cè)。

要在模型中使用這些形狀,總不能告訴模型有個(gè)形狀是瘦高的,還有一個(gè)是矮胖的,我們需要量化這些形狀。YOLO的做法是想辦法找出分別代表這些形狀的寬和高,有了寬和高,尺寸比例即形狀不就有了。YOLO作者的辦法是使用k-means算法在訓(xùn)練集中所有樣本的ground truth box中聚類出具有代表性形狀的寬和高,作者將這種方法稱作維度聚類(dimension cluster)。細(xì)心的讀者可能會(huì)提出這個(gè)問(wèn)題:到底找出幾個(gè)anchor box算是最佳的具有代表性的形狀。YOLO作者方法是做實(shí)驗(yàn),聚類出多個(gè)數(shù)量不同anchor box組,分別應(yīng)用到模型中,最終找出最優(yōu)的在模型的復(fù)雜度和高召回率(high recall)之間折中的那組anchor box。作者在COCO數(shù)據(jù)集中使用了9個(gè)anchor box,我們前面提到的例子則有3個(gè)anchor box。

那么有了量化的anchor box后,怎么在實(shí)際的模型中加入anchor box的先驗(yàn)經(jīng)驗(yàn)?zāi)兀课覀冊(cè)谇懊嬷泻?jiǎn)單提到過(guò)最終負(fù)責(zé)預(yù)測(cè)grid cell中對(duì)象的box的最小單元是bounding box,那我們可以讓一個(gè)grid cell輸出(預(yù)測(cè))多個(gè)bounding box,然后每個(gè)bounding box負(fù)責(zé)預(yù)測(cè)不同的形狀不就行了?比如前面例子中的3個(gè)不同形狀的anchor box,我們的一個(gè)grid cell會(huì)輸出3個(gè)參數(shù)相同的bounding box,第一個(gè)bounding box負(fù)責(zé)預(yù)測(cè)的形狀與anchor box 1類似的box,其他兩個(gè)bounding box依次類推。作者在YOLOv3中取消了v2之前每個(gè)grid cell只負(fù)責(zé)預(yù)測(cè)一個(gè)對(duì)象的限制,也就是說(shuō)grid cell中的三個(gè)bounding box都可以預(yù)測(cè)對(duì)象,當(dāng)然他們應(yīng)該對(duì)應(yīng)不同的ground truth。那么如何在訓(xùn)練中確定哪個(gè)bounding box負(fù)責(zé)某個(gè)ground truth呢?方法是求出每個(gè)grid cell中每個(gè)anchor box與ground truth box的IOU(交并比),IOU最大的anchor box對(duì)應(yīng)的bounding box就負(fù)責(zé)預(yù)測(cè)該ground truth,也就是對(duì)應(yīng)的對(duì)象,后面還會(huì)提到負(fù)責(zé)預(yù)測(cè)的問(wèn)題。

到此,還有最后一個(gè)問(wèn)題需要解決,我們才能真正在訓(xùn)練中使用anchor box,那就是我們?cè)趺锤嬖V模型第一個(gè)bounding box負(fù)責(zé)預(yù)測(cè)的形狀與anchor box 1類似,第二個(gè)bounding box負(fù)責(zé)預(yù)測(cè)的形狀與anchor box 2類似?YOLO的做法是不讓bounding box直接預(yù)測(cè)實(shí)際box的寬和高(w,h),而是將預(yù)測(cè)的寬和高分別與anchor box的寬和高綁定,這樣不管一開(kāi)始bounding box輸出的(w,h)是怎樣的,經(jīng)過(guò)轉(zhuǎn)化后都是與anchor box的寬和高相關(guān),這樣經(jīng)過(guò)很多次懲罰訓(xùn)練后,每個(gè)bounding box就知道自己該負(fù)責(zé)怎樣形狀的box預(yù)測(cè)了。這個(gè)綁定的關(guān)系是什么?那就是下面這個(gè)公式:
\begin{aligned} b_{w} & = a_{w}e^{t_{w}} \\ b_{h} & = a_{h}e^{t_{h}} \end{aligned}
其中,a_{w}a_{h}為anchor box的寬和高,t_{w}t_{h}為bounding box直接預(yù)測(cè)出的寬和高,b_{w}b_{h}為轉(zhuǎn)換后預(yù)測(cè)的實(shí)際寬和高,這也就是最終預(yù)測(cè)中輸出的寬和高。你可能會(huì)想,這個(gè)公式這么麻煩,為什么不能用\begin{aligned} b_{w}=a_{w}*t_{w}, b_{h}=a_{h}*t_{h}\end{aligned} 這樣的公式,我的理解是上面的公式雖然計(jì)算起來(lái)比較麻煩,但是在誤差函數(shù)求導(dǎo)后還帶有t_{w}t_{h}參數(shù),而且也好求導(dǎo)(此觀點(diǎn)只是個(gè)人推測(cè),需要進(jìn)一步查證)

既然提到了最終預(yù)測(cè)的寬和高公式,那我們也就直接帶出最終預(yù)測(cè)輸出的box中心坐標(biāo)(b_{x},b_{y})的計(jì)算公式,我們前面提到過(guò)box中心坐標(biāo)總是落在相應(yīng)的grid cell中的,所以bounding box直接預(yù)測(cè)出的t_{x}t_{y}也是相對(duì)grid cell來(lái)說(shuō)的,要想轉(zhuǎn)換成最終輸出的絕對(duì)坐標(biāo),需要下面的轉(zhuǎn)換公式:
\begin{aligned} b_{x} & = \sigma(t_{x}) + c_{x} \\ b_{y} & = \sigma(t_{y}) + c_{y} \end{aligned}
其中,\sigma(t_{x})為sigmoid函數(shù),c_{x}c_{y}分別為grid cell方格左上角點(diǎn)相對(duì)整張圖片的坐標(biāo)。作者使用這樣的轉(zhuǎn)換公式主要是因?yàn)樵谟?xùn)練時(shí)如果沒(méi)有將t_{x}t_{y}壓縮到(0,1)區(qū)間內(nèi)的話,模型在訓(xùn)練前期很難收斂。
最終可以得出實(shí)際輸出的box參數(shù)公式如下,這個(gè)也是在推理時(shí)將輸出轉(zhuǎn)換為最終推理結(jié)果的公式:

\begin{aligned} b_{x} & = \sigma(t_{x}) + c_{x} \\ b_{y} & = \sigma(t_{y}) + c_{y} \\ b_{w} & = a_{w}e^{t_{w}} \\ b_{h} & = a_{h}e^{t_{h}} \\ \end{aligned}

關(guān)于box參數(shù)的轉(zhuǎn)換還有一點(diǎn)值得一提,作者在訓(xùn)練中并不是將t_{x}t_{y}t_{w}t_{h}轉(zhuǎn)換為b_{x}b_{y}b_{w}b_{h}后與ground truth box的對(duì)應(yīng)參數(shù)求誤差,而是使用上述公式的逆運(yùn)算將ground truth box的參數(shù)轉(zhuǎn)換為與t_{x}t_{y}t_{w}t_{h}對(duì)應(yīng)的g_{x}g_{y}g_{w}g_{h},然后再計(jì)算誤差,計(jì)算中由于sigmoid函數(shù)的反函數(shù)難計(jì)算,所以并沒(méi)有計(jì)算sigmoid的反函數(shù),而是計(jì)算輸出對(duì)應(yīng)的sigmoid函數(shù)值。

\begin{aligned} \sigma(\hat t_{x}) =g_x - c_{x} \\ \sigma(\hat t_{y}) =g_y - c_{y} \\ \hat t_{w} = \log(g_{w} / a_{w}) \\ \hat t_{h} = \log(g_{h} / a_{h}) \\ \end{aligned}

關(guān)于anchor box訓(xùn)練相關(guān)的問(wèn)題除了與loss函數(shù)相關(guān)的基本上都解釋清楚了,但是預(yù)測(cè)的問(wèn)題還沒(méi)有解釋清楚,還存在一個(gè)很關(guān)鍵的問(wèn)題:在訓(xùn)練中我們挑選哪個(gè)bounding box的準(zhǔn)則是選擇預(yù)測(cè)的box與ground truth box的IOU最大的bounding box做為最優(yōu)的box,但是在預(yù)測(cè)中并沒(méi)有g(shù)round truth box,怎么才能挑選最優(yōu)的bounding box呢?這就需要另外的參數(shù)了,那就是下面要說(shuō)到的置信度。

2.2 置信度(confidence)

置信度是每個(gè)bounding box輸出的其中一個(gè)重要參數(shù),作者對(duì)他的作用定義有兩重:一重是代表當(dāng)前box是否有對(duì)象的概率P_{r}(Object),注意,是對(duì)象,不是某個(gè)類別的對(duì)象,也就是說(shuō)它用來(lái)說(shuō)明當(dāng)前box內(nèi)只是個(gè)背景(backgroud)還是有某個(gè)物體(對(duì)象);另一重表示當(dāng)前的box有對(duì)象時(shí),它自己預(yù)測(cè)的box與物體真實(shí)的box可能的IOU_{pred}^{truth}的值,注意,這里所說(shuō)的物體真實(shí)的box實(shí)際是不存在的,這只是模型表達(dá)自己框出了物體的自信程度。以上所述,也就不難理解作者為什么將其稱之為置信度了,因?yàn)椴还苣闹睾x,都表示一種自信程度:框出的box內(nèi)確實(shí)有物體的自信程度和框出的box將整個(gè)物體的所有特征都包括進(jìn)來(lái)的自信程度。經(jīng)過(guò)以上的解釋,其實(shí)我們也就可以用數(shù)學(xué)形式表示置信度的定義了:

\begin{aligned} C_{i}^{j} & = P_{r}(Object) * IOU_{pred}^{truth} \end{aligned}

其中,C_{i}^{j}表示第i個(gè)grid cell的第j個(gè)bounding box的置信度。對(duì)于如何訓(xùn)練C_{i}^{j}的方法,在損失函數(shù)小節(jié)中說(shuō)明。

2.3 對(duì)象條件類別概率(conditional class probabilities)

對(duì)象條件類別概率是一組概率的數(shù)組,數(shù)組的長(zhǎng)度為當(dāng)前模型檢測(cè)的類別種類數(shù)量,它的意義是當(dāng)bounding box認(rèn)為當(dāng)前box中有對(duì)象時(shí),要檢測(cè)的所有類別中每種類別的概率,其實(shí)這個(gè)和分類模型最后使用softmax函數(shù)輸出的一組類別概率是類似的,只是二者存在兩點(diǎn)不同:1.YOLO的對(duì)象類別概率中沒(méi)有background一項(xiàng),也不需要,因?yàn)閷?duì)background的預(yù)測(cè)已經(jīng)交給置信度了,所以它的輸出是有條件的,那就是在置信度表示當(dāng)前box有對(duì)象的前提下,所以條件概率的數(shù)學(xué)形式為P_{r}(class_{i}|Object);2.分類模型中最后輸出之前使用softmax求出每個(gè)類別的概率,也就是說(shuō)各個(gè)類別之間是互斥的,而YOLOv3算法的每個(gè)類別概率是單獨(dú)用邏輯回歸函數(shù)(sigmoid函數(shù))計(jì)算得出了,所以每個(gè)類別不必是互斥的,也就是說(shuō)一個(gè)對(duì)象可以被預(yù)測(cè)出多個(gè)類別。這個(gè)想法其實(shí)是有一些YOLO9000的意思的,因?yàn)閅OLOv3已經(jīng)有9000類似的功能,不同只是不能像9000一樣,同時(shí)使用分類數(shù)據(jù)集和對(duì)象檢測(cè)數(shù)據(jù)集,且類別之間的詞性是有從屬關(guān)系的。

介紹完所有的輸出參數(shù)后,我們總結(jié)下模型最終輸出層的輸出維數(shù)是多少。假如一個(gè)圖片被分割成S*S個(gè)grid cell,我們有B個(gè)anchor box,也就是說(shuō)每個(gè)grid cell有B個(gè)bounding box, 每個(gè)bounding box內(nèi)有4個(gè)位置參數(shù),1個(gè)置信度,classes個(gè)類別概率,那么最終的輸出維數(shù)是:S*S*[B*(4 + 1 + classes)]

2.4 損失函數(shù)

介紹完模型最終輸出中有哪些參數(shù)后,我們應(yīng)該可以定義loss函數(shù)了,作者使用了最簡(jiǎn)單的差平方和誤差(sum-squared error),使用的原因很簡(jiǎn)單,因?yàn)楹脙?yōu)化。那我們?cè)囍o出loss函數(shù)的公式:

\begin{aligned} Loss = \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}[({\sigma(t_{x})}_{i}^{j} - \sigma(\hat t_{x})_{i}^{j})^{2} + (\sigma(t_{y})_{i}^{j} - \sigma(\hat t_{y})_{i}^{j})^{2}] + \\ \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}[({t_w}_{i}^{j} - {\hat t_w}_{i}^{j})^{2} + ({t_h}_{i}^{j} - {\hat t_h}_{i}^{j})^{2}] + \\ \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}(C_{i}^{j} - \widehat C_{i}^{j})^{2} +\\ \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}\sum_{c \in classes}(p_{i}^{j}(c) - \widehat p_{i}^{j}(c))^{2} \end{aligned}

如果看過(guò)YOLOv1的論文你會(huì)發(fā)現(xiàn),這里的公式和論文中的公式雖然相似,但是差別還是很大的。其實(shí),作者是在上面這個(gè)公式的基礎(chǔ)上加了很多限制和優(yōu)化參數(shù),上面的公式只是我為了更好說(shuō)明YOLO的loss公式而給出的對(duì)比公式,這樣有助于更好的理解YOLO的loss函數(shù)公式中加入的每個(gè)參數(shù)的意義,下面給出真正的YOLO loss函數(shù)公式(這個(gè)公式是我根據(jù)YOLO三篇論文前后的發(fā)展總結(jié)出來(lái)的,v3論文中未給出此類似的公式):

\begin{aligned} Loss = \sum_{i=0}^{S^{2}}\sum_{j=0}^{B} \mathbb{I}_{ij}^{obj} [({\sigma(t_{x})}_{i}^{j} - \sigma(\hat t_{x})_{i}^{j})^{2} + (\sigma(t_{y})_{i}^{j} - \sigma(\hat t_{y})_{i}^{j})^{2}] + \\ \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}\mathbb{I}_{ij}^{obj}[({t_w}_{i}^{j} - {\hat t_w}_{i}^{j})^{2} + ({t_h}_{i}^{j} - {\hat t_h}_{i}^{j})^{2}] + \\ \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}\mathbb{G}_{ij}(C_{i}^{j} - \widehat C_{i}^{j})^{2} + \\ \sum_{i=0}^{S^{2}}\sum_{j=0}^{B}\sum_{c \in classes}\mathbb{I}_{ij}^{obj}(p_{i}^{j}(c) - \widehat p_{i}^{j}(c))^{2} \end{aligned}

細(xì)心的你一定也注意到了,這個(gè)公式和YOLOv1論文中的公式是不一樣的。那是因?yàn)樵赮OLOv3中,作者將置信度和條件類別概率放到了每個(gè)bounding box中,即每個(gè)bounding box都有一對(duì)置信度和條件類別概率,而v1中所有的bounding box共用一個(gè)條件類別概率,上文中在說(shuō)明輸出的各個(gè)參數(shù)時(shí),默認(rèn)解釋的是v3的輸出格式,關(guān)于v1的細(xì)節(jié)不再贅述。下面幾點(diǎn)是loss函數(shù)的幾點(diǎn)細(xì)節(jié):

  • v1和v2 loss中的\lambda_{coord}\lambda_{noobj} 參數(shù)去哪了
    v3去掉了v1和v2 loss中的\lambda_{coord}\lambda_{noobj} 參數(shù)。這點(diǎn)在論文中未提及,但是在作者的實(shí)現(xiàn)源碼中去掉了,可能模型已經(jīng)變得更加穩(wěn)定,不需要這樣的微調(diào)。當(dāng)然,在darknet的yolov3.cfg配置文件中也沒(méi)有這兩個(gè)參數(shù)的配置。

  • 參數(shù)\mathbb{I}_{ij}^{obj}
    在訓(xùn)練中,如果某個(gè)grid cell的bounding box沒(méi)有負(fù)責(zé)預(yù)測(cè)某個(gè)對(duì)象,那我們就不應(yīng)該訓(xùn)練該bounding box的條件類別概率和坐標(biāo)參數(shù),因?yàn)槭褂眠@些參數(shù)的前提是在明確清楚該bounding box負(fù)責(zé)預(yù)測(cè)某個(gè)ground truth box(后面說(shuō)明怎么決定是否負(fù)責(zé)),即不應(yīng)該根據(jù)條件類別概率和中心坐標(biāo)輸出誤差調(diào)整相應(yīng)的weights,那如何不進(jìn)行這部分訓(xùn)練呢,當(dāng)然是不讓他們對(duì)loss做出貢獻(xiàn),也就沒(méi)有它們什么事情了,這個(gè)時(shí)候就需要參數(shù)\mathbb{I}_{ij}^{obj}了,當(dāng)該bounding box負(fù)責(zé)預(yù)測(cè)某個(gè)ground truth box時(shí),\mathbb{I}_{ij}^{obj} =1,否則,\mathbb{I}_{ij}^{obj} =0

  • \widehat C_{i}^{j}\mathbb{G}_{ij}的值如何確定
    訓(xùn)練中,\widehat C_{i}^{j}的取值是由grid cell的bounding box有沒(méi)有負(fù)責(zé)預(yù)測(cè)某個(gè)對(duì)象決定的。如果負(fù)責(zé),那么\widehat C_{i}^{j}=1,否則,\widehat C_{i}^{j}=0。下面我們來(lái)說(shuō)明如何確定某個(gè)grid cell的bounding box是否負(fù)責(zé)預(yù)測(cè)該grid cell中的對(duì)象:前面在說(shuō)明anchor box的時(shí)候提到每個(gè)bounding box負(fù)責(zé)預(yù)測(cè)的形狀是依據(jù)與其對(duì)應(yīng)的anchor box(bounding box prior)相關(guān)的,那這個(gè)anchor box與該對(duì)象的ground truth box的IOU在所有的anchor box(與一個(gè)grid cell中所有bounding box對(duì)應(yīng),COCO數(shù)據(jù)集中是9個(gè))與ground truth box的IOU中最大,那它就負(fù)責(zé)預(yù)測(cè)這個(gè)對(duì)象,因?yàn)檫@個(gè)形狀、尺寸最符合當(dāng)前這個(gè)對(duì)象,這時(shí)\widehat C_{i}^{j}=1,其他情況下\widehat C_{i}^{j}=0。注意,你沒(méi)有看錯(cuò),就是所有anchor box與某個(gè)ground truth box的IOU最大的那個(gè)anchor box對(duì)應(yīng)的bounding box負(fù)責(zé)預(yù)測(cè)該對(duì)象,與該bounding box預(yù)測(cè)的box沒(méi)有關(guān)系。另外,這里有個(gè)例外,當(dāng)某個(gè)bounding box不負(fù)責(zé)對(duì)應(yīng)grid cell中g(shù)round truth box的預(yù)測(cè),但是又與該ground truth box的IOU大于設(shè)定的閾值時(shí)(論文中是0.5,darknet中針對(duì)COCO數(shù)據(jù)集使用的是0.7),忽略該bounding box所有輸出的對(duì)loss的誤差貢獻(xiàn),包括置信度誤差,這時(shí)\mathbb{G}_{ij}=0,其他情況\mathbb{G}_{ij}=1。結(jié)合之前的說(shuō)明可以看出,參數(shù)\mathbb{I}_{ij}^{obj}\widehat C_{i}^{j}的值其實(shí)是保持一致的。 如果你不理解為何作者這樣做,建議閱讀Faster RCNN的論文,作者的做法其實(shí)是借鑒了Faster RCNN的anchor box思想。

  • grid cell的個(gè)數(shù)S如何確定
    自v2后,YOLO算法網(wǎng)絡(luò)結(jié)構(gòu)中只使用卷積和池化操作進(jìn)行特征提取和推理運(yùn)算,去掉了傳統(tǒng)的全連接層,這樣的做法有一個(gè)好處,就是理論上整個(gè)網(wǎng)絡(luò)不再限制輸入圖片的尺寸,因?yàn)榫矸e層本來(lái)就對(duì)輸入的尺寸沒(méi)有限制。作者在這樣的基礎(chǔ)上,每隔一段訓(xùn)練周期隨意改變輸入層的尺寸后再進(jìn)行下一階段訓(xùn)練,這樣就讓模型在不同尺寸的圖片上都表現(xiàn)良好,作者將之稱為Multi-Scale training。當(dāng)然,輸入的尺寸并不是隨心所欲地改變,而是在(10*32, 11*32, 12*32, 13*32, 14*32, 15*32, 16*32, 17*32, 18*32, 19*32)這幾個(gè)尺寸中隨機(jī)選擇。當(dāng)確定了輸入層的大小后,模型通過(guò)卷積層輸入輸出尺寸公式計(jì)算后,便能預(yù)先知道在某個(gè)輸入尺寸前提下,最后的輸出層尺寸是多少了,也就是grid cell的個(gè)數(shù),即loss函數(shù)中S的值。其實(shí),S的取值只可能在集合(10*10,11*11, 12*12,...,19*19)中,因?yàn)閅OLO模型的降采樣(down-sample)因子是32。

2.5 跨尺寸預(yù)測(cè)(Predictions across scales)

YOLO算法從三個(gè)不同的尺寸預(yù)測(cè)對(duì)象box,這三個(gè)不同的尺寸來(lái)自不同層級(jí)的卷積層的輸出。該方法借鑒了feature pyramid network的思想: 由于卷積層每隔幾層,特征映射(feature mapping)的寬和高就會(huì)減少,而通道數(shù)會(huì)增加,隨著網(wǎng)絡(luò)層次的加深,特征映射組成的形狀類似于金字塔,如果將不同層級(jí)的特征映射轉(zhuǎn)換為最終的輸出,那么將有助于提升模型在對(duì)象不同尺度大小上的表現(xiàn),即有助于提高模型從小目標(biāo)到大目標(biāo)的綜合檢測(cè)(box的精度)能力,關(guān)于feature pyramid network的具體內(nèi)容,此處不詳細(xì)展開(kāi),可參考論文。我們先看下YOLO模型的網(wǎng)絡(luò)結(jié)構(gòu),我們以檢測(cè)COCO數(shù)據(jù)集輸入尺寸為416*416的網(wǎng)絡(luò)結(jié)構(gòu)為例(COCO數(shù)據(jù)集類別數(shù)為80,anchor box總數(shù)為9):

從上面的模型的網(wǎng)絡(luò)結(jié)構(gòu)圖我們可以明顯看出基于darknet-53的最新的模型結(jié)構(gòu)有以下幾個(gè)特點(diǎn):

  1. 從網(wǎng)絡(luò)的不同層次映射不同尺寸的輸出,如圖中從79層(外加兩個(gè)卷積層)得到13*13的的輸出;從91層(外加兩個(gè)卷積層)得到26*26的輸出;最后再得到52*52的輸出。
  2. 后面的高層結(jié)合使用低層特征(圖中的86、98層,分別使用了61層和36層的特征映射),使高層能使用細(xì)粒度(fine grained)特征和更多的語(yǔ)義信息。
  3. 最后一個(gè)尺寸輸出使用了前兩個(gè)尺寸計(jì)算的特征映射,使得最后的尺寸輸出也能使用細(xì)粒度。
  4. 每個(gè)YOLO輸出層中,每個(gè)grid cell的bounding box數(shù)量為3,而不是9,這樣不同的YOLO輸出層便能負(fù)責(zé)不同尺寸大小的對(duì)象預(yù)測(cè)了,這個(gè)思想來(lái)自SSD。例如,COCO數(shù)據(jù)集中,作者讓YOLO scale1負(fù)責(zé)預(yù)測(cè)的尺寸有(116,90)、(156,198)和(373,326), YOLO scale2負(fù)責(zé)預(yù)測(cè)的尺寸有(30,61)、(62,45)和(59,119),YOLO scale3負(fù)責(zé)預(yù)測(cè)的尺寸有(10,13)、 (16,30)和 (33,23)。

以上,就是我個(gè)人理解的YOLO算法的一些細(xì)節(jié)。

作者能力有限,不正確之處歡迎斧正。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容