一文详解 YOLO 2 与 YOLO 9000 目标检测系统
一文詳解 YOLO 2 與 YOLO 9000 目標檢測系統
from 雷鋒網
雷鋒網 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 多個條件概率,用它來產生目標的最終分類。
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??目標檢測
首先是目標檢測,目標檢測和圖像分類的不同是圖像分類只需要識別出圖中的物體,而目標檢測需要在圖片中精確找到物體所在位置,并標注出物體的類別。物體的位置一般用邊框(bounding box)標記,一個圖像中可能有好幾個邊框,目標檢測需要給出邊框里物體的類別和概率。
關于 YOLO2
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 個數。
?
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 forward 分類通過將 confidence 和最大可能輸出的類的 probability 相乘之后,要是得出的結果大于門限 0.24,就會輸出當前計算出的 bbox 的大小和位置,同時會輸出是哪一個類,probability 大小是多少。一共會生成 13*13*5 個 bbox,然后根據 probability,通過 filter,產生出最后預測的物體和其邊框。
YOLO2 例子舉一個例子,就是最前面那個有狗,有轎車,有自行車的圖像,比較圖中最后的三行就可以看出來,里面有轎車,狗和自行車,也能看到 probability 和 bbox 分別是什么,它們分別表示概率、大小和位置。具體來講,從第一行,可以看出轎車的 class_id 為 6,通過 row 和 col 可以看出大概的位置,還給出了 anchor_id。第二行可以看到轎車的 confidence 和 stx。
YOLO2 損失函數前面講的是 forward 的過程,即給了一個圖像和神經網絡,怎么得到識別的物體概率和位置。那么具體的訓練過程是如何的呢,怎么去進行訓練?論文了中給了一個損失函數。要是給予一個合適的損失函數,給一定的數據去訓練,那么神經網絡就會得到好的表現。
進行訓練的一共有四類 loss,他們 weight 不同,分別是 object、noobject、class、coord。總體 loss 是四個部分的平方和。具體的計算步驟以及如何選擇過程如 PPT 所示。
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。
VOC 2007 準確度和速度論文中列出了一些 YOLO 2 在標準目標檢測集上的表現,由于 YOLO 2 網絡只包含卷積層和池化層,因此可以接受任意尺寸的圖像輸入。從圖中可以看到 R-CNN 和 SSD 的精度也是比較高的,但 SSD 是基于 VCC-16 來預訓練,fps 比較慢。YOLO 2 的精度相對 YOLO 提高了很多,速度也有相應提升。對于 YOLO 2,不同的圖像大小也會產生不同的 mAP。
在 VOC 2012 和 COCO 上的準確度接下倆是在 VOC 2012 和 COCO 上的準確度,COCO 是比 VOC 難的用于目標檢測的 benchmark,COCO 里有 80 個類, VOC 里有 20 個。從圖中可以看出 SSD 的精度比 YOLO 2 要高,可能的原因是 COCO 里有比較小的物體。從圖中也可以看出 YOLO 2 的速度依然很快。
YOLO 與 YOLO2 的比較從圖中可以看到采用不同的步驟之后,YOLO 2 相較 YOLO 的提升。可以看到 mAP 明顯提高。
與 Faster-rcnn 的比較以前基于 rcnn 的過程不是一次計算出來的,首先要前向計算出 proposal,然后再去 go through 下面的層,一個一個 proposal 去分類,所以基于 rcnn 的網絡會比較慢。
SSDSSD 是當前最精確的一種目標檢測算法,是基于單個神經網絡。如圖,前面幾層是 VGG 網絡,它主要是加入卷積特征層,得到不同尺度的特征層,從而實現多尺度目標檢測。對于每個添加的特征層,使用一組卷積濾波器,可以得到一組固定數目的目標檢測的預測 。
SSD 方法獲取目標位置和類別的機理跟 YOLO 方法一樣,都是使用回歸,但是 YOLO 對小目標檢測效果不好,而 SSD 則在不同的 feature map 上分割成 grid 然后去做回歸,效果會好一點。
前面講的就是 YOLO2 的部分,在一些小的物體的檢測上不如 ssd,但在精度、準確度上都和 ssd 很接近,最大的優點是非常快。?
YOLO 9000
YOLO 9000 是論文的第二部分,它的主要優點是可以檢測 9418 個類。這個數目非常驚人,因為檢測數據不容易得到,人工標記比較困難。
圖中是論文里的幾個檢測的例子。
YOLO 9000 的基本觸發是用少量的有檢測標注的數據和大量的圖像分類數據合并到一塊,來互相幫助,產生出可以生成很多類的預測。
具體實踐過程 ?
首先建立標簽樹(WordTree),這個樹很大,如圖紅色的部分是 ImageNet 里面最流行的九千個類別,檢測數據是來自 COCO 里面的 80 個類。這個標簽樹是基于 WordNet 構建的,總共 9418 個類,1846 個內部節點。可以在每個 tree 的節點做一個 softmax,節點概率是從原點的路徑上的條件概率的乘積,最后輸出的標簽是節點概率高于閾值(0.5)的最深節點。
使用 WordTree 整合了數據集之后就可以在數據集(分類 - 檢測數據)上利用層次分類的辦法訓練模型,使該系統可以識別超過 9000 種物品。訓練時檢測數據 wordTree 上的路徑都有 class loss,而 imagenet 數據只有 class loss 和 noobj loss。 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 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,提高了速度和準確率,基于 darknet-19 模型,除去完全連接層,用了邊框聚類,兩層組合,采用圖像多分辨率的訓練。
YOLO 9000 可以利用無邊框的數據和有邊框的數據一起來實現 9418 類的監測。采用 wordTree 層次分類的辦法。
下面為大家提供一些 github 上的開源代碼,有訓練好的 YOLO 2 和 YOLO 9000 模型。
https://pjreddie.com/darknet/
https://github.com/philipperemy/yolo-9000
雷鋒網 AI 科技評論編輯整理。雷鋒網
總結
以上是生活随笔為你收集整理的一文详解 YOLO 2 与 YOLO 9000 目标检测系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu最简单的方式安装NVIDIA
- 下一篇: numpy中的axis=0,axis=1