iou演算法
『壹』 【目標檢測演算法解讀】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數據集
『貳』 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. 調整基礎網路結構
『叄』 IOU值的計算(目標檢測相關)
該函數計算selectivesearch演算法產生的候選框與樣本的標注框之間的IOU,ver1中,前兩個值為產生的boxes的左下角坐標。verticel2為樣本標注框的左下角和右上角的坐標。
『肆』 IoU-Net 筆記
IoU-Net 論文: Acquisition of Localization Confidence for Accurate Object Detection
曠視聯合北大發的一篇論文,主要指出了目標檢測方法中,非極大值抑制(NMS) 存在的問題。NMS 以分類置信度為基準執行,而分類置信度並不能很好地反映邊框定位的准確程度,這導致一些更准確的定位在 NMS 過程中被抑制。IoU-Net 通過預測一個定位置信度(以 IoU 為預測目標),將定位置信度作為 NMS 的指標,以提升邊框的准確度。此外,提出了一種基於優化的邊框 refine 方法,代替邊框回歸。
非極大值抑制演算法:
0. 對於一張圖像的目標檢測,其結果為 個邊界框,其集合記為 ;選取 NMS 的評估指標 (依照基於 R-CNN 的方法,評估指標為邊界框的分類置信度);預設重合度閾值 (重合度實際上是 IoU,為了防止和與 GT 的 IoU 混淆,此處寫為重合度);NMS結果集合 預設為空集。
1. 對於 中 最大者 而言,將所有與它重合度大於 的邊界框從 中移出,這些邊界框被永久地舍棄。將 從 中移出,放入結果集合 。
2. 重復步驟 1 直到 成為空集。
3. 中的所有邊界框為 NMS 的輸出。
NMS 幾乎是所有目標檢測演算法不可或缺的一步,它能防止冗餘的邊界框堆疊在同一個目標上。
1. 用分類置信度做 NMS 的指標缺乏一致性
一般而言,Two-stage 網路結構中,(1)首先由 RPN(或其它類似方法)提出 RoI 建議,這個過程中對 anchor 做一次邊框回歸,和判斷內部有無目標;(2)然後 RoI 中的內容經過 RoI Pooling(或其它類似方法)後,輸入一個分類網路做分類和邊框回歸;(3)對輸出結果,以 分類置信度 為標准,進行 NMS 剔除冗餘邊界框。作者認為,在這個過程中,缺少一種評估 RoI 的「 定位置信度 」,它應當和分類置信度地位相似,用於當作 NMS 的標准。
NMS 最初被應用於邊界框篩選時,就是用分類置信度作為評估指標的,畢竟這是網路的一個現成輸出。但是,根據作者的實驗,分類置信度最高的邊界框,其 IoU 並不一定是最高的。如下圖所示,存在很多反例。
統計所有邊界框的分類置信度與 IoU 的關系(左下),能夠發現它們並沒有很好的相關性,盡管它們仍在一定程度上顯示出正相關,但在分類置信度低的區域,仍有很多 IoU 較高的邊界框,而在分類置信度較高的區域,也有不少邊界框的 IoU 只有大概 60%~70%。而作者提出的定位置信度,則與 IoU 呈較好的線性關系(右下),定位置信度的高低能夠更好地反映邊界框的真實 IoU 大小。評估這兩個分布的皮爾森相關系數,可知後者相關性更高。
2. 多次迭代的邊框回歸並不能單調提升邊框定位結果
作者還觀察到,有些方法做了多次的邊框回歸。以 Faster R-CNN 為例,這個過程中有兩次邊框回歸,它們的意義很大程度上是重合的,第二次邊框回歸起到了 refine 的作用;另外也有一些方法——比如 Cascade R-CNN,採用了更多次數的邊框回歸。
基於實驗性目的,作者在 FPN 框架下和 Cascade R-CNN 框架下,評估了取不同邊框回歸迭代次數時,最終輸出的邊框的 AP 指標。不論是基於 FPN 還是 Cascade R-CNN,在一定迭代次數後,邊框的准確度都不增反降。數學上,它們的關系是非單調的。
所謂定位置信度,其實就是在網路的 R-CNN 部分,額外引入了一個支路,預測邊界框和 GT 之間的 IoU。
然後是 IoU-guided NMS 演算法,和原始的 NMS 演算法幾乎一樣,只是評估指標改成網路預測的定位置信度。在保留定位置信度最大的邊框的同時,如果該邊框的分類置信度不如與它高度重疊的(但定位置信度較低的)邊界框高,則將該邊框的分類置信度記為更高的那個值。
Refine 邊界框的問題可以被歸納為一個尋找最優變換參數 的問題:
其中 是 RPN 預測到的邊界框, 是 GT 邊界框; 是以 為參數的邊界框變換函數; 是評估兩個邊界框之間的距離的指標,這里採用 IoU。
R-CNN 中提出的邊框回歸方法——稱之為基於回歸的方法——採用一個前饋的神經網路直接預測參數 ,但多次的迭代預測對輸入分布的變換不具有魯棒性,因此會形成前述的不單調的優化曲線。
作者提出的方法——稱之為基於優化的方法——將 IoU 預測支路作為優化的目標函數,並提出了 Precise RoI Pooling 方法(後面講)替代原來的 RoI Pooling 層,優化 RoI Pooling 層的可導性。因為 IoU 預測支路內部是可導的,所以可以簡單地通過梯度上升演算法尋找最優的 。
訓練 R-CNN 時的采樣策略和 Faster R-CNN 原文中略有不同。當選擇 RoI 時,不再選擇由 RPN 生成的 RoI Proposal,而是對 GT 應用幾個隨機的變換,捨去和原始 GT 重合度不足50%者,將剩下的作為 RoI。盡管並沒有說明原因,但作者表示,從實驗結果來看,這種采樣方法優於將 RoI Proposal 用作訓練 R-CNN 時的 RoI。個人感覺,訓練剛開始 RPN 並沒有學到 GT 的分布,輸出的 RoI Proposal 和 GT 偏差很大,這使得基於 RoI Proposal 的 R-CNN 訓練在這個階段幾乎是沒有意義的,而作者的做法在一定程度上避免了這個問題。
『伍』 經典目標檢測演算法介紹
姓名:牛曉銀;學號:20181213993;學院:計算機科學與技術
轉自:https://zhuanlan.hu.com/p/34142321
【嵌牛導讀】:目標檢測,也叫目標提取,是一種基於目標幾何和統計特徵的圖像分割。隨著計算機技術的發展和計算機視覺原理的廣泛應用,利用計算機圖像處理技術對目標進行實時跟蹤研究越來越熱門,對目標進行動態實時跟蹤定位在智能化交通系統、軍事目標檢測及醫學導航手術中手術器械定位等方面具有廣泛的應用價值。
【嵌牛鼻子】:目標檢測、檢測模型、計算機視覺
【嵌牛提問】:你知道或者用過哪些目標檢測演算法?
【嵌牛正文】:
(一)目標檢測經典工作回顧
本文結構
兩階段模型因其對圖片的兩階段處理得名,也稱為基於區域(Region-based)的方法,我們選取R-CNN系列工作作為這一類型的代表。
R-CNN: R-CNN系列的開山之作
論文鏈接: Rich feature hierarchies for accurate object detection and semantic segmentation
本文的兩大貢獻:1)CNN可用於基於區域的定位和分割物體;2)監督訓練樣本數緊缺時,在額外的數據上預訓練的模型經過fine-tuning可以取得很好的效果。第一個貢獻影響了之後幾乎所有2-stage方法,而第二個貢獻中用分類任務(Imagenet)中訓練好的模型作為基網路,在檢測問題上fine-tuning的做法也在之後的工作中一直沿用。
傳統的計算機視覺方法常用精心設計的手工特徵(如SIFT, HOG)描述圖像,而深度學習的方法則倡導習得特徵,從圖像分類任務的經驗來看,CNN網路自動習得的特徵取得的效果已經超出了手工設計的特徵。本篇在局部區域應用卷積網路,以發揮卷積網路學習高質量特徵的能力。
R-CNN將檢測抽象為兩個過程,一是基於圖片提出若干可能包含物體的區域(即圖片的局部裁剪,被稱為Region Proposal),文中使用的是Selective Search演算法;二是在提出的這些區域上運行當時表現最好的分類網路(AlexNet),得到每個區域內物體的類別。
另外,文章中的兩個做法值得注意。
一是數據的准備。輸入CNN前,我們需要根據Ground Truth對提出的Region Proposal進行標記,這里使用的指標是IoU(Intersection over Union,交並比)。IoU計算了兩個區域之交的面積跟它們之並的比,描述了兩個區域的重合程度。
文章中特別提到,IoU閾值的選擇對結果影響顯著,這里要談兩個threshold,一個用來識別正樣本(如跟ground truth的IoU大於0.5),另一個用來標記負樣本(即背景類,如IoU小於0.1),而介於兩者之間的則為難例(Hard Negatives),若標為正類,則包含了過多的背景信息,反之又包含了要檢測物體的特徵,因而這些Proposal便被忽略掉。
另一點是位置坐標的回歸(Bounding-Box Regression),這一過程是Region Proposal向Ground Truth調整,實現時加入了log/exp變換來使損失保持在合理的量級上,可以看做一種標准化(Normalization)操作。
小結
R-CNN的想法直接明了,即將檢測任務轉化為區域上的分類任務,是深度學習方法在檢測任務上的試水。模型本身存在的問題也很多,如需要訓練三個不同的模型(proposal, classification, regression)、重復計算過多導致的性能問題等。盡管如此,這篇論文的很多做法仍然廣泛地影響著檢測任務上的深度模型革命,後續的很多工作也都是針對改進這一工作而展開,此篇可以稱得上"The First Paper"。
Fast R-CNN: 共享卷積運算
論文鏈接: Fast R-CNN
文章指出R-CNN耗時的原因是CNN是在每一個Proposal上單獨進行的,沒有共享計算,便提出將基礎網路在圖片整體上運行完畢後,再傳入R-CNN子網路,共享了大部分計算,故有Fast之名。
上圖是Fast R-CNN的架構。圖片經過feature extractor得到feature map, 同時在原圖上運行Selective Search演算法並將RoI(Region of Interset,實為坐標組,可與Region Proposal混用)映射到到feature map上,再對每個RoI進行RoI Pooling操作便得到等長的feature vector,將這些得到的feature vector進行正負樣本的整理(保持一定的正負樣本比例),分batch傳入並行的R-CNN子網路,同時進行分類和回歸,並將兩者的損失統一起來。
RoI Pooling 是對輸入R-CNN子網路的數據進行准備的關鍵操作。我們得到的區域常常有不同的大小,在映射到feature map上之後,會得到不同大小的特徵張量。RoI Pooling先將RoI等分成目標個數的網格,再在每個網格上進行max pooling,就得到等長的RoI feature vector。
文章最後的討論也有一定的借鑒意義:
multi-loss traing相比單獨訓練classification確有提升
multi-scale相比single-scale精度略有提升,但帶來的時間開銷更大。一定程度上說明CNN結構可以內在地學習尺度不變性
在更多的數據(VOC)上訓練後,精度是有進一步提升的
Softmax分類器比"one vs rest"型的SVM表現略好,引入了類間的競爭
更多的Proposal並不一定帶來精度的提升
小結
Fast R-CNN的這一結構正是檢測任務主流2-stage方法所採用的元結構的雛形。文章將Proposal, Feature Extractor, Object Classification&Localization統一在一個整體的結構中,並通過共享卷積計算提高特徵利用效率,是最有貢獻的地方。
Faster R-CNN: 兩階段模型的深度化
論文鏈接: Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks
Faster R-CNN是2-stage方法的奠基性工作,提出的RPN網路取代Selective Search演算法使得檢測任務可以由神經網路端到端地完成。粗略的講,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷積計算的特性使得RPN引入的計算量很小,使得Faster R-CNN可以在單個GPU上以5fps的速度運行,而在精度方面達到SOTA(State of the Art,當前最佳)。
本文的主要貢獻是提出Regional Proposal Networks,替代之前的SS演算法。RPN網路將Proposal這一任務建模為二分類(是否為物體)的問題。
第一步是在一個滑動窗口上生成不同大小和長寬比例的anchor box(如上圖右邊部分),取定IoU的閾值,按Ground Truth標定這些anchor box的正負。於是,傳入RPN網路的樣本數據被整理為anchor box(坐標)和每個anchor box是否有物體(二分類標簽)。RPN網路將每個樣本映射為一個概率值和四個坐標值,概率值反應這個anchor box有物體的概率,四個坐標值用於回歸定義物體的位置。最後將二分類和坐標回歸的損失統一起來,作為RPN網路的目標訓練。
由RPN得到Region Proposal在根據概率值篩選後經過類似的標記過程,被傳入R-CNN子網路,進行多分類和坐標回歸,同樣用多任務損失將二者的損失聯合。
小結
Faster R-CNN的成功之處在於用RPN網路完成了檢測任務的"深度化"。使用滑動窗口生成anchor box的思想也在後來的工作中越來越多地被採用(YOLO v2等)。這項工作奠定了"RPN+RCNN"的兩階段方法元結構,影響了大部分後續工作。
單階段(1-stage)檢測模型
單階段模型沒有中間的區域檢出過程,直接從圖片獲得預測結果,也被成為Region-free方法。
YOLO
論文鏈接: You Only Look Once: Unified, Real-Time Object Detection
YOLO是單階段方法的開山之作。它將檢測任務表述成一個統一的、端到端的回歸問題,並且以只處理一次圖片同時得到位置和分類而得名。
YOLO的主要優點:
快。
全局處理使得背景錯誤相對少,相比基於局部(區域)的方法, 如Fast RCNN。
泛化性能好,在藝術作品上做檢測時,YOLO表現比Fast R-CNN好。
YOLO的工作流程如下:
1.准備數據:將圖片縮放,劃分為等分的網格,每個網格按跟Ground Truth的IoU分配到所要預測的樣本。
2.卷積網路:由GoogLeNet更改而來,每個網格對每個類別預測一個條件概率值,並在網格基礎上生成B個box,每個box預測五個回歸值,四個表徵位置,第五個表徵這個box含有物體(注意不是某一類物體)的概率和位置的准確程度(由IoU表示)。測試時,分數如下計算:
等式左邊第一項由網格預測,後兩項由每個box預測,以條件概率的方式得到每個box含有不同類別物體的分數。 因而,卷積網路共輸出的預測值個數為S×S×(B×5+C),其中S為網格數,B為每個網格生成box個數,C為類別數。
3.後處理:使用NMS(Non-Maximum Suppression,非極大抑制)過濾得到最後的預測框
損失函數的設計
損失函數被分為三部分:坐標誤差、物體誤差、類別誤差。為了平衡類別不均衡和大小物體等帶來的影響,損失函數中添加了權重並將長寬取根號。
小結
YOLO提出了單階段的新思路,相比兩階段方法,其速度優勢明顯,實時的特性令人印象深刻。但YOLO本身也存在一些問題,如劃分網格較為粗糙,每個網格生成的box個數等限制了對小尺度物體和相近物體的檢測。
SSD: Single Shot Multibox Detector
論文鏈接: SSD: Single Shot Multibox Detector
SSD相比YOLO有以下突出的特點:
多尺度的feature map:基於VGG的不同卷積段,輸出feature map到回歸器中。這一點試圖提升小物體的檢測精度。
更多的anchor box,每個網格點生成不同大小和長寬比例的box,並將類別預測概率基於box預測(YOLO是在網格上),得到的輸出值個數為(C+4)×k×m×n,其中C為類別數,k為box個數,m×n為feature map的大小。
小結
SSD是單階段模型早期的集大成者,達到跟接近兩階段模型精度的同時,擁有比兩階段模型快一個數量級的速度。後續的單階段模型工作大多基於SSD改進展開。
檢測模型基本特點
最後,我們對檢測模型的基本特徵做一個簡單的歸納。
檢測模型整體上由基礎網路(Backbone Network)和檢測頭部(Detection Head)構成。前者作為特徵提取器,給出圖像不同大小、不同抽象層次的表示;後者則依據這些表示和監督信息學習類別和位置關聯。檢測頭部負責的類別預測和位置回歸兩個任務常常是並行進行的,構成多任務的損失進行聯合訓練。
相比單階段,兩階段檢測模型通常含有一個串列的頭部結構,即完成前背景分類和回歸後,把中間結果作為RCNN頭部的輸入再進行一次多分類和位置回歸。這種設計帶來了一些優點:
對檢測任務的解構,先進行前背景的分類,再進行物體的分類,這種解構使得監督信息在不同階段對網路參數的學習進行指導
RPN網路為RCNN網路提供良好的先驗,並有機會整理樣本的比例,減輕RCNN網路的學習負擔
這種設計的缺點也很明顯:中間結果常常帶來空間開銷,而串列的方式也使得推斷速度無法跟單階段相比;級聯的位置回歸則會導致RCNN部分的重復計算(如兩個RoI有重疊)。
另一方面,單階段模型只有一次類別預測和位置回歸,卷積運算的共享程度更高,擁有更快的速度和更小的內存佔用。讀者將會在接下來的文章中看到,兩種類型的模型也在互相吸收彼此的優點,這也使得兩者的界限更為模糊。
『陸』 目標檢測:IOU計算
在目標檢測中,經常需要計算預測回歸框和真實回歸框的交並比(Intersection Over Union,IOU),也稱重疊度,計算公式如下。
由於回歸框只是確定物體的位置,不需要考慮物體的傾斜、旋轉等情況。那麼已知兩個回歸框A,B各自左上頂點右下頂點的坐標,如何計算二者的交集和並集。假定回歸框A的左上頂點和右下頂點的坐標分為 ,回歸框B的左上頂點和右下頂點的坐標分為 。為方便理解,將回歸框用集合語言來描述:
則可得到不等式組:
成立時,集合A、B交集非空,且當不等式組成立時,交集C為:
求得預測回歸框和真實回歸框的交集和並集之後,可以很容易計算出IOU的值:
關於交並比計算的更詳細內容,可以參考以下鏈接:
Yolo V1演算法詳解
『柒』 一文幫你搞定Yolov3
我們知道傳統機器學習中如果要預測出一條簡訊是否為垃圾簡訊,我們會把很多條簡訊拿來做訓練樣本,然後每條簡訊的標簽是用0和1來標注他是否為垃圾簡訊。通過將這些訓練樣本及對應的標簽輸入到機器學習模型中,使得模型能夠學習怎樣判別一條簡訊是否為垃圾簡訊,從而當隨便拿一條簡訊輸入到模型中,就能判斷這個簡訊是否為垃圾簡訊了。
Yolov3演算法的訓練方法與傳統機器學習演算法訓練的本質是一樣的。
Yolov3中用來訓練的樣本實際上是一群框,yolov3通過訓練這群樣本框,讓模型能夠學習到如何將這群樣本框挪動位置來框住圖片中真實的物體。從而當隨便拿一張圖片,yolov3都能將這張圖片中的物體給框住,並判斷其類別。
這群樣本框是怎麼定義的,這群框的樣本標簽又該如何定義,我們接下來給大家介紹。
Yolov3的多尺度預測
Yolov3通過對圖片卷積提取特徵後會得到三個尺度的feature map,這三個尺度的feature map分別是13*13,26*26,52*52.然後對每個feature map的每個cell下分配三個anchor box,anchor box的尺寸有(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)這九種。怎麼把這9個anchor box分配給3個feature map.我們可以通過如下分析得到:(10*13),(16*30),(33*23)屬於小尺度的anchor box,主要用於檢測小尺寸的物體,而feature map中52*52的感受野最小,適合檢測小的物體,所以把(10*13),(16*30),(33*23)分配給52*52的feature map,(30x61),(62x45),(59x119)屬於中等尺度的anchor box,主要用於檢測中等尺寸的物體,所以把他分配給26*26(負責檢測中等尺寸物體的feature map),(116x90),(156x198),(373x326)屬於較大尺度的anchor box,主要用於檢測較大尺寸的物體,所以把他分配給13*13(負責檢測較大尺寸物體的feature map)的feature map.將上述anchor box分配好後,我們可以利用公式計算出anchor box在原圖中的位置。這群在三個feature map的每一個cell下的anchor box,實際上就是我們模型的訓練樣本。如果將這群anchor box都還原回原圖,每張圖片上差不多有1萬多個anchor box.我們都知道訓練樣本是要有樣本標簽的,那麼yolov3是如何給訓練樣本(這群anchor box)打上標簽呢?
如何給樣本打標簽
但是每張圖片上就有1萬多個anchor box,而且一張圖片上可能有多個gt box.gt box就是我們對圖片中標記的樣本框。如果每一個anchor box都要打上gt box的標簽,就會有兩個問題,其一:anchor box與gt box之間如何對應?其二:每一張圖片有一萬多anchor box要訓練,yolov3演算法效率豈不太低。
為此yolov3採用了中心負責制,即gt box中心落在哪個cell,就由該cell上面的某個anchor box用來負責預測該gt box中的物體。
注意:不是每個cell下面都有3個anchor box嗎,為什麼只由某個anchor box負責預測該gt box呢?其實,這也很好解釋,如果對一堆anchor box做位置移動,使其接近gtbox。那麼肯定是與gt box重合度高的anchor box在做適當的坐標修正後比較接近該gt box.因此,每個gt box都要與anchor box計算交並比,找到與其交並比最大的anchor box來負責預測該gt box.
那具體來說一下操作流程:
首先生成13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)這樣維度大小的三個零矩陣。
對訓練樣本圖片做循環,在每次循環中再對gtbox做循環,在每次gtbox循環中再對9個anchor box做循環。舉個例子,有10張圖片,每張圖片上有3個gtbox(這個gtbox就是我們對樣本圖片上的物體進行標注的框),用9個anchor box與gt box計算iou,找到最大的iou對應的anchor box.例如,第四個anchor box與gt box的iou最大,而我們已經知道第四個anchor box分配給了26*26的feature map.所以當前這個gt box中的物體由26*26這個feature map中某個cell中的anchor box負責預測。
怎麼找到這個cell呢?
將gt box所在的原圖image劃分成26*26的網格,看gt box的中心落在哪個cell上,feature map上對應的那個cell就負責預測這個gtbox中的物體。假設中心落在第四行第三列上。
那麼圖片中該gtbox中的物體由26*26的feature map中的(4,3)的這個cell裡面的第一個anchor box來預測。因此我們只用將該gtbox的坐標,類別,置信度填入該anchor box 對應的位置就好了,因為這是我們的anchor box要達到的目標。注意:我們填入的並不是gt box的坐標,而是gt box與anchorbox的坐標之間通過編碼公式換算出來的一種值。而第二個anchor box與第三個anchor box不負責預測物體,所以全部填0.
Yolov3的預測值
Yolov3中的預測值在3個feature map與3*3的filter卷積得到的結果中取得。以26*26的feature map為例,26*26*256的feature map和3*3*256*(3*85)做卷積運算,輸出26*26*(3*85)的預測值.這個85中80是預測的anchor box中屬於每一類別的概率,4是gtbox與anchor box之間的偏移量,1是置信度,是這個anchor box中有無物體的概率和anchor box與其對應的gt box之間iou的乘積。
損失計算
上面將yolov3的樣本標簽,及每個樣本的預測值做了解釋,接下來就是如何計算損失了。Yolov3的損失函數包括三部分,坐標損失,置信度損失和分類損失。把樣本分為了正負樣本。
通常我們把不需要負責預測物體的anchorbox稱作負樣本。負樣本不需要計算坐標損失和分類損失,只需要計算置信度損失,而負樣本的置信度的目標值是0,就是說我這個框的置信度目標的預測值接近0,就是讓演算法去學習讓這個框不包含物體。
而把需要負責預測物體的anchorbox稱作正樣本,正樣本需要計算坐標損失,置信度損失和分類損失。
正負樣本的區分
在yolov3中我們把anchor box樣本分為正樣本,負樣本和忽略樣本。anchor box樣本標簽中置信度為1的anchor box,稱為正樣本,置信度為0的anchor box,稱為負樣本。忽略樣本則是從負樣本中抽取出來的,如何理解呢?
由於yolov3使用了多尺度預測,不同尺度的特徵圖之間可能會出現重復檢測的部分。例如有一個物體狗的gt box在訓練時與13*13的feature map中的某個anchor box對應。此時在訓練模型的預測值中,恰好26*26的feature map中的某個anchor box與該gtbox的iou達到0.93。而模型中我們讓這個anchor box的置信度標簽為0,網路學習結果肯定會不理想。所以我們的處理辦法是,將這種與gtbox之間 iou較大(大過設定的閾值,如0.5),但又不負責預測物體的anchor box稱之為忽略樣本,不納入損失計算。
在負樣本中挖掘出忽略樣本的步驟如下:
讓所有的預測的縮放比(tx,ty,tw,th)與對應的anchorbox 進行解碼,得到對應的預測框,我們稱為bbox.
讓這些bbox與當前預測的圖片上的所有gtbox (假設有v個)計算交並比,就可以讓每個bbox有對應的v個分數。對每個預測框取v個分數中的最大值,即可以得到best_score,這個best_score就是與這個anchor box交並比最大的那個gt box,他們之間的交並比。
將anchor box置信度標簽為0,但best_score>閾值的部分設置為忽略樣本,不參與損失計算。
而anchor box置信度標簽為0,但best_score<閾值的部分才是參與損失計算的負樣本。
2.Yolov3的預測流程
預測流程:
模型輸出三種尺度的預測結果,分別為13*13*3*(80+5),26*26*3*(80+5),52*52*3(80+5)。此處以batch*13*13*(3*85)為例進行說明。
將輸出的batch*13*13*(3*85),用輸出的置信度和類別概率相乘,得到篩選各個bbox框的score值。
對篩選的物體檢測框,進行非極大值抑制演算法來刪掉對同一類物體重合度較高的框,然後選出最後的最優框。
非極大值抑制的計算步驟:
1:設置閾值
2:對每類對象
2.1:選取該類中概率最大的框,然後用這個框與該類中的其他框計算iou,iou大於閾值則剔除,把這個最大的框放入輸出列表中,這個最大的框也剔除出去
2.2:在餘下的該類框中再選出概率最大的框,重復2.1的操作
2.3:返回步驟2,繼續下一類對象
『捌』 計算IOU為什麼坐標相減後加一
計算IOU坐標相減後加一得原因是演算法本身的設定。
IoU是一種測量在特定數據集中檢測相應物體准確度的一個標准。IoU是一個簡單的測量標准,只要是在輸出中得出一個預測范圍的任務都可以用IoU來進行測量。IoU分數是對象類別分割問題的標准性能度量。IoU得分是基於計數的度量,而所提出的FCN的輸出是表示像素是對象的一部分的可能性的概率值。