㈠ YOLOv1網路
YOLO意思是You Only Look Once,創造性的將候選區和對象識別這兩個階段合二為一,看一眼圖片(不用看兩眼哦)就能知道有哪些對象以及它們的位置。其最大的特點是運行速度很快,可以用於實時系統。
實際上,YOLO並沒有真正去掉候選區,而是採用了預定義的候選區(准確點說應該是預測區,因為並不是Faster RCNN所採用的Anchor)。也就是將圖片劃分為 7 * 7=49 個網格(grid),每個網格允許預測出2個邊框(bounding box,包含某個對象的矩形框),總共 49 * 2=98 個bounding box。可以理解為98個候選區,它們很粗略的覆蓋了圖片的整個區域。
RCNN雖然會找到一些候選區,但畢竟只是候選,等真正識別出其中的對象以後,還要對候選區進行微調,使之更接近真實的bounding box。這個過程就是邊框回歸:將候選區bounding box調整到更接近真實的bounding box。
既然反正最後都是要調整的,幹嘛還要先費勁去尋找候選區呢,大致有個區域范圍就行了,所以YOLO就這么幹了。
去掉候選區這個步驟以後,YOLO的結構非常簡單,就是單純的卷積、池化最後加了兩層全連接。單看網路結構的話,和普通的CNN對象分類網路幾乎沒有本質的區別, 最大的差異是最後輸出層用線性函數做激活函數,因為需要預測bounding box的位置(數值型),而不僅僅是對象的概率。 所以粗略來說,YOLO的整個結構就是輸入圖片經過神經網路的變換得到一個輸出的張量,如下圖所示。
因為只是一些常規的神經網路結構,所以,理解YOLO的設計的時候,重要的是理解輸入和輸出的映射關系。
輸入就是原始圖像,唯一的要求是縮放到448 * 448的大小。主要是因為YOLO的網路中,卷積層最後接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那麼YOLO設計的尺寸就是448*448。
輸出是一個 7 7 30 的張量(tensor)。
1) 7 * 7網格
根據YOLO的設計,輸入圖像被劃分為 7 * 7 的網格(grid),輸出張量中的 7 * 7 就對應著輸入圖像的 7 * 7 網格。或者我們把 7 * 7 * 30 的張量看作 7 * 7=49個30維的向量,也就是輸入圖像中的每個網格對應輸出一個30維的向量。參考上圖,比如輸入圖像左上角的網格對應到輸出張量中左上角的向量。
要注意的是,並不是說僅僅網格內的信息被映射到一個30維向量。經過神經網路對輸入圖像信息的提取和變換,網格周邊的信息也會被識別和整理,最後編碼到那個30維向量中。
2)30維向量
具體來看每個網格對應的30維向量中包含了哪些信息。
因為YOLO支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網格位置存在任一種對象的概率。可以記為 ,之所以寫成條件概率,意思是如果該網格存在一個對象Object,那麼它是 的概率是 。記不清條件概率的同學可以參考一下 理解貝葉斯定理 )
每個bounding box需要4個數值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要8個數值來表示其位置。
bounding box的置信度 = 該bounding box內存在對象的概率 * 該bounding box與該對象實際bounding box的IOU,用公式來表示就是
是bounding box內存在對象的概率,區別於上面的 , 並不管是哪個對象,它體現的是 有或沒有 對象的概率;上面的 意思是假設已經有一個對象在網格中了,這個對象具體是哪一個。
是 bounding box 與 對象真實bounding box 的IOU(Intersection over Union,交並比)。要注意的是,現在討論的30維向量中的bounding box是YOLO網路的輸出,也就是預測的bounding box。所以 體現了預測的bounding box與真實bounding box的接近程度。
還要說明的是,雖然有時說"預測"的bounding box,但這個IOU是在訓練階段計算的。等到了測試階段(Inference),這時並不知道真實對象在哪裡,只能完全依賴於網路的輸出,這時已經不需要(也無法)計算IOU了。
綜合來說,一個bounding box的置信度Confidence意味著它 是否包含對象且位置准確的程度。置信度高表示這里存在一個對象且位置比較准確,置信度低表示可能沒有對象 或者 即便有對象也存在較大的位置偏差。
簡單解釋一下IOU。下圖來自Andrew Ng的深度學習課程,IOU=交集部分面積/並集部分面積,2個box完全重合時IOU=1,不相交時IOU=0。
總的來說,30維向量 = 20個對象的概率 + 2個bounding box * 4個坐標 + 2個bounding box的置信度。
3)討論
每個30維向量中只有一組(20個)對象分類的概率,也就只能預測出一個對象。所以輸出的 7 * 7=49個 30維向量,最多表示出49個對象。
每個30維向量中有2組bounding box,所以總共是98個候選區。
Faster RCNN等一些演算法採用每個grid中手工設置n個Anchor(先驗框,預先設置好位置的bounding box)的設計,每個Anchor有不同的大小和寬高比。YOLO的bounding box看起來很像一個grid中2個Anchor,但它們不是。YOLO並沒有預先設置2個bounding box的大小和形狀,也沒有對每個bounding box分別輸出一個對象的預測。它的意思僅僅是對一個對象預測出2個bounding box,選擇預測得相對比較準的那個。
這里採用2個bounding box,有點不完全算監督演算法,而是像進化演算法。如果是監督演算法,我們需要事先根據樣本就能給出一個正確的bounding box作為回歸的目標。但YOLO的2個bounding box事先並不知道會在什麼位置,只有經過前向計算,網路會輸出2個bounding box,這兩個bounding box與樣本中對象實際的bounding box計算IOU。這時才能確定,IOU值大的那個bounding box,作為負責預測該對象的bounding box。
訓練開始階段,網路預測的bounding box可能都是亂來的,但總是選擇IOU相對好一些的那個,隨著訓練的進行,每個bounding box會逐漸擅長對某些情況的預測(可能是對象大小、寬高比、不同類型的對象等)。所以,這是一種進化或者非監督學習的思想。
另外論文中經常提到responsible。比如:Our system divides the input image into an S*S grid. If the center of an object falls into a grid cell, that grid cell is responsible for detecting that object. 這個 responsible 有點讓人疑惑,對預測"負責"是啥意思。其實沒啥特別意思,就是一個Object只由一個grid來進行預測,不要多個grid都搶著預測同一個Object。更具體一點說,就是在設置訓練樣本的時候,樣本中的每個Object歸屬到且僅歸屬到一個grid,即便有時Object跨越了幾個grid,也僅指定其中一個。具體就是計算出該Object的bounding box的中心位置,這個中心位置落在哪個grid,該grid對應的輸出向量中該對象的類別概率是1(該gird負責預測該對象),所有其它grid對該Object的預測概率設為0(不負責預測該對象)。
還有:YOLO predicts multiple bounding boxes per grid cell. At training time we only want one bounding box predictor to be responsible for each object. 同樣,雖然一個grid中會產生2個bounding box,但我們會選擇其中一個作為預測結果,另一個會被忽略。下面構造訓練樣本的部分會看的更清楚。
7 * 7網格,每個網格2個bounding box,對448 * 448輸入圖像來說覆蓋粒度有點粗。我們也可以設置更多的網格以及更多的bounding box。設網格數量為 S * S,每個網格產生B個邊框,網路支持識別C個不同的對象。這時,輸出的向量長度為: ,整個輸出的tensor就是: 。
YOLO選擇的參數是 7 7網格,2個bounding box,20種對象,因此 輸出向量長度 = 20 + 2 * (4+1) = 30。整個輸出的tensor就是 7 7*30。
因為網格和bounding box設置的比較稀疏,所以這個版本的YOLO訓練出來後預測的准確率和召回率都不是很理想,後續的v2、v3版本還會改進。當然,因為其速度能夠滿足實時處理的要求,所以對工業界還是挺有吸引力的。
作為監督學習,我們需要先構造好訓練樣本,才能讓模型從中學習。
對於一張輸入圖片,其對應輸出的7 7 30張量(也就是通常監督學習所說的標簽y或者label)應該填寫什麼數據呢。
首先,輸出的 7 7維度 對應於輸入的 7 7 網格。 然後具體看下30維向量的填寫(請對照上面圖6)。
對於輸入圖像中的每個對象,先找到其中心點。比如上圖中的自行車,其中心點在黃色圓點位置,中心點落在黃色網格內,所以這個黃色網格對應的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點所在的網格對預測該對象負責"。狗和汽車的分類概率也是同樣的方法填寫。
訓練樣本的bounding box位置應該填寫對象實際的bounding box,但一個對象對應了2個bounding box,該填哪一個呢?上面討論過,需要根據網路輸出的bounding box與對象實際bounding box的IOU來選擇,所以要在訓練過程中動態決定到底填哪一個bounding box。
上面討論過置信度公式 , 可以直接計算出來,就是用網路輸出的2個bounding box與對象真實bounding box一起計算出IOU。
然後看2個bounding box的IOU,哪個比較大(更接近對象實際的bounding box),就由哪個bounding box來負責預測該對象是否存在,即該bounding box的 ,同時對象真實bounding box的位置也就填入該bounding box。另一個不負責預測的bounding box的 。
總的來說就是,與對象實際bounding box最接近的那個bounding box,其 ,該網格的其它bounding box的 。
舉個例子,比如上圖中自行車的中心點位於4行3列網格中,所以輸出tensor中4行3列位置的30維向量如下圖所示。
翻譯成人話就是:4行3列網格位置有一輛自行車,它的中心點在這個網格內,它的位置邊框是bounding box1所填寫的自行車實際邊框。
注意,圖中將自行車的位置放在bounding box1,但實際上是在訓練過程中等網路輸出以後,比較兩個bounding box與自行車實際位置的IOU,自行車的位置(實際bounding box)放置在IOU比較大的那個bounding box(圖中假設是bounding box1),且該bounding box的置信度設為1。
損失就是網路實際輸出值與樣本標簽值之間的偏差。
YOLO給出的損失函數如下:
其中,
是指網格i存在對象;
是指網格i的第j個bounding box中存在對象;
是指網格i的第j個bounding box中不存在對象。
總的來說,就是用網路輸出與樣本標簽的各項內容的誤差平方和作為一個樣本的整體誤差。 損失函數中的幾個項是與輸出的30維向量中的內容相對應的。
公式第5行,注意 意味著存在對象的網格才計入誤差。
公式第1行和第2行。
a) 都帶有 意味著只有"負責"(IOU比較大)預測的那個bounding box的數據才會計入誤差;
b) 第2行寬度和高度先取了平方根,因為如果直接取差值的話,大的對象對差值的敏感度較低,小的對象對差值的敏感度較高,所以取平方根可以降低這種敏感度的差異,使得較大的對象和較小的對象在尺寸誤差上有相似的權重。
c) 乘以 調節bounding box位置誤差的權重(相對分類誤差和置信度誤差)。YOLO設置 ,即調高位置誤差的權重。
公式第3行和第4行。
a) 第3行是存在對象的bounding box的置信度誤差。帶有 意味著只有"負責"(IOU比較大)預測的那個bounding box的置信度才會計入誤差。
b) 第4行是不存在對象的bounding box的置信度誤差。因為不存在對象的bounding box應該老老實實的說"我這里沒有對象",也就是輸出盡量低的置信度。如果它不恰當的輸出較高的置信度,會與真正"負責"該對象預測的那個bounding box產生混淆。其實就像對象分類一樣,正確的對象概率最好是1,所有其它對象的概率最好是0。
c) 第4行乘以 調節不存在對象的bounding box 的置信度的權重(相對其他誤差)。YOLO設置 ,即調低不存在對象的bounding box的置信度誤差的權重。
YOLO先使用ImageNet數據集對前20層卷積網路進行預訓練,然後使用完整的網路,在PASCAL VOC數據集上進行對象識別和定位的訓練和預測。YOLO的網路結構如下圖所示:
YOLO的最後一層採用線性激活函數,其它層都是Leaky ReLU。訓練中採用了dropout和數據增強(data augmentation)來防止過擬合。更多細節請參考原論文。
訓練好的YOLO網路,輸入一張圖片,將輸出一個 7 7 30 的張量(tensor)來表示圖片中所有網格包含的對象(概率)以及該對象可能的2個位置(bounding box)和可信程度(置信度)。 為了從中提取出最有可能的那些對象和位置,YOLO採用NMS(Non-maximal suppression,非極大值抑制)演算法。
NMS方法並不復雜,其核心思想是:選擇得分最高的作為輸出,與該輸出重疊的去掉,不斷重復這一過程直到所有備選處理完。
YOLO的NMS計算方法如下。
網路輸出的7 * 7 * 30的張量,在每一個網格中,對象 位於第j個bounding box的得分: ,它代表著某個對象 存在第j個bounding box的可能性。
每個網格有:20個對象的概率*2個bounding box的置信度,共40個得分(候選對象)。49個網格共1960個得分。Andrew Ng建議每種對象分別進行NMS,那麼每種對象有 1960/20=98 個得分。
NMS步驟如下:
1)設置一個Score的閾值,低於該閾值的候選對象排除掉(將該Score設為0)
2)遍歷每一個對象類別
2.1)遍歷該對象的98個得分
2.1.1)找到Score最大的那個對象及其bounding box,添加到輸出列表
2.1.2)對每個Score不為0的候選對象,計算其與上面2.1.1輸出對象的bounding box的IOU
2.1.3)根據預先設置的IOU閾值,所有高於該閾值(重疊度較高)的候選對象排除掉(將Score設為0)
2.1.4)如果所有bounding box要麼在輸出列表中,要麼Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象
3)輸出列表即為預測的對象
YOLO以速度見長,處理速度可以達到45fps,其快速版本(網路較小)甚至可以達到155fps。這得益於其識別和定位合二為一的網路設計,而且這種統一的設計也使得訓練和預測可以端到端的進行,非常簡便。
不足之處是小對象檢測效果不太好(尤其是一些聚集在一起的小對象),對邊框的預測准確度不是很高,總體預測精度略低於Fast RCNN。主要是因為網格設置比較稀疏,而且每個網格只預測兩個邊框,另外Pooling層會丟失一些細節信息,對定位存在影響。
㈡ YOLO 目標檢測實戰項目『原理篇』
在目標檢測中,IoU 為預測框 (Prediction) 和真實框 (Ground truth) 的交並比。如下圖所示,在關於小貓的目標檢測中,紫線邊框為預測框 (Prediction),紅線邊框為真實框 (Ground truth)。
在目標檢測任務中,通常取 IoU≥0.5,認為召回。如果 IoU 閾值設置更高,召回率將會降低,但定位框則更加精確。
理想的情況,當然是預測框與真實框重疊越多越好,如果兩者完全重疊,則交集與並集面積相同,此時 IoU 等於 1。
之前的目標檢測方法需要先產生候選區再檢測的方法雖然有相對較高的檢測准確率,但運行速度較慢。
YOLO 將識別與定位合二為一,結構簡便,檢測速度快,更快的 Fast YOLO 可以達到 155FPS。
YOLO 網路借鑒了 GoogLeNet 分類網路結構,不同的是 YOLO 使用 1x1 卷積層和 3x3 卷積層替代 inception mole。如下圖所示,整個檢測網路包括 24 個卷積層和 2 個全連接層。其中,卷積層用來提取圖像特徵,全連接層用來預測圖像位置和類別概率值。
如上圖所示,損失函數分為坐標預測(藍色框)、含有物體的邊界框的 confidence 預測(紅色框)、不含有物體的邊界框的 confidence 預測(黃色框)、分類預測(紫色框)四個部分。
由於不同大小的邊界框對預測偏差的敏感度不同,小的邊界框對預測偏差的敏感度更大。為了均衡不同尺寸邊界框對預測偏差的敏感度的差異。作者巧妙的對邊界框的 w,h 取均值再求 L2 loss. YOLO 中更重視坐標預測,賦予坐標損失更大的權重,記為 coord,在 pascal voc 訓練中 coodd=5 ,classification error 部分的權重取 1。
某邊界框的置信度定義為:某邊界框的 confidence = 該邊界框存在某類對象的概率 pr (object)* 該邊界框與該對象的 ground truth 的 IOU 值 ,若該邊界框存在某個對象 pr (object)=1 ,否則 pr (object)=0 。由於一幅圖中大部分網格中是沒有物體的,這些網格中的邊界框的 confidence 置為 0,相比於有物體的網格,這些不包含物體的網格更多,對梯度更新的貢獻更大,會導致網路不穩定。為了平衡上述問題,YOLO 損失函數中對沒有物體的邊界框的 confidence error 賦予較小的權重,記為 noobj,對有物體的邊界框的 confidence error 賦予較大的權重。在 pascal VOC 訓練中 noobj=0.5 ,有物體的邊界框的 confidence error 的權重設為 1.
YOLOv1 雖然檢測速度快,但在定位方面不夠准確,並且召回率較低。為了提升定位準確度,改善召回率,YOLOv2 在 YOLOv1 的基礎上提出了幾種改進策略
YOLOv2 中在每個卷積層後加 Batch Normalization (BN) 層,去掉 dropout. BN 層可以起到一定的正則化效果,能提升模型收斂速度,防止模型過擬合。YOLOv2 通過使用 BN 層使得 mAP 提高了 2%。
目前的大部分檢測模型都會使用主流分類網路(如 vgg、resnet)在 ImageNet 上的預訓練模型作為特徵提取器,而這些分類網路大部分都是以小於 256x256 的圖片作為輸入進行訓練的,低解析度會影響模型檢測能力。YOLOv2 將輸入圖片的解析度提升至 448x448,為了使網路適應新的解析度,YOLOv2 先在 ImageNet 上以 448x448 的解析度對網路進行 10 個 epoch 的微調,讓網路適應高解析度的輸入。通過使用高解析度的輸入,YOLOv2 的 mAP 提升了約 4%。
YOLOv1 利用全連接層直接對邊界框進行預測,導致丟失較多空間信息,定位不準。YOLOv2 去掉了 YOLOv1 中的全連接層,使用 Anchor Boxes 預測邊界框,同時為了得到更高解析度的特徵圖,YOLOv2 還去掉了一個池化層。由於圖片中的物體都傾向於出現在圖片的中心位置,若特徵圖恰好有一個中心位置,利用這個中心位置預測中心點落入該位置的物體,對這些物體的檢測會更容易。所以總希望得到的特徵圖的寬高都為奇數。YOLOv2 通過縮減網路,使用 416x416 的輸入,模型下采樣的總步長為 32,最後得到 13x13 的特徵圖, 然後對 13x13 的特徵圖的每個 cell 預測 5 個 anchor boxes ,對每個 anchor box 預測邊界框的位置信息、置信度和一套分類概率值。使用 anchor boxes 之後,YOLOv2 可以預測 13x13x5=845 個邊界框,模型的召回率由原來的 81% 提升到 88%,mAP 由原來的 69.5% 降低到 69.2%. 召回率提升了 7%,准確率下降了 0.3%。
YOLOv2 採用 Darknet-19,其網路結構如下圖所示,包括 19 個卷積層和 5 個 max pooling 層,主要採用 3x3 卷積和 1x1 卷積, 這里 1x1 卷積可以壓縮特徵圖通道數以降低模型計算量和參數 ,每個卷積層後使用 BN 層 以加快模型收斂同時防止過擬合。最終採用 global avg pool 做預測。採用 YOLOv2,模型的 mAP 值沒有顯著提升,但計算量減少了。
在 Faster R-CNN 和 SSD 中,先驗框都是手動設定的,帶有一定的主觀性。YOLOv2 採用 k-means 聚類演算法對訓練集中的邊界框做了聚類分析,選用 boxes 之間的 IOU 值作為聚類指標。綜合考慮模型復雜度和召回率,最終選擇 5 個聚類中心,得到 5 個先驗框,發現其中中扁長的框較少,而瘦高的框更多,更符合行人特徵。通過對比實驗,發現用聚類分析得到的先驗框比手動選擇的先驗框有更高的平均 IOU 值,這使得模型更容易訓練學習。
Faster R-CNN 使用 anchor boxes 預測邊界框相對先驗框的偏移量,由於沒有對偏移量進行約束,每個位置預測的邊界框可以落在圖片任何位置,會導致模型不穩定,加長訓練時間。YOLOv2 沿用 YOLOv1 的方法,根據所在網格單元的位置來預測坐標,則 Ground Truth 的值介於 0 到 1 之間。網路中將得到的網路預測結果再輸入 sigmoid 函數中,讓輸出結果介於 0 到 1 之間。設一個網格相對於圖片左上角的偏移量是 cx,cy。先驗框的寬度和高度分別是 pw 和 ph,則預測的邊界框相對於特徵圖的中心坐標 (bx,by) 和寬高 bw、bh 的計算公式如下圖所示。
YOLOv2 結合 Dimention Clusters, 通過對邊界框的位置預測進行約束,使模型更容易穩定訓練,這種方式使得模型的 mAP 值提升了約 5%。
YOLOv2 借鑒 SSD 使用多尺度的特徵圖做檢測,提出 pass through 層將高解析度的特徵圖與低解析度的特徵圖聯系在一起,從而實現多尺度檢測。YOLOv2 提取 Darknet-19 最後一個 max pool 層的輸入,得到 26x26x512 的特徵圖。經過 1x1x64 的卷積以降低特徵圖的維度,得到 26x26x64 的特徵圖,然後經過 pass through 層的處理變成 13x13x256 的特徵圖(抽取原特徵圖每個 2x2 的局部區域組成新的 channel,即原特徵圖大小降低 4 倍,channel 增加 4 倍),再與 13x13x1024 大小的特徵圖連接,變成 13x13x1280 的特徵圖,最後在這些特徵圖上做預測。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%.
YOLOv2 中使用的 Darknet-19 網路結構中只有卷積層和池化層,所以其對輸入圖片的大小沒有限制。YOLOv2 採用多尺度輸入的方式訓練,在訓練過程中每隔 10 個 batches , 重新隨機選擇輸入圖片的尺寸,由於 Darknet-19 下采樣總步長為 32,輸入圖片的尺寸一般選擇 32 的倍數 {320,352,…,608}。採用 Multi-Scale Training, 可以適應不同大小的圖片輸入,** 當採用低解析度的圖片輸入時,mAP 值略有下降,但速度更快,當採用高解析度的圖片輸入時,能得到較高 mAP 值,但速度有所下降。**
YOLOv2 借鑒了很多其它目標檢測方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度檢測。除此之外,YOLOv2 在網路設計上做了很多 tricks, 使它能在保證速度的同時提高檢測准確率,Multi-Scale Training 更使得同一個模型適應不同大小的輸入,從而可以在速度和精度上進行自由權衡。
YOLO v2 對 YOLO v1 的缺陷進行優化,大幅度高了檢測的性能,但仍存在一定的問題, 如無法解決重疊問題的分類等 。
將 256x256 的圖片分別輸入以 Darknet-19,ResNet-101,ResNet-152 和 Darknet-53 為基礎網路的分類模型中,實驗得到的結果如下圖所示。可以看到 Darknet-53 比 ResNet-101 的性能更好,而且速度是其 1.5 倍,Darknet-53 與 ResNet-152 性能相似但速度幾乎是其 2 倍。注意到,Darknet-53 相比於其它網路結構實現了每秒最高的浮點計算量,說明其網路結構能更好的利用 GPU。
YOLOv3 借鑒了 FPN 的思想,從不同尺度提取特徵。相比 YOLOv2,YOLOv3 提取最後 3 層特徵圖,不僅在每個特徵圖上分別獨立做預測,同時通過將小特徵圖上采樣到與大的特徵圖相同大小,然後與大的特徵圖拼接做進一步預測。用維度聚類的思想聚類出 9 種尺度的 anchor box,將 9 種尺度的 anchor box 均勻的分配給 3 種尺度的特徵圖 .
在實際應用場合中,一個物體有可能輸入多個類別,單純的單標簽分類在實際場景中存在一定的限制。舉例來說,一輛車它既可以屬於 car(小汽車)類別,也可以屬於 vehicle(交通工具),用單標簽分類只能得到一個類別。因此在 YOLO v3 在網路結構中把原先的 softmax 層換成了邏輯回歸層,從而實現把單標簽分類改成多標簽分類。用多個 logistic 分類器代替 softmax 並不會降低准確率,可以維持 YOLO 的檢測精度不下降。
對於對象檢測,不僅要考慮精度,還要考慮實時運行的性能,雖然現在算力大幅度上升,但是普通的設備跑起來還是有點吃力。提高精度和加快速率仍是目標檢測的重大課題,道阻且長!
參考:
YOLOv1 參考
YOLOv2 參考
YOLOv3 參考
https://mp.weixin.qq.com/s/yccBloK5pOVxDIFkmoY7xg :非極大抑制
㈢ YOLOV2簡介
batch normalization: BN能夠給模型收斂帶來顯著地提升,同時也消除了其他形式正則化的必要。作者在每層卷積層的後面加入BN後,在mAP上提升了2%。BN也有助於正則化模型。有了BN便可以去掉用dropout來避免模型過擬合的操作。 BN層的添加直接將mAP硬拔了2個百分點,這一操作在yolo_v3上依然有所保留,BN層從v2開始便成了yolo演算法的標配。
high resolution classifier: 所有最頂尖的檢測演算法都使用了基於ImageNet預訓練的分類器。從AlexNet開始,大多數分類器的輸入尺寸都是小於256x256的。最早的YOLO演算法用的是224x224,現在已經提升到448了。這意味著網路學習目標檢測的時候必須調整到新的解析度。
對於YOLOv2,作者一開始在協調分類網路(指DarkNet-19)用的448X448全解析度在ImageNet上跑了10個epoch。這使得網路有時間去調整自己的filter來使得自己能夠在更高解析度的輸入上表現更佳。然後,作者們把這種更高解析度的分類網路用到detection上,發現mAP提升了4% 。
convolutional with Anchor Boxes :在yolo_v2 的優化嘗試中加入了anchor機制。YOLO通過全連接層直接預測Bounding Box 的坐標值。Faster R-CNN並不是直接預測坐標值。Faster R-CNN只是用RPN種的全連接來為每一個box預測offset(坐標的偏移量或精修量)以及置信度(得分)。(說明:faster r-cnn的box主體來自anchor,RPN只是提供精修anchor的offset量)
由於預測層是卷積性的,所以RPN預測offset是全局性的。預測offset而不是坐標簡化了實際問題,並且更便於網路學習。
作者去除了YOLO的全連接層,使用anchor框來預測bounding box。首先,作者去除了一層池化層以保證卷積輸出具有較高的解析度。作者把448X448的圖像收縮到416大小。因為作者想讓輸出特徵圖的維度是奇數(416/32=13,13為奇數),這樣的話會有一個中間單元格(center cell)。物體(尤其是大物體)經常占據圖像的中心,所以有一個單獨位置恰好在中心位置能夠很好地預測物體。YOLO的卷積層下采樣這些圖像以32(即2525)為采樣系數(416/32 = 13),所以輸出feature map為13x13。
使用了anchor boxes機制之後,准確率有一點點下降。YOLO(指YOLO v1)只能在每張圖給出98個預測框,但是使用了anchor boxes機制之後模型能預測超過1000個框。
Dimension Clusters: 當作者使用anchor機制時,遇到2個問題。
直接預測(x,y),就像yolo_v1的做法,不過v2是預測一個相對位置,相對單元格的左上角的坐標(上圖所示)。當(x, y)被直接預測出來,那整個bounding box還差w和h需要確定。yolo_v2的做法是既有保守又有激進,x和y直接暴力預測,而w和h通過bounding box prior的調整來確定。yolo為每個bounding box預測出5個坐標(tx,ty,tw,th,to)
Fine-Grained Features: 調整後的yolo將在13X13的特徵圖上做檢測任務。雖然這對大物體檢測來說用不著這么細粒度的特徵圖,但這對小物體檢測十分有幫助。Fast R-CNN和SSD都是在各種特徵圖上做推薦網路以得到一個范圍內的解析度。我們採用不同的方法,只添加了一個passthrough層,從26x26的解析度得到特徵。
multi-scale training: 用多種解析度的輸入圖片進行訓練。
darknet-19: 用darknet-19作為yolo_v2的backbone網路。一般的檢測任務模型都會有一個分類網路作為backbone網路,比如faster R-CNN拿VGG作為backbone。yolo_v2用的自家的分類網路darknet-19作為base,體現出自家的優越性。同時在darknet-19中使用batch normalization來加速收斂。
YOLOv2採用了一個新的基礎模型(特徵提取器),稱為Darknet-19,包括19個卷積層和5個maxpooling層,如圖所示。Darknet-19與VGG16模型設計原則是一致的,主要採用3 3卷積,採用2 2的maxpooling層之後,特徵圖維度降低2倍,而同時將特徵圖的channles增加兩倍。與NIN(Network in Network)類似,Darknet-19最終採用global avgpooling做預測,並且在3 3卷積之間使用1 1卷積來壓縮特徵圖channles以降低模型計算量和參數。Darknet-19每個卷積層後面同樣使用了batch norm層以加快收斂速度,降低模型過擬合。在ImageNet分類數據集上,Darknet-19的top-1准確度為72.9%,top-5准確度為91.2%,但是模型參數相對小一些。使用Darknet-19之後,YOLOv2的mAP值沒有顯著提升,但是計算量卻可以減少約33%。
㈣ YOLOv3網路
YOLOv3沒有太多的創新,主要是借鑒一些好的方案融合到YOLO裡面。不過效果還是不錯的,在保持速度優勢的前提下,提升了預測精度,尤其是加強了對小物體的識別能力。
YOLO3主要的改進有:
為了達到更好的分類效果,作者自己設計訓練了darknet-53。作者在ImageNet上實驗發現這個darknet-53,的確很強,相對於ResNet-152和ResNet-101,darknet-53不僅在分類精度上差不多,計算速度還比ResNet-152和ResNet-101強多了,網路層數也比他們少。比較結果如下表所示,
darknet-53的網路結構如下圖所示,YOLOv3使用了darknet-53的前52層卷積結構,去掉了全連接層,因此YOLOv3是個全卷積網路。
darknet-53網路的特點:
YOLOv3採用了類似FPN的思想,在多個不同尺度上進行對象檢測。
YOLO2曾採用passthrough結構來檢測細粒度特徵,在YOLO3更進一步採用了3個不同尺度的特徵圖來進行對象檢測。
結合上圖看,卷積網路在79層後,經過下方幾個黃色的卷積層得到一種尺度的檢測結果。相比輸入圖像,這里用於檢測的特徵圖有32倍的下采樣。比如輸入是416 * 416的話,這里的特徵圖就是13 * 13了。由於下采樣倍數高,這里特徵圖的感受野比較大,因此適合檢測圖像中尺寸比較大的對象。
為了實現細粒度的檢測,第79層的特徵圖又開始作上采樣(從79層往右開始上采樣卷積),然後與第61層特徵圖融合(Concatenation),這樣得到第91層較細粒度的特徵圖,同樣經過幾個卷積層後得到相對輸入圖像16倍下采樣的特徵圖。它具有中等尺度的感受野,適合檢測中等尺度的對象。
最後,第91層特徵圖再次上采樣,並與第36層特徵圖融合(Concatenation),最後得到相對輸入圖像8倍下采樣的特徵圖。它的感受野最小,適合檢測小尺寸的對象。
隨著輸出的特徵圖的數量和尺度的變化,先驗框的尺寸也需要相應的調整。YOLO2已經開始採用K-means聚類得到先驗框的尺寸,YOLO3延續了這種方法,為每種下采樣尺度設定3種先驗框,總共聚類出9種尺寸的先驗框。
在COCO數據集這9個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
感受一下9種先驗框的尺寸,下圖中藍色框為聚類得到的先驗框。黃色框式ground truth,紅框是對象中心點所在的網格。
這里注意bounding box 與anchor box的區別:
Bounding box它輸出的是框的位置(中心坐標與寬高),confidence以及N個類別。
anchor box只是一個尺度即只有寬高。
不考慮神經網路結構細節的話,總的來說,對於一個輸入圖像,YOLO3將其映射到3個尺度的輸出張量,代表圖像各個位置存在各種對象的概率。
我們看一下YOLO3共進行了多少個預測。對於一個416 * 416的輸入圖像,在每個尺度的特徵圖的每個網格設置3個先驗框,總共有 13 * 13 * 3 + 26 * 26 * 3 + 52 * 52 * 3 = 10647 個預測。每一個預測是一個(4+1+80)=85維向量,這個85維向量包含邊框坐標(4個數值),邊框置信度(1個數值),對象類別的概率(對於COCO數據集,有80種對象)。
對比一下,YOLO2採用13 * 13 * 5 = 845個預測,YOLO3的嘗試預測邊框數量增加了10多倍,而且是在不同解析度上進行,所以mAP以及對小物體的檢測效果有一定的提升。
預測對象類別時不使用softmax,改成使用logistic的輸出進行預測。這樣能夠支持多標簽對象(比如一個人有Woman 和 Person兩個標簽)。
這張圖很好的總結了YOLOV3的結構,讓我們對YOLO有更加直觀的理解。
㈤ 目標檢測:YOLO和SSD 簡介
作為計算機視覺三大任務(圖像分類、目標檢測、圖像分割)之一,目標檢測任務在於從圖像中定位並分類感興趣的物體。傳統視覺方案涉及霍夫變換、滑窗、特徵提取、邊界檢測、模板匹配、哈爾特徵、DPM、BoW、傳統機器學習(如隨機森林、AdaBoost)等技巧或方法。在卷積神經網路的加持下,目標檢測任務在近些年裡有了長足的發展。其應用十分廣泛,比如在自動駕駛領域,目標檢測用於無人車檢測其他車輛、行人或者交通標志牌等物體。
目標檢測的常用框架可以分為兩類,一類是 two-stage/two-shot 的方法,其特點是將興趣區域檢測和分類分開進行,比較有代表性的是R-CNN,Fast R-CNN,Faster R-CNN;另一類是 one-stage/one-shot 的方法,用一個網路同時進行興趣區域檢測和分類,以YOLO(v1,v2,v3)和SSD為代表。
Two-stage的方式面世比較早,由於需要將興趣區域檢測和分類分開進行,雖然精度比較高,但實時性比較差,不適合自動駕駛無人車輛感知等應用場景。因而此次我們主要介紹一下SSD和YOLO系列框架。
SSD與2016年由W. Liu et al.在 SSD: Single Shot MultiBox Detector 一文中提出。雖然比同年提出的YOLO(v1)稍晚,但是運行速度更快,同時更加精確。
SSD的框架在一個基礎CNN網路(作者使用VGG-16,但是也可以換成其他網路)之上,添加了一些額外的結構,從而使網路具有以下特性:
用多尺度特徵圖進行檢測
作者在VGG-16後面添加了一些特徵層,這些層的尺寸逐漸減小,允許我們在不同的尺度下進行預測。越是深層小的特徵圖,用來預測越大的物體。
用卷積網路進行預測
不同於YOLO的全連接層,對每個用於預測的 通道特徵圖,SSD的分類器全都使用了 卷積進行預測,其中 是每個單元放置的先驗框的數量, 是預測的類別數。
設置先驗框
對於每一個特徵圖上的單元格,我們都放置一系列先驗框。隨後對每一個特徵圖上的單元格對應的每一個先驗框,我們預測先驗框的 維偏移量和每一類的置信度。例如,對於一個 的特徵圖,若每一個特徵圖對應 個先驗框,同時需要預測的類別有 類,那輸出的大小為 。(具體體現在訓練過程中)
其中,若用 表示先驗框的中心位置和寬高, 表示預測框的中心位置和寬高,則實際預測的 維偏移量 是 分別是:
下圖是SSD的一個框架,首先是一個VGG-16卷積前5層,隨後級聯了一系列卷積層,其中有6層分別通過了 卷積(或者最後一層的平均池化)用於預測,得到了一個 的輸出,隨後通過極大值抑制(NMS)獲得最終的結果。
圖中網路用於檢測的特徵圖有 個,大小依次為 , , , , , ;這些特徵圖每個單元所對應的預置先驗框分別有 , , , , , 個,所以網路共預測了 個邊界框,(進行極大值抑制前)輸出的維度為 。
未完待續
參考:
chenxp2311的CSDN博客:論文閱讀:SSD: Single Shot MultiBox Detector
小小將的知乎專欄:目標檢測|SSD原理與實現
littleYii的CSDN博客:目標檢測論文閱讀:YOLOv1-YOLOv3(一)
作者的其他相關文章:
圖像分割:全卷積神經網路(FCN)詳解
PointNet:基於深度學習的3D點雲分類和分割模型 詳解
基於視覺的機器人室內定位