網頁

2018年4月16日 星期一

YOLO閱讀筆記

這次介紹You Only Look Once這篇論文,簡稱為YOLO,這篇論文提出一項全新的實時檢測圖像的類神經網路模型,其許多設計思路值得學習,下面的連結是該論文縮址,歡迎各位朋友拜讀指教。

YOLO: https://goo.gl/orzGwt



柵格 (Grids)


YOLO有別於傳統CV(Computer Vision)先定位物件區域,再辨識物件類別的方式,YOLO將這種前後相依的流程轉化為一維的回歸問題。針對一張輸入圖,YOLO先該圖分割為S*S的柵格,其中每一個柵格須預測K筆成對的[Object Bounding Box, Confidence],及1筆 Object Class,其中每筆 Object Bounding Box 實際上為 [X, Y, W, H] 四筆資料,每筆 Object Class 實際上的筆數則視Classes的總數為多少 (因為 One-Hot Encoding),故每張輸入圖最後共有 (S*S*(K*5+Classes)) 筆預測值。

每個柵格對應的預測值

物體邊界框 (Object Bounding Box)

在YOLO中每個物體邊界框(Obj Bounding Box)由四個數值組成[X, Y, W, H],其中X,Y為該框的中心點(X,Y)座標,W表達該邊界框的寬,H則表其高。

置信度 (Confidence)

如前所述,YOLO最終對每一個柵格預測K筆成對的[Object Bounding Box, Confidence]及1筆 Object Class,其中,置信度(Confidence)表該筆Object Bounding Box確為該Object Class的信心分數,它的計算方法相當簡單:


如果該柵格含有物體,則計算該物體類別的條件機率乘上預測的Object Bounding Box與真實Object Bounding Box之間的IOU,如果該柵格不含物體,那條件機率自然為0,整個置信度也就等於0了。

網路架構


YOLO 網路架構

在YOLO整個網路中,使用了非常深的卷積層,1*1的卷積後緊接著3*3的卷積則是模仿自VGG網路,紅色框起來的部份為預訓練的模型,論文中對紅框這個部份在ImageNet 224*224*3的圖像集上訓練若干次後再遷移至最終的YOLO網路,另外,雖然訓練時使用224*224*3的輸入圖像尺寸,可在最終YOLO的運作中,作者則進一步將224*224*3的輸入圖像尺寸提高為448*448*3的輸入尺寸,這也是YOLO在準確度表現上尚待加強的因素之一(在YOLOv2中修正了這個問題)。

Sum Squard Error


作者原先使用常見的Sum Squard Error作為YOLO的誤差函數(Loss Function),這個算法將每一筆預測數據減去真實數據並開平方,加總後得到最後的誤差值(Loss),這個算法簡單易用,然而這個算法最大的缺陷為每一個預測值(S*S*(K*5+Classes)) 都被它等價的看待,在實務的問題中,往往各預測值的重要程度不一,在YOLO中,最嚴重的問題為S*S的柵格中,含有物體的柵格畢竟少數,更都的是不含物體的柵格,該柵格所預測的K筆Confidence皆為0,換句話說便是訓練樣本嚴重失衡(Confidence=0的太多,反之太少),如果將有/無物體的柵格皆視為等價,這樣網路就會傾向於不管三七二十一地將Confidence皆預測為0,如此一來,Confidence就失去它一開始被設計來作為Object Bounding Box可信度得分的初衷了。

Sum Squard Error

Fixed Sum Squard Error


根據上述的問題,作者想出一個改良的Sum Squard Error的算法,這裡且把它稱為Fixed Sum Squard Error主要思想就是對各個預測值分門別類,讓重要的值重要,無足輕重的值則折扣其影響力:

Fixed Sum Squard Errir

我們可以將這個算法分為三部份看待,分別對應藍紅黑三個區塊:

Object Bounding Box Loss

這裡用來計算Object Bounding Box誤差,其中只考慮含物體的柵格,不含物體的柵格則直接略過這個部份計算這個部份,於含物體的柵格中,W, H的預測值與實際值先開根號互減再平方是為了強化不同尺度的誤差的分際,整個誤差值加總後再額外乘上一個較重的權重,以增強這項局部誤差對總誤差的影響力。

Confidence Loss

這項僅僅將含物體的柵格與不含物體的柵格分開計算,對於含物體的柵格仍然是原本的Squard Error,對於不含物體的柵格,則乘上一個較小的權重以彌補上述樣本集失衡的嚴重問題。

Classes Loss

這項僅忽略了不含物體的柵格,針對含物體的柵格計算Squard Error。

最終,將這三部份加總就是最後的總誤差了,這個誤差算法較修改前的算法合理了許多,也無須額外對數據做Over Sampling就修正了樣本失衡的問題。

預測流程


YOLO的預測流程極為直覺,YOLO將輸入圖切割為S*S的柵格,每個柵格負責預測(K*5+Classes) 筆數據,整張圖最終預測並輸出了(S*S*(K*5+Classes)) 的一維數據,將這些數據重組讓S*S個柵格一一對應一組(K*5+Classes)的數據,其中的Confidence如果低於設置的硬門檻則該筆Object Bounding Box丟棄不用,將留下的數據經NMS聚類後得出僅存的Object Bounding Box及其Class。

表現


作者在VOC2007數據集上拿YOLO跟當時較先進的Fast-RCNN進行比較,YOLO在識別物體上的準確度(65.5%)雖然沒有Fast R-CNN高(71.6%),可YOLO將背景誤判為物體的狀況只有4.75%,Fast R-CNN則高達13.6%,故YOLO是具備一定優勢的,在幀數上,YOLO每秒可辨識45幀,Fast R-CNN僅有0.5幀,在速度上完全不是一個量級,最後,YOLO在定位錯誤上則高達19%,這是YOLO較明顯的缺陷,在YOLOv2中則解決了此一問題。


Performance

總結


YOLO這個網路的思路新穎,特立獨行,有別於傳統CV作法,雖然在物體辨識的準確度上未能達到頂尖級別,然而其設計巧思為它帶來的巨大速度提昇是值得學習借鑒的,是真正的Real Time Detection的網路,另外,YOLOv2在確保YOLO速度的前提下,加入各種Trick,一舉解決YOLO中從在的明顯缺陷,YOLOv2是現今最頂尖的圖像檢測方法之一,之後筆者將再詳述其原理及其如何應用於實務。

沒有留言:

張貼留言