進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

PaperWeekly發表於2018-05-11

作者丨浩克匠心

研究方向丨基於深度學習的實時目標檢測

知乎專欄丨計算視覺與深度學習的小屋

YOLOv3的前世今生

2015 年,R-CNN 橫空出世,目標檢測 DL 世代大幕拉開。

各路豪傑快速迭代,陸續有了 SPP,fast,faster 版本,至 R-FCN,速度與精度齊飛,區域推薦類網路大放異彩。

奈何,未達實時檢測之基準,難獲工業應用之青睞。

此時,憑速度之長,網格類檢測異軍突起,先有 YOLO,繼而 SSD,更是摘實時檢測之桂冠,與區域推薦類二分天下。然準確率卻時遭世人詬病。

遂有 JR 一鼓作氣,並 coco,推 v2,增加輸出類別,成就 9000。此後一年,作者隱遁江湖,逍遙 twitter。偶獲靈感,終推 v3,橫掃武林!

準確率不再是短板

自從 YOLO 誕生之日起,它就被貼上了兩個標籤:

  • 速度很快

  • 不擅長檢測小物體

而後者,成為了很多人對它望而卻步的原因。

由於原理上的限制,YOLO 僅檢測最後一層卷積輸出層,小物體畫素少,經過層層卷積,在這一層上的資訊幾乎體現不出來,導致難以識別。

YOLOv3 在這部分提升明顯,先看看小物體的識別

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

▲ YOLOv3的識別結果

直觀地看下和 YOLOv2 的對比圖如下。可以看出,對於小物體的識別,提高非常明顯。

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

無論是傳統的模式識別影像檢測,還是基於 CNN 的視覺檢測,對於緊湊密集或者高度重疊目標的檢測通常是非常困難的。比如對合影的人群檢測在 YOLOv2 上的結果:

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

而下面是 v3 的結果

一次檢測到圖中 90% 的人,還增加了 tie(領帶)這個新類別,非常驚豔!

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

再看看模型的泛化能力如何:

骷髏並不在訓練資料集中,但是通過訓練模型強大的泛化能力,自動將其歸類到了人類(也算是最為合理的近似處理了)。

這在 YOLOv2 中是檢測不到的。

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

那麼,模型泛化能力很強的副作用,就是分類結果跑偏,比如下面這張 coser 的識別圖,最左側的人識別成了馬:

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

訓練和檢測都很快

論文中做了詳盡的對比。 

和前輩們比,YOLO 的速度非常快,比 R-CNN 快 1000 倍,比 Fast R-CNN 快 100 倍。 

和同輩們比,YOLOv3-608 檢測準確率比 DSSD 更高,接近 FPN,但是檢測時間卻只用了後面兩者的三分之一不到。 

原因如論文中所說,它在測試時觀察整張影像,預測會由影像中的全域性上下文(global context)引導。它還通過單一網路評估做出預測,而不像 R-CNN 這種系統,一張圖就需要成千上萬次預測。

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

用了哪些黑科技?

1. 多級預測

終於為 YOLO 增加了 top down 的多級預測,解決了 YOLO 顆粒度粗,對小目標無力的問題。

v2 只有一個 detection,v3 一下變成了 3 個,分別是一個下采樣的,feature map 為 13*13,還有 2 個上取樣的 eltwise sum,feature map 為 26*26,52*52,也就是說 v3 的 416 版本已經用到了 52 的 feature map,而 v2 把多尺度考慮到訓練的 data 取樣上,最後也只是用到了 13 的 feature map,這應該是對小目標影響最大的地方。

在論文中從單層預測五種 boundingbox 變成每層 3 種 boundongbox。

2. loss不同

作者 v3 替換了 v2 的 softmax loss 變成 logistic loss,由於每個點所對應的 bounding box 少並且差異大,每個 bounding 與 ground truth 的 matching 策略變成了 1 對 1。

當預測的目標類別很複雜的時候,採用 logistic regression 進行分類是更有效的,比如在 Open Images Dataset 資料集進行分類。

在這個資料集中,會有很多重疊的標籤,比如女人、人,如果使用 softmax 則意味著每個候選框只對應著一個類別,但是實際上並不總是這樣。複合標籤的方法能對資料進行更好的建模。

3. 加深網路

採用簡化的 residual block 取代了原來 1×1 和 3×3 的 block(其實就是加了一個 shortcut,也是網路加深必然所要採取的手段)。

這和上一點是有關係的,v2 的 darknet-19 變成了 v3 的 darknet-53,為啥呢?就是需要上取樣啊,卷積層的數量自然就多了,另外作者還是用了一連串的 3*3、1*1 卷積,3*3 的卷積增加 channel,而 1*1 的卷積在於壓縮 3*3 卷積後的特徵表示。

4. Router

由於 top down 的多級預測,進而改變了 router(或者說 concatenate)時的方式,將原來詭異的 reorg 改成了 upsample。

下一代YOLO長啥樣?

1. mAP 會繼續提高:隨著模型訓練越來越高效,神經網路層級的不斷加深,資訊抽象能力的不斷提高,以及一些小的修修補補,未來的目標檢測應用mAP會不斷提升。 

2. 實時檢測會成為標配:目前所謂的“實時”,工業界是不認可的。為什麼呢,因為學術圈的人,驗證模型都是建立在 TitanX 或者 Tesla 這類強大的獨立顯示卡上,而實際的潛在應用場景中,例如無人機/掃地/服務機器人/視訊監控等,是不會配備這些“重型裝備”的。所以,在嵌入式裝置中,如 FPGA,輕量級 CPU 上,能達到的實時,才是貨真價實的。 

3. 模型小型化成為重要分支:類似於 tiny YOLO 的模型分支會受到更多關注。模型的小型化是應用到嵌入式裝置的重要前提。而物聯網機器人無人機等領域還是以嵌入式裝置為主的。模型剪枝/二值化/權值共享等手段會更廣泛的使用。

說點題外話

YOLO 讓人聯想到龍珠裡的沙魯(cell),不斷吸收同化對手,進化自己,提升戰鬥力:YOLOv1 吸收了 SSD 的長處(加了 BN 層,擴大輸入維度,使用了 Anchor,訓練的時候資料增強),進化到了 YOLOv2; 

吸收 DSSD 和 FPN 的長處,仿 ResNet 的 Darknet-53,仿 SqueezeNet 的縱橫交叉網路,又進化到 YOLO 第三形態。 

但是,我相信這一定不是最終形態。讓我們拭目以待吧!

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

YOLOv3實景大片兒

這周忙裡偷閒,把 darknet 的程式碼擼了一遍,裡面有趣的東西很多。

能看出來作者是有野心的,YOLO 不只是一個目標檢測應用,它還是一個完全基於 C 語言的通用神經網路架構,以及很多以此為基礎的深度學習應用,比如基於 RNN 的莎士比亞戲劇劇本自動生成器

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

基於策略網路的 darknet 版阿法狗(DarkGo):

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

基於 GAN 的 darknet 版 Deep Dream(Nightmare):

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

挑戰 SqueezeNet 的壓縮網路 TinyYOLO(Redmon 號稱後者比前者更快、小、準)等等。

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

當然,做得最好的還是目標檢測。darknet 自帶有視訊檢測,及網路攝像頭實時視訊檢測。 

但是,目前網上介紹的 YOLO 的文章多是用的論文和 Github 工程自帶的 sample 圖片(dog,kite…),其實這不太公平。 

在原始碼基礎上加了一點儲存視訊的程式碼(程式碼連結在文尾),生成了如下的視訊,看看當 Mr Bean 遇到 YOLO 會產生什麼樣的化學反應! 


▲ YOLOv3效果展示

https://zhuanlan.zhihu.com/p/36478097

注:本視訊基於 coco 資料集,YOLOv3 cfg 和 weights。檢測視訊沒有聲音,音軌是後加的。

存在一些識別錯誤,但是整體來說,亮點很多。

擷取幾個瞬間

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

▲ 效能提升最大的是小物體或者遠處的物體識別

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

▲ 重疊遮擋物體的識別

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

▲ 運動模糊物體的識別

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

▲ 高密度汽車的識別

進擊的YOLOv3,目標檢測網路的巔峰之作 | 內附實景大片

▲ 密集人群識別

相關連結

[1]. 論文

https://pjreddie.com/media/files/papers/YOLOv3.pdf

[2]. 翻譯

https://zhuanlan.zhihu.com/p/34945787

[3]. 程式碼

https://github.com/pjreddie/darknet

[4]. 官網

https://pjreddie.com/darknet/yolo/

[5]. YouTube

https://www.youtube.com/watch?v=MPU2HistivI

[6]. 舊版

https://pjreddie.com/darknet/yolov2/

https://pjreddie.com/darknet/yolov1/

[7]. 原始碼分享

https://github.com/muyiguangda/darknet

[8]. YOLOv3在Windows下的配置(無GPU)

https://blog.csdn.net/baidu_36669549/article/details/79798587

相關文章