CNN目标检测(二):YOLO
↑↑↑↑目錄在這里↑↑↑↑
縮進(jìn)YOLO全稱You Only Look Once: Unified, Real-Time Object Detection,是在CVPR2016提出的一種目標(biāo)檢測算法,核心思想是將目標(biāo)檢測轉(zhuǎn)化為回歸問題求解,并基于一個(gè)單獨(dú)的end-to-end網(wǎng)絡(luò),完成從原始圖像的輸入到物體位置和類別的輸出。YOLO與Faster RCNN有以下區(qū)別:
縮進(jìn)可以看出,YOLO將整個(gè)檢測問題整合為一個(gè)回歸問題,使得網(wǎng)絡(luò)結(jié)構(gòu)簡單,檢測速度大大加快;由于網(wǎng)絡(luò)沒有分支,所以訓(xùn)練也只需要一次即可完成。這種“把檢測轉(zhuǎn)化為回歸問題”的思路非常有效,之后的很多檢測算法(包括SSD)都借鑒了此思路。
1. YOLO網(wǎng)絡(luò)結(jié)構(gòu)
縮進(jìn)上圖2中展示了YOLO的網(wǎng)絡(luò)結(jié)構(gòu)。相比Faster RCNN,YOLO結(jié)構(gòu)簡單而,網(wǎng)絡(luò)中只包含conv,relu,pooling和全連接層,以及最后用來綜合信息的detect層。其中使用了1x1卷積用于多通道信息融合(若不明白1x1卷積請查看上一篇Faster RCNN文章)。
2. YOLO核心思想
圖3
YOLO的工作過程分為以下幾個(gè)過程:
(1) 將原圖劃分為SxS的網(wǎng)格。如果一個(gè)目標(biāo)的中心落入某個(gè)格子,這個(gè)格子就負(fù)責(zé)檢測該目標(biāo)。
(2) 每個(gè)網(wǎng)格要預(yù)測B個(gè)bounding boxes,以及C個(gè)類別概率Pr(classi|object)。這里解釋一下,C是網(wǎng)絡(luò)分類總數(shù),由訓(xùn)練時(shí)決定。在作者給出的demo中C=20,包含以下類別:
人person
鳥bird、貓cat、牛cow、狗dog、馬horse、羊sheep
飛機(jī)aeroplane、自行車bicycle、船boat、巴士bus、汽車car、摩托車motorbike、火車train
瓶子bottle、椅子chair、餐桌dining table、盆景potted plant、沙發(fā)sofa、顯示器tv/monitor
在YOLO中,每個(gè)格子只有一個(gè)C類別,即相當(dāng)于忽略了B個(gè)bounding boxes,每個(gè)格子只判斷一次類別,這樣做非常簡單粗暴。
(3) 每個(gè)bounding box除了要回歸自身的位置之外,還要附帶預(yù)測一個(gè)confidence值。這個(gè)confidence代表了所預(yù)測的box中含有目標(biāo)的置信度和這個(gè)bounding box預(yù)測的有多準(zhǔn)兩重信息:
如果有目標(biāo)落中心在格子里Pr(Object)=1;否則Pr(Object)=0。 第二項(xiàng)是預(yù)測的bounding box和實(shí)際的ground truth之間的IOU。
縮進(jìn)所以,每個(gè)bounding box都包含了5個(gè)預(yù)測量:(x, y, w, h, confidence),其中(x, y)代表預(yù)測box相對于格子的中心,(w, h)為預(yù)測box相對于圖片的width和height比例,confidence就是上述置信度。需要說明,這里的x, y, w和h都是經(jīng)過歸一化的,之后有解釋。
(4) 由于輸入圖像被分為SxS網(wǎng)格,每個(gè)網(wǎng)格包括5個(gè)預(yù)測量:(x, y, w, h, confidence)和一個(gè)C類,所以網(wǎng)絡(luò)輸出是SxSx(5xB+C)大小
(5) 在檢測目標(biāo)的時(shí)候,每個(gè)網(wǎng)格預(yù)測的類別條件概率和bounding box預(yù)測的confidence信息相乘,就得到每個(gè)bounding box的class-specific confidence score:?
顯然這個(gè)class-specific confidence score既包含了bounding box最終屬于哪個(gè)類別的概率,又包含了bounding box位置的準(zhǔn)確度。最后設(shè)置一個(gè)閾值與class-specific confidence score對比,過濾掉score低于閾值的boxes,然后對score高于閾值的boxes進(jìn)行非極大值抑制(NMS, non-maximum suppression)后得到最終的檢測框體。
3. YOLO中的Bounding Box Normalization
縮進(jìn)YOLO在實(shí)現(xiàn)中有一個(gè)重要細(xì)節(jié),即對bounding box的坐標(biāo)(x, y, w, h)進(jìn)行了normalization,以便進(jìn)行回歸。作者認(rèn)為這是一個(gè)非常重要的細(xì)節(jié)。在原文2.2 Traing節(jié)中有如下一段:
Our final layer predicts both class probabilities and bounding box coordinates.
We normalize the bounding box width and height by the image width and height so that they fall between 0 and 1.
We parametrize the bounding box x and y coordinates to be offsets of a particular grid cell location so they are also bounded between 0 and 1.
縮進(jìn)接下來分析一下到底如何實(shí)現(xiàn)。
圖4 SxS網(wǎng)格與bounding box關(guān)系(圖中S=7,row=4且col=1)
縮進(jìn)如圖4,在YOLO中輸入圖像被分為SxS網(wǎng)格。假設(shè)有一個(gè)bounding box(如圖4紅框),其中心剛好落在了(row,col)網(wǎng)格中,則這個(gè)網(wǎng)格需要負(fù)責(zé)預(yù)測整個(gè)紅框中的dog目標(biāo)。假設(shè)圖像的寬為widthimage,高為heightimage;紅框中心在(xc,yc),寬為widthbox,高為heightbox那么:
(1) 對于bounding box的寬和高做如下normalization,使得輸出寬高介于0~1:
(2) 使用(row, col)網(wǎng)格的offset歸一化bounding box的中心坐標(biāo):
經(jīng)過上述公式得到的normalization的(x, y, w, h),再加之前提到的confidence,共同組成了一個(gè)真正在網(wǎng)絡(luò)中用于回歸的bounding box;而當(dāng)網(wǎng)絡(luò)在Test階段(x, y, w, h)經(jīng)過反向解碼又可得到目標(biāo)在圖像坐標(biāo)系的框,解碼代碼在darknet detection_layer.c中的get_detection_boxes()函數(shù),關(guān)鍵部分如下:
[cpp] view plaincopy
4. YOLO訓(xùn)練過程
縮進(jìn)對于任何一種網(wǎng)絡(luò),loss都是非常重要的,直接決定網(wǎng)絡(luò)效果的好壞。YOLO的Loss函數(shù)設(shè)計(jì)時(shí)主要考慮了以下3個(gè)方面
(1) bounding box的(x, y, w, h)的坐標(biāo)預(yù)測誤差。
縮進(jìn)在檢測算法的實(shí)際使用中,一般都有這種經(jīng)驗(yàn):對不同大小的bounding box預(yù)測中,相比于大box大小預(yù)測偏一點(diǎn),小box大小測偏一點(diǎn)肯定更不能被忍受。所以在Loss中同等對待大小不同的box是不合理的。為了解決這個(gè)問題,作者用了一個(gè)比較取巧的辦法,即對w和h求平方根進(jìn)行回歸。從后續(xù)效果來看,這樣做很有效,但是也沒有完全解決問題。
(2) bounding box的confidence預(yù)測誤差
縮進(jìn)由于絕大部分網(wǎng)格中不包含目標(biāo),導(dǎo)致絕大部分box的confidence=0,所以在設(shè)計(jì)confidence誤差時(shí)同等對待包含目標(biāo)和不包含目標(biāo)的box也是不合理的,否則會導(dǎo)致模型不穩(wěn)定。作者在不含object的box的confidence預(yù)測誤差中乘以懲罰權(quán)重λnoobj=0.5。
縮進(jìn)除此之外,同等對待4個(gè)值(x, y, w, h)的坐標(biāo)預(yù)測誤差與1個(gè)值的conference預(yù)測誤差也不合理,所以作者在坐標(biāo)預(yù)測誤差誤差之前乘以權(quán)重λcoord=5(至于為什么是5而不是4,我也不知道T_T)。
(3) 分類預(yù)測誤差
縮進(jìn)即每個(gè)box屬于什么類別,需要注意一個(gè)網(wǎng)格只預(yù)測一次類別,即默認(rèn)每個(gè)網(wǎng)格中的所有B個(gè)bounding box都是同一類。
所以,YOLO的最終誤差為下:
Loss =?λcoord *?坐標(biāo)預(yù)測誤差 + (含object的box confidence預(yù)測誤差 +?λnoobj * 不含object的box confidence預(yù)測誤差) + 類別預(yù)測誤差
=
-------------------------------------------------------下面是一點(diǎn)參考內(nèi)容--------------------------------------------------------
縮進(jìn)在各種常用框架中實(shí)現(xiàn)網(wǎng)絡(luò)中一般需要完成forward與backward過程,forward函數(shù)只需依照Loss編碼即可,而backward函數(shù)簡需要計(jì)算殘差delta。這里單解釋一下YOLO的負(fù)反饋,即backward的實(shí)現(xiàn)方法。在UFLDL教程中網(wǎng)絡(luò)正向傳播方式定義為:
而最后一層反向傳播殘差定義為:
對于YOLO來說,最后一層是detection_layer,而倒數(shù)第二層是connected_layer(全連接層),之間沒有ReLU層,即相當(dāng)于最后一層的激活函數(shù)為:
那么,對于detection_layer的殘差就變?yōu)?#xff1a;
只需計(jì)算每一項(xiàng)的參數(shù)訓(xùn)練目標(biāo)值與網(wǎng)絡(luò)輸出值之差,反向回傳即可,與代碼對應(yīng)。其他細(xì)節(jié)讀者請自行分析代碼,不再介紹。
5. 結(jié)果分析
縮進(jìn)在論文中,作者給出了YOLO與Fast RCNN檢測結(jié)果對比,如下圖。YOLO對背景的誤判率(4.75%)比Fast RCNN的誤判率(13.6%)低很多。但是YOLO的定位準(zhǔn)確率較差,占總誤差比例的19.0%,而fast rcnn僅為8.6%。這說明了YOLO中把檢測轉(zhuǎn)化為回歸的思路有較好的precision,但是bounding box的定位方法還需要進(jìn)一步改進(jìn)。
縮進(jìn)綜上所述,YOLO有如下特點(diǎn):
----------------------------------------------------------------------
參考文獻(xiàn):
[1] YOLO詳解,趙麗麗, https://zhuanlan.zhihu.com/p/25236464
[2] 論文閱讀筆記:You Only Look Once: Unified, Real-Time Object Detection,tangwei2014,http://blog.csdn .NET/tangwei2014/article/details/5091531總結(jié)
以上是生活随笔為你收集整理的CNN目标检测(二):YOLO的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CNN目标检测(一):Faster RC
- 下一篇: Faster RCNN解析