項目地址:

YOLOv1-Pytorch:GitHberChen/Yolov1-Pytorch

to be continue

原論文:

You Only Look Once: Unified, Real-Time Object Detection

YOLO9000: Better, Faster, Stronger

YOLOv3: An Incremental Improvement

前期提過的物體檢測的演算法:

SSD || 5分鐘看懂CV頂刊論文

R-CNN: 狼入羊羣 || 5分鐘看懂CV頂刊論文Fast R-CNN: 變快了,也變強了 || 5分鐘看懂CV頂刊論文Faster R-CNN:這篇論文講的是一個感人的愛情故事 || 5分鐘看懂CV頂刊論文

本文目錄:

  1. YOLO發展路線
  2. YOLOv1介紹
  3. YOLOv2介紹
  4. YOLOv3介紹

一、YOLO發展路線

YOLO作為物體檢測領域中極具名氣的演算法,只因它拿下兩個第一:

  • YOLO是第一個one-stage的物體檢測演算法,直接end-to-end訓練,不用像Faster R-CNN一樣來回倒騰訓練(雖然GitHub上也有其end-to-end訓練的實現)。
  • YOLO是第一個可以做到實時檢測的物體檢測演算法,Fast YOLO甚至可以在Titan X上可以跑到155FPS。

不過檢測精度上相對於表現最好的Faster R-CNN而言mAP還差了一些,然而後者VGG-16的實現在FPS僅個位數,所以,要啥自行車?

YOLOv1與Faster R-CNN差異的一個重要原因在於YOLOv1沒那麼多Proposal,YOLOv1將圖片劃分成 7	imes 7 個格子,每個格子只負責檢測一個物體,如果兩物體重疊,那麼分別由物體中心所在的格子來預測,如果兩物體中心在同一個格子的話......沒錯,它就瞎了,這即是YOLOv1的mAP之所以比Faster R-CNN低的關鍵。

總的來說,YOLOv1作為物體檢測演算法,基本上沒有離開R-CNN打下的基本框架,即提出候選框->特徵提取->分類->精調位置。具體而言,YOLOv1候選框用給圖片劃分格子搞定,特徵提取依舊用CNN,分類和精調位置用全連接網路,具體細節會在相應章節描述。

YOLOv2作為改進的版本,相對YOLOv1的做了以下調整:

YOLOv2做出的改變還是挺多的,比較重要的有以下幾點:

  1. 使用了與Faster R-CNN、SSD類似錨框機制和邊框預測機制,值得一提的是,這個錨框尺寸並非人工設計,而是通過在數據集上進行K-means得到的,效果上5個抵人工設計的9個。
  2. 自行設計了一個高效的網路結構Darknet-19作為主體網路,運算量僅VGG-16的1/5,但效果相當,且最後的YOLOv2不含全連接層,這意味著其對輸入的圖像大小無限制,可以通過調整輸入圖像的大小來對識別準確度與識別速度進行trade-off。
  3. Darknet在預訓練完成後再繼續用在ImageNet上用 448×448 的更高解析度訓練10epochs以提前適應更高解析度的物體檢測情況。

在YOLOv3論文中作者就寫得相當隨性了,開頭先嘮嘮嗑,談談生活近況:

中途逗比一下,強行在論文中cite本篇論文:

最後不忘調侃一下越來越嚴峻的隱私問題

不得不說,這論文寫得真是清新脫俗。

調侃歸調侃,Yolov3還是做了一些改變的,在論文中嘗試了許多tricks,而且告訴了讀者哪些有用,哪些沒有用。其中最重要的還是主體網路的改變,提出了Darknet-53,且使用了多層級的Feature maps進行檢測:

接下來會對其分別作詳細介紹。

二、YOLOv1介紹

1、主體網路結構

最後輸出的 7	imes 7	imes 30 含義為 7	imes 7	imes (B	imes5+C) ,其中 7	imes 7 是將圖片等分的格子數量;B為每個格子預測的物體框數量,論文中取2;5表示含有物體的置信度 P(Obj ) 以及預測的物體框中心 (x,y), x,yin(0,1) 相對於格子的偏移以及框相對於整張圖的尺寸 (w,h), w,hin(0,1) ;C表示檢測物體的各類別的置信度 P(Class_i|Obj) ,對於VOC而言種類數是20 。

具體對於每一個格子預測的每一種類別的置信度的計算方式如下:

P(Obj)*P(Class_i|Obj)*IOU^{truth}_{pred}=P(Class_i)*IOU^{truth}_{pred}

損失函數的設計

其中 lambda_{coord}=5,lambda_{noobj}=0.5mathbb 1^{obj}_{i} 用於選擇真框落入的那個; mathbb 1^{obj}_{ij} 表示當真框的中心坐標落在格子 i 中時,選出真框 IOU 最大的那個box。

參考鏈接:blog.csdn.net/guleileo/

2、激活函數

激活函數並非ReLU,而是Leaky ReLU,即:

phi(x)= left{   egin{array}{leaky} x,&if xgt 0 \ 0.1x, & otherwise end{array} 
ight.

3、模型訓練

  • 採用VOC2007、VOC2012的訓練集和交叉驗證集,總共訓練了135個epochs。
  • batch_size=64。
  • 使用SGD,momentum=0.9,decay=0.0005。
  • 學習率第一個epoch中從 10^{-3} 緩慢上升到 10^{-2} ,持續75個epochs,爾後30個epochs為 10^{-3} ,最後30個epochs為 10^{-4}
  • 在第一個全連接層後使用dropout,rate=0.5。
  • 數據增強上:
    • 調整原始圖像大小以及轉換最高幅度至20%。
    • 在HSV顏色空間使用factor=1.5隨機對曝光以及飽和度作調整

4、演算法流程圖

參考鏈接:

blog.csdn.net/hrsstudy/blog.csdn.net/hrsstudy/

5、個人感受

YOLOv1和Faster R-CNN個人都簡單地用Pytorch實現過,最大的感受就是YOLO真的比Faster R-CNN快太多了,用CPU跑都很快。不過,YOLOv1的槽點也有不少,其一是在對物體的的定位上真的差,常常是可以準確地找出圖中含有的物體種類,但標出來的框框很飄逸:

而且太小的物體也檢測不到,如最後那一輛車:

不過總得來說,在一般情況下,效果還是可以的:

其二是YOLOv1模型真的太大了,鍋在全連接層,光第一個全連接層就有206M的參數,將近需要1GB的內存了,作為對比,ResNet101模型大小不到200MB。

三、YOLOv2介紹

1、Better

  • 使用了BatchNorm,此舉提高了2%的mAP
  • 使用ImageNet在 224	imes 224 解析度下預訓練完成後,再調整模型在 448	imes 448 解析度下訓練10個epoch,此舉提高了4%的mAP。
  • 去掉了特徵提取網路中的一個池化層,在輸入為 448	imes 448 時輸出的特徵圖大小為 14	imes 14 ,更容易識別到小的物體;由於圖片中的物體都傾向於出現在圖片的中心位置,特別是那種比較大的物體,中心有單獨的格子有助於提高識別的表現,而為了使輸出特徵圖為奇數,輸入調整為 416	imes 416 ,這樣輸出為 13	imes 13
  • 去掉了全連接層,換成了一個輸出為1024層的 3	imes 3 卷積層以及一個使用錨框機制的 1	imes 1 的卷積層,這樣使得mAP從69.5降低至69.2,但recall率從82%提高到了88%,說明改進空間提高了。
  • 非人為設計錨框,使用k-means得到聚類的不同大小尺寸的錨框,這樣得出的錨框,5個更比人為設計的9個要強:
  • 使用了新的定位方法,Yolov1中框的中心定位由格子的位置以及相對格子的的偏移量 (x,y) in(0,1) 決定,框的大小由 (w,h) in (0,1) 相對於圖片的寬高決定。而Yolov2採用瞭如下的定位方式,其中 (c_x,c_y) 為格子左上角的位置, (p_w,p_h) 為錨框的寬高, sigma 為sigmoid函數,置信度上和Yolov1一樣採用了物體真框與預測框的IOU與Pr(Obj)相乘的方式。

  • YOLOv2修改後的特徵圖大小為 13	imes 13 ,為了進一步提高其對細小物體的檢測性能,YOLOv2 加上了一個 Passthrough Layer 來取得之前的某個 26*26 解析度的層的特徵。這個 Passthrough layer 能夠把高解析度特徵與低解析度特徵聯繫在一起,聯繫起來的方法是把相鄰的特徵堆積在不同的 Channel 之中,這一方法類似與 Resnet 的 Identity Mapping,從而把 26	imes 26	imes 512 變成 13	imes 13	imes 2048 連結在原來 13	imes 13 的特徵圖上。這提升了 YOLOv2 1% 的性能。
  • 為了使YOLOv2在不同解析度下依然有很好的表現,訓練時每過19個Batch,網路會隨機地選擇一個新的圖片尺寸,尺寸大小間隔選擇為下採樣的倍數,即32,可選大小為{320,352…..608},最小 320*320,最大 608*608。這樣使得YOLOv2 的速度和精度上進行權衡,在輸入圖片較小時跑得快,較大時精度高。

在 voc2007 上的速度與精度對比:

2、Faster

作者自行自行設計了一個高效的網路結構Darknet-19作為特徵提取網路,效果與VGG-16相當,運算量縮減為20%。

預訓練:

  • 使用SGD優化器,momentum=0.9,decay=0.0005
  • 初始學習率0.1,採用指數為4的多項式衰減,訓練160個epoch

參考鏈接:blog.csdn.net/dcrmg/art

  • 數據增強手段和YOLOv1、SSD類似,使用:隨機裁剪、旋轉、色調調整、曝光調整。
  • 訓練完後再在448	imes 448解析度下訓練10個epoch,這會使Darknet的top-1、top-5從72.9%、91.2%分別提高到76.5%、93.3%。

訓練細節:

  • 最後 1	imes 1 卷積層輸出為 S	imes S	imes P	imes (5+C) ,P為錨框數量,取5;C為VOC物體檢測類別數量,取20。
  • 使用SGD優化器,momentum=0.9,decay=0.0005
  • 初始學習率為0.001,到60、90epochs時分別除以10,160個epochs截止。

YOLOv2的性能表現:

3、Stronger

作者用WordTree的結構嵌套多個softmax,在VOC和ImageNet上聯合訓練得到了可以分類9000種的一個模型:

個人覺得並不實用,識別的準度糟糕,不過還是挺有意思的。

四、YOLOv3介紹

1、YOLOv3性能

YOLOv3 在 Pascal Titan X 上處理 608x608 圖像速度可以達到 20FPS,在 COCO test-dev 上 [email protected] 達到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網路)的結果相近,並且速度快 4 倍。YOLO v3 的模型比之前的模型複雜了不少,可以通過改變模型結構的大小來權衡速度與精度。

從YOLOv1到YOLOv3,目標檢測的進化之路 - TinyMind -專註人工智慧的技術社區

速度對比如下:

2、YOLOv3的改進

  • 使用了多尺度預測 (實用類似FPN的上採樣),分割的格子數量分別是 13	imes 13 26	imes 26 52	imes 52
  • 更佳的特徵提取網路(類ResNet)DarkNet-53
  • YOLOv3 不使用 Softmax 對每個框進行分類,主要考慮因素如下:
    • Softmax 的潛臺詞是一個框內只能有一個物體,而實際上目標可能有重疊。因此 Softmax不適用於多標籤分類。
    • Softmax 可被獨立的多個 logistic 分類器替代,且準確率不會下降。
    • 分類損失採用 binary cross-entropy loss.

3、多尺度預測

錨框由k-means得出,每層分別負責三種尺寸,在COCO數據集下使用聚類得出:

10	imes 13,  16	imes 30,  33	imes 23,  \ 30	imes 61,  62	imes 45,  59	imes 119,  \ 116	imes 90, 156	imes 198, 373	imes 326,

具體結構參數:

參考鏈接:blog.csdn.net/Gentleman

Darknet-53 與 ResNet-101 或 ResNet-152 準確率接近,但速度更快,對比如下:

YOLOv3 在 [email protected] 及小目標 APs 上具有不錯的結果,但隨著 IOU的增大,性能下降,說明 YOLOv3 不能很好地與 ground truth 切合.

YOLOv3 608*608用於實時檢測:

參考鏈接:blog.csdn.net/qq_354515

PS:

廣告時間啦~理工生如何提高人文素養軟實力?快關注微信公眾號:
歡迎掃碼關注~

推薦閱讀:
相關文章