目標檢測之YOLO系列-V1至V3改進詳解

1.常用概念理解

softmax loss:在計算機視覺中,一般一個做多分類的網絡的結構爲:多個卷積層(池化)->一個或者兩個全連接層->softmax層,softmax層的神經元個數由類別數決定(例如有10類,那麼softmax層就有10個神經元),每個神經元的輸出表示着輸入樣本屬於該神經元代表的類的概率,他們的和爲1。數學計算公式爲:          

                                                                        softmaxloss=-\sum_{i}^{n}(q(x_i)log(g(x_i))   

 q(xi)表示樣本標籤概率分佈,g(xi)表示神經網絡的輸出概率分佈,n爲類別數。例如,有一個3分類任務,類別爲【A,B,C】,輸入一個樣本m,他的類別爲B,最終softmax層輸出的結果爲【0.1,0.6,0.3】,現在我們可以判斷此樣本爲B類,顯然判斷是對的,那麼它的損失loss爲L1= -(0*log0.1+1*log0.6+0*log0.3)。如果softmax層輸出的結果爲【0.6,0.3,0.1】,那麼判斷爲A類,顯然判斷錯誤,此時損失loss爲L2= -(0*log0.6+1*log0.3+0*log0.1), 顯然L2>L1,所以判斷錯誤的損失大於判斷正確的損失,符合邏輯。其實很好理解,softmax loss爲-logx,其中x爲正確類別的概率,它是一個遞減函數,x的值越大,loss的越小,同時x越大,它就越可能是正確類別,所以判斷錯誤的損失大於判斷正確的損失。

cross entroy loss:理解交叉熵損失之前,我們先看一下,信息量,熵,相對熵(KL散度)等。現有事件a:中國足球得世界盃冠軍了;事件b:德國足球得世界盃冠軍了。相比於中國,德國得世界盃冠軍的可能性更大,所以我們認爲事件A的信息量bi比事件B的信息量更大,即可能性越小的事件其信息量越大,極端情況下,確定事件的信息量爲0。那麼事件a的信息量爲I_a = -logP(a), P(a)爲事件a發生的概率。熵就是一個隨機變量X所有事件的信息量的期望,例如隨機變量X表示明天的天氣,所有事件爲x1=晴天,x2=雨天,x3=多雲,對應的概率爲P(x1)=0.3,P(x2)=0.5,P(x3)=0.2,那麼隨機變量X的熵爲:-P(x1)logP(x1)+ -P(x2)logP(x2)+ -P(x3)logP(x3)。相對熵用來衡量同一個隨機變量可能的不同分佈之間的差異,在機器學習分類任務中,樣本屬於哪一個類別(假設它是一個隨機變量Y),存在一個真實分佈Q(Y)和預測分佈G(Y),我個人覺得機器學習的本質是通過反覆訓練大量有限的已知樣本來使每一個樣本的預測分佈G(Y)儘可能地逼近真實分佈Q(Y),從而獲得模型參數,這些參數的實際意義可以理解爲在一定程度上描述了所有樣本中各個屬性對某個樣本屬於哪一個類別的重要程度,即屬性權重。因爲樣本的真實分佈無法知道,所以一般用樣本屬於哪一類別的概率表示,對於已知標籤的樣本,它的分佈概率取值範圍爲0或者1,即它的標籤類別概率爲1,其他類別概率爲0。一般Q(Y)用one-hot形式表示,例如3分類任務中,Q(Y)=[0,1,0],表示該樣本爲屬於第二類。G(Y)=[0.3,0.5,0.2],這兩個分佈之間的差異計算公式爲:

                                                                             \small D_{kl}=\sum_{i}^{n}(q(x_i)log\frac{g(x_i)}{q(x_i)})                                                                                 

 xi表示第i個樣本,n表示類別總數,Dkl的值越小說明預測分佈和真實分佈越相似。Dkl表達式展開的後一項即就是交叉熵,即交叉熵的定義公式:

                                                                       crossentroyloss=-\sum_{i}^{n}(q(x_i)log(g(x_i))

看到這裏,你肯定會有疑問,cross entroy loss和softmax loss不是一樣的嗎,其實當q(xi)用one-hot形式表示概率,g(xi)用softmax計算概率(不一定使用softmax計算),softmax loss 和cross entroy loss就是一樣的。

logistic loss:logistic regression解決的是二分類問題,所以可以把它是softmax loss的一種特例。所以它的損失計算公式可以簡化爲:                                      

、                               \small logisticloss=-\sum_{i}^{n}(q(x_i)log(g(x_i)) =-q(x)log(g(x))-(1-q(x))log(1-g(x)) 

 這裏的n=2,說明只有兩類,所以展開如上式。

mean-square error loss:它是一種簡單的誤差衡量方式,即樣本觀測值和預測值之間的值的誤差,計算公式爲:

                                                       \small logisticloss=\frac{1}{N}\sum_{i}^{N}(Label_i-Prediction_i)^{2} 

這裏的N表示的是樣本的數量,在深度學習中N通常是一個batch的樣本數量。

非極大值抑制:在目標檢測中提取分數最高的窗口。具體做法是:對於bounding box集合B及其置信度S,選擇最大置信度的bounding box M,將其從B集合剔除,並加入最終的檢測結果D中,然後再將B中剩餘bounding box與M的IoU大於閾值的bounding box從B中剔除,重複此過程,直到B爲空。D的bouding boxes就是最終需要的bounding box。

leaky激活函數:f(x) = max(0.01x, x)。基於參數的ReLU:f(x)=max(\alpha x,x)

anchor box:在目標檢測模型中,一個anchor box包含一個一個bounding box和一組類別概率。

weight decay and momentum:weight decay(權值衰減)的目的既不是提高精確度也不是提高收斂速度,可以將它看做是一種正則化,其最終目的是爲了防止過擬合。在進行梯度下降時,使用一個lamda值(取值介於0到1之間)乘以當前計算的每一個weight。momentum是梯度下降中一種常用的加速技術,用來跳過局部最優,如下圖,0.99就是權重衰減係數,ita爲學習率


2.YOLOv1(You only look once:Unified,Real-Time Object Dection)

特點:他將目標檢測任務當作是一個迴歸任務處理,這個迴歸任務包括在空間上獨立的兩部分:定位框和對應的類別概率; 它不像R-CNN那樣先用卷積神經網絡在建議區域提取特徵,然後再用SVM做分類之後進一步提煉bounding boxs,而是整個過程都在一個完整的神經網絡中完成。相比於目前最好的檢測系統,YOLOv1容易出現定位錯誤,但是它能夠很好地區分前景和背景,同時它提取特徵的能力很強,除了自然圖片,對藝術圖片進行目標檢測效果比之前的方法要好。

作者在論文中提到他將目標檢測作爲一個單一的迴歸任務,直接從整個圖像的像素中獲取bounding boxing座標和類別概率。相比於R-CNN反覆從proposal region中提取特徵而言,YOLOv1用一個單一卷積神經網絡一次性提取所有的bounding boxes和class probabilites。所以作者起名爲You only look once。

優點:1.YOLO執行速度很快(相比於其他檢測系統,論文的最大亮點),因爲它是一個端對端的網絡(pipeline);2.YOLO在預測中對整張圖的全局合理性把握得更好,因爲YOLO在訓練和測試中使用的是整張圖片,這表明它在某種程度上編碼了圖片的類別和圖片內容信息。作者在論文中提到,YOLO比Fast RCNN減少了將近一半的背景錯誤。這裏的background error我理解爲出現bounding box,裏面沒有所謂的前景物體;3.YOLO能夠提取到目標通用的特徵,作者用自然圖片訓練,用藝術圖片測試,效果比DPM和R-CNN效果要好很多。

缺點:1.YOLOv1在精確度上落後於當前最好的檢測系統,主要來源於座標定位的不準確,因爲這些座標預測都是從標籤bounding box數據中以一種新的寬高比率統計抽象出來,這個過程很容易出現定位不準確。2.大的bounding box和小的bounding box對相同的小錯誤的敏感度相同。這與直覺邏輯不合,因爲直覺告訴我們對於相同的小錯誤,小的bounding box應該更加敏感。雖然作者試圖在損失函數中使用平方根來克服這個缺點,但是隻能部分解決。3.YOLOv1對密集物體,重疊面積大的物體不好預測,作者在論文中提到,每個格子負責預測一個物體,但是如果一個格子內有兩個或者多個物體,就必然會丟失物體。

檢測處理思想:將輸入圖片劃分爲S*S的格子(邏輯區域),如果物體的中心座標落在某個格子中,那麼這個格子就負責檢測這個物體(包括bounding box的座標和類別概率)。每個格子預測B個bounding boxes和B個置信度,這個置信度表示這個格子預測的bounding  boxes包含物體的可信程度,論文作者將置信度定義爲Pr(Object) * IOU,IOU的意義論文中明確提到是預測bounding box和真實bounding box的交集。這裏我理解IOU的值爲預測bounding box和真實bounding box交集除以它們的並集,因爲這樣可以將IOU壓縮到0到1之間,Pr(Object)的值爲0或者1,表示存不存在目標物體。每一個bounding box包括五個元素,x,y,w,h,confidence。座標(x,y)表示的是box的中心座標,並且是相對於格子的邊界而言,w和h也是相對於整張圖片的寬度和高度而言。置信度預測的值表示預測框和真實框的IOU值。雖然每個格子預測B個bounding box,但是每個格子只預測一組類條件概率,注意這裏不是anchor,因爲多個bounding box共用了一組class probability。所以網絡架構的最後一層實際預測了B個bouding box和一組類別概率,注意這只是針對於一個格子,所以在不考慮batch size的情況下,實際預測輸出長度爲S*S*(B*5+C),作者在Pascal VOC數據集上訓練時S = 7,B=2, C=20。

分析:前面的檢測處理思想對神經網絡最後輸出每一部分解釋了很多,但是對置信度如何處理仍然有一些模糊,我的理解爲:在訓練過程中,哪些格子裏面有目標物體是確定的,所以Pr(Object)的值爲0或者爲1是確定的,IOU的值是通過預測bounding box和label bounding box的交集計算得到的,所以訓練過程中的置信度不是直接預測的,而是通過Pr(Object)*IOU計算得到的。在測試過程中,我們無法知道Pr(Object)的值,label bounding box的座標等信息,所以測試過程中的置信度是直接預測的。同理class probabilites也類似。值得一提的是,在測試選擇最終的bounding box作爲顯示框(因爲有B個bounding box)的選擇條件是什麼呢?作者在論文中提到用預測的類概率和直接預測的置信度的乘積作爲衡量標準。所以說在實現過程中,我必須自己設定一個閾值來篩選最終的bounding box,這個值是多少,論文中沒有明說,得我們結合自己的數據集微調。

網絡結構:論文作者說這個YOLOv1的網絡架構(Darknet)借鑑了GoogLeNet思想。整個檢測網絡包括24個卷積層和2個全連接層,並且在適當的位置使用卷積核爲1*1的卷積層來減少特徵空間(即feature map的數量),這一點和GoogLeNet的inception模塊不同。作者說其他版本的YOLOv1網絡結構也就改一下網絡的層數,思想基本一樣。具體結構如論文中結構圖:

其中7*7*64後面的2表示移動步長stride=2,其他的類似,沒有的表示默認步長爲1。

訓練過程:作者使用前面所說的網絡架構(Darknet)的前20個卷積層和一個全連接層在ImageNet 1000類的競賽數據集上進行預訓練,然後在ImageNet 2012驗證集上驗證,取得top5(預測最大概率的5個分類中有正確的,就認爲此次預測正確,相似的還有top1.)測試精度爲88%的結果。接着作者根據任少卿,何凱明等人的經驗(同時給預訓練網絡增加捲積層和全連接層能提高預測結果),在預訓練網絡後面又增加了4個卷積層和2個全連接層(這就形成了上面的網絡結構Darknet),後面的訓練過程和預測過程都是用的darknet網絡。作者認爲檢測的過程需要更多的視覺信息,所以調整了訓練圖片的分辨率,即預訓練過程使用的圖像分辨率是224*224,在darknet網絡中正式訓練時使用的圖片分辨率是448*448。【我在實際訓練Darknet時始終沒有得到很好的效果,可能是沒有進行預訓練。】對於前面所說bounding box,作者也做了一些處理,將bounding box的w,h除以訓練圖像的寬度和高度(448*448),使其值在0-1之間。至於bouding box的x,y的實際值意義,作者認爲不是相對於整張圖片的中心座標值,而是相對於的對應格子座標左上邊界偏移值,所以x,y的值也在0-1之間,這個地方有些難以理解。我的理解是:格子的座標是(0,0),(0,1)......(6,6)等等,共有49格子,通過置信度爲每一格子從B個bounding boxes中篩選一個最終的bounding box,所以在整張圖片就剩下49個bounding boxes,他們的格子座標分別是(0+x,0+y),(0+x, 1+y).......(6+x,6+y),注意這裏的每個格子的x和y是不同的值,因爲每一個格子bounding box都預測了對應的x,y(好好理解這句話,理解之後你會發現論文作者的設計是如此巧妙)。最後通過我們設定的置信度閾值使用非極大值抑制方法從這49個bounding box中篩選;還有一種做法就是直接從98個bounding boxes使用非極大值抑制方法篩選。從圖片的全局性來考慮,第一種方法更能體現圖片的整體性。確定完bounding boxes後,用bounding box座標值乘以與原圖的比例值就可以在原圖中框出相應的物體。至於激活函數,作者在論文中提到除了最後一層使用了線性激活函數,其他層都使用了leaky激活函數。最後討論一下YOLOv1的損失函數(sum-square error),平方和誤差損失函數簡單,易於優化,但是對準確率的提升效果不好,作者分析原因有兩點:1.把座標誤差和分類誤差看得同等重要不合理;2.那些沒有包含物體,置信度趨向於0(但不是0,累計和還是很大的)的格子相比於有目標物體格子的數量要多很多,這將最終導致格子的損失梯度過高,從而使模型不穩定,過早發散。爲了解決這兩個問題,作者增大了bounding box座標預測損失的權重,減少了沒有包含目標物體置信度損失的權重,其座標損失權重爲5,沒有目標物體的置信度損失權重爲0.5,其他損失權重爲1。同時作者論文中提到,損失函數應該體現較小的損失變化對大的bounding box影響比小的bounding box的影響小,使用w和h的平方根能夠部分解決這個問題。最終的損失函數爲:

 

上述損失函數的下標 i 表示第 i 個格子,下標 i j 表示第 i 個格子的第 j 個bounding box。可見在訓練過程中計算損失時使用的所有的bounding box,如果格子裏面實際沒有物體,對應的實際標籤值爲0。有物體的格子就用真實標籤值。

訓練數據集和訓練參數:Pascal VOC2007和2012的訓練和驗證集,測試時使用的包含2007的Pascal VOC 2012測試數據集。batch size值爲64,峯值爲0.9,衰減係數爲0.0005,學習率在第一個epoch從10的負3次方增到10的負2次方,然後繼續用10負2次方法訓練75個epoches,接着用10的負3次方訓練30個epches,最後用10的負4次方訓練30個epoches,總共136個epoches【我在實驗時沒有達到效果,有可能是沒有這樣設置學習率】,dropout層的連接率值爲0.5, 最後作者在論文中提到,數據增強使用了隨機變換圖片尺度1.2倍於原圖片大小,同時使用因子1.5調整圖片的HSV顏色空間。

額外的工作:作者想既然YOLOv1能夠犯較少的背景錯誤,如果將YOLOv1和Fast R-CNN結合起來,可能會使結果更好。於是作者做了一個將二者結合的實驗:對於Fast R-CNN預測的每一個boudingbox,都用YOLO的預測的bounding box檢測一下,看是否有相似的bounding box, 如果有,就認爲Fast R-CNN預測的這個bounding box包含物體的可能性很大,其衡量標準包括YOLOv1預測的bounding box的執行都,和兩個bounding boxes的重疊面積。論文作者沒有提到做這個實驗的細節,我的理解是:用相同的訓練集訓練好Fast R-CNN和YOLOv1兩個網絡,將同一張圖片同時輸入兩個網絡,得到兩個網絡輸出,利用的YOLOv1預測的bounding box來檢測篩選Fast R-CNN的輸出得到最終的輸出。【爲了效率,如何並行同步兩個網絡沒有實驗過,可能有些難度】最好的Fast R-CNN模型在測試數據集VOC 2007上能實現71.8%的平均準確率。當結合YOLOv1後,平均準確率達到75.0%,增加了3.2個百分點。【在計算機視覺領域能夠增加1到2個百分點就很不錯了】

總結:YOLOv1的優缺點前面已經說得夠多了,且看作者如何改進YOLOv1到更好,更快,更強。

3. YOLOv2:(YOLO9000:Better,Faster,Stronger)

論文概要:在這篇論文中,作者介紹了兩個模型YOLO9000和YOLOv2。YOLO9000是能夠檢測超過9000個類的的實時檢測系統,YOLOv2是一個標準的圖片目標物體的檢測系統(可以在數據集Pascal voc,COCO上檢測)。在YOLO9000中,作者提出了聯合訓練方法,這種方法可以使YOLO9000對沒有檢測標籤數據的物體類別進行檢測預測【翻譯得有些拗口,我的理解是同時在檢測數據集COCO和分類數據集上ImageNet上訓練神經網絡】。在YOLOv2中,作者使用了多尺度訓練方法,這使得YOLOv2可以同時在不同大小的數據集上訓練,這樣做的目的是爲了平衡速度和精度。【在數據集VOC2007上,mAP爲76.8,速度爲67FPS;mAP爲78.6,速度爲40FPS】

更好(Better):更好主要指相對於YOLOv1,YOLOv2提高了召回率,減少了定位錯誤,同時提高了分類精度。YOLOv2想要既做到高精度也要高速度,僅僅是增加網絡的複雜性不可能提高檢測速度。所以作者簡化網絡結構,並且做了一系列處理讓特徵容易被提取出來。這些操作包括:

1.Batch Normalization(提高損失收斂速度,同時mAP提高了2個百分點)batch  normalization一般加在神經網絡激活函數的前面,他能夠提高梯度在網絡中的流動,Normalization的能夠使特徵全部縮放到[0,1],這樣在反向傳播的過程中,梯度都是1左右,避免了梯度消失,提升了學習率,更快達到收斂,減少模型訓練對初始化的依賴。

 2.High Resolution Classifier:從AlexNet開始,絕大多數的分類器的輸入圖片的大小小於256*256,[YOLOv1預訓練的input image size是224*224,正式訓練的input image size是448*448]。在YOLOv2中,用size爲448*448的ImageNet數據集微調分類網絡10個epoches【既然是微調,和YOLOv1一樣,低分辨率的ImageNet圖片進行預訓練分類網絡,高分辨圖片訓練檢測網絡,只是在這兩個過程加了一個適應性微調】,這樣做的目的是使網絡能夠有足夠的時間適應高分辨率圖片的輸入。然後繼續用高分辨圖片微調這個網絡進行檢測任務,作者在論文中提到這樣做能夠提高mAP將近4個百分點。

3.Convolutional With Anchor Boxes:作者去掉了YOLOv1的全連接層,使用anchor boxes來預測bounding boxes,同時也去掉了最後池化層使得最後feature maps的分辨率大一些。爲了得到奇數形狀的feature maps,作者調整輸入圖片的分辨率爲416*416,使得最後的卷積層輸出的feature maps的分辨率大小爲13*13。與YOLOv1不同的是,YOLOv2爲每一個bounding box預測一個類條件概率【YOLOv1中B個bounding box共用一個類條件概率】。在YOLOv1中bounding boxes數目爲:S*S*(5*B+C),而在YOLOv2中bounding box數目爲S*S*B(5+C)。使用anchor box沒有使精度提升,提高了召回率。在YOLOv1中每一幅圖片值預測98個bounding boxes,在YOLOv2預測了13*13*9個bounding boxes,召回率肯定提高呀,所以anchor box在YOLOv2中其實沒有太大的作用【個人感覺】。

4.Dimension Clusters,前面使用B=9是根據Faster R-CNN來設定的,但是9是不是最合適的,還有待檢驗,於是作者採用維度聚類的方法對數據集的真實標籤的bounding box進行聚類分析從而確定B的取值。如果用歐式距離來衡量K-means的距離,會使得大的bounding box比小的bounding box產生更大的誤差,於是作者調整距離計算公式爲:

                                                                      \small d(box,centroid)=1-IOU(box,centroid)

如下圖,作者在論文中提到最終選擇B=5(聚類中心有5個,意味着每一個格子的anchor box有5個)來平衡模型的複雜性和召回率,並且發現這些作爲聚類中心的box比手工挑選的box要偏窄,偏高。對於聚類分析的過程作者在論文中沒有詳細說明。對此有一個疑惑,IOU(box,centroid)是用直接用像素點計算還是相對於最後的feature map計算。我覺得是相對於feature map計算,因爲這樣做可以保持與預測網絡輸出的bouding box的環境一樣。具體的做法是:先按比例縮小真實的bouding box(原始圖片的大小肯定不是416,輸入的圖片會按一定的比例縮放到416)再除以32(416/13),然後再計算IOU值。

5.Direct location prediction直接預測座標會導致模型不穩定,特別是在迭代早期。YOLOv2,沒有采用RPN(region proposal network)的座標預測方法,而是繼續使用YOLOv1的座標預測方法,預測相對於格子的偏移,使用logistic activation(sigmoid)函數將偏移值限定在0到1之間。具體計算示意圖如下圖:

 

tx和ty爲預測的偏移值,sigma函數爲sigmoid激活函數,pw和ph爲聚類維度中的先驗bounding box寬度和高度。cx和cy爲格子座標。如果要恢復爲最終的顯示bounding box,只需要將bx,by,bw,bh分別乘以(416/13)然後乘以縮放比例即可。這樣做後,增加了5個百分點的精度。

6.Fine-Grained Feature,13*13的feature map可以提供足夠信息預測較大的物體,但是對於小物體而言提供的信息仍然不夠,所以作者提供了一個passthrough層,利用26*26的feature map來預測小物體(可能是受SSD的啓發,不同大小的特徵圖檢測不同大小的物體)。和Resnet相似,將前面高分辨率的feature maps連接到後面低分辨率的feature map上,例如26*26*512的feature maps則可以轉化爲低分比率的feature maps 13*13*2048,作者在論文中提到這樣做提高準確率1個百分點。具體的passthrough層處理方式爲:分別對高度和寬度進行倍數提取像素點組成低分辨率feature maps。

7.Mutil-Scale Training,YOLOv2的網絡只有卷積層和池化層,所以就可以在訓練進行的過程改變feature maps的shape。 爲了使得YOLOv2更具魯棒性,我們讓模型能夠對不同大小的圖片進行訓練。在訓練過程中,每10個batch就換一組新尺度的圖片(這裏的新圖片指大小不同,圖片的其他屬性是一樣的)。由於下采樣因子是32,作者將尺度設置爲{320,352,...,608},不同尺度的圖片最終輸出的feature map是不同的,如何修改最後的檢測處理,論文沒有說明。

更快:VGG-16是一個非常有效的分類網絡,但是它很複雜,作者沒有使用它,而是基於Googlenet創造了Darknet-19,他包含19個卷積層和5個最大池化層,具體結構如下:

訓練過程:整個訓練過程由三個階段組成,第一階段,用分辨率爲224*224的ImageNet 1000類圖片預訓練darknet-19網絡160輪;第二階段分辨率爲448*448的圖片微調網絡10輪,學習率設置爲10的負三次方,此時top-1的精度達到了76.5%,top5的精度達到了93.3%。前兩個階段完成了分類訓練,第三階段是檢測訓練,去掉分類網絡的最後三層(convalutional ,avgpool,softmax),增加3層卷積核爲3*3,通道數爲1024的卷積層,每一層後面添加捲積核爲1*1,通道數爲B*(C+5)的卷積層,相當於添加了6個卷積層,訓練這個網絡總共160輪,開始時學習率爲10的-3次,在第60輪和第90輪時,設置學習率爲10的-4次,我們設置權重衰減值爲0.0005,峯值爲0.9。數據增強使用了隨機裁剪,顏色轉變等。關於YOLOv2的損失函數,論文中沒有說明。參考YOLOv2損失函數博文,損失函數如圖:

Stronger(更強):在這裏作者提出了一種將分類數據集和檢測數據集聯合訓練的方法,在訓練的過程,我們將這兩類數據集混合,當輸入的檢測數據集時,反向傳播全部的誤差損失(YOLOv2的loss),當遇到分類數據集時,只反向傳播分類誤差損失。檢測數據集COCO的分類比較泛(狗;船),分類數據集ImageNet比較細(哈士奇,獵犬;筏子,遊艇),這就導致類別標籤不具備排他性,爲此,作者首創了有向圖WordNet,爲了簡化問題,作者使用hierarchical tree表示ImageNet標籤的層級關係,根節點是‘physical object’,越抽象的標籤越靠近根節點層,如果一個子標籤屬於多個父標籤節點,則將他添加到距離根節點層級距離較短的父標籤節點下面。構建的這顆樹稱作WordTree。在執行分類任務時,我們爲每一個標籤節點預測一個條件概率,如果要計算一個節點標籤發生的概率,從根節點出發,連乘他們的條件概率,直到到達該標籤節點。根節點p(physical object) = 1.作者使用Darknet-19在1000類的ImageNet數據集上做了驗證。在構建的WordTree的過程中,添加了369箇中間節點,所以預測輸出的概率是一個1369維的向量,並且對每一父節點的所有子節點做softmax計算。使用之前Darknet-19訓練得到的參數,在增加369類的情況下,仍然獲得了top1精度71.9%,top5精度90.4%的分類效果。在做檢測任務,其模型稱作YOLO9000,它預測p(physical object), bounding box和條件概率樹。YOLO9000和YOLOv2預測輸出的結構一樣,YOLOv2輸出5個anchor boxes,YOLO9000輸出3個bounding boxes,在預測類別概率時,YOLO9000預測了1369個條件概率,外加一個p(physical object),在確定預測的最終類別時,不像YOLOv2那樣簡單直接選擇最大的概率值爲最終類別,YOLO9000需要設定一個閾值,從根節點出發,計算每一個層所有的標籤節點的概率值,直到這一層至少有一個標籤節點的概率達到閾值,如果這一層又多個標籤節點達到閾值,選擇概率值最大標籤節點爲最終類別,如果只有一個標籤節點達到閾值就直接將最終類別預測爲該類別標籤。當YOLO9000遇到檢測數據集圖片時,和YOLOv2一樣傳遞誤差損失(包含bounding box的誤差),對於類別損失的部分,只反向傳播類別標籤層級及以上層級的標籤誤差(具體的計算方法是,假設WordTree已經建立,找到真實類別標籤及以上層級標籤節點,分別計算他們發生的概率,真實標籤節點到根節點的這條路徑上的所有標籤節點的值爲1,其他節點爲0,然後對應相減求平方和)。如果YOLO9000遇到分類數據集圖片,只傳遞分類誤差,利用每個格子(YOLO9000中,一個格子有三個anchor boxes)中自信度最高的bounding box對應的類別概率計算分類誤差。(作者最後提到他有一個想法,將自信度最高的anchor box假設爲真實標籤bounding box值,格子中的其他anchor box與他計算IOU,IOU值大於0.3,則也反向傳遞bounding box誤差)

總結:YOLOv2的改進基本上是借鑑別人的方法,YOLO9000的數據集聯合訓練是作者的獨創,也是最大創新點,爲跨數據集訓練提供了思路。

4.YOLOv3:(An Incremental Improvement)

主要工作:對YOLOv2進行了更細微的設計調整,並且重新設計了一個結構稍微複雜一點的新網絡,在保證速度的前提下提高了精度。

Bounding Box Prediction:從前面的介紹知道Bounding box預測主要分爲兩個部分,座標預測和置信度預測(在訓練過程中,objectness置信度=IOU*boundbox預測的概率值)。YOLOv3中引入一個Objectness score概念,使用logistic regression爲每一個bounding box預測一個Objectness score。將預測的bounding boxes中與真實bounding box重疊最大的bounding box的Objectness score賦值爲1,如果這個bounding box與真實bounding box重疊值達到設定的閾值0.5,這個bounding box的損失爲0,其同一格子裏面的其他bounding box只計算置信度損失,忽略座標損失和類別損失。我的理解是:這裏bounding box是指網絡模型預測的confidence,bx,by,bw,bh,計算置信度誤差時,用真實標籤座標和預測座標(bx,by,bw,bh)計算IOU,Objectness score相當於Pr(Object),所以最終的置信度計算爲IOU*Pr(Object)

分析:作者忽略預測bounding box與真實bounding box的IOU達到閾值0.5的bounding box的損失(這個bounding box記作A),我的理解是0.5表示預測的bounding box已經能很好地標記框出物體,所以不用計算它的損失,每一個格子中的object由一個預測的bounding box預測,既然已經找到了較好地bounding box,所以同一個格子裏面的其他bounding box沒有必要計算座標誤差和分類誤差,只需要計算置信度誤差,用來調整置信度,最理想的效果是這些bounding box的置信度值更新爲0。論文中雖然沒有說明如果bounding box A沒有閾值該怎麼辦,但是基於我的分析,很明顯既然找不到滿意的bounding box,所以格子裏面的所有bounding box都參與誤差損失計算(包括座標,類別和置信度),補充說明:如果格子裏面確實沒有物體,bounding box的IOU值永遠無法達到0.5,這個格子裏面的所用bounding boxes就會一直更新,最理想的情況就是置信度,座標都爲0。

Class Prediction:類別預測使用了多標籤分類(多分類),沒有使用softmax,而是對每一個類各自對立地使用了logistic分類器,用binary cross-entroy loss替代softmax loss,這樣能較好地處理標籤重疊(包含)關係(例如:女人和人)【我理解的具體連接方式,神經網絡的預測bounding box那層的條件類概率輸出神經元后邊分別連接兩個神經元(第一個神經元表示是,另一個表示不是)作爲logistic regression,它的輸入爲類條件概率乘以置信度,這樣做相當於是爲每一個類別再做一次判斷,能夠更明確地處理標籤之間的重疊關係。【是這個類或者不是】

Predictions Across Scales:YOLOv3預測三種不同尺度的box,每一種尺度預測三個anchor boxes,即N*N*(3*(4+1+80)),所以最終的輸出是3*【N*N*(3*(4+1+80))】,最前面的3表示三種尺度。3種尺度,3個anchor box,是由聚類數爲9決定的,按照一定的順序(面積從小到大)將這個聚蔟box分配給不同尺度。在YOLOv2中,爲了加強對小物體的檢測,引入了passthrough層,假設最後提取的feature map的size是13*13,passthrough層的作用是將上層26*26的feature map和最後層13*13的feature map連接,作爲網絡最後的輸出。SSD中採用了尺度融合的方式,但是沒有上採樣過程,只是從網絡的不同層抽取不同尺度的feature map做預測。YOLOv3是採用了低分辨率feature map上採用和高分辨率feature map做融合,形成新的feature map層,對新的feature map層單獨做預測。這樣就是多尺度預測。如果YOLOv3最後一層也是13*13的話,那麼三個尺度的大小爲(13*13,26*26,52*52),第三個尺度只用第二個尺度上採樣並做融合。值得說明的是:YOLOv2中的多尺度指輸入圖像的大小不同,YOLOv3的多尺度是指用不同的分辨率的feature map做預測。

Feature Extractor:提出一種新的網絡模型darknet53

僅供參考,如有不對,還望指教

 

參考文獻:

3篇YOLO論文

其他博客(很多)

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章