目標檢測網路之 YOLOv3
yolo-idea
本文逐步介紹YOLO v1~v3的設計歷程。
YOLOv1基本思想
YOLO將輸入影像分成SxS個格子,若某個物體 Ground truth 的中心位置的座標落入到某個格子,那麼這個格子就負責檢測出這個物體。
yolo-grid-predict
每個格子預測B個bounding box及其置信度(confidence score),以及C個類別概率。bbox資訊(x,y,w,h)為物體的中心位置相對格子位置的偏移及寬度和高度,均被歸一化.置信度反映是否包含物體以及包含物體情況下位置的準確性,定義為Pr(Object)×IOUtruthpred,其中Pr(Object)∈{0,1}Pr(Object)×IOUpredtruth,其中Pr(Object)∈{0,1}.
網路結構
YOLOv1網路借鑑了GoogLeNet分類網路結構。不同的是,YOLO未使用inception module,而是使用1x1卷積層(此處1x1卷積層的存在是為了跨通道資訊整合)+3x3卷積層簡單替代。
YOLOv1網路在最後使用全連線層進行類別輸出,因此全連線層的輸出維度是 S×S×(B×5+C)S×S×(B×5+C)。
YOLOv1網路比VGG16快(浮點數少於VGG的1/3),準確率稍差。
缺餡:
-
輸入尺寸固定:由於輸出層為全連線層,因此在檢測時,YOLO訓練模型只支援與訓練影像相同的輸入解析度。其它解析度需要縮放成改解析度.
-
佔比較小的目標檢測效果不好.雖然每個格子可以預測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多隻預測出一個物體。當物體佔畫面比例較小,如影像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。
損失函式
YOLO全部使用了均方和誤差作為loss函式.由三部分組成:座標誤差、IOU誤差和分類誤差。
loss=∑i=0s2coordErr+iouErr+clsErrloss=∑i=0s2coordErr+iouErr+clsErr
簡單相加時還要考慮每種loss的貢獻率,YOLO給coordErr設定權重λcoord=5λcoord=5.在計算IOU誤差時,包含物體的格子與不包含物體的格子,二者的IOU誤差對網路loss的貢獻值是不同的。若採用相同的權值,那麼不包含物體的格子的confidence值近似為0,變相放大了包含物體的格子的confidence誤差在計算網路引數梯度時的影響。為解決這個問題,YOLO 使用λnoobj=0.5λnoobj=0.5修正iouErr。(此處的‘包含’是指存在一個物體,它的中心座標落入到格子內)。對於相等的誤差值,大物體誤差對檢測的影響應小於小物體誤差對檢測的影響。這是因為,相同的位置偏差佔大物體的比例遠小於同等偏差佔小物體的比例。YOLO將物體大小的資訊項(w和h)進行求平方根來改進這個問題,但並不能完全解決這個問題。
綜上,YOLO在訓練過程中Loss計算如下式所示:
yolo-loss
其中有寶蓋帽子符號(x^,y^,w^,h^,C^,p^x^,y^,w^,h^,C^,p^)為預測值,無帽子的為訓練標記值。1objij1ijobj表示物體落入格子i的第j個bbox內.如果某個單元格中沒有目標,則不對分類誤差進行反向傳播;B個bbox中與GT具有最高IoU的一個進行座標誤差的反向傳播,其餘不進行.
訓練過程
1)預訓練。使用 ImageNet 1000 類資料訓練YOLO網路的前20個卷積層+1個average池化層+1個全連線層。訓練影像解析度resize到224x224。
2)用步驟1)得到的前20個卷積層網路引數來初始化YOLO模型前20個卷積層的網路引數,然後用 VOC 20 類標註資料進行YOLO模型訓練。檢測通常需要有細密紋理的視覺資訊,所以為提高影像精度,在訓練檢測模型時,將輸入影像解析度從224 × 224 resize到448x448。
訓練時B個bbox的ground truth設定成相同的.
與 Fast-R-CNN 對比
YOLO與Fast R-CNN相比有較大的定位誤差,與基於region proposal的方法相比具有較低的召回率。但是,YOLO在定位識別背景時準確率更高,而 Fast-R-CNN 的假陽性很高。基於此作者設計了 Fast-R-CNN + YOLO 檢測識別模式,即先用R-CNN提取得到一組bounding box,然後用YOLO處理影像也得到一組bounding box。對比這兩組bounding box是否基本一致,如果一致就用YOLO計算得到的概率對目標分類,最終的bouding box的區域選取二者的相交區域。這種組合方式將準確率提高了3個百分點。
升級版 YOLO v2
為提高物體定位精準性和召回率,YOLO作者提出了 《YOLO9000: Better, Faster, Stronger》 (Joseph Redmon, Ali Farhadi, CVPR 2017, Best Paper Honorable Mention),相比v1提高了訓練影像的解析度;引入了faster rcnn中anchor box的思想,對網路結構的設計進行了改進,輸出層使用卷積層替代YOLO的全連線層,聯合使用coco物體檢測標註資料和imagenet物體分類標註資料訓練物體檢測模型。相比YOLO,YOLO9000在識別種類、精度、速度、和定位準確性等方面都有大大提升。
YOLOv2 改進之處
YOLO與Fast R-CNN相比有較大的定位誤差,與基於region proposal的方法相比具有較低的召回率。因此YOLO v2主要改進是提高召回率和定位能力。下面是改進之處:
Batch Normalization: v1中也大量用了Batch Normalization,同時在定位層後邊用了dropout,v2中取消了dropout,在卷積層全部使用Batch Normalization。
高解析度分類器:v1中使用224 × 224訓練分類器網路,擴大到448用於檢測網路。v2將ImageNet以448×448 的解析度微調最初的分類網路,迭代10 epochs。
Anchor Boxes:v1中直接在卷積層之後使用全連線層預測bbox的座標。v2借鑑Faster R-CNN的思想預測bbox的偏移.移除了全連線層,並且刪掉了一個pooling層使特徵的解析度更大一些.另外調整了網路的輸入(448->416)以使得位置座標是奇數只有一箇中心點(yolo使用pooling來下采樣,有5個size=2,stride=2的max pooling,而卷積層沒有降低大小,因此最後的特徵是416/(2^5)=13).v1中每張圖片預測7x7x2=98個box,而v2加上Anchor Boxes能預測超過1000個.檢測結果從69.5mAP,81% recall變為69.2 mAP,88% recall.
YOLO v2對Faster R-CNN的手選先驗框方法做了改進,取樣k-means在訓練集bbox上進行聚類產生合適的先驗框.由於使用歐氏距離會使較大的bbox比小的bbox產生更大的誤差,而IOU與bbox尺寸無關,因此使用IOU參與距離計算,使得通過這些anchor boxes獲得好的IOU分值。距離公式:
D(box,centroid)=1−IOU(box,centroid)D(box,centroid)=1−IOU(box,centroid)
使用聚類進行選擇的優勢是達到相同的IOU結果時所需的anchor box數量更少,使得模型的表示能力更強,任務更容易學習.k-means演算法程式碼實現參考:k_means_yolo.py.演算法過程是:將每個bbox的寬和高相對整張圖片的比例(wr,hr)進行聚類,得到k個anchor box,由於darknet程式碼需要配置檔案中region層的anchors引數是絕對值大小,因此需要將這個比例值乘上卷積層的輸出特徵的大小.如輸入是416x416,那麼最後卷積層的特徵是13x13.
細粒度特徵(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以適應不同尺度大小的目標.YOLOv2使用了一種不同的方法,簡單新增一個 pass through layer,把淺層特徵圖(26x26)連線到深層特徵圖(連線到新加入的三個卷積核尺寸為3 * 3的卷積層最後一層的輸入)。 通過疊加淺層特徵圖相鄰特徵到不同通道(而非空間位置),類似於Resnet中的identity mapping。這個方法把26x26x512的特徵圖疊加成13x13x2048的特徵圖,與原生的深層特徵圖相連線,使模型有了細粒度特徵。此方法使得模型的效能獲得了1%的提升。
Multi-Scale Training: 和YOLOv1訓練時網路輸入的影像尺寸固定不變不同,YOLOv2(在cfg檔案中random=1時)每隔幾次迭代後就會微調網路的輸入尺寸。訓練時每迭代10次,就會隨機選擇新的輸入影像尺寸。因為YOLOv2的網路使用的downsamples倍率為32,所以使用32的倍數調整輸入影像尺寸{320,352,…,608}。訓練使用的最小的影像尺寸為320 x 320,最大的影像尺寸為608 x 608。 這使得網路可以適應多種不同尺度的輸入.
YOLOv2網路結構
YOLOv2對v1的基礎網路做了更改.
分類網路
YOLOv2提出了一種新的分類模型Darknet-19.借鑑了很多其它網路的設計概念.主要使用3x3卷積並在pooling之後channel數加倍(VGG);global average pooling替代全連線做預測分類,並在3x3卷積之間使用1x1卷積壓縮特徵表示(Network in Network);使用 batch normalization 來提高穩定性,加速收斂,對模型正則化.
Darknet-19的結構如下表:
Darknet-19-arch
包含 19 conv + 5 maxpooling.
訓練:使用Darknet框架在ImageNet 1000類上訓練160 epochs,學習率初始為0.1,以4級多項式衰減.weight decay=0.0005 , momentum=0.9.使用標準的資料增廣方法:random crops, rotations, (hue, saturation), exposure shifts.
之後將輸入從224放大至448,學習率調整為0.001,迭代10 epochs.結果達到top-1 accuracy 76.5% , top-5 accuracy 93.3%.
檢測網路
在分類網路中移除最後一個1x1的層,在最後新增3個3x3x1024的卷積層,再接上輸出是類別個數的1x1卷積.
對於輸入影像尺寸為Si x Si
,最終3x3卷積層輸出的feature map是Oi x Oi
(Oi=Si/(2^5)),對應輸入影像的Oi x Oi個柵格,每個柵格預測#anchors
種boxes大小,每個box包含4個座標值,1個置信度和#classes
個條件類別概率,所以輸出維度是Oi x Oi x #anchors x (5 + #classes)
。
新增跨層跳躍連線(借鑑ResNet等思想),融合粗細粒度的特徵:將前面最後一個3x3x512卷積的特徵圖,對於416x416的輸入,該層輸出26x26x512,直接連線到最後新加的三個3x3卷積層的最後一個的前邊.將26x26x512變形為13x13x1024與後邊的13x13x1024特徵按channel堆起來得到13x13x3072.從yolo-voc.cfg檔案可以看到,第25層為route層,逆向9層拿到第16層26 * 26 * 512的輸出,並由第26層的reorg層把26 * 26 * 512 變形為13 * 13 * 2048,再有第27層的route層連線24層和26層的輸出,堆疊為13 * 13 * 3072,由最後一個卷積核為3 * 3的卷積層進行跨通道的資訊融合並把通道降維為1024。
訓練:作者在VOC07+12以及COCO2014資料集上迭代了160 epochs,初始學習率0.001,在60和90 epochs分別減小為0.1倍.
Darknet訓練VOC的引數如下:
learning_rate=0.0001
batch=64
max_batches = 45000 # 最大迭代batch數
policy=steps # 學習率衰減策略
steps=100,25000,35000 # 訓練到這些batch次數時learning_rate按scale縮放
scales=10,.1,.1 # 與steps對應
網路結構如下(輸入416,5個類別,5個anchor box; 此結構資訊由Darknet框架啟動時輸出):
YOLO v2-network
YOLO9000
提出了一種聯合訓練方法,能夠容許同時使用目標檢測資料集和分類資料集。使用有標記的檢測資料集精確定位,使用分類資料增加類別和魯棒性。
YOLOv3
YOLOv3在Pascal Titan X上處理608x608影像速度達到20FPS,在 COCO test-dev 上 mAP@0.5 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網路)的結果相近,並且速度快4倍.
YOLO v3的模型比之前的模型複雜了不少,可以通過改變模型結構的大小來權衡速度與精度。
速度對比如下:
YOLOv3 compare
改進之處:
- 多尺度預測 (類FPN)
- 更好的基礎分類網路(類ResNet)和分類器
分類器-類別預測:
YOLOv3不使用Softmax對每個框進行分類,主要考慮因素有兩個:
- Softmax使得每個框分配一個類別(score最大的一個),而對於
Open Images
這種資料集,目標可能有重疊的類別標籤,因此Softmax不適用於多標籤分類。 - Softmax可被獨立的多個logistic分類器替代,且準確率不會下降。
分類損失採用binary cross-entropy loss.
多尺度預測
每種尺度預測3個box, anchor的設計方式仍然使用聚類,得到9個聚類中心,將其按照大小均分給3中尺度.
- 尺度1: 在基礎網路之後新增一些卷積層再輸出box資訊.
- 尺度2: 從尺度1中的倒數第二層的卷積層上取樣(x2)再與最後一個16x16大小的特徵圖相加,再次通過多個卷積後輸出box資訊.相比尺度1變大兩倍.
- 尺度3: 與尺度2類似,使用了32x32大小的特徵圖.
參見網路結構定義檔案yolov3.cfg
基礎網路 Darknet-53
仿ResNet, 與ResNet-101或ResNet-152準確率接近,但速度更快.對比如下:
darknet-53 compare
網路結構如下:
YOLOv3-arch
YOLOv3在 mAP0.5mAP0.5 及小目標 APSAPS 上具有不錯的結果,但隨著IOU的增大,效能下降,說明YOLOv3不能很好地與ground truth切合.
邊框預測
作者嘗試了常規的預測方式(Faster R-CNN),然而並不奏效: x,y的偏移作為box的長寬的線性變換.
⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪Gxˆ=Pwtx(P)+PxGyˆ=Phty(P)+PyGwˆ=Pwetw(P)Ghˆ=Pheth(P){Gx^=Pwtx(P)+PxGy^=Phty(P)+PyGw^=Pwetw(P)Gh^=Pheth(P)
仍採用之前的logistic方式:
bxbybwbh=σ(tx)+cx=σ(ty)+cy=pwetw=pheth(1)(2)(3)(4)(1)bx=σ(tx)+cx(2)by=σ(ty)+cy(3)bw=pwetw(4)bh=pheth
其中cx,cycx,cy是網格的座標偏移量,pw,phpw,ph是預設的anchor box的邊長.最終得到的邊框座標值是bx,y,w,hbx,y,w,h,而網路學習目標是tx,y,w,htx,y,w,h.
優缺點
優點
- 快速,pipline簡單.
- 背景誤檢率低。
- 通用性強。YOLO對於藝術類作品中的物體檢測同樣適用。它對非自然影像物體的檢測率遠遠高於DPM和RCNN系列檢測方法。
但相比RCNN系列物體檢測方法,YOLO具有以下缺點:
- 識別物體位置精準性差。
- 召回率低。在每個網格中預測固定數量的bbox這種約束方式減少了候選框的數量。
YOLO v.s. Faster R-CNN
- 統一網路:
YOLO沒有顯示求取region proposal的過程。Faster R-CNN中儘管RPN與fast rcnn共享卷積層,但是在模型訓練過程中,需要反覆訓練RPN網路和fast rcnn網路.
相對於R-CNN系列的"看兩眼"(候選框提取與分類,圖示如下),YOLO只需要Look Once. - YOLO統一為一個迴歸問題
而R-CNN將檢測結果分為兩部分求解:物體類別(分類問題),物體位置即bounding box(迴歸問題)。
R-CNN pipline
Darknet 框架
Darknet 由 C 語言和 CUDA 實現, 對GPU視訊記憶體利用效率較高(CPU速度差一些, 通過與SSD的Caffe程式對比發現存在CPU較慢,GPU較快的情況). Darknet 對第三方庫的依賴較少,且僅使用了少量GNU linux平臺C介面,因此很容易移植到其它平臺,如Windows或嵌入式裝置.
參考Windows 版 Darknet (YOLOv2) 移植, 程式碼在此.
region層:引數anchors指定kmeans計算出來的anchor box的長寬的絕對值(與網路輸入大小相關),num引數為anchor box的數量,
另外還有bias_match,classes,coords等引數.在parser.c程式碼中的parse_region函式中解析這些引數,並儲存在region_layer.num引數儲存在l.n變數中;anchors儲存在l.biases陣列中.region_layer的前向傳播中使用for(n = 0; n < l.n; ++n)這樣的語句,因此,如果在配置檔案中anchors的數量大於num時,僅使用前num個,小於時記憶體越界.
region層的輸入和輸出大小與前一層(1x1 conv)的輸出大小和網路的輸入大小相關.
Detection層: 座標及類別結果輸出層.
yolo層: 指定anchors等資訊, 計算loss等. YOLOv3使用三個yolo層作為輸出.
upsample層: 上取樣層, 進行2倍上取樣.
region層和Detection層均是YOLOv2模型所使用的層, upsample層和yolo層在YOLOv3中使用.
鑑於 Darknet 作者率性的程式碼風格, 將它作為我們自己的開發框架並非是一個好的選擇. 可以在我們更為熟悉的Caffe等框架中復現YOLO網路. 這裡有一份Caffe版YOLOv3實現(僅部署,不能訓練), 另可參照其它框架的可訓練程式碼.
參考
- YOLO主頁
- YOLOv3: An Incremental Improvement
- YOLO9000: Better, Faster, Stronger
- You Only Look Once: Unified, Real-Time Object Detection
原文: https://www.cnblogs.com/makefile/p/YOLOv3.html
相關文章
- 進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片YOLO
- 這才是目標檢測YOLOv3的真實面目YOLO
- 目標檢測之SSD
- 基於OpenCV和YOLOv3深度學習的目標檢測OpenCVYOLO深度學習
- 目標檢測之YOLO系列YOLO
- 深度學習之目標檢測深度學習
- 目標檢測之RetinaNetNaN
- 目標檢測
- 深度學習之目標檢測與目標識別深度學習
- 二階段目標檢測網路-FPN 詳解
- [AI開發]目標檢測之素材標註AI
- pytorch實現yolov3(5) 實現端到端的目標檢測PyTorchYOLO
- 目標檢測(5):手撕 CNN 經典網路之 AlexNet(理論篇)CNN
- 九、目標檢測
- 二階段目標檢測網路-Mask RCNN 詳解CNN
- 一階段目標檢測網路-RetinaNet 詳解NaN
- 二階段目標檢測網路-Faster RCNN 詳解ASTCNN
- 目標檢測(6):手撕 CNN 經典網路之 VGGNet(理論篇)CNN
- 47.4mAP!最強Anchor-free目標檢測網路:SAPD
- 二階段目標檢測網路-Cascade RCNN 詳解CNN
- 目標檢測面面觀
- 目標檢測綜述
- 28-目標檢測
- 目標檢測:二維碼檢測方案
- 目標檢測之FPN(Feature Pyramid Net)
- 目標檢測---教你利用yolov5訓練自己的目標檢測模型YOLO模型
- SSD 目標檢測 Keras 版Keras
- 目標檢測發展方向
- 【目標檢測】R-CNNCNN
- 吳恩達《卷積神經網路》課程筆記(3)– 目標檢測吳恩達卷積神經網路筆記
- 目標檢測相關論文
- 【目標檢測】Bounding Box Regression
- 目標檢測:Segmentation is All You Need ?Segmentation
- 目標檢測資料集分析
- 2018目標檢測
- 目標檢測(Object Detection)總覽Object
- Object Detection(目標檢測神文)Object
- 做目標檢測,這一篇就夠了!2019最全目標檢測指南