㈠ yolo 演算法
YOLO是一種目標檢測的演算法。
YOLO將對象檢測重新定義為一個回歸問題,所以它非常快,不需要復雜的管道。它比「R-CNN」快1000倍,比「Fast R-CNN」快100倍。能夠處理實時的視頻流,延遲能夠小於25毫秒,精度是以前實時系統的兩倍多,YOLO遵循的是「端到端深度學習」的實踐。它將單個卷積神經網路(CNN)應用於整個圖像,將圖像分成網格,並預測每個網格的類概率和邊界框。
例如,以一個100x100的圖像為例。我們把它分成網格,比如7x7。然後,對於每個網格,網路都會預測一個邊界框和與每個類別(汽車,行人,交通信號燈等)相對應的概率。
㈡ yolo演算法是指什麼
YOLO (You Only Look Once),是一個用於目標檢測的網路。
目標檢測任務包括確定圖像中存在某些對象的位置,以及對這些對象進行分類。以前的方法,比如R-CNN和它的變種,使用一個管道在多個步驟中執行這個任務。這可能運行緩慢,也很難優化,因為每個單獨的組件都必須單獨訓練。
特點
YOLO將對象檢測重新定義為一個回歸問題。它將單個卷積神經網路(CNN)應用於整個圖像,將圖像分成網格,並預測每個網格的類概率和邊界框。
該演算法還可以預測邊界框中存在對象的概率。如果一個對象的中心落在一個網格單元中,則該網格單元負責檢測該對象。每個網格中將有多個邊界框。在訓練時,我們希望每個對象只有一個邊界框。因此,我們根據哪個Box與ground truth box的重疊度最高,從而分配一個Box來負責預測對象。
㈢ yolo演算法是什麼
Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測。
首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。
目標檢測的任務是從圖片中找出物體並給出其類別和位置,對於單張圖片,輸出為圖片中包含的N個物體的每個物體的中心位置(x,y)、寬(w)、高(h)以及其類別。
技術背景:
人們看到圖像以後,可以立即識別其中的對象、它們的位置和相對位置。這使得我們能夠在幾乎無意識的情況下完成復雜的任務,比如開車。
因此,對汽車進行自動駕駛訓練需要類似水平的反應能力和准確性。
在其最基本的形式中,這樣的系統必須能夠分析實時視頻中的道路,並能夠在繼續確定路徑之前檢測各種類型的對象及其在現實世界中的位置,所有這些都必須是實時的。
㈣ yolo演算法是什麼
Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測。
首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。
相關信息:
Yolo採用卷積網路來提取特徵,然後使用全連接層來得到預測值。網路結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如圖8所示。對於卷積層,主要使用1x1卷積來做channle rection,然後緊跟3x3卷積。
㈤ 視覺檢測中的YOLO家族演算法是一種兩步檢測的方法,對嗎
對的。
YOLO是一個對象檢測演算法的名字,這是Redmon等人在2016年的一篇研究論文中命名的。YOLO實現了自動駕駛汽車等前沿技術中使用的實時對象檢測。
該演算法還可以預測邊界框中存在對象的概率,如果一個對象的中心落在一個網格單元中,則該網格單元負責檢測該對象,每個網格中將有多個邊界框。
㈥ YOLO v1深入理解
YOLO(You Only Look Once)是一種基於深度神經網路的對象識別和定位演算法,其最大的特點是運行速度很快,可以用於實時系統。
現在YOLO已經發展到v3版本,不過新版本也是在原有版本基礎上不斷改進演化的,所以本文先分析YOLO v1版本。
關於 YOLOv2/YOLO9000 的分析理解請移步 YOLO v2 / YOLO 9000 。
輸入一張圖片,要求輸出其中所包含的對象,以及每個對象的位置(包含該對象的矩形框)。
對象識別和定位,可以看成兩個任務:找到圖片中某個存在對象的區域,然後識別出該區域中具體是哪個對象。
對象識別這件事(一張圖片僅包含一個對象,且基本占據圖片的整個范圍),最近幾年基於CNN卷積神經網路的各種方法已經能達到不錯的效果了。所以主要需要解決的問題是,對象在哪裡。
最簡單的想法,就是遍歷圖片中所有可能的位置,地毯式搜索不同大小,不同寬高比,不同位置的每個區域,逐一檢測其中是否存在某個對象,挑選其中概率最大的結果作為輸出。顯然這種方法效率太低。
RCNN開創性的提出了候選區(Region Proposals)的方法,先從圖片中搜索出一些可能存在對象的候選區(Selective Search),大概2000個左右,然後對每個候選區進行對象識別。大幅提升了對象識別和定位的效率。
不過RCNN的速度依然很慢,其處理一張圖片大概需要49秒。因此又有了後續的Fast RCNN 和 Faster RCNN,針對 RCNN的神經網路結構和候選區的演算法不斷改進,Faster RCNN已經可以達到一張圖片約0.2秒的處理速度。下圖來自 R-CNN, Fast R-CNN, Faster R-CNN, YOLO — Object Detection Algorithms
但總體來說,RCNN系列依然是兩階段處理模式:先提出候選區,再識別候選區中的對象。
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的實現方案。
1)結構
去掉候選區這個步驟以後,YOLO的結構非常簡單,就是單純的卷積、池化最後加了兩層全連接。單看網路結構的話,和普通的CNN對象分類網路幾乎沒有本質的區別,最大的差異是最後輸出層用線性函數做激活函數,因為需要預測bounding box的位置(數值型),而不僅僅是對象的概率。所以粗略來說,YOLO的整個結構就是輸入圖片經過神經網路的變換得到一個輸出的張量,如下圖所示。
因為只是一些常規的神經網路結構,所以,理解YOLO的設計的時候,重要的是理解輸入和輸出的映射關系.
2)輸入和輸出的映射關系
3)輸入
參考圖5,輸入就是原始圖像,唯一的要求是縮放到448*448的大小。主要是因為YOLO的網路中,卷積層最後接了兩個全連接層,全連接層是要求固定大小的向量作為輸入,所以倒推回去也就要求原始圖像有固定的尺寸。那麼YOLO設計的尺寸就是448*448。
4)輸出
輸出是一個 7*7*30 的張量(tensor)。
4.1)7*7網格
根據YOLO的設計,輸入圖像被劃分為 7*7 的網格(grid),輸出張量中的 7*7 就對應著輸入圖像的 7*7 網格。或者我們把 7*7*30 的張量看作 7*7=49個30維的向量,也就是輸入圖像中的每個網格對應輸出一個30維的向量。參考上面圖5,比如輸入圖像左上角的網格對應到輸出張量中左上角的向量。
要注意的是,並不是說僅僅網格內的信息被映射到一個30維向量。經過神經網路對輸入圖像信息的提取和變換,網格周邊的信息也會被識別和整理,最後編碼到那個30維向量中。
4.2)30維向量
具體來看每個網格對應的30維向量中包含了哪些信息。
① 20個對象分類的概率
因為YOLO支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網格位置存在任一種對象的概率。可以記為 ,之所以寫成條件概率,意思是如果該網格存在一個對象Object,那麼它是 的概率是 。(記不清條件概率的同學可以參考一下 理解貝葉斯定理 )
② 2個bounding box的位置
每個bounding box需要4個數值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要8個數值來表示其位置。
③ 2個bounding box的置信度
bounding box的置信度 = 該bounding box內存在對象的概率 * 該bounding box與該對象實際bounding box的IOU
用公式來表示就是
是bounding box內存在對象的概率,區別於上面第①點的 。Pr(Object)並不管是哪個對象,它體現的是 有或沒有 對象的概率。第①點中的 意思是假設已經有一個對象在網格中了,這個對象具體是哪一個。
是 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的置信度
4.3)討論
① 一張圖片最多可以檢測出49個對象
每個30維向量中只有一組(20個)對象分類的概率,也就只能預測出一個對象。所以輸出的 7*7=49個 30維向量,最多表示出49個對象。
② 總共有 49*2=98 個候選區(bounding box)
每個30維向量中有2組bounding box,所以總共是98個候選區。
③ YOLO的bounding box並不是Faster RCNN的Anchor
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,但我們會選擇其中一個作為預測結果,另一個會被忽略。下面構造訓練樣本的部分會看的更清楚。
④ 可以調整網格數量、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版本還會改進。當然,因為其速度能夠滿足實時處理的要求,所以對工業界還是挺有吸引力的。
5)訓練樣本構造
作為監督學習,我們需要先構造好訓練樣本,才能讓模型從中學習。
對於一張輸入圖片,其對應輸出的7*7*30張量(也就是通常監督學習所說的標簽y或者label)應該填寫什麼數據呢。
首先,輸出的 7*7維度 對應於輸入的 7*7 網格。
然後具體看下30維向量的填寫(請對照上面圖6)。
① 20個對象分類的概率
對於輸入圖像中的每個對象,先找到其中心點。比如圖8中的自行車,其中心點在黃色圓點位置,中心點落在黃色網格內,所以這個黃色網格對應的30維向量中,自行車的概率是1,其它對象的概率是0。所有其它48個網格的30維向量中,該自行車的概率都是0。這就是所謂的"中心點所在的網格對預測該對象負責"。狗和汽車的分類概率也是同樣的方法填寫。
② 2個bounding box的位置
訓練樣本的bounding box位置應該填寫對象實際的bounding box,但一個對象對應了2個bounding box,該填哪一個呢?上面討論過,需要根據網路輸出的bounding box與對象實際bounding box的IOU來選擇,所以要在訓練過程中動態決定到底填哪一個bounding box。參考下面第③點。
③ 2個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。
6)損失函數
損失就是網路實際輸出值與樣本標簽值之間的偏差。
YOLO給出的損失函數如下
公式中
意思是網格i中存在對象。
意思是網格i的第j個bounding box中存在對象。
意思是網格i的第j個bounding box中不存在對象。
總的來說,就是用網路輸出與樣本標簽的各項內容的誤差平方和作為一個樣本的整體誤差。
損失函數中的幾個項是與輸出的30維向量中的內容相對應的。
① 對象分類的誤差
公式第5行,注意 意味著存在對象的網格才計入誤差。
② bounding box的位置誤差
公式第1行和第2行。
a)都帶有 意味著只有"負責"(IOU比較大)預測的那個bounding box的數據才會計入誤差。
b)第2行寬度和高度先取了平方根,因為如果直接取差值的話,大的對象對差值的敏感度較低,小的對象對差值的敏感度較高,所以取平方根可以降低這種敏感度的差異,使得較大的對象和較小的對象在尺寸誤差上有相似的權重。
c)乘以 調節bounding box位置誤差的權重(相對分類誤差和置信度誤差)。YOLO設置 ,即調高位置誤差的權重。
③ bounding box的置信度誤差
公式第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的置信度誤差的權重。
7)訓練
YOLO先使用ImageNet數據集對前20層卷積網路進行預訓練,然後使用完整的網路,在PASCAL VOC數據集上進行對象識別和定位的訓練和預測。YOLO的網路結構如下圖所示:
YOLO的最後一層採用線性激活函數,其它層都是Leaky ReLU。訓練中採用了drop out和數據增強(data augmentation)來防止過擬合。更多細節請參考原論文。
8)預測(inference)
訓練好的YOLO網路,輸入一張圖片,將輸出一個 7*7*30 的張量(tensor)來表示圖片中所有網格包含的對象(概率)以及該對象可能的2個位置(bounding box)和可信程度(置信度)。
為了從中提取出最有可能的那些對象和位置,YOLO採用NMS(Non-maximal suppression,非極大值抑制)演算法。
9)NMS(非極大值抑制)
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)輸出列表即為預測的對象
10)小結
YOLO以速度見長,處理速度可以達到45fps,其快速版本(網路較小)甚至可以達到155fps。這得益於其識別和定位合二為一的網路設計,而且這種統一的設計也使得訓練和預測可以端到端的進行,非常簡便。
不足之處是小對象檢測效果不太好(尤其是一些聚集在一起的小對象),對邊框的預測准確度不是很高,總體預測精度略低於Fast RCNN。主要是因為網格設置比較稀疏,而且每個網格只預測兩個邊框,另外Pooling層會丟失一些細節信息,對定位存在影響。
更多細節請參考原論文。
最後,如果你竟然堅持看到這里,覺得還有所幫助的話,請點個贊:)๑۩۞۩๑
You Only Look Once: Unified, Real-Time Object Detection
Andrew Ng的深度學習工程師 - 04卷積神經網路
圖解YOLO
你真的讀懂yolo了嗎?
目標檢測|YOLO原理與實現
㈦ yolo演算法是什麼
yolo演算法是一種目標檢測演算法。目標檢測任務的目標是找到圖像中的所有感興趣區域,並確定這些區域的位置和類別概率。目標檢測領域的深度學習方法主要分為兩大類兩階段式(Two-stage)目標檢測演算法和單階段式(One-stage)目標檢測演算法。兩階段式是先由演算法生成一系列候選邊界框作為樣本,然後再通過卷積神經網路分類這些樣本。
yolo演算法原理
因為它採用深層卷積神經網路,吸收了當前很多經典卷積神經網路架構的優秀思想,在位置檢測和對象的識別方面,性能達到最優(准確率非常高的情況下還能達到實時檢測)。因為作者還將代碼開源了。真心為作者這種大公無私的心胸點贊。
美中不足的是雖然將代碼開源,但是在論文介紹架構原理的時候比較模糊,特別是對一些重要改進,基本上是一筆帶過。現在在網路上有很多關於YOLO原理的講解。
㈧ 為什麼說yolo是xcm大師
因歸屬於xcm大師。yolo是目標檢測最頂級的演算法之一,v1版本是2016年提出來的,v2是2017年提出來的,v3是2018年提出的。其說yolo是xcm大師是因yolo是歸屬於xcm大師內部的演算法。
㈨ yolo演算法是什麼
YOLO 是一種使用神經網路提供實時對象檢測的演算法。該演算法因其速度和准確性而廣受歡迎。它已在各種應用中用於檢測交通信號、人員、停車計時器和動物。
YOLO 是「You Only Look Once」一詞的縮寫。這是一種演算法,可以(實時)檢測和識別圖片中的各種對象。YOLO 中的對象檢測是作為回歸問題完成的,並提供檢測到的圖像的類別概率。
YOLO 演算法採用卷積神經網路 (CNN) 實時檢測物體。顧名思義,該演算法只需要通過神經網路進行一次前向傳播來檢測物體。
這意味著整個圖像中的預測是在單個演算法運行中完成的。CNN 用於同時預測各種類別概率和邊界框。
YOLO 演算法由各種變體組成。
優點
1、速度:該演算法提高了檢測速度,因為它可以實時預測物體。
2、高精度:YOLO 是一種預測技術,可提供准確的結果且背景誤差最小。
3、學習能力:該演算法具有出色的學習能力,使其能夠學習對象的表示並將其應用於對象檢測。
㈩ 淺談Yolo
學號:20021210654
姓名:潘文欣
原文鏈接: https://blog.csdn.net/xiaohu2022/article/details/79211732
https://blog.csdn.net/qq_30815237/article/details/91949543
【嵌牛導讀】
當我們談起計算機視覺時,首先想到的就是圖像分類,沒錯,圖像分類是計算機視覺最基本的任務之一,但是在圖像分類的基礎上,還有更復雜和有意思的任務,如目標檢測,物體定位,圖像分割等。其中目標檢測是一件比較實際的且具有挑戰性的計算機視覺任務,其可以看成圖像分類與定位的結合,給定一張圖片,目標檢測系統要能夠識別出圖片的目標並給出其位置,由於圖片中目標數是不定的,且要給出目標的精確位置,目標檢測相比分類任務更復雜。
近幾年來,目標檢測演算法取得了很大的突破。比較流行的演算法可以分為兩類,一類是基於Region Proposal的R-CNN系演算法(R-CNN,Fast R-CNN, Faster R-CNN),它們是two-stage的,需要先使用啟發式方法(selective search)或者CNN網路(RPN)產生Region Proposal,然後再在Region Proposal上做分類與回歸。而另一類是Yolo,SSD這類one-stage演算法,其僅僅使用一個CNN網路直接預測不同目標的類別與位置。第一類方法是准確度高一些,但是速度慢,但是第二類演算法是速度快,但是准確性要低一些。
【嵌牛鼻子】 計算機視覺 目標檢測 YOLO演算法
【嵌牛正文】
目標檢測演算法有很多,本文介紹的是Yolo演算法,其全稱是You Only Look Once: Unified, Real-Time Object Detection,其中,You Only Look Once說的是只需要一次CNN運算,Unified指的是這是一個統一的框架,提供end-to-end的預測,而Real-Time體現是Yolo演算法速度快。
如下圖是YOLO的檢測系統,整體來看,首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。
具體來說,Yolo的CNN網路將輸入的圖片分割成S S網格,,然後每個單元格負責去檢測那些中心點落在該格子內的目標,如下圖,可以看到狗這個目標的中心落在左下角一個單元格內,那麼該單元格負責預測這個狗。每個單元格會預測B個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的准確度。前者記為Pr(object),當該邊界框是背景時(即不包含目標),此時Pr(object)=0。而當該邊界框包含目標時,Pr(object)=1。邊界框的准確度可以用預測框與實際框(ground truth)的IOU(intersection over union,交並比)來表徵,記為 。因此置信度可以定義為Pr(object)∗ 。很多人可能將Yolo的置信度看成邊界框是否含有目標的概率,但是其實它是兩個因子的乘積,預測框的准確度也反映在裡面。邊界框的大小與位置可以用4個值來表徵:(x,y,w,h),其中(x,y)是邊界框的中心坐標,而w和h是邊界框的寬與高。還有一點要注意,中心坐標的預測值(x,y)是相對於每個單元格左上角坐標點的偏移值,並且單位是相對於單元格大小的,單元格的坐標定義如圖6所示。而邊界框的w和h預測值是相對於整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]范圍。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表徵邊界框的大小與位置,而最後一個值是置信度。
還有分類問題,對於每一個單元格其還要給出預測出C個類別概率值,其表徵的是由該單元格負責預測的邊界框其目標屬於各個類別的概率。但是這些概率值其實是在各個邊界框置信度下的條件概率,即 。值得注意的是,不管一個單元格預測多少個邊界框,其只預測一組類別概率值,這是Yolo演算法的一個缺點,在後來的改進版本中,Yolo9000是把類別概率預測值與邊界框是綁定在一起的。同時,我們可以計算出各個邊界框類別置信度(class-specific confidence scores): 。邊界框類別置信度表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞。後面會說,一般會根據類別置信度來過濾網路的預測框。
總結一下,每個單元格需要預測(B∗5+C)個值。如果將輸入圖片劃分為S×S網格,那麼最終預測值為S×S×(B∗5+C)大小的張量。整個模型的預測值結構如下圖所示。對於PASCAL VOC數據,其共有20個類別,如果使用S=7,B=2,那麼最終的預測結果就是7×7×30大小的張量。在下面的網路結構中我們會詳細講述每個單元格的預測值的分布位置。
Yolo採用卷積網路來提取特徵,然後使用全連接層來得到預測值。網路結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如下圖所示。對於卷積層,主要使用1x1卷積來做channle rection,然後緊跟3x3卷積。對於卷積層和全連接層,採用Leaky ReLU激活函數。但是最後一層卻採用線性激活函數。
可以看到網路的最後輸出為7×7×30大小的張量。這和前面的討論是一致的。對於每一個單元格,前20個元素是類別概率值,然後2個元素是邊界框置信度,兩者相乘可以得到類別置信度,最後8個元素是邊界框的(x,y,w,h)。
在訓練之前,先在ImageNet上進行了預訓練,其預訓練的分類模型採用圖8中前20個卷積層,然後添加一個average-pool層和全連接層。預訓練之後,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連接層。由於檢測任務一般需要更高清的圖片,所以將網路的輸入從224x224增加到了448x448。整個網路的流程如下圖所示:
下面是訓練損失函數的分析,Yolo演算法將目標檢測看成回歸問題,所以採用的是均方差損失函數。但是對不同的部分採用了不同的權重值。首先區分定位誤差和分類誤差。對於定位誤差,即邊界框坐標預測誤差,採用較大的權重 。然後其區分不包含目標的邊界框與含有目標的邊界框的置信度,對於前者,採用較小的權重值 。其它權重值均設為1。然後採用均方誤差,其同等對待大小不同的邊界框,但是實際上較小的邊界框的坐標誤差應該要比較大的邊界框要更敏感。為了保證這一點,將網路的邊界框的寬與高預測改為對其平方根的預測,即預測值變為 。
另外一點時,由於每個單元格預測多個邊界框。但是其對應類別只有一個。那麼在訓練時,如果該單元格內確實存在目標,那麼只選擇與ground truth的IOU最大的那個邊界框來負責預測該目標,而其它邊界框認為不存在目標。這樣設置的一個結果將會使一個單元格對應的邊界框更加專業化,其可以分別適用不同大小,不同高寬比的目標,從而提升模型性能。大家可能會想如果一個單元格內存在多個目標怎麼辦,其實這時候Yolo演算法就只能選擇其中一個來訓練,這也是Yolo演算法的缺點之一。要注意的一點時,對於不存在對應目標的邊界框,其誤差項就是只有置信度,左標項誤差是沒法計算的。而只有當一個單元格內確實存在目標時,才計算分類誤差項,否則該項也是無法計算的。
綜上討論,最終的損失函數計算如下:
其中第一項是邊界框中心坐標的誤差項, 指的是第ii個單元格存在目標,且該單元格中的第j個邊界框負責預測該目標。第二項是邊界框的高與寬的誤差項。第三項是包含目標的邊界框的置信度誤差項。第四項是不包含目標的邊界框的置信度誤差項。而最後一項是包含目標的單元格的分類誤差項, 指的是第i個單元格存在目標。
NMS演算法(非極大值抑制演算法):選擇得分(Confidence Score)最高的作為輸出,與該輸出重疊的 去掉,不斷重復這一過程直到所有備選處理完。
YOLO的NMS演算法中, Confidence Score的值如下: , 。 代表著某個對象 存在於第j個邊界框的可能性。每個網格有:20個對象的概率*2個邊界框的置信度,共40個得分。49個網格共1960個得分。對每種對象分別進行NMS,那麼每種對象有1960/20=98個得分。
YOLO演算法的NMS步驟如下:
1)設置一個Score的閾值,低於該閾值的候選對象排除掉(將該Score設為0)
2)遍歷每一個對象類別
2.1)遍歷該對象的98個得分
2.1.1)找到Score最大的那個對象及其邊界框,添加到輸出列表
2.1.2)對每個Score不為0的候選對象,計算其與上面2.1.1輸出對象的邊界框的IOU
2.1.3)根據預先設置的IOU閾值,所有高於該閾值(重疊度較高)的候選對象排除掉(將Score設為0)
2.1.4)如果所有邊界框要麼在輸出列表中,要麼Score=0,則該對象類別的NMS完成,返回步驟2處理下一種對象
3)輸出列表即為預測的對象
這篇長文詳細介紹了Yolo演算法的原理及實現,當然Yolo-v1還是有很多問題的,所以後續可以讀讀Yolo9000演算法,看看其如何改進的。