[譯] YOLO v3 有哪些新特點?

收藏待读

[譯] YOLO v3 有哪些新特點?

本文編譯自medium上的文章:What』s new in YOLO v3? 略有刪減。

點擊閱讀原文,可以直達原文,需要翻牆哦!

You only look once(你只需看一次),或者YOLO,是目前比較快的目標對象檢測算法之一。雖然它不再是最精確的目標對象檢測算法,但是當您需要實時檢測時,它是一個非常好的選擇,不會損失太多精確度。

2018年上半年,YOLO的第三個版本問世,這篇文章旨在解釋YOLO v3中引入的變化。這不是一個解釋YOLO是什麼的文章。 我假設您知道YOLO v2是如何工作的。如果情況並非如此,我建議您查看Joseph Redmon等人的論文,了解YOLO如何運作。

  • YOLO v1

  • YOLO v2

  • 一篇不錯的關於YOLO的博文

YOLO v3: 更好,但沒有更快,更強

YOLO v2紙的官方命名為「YOLO9000:更好,更快,更強」,看起來像一種兒童喝的健康牛奶飲品,而不是目標對象檢測算法。

YOLO 9000曾經是最快的,也是最準確的算法之一。然而,隨着RetinaNet這樣算法的出現,它不再是精確度的。 然而,它仍然是最快的算法之一。

為了提高精確度,YOLO v3在速度方面做了妥協。 雖然早期版本在Titan X上可以以45 FPS運行,但當前版本的時鐘頻率約為30 FPS。這與其Darknet底層架構的複雜性增加有關。

Darknet-53

YOLO v2使用了自定義深度架構darknet-19,最初是19層網絡,外加11層用於對象檢測。採用30層架構的YOLO v2,在小對象檢測上經常遇到麻煩。這歸因於層對輸入進行了下採樣,導致細粒度特徵的丟失。為了解決這一問題,YOLO v2使用了特性映射,連接了前一層的特徵映射以捕獲低級特徵。

然而,YOLO v2的架構仍然缺少一些最重要的元素,這些是目前大多數最新算法的主要元素。比如沒有剩餘塊,沒有跳連接,也沒有上採樣。而YOLO v3包含所有這些。

首先,YOLO v3使用了Darknet的變體,最初在Imagenet上訓練出53層網絡。然後在其上堆疊了53層進行檢測任務,這樣YOLO v3就擁有 106層完全卷積的底層架構 。這就是YOLO v3相較於YOLO v2速度慢的原因。下圖是YOLO架構現在的樣子:

[譯] YOLO v3 有哪些新特點?

三種尺度的檢測

新架構值得誇耀的有殘差跳連接(residual skip connections)和上採樣。 v3最突出的特點是它可以在三種不同的尺度上進行檢測 。YOLO是一個全卷積網絡,它的最終輸出是通過在特徵映射上應用1 x 1核生成的。 在YOLO v3中,通過在網絡中三個不同位置的三種不同大小的特徵圖上應用1×1核來完成檢測

檢測核的形狀是 1 × 1 ×(B ×(5 + C)) 。這裡B是特徵映射中每個單元可以預測的邊界框的數量,「5」表示4個邊界框屬性和1個對象置信度,C是類別數目。在使用COCO訓練的YOLO v3中,B = 3且C = 80,因此核大小為1 x 1 x 255。由該核生成的特徵映射具有與先前特徵映射相同的高度和寬度,並且具有沿着如上所述的深度的檢測屬性。

[譯] YOLO v3 有哪些新特點?

圖片源自: https://blog.paperspace.com/how-to-implement-a-yolo-object-detector-in-pytorch/

在進一步討論之前,我要指出 網絡的步幅,即一個層被定義為它對輸入進行下採樣的比率 。在以下示例中,我假設我們有一個大小為416 x 416的輸入圖像。

YOLO v3在三個尺度上進行預測,分別對輸入圖像進行32、16和8的尺寸下採樣。

第一次檢測由第82層進行。對於前81層,圖像由網絡進行下採樣,使得第81層具有32的步幅。如果我們的圖像大小為416×416,則得到的特徵映射為13×13的大小。這裡使用1 x 1檢測核,為我們提供13 x 13 x 255的檢測特徵映射。

接下來,來自第79層的特徵映射經歷幾個卷積層之後,2倍上採樣增加到26×26的維度。然後,該特徵映射與來自第61層的特徵映射做深度連接。再然後,組合的特徵映射再次經過幾個1×1卷積層以融合來自較早層(61)的特徵。通過第94層進行第二次檢測之後,產生26×26×255的檢測特徵映射。

再次重複類似的過程,其中來自層91的特徵映射在與來自層36的特徵映射做深度連接之前經歷少量卷積層。像之前一樣,接下來幾個1×1卷積層來融合來自先前層(36)的信息。我們在第106層進行最後一個3倍增,產生尺寸為52 x 52 x 255的特徵映射。

檢測較小的目標對象效果更好

不同層次的檢測有助於解決小物體的檢測問題,這是YOLO v2的常見問題。上採樣圖層與先前圖層連接有助於保留細粒度特徵,這有利於檢測小對象。

13 x 13層負責檢測大型目標對象,而52 x 52層檢測較小的目標對象,26 x 26層檢測中等大小目標對象。

選擇錨點框

YOLO v3總共使用了9個點框。每個尺度下三個。如果您在自己的數據集上訓練YOLO,則應該使用K-Means聚類來生成9個錨點。

然後,按照尺寸的降序排列錨點。為第一個尺度分配三個最大的錨點,為第二個尺度分配下三個錨點,為第三個尺度分配最後三個錨點。

每個圖像有更多邊界框

如果輸入圖像大小相同,YOLO v3比YOLO v2預測更多的邊界框。例如,原始分辨率為416 x 416時,YOLO v2預測13 x 13 x 5 = 845個框。在每個網格單元,使用5個錨點檢測到5個框。

而YOLO v3預測3種不同尺度的方框。對於416 x 416的相同圖像,預測框的數量是10647。這意味着 YOLO v3是YOLO v2預測的盒子數量的10倍 。您可以很容易想到為什麼它比YOLO v2慢。在每個尺度上,每個網格可以使用3個錨來預測3個框。由於有三個尺度,所以總共使用的錨點框數量為9個,每個尺度3個。

損失函數的變化

早些時候,YOLO v2的損失功能看起來像這樣。

[譯] YOLO v3 有哪些新特點?

圖片來自: https://pjreddie.com/media/files/papers/yolo_1.pdf

我知道這個公式很可難,但請注意最後三個式子。其中,第一個懲罰負責預測對象的邊界框的對象分數預測(理想情況下這些分數應為1),第二個用於沒有對象的邊界框(理想分數應該為零),最後一個懲罰預測對象的邊界框的類預測。

YOLO v2中的最後三個項是平方誤差,而在YOLO v3中,它們已經被交叉熵誤差項所取代。換句話說, 現在通過邏輯回歸預測YOLO v3中的對象置信度和類別預測

當我們訓練檢測器時,對於每個真正的框,我們分配一個邊界框,其錨點與真正的框最大重疊。

不再用softmax分類

YOLO v3現在對圖像中檢測到的對象執行多標記分類。

在早期的YOLO中,作者習慣於進行類別softmax,將具有最高得分的類別作為包含在邊界框中的目標對象的類別。這在YOLO v3中得到了修改。

Softmax分類依賴於類別是互斥的假設,簡單地說,如果一個對象屬於一個類別,那麼它就不屬於另一個類別。這在COCO數據集中工作正常。

但是,當我們在數據集中有 PersonWomen 之類的類別時,上述假設就失效了。這就是為什麼YOLO的作者沒有採用softmax分類的原因。相反,使用邏輯回歸預測每個類別分數,並且使用閾值來預測對象的多個標籤。分數高於此閾值的類別將分配給該框。

基準測試

YOLO v3與其他先進的探測器(如RetinaNet)表現相當,且在 COCO mAP 50基準測試 中速度更快。它也比SSD及其的變體更好。以下是論文中給出的性能對比。

[譯] YOLO v3 有哪些新特點?

YOLO與RetinaNet在COCO 50基準測試中的表現

但是,但是,但是,YOLO在COCO基準測試中失去了更高的IoU值,用於拒絕檢測。我不打算解釋COCO基準測試是如何工作的,因為它超出了本文範圍,但COCO 50基準測試中的50是衡量預測的邊界框與物體的真正框的對齊程度。這裡50對應於0.5 IoU。如果預測和真正框之間的IoU小於0.5,則預測被分類為誤定位並標記為假陽性。

在基準測試中,數值越高(例如,COCO 75),框需要更完美地對齊,以免被評估指標拒絕。這是YOLO被RetinaNet超越的地方,因為它的邊框不像RetinaNet那樣對齊。下面是一個詳細的更多基準測試表格。

[譯] YOLO v3 有哪些新特點?

RetinaNet在COCO 75基準測試中的表現優於YOLO

體驗一下

您可以使用此Github倉庫中提供的代碼在圖像或視頻上運行檢測器。 該代碼需要PyTorch 0.3+ 、OpenCV 3和Python 3.5。下載代碼後,您可以在其上進行各種試驗。

不同的尺度

python detect.py --scales 1 --images imgs/img3.jpg

[譯] YOLO v3 有哪些新特點?

在尺度為1的檢測中,我們看到有些大的物體被挑選,但漏檢測了幾輛車。

python detect.py --scales 2 --images imgs/img3.jpg

[譯] YOLO v3 有哪些新特點?

在尺度2上,我們沒有檢測到任何目標對象

python detect.py --scales 3 --images imgs/img3.jpg

[譯] YOLO v3 有哪些新特點?

在最大尺度3上,可以看到只檢測到了小目標對象,這些未在尺度為1時檢測到。

不同的輸入分辨率

python detect.py --reso 320 --images imgs/imgs4.jpg

[譯] YOLO v3 有哪些新特點?

輸入圖像分辨率:320 x 320

python detect.py --reso 416 --images imgs/imgs4.jpg

[譯] YOLO v3 有哪些新特點?

輸入圖像分辨率:416 x 416

python detect.py --reso 608 --images imgs/imgs4.jpg

[譯] YOLO v3 有哪些新特點?

這裡,我們檢測到的椅子比以前少了一把

python detect.py --reso 960 --images imgs/imgs4.jpg

[譯] YOLO v3 有哪些新特點?

這裡,檢測器做了一個錯誤的檢測:右邊的「人物」

從上面可以看到,較大的輸入分辨率沒有多大幫助,但它們可能有助於檢測小物體的圖像。另一方面,較大的輸入分辨率會增加推斷時間。這是一個超參數,需要根據應用進行調整。

您還可以試驗其他指標,例如批量大小、對象置信度和NMS閾值。ReadMe文件中有詳細的說明。

進一步閱讀

  • YOLO v3:漸進式改進

  • 如何計算mAP?

[譯] YOLO v3 有哪些新特點?

原文 :

相關閱讀

免责声明:本文内容来源于mp.weixin.qq.com,已注明原文出处和链接,文章观点不代表立场,如若侵犯到您的权益,或涉不实谣言,敬请向我们提出检举。