yolo 負樣本 目標檢測介紹之YOLO與SSD

2021-10-14 13:14:58 字數 3893 閱讀 2152

當前,目標檢測的方法主要有兩類,一類被稱為兩階段方法,一類被稱為一階段方法。兩階段方法和一階段方法都是基於目標應位於某個矩形框內這樣乙個假設,區別在於兩階段方法多了乙個框的篩選階段(region proposal),一般來說,兩階段方法以複雜度為代價換取精度的提公升。 

兩階段的代表演算法主要有r-cnn,fast-rcnn,faster-rcnn及mask-rcnn,具體介紹見文章:目標檢測介紹之--rcnn系列 。一階段的開山之作為yolo,幾乎同一時期的ssd結合yolo和faster r-cnn的優點,取得了更好的精度和速度。本篇介紹yolo和ssd的檢測方法。

1. 分類與回歸

在介紹yolo和ssd之前,我們先看兩個概念:分類和回歸。

分類問題是指輸出變數為有限個離散變數的**問題,而回歸問題是指輸出變數均為連續變數的**問題。由於卷積神經網路在影象分類的巨大成功,人們將目標檢測問題轉化為分類問題,如r-cnn系列(「候選框+分類」)。另一方面,也是因為目標檢測問題難以直接應用回歸方法去解決。

對於單個目標的檢測問題,很容易將它看作乙個回歸問題,即**目標所屬類的分數和位置的量,如下圖所示。 

但是對於多個且不確定的目標檢測,因為需要回歸的變數個數不確定,這個方法變得不可行了。比如下圖中鴨媽媽帶了很多只小鴨子,具體數目並不是一目了然,或者說需要檢測的目標個數預先並不知曉。

2023年,joseph redmon提出了yolo模型,將檢測問題看做回歸問題,提出了端到端(end-to-end)的單一網路直接**邊界框和類概率,巧妙地運用回歸方法解決檢測問題。

2.  yolo

yolo全稱是you only look once,顧名思義就是你只需看一眼就能知道是什麼。所以作者希望所提出的演算法可以達到這種簡潔高效的檢測水平。它最大的優點在於執行速度很快。

yolo的思想大致如下:整張圖作為網路的輸入,把目標檢測的問題轉化成乙個回歸問題,直接輸出目標邊界框和類別概率。

前面說過,由於影象中目標個數的不確定性,目標檢測問題難以轉化為回歸問題。那麼,yolo是怎麼解決這個問題的呢?下面看一下它的解決思路。     

首先,yolo的具體操作過程如下:把一張劃分為s*s個格仔(圖左),然後對每個格仔**b個邊界框及這些邊界框的可信度(圖中上方)及c類的概率(圖中下方),這些**被編碼成乙個s*s*(b*5+c)的張量,其中的5對應 box(x, y, w,h) 與 p(object)的5個值。

當s=7,b=2,c=20時,輸出維度為7*7*30(上圖左)。每個1*1*30的維度對應原圖7*7個cell中的乙個(上圖中的紅框),1*1*30中含有類別**(20類)和2個物體框(bbox)座標及可信度**。

可以看出,yolo方法所確定的邊界框個數是確定的(rcnn系列中不確定),這也決定了影象中目標個數的上限,在上面的假設中,7*7*2=98個。

前面提到,每個網格**b個邊界框。這些邊界框裡面有些框包含了物體,有些並沒有包含物體,對沒有包含物體的邊界框進行回歸是沒有意義的。很多時候,邊界框與物體的真值(ground truth)並不是完全重合或者沒有任何交疊,而是有一部分相交。選擇哪些邊界框進行**是非常重要的。在yolo模型中,採取了這樣的策略:如果乙個物體的中心落在某乙個網格中,則該網格負責**這個物體。乙個網格有b個邊界框,則選擇與真值具有最大交並比(iou)的框來**物體。這導致了邊界框的專門化,它也使得在大小,寬長比,目標類別方面的**更好,提高了整個網路的召回率。以上也回答了yolo是如何將檢測問題轉化為回歸問題的。

需要指出的是,r-cnn裡面也用到了回歸方法。不過,r-cnn是將回歸方法用在最後檢測出的邊界框修正上,降低了定位的誤差。       

yolo演算法的損失函式由幾部分組成:座標損失(前2項),類別損失(第3,4項)及類別概率(第5項),並分配了不同的權重,這些回歸引數均為連續量。

雖然yolo在速度上獲得了很大的提公升,但精度卻相對於r-cnn差了點。主要由於基於格仔進行劃分一定程度上限制了物體框的大小以及位置,並且**框的數目也非常有限,對於密集型或者較小的目標,效果不如意。

在這張圖中,yolo檢測器把上面的人識別成了飛機。

3. ssd

ssd全稱single shot multi box detector,借鑑了faster r-cnn和yolo兩者的思想。既可以保證較快的速度,也可以有較高的精度。

上圖是ssd的示意圖,輸入的是一張原始和對應的真值(藍框和紅框),通過卷積網路後,會得到不同大小的特徵圖(如b圖8*8, c圖4*4)  ,這些特徵圖的每個位置都對應不同尺寸和形狀的預設框(類似faster r-cnn中的anchor box,這也是**題目中 multi box detector的由來),每個預設框都包含框的形狀偏移量(loc)及所屬不同類別對應的值(conf)。在訓練階段,需要將這些預設框跟真值匹配,相匹配的框為正樣本,其餘的則為負樣本。匹配的原則為選擇最大的交並比及交並比大於0.5的框。如b圖中有兩個藍框都滿足條件,因此被當做正樣本進行訓練。

上圖示意了在2層特徵圖上取預設框。實際中,**採取了在更多層上選取預設框,如下圖所示。下圖是ssd模型的結構,並與yolo做了對比。

在ssd中,演算法模型應用了vgg16網路,輸入300*300的,在conv5中得到38*38響應圖,每個位置上的預設框個數k取值為4,進一步降取樣後得到響應圖大小分別為19*19、10*10以及5*5,這三個響應圖k取值6,最後繼續降低取樣得到響應圖解析度分別為3*3、1*1,k取值4,那麼每乙個類別就可以得到8732(38*38*4+(19*19+10*10+5*5)*6+(3*3+1*1)*4=8732)個預設框。而在yolo中,輸入大小為448*448的影象,若格仔大小為7*7,每個格仔預設**2個物體框,最後每個類別就是7*7*2一共98個物體框。ssd相比yolo來說,輸入的更小,但得到的預設物體框數量高出很多,並且在速度上也很接近。

下圖是ssd的檢測效果圖。可以看出,檢測效果還不錯,但沒有檢測出玻璃花瓶。

4.  小結

yolo演算法是乙個非常有創意的檢測方法,它突破了「候選框+分類器」的統治框架。ssd演算法採取在多個特徵圖上檢測目標,借鑑了faster-rcnn的錨框思想,在檢測精度和速度上都有提公升。

參考:**:you only look once: unified, real-time object detection

**:ssd: single shot multibox detector

斯坦福李飛飛的課程ppt 中lecture 12: detection and segmentation

目標檢測 YOLO演算法

r cnn系列目標檢測方法 r cnn,fast r cnn,faster r cnn 看做目標檢測,都是需要 看兩眼 的。即,第一眼做 region proposals 獲得所有候選目標框,第二眼對所有候選框做 box classifier候選框分類 才能完成目標檢測 事實上 第一眼 是挺費時間的...

目標檢測YOLO實現

注 本文參考 git clone cd darknet make 編譯沒有問題的話輸出資訊如下 mkdir p obj gcc i usr local cuda include wall wfatal errors ofast.gcc i usr local cuda include wall wf...

目標檢測演算法之YOLO系列

1.演算法解讀 2.原始碼解析 nms演算法包含在 interpret output 這個函式中 v2通過對標籤聚類得到一系列anchor box prior box 相比v1,bounding box的數量大幅增加。v2 的bounding box以這些anchor box為基準,在一定程度上減少...