深度学习目标检测之 YOLO v1
這是繼 RCNN,fast-RCNN 和 faster-RCNN 之后,rbg(RossGirshick)針對DL目標(biāo)檢測速度問題提出的另外一種框架。YOLO V1 增強(qiáng)版本GPU中能跑45fps,簡化版本155fps。
- 論文名: 《You Only Look Once:Unified, Real-Time Object Detection》
- 論文地址:https://arxiv.org/pdf/1506.02640v5.pdf
- 代碼:https://github.com/pjreddie/darknet
1. YOLO的核心思想
YOLO的核心思想就是利用整張圖作為網(wǎng)絡(luò)的輸入,直接在輸出層回歸bounding box的位置和bounding box所屬的類別。
faster RCNN中也直接用整張圖作為輸入,但是faster-RCNN整體還是采用了RCNN那種 proposal+classifier的思想,只不過是將提取proposal的步驟放在CNN中實現(xiàn)了,而YOLO則采用直接回歸的思路。
2.YOLO的實現(xiàn)方法
將一幅圖像分成SxS個網(wǎng)格(grid cell),如果某個object的中心落在這個網(wǎng)格中,則這個網(wǎng)格就負(fù)責(zé)預(yù)測這個object。
每個網(wǎng)格要預(yù)測B個bounding box,每個bounding box除了要回歸自身的位置之外,還要附帶預(yù)測一個confidence值。
這個confidence代表了所預(yù)測的box中含有object的置信度和這個box預(yù)測的有多準(zhǔn)兩重信息,其值是這樣計算的:
Bbox置信度=P(Object)?IOUpredtruthBbox置信度 = P(Object) \ast IOU_{pred}^{truth} Bbox置信度=P(Object)?IOUpredtruth?
其中如果有object落在一個grid cell里,第一項取1,否則取0。 第二項是預(yù)測的bounding box和實際的groundtruth之間的IoU值。
每個bounding box要預(yù)測(x, y, w, h)和confidence共5個值,每個網(wǎng)格還要預(yù)測一個類別信息,記為C類。則 S?SS*SS?S 個網(wǎng)格,每個網(wǎng)格要預(yù)測B個bounding box還要預(yù)測C個categories。輸出就是 S?S?(5?B+C)S * S * (5*B+C)S?S?(5?B+C) 的一個tensor。
注意:class信息是針對每個網(wǎng)格的,confidence信息是針對每個bounding box的。
舉例說明: 在PASCAL VOC中,圖像輸入為448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x(2x5+20)的一個tensor。
整個網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:
在test的時候,每個網(wǎng)格預(yù)測的class信息和bounding box預(yù)測的confidence信息相乘,就得到每個bounding box的class-specific confidence score:
Pr(Classi∣Object)?Pr(Object)?IOUpredtruth=Pr(Classi)?IOUpredtruthPr(Class_{i}|Object) \ast Pr(Object) \ast IOU_{pred}^{truth} = Pr(Class_{i}) \ast IOU_{pred}^{truth} Pr(Classi?∣Object)?Pr(Object)?IOUpredtruth?=Pr(Classi?)?IOUpredtruth?
等式左邊第一項就是每個網(wǎng)格預(yù)測的類別信息,第二三項就是每個bounding box預(yù)測的confidence。這個乘積即encode了預(yù)測的box屬于某一類的概率,也有該box準(zhǔn)確度的信息。
得到每個box的class-specific confidence score以后,設(shè)置閾值,濾掉得分低的 boxes,對保留的 boxes 進(jìn)行NMS處理,就得到最終的檢測結(jié)果。
注意:
- 每個grid有30維,這30維中,8維是回歸box的坐標(biāo),2維是box的confidence,還有20維是類別。
- 其中坐標(biāo)的x,y用對應(yīng)網(wǎng)格的offset歸一化到0-1之間,w,h用圖像的width和height歸一化到0-1之間
簡單的概括就是:
(1) 給個一個輸入圖像,首先將圖像劃分成7*7的網(wǎng)格
(2) 對于每個網(wǎng)格,我們都預(yù)測2個邊框(包括每個邊框是目標(biāo)的置信度以及每個邊框區(qū)域在多個類別上的概率)
(3) 根據(jù)上一步可以預(yù)測出772個目標(biāo)窗口,然后根據(jù)閾值去除可能性比較低的目標(biāo)窗口,最后NMS去除冗余窗口即可
損失函數(shù)
在實現(xiàn)中,最主要的就是怎么設(shè)計損失函數(shù),讓這個三個方面得到很好的平衡。作者簡單粗暴的全部采用了sum-squared error loss來做這件事。 這種做法存在以下幾個問題:
- 第一,8維的localization error和20維的classification error同等重要顯然是不合理的;
- 第二,如果一個網(wǎng)格中沒有object(一幅圖中這種網(wǎng)格很多),那么就會將這些網(wǎng)格中的box的confidence push到0,相比于較少的有object的網(wǎng)格,這種做法是overpowering的,這會導(dǎo)致網(wǎng)絡(luò)不穩(wěn)定甚至發(fā)散。
解決辦法:
- 更重視8維的坐標(biāo)預(yù)測,給這些損失前面賦予更大的loss weight, 記為 λcoord\lambda_{coord}λcoord? 在pascal VOC訓(xùn)練中取5。
- 對沒有object的box的confidence loss,賦予小的loss weight,記為λnoobj\lambda_{noobj}λnoobj?在pascal VOC訓(xùn)練中取0.5。
- 有object的box的confidence loss和類別的loss的loss weight正常取1。
對不同大小的box預(yù)測中,相比于大box預(yù)測偏一點,小box預(yù)測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。 為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。這個參考下面的圖很容易理解,小box的橫軸值較小,發(fā)生偏移時,反應(yīng)到y(tǒng)軸上相比大box要大。(也是個近似逼近方式)
一個網(wǎng)格預(yù)測多個box,希望的是每個box predictor專門負(fù)責(zé)預(yù)測某個object。具體做法就是看當(dāng)前預(yù)測的box與ground truth box中哪個IoU大,就負(fù)責(zé)哪個。這種做法稱作box predictor的specialization。
最后整個的損失函數(shù)如下所示:
損失由三部分組成,分別是:坐標(biāo)預(yù)測損失、置信度預(yù)測損失、類別預(yù)測損失。
使用的是差方和誤差。需要注意的是,w和h在進(jìn)行誤差計算的時候取的是它們的平方根,原因是對不同大小的bounding box預(yù)測中,相比于大bounding box預(yù)測偏一點,小box預(yù)測偏一點更不能忍受。而差方和誤差函數(shù)中對同樣的偏移loss是一樣。 為了緩和這個問題,作者用了一個比較取巧的辦法,就是將bounding box的w和h取平方根代替原本的w和h。
定位誤差比分類誤差更大,所以增加對定位誤差的懲罰,使 λcoord=5λ_{coord}=5λcoord?=5。
在每個圖像中,許多網(wǎng)格單元不包含任何目標(biāo)。訓(xùn)練時就會把這些網(wǎng)格里的框的“置信度”分?jǐn)?shù)推到零,這往往超過了包含目標(biāo)的框的梯度。從而可能導(dǎo)致模型不穩(wěn)定,訓(xùn)練早期發(fā)散。因此要減少了不包含目標(biāo)的框的置信度預(yù)測的損失,使 λnoobj=0.5λ_{noobj}=0.5λnoobj?=0.5。
1iobj1_{i}^{obj}1iobj? 表示網(wǎng)格 i 中存在對象。
1ijobj1_{ij}^{obj}1ijobj? 表示 網(wǎng)格 i 的第 j 個 Bbox 中存在對象。
1ijnoobj1_{ij}^{noobj}1ijnoobj?表示網(wǎng)格 i 的第 j 個 Bbox 中不存在對象。
這個損失函數(shù)中:
- 只有當(dāng)某個網(wǎng)格中有object的時候才對classification error進(jìn)行懲罰。
- 只有當(dāng)某個box predictor對某個ground truth box負(fù)責(zé)的時候,才會對box的coordinate error進(jìn)行懲罰,而對哪個ground truth box負(fù)責(zé)就看其預(yù)測值和ground truth box的IoU是不是在那個cell的所有box中最大。
其他細(xì)節(jié),例如使用激活函數(shù)使用leak RELU,模型用ImageNet預(yù)訓(xùn)練等等,在這里就不一一贅述了。
優(yōu)點
- YOLO檢測速度非常快。標(biāo)準(zhǔn)版本的YOLO可以每秒處理 45 張圖像;YOLO的極速版本每秒可以處理150幀圖像。這就意味著 YOLO 可以以小于 25 毫秒延遲,實時地處理視頻。對于欠實時系統(tǒng),在準(zhǔn)確率保證的情況下,YOLO速度快于其他方法。
- YOLO 實時檢測的平均精度是其他實時監(jiān)測系統(tǒng)的兩倍。
- 遷移能力強(qiáng),能運(yùn)用到其他的新的領(lǐng)域(比如藝術(shù)品目標(biāo)檢測)。
YOLO的缺點
-
由于輸出層為全連接層,因此在檢測時,YOLO訓(xùn)練模型只支持與訓(xùn)練圖像相同的輸入分辨率
-
YOLO采用了多個下采樣層,網(wǎng)絡(luò)學(xué)到的物體特征并不精細(xì),因此也會影響檢測效果。
-
雖然每個格子可以預(yù)測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多只預(yù)測出一個物體。當(dāng)物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷。
-
YOLO loss函數(shù)中,大物體IOU誤差和小物體IOU誤差對網(wǎng)絡(luò)訓(xùn)練中l(wèi)oss貢獻(xiàn)值接近(雖然采用求平方根方式,但沒有根本解決問題)。因此,對于小物體,小的IOU誤差也會對網(wǎng)絡(luò)優(yōu)化過程造成很大的影響,從而降低了物體檢測的定位準(zhǔn)確性。
-
由于損失函數(shù)的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強(qiáng)。
-
YOLO方法模型訓(xùn)練依賴于物體識別標(biāo)注數(shù)據(jù),因此,對于非常規(guī)的物體形狀或比例,YOLO的檢測效果并不理想。同一類物體出現(xiàn)的新的不常見的長寬比和其他情況時,泛化能力偏弱。
總結(jié)
以上是生活随笔為你收集整理的深度学习目标检测之 YOLO v1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安川伺服驱动器的常用故障代码
- 下一篇: 网上商城APP系统源码 B2C商城系统源