1. 程式人生 > >目標檢測之YoloV1論文及tensorflow實現

目標檢測之YoloV1論文及tensorflow實現

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

Abstract

作者提出了一種新的物體檢測方法YOLO。YOLO之前的物體檢測方法主要是通過region proposal產生大量的可能包含待檢測物體的 potential bounding box,再用分類器去判斷每個 bounding box裡是否包含有物體,以及物體所屬類別的 probability或者 confidence,如R-CNN,Fast-R-CNN,Faster-R-CNN等。

YOLO不同於這些物體檢測方法,它將物體檢測任務當做一個regression問題來處理,使用一個神經網路,直接從一整張影象來預測出bounding box 的座標、box中包含物體的置信度和物體的probabilities。因為YOLO的物體檢測流程是在一個神經網路裡完成的,所以可以end to end來優化物體檢測效能。

YOLO檢測物體的速度很快,標準版本的YOLO在Titan X 的 GPU 上能達到45 FPS。網路較小的版本Fast YOLO在保持mAP是之前的其他實時物體檢測器的兩倍的同時,檢測速度可以達到155 FPS。

相較於其他的state-of-the-art 物體檢測系統,YOLO在物體定位時更容易出錯,但是在背景上預測出不存在的物體(false positives)的情況會少一些。而且,YOLO比DPM、R-CNN等物體檢測系統能夠學到更加抽象的物體的特徵,這使得YOLO可以從真實影象領域遷移到其他領域,如藝術。

Introduction

YOLO之前的物體檢測系統使用分類器來完成物體檢測任務。為了檢測一個物體,這些物體檢測系統要在一張測試圖的不同位置和不同尺寸的bounding box上使用該物體的分類器去評估是否有該物體。如DPM系統,要使用一個滑窗(sliding window)在整張影象上均勻滑動,用分類器評估是否有物體。

在DPM之後提出的其他方法,如R-CNN方法使用region proposal來生成整張影象中可能包含待檢測物體的potential bounding boxes,然後用分類器來評估這些boxes,接著通過post-processing來改善bounding boxes,消除重複的檢測目標,並基於整個場景中的其他物體重新對boxes進行打分。整個流程執行下來很慢,而且因為這些環節都是分開訓練的,檢測效能很難進行優化。

作者設計了YOLO(you only look once),將物體檢測任務當做迴歸問題(regression problem)來處理,直接通過整張圖片的所有畫素得到bounding box的座標、box中包含物體的置信度和class probabilities。通過YOLO,每張影象只需要看一眼就能得出影象中都有哪些物體和這些物體的位置。

這裡寫圖片描述

如圖所示,使用YOLO來檢測物體,其流程是非常簡單明瞭的: 
1、將影象resize到448 * 448作為神經網路的輸入 
2、執行神經網路,得到一些bounding box座標、box中包含物體的置信度和class probabilities 
3、進行非極大值抑制,篩選Boxes

下圖是各物體檢測系統的檢測流程對比:

這裡寫圖片描述

YOLO模型相對於之前的物體檢測方法有多個優點:

1、YOLO檢測物體非常快。 
因為沒有複雜的檢測流程,只需要將影象輸入到神經網路就可以得到檢測結果,YOLO可以非常快的完成物體檢測任務。標準版本的YOLO在Titan X 的 GPU 上能達到45 FPS。更快的Fast YOLO檢測速度可以達到155 FPS。而且,YOLO的mAP是之前其他實時物體檢測系統的兩倍以上。

2、YOLO可以很好的避免背景錯誤,產生false positives。 
不像其他物體檢測系統使用了滑窗或region proposal,分類器只能得到影象的區域性資訊。YOLO在訓練和測試時都能夠看到一整張影象的資訊,因此YOLO在檢測物體時能很好的利用上下文資訊,從而不容易在背景上預測出錯誤的物體資訊。和Fast-R-CNN相比,YOLO的背景錯誤不到Fast-R-CNN的一半。

3、YOLO可以學到物體的泛化特徵。 
當YOLO在自然影象上做訓練,在藝術作品上做測試時,YOLO表現的效能比DPM、R-CNN等之前的物體檢測系統要好很多。因為YOLO可以學習到高度泛化的特徵,從而遷移到其他領域。

儘管YOLO有這些優點,它也有一些缺點:

1、YOLO的物體檢測精度低於其他state-of-the-art的物體檢測系統。 
2、YOLO容易產生物體的定位錯誤。 
3、YOLO對小物體的檢測效果不好(尤其是密集的小物體,因為一個柵格只能預測2個物體)。

下圖是各物體檢測系統的檢測效能對比: 
這裡寫圖片描述

Unified Detection

YOLO將輸入影象劃分為S*S的柵格,每個柵格負責檢測中心落在該柵格中的物體,如下圖所示: 
這裡寫圖片描述

每一個柵格預測B個bounding boxes,以及這些bounding boxes的confidence scores。 
這個 confidence scores反映了模型對於這個柵格的預測:該柵格是否含有物體,以及這個box的座標預測的有多準。 
公式定義如下: 
這裡寫圖片描述 
如果這個柵格中不存在一個 object,則confidence score應該為0;否則的話,confidence score則為 predicted bounding box與 ground truth box之間的 IOU(intersection over union)。

YOLO對每個bounding box有5個predictions:x, y, w, h, 
and confidence。 
座標x,y代表了預測的bounding box的中心與柵格邊界的相對值。 
座標w,h代表了預測的bounding box的width、height相對於整幅影象width,height的比例。 
confidence就是預測的bounding box和ground truth box的IOU值。 
這裡寫圖片描述

每一個柵格還要預測C個 conditional class probability(條件類別概率):Pr(Classi|Object)。即在一個柵格包含一個Object的前提下,它屬於某個類的概率。 
我們只為每個柵格預測一組(C個)類概率,而不考慮框B的數量。

這裡寫圖片描述 
注意: 
conditional class probability資訊是針對每個網格的。 
confidence資訊是針對每個bounding box的。

在測試階段,將每個柵格的conditional class probabilities與每個 bounding box的 confidence相乘: 
這裡寫圖片描述 
這樣既可得到每個bounding box的具體類別的confidence score。 
這乘積既包含了bounding box中預測的class的 probability資訊,也反映了bounding box是否含有Object和bounding box座標的準確度。

這裡寫圖片描述

將YOLO用於PASCAL VOC資料集時: 
論文使用的 S=7,即將一張影象分為7×7=49個柵格每一個柵格預測B=2個boxes(每個box有 x,y,w,h,confidence,5個預測值),同時C=20(PASCAL資料集中有20個類別)。 
因此,最後的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor。

這裡寫圖片描述 
這裡寫圖片描述
這裡寫圖片描述

Network Design

YOLO檢測網路包括24個卷積層和2個全連線層,如圖所示: 
這裡寫圖片描述
這裡寫圖片描述
其中,卷積層用來提取影象特徵,全連線層用來預測影象位置和類別概率值。

YOLO網路借鑑了GoogLeNet分類網路結構。不同的是,YOLO未使用inception module,而是使用1x1卷積層(此處1x1卷積層的存在是為了跨通道資訊整合)+3x3卷積層簡單替代。

Training

首先利用ImageNet 1000-class的分類任務資料集Pretrain卷積層。使用上述網路中的前20 個卷積層,加上一個 average-pooling layer,最後加一個全連線層,作為 Pretrain 的網路。訓練大約一週的時間,使得在ImageNet 2012的驗證資料集Top-5的精度達到 88%,這個結果跟 GoogleNet 的效果相當。

將Pretrain的結果的前20層卷積層應用到Detection中,並加入剩下的4個卷積層及2個全連線。 
同時為了獲取更精細化的結果,將輸入影象的解析度由 224* 224 提升到 448* 448。 
將所有的預測結果都歸一化到 0~1, 使用 Leaky RELU 作為啟用函式。 
為了防止過擬合,在第一個全連線層後面接了一個 ratio=0.5 的 Dropout 層。 
為了提高精度,對原始影象做資料提升。

損失函式

損失函式的設計目標就是讓座標(x,y,w,h),confidence,classification 這個三個方面達到很好的平衡。 
簡單的全部採用了sum-squared error loss來做這件事會有以下不足: 
a) 8維的localization error和20維的classification error同等重要顯然是不合理的。 
b) 如果一些柵格中沒有object(一幅圖中這種柵格很多),那麼就會將這些柵格中的bounding box的confidence 置為0,相比於較少的有object的柵格,這些不包含物體的柵格對梯度更新的貢獻會遠大於包含物體的柵格對梯度更新的貢獻,這會導致網路不穩定甚至發散。

這裡寫圖片描述

解決方案如下: 
更重視8維的座標預測,給這些損失前面賦予更大的loss weight, 記為 λcoord ,在pascal VOC訓練中取5。(上圖藍色框) 
對沒有object的bbox的confidence loss,賦予小的loss weight,記為 λnoobj ,在pascal VOC訓練中取0.5。(上圖橙色框) 
有object的bbox的confidence loss (上圖紅色框) 和類別的loss (上圖紫色框)的loss weight正常取1。

對不同大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏相同的尺寸對IOU的影響更大。而sum-square error loss中對同樣的偏移loss是一樣。 
為了緩和這個問題,作者用了一個巧妙的辦法,就是將box的width和height取平方根代替原本的height和width。 如下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。

這裡寫圖片描述

在 YOLO中,每個柵格預測多個bounding box,但在網路模型的訓練中,希望每一個物體最後由一個bounding box predictor來負責預測。 
因此,當前哪一個predictor預測的bounding box與ground truth box的IOU最大,這個 predictor就負責 predict object。 
這會使得每個predictor可以專門的負責特定的物體檢測。隨著訓練的進行,每一個 predictor對特定的物體尺寸、長寬比的物體的類別的預測會越來越好。

神經網路輸出後的檢測流程

這裡寫圖片描述

非極大值抑制

這裡寫圖片描述

獲取Object Detect 結果

這裡寫圖片描述

小亮點: (1) 對寬度和高度取平方,從而強調小偏移對小框的影響

               (2) 因為一張圖片中目標數相比於背景是少很多的,為了避免沒有目標的區域對損失函式貢獻度超過有目標的區域,因此對有目標的區域其懲罰加重,論文中為5,沒有目標的為0.5

               (3) 網路中的所有輸出最終都處在【0,1】之間,可以在網路輸出之後再統一進行歸一化,便於後續處理。

如有錯誤,歡迎在下面評論區留言,知無不答,一同和各位大佬共同進步。

參考文件