A. YOLOv3中的Anchor參數是怎麼來的
YOLOv3的配置文件中有一段對anchors參數的配置
根據 《YOLO9000:Better, Faster, Stronger》 文章中所述:
根據 《YOLOv3: An Incremental Improvement》 文章中所述:
從數據集中類聚出來的錨仔弊余框,相當於預測框的一個參考,基於這個參考,演算法生成的 預測框僅需要在這個錨框的基礎上念滾進行「精修或微調fine-tuning」 即可,這樣演算法可以收斂的更快,檢測效果更好卜神。
B. yolo演算法是什麼
Yolo是一種目標檢測演算法。
目標檢測的任務是從圖片中找出物體並給出其類別和位置,對於單張圖片,輸出為圖片中包含的N個物體的每個物體的中心位置(x,y)、寬(w)、高(h)以及其類別。
Yolo的預測基於整個圖片,一次性輸出所有檢測到的目標信號,包括其類別和位置。Yolo首先將圖片分割為sxs個相同大小的grid。
介紹
Yolo只要求grid中識別的物體的中心必須在這個grid內(具體來說,若某個目標的中心點位於一個grid內,該grid輸出該目標類別的概率為1,所有其他grid對該目標預測概率設置為0)。
實現方法:讓sxs個框每個都預測出B個boungding box,bounding box有5個量,分別為物體的x,y,h,w和預測的置信度;每個grid預測B個bounding box和物體類別,類別使用one-hot表示。
C. YOLOv3詳解
YOLO是「You Only Look Once」的簡稱,它雖然不是最精確的演算法,但在精確度和速度之間選擇的折中,效果也是相當不錯。YOLOv3借鑒了YOLOv1和YOLOv2,雖然沒有太多的創新點,但在保持YOLO家族速度的優勢的同時,提升了檢測精度,尤其對於小物體的檢測能力。YOLOv3演算法使用一個單獨神經網路作用在圖像上,將圖像劃分多個區域並且預測邊界框和每個區域的概率。
YOLOv3僅使用卷積層,使其成為一個全卷積網唯做絡(指旦衡FCN)。文章中,作者提出一個新的特徵提取網路,Darknet-53。正如其名,它包含53個卷積層,每個後面跟隨著batch normalization層和leaky ReLU層。沒有池化層,使用步幅為2的卷積層替代池化層進行特徵圖的降采樣過程,這樣可以有效阻止由於池化層導致的低層級特徵的損失。Darknet-53網路如下圖左邊所示。
輸入是 。輸出是帶有識別類的邊界框列表,每個邊界框由 六個參數表示。如果 表示80個類別,那麼每個邊界框由85個數字表示。
在YOLO中,預測過程使用一個 卷積,所以輸入是一個特徵圖。由於使用 卷積,因此預測圖正好是特徵圖大小( 卷積只是用於改變通道數)。在YOLOv3中,此預測圖是每個cell預測固定數量的邊界框。
如上圖所示,預測圖的深度為75,假設預測圖深度為 , 表示每個cell可以預測的邊界框數量。這些 個邊界框可以指定檢測到一個物體。每個邊界框有 個特徵,分別描述中心點坐標和寬高(四個)和物體分數(一個)以及 個類置信度(上圖中 )。YOLOv3每個cell預測三個邊界框。
如果對象的中心(GT框中心)落在該cell感受野范圍內,我們希望預測圖的每個單元格都能通過其中一個邊界框預測對象。其中只遲雀有一個邊界框負責檢測物體,首先我們需要確定此邊界框屬於哪個cell。
為了實現上面的想法,我們將原始圖像分割為最後預測圖維度大小的網格。如下圖所示,輸入圖像維度為 ,步幅為32(最後的預測圖降采樣32倍),最後預測圖維度為 ,所以我們將原始圖像劃分為 的網格。
直接預測框的寬高會導致訓練時不穩定的梯度問題,因此,現在的很多目標檢測方法使用log空間轉換或者簡單的偏移(offset)到稱為錨框的預定義默認邊界框。然後將這些變換應用到錨框以獲得預測,YOLOv3具有三個錨框,可以預測每個單元格三個邊界框。
錨框是邊界框的先驗,是使用k均值聚類在COCO數據集上計算的。我們將預測框的寬度和高度,以表示距聚類質心的偏移量。
以下公式描述了如何轉換網路輸出以獲得邊界框預測:
這里 分別是我們預測的中心坐標、寬度和高度。 是網路的輸出。 是網格從頂左部的坐標。 是錨框的維度(見下圖)。
通過sigmoid函數進行中心坐標預測,強制將值限制在0和1之間。YOLO不是預測邊界框中心的絕對坐標,它預測的是偏移量:相對於預測對象的網格單元的左上角;通過特徵圖cell歸一化維度。
例如,考慮上面狗的圖像。如果預測中心坐標是 ,意味著中心在 (因為紅色框左上角坐標是 )。但是如果預測的坐標大於1,例如 ,意味著中心在 ,現在中心在紅色框右邊,但是我們只能使用紅色框對對象預測負責,所以我們添加一個sidmoid函數強制限制在0和1之間。
通過對輸出應用對數空間轉換,然後與錨框相乘,可以預測邊界框的尺寸(如上面的計算公式)。
物體分數表示一個邊界框包含一個物體的概率,對於紅色框和其周圍的框幾乎都為1,但邊角的框可能幾乎都為0。物體分數也通過一個sigmoid函數,表示概率值。
類置信度表示檢測到的物體屬於一個具體類的概率值,以前的YOLO版本使用softmax將類分數轉化為類概率。在YOLOv3中作者決定使用sigmoid函數取代,原因是softmax假設類之間都是互斥的,例如屬於「Person」就不能表示屬於「Woman」,然而很多情況是這個物體既是「Person」也是「Woman」。
為了識別更多的物體,尤其小物體,YOLOv3使用三個不同尺度進行預測(不僅僅只使用 )。三個不同尺度步幅分別是32、16和8。這意味著,輸入 圖像,檢測尺度分別為 、 和 (如下圖或者更詳細如圖2所示)。
YOLOv3為每種下采樣尺度設定3個先驗框,總共聚類9個不同尺寸先驗框。在COCO數據集上9個先驗框分別是: 。下表是9個先驗框分配情況:
我們的網路生成10647個錨框,而圖像中只有一個狗,怎麼將10647個框減少為1個呢?首先,我們通過物體分數過濾一些錨框,例如低於閾值(假設0.5)的錨框直接捨去;然後,使用NMS(非極大值抑制)解決多個錨框檢測一個物體的問題(例如紅色框的3個錨框檢測一個框或者連續的cell檢測相同的物體,產生冗餘),NMS用於去除多個檢測框。
具體使用以下步驟:拋棄分數低的框(意味著框對於檢測一個類信心不大);當多個框重合度高且都檢測同一個物體時只選擇一個框(NMS)。
為了更方便理解,我們選用上面的汽車圖像。首先,我們使用閾值進行過濾一部分錨框。模型有 個數,每個盒子由85個數字描述。將 分割為下面的形狀:box_confidence: 表示 個cell,每個cell5個框,每個框有物體的置信度概率;boxes: 表示每個cell5個框,每個框的表示;box_class_probs: 表示每個cell5個框,每個框80個類檢測概率。
即使通過類分數閾值過濾一部分錨框,還剩下很多重合的框。第二個過程叫NMS,裡面有個IoU,如下圖所示。
下圖給出更加詳細的輸入輸出情況:
文章原文: https://medium.com/analytics-vidhya/yolo-v3-theory-explained-33100f6d193
論文原文: https://pjreddie.com/media/files/papers/YOLOv3.pdf
YOLOv3深入理解: https://www.jianshu.com/p/d13ae1055302
keras實現YOLOv3博客: https://blog.csdn.net/weixin_44791964/article/details/103276106
What new in YOLOv3?: https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b
D. YOLOv3原理
https://www.paddlepaddle.org.cn/tutorials/projectdetail/2412195/
R-CNN系列演算法需要先產生候選區域,再對候選區域做分類和位置坐標的預測,這類演算法被稱為兩階段目標檢測演算法。
與R-CNN系列演算法不同,YOLOv3使用單個網路結構,在產生候選區域的同時即可預測出物體類別和位置,不需要分成兩階段來完成檢測任務。另外,YOLOv3演算法產生的預測框數目比Faster R-CNN少很多。Faster R-CNN中每個真實框可能對應多個標簽為正的候選區域,而YOLOv3裡面每個真實框只對應一個正的候選區域。這些特性使得YOLOv3演算法具有更快的速度,能到達實時響應的水平。
Joseph Redmon等人在2015年提出YOLO(You Only Look Once,YOLO)演算法,通常也被稱為YOLOv1;2016年,他們對演算法進行改進,又提出YOLOv2版本;2018年發展出YOLOv3版本。
YOLOv3演算法的基本思想可以分成兩部分:
1、按一定規則在圖片上產生一系列的候選區域,然後根據這些候選區域與圖片上物體真實框之間的位置關系對候選區域進行標注。跟真實框足夠接近的那些候選區域會被標注為正樣本,同時將真實框的位置作為正樣本的位置目標。偏離真實框較大的那些候選區域則會被標注為負樣本,負樣本不需要預測位置或者類別。
2、使用卷積神經網路提取圖片特徵並對候選區域的位置和類別進行預測。這樣每個預測框就可以看成是一個樣本,根據真實框相對它的位置和類別進行了標注而獲得標簽值,通過網路模型預測其位置和類別,將網路預測值和標簽值進行比較,就可以建衫梁立起損失函數。
目前大多數基於卷積神經網路的模型所採用的方式大體如下:
1、按一定的規則在圖片上生成一系列位置固定的錨框,將這些錨框看作是可能的候選區域。
2、對錨框是否包含目標物體進行預測,如果包含目標物體,還需要預測所包含物體的類別,以及預測框相對於錨框位置需要調整的幅度。
將原始圖片劃分為m*n個區域,原始圖片高度H=640, 寬度W=480,如果我們選擇小塊區域的尺寸為32×32,則m和n分別為:
m=640/32=20
n=480/32=15
將原始圖片劃分成20行15列小方塊區域。
YOLOv3演算法會在每個區域的中心,生成一系列錨框。
錨李褲框的位置都是固定好的,不可能剛好跟物體邊界框重合,需要在錨框的基哪塌簡礎上進行位置的微調以生成預測框。預測框相對於錨框會有不同的中心位置和大小,採用什麼方式能得到預測框呢?我們先來考慮如何生成其中心位置坐標。
比如上面圖中在第10行第4列的小方塊區域中心生成的一個錨框,如綠色虛線框所示。以小方格的寬度為單位長度,
那麼問題來了,tx、ty、tw、th取什麼值的時候,才能使得預測框和真實框重合呢?
E. 【目標檢測演算法解讀】yolo系列演算法二
https://blog.csdn.net/Gentleman_Qin/article/details/84349144
|聲明:遵循CC 4.0 BY-SA版權協議
建立在YOLOv1的基礎上,經過Joseph Redmon等的改進,YOLOv2和YOLO9000演算法在2017年CVPR上被提出,並獲得最佳論文提名,重點解決YOLOv1召回率和定位精度方面的誤差。在提出時,YOLOv2在多種監測數據集中都要快過其他檢測系統,並可以在速度與精確度上進行權衡。
YOLOv2採用Darknet-19作為特徵提取網路,增加了批量標准化(Batch Normalization)的預處理,並使用224×224和448×448兩階段訓練ImageNet,得到預訓練模型後fine-tuning。
相比於YOLOv1是利用FC層直接預測Bounding Box的坐標,YOLOv2借鑒了FSR-CNN的思想,引入Anchor機制,利用K-Means聚類的方式在訓練集中聚類計算出更好的Anchor模板,在卷積層使用Anchor Boxes操作,增加Region Proposal的預測,同時採用較強約束的定位方法,大大提高演算法召回率。同時結合圖像細粒度特徵,將淺層特徵與深層特徵相連,有助於對小尺寸目標的檢測。
下圖所示是YOLOv2採取的各項改進帶了的檢測性能上的提升:
YOLO9000 的主要檢測網路也是YOLO v2,同時使用WordTree來混合來自不同的資源的訓練數據,並使用聯合優化技術同時在ImageNet和COCO數據集上進行訓練,目的是利用數量較大的分類數據集來幫助訓練檢測模型,因此,YOLO 9000的網路結構允許實時地檢測超過9000種物體分類,進一步縮小了檢測數據集與分類數據集之間的大小代溝。
下面將具體分析YOLOv2的各個創新點:
BN概述:
對數據進行預處理(統一格式、均衡化、去噪等)能夠大大提高訓練速度,提升訓練效果。BN正是基於這個假設的實踐,對每一層輸入的數據進行加工。
BN是2015年Google研究員在論文《Batch Normalization: Accelerating Deep Network Training by Recing Internal Covariate Shift》一文中提出的,同時也將BN應用到了2014年的GoogLeNet上,也就是Inception-v2。
BN層簡單講就是對網路的每一層的輸入都做了歸一化,這樣網路就不需要每層都去學數據的分布,收斂會更快。YOLOv1演算法(採用的是GoogleNet網路提取特徵)是沒有BN層的,而在YOLOv2中作者為每個卷積層都添加了BN層。
使用BN對網路進行優化,讓網路提高了收斂性,同時還消除了對其他形式的正則化(regularization)的依賴,因此使用BN後可以從模型中去掉Dropout,而不會產生過擬合。
BN優點:
神經網路每層輸入的分布總是發生變化,加入BN,通過標准化上層輸出,均衡輸入數據分布,加快訓練速度,因此可以設置較大的學習率(Learning Rate)和衰減(Decay);
通過標准化輸入,降低激活函數(Activation Function)在特定輸入區間達到飽和狀態的概率,避免梯度彌散(Gradient Vanishing)問題;
輸入標准化對應樣本正則化,BN在一定程度上可以替代 Dropout解決過擬合問題。
BN演算法:
在卷積或池化之後,激活函數之前,對每個數據輸出進行標准化,方式如下圖所示:
公式很簡單,前三行是 Batch內數據歸一化(假設一個Batch中有每個數據),同一Batch內數據近似代表了整體訓練數據。第四行引入了附加參數 γ 和 β,此二者的取值演算法可以參考BN論文,在此不再贅述。
fine-tuning:用已經訓練好的模型,加上自己的數據集,來訓練新的模型。即使用別人的模型的前幾層,來提取淺層特徵,而非完全重新訓練模型,從而提高效率。一般新訓練模型准確率都會從很低的值開始慢慢上升,但是fine-tuning能夠讓我們在比較少的迭代次數之後得到一個比較好的效果。
YOLO模型分為兩部分,分類模型和檢測模型,前者使用在ImageNet上預訓練好的模型,後者在檢測數據集上fine-tuning。
YOLOv1在預訓練時採用的是224*224的輸入(在ImageNet數據集上進行),然後在檢測的時候採用448*448的輸入,這會導致從分類模型切換到檢測模型的時候,模型還要適應圖像解析度的改變。
YOLOv2則將預訓練分成兩步:先用224*224的輸入在ImageNet數據集訓練分類網路,大概160個epoch(將所有訓練數據循環跑160次)後將輸入調整到448*448,再訓練10個epoch(這兩步都是在ImageNet數據集上操作)。然後利用預訓練得到的模型在檢測數據集上fine-tuning。這樣訓練得到的模型,在檢測時用448*448的圖像作為輸入可以順利檢測。
YOLOv1將輸入圖像分成7*7的網格,每個網格預測2個Bounding Box,因此一共有98個Box,同時YOLOv1包含有全連接層,從而能直接預測Bounding Boxes的坐標值,但也導致丟失較多的空間信息,定位不準。
YOLOv2首先將YOLOv1網路的FC層和最後一個Pooling層去掉,使得最後的卷積層可以有更高解析度的特徵,然後縮減網路,用416*416大小的輸入代替原來的448*448,使得網路輸出的特徵圖有奇數大小的寬和高,進而使得每個特徵圖在劃分單元格(Cell)的時候只有一個中心單元格(Center Cell)。
為什麼希望只有一個中心單元格呢?由於圖片中的物體都傾向於出現在圖片的中心位置,特別是比較大的物體,所以有一個單元格單獨位於物體中心的位置用於預測這些物體。
YOLOv2通過引入Anchor Boxes,通過預測Anchor Box的偏移值與置信度,而不是直接預測坐標值。YOLOv2的卷積層採用32這個值來下采樣圖片,所以通過選擇416*416用作輸入尺寸最終能輸出一個13*13的特徵圖。若採用FSRCNN中的方式,每個Cell可預測出9個Anchor Box,共13*13*9=1521個(YOLOv2確定Anchor Boxes的方法見是維度聚類,每個Cell選擇5個Anchor Box)。
在FSRCNN中,以一個51*39大小的特徵圖為例,其可以看做一個尺度為51*39的圖像,對於該圖像的每一個位置,考慮9個可能的候選窗口:3種面積3種比例。這些候選窗口稱為Anchor Boxes。下圖示出的是51*39個Anchor Box中心,以及9種Anchor Box示例。
YOLOv1和YOLOv2特徵圖數據結構:
YOLOv1:S*S* (B*5 + C) => 7*7(2*5+20)
其中B對應Box數量,5對應邊界框的定位信息(w,y,w,h)和邊界框置信度(Confidience)。解析度是7*7,每個Cell預測2個Box,這2個Box共用1套條件類別概率(1*20)。
YOLOv2:S*S*K* (5 + C) => 13*13*9(5+20)
解析度提升至13*13,對小目標適應性更好,借鑒了FSRCNN的思想,每個Cell對應K個Anchor box(YOLOv2中K=5),每個Anchor box對應1組條件類別概率(1*20)。
聚類:聚類是指事先沒有「標簽」而通過某種成團分析找出事物之間存在聚集性原因的過程。即在沒有劃分類別的情況下,根據數據相似度進行樣本分組。
在FSR-CNN中Anchor Box的大小和比例是按經驗設定的,然後網路會在訓練過程中調整Anchor Box的尺寸,最終得到准確的Anchor Boxes。若一開始就選擇了更好的、更有代表性的先驗Anchor Boxes,那麼網路就更容易學到准確的預測位置。
YOLOv2使用K-means聚類方法類訓練Bounding Boxes,可以自動找到更好的寬高維度的值用於一開始的初始化。傳統的K-means聚類方法使用的是歐氏距離函數,意味著較大的Anchor Boxes會比較小的Anchor Boxes產生更多的錯誤,聚類結果可能會偏離。由於聚類目的是確定更精準的初始Anchor Box參數,即提高IOU值,這應與Box大小無關,因此YOLOv2採用IOU值為評判標准,即K-means 採用的距離函數(度量標准) 為:
d(box,centroid) = 1 - IOU(box,centroid)
如下圖,左邊是聚類的簇個數和IOU的關系,兩條曲線分別代表兩個不同的數據集。分析聚類結果並權衡模型復雜度與IOU值後,YOLOv2選擇K=5,即選擇了5種大小的Box 維度來進行定位預測。
其中紫色和灰色也是分別表示兩個不同的數據集,可以看出其基本形狀是類似的。更重要的是,可以看出聚類的結果和手動設置的Anchor Box位置和大小差別顯著——結果中扁長的框較少,而瘦高的框更多(更符合行人的特徵)。
YOLOv2採用的5種Anchor的Avg IOU是61,而採用9種Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是說本文僅選取5種box就能達到Faster RCNN的9中box的效果。選擇值為9的時候,AVG IOU更有顯著提高。說明K-means方法的生成的boxes更具有代表性。
直接對Bounding Boxes求回歸會導致模型不穩定,其中心點可能會出現在圖像任何位置,有可能導致回歸過程震盪,甚至無法收斂,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測Bounding Box的中心坐標(x,y)位置的時候。
YOLOv2的網路在特徵圖(13*13)的每一個單元格中預測出5個Bounding Boxes(對應5個Anchor Boxes),每個Bounding Box預測出5個值(tx,ty,tw,th,t0),其中前4個是坐標偏移值,t0是置信度結果(類似YOLOv1中的邊界框置信度Confidence)。YOLOv2借鑒了如下的預測方式,即當Anchor Box的中心坐標和寬高分別是(xa,ya)和(wa,wh)時,Bounding Box坐標的預測偏移值(tx,ty,tw,th)與其坐標寬高(x,y,w,h)的關系如下:
tx = (x-xa)/wa
ty= (y-ya)/ha
tw = log(w/wa)
th = log(h/ha)
基於這種思想,YOLOv2在預測Bounding Box的位置參數時採用了如下強約束方法:
上圖中,黑色虛線框是Anchor Box,藍色矩形框就是預測的Bounding Box結果,預測出的Bounding Box的坐標和寬高為(bx,by)和(bw,bh),計算方式如圖中所示,其中:對每個Bounding Box預測出5個值(tx,ty,tw,th,t0),Cell與圖像左上角的橫縱坐標距離為(cx,cy),σ定義為sigmoid激活函數(將函數值約束到[0,1]),該Cell對應的Anchor Box對應的寬高為(pw,ph)。
簡而言之,(bx,by)就是(cx,cy)這個Cell附近的Anchor Box針對預測值(tx,ty)得到的Bounding Box的坐標預測結果,同時可以發現這種方式對於較遠距離的Bounding Box預測值(tx,ty)能夠得到很大的限制。
YOLOv2通過添加一個轉移層,把高解析度的淺層特徵連接到低解析度的深層特徵(把特徵堆積在不同Channel中)而後進行融合和檢測。具體操作是先獲取前層的26*26的特徵圖,將其同最後輸出的13*13的特徵圖進行連接,而後輸入檢測器進行檢測(檢測器的FC層起到了全局特徵融合的作用),以此來提高對小目標的檢測能力。
為了適應不同尺度下的檢測任務,YOLOv2在訓練網路時,其在檢測數據集上fine-tuning時候採用的輸入圖像的size是動態變化的。具體來講,每訓練10個Batch,網路就會隨機選擇另一種size的輸入圖像。因為YOLOv2用到了參數是32的下采樣,因此也採用32的倍數作為輸入的size,即採用{320,352,…,608}的輸入尺寸(網路會自動改變尺寸,並繼續訓練的過程)。
這一策略讓網路在不同的輸入尺寸上都能達到較好的預測效果,使同一網路能在不同解析度上進行檢測。輸入圖片較大時,檢測速度較慢,輸入圖片較小時,檢測速度較快,總體上提高了准確率,因此多尺度訓練算是在准確率和速度上達到一個平衡。
上表反映的是在檢測時,不同大小的輸入圖片情況下的YOLOv2和其他目標檢測演算法的對比。可以看出通過多尺度訓練的檢測模型,在測試的時候,輸入圖像在尺寸變化范圍較大的情況下也能取得mAP和FPS的平衡。
YOLOv1採用的訓練網路是GoogleNet,YOLOv2採用了新的分類網路Darknet-19作為基礎網路,它使用了較多的3*3卷積核,並把1*1的卷積核置於3*3的卷積核之間,用來壓縮特徵,同時在每一次池化操作後把通道(Channels)數翻倍(借鑒VGG網路)。
YOLOv1採用的GooleNet包含24個卷積層和2個全連接層,而Darknet-19包含19個卷積層和5個最大池化層(Max Pooling Layers),後面添加Average Pooling層(代替v1中FC層),而Softmax分類器作為激活被用在網路最後一層,用來進行分類和歸一化。
在ImageNet數據集上進行預訓練,主要分兩步(採用隨機梯度下降法):
輸入圖像大小是224*224,初始學習率(Learning Rate)為0.1,訓練160個epoch,權值衰減(Weight Decay)為0.0005,動量(Momentum)為0.9,同時在訓練時採用標準的數據增強(Data Augmentation)方式如隨機裁剪、旋轉以及色度、亮度的調整。
fine-tuning:第1步結束後,改用448*448輸入(高解析度模型),學習率改為0.001,訓練10個epoch,其他參數不變。結果表明:fine-tuning後的top-1准確率為76.5%,top-5准確率為93.3%,若按照原來的訓練方式,Darknet-19的top-1准確率是72.9%,top-5准確率為91.2%。可以看出,兩步分別從網路結構和訓練方式方面入手提高了網路分類准確率。
預訓練之後,開始基於檢測的數據集再進行fine-tuning。
首先,先把最後一個卷積層去掉,然後添加3個3*3的卷積層,每個卷積層有1024個卷積核,並且後面都連接一個1*1的卷積層,卷積核個數(特徵維度)根據需要檢測的類數量決定。(比如對VOC數據,每個Cell需要預測5個Boungding Box,每個Bounding Box有4個坐標值、1個置信度值和20個條件類別概率值,所以每個單元格對應125個數據,此時卷積核個數應該取125。)
然後,將最後一個3*3*512的卷積層和倒數第2個卷積層相連(提取細粒度特徵),最後在檢測數據集上fine-tuning預訓練模型160個epoch,學習率採用0.001,並且在第60和90個epoch的時候將學習率除以10,權值衰減、動量和數據增強方法與預訓練相同。
YOLO9000通過結合分類和檢測數據集,使得訓練得到的模型可以檢測約9000類物體,利用帶標注的分類數據集量比較大的特點,解決了帶標注的檢測數據集量比較少的問題。具體方法是:一方面採用WordTree融合數據集,另一方面聯合訓練分類數據集和檢測數據集。
分類數據集和檢測數據集存在較大差別:檢測數據集只有粗粒度的標記信息,如「貓」、「狗」,而分類數據集的標簽信息則更細粒度,更豐富。比如「狗」就包括「哈士奇」、「金毛狗」等等。所以如果想同時在檢測數據集與分類數據集上進行訓練,那麼就要用一種一致性的方法融合這些標簽信息。
用於分類的方法,常用Softmax(比如v2),Softmax意味著分類的類別之間要互相獨立的,而ImageNet和COCO這兩種數據集之間的分類信息不相互獨立(ImageNet對應分類有9000種,而COCO僅提供80種目標檢測),所以使用一種多標簽模型來混合數據集,即假定一張圖片可以有多個標簽,並且不要求標簽之間獨立,而後進行Softmax分類。
由於ImageNet的類別是從WordNet選取的,作者採用以下策略重建了一個樹形結構(稱為WordTree):
遍歷ImageNet的標簽,然後在WordNet中尋找該標簽到根節點(所有的根節點為實體對象)的路徑;
如果路徑只有一條,將該路徑直接加入到WordTree結構中;
否則,從可選路徑中選擇一條最短路徑,加入到WordTree結構中。
WordTree的作用就在於將兩種數據集按照層級進行結合。
如此,在WordTree的某個節點上就可以計算該節點的一些條件概率值,比如在terrier這個節點,可以得到如下條件概率值:
進而,如果要預測此節點的概率(即圖片中目標是Norfolk terrier的概率),可以根據WordTree將該節點到根節點的條件概率依次相乘得到,如下式:
其中:
YOLO9000在WordTree1k(用有1000類別的ImageNet1k創建)上訓練了Darknet-19模型。為了創建WordTree1k作者添加了很多中間節點(中間詞彙),把標簽由1000擴展到1369。
訓練過程中GroundTruth標簽要順著向根節點的路徑傳播:為了計算條件概率,模型預測了一個包含1369個元素的向量,而且基於所有「同義詞集」計算Softmax,其中「同義詞集」是同一概念下的所屬詞。
現在一張圖片是多標記的,標記之間不需要相互獨立。在訓練過程中,如果有一個圖片的標簽是「Norfolk terrier」,那麼這個圖片還會獲得「狗」以及「哺乳動物」等標簽。
如上圖所示,之前的ImageNet分類是使用一個大Softmax進行分類,而現在WordTree只需要對同一概念下的同義詞進行Softmax分類。然後作者分別兩個數據集上用相同訓練方法訓練Darknet-19模型,最後在ImageNet數據集上的top-1准確率為72.9%,top-5准確率為91.2%;在WordTree數據集上的top-1准確率為71.9%,top-5准確率為90.4%。
這種方法的好處是有「退而求其次」的餘地:在對未知或者新的物體進行分類時,性能損失更低,比如看到一個狗的照片,但不知道是哪種種類的狗,那麼就預測其為「狗」。
以上是構造WordTree的原理,下圖是融合COCO數據集和ImageNet數據集以及生成它們的WordTree的示意圖(用顏色區分了COCO數據集和ImageNet數據集的標簽節點), 混合後的數據集對應的WordTree有9418個類。另一方面,由於ImageNet數據集太大,YOLO9000為了平衡兩個數據集之間的數據量,通過過采樣(Oversampling)COCO數據集中的數據,使COCO數據集與ImageNet數據集之間的數據量比例達到1:4。
對YOLO9000進行評估,發現其mAP比DPM高,而且YOLO有更多先進的特徵,YOLO9000是用部分監督的方式在不同訓練集上進行訓練,同時還能檢測9000個物體類別,並保證實時運行。雖然YOLO9000對動物的識別性能很好,但是對衣服或者裝備的識別性能不是很好(這跟數據集的數據組成有關)。
YOLO9000的網路結構和YOLOv2類似,區別是每個單元格只採用3個Anchor Boxes。
YOLO9000提出了一種在分類數據集和檢測數據集上聯合訓練的機制,即使用檢測數據集(COCO)的圖片去學習檢測相關的信息即查找對象(例如預測邊界框坐標、邊界框是否包含目標及目標屬於各個類別的概率),使用僅有類別標簽的分類數據集(ImageNet)中的圖片去擴展檢測到的對象的可識別種類。
具體方法是:當網路遇到一個來自檢測數據集的圖片與標記信息,就把這些數據用完整的損失函數(v2和9000均沿用了v1網路的損失函數)反向傳播,而當網路遇到一個來自分類數據集的圖片和分類標記信息,只用代表分類誤差部分的損失函數反向傳播這個圖片。
YOLO v2 在大尺寸圖片上能夠實現高精度,在小尺寸圖片上運行更快,可以說在速度和精度上達到了平衡,具體性能表現如下所示。
coco數據集
voc2012數據集
F. yolo演算法是什麼
YOLO 是一種使用神經網路提供實時對象檢測的演算法。該演算法因其速度和准確性而廣受歡迎。它已在各種應用中用於檢測交通信號、人員、停車計時器和動物。
YOLO 是「You Only Look Once」一詞的縮寫。這是一種演算法,可以(實時)檢測和識別圖片中的各種對象。YOLO 中的對象檢測是作為回歸問題完成的,並提供檢測到的圖像的類別概率。
YOLO 演算法採用卷積神經網路 (CNN) 實時檢測物體。顧名思義,該演算法只需要通過神經網路進行一次前向傳播來檢測物體。
這意味著整個圖像中的預測是在單個演算法運行中完成的。CNN 用於同時預測各種類別概率和邊界框。
YOLO 演算法由各種變體組成。
優點
1、速度:該演算法提高了檢測速度,因為它可以實時預測物體。
2、高精度:YOLO 是一種預測技術,可提供准確的結果且背景誤差最小。
3、學習能力:該演算法具有出色的學習能力,使其能夠學習對象的表示並將其應用於對象檢測。
G. YOLO(一) 演算法的原理及演變
第一次接觸到yolo這個演算法是通過吳恩達的教學視頻了解到的,當時其實也算是第一次接觸到目標檢測演算法。這里我們主要介紹下YOLO(You Only Look Once)。現在已經進化到了V3版本了。它不同於Faster RCNN這個分支走的兩部策略先進行前景識別在進行目標檢測,它是直接一步到位進行目標檢測。因此在識別的速度物掘上優於Faster RCNN(5 FPS), 而 YOLO_v1基礎版在Titan X GPU上可以達到45幀/s; 快速版可以達到150幀/s。但是在准確率上YOLO是稍差與Faster RCNN這個在之後會詳細介紹。順便提下如果想了解Faster RCNN原理可以參考 Faster-RCNN的原理及演變 。
我們知道YOLO其實就是 You Only Look Once, 意思是只需要看一眼就知道位置及對象,個人覺得蠻形象的。他不需要Faster RCNN的RPN結構,他其實選取anchor是預訂了候選框,將圖片劃分為7x7的網格,每個網格允許有2個不同的bounding box. 這樣一開始我們就有7x7x2個候選框(bounding box), 大致粗略覆蓋了圖像的整個區域。他的思想就是Faster RCNN在第一階段就算有了回歸框,在第二階段還是需要進行精調,那還不如就先生成大致回歸框就ok了。
下面我們就來好好介紹一下這個模型。
一、模型結構
其實將這個模型簡單話為:
那30又是如何形成的通道大小的呢?
a. 2個bounding box的位置(8個通道)
每個bounding box需要4個數值來表示其位置,(Center_x,Center_y,width,height),即(bounding box的中心點的x坐標,y坐標,bounding box的寬度,高度),2個bounding box共需要彎螞亮8個數值來表示其位置。
b. 2個bounding box 置信度(2個通道)
c. 20分類概率(20個通道)
下面我們來說一下剩下20維度的分類通道。每一個通道代表一個類別的分類概率。因為YOLO支持識別20種不同的對象(人、鳥、貓、汽車、椅子等),所以這里有20個值表示該網格位置存在任一種對象的概率。 但是我們一組圖片只能預測49個對象,可以理解為一個grid2個achor只能有一個預測準的對象(即計算IOU比例最大的那個anchor),所以7x7個對象 。
圖中將自行車的位置放在bounding box1,但實際上是在訓練過程中等網路輸出以後,比較兩個bounding box與自行車實際位置的IOU,自行車的位置(實際bounding box)放置在IOU比較大的那個bounding box(圖中假設是bounding box1),且該bounding box的置信度設為1
二、 損失函數
總的來說,就是用網路輸出與樣本標簽的各項內容的誤差平埋寬方和作為一個樣本的整體誤差。
損失函數中的幾個項是與輸出的30維向量中的內容相對應的。
三、 YOLO v1 缺陷
注意:
細節:
YOLO的最後一層採用線性激活函數,其它層都是Leaky ReLU。訓練中採用了drop out和數據增強(data augmentation)來防止過擬合。更多細節請參考原論文
在67 FPS,YOLOv2在PASCAL VOC 2007上獲得76.8%的mAP。在40 FPS時,YOLOv2獲得78.6%mAP,這比使用ResNet和SSD 更快的R-CNN更好。憑借如此優異的成績,YOLOv2於2017年CVPR發布並獲得超過1000次引用。YOLO有兩個缺點:一個缺點在於定位不準確,另一個缺點在於和基於region proposal的方法相比召回率較低。因此YOLOv2主要是要在這兩方面做提升。另外YOLOv2並不是通過加深或加寬網路達到效果提升,反而是簡化了網路。
下面主要從兩點來介紹下YOLO v2的提升之處。分別是Better以及Faster.
1、Darknet-19
在YOLO v1中,作者採用的訓練網路是基於GooleNet,這里作者將GooleNet和VGG16做了簡單的對比,GooleNet在計算復雜度上要優於VGG16(8.25 billion operation VS 30.69 billion operation),但是前者在ImageNet上的top-5准確率要稍低於後者(88% VS 90%)。而在YOLO v2中,作者採用了新的分類模型作為基礎網路,那就是Darknet-19。Table6是最後的網路結構:Darknet-19隻需要5.58 billion operation。這個網路包含19個卷積層和5個max pooling層,而在YOLO v1中採用的GooleNet,包含24個卷積層和2個全連接層,因此Darknet-19整體上卷積卷積操作比YOLO v1中用的GoogleNet要少,這是計算量減少的關鍵。最後用average pooling層代替全連接層進行預測。這個網路在ImageNet上取得了top-5的91.2%的准確率。
2、Training for Classification
這里的2和3部分在前面有提到,就是訓練處理的小trick。這里的training for classification都是在ImageNet上進行預訓練,主要分兩步:1、從頭開始訓練Darknet-19,數據集是ImageNet,訓練160個epoch,輸入圖像的大小是224 224,初始學習率為0.1。另外在訓練的時候採用了標準的數據增加方式比如隨機裁剪,旋轉以及色度,亮度的調整等。2、再fine-tuning 網路,這時候採用448 448的輸入,參數的除了epoch和learning rate改變外,其他都沒變,這里learning rate改為0.001,並訓練10個epoch。結果表明fine-tuning後的top-1准確率為76.5%,top-5准確率為93.3%,而如果按照原來的訓練方式,Darknet-19的top-1准確率是72.9%,top-5准確率為91.2%。因此可以看出第1,2兩步分別從網路結構和訓練方式兩方面入手提高了主網路的分類准確率。
3、Training for Detection
在前面第2步之後,就開始把網路移植到detection,並開始基於檢測的數據再進行fine-tuning。首先把最後一個卷積層去掉,然後添加3個3 3的卷積層,每個卷積層有1024個filter,而且每個後面都連接一個1 1的卷積層,1 1卷積的filter個數根據需要檢測的類來定。比如對於VOC數據,由於每個grid cell我們需要預測5個box,每個box有5個坐標值和20個類別值,所以每個grid cell有125個filter(與YOLOv1不同,在YOLOv1中每個grid cell有30個filter,還記得那個7 7 30的矩陣嗎,而且在YOLOv1中,類別概率是由grid cell來預測的,也就是說一個grid cell對應的兩個box的類別概率是一樣的,但是在YOLOv2中,類別概率是屬於box的,每個box對應一個類別概率,而不是由grid cell決定,因此這邊每個box對應25個預測值(5個坐標加20個類別值),而在YOLOv1中一個grid cell的兩個box的20個類別值是一樣的)。另外作者還提到將最後一個3 3*512的卷積層和倒數第二個卷積層相連。最後作者在檢測數據集上fine tune這個預訓練模型160個epoch,學習率採用0.001,並且在第60和90epoch的時候將學習率除以10,weight decay採用0.0005。
這里yolo v3相對於yolo v2有三點:1. 利用多尺度特徵進行對象檢測 2. 調整基礎網路結構
H. yolov2演算法詳解
yolov2原文叫 《YOLO9000:Better, Faster, Stronger》
yolov2相對於yolo來說的優勢就是文章題目所說的,更好,更快,更強。下面來看看yolov2如何達到這個目的的。
隨著BN的提出,且在各種網路大量的引入,yolov2引入了BN(batch normalization)。文章還發現BN不僅改善了網路性能,還有一定的正則化的作用,因此文章移除了yolo中使用的dropout操作。
關於BN具體的計算,可以參考 BN及其改團山櫻進演算法
在yolov1的時候採用的是 大小的圖片來進行分類任務, 大小的圖片來進行檢測任務。
文章認為直接切換為高解析度,可能對網路性能有所傷害。yolov2在使用了 大小的圖片訓練的分類網路中,再用 大小的圖片來訓練10輪分類網路,之後用得到的網路來訓練檢測網路。
藉助fasterrcnn的思想,預測坐標的偏移量比直接預測坐標更容易學習,所以yolov2引入anchor的思想。
fasterrcn預測方式如下:
上式中,x,y是預測的框中心, 、 是anchor框的中心點坐標, 、 是anchor框的寬和高, , 是網路唯隱的輸出。
注意:這里與yolo9000原文不同的是,上式中是『-』號,但是按照fasterrcnn的公式推導其實應該為『+』,這樣更好理解
fasterrcnn這種訓練方式對於 和 沒有約束,使得訓練早期坐標不容易穩定。
所以yolov2的預測方式如下:
上式中, 分別為預測參數, 為歸一化的預測框的中心坐標和長寬, 是當前網格距離左上角的距離,該距離也為規劃化後的距離, 表示anchor的長寬, 表示sigmoid函數。上述中的歸一化指的是每個網格的長寬為1。這里可以看出因為加了sigmoid函數,使得預測出的 始終為0-1的,就不容易造成訓練早期的坐標不穩定了。
在yolov1中,因為每個網格負責預測兩個框,對於大小為 大小的featuremap來說塌叢,yolov1隻能預測出 個預測框。但是引入anchor後,對於 的featuremap來說,可以預測出 個預測框(這里假定使用更大的解析度圖像作為輸入,且anchor類型有9累)。所以引入anchor對於模型性能的提升,增大了優化的空間。(雖然引入anchor,使得文章的map下降了,但是召回升高了很多)
yolov2中anchor定義不同於fasterrcnn是人工預設的比例和大小,文中通過k-means來聚類出k類anchor類,文章最終k=5。這里聚類時距離的度量值如下定義:
上式中centroid為聚類中心,box為其它待聚類的框,IOU為iou計算公式。可以看出IOU越大,兩個框越近。
為了對小物體有更好的檢測效果,文章想直接利用更為精細的特徵來檢測小物體,所以在進行最終的下采樣之前,引入了passthrough的方法,該方法利用了下采樣之前的特徵是的對小物體的檢測更為精確。
關於passthrough方法,網友給出的圖非常詳細,如下圖所示:
yolov1中對於檢測任務採用的是 來訓練網路。yolov2為了適應多尺度的物體檢測,網路的訓練時採用多種圖片尺寸,這些尺寸為32的倍數,有 。訓練過程中,每10個batches後隨機選擇這些尺度中的一個輸入網路進行訓練。
文中提出了一個新的網路結構叫做Darknet-19,網路結構如下圖所示。
表中展示的是分1000類的網路結構。
對於檢測任務,網路結構相對上述分類結構有所改動。
文章的這部分主要是用來證明yolov2有較強的特徵提取性能,採用了一些整理標簽的方法,融合了COCO和Imagenet來做一些實驗。
I. yolo演算法是什麼
Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測。
首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。
相關信息:
Yolo採用卷積網路來提取特徵,然後使用全連接層來得到預測值。網路結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如圖8所示。對於卷積層,主要使用1x1卷積來做channle rection,然後緊跟3x3卷積。