1. 程式人生 > >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 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架構現在的樣子:

三種尺度的檢測

新架構值得誇耀的有殘差跳連線(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。由該核生成的特徵對映具有與先前特徵對映相同的高度和寬度,並且具有沿著如上所述的深度的檢測屬性。

圖片源自: blog.paperspace.com/how-to-impl…

在進一步討論之前,我要指出網路的步幅,即一個層被定義為它對輸入進行下采樣的比率。在以下示例中,我假設我們有一個大小為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的損失功能看起來像這樣。

圖片來自: pjreddie.com/media/files…

我知道這個公式很可難,但請注意最後三個式子。其中,第一個懲罰負責預測物件的邊界框的物件分數預測(理想情況下這些分數應為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與RetinaNet在COCO 50基準測試中的表現

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

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

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

體驗一下

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

不同的尺度
python detect.py --scales 1 --images imgs/img3.jpg
複製程式碼

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

python detect.py --scales 2 --images imgs/img3.jpg
複製程式碼

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

python detect.py --scales 3 --images imgs/img3.jpg
複製程式碼

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

不同的輸入解析度
python detect.py --reso 320 --images imgs/imgs4.jpg
複製程式碼

輸入影象解析度:320 x 320

python detect.py --reso 416 --images imgs/imgs4.jpg
複製程式碼

輸入影象解析度:416 x 416

python detect.py --reso 608 --images imgs/imgs4.jpg
複製程式碼

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

python detect.py --reso 960 --images imgs/imgs4.jpg 
複製程式碼

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

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

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

進一步閱讀

image