導語:如今基于深度學習的目標檢測已經逐漸成為自動駕駛、視頻監(jiān)控、機械加工、智能機器人等領域的核心技術,而現(xiàn)存的大多數(shù)精度高的目標檢測算法,速度較慢,無法適應工業(yè)界對于目標檢測實時性的需求,這時 YOLO 算法橫空出世,以近乎極致的速度和出色的準確度贏得了大家的一致好評。基于此,我們選擇 YOLO 算法來實現(xiàn)目標檢測。YOLO 算法目前已經經過了 3 個版本的迭代,在速度和精確度上獲得了巨大的提升,我們將從 YOLO v1 開始講起,直至目前最新的版本 YOLO v3。
1. YOLO V1 一步檢測的開山之作
相對于傳統(tǒng)的分類問題,目標檢測顯然更符合現(xiàn)實需求,因為往往現(xiàn)實中不可能在某一個場景只有一個物體,因此目標檢測的需求變得更為復雜,不僅僅要求算法能夠檢驗出是什么物體,還需要確定這個物體在圖片哪里。
在這一過程中,目標檢測經歷了一個高度的符合人類的直覺的過程。既需要識別出目標的位置,將圖片劃分成小圖片扔進算法中去,當算法認為某物體在這個小區(qū)域上之時,那么檢測完成。那我們就認為這個物體在這個小圖片上了。而這個思路,正是比較早期的目標檢測思路,比如 R-CNN。
后來的 Fast R-CNN,F(xiàn)aster R-CNN[16] 雖有改進,比如不再是將圖片一塊塊的傳進 CNN 提取特征,而是整體放進 CNN 提取特征圖后,再做進一步處理,但依舊是整體流程分為區(qū)域提取和目標分類兩部分(two-stage),這樣做的一個特點是雖然確保了精度,但速度非常慢,于是以 YOLO(You only look once)為主要代表的這種一步到位(one-stage)即端到端的目標檢測算法應運而生了。
1.1 YOLO v1 基本思想
YOLO v1 的核心思想在于將目標檢測作為回歸問題解決 ,YOLO v1 首先會把原始圖片放縮到 448×448 的尺寸,放縮到這個尺寸是為了后面整除來的方便。然后將圖片劃分成 SxS 個區(qū)域,注意這個區(qū)域的概念不同于上文提及將圖片劃分成 N 個區(qū)域扔進算法的區(qū)域不同。上文提及的區(qū)域是將圖片進行剪裁,或者說把圖片的某個局部的像素輸入算法中,而這里的劃分區(qū)域,只的是邏輯上的劃分。
如果一個對象的中心落在某個單元格上,那么這個單元格負責預測這個物體。每個單元格需要預測 B 個邊界框(bbox)值(bbox 值包括坐標和寬高),同時為每個 bbox 值預測一個置信度(confidence scores)。 此后以每個單元格為單位進行預測分析。
這個置信度并不只是該邊界框是待檢測目標的概率,而是該邊界框是待檢測目標的概率乘上該邊界框和真實位置的 IoU(框之間的交集除以并集)的積。通過乘上這個交并比,反映出該邊界框預測位置的精度。如下式所示:
每個邊界框對應于 5 個輸出,分別是 x,y,w,h 和置信度。其中 x,y 代表邊界框的中心離開其所在網格單元格邊界的偏移。w,h 代表邊界框真實寬高相對于整幅圖像的比例。x,y,w,h 這幾個參數(shù)都已經被限制到了區(qū)間 [0,1] 上。除此以外,每個單元格還產生 C 個條件概率,。注意,我們不管 B 的大小,每個單元格只產生一組這樣的概率。
圖一:YOLO預測圖示
在 test 的非極大值抑制階段,對于每個邊界框,按照下式衡量該框是否應該予以保留。
這就是每個單元格的個體分類置信度得分(class-specific confidence scores),這即包含了預測的類別信息,也包含了對 bbox 值的準確度。 我們可以設置一個閾值,把低分的 class-specific confidence scores 濾掉,剩下的留給給非極大值抑制,得到最終的標定框。
在 PASCAL VOC 進行測試時,使用 S=7, B=2。由于共有 20 類,故 C=20。所以,網絡輸出大小為 7×7×30。
1.2 網絡模型結構
圖二:網絡框架
該網絡結構包括 24 個卷積層,最后接 2 個全連接層。Draknet[13] 網絡借鑒 GoogleNet 的思想,在每個 1x1 的卷積層之后再接一個 3x3 的卷積層的結構替代 GoogleNet 的Inception 結構。論文中還提到了更快版本的 Yolo,只有 9 個卷積層,其他則保持一致。
1.3 損失函數(shù)
YOLO v1 全部使用了均方差(mean squared error)作為損失(loss)函數(shù)。由三部分組成:坐標誤差、IOU 誤差和分類誤差。
考慮到每種 loss 的貢獻率,YOLO v1給坐標誤差(coordErr)設置權重λcoord=5。在計算 IoU 誤差時,包含物體的格子與不包含物體的格子,二者的 IOU 誤差對網絡 loss 的貢獻值是不同的。若采用相同的權值,那么不包含物體的格子的置信度值近似為 0,變相放大了包含物體的格子的置信度誤差,在計算網絡參數(shù)梯度時的影響。為解決這個問題,YOLO 使用 λnoobj=0.5 修正(置信度誤差)iouErr。(此處的‘包含’是指存在一個物體,它的中心坐標落入到格子內)。
對于相等的誤差值,大物體誤差對檢測的影響應小于小物體誤差對檢測的影響。這是因為,相同的位置偏差占大物體的比例遠小于同等偏差占小物體的比例。YOLO 將物體大小的信息項(w 和 h)進行求平方根來改進這個問題,但并不能完全解決這個問題。
綜上,YOLO v1 在訓練過程中 Loss 計算如下式所示:
在激活函數(shù)上:
在最后一層使用的是標準的線性激活函數(shù),其他的層都使用 leaky rectified 線性激活函數(shù)。
1.4 總結
YOLO v1 作為一步檢測的開山之作,最大的特點就是速度快。其將物體檢測作為回歸問題進行求解,使用單個網絡完成整個檢測的方法,大大提升了同類目標檢測算法的速度,并且實現(xiàn)了召回率低,表現(xiàn)為背景誤檢率低的有點。YOLO v1 可以獲取到圖像的整體信息,相比于 region proposal 等方法,有著更廣闊的“視野”。對其種類的物體,訓練后識別效果也十分優(yōu)異,具有很強的泛化能力。
但是 YOLO v1 的精準性和召回率相對于 fast rcnn 比較差。其對背景的誤判率比 Fast RCNN 的誤判率低很多。這說明了 YOLO v1 中把物體檢測的思路轉成回歸問題的思路有較好的準確率,但是對于 bounding box 的定位不是很好。
2.YOLO v2/YOLO9000 更準、更快、更強
YOLO v1 對于 bounding box 的定位不是很好,在精度上比同類網絡還有一定的差距,所以 YOLO v2 對于速度和精度做了很大的優(yōu)化,并且吸收了同類網絡的優(yōu)點,一步步做出嘗試。
YOLO v2 在 v1 基礎上做出改進后提出。其受到 Faster RCNN 方法的啟發(fā),引入了 anchor。同時使用了 K-Means 方法,對 anchor 數(shù)量進行了討論,在精度和速度之間做出折中。并且修改了網絡結構,去掉了全連接層,改成了全卷積結構。在訓練時引入了世界樹(WordTree)結構,將檢測和分類問題做成了一個統(tǒng)一的框架,并且提出了一種層次性聯(lián)合訓練方法,將 ImageNet 分類數(shù)據(jù)集和 COCO 檢測數(shù)據(jù)集同時對模型訓練。
2.1 更準
YOLO v2 對每批數(shù)據(jù)都做了一個歸一化預處理。通過在每一個卷積層后添加batch normalization,極大的改善了收斂速度同時減少了對其它正則方法的依賴(舍棄了dropout優(yōu)化后依然沒有過擬合),使得 mAP 獲得了 2% 的提升。(mAP:平均精度均值(mean Average Precision))
YOLO v1 在分辨率為 224×224 的圖片上進行預訓練,在正式訓練時將分辨率提升到 448×448,這需要模型去適應新的分辨率。但是 YOLO v2 是直接使用 448×448 的輸入,隨著輸入分辨率的增加,模型提高了 4% 的 mAP。
在預測框的數(shù)量上,由于 YOLO v2 將網絡的輸入分辨率調整到 416×416,保證為多次卷積后,下采樣率為 32,得到 13×13 的特征圖(feature map)。在這上面使用 9 種 anchor boxes[7],得到 13×13×9=1521 個,這比 YOLO v1 大多了。
YOLO v1 利用全連接層的數(shù)據(jù)完成邊框的預測,會導致丟失較多的空間信息,使定位不準。在 YOLO v2 中作者借鑒了 Faster R-CNN 中的 anchor 思想,來改善全連接層帶來的影響。
Anchor 是 RPN(region proposal network)網絡在 Faster R-CNN 中的一個關鍵步驟,是在卷積特征圖上進行滑窗操作,每一個中心可以預測 9 種不同大小的候選框。
為了引入 anchor boxes 來預測候選框,作者在網絡中去掉了全連接層。并去掉了最后的一個池化層以確保輸出的卷積特征圖有更高的分辨率。然后,通過縮減網絡,讓圖片輸入分辨率為 416 * 416,目的是為了讓后面產生的卷積特征圖寬高都為奇數(shù),這樣就可以產生一個中心框(center cell)。
作者觀察到,大物體通常占據(jù)了圖像的中間位置,可以只用中心的一個框來預測這些物體的位置,否則就要用中間的 4 個格子來進行預測,這個技巧可稍稍提升效率。最后,YOLO v2 使用了卷積層降采樣(采樣因子為 32),使得輸入卷積網絡的 416 * 416 圖片最終得到 13 * 13 的卷積特征圖(416/32=13)。
沒有 anchor boxes 的情況下,模型召回率(recall)為 81%,mAP 為 69.5%;加入 anchor boxes,模型召回率為 88%,mAP 為 69.2%。這樣看來,準確率只有小幅度的下降,而召回率則提升了 7%。
在使用 anchor 的時候作者遇到了兩個問題,第一個是 anchor boxes 的寬高維度往往是精選的先驗框(hand-picked priors)也就是說人工選定的先驗框。雖然在訓練過程中網絡也會學習調整框的寬高維度,最終得到準確的 bounding boxes。但是,如果一開始就選擇了更好的、更有代表性的先驗框維度,那么網絡就更容易學到準確的預測位置。
為了使網絡更易學到準確的預測位置,作者使用了 K-means 聚類方法類訓練 bounding boxes,可以自動找到更好的框寬高維度。傳統(tǒng)的 K-means 聚類方法使用的是歐氏距離函數(shù),也就意味著較大的框會比較小的框產生更多的誤差,聚類結果可能會偏離。為此,作者采用 IOU 得分作為評價標準,這樣的話,誤差就和框的尺度無關了,最終的距離函數(shù)為:
對數(shù)據(jù)集的聚類結果如下:
圖三:聚類數(shù)目與Avg IoU的關系(使用VOC2007和COCO數(shù)據(jù)集)
可以看出 k=5 在模型復雜度與召回率之間取一個折中值。 在使用 anchor 的時候,遇到的第二個問題是加入 anchor box 的模型不穩(wěn)定。作者認為模型不穩(wěn)定的原因來自于預測 bbox 的(x,y)。如下:
在 Faster R-CNN 的預測中,偏移因子,是沒有限制的,因此收斂會比較慢。故我們想讓每個模型預測目標附近的一個部分,論文對采用了和 YOLO v1 一樣的方法,直接預測中心點,并使用 Sigmoid 函數(shù)將偏移量限制在 0 到 1 之間(這里的尺度是針對網格框)。
計算公式如下:
bx,by,bw,bh 是預測的 bbox 的中心點坐標和寬高,中心點坐標的尺度是相對于網格。
如圖四:
圖四:各個參數(shù)的位置圖示
經過維度聚類和直接位置預測的操作,在原有的 anchor boxes 版本上又提升了 5% 的 mAP。
YOLO v1 在對于大目標檢測有很好的效果,但是對小目標檢測上,效果欠佳。為了改善這一問題,作者參考了 Faster R-CNN 和 SSD 的想法,在不同層次的特征圖上獲取不同分辨率的特征。作者將上層的(前面 26×26)高分辨率的特征圖(feature map)直接連到 13×13 的 feature map 上。把 26×26×512 轉換為 13×13×2048,并拼接住在一起使整體性能提升 1%。
Multi-Scale Training
和 GoogleNet 訓練時一樣,為了提高模型的魯棒性(robust),在訓練的時候使用多尺度[6]的輸入進行訓練。因為網絡的卷積層下采樣因子為 32,故輸入尺寸選擇 32 的倍數(shù) 288,352,…,544。
圖五:不同尺度訓練的精度與其他網絡的精度對比
2.2 更快
大多數(shù)目標檢測的框架是建立在 VGG-16 上的,VGG-16 在 ImageNet 上能達到 90% 的 top-5(最后概率向量最大的前五名中出現(xiàn)了正確概率即為預測正確),但是單張圖片需要 30.69 billion 浮點運算,YOLO v2 是依賴于 DarkNet-19 的結構,該模型在 ImageNet 上能達到 91% 的 top-5,并且單張圖片只需要 5.58 billion 浮點運算,大大的加快了運算速度。DarkNet 的結構圖如下:
圖六:YOLOv2網絡結構
YOLO v2 去掉 YOLO v1 的全連接層,同時去掉 YOLO v1 的最后一個池化層,增加特征的分辨率,修改網絡的輸入,保證特征圖有一個中心點,這樣可提高效率。并且是以每個 anchor box 來預測物體種類的。
作者將分類和檢測分開訓練,在訓練分類時,以 Darknet-19 為模型在 ImageNet 上用隨機梯度下降法(Stochastic gradient descent)跑了 160 epochs,跑完了 160 epochs 后,把輸入尺寸從 224×224 上調為 448×448,這時候學習率調到 0.001,再跑了 10 epochs, DarkNet 達到了 top-1 準確率 76.5%,top-5 準確率 93.3%。
在訓練檢測時,作者把分類網絡改成檢測網絡,去掉原先網絡的最后一個卷積層,取而代之的是使用 3 個 3×3x1024 的卷積層,并且每個新增的卷積層后面接 1×1 的卷積層,數(shù)量是我們要檢測的類的數(shù)量。
2.3 更強
論文提出了一種聯(lián)合訓練的機制:使用識別數(shù)據(jù)集訓練模型識別相關部分,使用分類數(shù)據(jù)集訓練模型分類相關部分。
眾多周知,檢測數(shù)據(jù)集的標注要比分類數(shù)據(jù)集打標簽繁瑣的多,所以 ImageNet 分類數(shù)據(jù)集比 VOC 等檢測數(shù)據(jù)集高出幾個數(shù)量級。所以在 YOLO v1 中,邊界框的預測其實并不依賴于物體的標簽,YOLO v2 實現(xiàn)了在分類和檢測數(shù)據(jù)集上的聯(lián)合訓練。對于檢測數(shù)據(jù)集,可以用來學習預測物體的邊界框、置信度以及為物體分類,而對于分類數(shù)據(jù)集可以僅用來學習分類,但是其可以大大擴充模型所能檢測的物體種類。
作者選擇在 COCO 和 ImageNet 數(shù)據(jù)集上進行聯(lián)合訓練,遇到的第一問題是兩者的類別并不是完全互斥的,比如"Norfolk terrier"明顯屬于"dog",所以作者提出了一種層級分類方法(Hierarchical classification),根據(jù)各個類別之間的從屬關系(根據(jù) WordNet)建立一種樹結構 WordTree,結合 COCO 和 ImageNet 建立的詞樹(WordTree)如下圖所示:
圖七:WordTree
WordTree 中的根節(jié)點為"physical object",每個節(jié)點的子節(jié)點都屬于同一子類,可以對它們進行 softmax 處理。在給出某個類別的預測概率時,需要找到其所在的位置,遍歷這個路徑,然后計算路徑上各個節(jié)點的概率之積。
在訓練時,如果是檢測樣本,按照 YOLO v2 的 loss 計算誤差,而對于分類樣本,只計算分類誤差。在預測時,YOLO v2 給出的置信度就是 ,同時會給出邊界框位置以及一個樹狀概率圖。在這個概率圖中找到概率最高的路徑,當達到某一個閾值時停止,就用當前節(jié)點表示預測的類別。
2.4 總結
通過對 YOLO v1 網絡結構和訓練方法的改進,提出了 YOLO v2/YOLO9000 實時目標檢測系統(tǒng)。YOLO v2 在 YOLO v1 的基礎上進行了一系列的改進,在快速的同時達到 state of the art。同時,YOLO v2 可以適應不同的輸入尺寸,根據(jù)需要調整檢測準確率和檢測速度(值得參考)。作者綜合了 ImageNet 數(shù)據(jù)集和 COCO 數(shù)據(jù)集,采用聯(lián)合訓練的方式訓練,使該系統(tǒng)可以識別超過 9000 種物品。除此之外,作者提出的 WordTree 可以綜合多種數(shù)據(jù)集的方法可以應用于其它計算機數(shù)覺任務中。但是對于重疊的分類,YOLO v2 依然無法給出很好的解決方案。
3.YOLO v3 集大成之作
YOLO v3 是到目前為止,速度和精度最均衡的目標檢測網絡。通過多種先進方法的融合,將 YOLO 系列的短板(速度很快,不擅長檢測小物體等)全部補齊。達到了令人驚艷的效果和拔群的速度。
圖八:YOLOv3與其他網絡的mAP與運行時間對比
3.1 多標簽分類預測
在 YOLO9000[14] 之后,我們的系統(tǒng)使用維度聚類(dimension clusters )作為 anchor boxes 來預測邊界框,網絡為每個邊界框預測 4 個坐標。
在 YOLO v3[15] 中使用邏輯回歸預測每個邊界框(bounding box)的對象分數(shù)。 如果先前的邊界框比之前的任何其他邊界框重疊 ground truth 對象,則該值應該為 1。如果以前的邊界框不是最好的,但是確實將 ground truth 對象重疊了一定的閾值以上,我們會忽略這個預測,按照進行。我們使用閾值 0.5。與 YOLO v2 不同,我們的系統(tǒng)只為每個 ground truth 對象分配一個邊界框。如果先前的邊界框未分配給 grounding box 對象,則不會對坐標或類別預測造成損失。
在 YOLO v3 中,每個框使用多標簽分類來預測邊界框可能包含的類。該算法不使用 softmax,因為它對于高性能沒有必要,因此 YOLO v3 使用獨立的邏輯分類器。在訓練過程中,我們使用二元交叉熵損失來進行類別預測。對于重疊的標簽,多標簽方法可以更好地模擬數(shù)據(jù)。
3.2 跨尺度預測
YOLO v3 采用多個尺度融合的方式做預測。原來的 YOLO v2 有一個層叫:passthrough layer,假設最后提取的 feature map 的 size 是 13*13,那么這個層的作用就是將前面一層的 26*26 的 feature map 和本層的 13*13 的 feature map 進行連接,有點像 ResNet。這樣的操作也是為了加強 YOLO 算法對小目標檢測的精確度。這個思想在 YOLO v3 中得到了進一步加強,在 YOLO v3 中采用類似 FPN 的上采樣(upsample)和融合做法(最后融合了 3 個 scale,其他兩個 scale 的大小分別是 26*26 和 52*52),在多個 scale 的 feature map 上做檢測,對于小目標的檢測效果提升還是比較明顯的。雖然在 YOLO v3 中每個網格預測 3 個邊界框,看起來比 YOLO v2 中每個 grid cell 預測 5 個邊界框要少,但因為 YOLO v3 采用了多個尺度的特征融合,所以邊界框的數(shù)量要比之前多很多。
3.3 網絡結構改變
YOLO v3 使用新的網絡來實現(xiàn)特征提取。在 Darknet-19 中添加殘差網絡的混合方式,使用連續(xù)的 3×3 和 1×1 卷積層,但現(xiàn)在也有一些 shortcut 連接,YOLO v3 將其擴充為 53 層并稱之為 Darknet-53。
圖九:Darknet-53網絡結構
這個新網絡比 Darknet-19 功能強大得多,而且比 ResNet-101 或 ResNet-152 更有效。
圖十:ImageNet結果
每個網絡都使用相同的設置進行訓練,并以 256×256 的單精度測試進行測試。運行時間是在 Titan X 上以 256×256 進行測量的。因此,Darknet-53 可與 state-of-the-art 的分類器相媲美,但浮點運算更少,速度更快。Darknet-53 比 ResNet-101 更好,速度更快 1:5 倍。
Darknet-53 與 ResNet-152 具有相似的性能,速度提高 2 倍。 Darknet-53 也可以實現(xiàn)每秒最高的測量浮點運算。這意味著網絡結構可以更好地利用 GPU,從而使其評估效率更高,速度更快。
3.4 總結
YOLO 檢測算法進行目標檢測,取得了較高的檢測速度和檢測準確率。該算法不僅對于實物有著很好的效果,對于其他目標,如藝術作品等同樣具有很好的兼容性。YOLO 算法相比其他算法更符合工業(yè)界對目標檢測算法實時性的要求,簡單易實現(xiàn),對于嵌入式很友好。
YOLO 系列不斷吸收目標檢測同類算法的優(yōu)點,將其應用于自身,不斷進步,可謂成長中的算法。
-
網格
+關注
關注
0文章
139瀏覽量
16014 -
自動駕駛
+關注
關注
784文章
13784瀏覽量
166389 -
深度學習
+關注
關注
73文章
5500瀏覽量
121111
原文標題:一文看盡目標檢測:從YOLO v1到v3的進化之路
文章出處:【微信號:rgznai100,微信公眾號:rgznai100】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論