YOLO (You Only Look Once)

YOLO (You Only Look Once)

1、YOLO

YOLO是一個實時的目標檢測系統。最新的V2版本在Titan X 上能夠每秒處理 40-90 張圖片,在VOC 2007上能夠取得78.6%的準確率,在COCO上能夠取得48.1%準確率。html

之間的檢測系統對圖像在不一樣的尺度、位置上進行屢次檢測,須要執行屢次神經網絡算法分別獲得結果,YOLO只須要執行一次,因此速度上獲得了較大的提高。python

2、算法

算法發展過程:git

RCNN --> SPPNet --> Fast RCNN --> Faster RCNN --> YOLO --> SSD --> YOLO V2github

各算法比較:算法

Comparision

Comparision

Comparision coordinate

Comparision coordinate

YOLO V2版本在速度、準確率上都有較好的表現。shell

1. RCNN

是第一個使用RegionProposal+CNN這一框架。先利用Selective Search在一張圖片上框出上千個多是目標的區域,分別放到神經網絡裏生成特徵,也就是一張圖片須要檢測上千次,比較耗時。
生成的特徵用來訓練一個分類器,判斷是不是目標。
對全部是目標的特徵再訓練一個迴歸器,用來微調目標的位置。windows

RCNN在VOC2007上的mAP是58%左右。網絡

RCNN framework

RCNN framework

2. SPPNet

Contributtions:架構

  1. 金字塔池化
  2. 複用Feature Map

傳統卷積網絡要保證輸入圖片的大小相等,這是由於想要經過CNN生成一個固定維度的特徵送給分類器。做者在最後生成特徵(全鏈接層)以前,加入了一個金字塔池化層,這樣保證最後輸出的特徵維度固定(16 + 4 + 1) * 256,也就不須要前面對圖片進行裁剪、縮放生成固定大小的圖片。app

卷積網絡輸入

卷積網絡輸入

金字塔池化層

金字塔池化層

SPPNet只進行一次卷積操做,以後再取的特徵是根據proposal region在特徵圖上提取,節省時間。

3. Fast RCNN

因爲RCNN有重複計算問題,做者(R.B.G)根據SPPNet改進了RCNN,稱爲Fast RCNN。

Fast RCNN

Fast RCNN

Contribution:
Fast RCNN也和SPPNet同樣,將Proposal region 映射到最後一層的feature map上,提升速度。
把bbox regression放進了神經網絡內部,與region分類和併成爲了一個multi-task模型,實際實驗也證實,這兩個任務可以共享卷積特徵,並相互促進

Fast RCNN framework

Fast RCNN framework

在VOC2007上的mAP提升到了68%。

4. Faster RCNN

Faster RCNN也是Proposal Region + CNN模式,只是將前面的Proposal的提取由Selective Search改成使用卷積網絡(RPN)來生成

本篇論文着重解決了這個系統中的三個問題:

  1. 如何設計區域生成網絡
  2. 如何訓練區域生成網絡
  3. 如何讓區域生成網絡和fast RCNN網絡共享特徵提取網絡

用VGG net做爲feature extractor時在VOC2007上mAP能到73%。

Faster RCNN

Faster RCNN

RPN:
• 在feature map上滑動窗口
• 建一個神經網絡用於物體分類+框位置的迴歸
• 滑動窗口的位置提供了物體的大致位置信息
• 框的迴歸提供了框更精確的位置

RPN

RPN

5. YOLO

因爲RCNN架構都是對局部區域進行分類,YOLO採用迴歸模型,只進行一次網絡傳播,即可以獲得整幅圖像的目標,速度快了許多。

YOLO

YOLO

做者將圖片劃分紅SxS(7x7)大小的網格(grid),每一個網格預測B(2)個box,每一個box包含x, y, w, h 以及其置信度, 另外每一個網絡還要預測屬於類別(C = 20)的機率,因此最後生成的維度的是S x S x (B x 5 + C) = 7 x 7 x (2 x 5 + 20) = 1470維,須要預測7 x 7 x 2 = 98個box。

生成向量

生成向量

只有當目標中心落入當前網格中,當前網格才爲這個目標負責。這個網絡中,IOU最大的box爲這個目標負責,即爲1, 不然爲0,爲1。做者設計的loss總共有以下幾個部分組成:

  1. x,y,w,h的損失
  2. 包含object目標的confidence損失
  3. 不包含object目標的confidence損失
  4. 類別預測損失

YOLO loss

YOLO loss

loss映射到30維向量的關係以下圖:

YOLO loss

YOLO loss

由於沒有object的框比較多,含有目標的框比較少,爲了平衡二者的loss貢獻,將沒有目標係數設爲0.5, 包含目標係數設爲5。

檢測階段:
生成了7x7個grid cell,7x7x2=98個box,對於dog類,把全部box按照confidence(置信度)降序排序,先取第一個,而後依次判斷後面的box與第前面記錄box的IOU,超過必定閾值就舍掉(NMS:非極大值抑制),最後保留的就是全部dog的框。同理,處理其它類別,如人、自行車,獲得整幅圖像中的框。

Limitations:
一,YOLO的每個網格只預測兩個boxes,一種類別。這致使模型對相鄰目標預測準確率降低。所以,YOLO對成隊列的目標(如 一羣鳥)識別準確率較低
二,YOLO是從數據中學習預測bounding boxes,所以,對新的或者不常見角度的目標沒法識別。
三,YOLO的loss函數對small bounding boxes和large bounding boxes的error平等對待,影響了模型識別準確率。由於對於小的bounding boxes,small error影響更大。

Tiny YOLO 與 YOLO比較:
YOLO每秒45幀, 基於extracting network, 這個網絡是基於GoogleNet,網絡在ImageNet上性能:
Top-1 Accuracy: 72.5%
Top-5 Accuracy: 90.8%
Forward Timing: 6.4 ms/img
CPU Forward Timing: 0.95 s/img
weight file (90 MB)

Tiny YOLO每秒155幀, 基於Darknet reference network, 在CPU上比AlexNet快2倍,這個網絡在ImageNet上性能:
Top-1 Accuracy: 61.1%
Top-5 Accuracy: 83.0%
Forward Timing: 1.5 ms/img
CPU Forward Timing: 0.16 s/img
weight file (28 MB)

6. SSD

Contributions:

  1. 提出了SSD目標檢測方法,在速度上,比以前最快的YOLO還要快,在檢測精度上,能夠和Faster RCNN相媲美
  2. SSD的核心是在特徵圖上採用卷積核來預測一系列default bounding boxes的類別分數、偏移量
  3. 爲了提升檢測準確率,在不一樣尺度的特徵圖上進行預測,此外,還獲得具備不一樣aspect ratio的結果
  4. 這些改進設計,實現了end-to-end訓練,而且,即便圖像的分辨率比較低,也能保證檢測的精度
  5. 在不一樣的數據集,如:PASCAL VOC、MS COCO、ILSVRC,對該方法的檢測速度、檢測精度進行了測試,而且與其餘的方法進行了對比。

SSD結合了Anchor BoxMulti-scale Feature,結構上看起來比YOLO還複雜,但速度爲何比YOLO快呢?由於SSD的輸入是300,而YOLO輸入是448x448,另外SSD網絡使用的是VGG,並去掉了全鏈接層,而YOLO使用的是24層卷積網絡,參數更多。

YOLO的box個數只有98個,而SSD在不一樣的尺度上生成了8732個box,因此SSD的效果要比YOLO更好。

38x38x4 = 5776
19x19x6 = 2166
10x10x6 = 600
5x5x6 = 150
3x3x4 = 36
1x1x6 = 6

5776 + 2166 + 600 + 150 + 36 + 6 = 8734

SSD vs YOLO

SSD vs YOLO

SSD對於不一樣尺度的feature map進行卷積,假設每一個feature map(m x n)點產生k(6)個box。每一個box須要包含位置偏移(x, y, w, h)和屬於每類(C)機率的信息,因此對於每一個點生成的張量維度爲kx(C+4),須要的卷積濾波器大小爲3 x 3 x (k x (C+4)),feature map生成的張量大小爲mxnx(k x (C+4)), 整個網絡輸出大小爲,也就是8732x(C+4)大小的張量。而後在這些8732個box中,利用NMS選擇最優的box。

default box

default box

本文將 default box 與任何的 groundtruth box 配對,只要二者之間的IOU 大於一個閾值,這裏本文的閾值爲 0.5。 表示default box i 與ground truth j 之間在p類別上匹配爲1, 不匹配爲0。loss損失函數由位置損失,置信度損失兩部分加權(交叉驗證:):

SSD Loss

SSD Loss

對於位置loss,使用default box對ground truth 進行規一化:

position loss

position loss

對於confidence loss,

confidence loss

confidence loss

SSD300輸入大小爲300x300, SSD512輸入圖片大小爲512x512,以下是性能比較:

Performance

Performance

7. YOLO V2

基於YOLO有2個改進版,一個是YOLO V2, 一個是YOLO9000.

YOLO9000綜合ImageNet數據集和COCO數據集訓練YOLO9000,使之能夠實時識別超過9000種物品。

YOLO V2相比於V1算法層面提高較少,主要是使用了更多的trick,使得檢測準確率獲得了極大的提高,下面是這些trick提高的結果分析:

YOLO vs YOLO_v2

YOLO vs YOLO_v2

YOLO vs YOLO_v2

YOLO vs YOLO_v2

1. Batch Norm

CNN在訓練過程當中網絡每層輸入的分佈一直在改變, 會使訓練過程難度加大,但能夠經過normalize每層的輸入解決這個問題。新的YOLO網絡在每個卷積層後添加batch normalization,經過這一方法,mAP得到了2%的提高。batch normalization 也有助於規範化模型,能夠在捨棄dropout優化後依然不會過擬合。

2. High Resolution Classifier

目前的目標檢測方法中,基本上都會使用ImageNet預訓練過的模型(classifier)來提取特徵,若是用的是AlexNet網絡,那麼輸入圖片會被resize到不足256 * 256,致使分辨率不夠高,給檢測帶來困難。爲此,新的YOLO網絡把分辨率直接提高到了448 * 448,這也意味之原有的網絡模型必須進行某種調整以適應新的分辨率輸入。

對於YOLOv2,做者首先對分類網絡(自定義的darknet)進行了fine tune,分辨率改爲448 * 448,在ImageNet數據集上訓練10輪(10 epochs),訓練後的網絡就能夠適應高分辨率的輸入了。而後,做者對檢測網絡部分(也就是後半部分)也進行fine tune。這樣經過提高輸入的分辨率,mAP得到了4%的提高。

3. 全卷積網絡

爲了使網絡可以接受多種尺寸的輸入圖像,yolov2除去了v1網絡結構中的全連層,由於全鏈接層必需要求輸入輸出固定長度特徵向量。將整個網絡變成一個全卷積網絡,可以對多種尺寸輸入進行檢測。同時,全卷積網絡相對於全鏈接層可以更好的保留目標的空間位置信息。

4. 新的基礎卷積網絡

基於Darknet-19。vgg16雖然精度足夠好,可是模型比較大,網絡傳輸起來比較費時間,所以,做者提出了一個本身的模型,Darknet-19。而darknetv2也正式已Darknet-19做爲pretrained model訓練起來的。

Network comparision

Network comparision

5. Anchor Boxes

YOLO採用全鏈接層來直接預測bounding boxes,而Fast R-CNN採用人工選擇的bounding boxes。Fast R-CNN中的 region proposal network僅採用卷積層來預測固定的boxes(anchor boxes)的偏移和置信度。
做者去除了YOLO的全鏈接層,採用固定框(anchor boxes)來預測bounding boxes。首先,去除了一個pooling層來提升卷積層輸出分辨率。而後,修改網絡輸入尺寸:由448×448改成416,使特徵圖只有一箇中心。物品(特別是大的物品)更有可能出如今圖像中心。YOLO的卷積層下采樣率爲32,所以輸入尺寸變爲416,輸出尺寸爲13×13。
採用anchor boxes,提高了精確度。

加入了anchor boxes後,能夠預料到的結果是召回率上升,準確率降低。咱們來計算一下,假設每一個cell預測9個建議框,那麼總共會預測13 * 13 * 9 = 1521個boxes,而以前的網絡僅僅預測7 * 7 * 2 = 98個boxes。具體數據爲:沒有anchor boxes,模型recall爲81%,mAP爲69.5%;加入anchor boxes,模型recall爲88%,mAP爲69.2%。這樣看來,準確率只有小幅度的降低,而召回率則提高了7%,說明能夠經過進一步的工做來增強準確率,的確有改進空間.

6. Dimension Clusters(維度聚類)

做者在使用anchor的時候遇到了兩個問題,第一個是anchor boxes的寬高維度每每是精選的先驗框(hand-picked priors),雖然說在訓練過程當中網絡也會學習調整boxes的寬高維度,最終獲得準確的bounding boxes。可是,若是一開始就選擇了更好的、更有表明性的先驗boxes維度,那麼網絡就更容易學到準確的預測位置。

和之前的精選boxes維度不一樣,做者使用了K-means聚類方法類訓練bounding boxes,能夠自動找到更好的boxes寬高維度。傳統的K-means聚類方法使用的是歐氏距離函數,也就意味着較大的boxes會比較小的boxes產生更多的error,聚類結果可能會偏離。爲此,做者採用的評判標準是IOU得分(也就是boxes之間的交集除以並集),這樣的話,error就和box的尺度無關了,最終的距離函數爲:

距離

距離

做者經過改進的K-means對訓練集中的boxes進行了聚類,判別標準是平均IOU得分,聚類結果以下圖:

聚類結果

聚類結果

能夠看到,從K=1到K=5,IOU曲線上升較快(對應匹配度高),所以從效果和複雜度進行Trade Off, 選定了 Anchor Box個數爲5;意味着做者選擇了5種大小的box維度來進行定位預測,這與手動精選的box維度不一樣。結果中扁長的框較少,而瘦高的框更多(這符合行人的特徵),選定了5種不一樣 寬高比+Scale 的 Anchor Box;對應上圖中的矩形。

固然,做者也作了實驗來對比兩種策略的優劣,以下圖,使用聚類方法,僅僅5種boxes的召回率就和Faster R-CNN的9種至關。說明K-means方法的引入使得生成的boxes更具備表明性,爲後面的檢測任務提供了便利。

性能比較

性能比較

7. Direct location prediction(直接位置預測)

那麼,做者在使用anchor boxes時發現的第二個問題就是:模型不穩定,尤爲是在早期迭代的時候。大部分的不穩定現象出如今預測box的(x,y)座標上了。在區域建議網絡中,預測(x,y)以及tx,ty使用的是以下公式

x, y

x, y

這個公式的理解爲:當預測tx=1,就會把box向右邊移動必定距離(具體爲anchor box的寬度),預測tx=-1,就會把box向左邊移動相同的距離。

這個公式沒有任何限制,使得不管在什麼位置進行預測,任何anchor boxes能夠在圖像中任意一點結束。模型隨機初始化後,須要花很長一段時間才能穩定預測敏感的物體位置。

在此,做者就沒有采用預測直接的offset的方法,而使用了預測相對於grid cell的座標位置的辦法,做者又把ground truth限制在了0到1之間,利用logistic迴歸函數來進行這一限制。

如今,神經網絡在特徵圖(13 *13 )的每一個cell上預測5個bounding boxes(聚類得出的值),同時每個bounding box預測5個座標值,分別爲tx,ty,tw,th,to。若是這個cell距離圖像左上角的邊距爲(cx,cy)以及該cell對應的box維度(bounding box prior)的長和寬分別爲(pw,ph),那麼預測值能夠表示爲:

預測值

預測值

定位預測值被歸一化後,參數就更容易獲得學習,模型就更穩定。做者使用Dimension Clusters和Direct location prediction這兩項anchor boxes改進方法,mAP得到了5%的提高。

Bounding box

Bounding box

8. Fine gained features

上述網絡上的修改使YOLO最終在13 * 13的特徵圖上進行預測,雖然這足以勝任大尺度物體的檢測,可是用上細粒度特徵的話,這可能對小尺度的物體檢測有幫助。Faser R-CNN和SSD都在不一樣層次的特徵圖上產生區域建議(SSD直接就可看得出來這一點),得到了多尺度的適應性。這裏使用了一種不一樣的方法,簡單添加了一個轉移層( passthrough layer),這一層要把淺層特徵圖(分辨率爲26 * 26,是底層分辨率4倍)鏈接到深層特徵圖。

殘差學習

殘差學習

這個轉移層也就是把高低兩種分辨率的特徵圖作了一次連結,鏈接方式是疊加特徵到不一樣的通道而不是空間位置,相似於Resnet中的identity mappings(對Resnet這一機制幾乎不懂,等看懂了再行補充)。這個方法把26 * 26 * 512的特徵圖鏈接到了13 * 13 * 2048的特徵圖,這個特徵圖與原來的特徵相鏈接。YOLO的檢測器使用的就是通過擴張的特徵圖,它能夠擁有更好的細粒度特徵,使得模型的性能得到了1%的提高。

9. Multi-Scale Training

原來的YOLO網絡使用固定的448 * 448的圖片做爲輸入,如今加入anchor boxes後,輸入變成了416 * 416。目前的網絡只用到了卷積層和池化層,那麼就能夠進行動態調整(意思是可檢測任意大小圖片)。做者但願YOLOv2具備不一樣尺寸圖片的魯棒性,所以在訓練的時候也考慮了這一點。

不一樣於固定輸入網絡的圖片尺寸的方法,做者在幾回迭代後就會微調網絡。每通過10次訓練(10 epoch),就會隨機選擇新的圖片尺寸。YOLO網絡使用的降採樣參數爲32,那麼就使用32的倍數進行尺度池化{320,352,…,608}。最終最小的尺寸爲320 * 320,最大的尺寸爲608 * 608。接着按照輸入尺寸調整網絡進行訓練。(網絡只用到了卷積層和池化層,沒有全鏈接層,因此能夠進行動態調整(檢測任意大小圖片))

這種機制使得網絡能夠更好地預測不一樣尺寸的圖片,意味着同一個網絡能夠進行不一樣分辨率的檢測任務,在小尺寸圖片上YOLOv2運行更快,在速度和精度上達到了平衡。

在小尺寸圖片檢測中,YOLOv2成績很好,輸入爲228 * 228的時候,幀率達到90FPS,mAP幾乎和Faster R-CNN的水準相同。使得其在低性能GPU、高幀率視頻、多路視頻場景中更加適用。

3、運行YOLO V2

1. YOLO V2

下載darknet神經網絡框架,darknet是用C寫的輕量級深度學習框架:

windows版本darknet: https://github.com/AlexeyAB/darknet

git clone https://github.com/pjreddie/darknet
cd darknet
make

下載預訓練的權重文件, 大小爲195MB:

wget https://pjreddie.com/media/files/yolo.weights

開始進行檢測:

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

輸出以下結果:

算法結果

算法結果

檢測結果

predictions

在個人CPU上跑須要19.7s,做者在Taitan X上只用了0.016s,以下圖:

GPU結果

GPU結果

另外,能夠經過-thresh調整閾值,默認得分大於0.25才認爲是目標,以下將閾值設爲0:

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0

2. Tiny YOLO V2

Tiny YOLO準確率不如YOLO,但快了許多:

下載權重文件, 大小61MB:

wget https://pjreddie.com/media/files/tiny-yolo-voc.weights

檢測:

./darknet detector test cfg/voc.data cfg/tiny-yolo-voc.cfg tiny-yolo-voc.weights data/dog.jpg

結果以下:

檢測結果

檢測結果

enter description here

predictions

能夠看到預測的結果沒有YOLO準確,但時間只須要2.3s

3. 實時檢測

若是安裝了CUDA和OpenCV,能夠經過攝像頭實時進行目標檢測:

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights

也能夠對視頻文件進行檢測:

./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights <video file>

4. YOLO用來作人臉檢測

須要根據你的應用場景來判斷是否合適。好比yolov1一個grid只能輸出1個目標物體,那麼若是你的場景會有不少人或者畫面中人較小以至於不少人頭部落入一個grid,那麼使用yolov1會有不少漏檢測。並且v1的localization的精準性並不高,因此若是對定位精準性要求高的 也不太適合。

4、tensorflow實現

5、目標檢測評估

precision = overlap / detection box
recall = overlap / ground truth box
IOU = overlap / union

評估標準

評估標準

使用map:

./darknet detector map cfg/voc.data cfg/yolo-voc.cfg yolo-voc.weights

detections_count = 124124, unique_truth_count = 12032
class_id = 0, name = aeroplane, ap = 77.08 %
class_id = 1, name = bicycle, ap = 81.11 %
class_id = 2, name = bird, ap = 75.97 %
class_id = 3, name = boat, ap = 64.66 %
class_id = 4, name = bottle, ap = 48.74 %
class_id = 5, name = bus, ap = 82.53 %
class_id = 6, name = car, ap = 83.36 %
class_id = 7, name = cat, ap = 87.65 %
class_id = 8, name = chair, ap = 58.95 %
class_id = 9, name = cow, ap = 81.82 %
class_id = 10, name = diningtable, ap = 75.22 %
class_id = 11, name = dog, ap = 86.32 %
class_id = 12, name = horse, ap = 86.38 %
class_id = 13, name = motorbike, ap = 84.21 %
class_id = 14, name = person, ap = 76.48 %
class_id = 15, name = pottedplant, ap = 51.42 %
class_id = 16, name = sheep, ap = 78.77 %
class_id = 17, name = sofa, ap = 77.10 %
class_id = 18, name = train, ap = 85.40 %
class_id = 19, name = tvmonitor, ap = 74.72 %
for thresh = 0.24, precision = 0.68, recall = 0.79, F1-score = 0.73
for thresh = 0.24, TP = 9459, FP = 4450, FN = 2573, average IoU = 52.58 %

mean average precision (mAP) = 0.758959, or 75.90 %
Total Detection Time: 132.000000 Seconds

使用reval_voc_py3.py結果:

./darknet detector valid cfg/voc.data cfg/yolo-voc.cfg yolo-voc.weights

python3 scripts/reval_voc_py3.py --year 2007 --classes data/voc.names --image_set test --voc_dir /home/guru_ge/dataset/voc/VOCdevkit/ results

Mean AP = 0.7602
Results:
0.773
0.813
0.759
0.654
0.490
0.825
0.841
0.876
0.592
0.814
0.751
0.863
0.863
0.843
0.767
0.528
0.781
0.770
0.853
0.747
0.760

Referece

  1. http://blog.csdn.net/cv_family_z/article/details/46832845
  2. https://pjreddie.com/darknet/yolo/#demo
  3. http://blog.csdn.net/jesse_mx/article/details/53925356
  4. http://blog.csdn.net/u013989576/article/details/73439202
  5. http://blog.csdn.net/hrsstudy/article/details/70305791
  6. http://blog.csdn.net/linolzhang/article/details/59728206?locationNum=5&fps=1
  7. http://www.javashuo.com/article/p-tbpkwxai-kk.html
相關文章
相關標籤/搜索