2019/04/08算法
yolo系列網絡
在不專注的模型中,每一個檢測器應該可以處理圖像中任何可能位置的各種物體;致使單個檢測器趨向檢測全部邊界框,最終檢測框結果趨向於折中的位置。ide
使用固定網格上的檢測器是one-stage目標檢測算法的主要思想,也是它們與基於候選框的目標檢測方法(如R-CNN)的區別所在(實際上Faster R-CNN中RPN網絡也採用網格檢測)。函數
使用網格來專門限制檢測器僅查看某個特定空間位置。相應地,爲每一個網格單元設置幾個不一樣的檢測器,咱們可使這些物體檢測器中的每個都專一於某種物體形狀。學習
SSD不使用k-means來肯定先驗框。相反,它使用數學公式來計算先驗框尺寸,所以SSD的先驗框與數據集無關(SSD稱它們爲「default boxes」);YOLO經過k-means聚類獲得。this
YOLO模型的一個重要特色是僅當某個物體的中心點落在一個檢測器的網格單元中心時,這個檢測器才負責預測它。這樣避免衝突,即相鄰的單元格不會用來預測同一個物體。這樣,delta_x和delta_y必須限制在0~1之間,表明預測框在網格單元的相對位置,這裏用sigmod函數限制值的範圍。.net
除了採用softmax,還能夠採用sigmoid,這將變成一個多標籤分類器,每一個預測框實際上能夠同時有多個類別,SSD和YOLOv3是這樣。可是SSD沒有預測置信度,它給分類器增長了一個特殊的類:背景。若是分類結果是背景,那麼意味着檢測器沒有找到物體,這實際上等價於YOLO給出一個較低的置信度。(YOLOv3和SSD採用不一樣的方式,它們將這個問題當作多標籤分類問題。因此不採用softmax(它致使各個類別互斥),反而使用sigmoid,這樣容許預測多個標籤。進一步,它們採用標準的二元交叉熵計算loss。)設計
YOLO必須從單個網格進行全部預測,因此它使用的先驗框的範圍從小(大約單個網格單元的大小)到大(大約整個圖像的大小);與YOLO不一樣的是,SSD不使用先驗框來使檢測器專一於物體大小,而是使用不一樣的網格來實現這一點。SSD的先驗框主要用於使檢測器處理物體形狀(長寬比)的變化,而不是它們的大小。code
旋轉也是一種常見的數據擴增技術,但這會比較麻煩,由於咱們還須要同時旋轉邊界框,因此一般不會這樣作。對象
YOLO的解決方案比較粗暴:每次隨機打亂真實框,每一個單元只選擇第一個進入它中心的物體。所以,若是一個新的真實框與一個已經負責另外一個物體的單元相匹配,那麼咱們就只能忽略它了。這意味着在YOLO中,每一個單元至多有一個檢測器被匹配到物體,而其餘檢測器不該該檢測到任何東西(若是檢測到了,就會受到懲罰)。 這只是YOLO的策略,SSD的匹配策略卻不相同。SSD能夠將同一個真實框與多個檢測器匹配:首先選擇具備最佳IOU值的檢測器,而後選擇那些與之IOU超過0.5的可是未被匹配過的檢測器(注意檢測器和先驗框是綁定的,一一對應,因此說IOU指的是檢測器的先驗框與物體的邊界框之間的重疊)。這應該使模型更容易學習,由於它沒必要在哪一個檢測器應該預測這個對象之間進行惟一選擇,畢竟多個檢測器能夠預測這個對象。 注意:二者設計彷佛是矛盾的。YOLO將一個物體只分配給一個檢測器(而該單元的其餘檢測器則是無物體),以幫助檢測器更專一。可是SSD說多個檢測器能夠預測同一個物體。二者實際上均可以。對於SSD,檢測器專一於形狀而不是大小。
YOLO還有一個特別處理之處。若是一個檢測器的預測框與全部真實框的IOU最大值大於一個閾值(好比0.6),那麼忽略這個檢測器的no_object_loss。換句話說,若是一個檢測器被認爲不該該預測一個物體,可是實際上卻預測了一個不錯的結果,那麼最好是忽略它(或者鼓勵它預測物體,也許咱們應該讓這個檢測器與這個物體匹配)。
注意:YOLO採用平方和偏差(sum-squared error,SSE),而不是常見的用於迴歸的均方差(mean-squared error,MSE),或是用於分類的交叉熵。一個可能緣由是每張圖片物體數量並不一樣,若是取平均,那麼包含10個物體的圖片與包含1個物體的圖片的loss的重要性同樣,而採用求和,前者的重要性約是後者的10倍,這可能更公平。
在目標檢測中,分類器會給每一個bounding box(bb)計算出一個class score,就是這個bb屬於每一類的機率,NMS就是根據這些值來進行的,主要流程: 對於每一類,首先把全部score<thresh1的bb的score設爲0 以後,將全部的bb按照得分排序,選中最高分及其對應的bb 遍歷其他的bb,若是和當前最高分bb的重疊面積(IoU)大於必定的閥值,便將該bb刪除 從未處理的bb中繼續選擇一個最高分的bb,重複上述過程 重複上述過程,直到找到所有保留的bb 而後根據全部保留bb的class score和class color畫出最後的預測結果
sort the predictions by confidence score (high to low) for each prediction: true_boxes = get the annotations with same class as the prediction and that are not marked as "difficult" find IOUs between true_boxes and prediction choose ground-truth box with biggest IOU overlap if biggest IOU > threshold (which is 0.5 for Pascal VOC): if we do not already have a detection for this ground-truth box: TP += 1 else: FP += 1 else: FP += 1