一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

雷鋒網 AI 科技評論按:YOLO是Joseph Redmon和Ali Farhadi等人於2015年提出的第一個基於單個神經網絡的目標檢測系統。在今年CVPR上,Joseph Redmon和Ali Farhadi發表的YOLO 2進一步提高了檢測的精度和速度。這次講座的主講人為王東,前硅谷資深工程師。

講解順序和論文結構類似,先講YOLO 2的網絡結構,重點分析如何產生目標邊框和分類,以及相關的損失函數。訓練YOLO 2的第一步是在ImageNet上預先學習darknet-19,在224x224圖像上,它僅需5.58個G-ops。此外,YOLO 2在VOC2007,VOC2012和COCO檢測數據集上有很好的表現。

在YOLO 2的基礎上,論文中進一步提出了YOLO 9000,可以產生9418個類別的目標檢測。首先是需要建立一個基於wordNet結構的wordTree。這個樹包含imagenet上最流行的9000個分類,還有COCO的80個大類。YOLO 9000的最後一層採用層次分類的方法,來計算400多個條件概率,用它來產生目標的最終分類。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

目標檢測

首先是目標檢測,目標檢測和圖像分類的不同是圖像分類只需要識別出圖中的物體,而目標檢測需要在圖片中精確找到物體所在位置,並標註出物體的類別。物體的位置一般用邊框(bounding box)標記,一個圖像中可能有好幾個邊框,目標檢測需要給出邊框裡物體的類別和概率。

關於YOLO2

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO2結構

YOLO 2採用神經網絡結構,有32層。結構比較常規,包含一些卷積和最大池化,其中有一些1*1卷積,採用GoogLeNet一些微觀的結構。其中要留意的是,第25層和28層有一個route。例如第28層的route是27和24,即把27層和24層合併到一起輸出到下一層,route層的作用是進行層的合併。30層輸出的大小是13*13,是指把圖片通過卷積或池化,最後縮小到一個13*13大小的格。每一個格的output數量是125(5*25),5是指對每一個13*13的小格配有5個邊框,25則是指每一個邊框輸出了25個浮點數。25個是YOLO 2對VOC的結構。VOC一共有20個class,在25個數中,有20個是class的probability,剩下的5箇中,有四個表示stx、sty、tw、th,這4個來識別邊框的位置和大小,還有一個數是confidence,表示邊框預測裡有真正的對象的概率。所以一共是13*13*125個數。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO2 Forward 計算邊框

現在講一下怎樣把stx、sty、tw、th變成輸出邊框。如右圖所示,裡面的σ(tx)可以理解為stx,σ(ty)可以理解為sty。每一個輸出的bbox是針對於一個特定的anchor,anchor其實是參考bbox的width及height。對於VOC來講,產生了5個固定的參考。

如圖,給出了stx、sty、tw、th之後,通過簡單的公式,就可以計算出最後輸出的邊框的位置和大小。具體是否要輸出當前的邊框,它的概率,還有生成的物體的類別,這個取決於後面的probability和confidence。Confidence表示有沒有物體,假設有物體之後,probability表示物體的概率。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO forward分類

通過將confidence和最大可能輸出的類的probability相乘之後,要是得出的結果大於門限0.24,就會輸出當前計算出的bbox的大小和位置,同時會輸出是哪一個類,probability大小是多少。一共會生成13*13*5個bbox,然後根據probability,通過filter,產生出最後預測的物體和其邊框。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO2例子

舉一個例子,就是最前面那個有狗,有轎車,有自行車的圖像,比較圖中最後的三行就可以看出來,裡面有轎車,狗和自行車,也能看到probability和bbox分別是什麼,它們分別表示概率、大小和位置。具體來講,從第一行,可以看出轎車的class_id為6,通過row和col可以看出大概的位置,還給出了anchor_id。第二行可以看到轎車的confidence和stx。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO2 損失函數

前面講的是forward的過程,即給了一個圖像和神經網絡,怎麼得到識別的物體概率和位置。那麼具體的訓練過程是如何的呢,怎麼去進行訓練?論文了中給了一個損失函數。要是給予一個合適的損失函數,給一定的數據去訓練,那麼神經網絡就會得到好的表現。

進行訓練的一共有四類loss,他們weight不同,分別是object、noobject、class、coord。總體loss是四個部分的平方和。具體的計算步驟以及如何選擇過程如PPT所示。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

Darknet-19計算量

上面講述了訓練函數和訓練對象,大家都需要先選擇預訓練函數。另外,對於YOLO 2來說,主要是想提高精度和速度,重點是base network要好。YOLO 2採用的是Darknet-19預訓練模型。右圖是在ImageNet上使用的一些模型,分別給出了他們的計算量和精度。在224x224的圖片上,圖中VGG16需要30.69個G-ops,基於GoogLeNet的YOLO需要8.52個 G-ops。而Darknet-19更小,G-opsS是5.58。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

VOC 2007 準確度和速度

論文中列出了一些YOLO 2在標準目標檢測集上的表現,由於YOLO 2網絡只包含卷積層和池化層,因此可以接受任意尺寸的圖像輸入。從圖中可以看到R-CNN和SSD的精度也是比較高的,但SSD是基於VCC-16來預訓練,fps比較慢。YOLO 2的精度相對YOLO提高了很多,速度也有相應提升。對於YOLO 2,不同的圖像大小也會產生不同的mAP。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

在VOC 2012和COCO上的準確度

接下倆是在VOC 2012和COCO上的準確度,COCO是比VOC難的用於目標檢測的benchmark,COCO裡有80個類, VOC裡有20個。從圖中可以看出SSD的精度比YOLO 2要高,可能的原因是COCO裡有比較小的物體。從圖中也可以看出YOLO 2的速度依然很快。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO與YOLO2的比較

從圖中可以看到採用不同的步驟之後,YOLO 2相較YOLO的提升。可以看到mAP明顯提高。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

與Faster-rcnn的比較

以前基於rcnn的過程不是一次計算出來的,首先要前向計算出proposal,然後再去go through下面的層,一個一個proposal去分類,所以基於rcnn的網絡會比較慢。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

SSD

SSD是當前最精確的一種目標檢測算法,是基於單個神經網絡。如圖,前面幾層是VGG網絡,它主要是加入卷積特徵層,得到不同尺度的特徵層,從而實現多尺度目標檢測。對於每個添加的特徵層,使用一組卷積濾波器,可以得到一組固定數目的目標檢測的預測 。

SSD 方法獲取目標位置和類別的機理跟YOLO方法一樣,都是使用迴歸,但是YOLO對小目標檢測效果不好,而SSD則在不同的feature map上分割成grid然後去做迴歸,效果會好一點。

前面講的就是YOLO2的部分,在一些小的物體的檢測上不如ssd,但在精度、準確度上都和ssd很接近,最大的優點是非常快。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO 9000

YOLO 9000是論文的第二部分,它的主要優點是可以檢測9418個類。這個數目非常驚人,因為檢測數據不容易得到,人工標記比較困難。

圖中是論文裡的幾個檢測的例子。

YOLO 9000的基本觸發是用少量的有檢測標註的數據和大量的圖像分類數據合併到一塊,來互相幫助,產生出可以生成很多類的預測。

具體實踐過程

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

首先建立標籤樹(WordTree),這個樹很大,如圖紅色的部分是ImageNet裡面最流行的九千個類別,檢測數據是來自COCO裡面的80個類。這個標籤樹是基於WordNet構建的,總共9418個類,1846個內部節點。可以在每個tree的節點做一個softmax,節點概率是從原點的路徑上的條件概率的乘積,最後輸出的標籤是節點概率高於閾值(0.5)的最深節點。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

使用WordTree整合了數據集之後就可以在數據集(分類-檢測數據)上利用層次分類的辦法訓練模型,使該系統可以識別超過9000種物品。訓練時檢測數據wordTree上的路徑都有class loss,而imagenet數據只有class loss 和noobj loss。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO 9000結構

如圖所示,與之前相比,它的結構簡化到24層,第23層是17*17*28269,17*17和以前YOLO 2的13*13類似,只是把prediction網格變成了17*17。然後每個位置有28269(3*(4+1+9418)),3是指每一個位置給了三個bounding box,每個bounding box包含有stx,sty,tw,th,confidence和9418個類。給了這些數之後就可以通過WordTree產生所需要的bbox等。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

YOLO 9000的結果

如圖是YOLO 9000在ilsvrc 2014上的表現。Ilsvrc 2014一共有200個category,ssd300在這個數據集上訓練完以後可以得到43.4mAP,YOLO 9000只能得到19.7mAP。區別是YOLO 9000在訓練過程中根本沒有利用ImageNet上的ilsvrc訓練數據,只利用了COCO和ImageNet數據,能得到19.7也是非常不錯的結果。圖右可以看出在不同類別的圖像檢測上的表現,可以看到在檢測動物時表現最好,因為COCO上有一些動物的類。

一文詳解YOLO 2與YOLO 9000目標檢測系統 | 分享總結

總結:

YOLO 2相比YOLO,提高了速度和準確率,基於darknet-19模型,除去完全連接層,用了邊框聚類,兩層組合,採用圖像多分辨率的訓練。

YOLO 9000可以利用無邊框的數據和有邊框的數據一起來實現9418類的監測。採用wordTree層次分類的辦法。

下面為大家提供一些github上的開源代碼,有訓練好的YOLO 2和YOLO 9000模型。

https://pjreddie.com/darknet/

https://github.com/philipperemy/yolo-9000

雷鋒網 AI 科技評論編輯整理。雷鋒網

相關推薦

推薦中...