您好,登錄后才能下訂單哦!
關(guān)于YOLO v3原理的實(shí)例分析,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
首先通過特征提取網(wǎng)絡(luò)對輸入特征提取特征,得到特定大小的特征圖輸出。輸入圖像分成13×13的grid cell,接著如果真實(shí)框中某個(gè)object的中心坐標(biāo)落在某個(gè)grid cell中,那么就由該grid cell來預(yù)測該object。每個(gè)object有固定數(shù)量的bounding box,YOLO v3中有三個(gè)bounding box,使用邏輯回歸確定用來預(yù)測的回歸框。
上圖DBL是Yolo v3的基本組件。Darknet的卷積層后接BatchNormalization(BN)和LeakyReLU。除最后一層卷積層外,在yolo v3中BN和LeakyReLU已經(jīng)是卷積層不可分離的部分了,共同構(gòu)成了最小組件。
主干網(wǎng)絡(luò)中使用了5個(gè)resn結(jié)構(gòu)。n代表數(shù)字,有res1,res2, … ,res8等等,表示這個(gè)res_block里含有n個(gè)res_unit,這是Yolo v3的大組件。從Yolo v3開始借鑒了ResNet的殘差結(jié)構(gòu),使用這種結(jié)構(gòu)可以讓網(wǎng)絡(luò)結(jié)構(gòu)更深。對于res_block的解釋,可以在上圖網(wǎng)絡(luò)結(jié)果的右下角直觀看到,其基本組件也是DBL。
在預(yù)測支路上有張量拼接(concat)操作。其實(shí)現(xiàn)方法是將darknet中間層和中間層后某一層的上采樣進(jìn)行拼接。值得注意的是,張量拼接和Res_unit結(jié)構(gòu)的add的操作是不一樣的,張量拼接會擴(kuò)充張量的維度,而add只是直接相加不會導(dǎo)致張量維度的改變。
Yolo_body一共有252層。23個(gè)Res_unit對應(yīng)23個(gè)add層。BN層和LeakyReLU層數(shù)量都是72層,在網(wǎng)絡(luò)結(jié)構(gòu)中的表現(xiàn)為:每一層BN后面都會接一層LeakyReLU。上采樣和張量拼接操作各2個(gè),5個(gè)零填充對應(yīng)5個(gè)res_block。卷積層一共有75層,其中有72層后面都會接BatchNormalization和LeakyReLU構(gòu)成的DBL。三個(gè)不同尺度的輸出對應(yīng)三個(gè)卷積層,最后的卷積層的卷積核個(gè)數(shù)是255,針對COCO數(shù)據(jù)集的80類:3×(80+4+1)=255,3表示一個(gè)grid cell包含3個(gè)bounding box,4表示框的4個(gè)坐標(biāo)信息,1表示置信度。
下圖為具體網(wǎng)絡(luò)結(jié)果圖。
不考慮神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)細(xì)節(jié)的話,總的來說,對于一個(gè)輸入圖像,YOLO3將其映射到3個(gè)尺度的輸出張量,代表圖像各個(gè)位置存在各種對象的概率。
我們看一下YOLO3共進(jìn)行了多少個(gè)預(yù)測。對于一個(gè)416*416的輸入圖像,在每個(gè)尺度的特征圖的每個(gè)網(wǎng)格設(shè)置3個(gè)先驗(yàn)框,總共有 13*13*3 + 26*26*3 + 52*52*3 = 10647 個(gè)預(yù)測。每一個(gè)預(yù)測是一個(gè)(4+1+80)=85維向量,這個(gè)85維向量包含邊框坐標(biāo)(4個(gè)數(shù)值),邊框置信度(1個(gè)數(shù)值),對象類別的概率(對于COCO數(shù)據(jù)集,有80種對象)。
Yolo v3關(guān)于bounding box的初始尺寸還是采用Yolo v2中的k-means聚類的方式來做,這種先驗(yàn)知識對于bounding box的初始化幫助還是很大的,畢竟過多的bounding box雖然對于效果來說有保障,但是對于算法速度影響還是比較大的。
在COCO數(shù)據(jù)集上,9個(gè)聚類如下表所示,注這里需要說明:特征圖越大,感受野越小。對小目標(biāo)越敏感,所以選用小的anchor box。特征圖越小,感受野越大。對大目標(biāo)越敏感,所以選用大的anchor box。
Yolo v3采用直接預(yù)測相對位置的方法。預(yù)測出b-box中心點(diǎn)相對于網(wǎng)格單元左上角的相對坐標(biāo)。直接預(yù)測出(tx,ty,tw,th,t0),然后通過以下坐標(biāo)偏移公式計(jì)算得到b-box的位置大小和confidence。
tx、ty、tw、th就是模型的預(yù)測輸出。cx和cy表示grid cell的坐標(biāo),比如某層的feature map大小是13×13,那么grid cell就有13×13個(gè),第0行第1列的grid cell的坐標(biāo)cx就是0,cy就是1。pw和ph表示預(yù)測前bounding box的size。bx、by、bw和bh就是預(yù)測得到的bounding box的中心的坐標(biāo)和size。在訓(xùn)練這幾個(gè)坐標(biāo)值的時(shí)候采用了sum of squared error loss(平方和距離誤差損失),因?yàn)檫@種方式的誤差可以很快的計(jì)算出來。
注:這里confidence = Pr(Object)*IoU 表示框中含有object的置信度和這個(gè)box預(yù)測的有多準(zhǔn)。也就是說,如果這個(gè)框?qū)?yīng)的是背景,那么這個(gè)值應(yīng)該是 0,如果這個(gè)框?qū)?yīng)的是前景,那么這個(gè)值應(yīng)該是與對應(yīng)前景 GT的IoU。
Yolo v3使用邏輯回歸預(yù)測每個(gè)邊界框的分?jǐn)?shù)。如果邊界框與真實(shí)框的重疊度比之前的任何其他邊界框都要好,則該值應(yīng)該為1。如果邊界框不是最好的,但確實(shí)與真實(shí)對象的重疊超過某個(gè)閾值(Yolo v3中這里設(shè)定的閾值是0.5),那么就忽略這次預(yù)測。Yolo v3只為每個(gè)真實(shí)對象分配一個(gè)邊界框,如果邊界框與真實(shí)對象不吻合,則不會產(chǎn)生坐標(biāo)或類別預(yù)測損失,只會產(chǎn)生物體預(yù)測損失。
在上面網(wǎng)絡(luò)結(jié)構(gòu)圖中可以看出,Yolo v3設(shè)定的是每個(gè)網(wǎng)格單元預(yù)測3個(gè)box,所以每個(gè)box需要有(x, y, w, h, confidence)五個(gè)基本參數(shù)。Yolo v3輸出了3個(gè)不同尺度的feature map,如上圖所示的y1, y2, y3。y1,y2和y3的深度都是255,邊長的規(guī)律是13:26:52。
每個(gè)預(yù)測任務(wù)得到的特征大小都為N ×N ×[3?(4+1+80)] ,N為格子大小,3為每個(gè)格子得到的邊界框數(shù)量, 4是邊界框坐標(biāo)數(shù)量,1是目標(biāo)預(yù)測值,80是類別數(shù)量。對于COCO類別而言,有80個(gè)類別的概率,所以每個(gè)box應(yīng)該對每個(gè)種類都輸出一個(gè)概率。所以3×(5 + 80) = 255。這個(gè)255就是這么來的。
Yolo v3用上采樣的方法來實(shí)現(xiàn)這種多尺度的feature map。在Darknet-53得到的特征圖的基礎(chǔ)上,經(jīng)過六個(gè)DBL結(jié)構(gòu)和最后一層卷積層得到第一個(gè)特征圖譜,在這個(gè)特征圖譜上做第一次預(yù)測。Y1支路上,從后向前的倒數(shù)第3個(gè)卷積層的輸出,經(jīng)過一個(gè)DBL結(jié)構(gòu)和一次(2,2)上采樣,將上采樣特征與第2個(gè)Res8結(jié)構(gòu)輸出的卷積特征張量連接,經(jīng)過六個(gè)DBL結(jié)構(gòu)和最后一層卷積層得到第二個(gè)特征圖譜,在這個(gè)特征圖譜上做第二次預(yù)測。Y2支路上,從后向前倒數(shù)第3個(gè)卷積層的輸出,經(jīng)過一個(gè)DBL結(jié)構(gòu)和一次(2,2)上采樣,將上采樣特征與第1個(gè)Res8結(jié)構(gòu)輸出的卷積特征張量連接,經(jīng)過六個(gè)DBL結(jié)構(gòu)和最后一層卷積層得到第三個(gè)特征圖譜,在這個(gè)特征圖譜上做第三次預(yù)測。
就整個(gè)網(wǎng)絡(luò)而言,Yolo v3多尺度預(yù)測輸出的feature map尺寸為y1:(13×13),y2:(26×26),y3:(52×52)。網(wǎng)絡(luò)接收一張(416×416)的圖,經(jīng)過5個(gè)步長為2的卷積來進(jìn)行降采樣(416 / 2?5 = 13,y1輸出(13×13)。從y1的倒數(shù)第二層的卷積層上采樣(x2,up sampling)再與最后一個(gè)26×26大小的特征圖張量連接,y2輸出(26×26)。從y2的倒數(shù)第二層的卷積層上采樣(x2,up sampling)再與最后一個(gè)52×52大小的特征圖張量連接,y3輸出(52×52)
感受一下9種先驗(yàn)框的尺寸,下圖中藍(lán)色框?yàn)榫垲惖玫降南闰?yàn)框。黃色框式ground truth,紅框是對象中心點(diǎn)所在的網(wǎng)格。
預(yù)測框一共分為三種情況:正例(positive)、負(fù)例(negative)、忽略樣例(ignore)。
(1)正例:任取一個(gè)ground truth, 與上面計(jì)算的10647個(gè)框全部計(jì)算IOU, IOU最大的預(yù)測框, 即為正例。并且一個(gè)預(yù)測框, 只能分配給一個(gè)ground truth。 例如第一個(gè)ground truth已經(jīng)匹配了一個(gè)正例檢測框, 那么下一個(gè)ground truth, 就在余下的10646個(gè)檢測框中, 尋找IOU最大的檢測框作為正例。ground truth的先后順序可忽略。正例產(chǎn)生置信度loss、檢測框loss、類別loss。預(yù)測框?yàn)閷?yīng)的ground truth box標(biāo)簽(使用真實(shí)的x、y、w、h計(jì)算出); 類別標(biāo)簽對應(yīng)類別為1, 其余為0; 置信度標(biāo)簽為1。
(2)忽略樣例:正例除外, 與任意一個(gè)ground truth的IOU大于閾值(論文中使用5), 則為忽略樣例。忽略樣例不產(chǎn)生任何loss。
為什么會有忽略樣例?
由于Yolov3采用了多尺度檢測, 那么再檢測時(shí)會有重復(fù)檢測現(xiàn)象. 比如有一個(gè)真實(shí)物體,在訓(xùn)練時(shí)被分配到的檢測框是特征圖1的第三個(gè)box,IOU達(dá)0.98,此時(shí)恰好特征圖2的第一個(gè)box與該ground truth的IOU達(dá)0.95,也檢測到了該ground truth,如果此時(shí)給其置信度強(qiáng)行打0的標(biāo)簽,網(wǎng)絡(luò)學(xué)習(xí)效果會不理想。
(3)負(fù)例:正例除外(與ground truth計(jì)算后IOU最大的檢測框,但是IOU小于閾值,仍為正例), 與全部ground truth的IOU都小于閾值(0.5), 則為負(fù)例。負(fù)例只有置信度產(chǎn)生loss, 置信度標(biāo)簽為0。
如下圖所示:
λ為權(quán)重參數(shù), 用于控制檢測框loss, obj與noobj的置信度loss, 以及類別
對于正類而言, 1ijobj輸出為1; 對于負(fù)例而言, 1ijnoobj輸出為1; 對于忽略樣例而言, 全部為0;
類別采用交叉熵作為損失函數(shù)。
類別預(yù)測方面Yolo v2網(wǎng)絡(luò)中的Softmax分類器,認(rèn)為一個(gè)目標(biāo)只屬于一個(gè)類別,通過輸出Score大小,使得每個(gè)框分配到Score最大的一個(gè)類別。但在一些復(fù)雜場景下,一個(gè)目標(biāo)可能屬于多個(gè)類(有重疊的類別標(biāo)簽),因此Yolo v3用多個(gè)獨(dú)立的Logistic分類器替代Softmax層解決多標(biāo)簽分類問題,且準(zhǔn)確率不會下降。
舉例說明,原來分類網(wǎng)絡(luò)中的softmax層都是假設(shè)一張圖像或一個(gè)object只屬于一個(gè)類別,但是在一些復(fù)雜場景下,一個(gè)object可能屬于多個(gè)類,比如你的類別中有woman和person這兩個(gè)類,那么如果一張圖像中有一個(gè)woman,那么你檢測的結(jié)果中類別標(biāo)簽就要同時(shí)有woman和person兩個(gè)類,這就是多標(biāo)簽分類,需要用Logistic分類器來對每個(gè)類別做二分類。Logistic分類器主要用到sigmoid函數(shù),該函數(shù)可以將輸入約束在0到1的范圍內(nèi),因此當(dāng)一張圖像經(jīng)過特征提取后的某一類輸出經(jīng)過sigmoid函數(shù)約束后如果大于0.5,就表示該邊界框負(fù)責(zé)的目標(biāo)屬于該類。
物體分?jǐn)?shù):表示一個(gè)邊界框包含一個(gè)物體的概率,對于紅色框和其周圍的框幾乎都為1,但邊角的框可能幾乎都為0。物體分?jǐn)?shù)也通過一個(gè)sigmoid函數(shù),表示概率值。
類置信度:表示檢測到的物體屬于一個(gè)具體類的概率值,以前的YOLO版本使用softmax將類分?jǐn)?shù)轉(zhuǎn)化為類概率。在YOLOv3中作者決定使用sigmoid函數(shù)取代,原因是softmax假設(shè)類之間都是互斥的,例如屬于“Person”就不能表示屬于“Woman”,然而很多情況是這個(gè)物體既是“Person”也是“Woman”。
我們的網(wǎng)絡(luò)生成10647個(gè)錨框,而圖像中只有一個(gè)狗,怎么將10647個(gè)框減少為1個(gè)呢?首先,我們通過物體分?jǐn)?shù)過濾一些錨框,例如低于閾值(假設(shè)0.5)的錨框直接舍去;然后,使用NMS(非極大值抑制)解決多個(gè)錨框檢測一個(gè)物體的問題(例如紅色框的3個(gè)錨框檢測一個(gè)框或者連續(xù)的cell檢測相同的物體,產(chǎn)生冗余),NMS用于去除多個(gè)檢測框。
具體使用以下步驟:拋棄分?jǐn)?shù)低的框(意味著框?qū)τ跈z測一個(gè)類信心不大);當(dāng)多個(gè)框重合度高且都檢測同一個(gè)物體時(shí)只選擇一個(gè)框(NMS)。
為了更方便理解,我們選用上面的汽車圖像。首先,我們使用閾值進(jìn)行過濾一部分錨框。模型有19*19*3*85個(gè)數(shù),每個(gè)盒子由85個(gè)數(shù)字描述。將(19,19,3,85)分割為下面的形狀:
box_confidence:(19,19,3,1)表示19*19個(gè)cell,每個(gè)cell的 3個(gè)框,每個(gè)框有物體的置信度概率;
boxes:(19,19,3,4)表示每個(gè)cell 的3個(gè)框,每個(gè)框的表示;
box_class_probs:(19,19,3,80)表示每個(gè)cell的3個(gè)框,每個(gè)框80個(gè)類檢測概率。
每個(gè)錨框我們計(jì)算下面的元素級乘法并且得到錨框包含一個(gè)物體類的概率,如下圖:
即使通過類分?jǐn)?shù)閾值過濾一部分錨框,還剩下很多重合的框。第二個(gè)過程叫NMS,里面有個(gè)IoU,如下圖所示。
實(shí)現(xiàn)非極大值抑制,關(guān)鍵在于:選擇一個(gè)最高分?jǐn)?shù)的框;計(jì)算它和其他框的重合度,去除重合度超過IoU閾值的框;回到步驟1迭代直到?jīng)]有比當(dāng)前所選框低的框。
在Yolo v3的論文里沒有明確提出所用的損失函數(shù),確切地說,Yolo系列論文里面只有Yolo v1明確提了損失函數(shù)的公式。在Yolo v1中使用了一種叫sum-square error的損失計(jì)算方法,只是簡單的差方相加。我們知道,在目標(biāo)檢測任務(wù)里,有幾個(gè)關(guān)鍵信息是需要確定的:(x,y),(w,h),class,confidence 。根據(jù)關(guān)鍵信息的特點(diǎn)可以分為上述四類,損失函數(shù)應(yīng)該由各自特點(diǎn)確定。最后加到一起就可以組成最終的loss function了,也就是一個(gè)loss function搞定端到端的訓(xùn)練。
視頻地址: https://www.bilibili.com/video/BV12y4y1v7L6?from=search&seid=442233808730191461
錨框與目標(biāo)框做iou
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。