目標檢測Anchor的What/Where/When/Why/How

編譯|yanwan,https://zhuanlan.zhihu.com/p/150332784

源|https://www.wovenware.com/blog/2020/06/anchor-boxes-in-object-detection-when-where-and-how-to-propose-them-for-deep-learning-apps/%23.XvFzo0YzY2w

本文僅作學術分享,如有侵權,請聯繫後臺作刪文處理。

也許你正在學習計算機視覺的路上,並且已經深入研究了圖像分類和滑動窗口檢測器。

在掌握了這些概念之後,瞭解最新技術(SOTA)目標檢測,往往會變得令人望而生畏和晦澀難懂,尤其是在理解Anchor時。

毋庸諱言,深入大量流行的YOLO、SSD、R-CNN、Fast RCNN、Faster RCNN、Mask RCNN和RetinaNet,瞭解Anchor是一項艱鉅的工作,尤其是在您對實際代碼瞭解有限時。

如果我告訴你,你可以利用今天深入學習目標檢測背後的Anchor呢?本文目標是幫助讀者梳理Anchor的以下內容:

  • What:anchor是什麼?

  • Where:如何以及在何處對圖像生成anchor以用於目標檢測訓練?

  • When:何時可以生成anchor?

  • Why:爲什麼要學習偏移而不是實際值?

  • How:如何在訓練過程中修正選定的anchor以實現訓練對象檢測模型?

1、What:anchor是什麼?

anchor是指預定義的框集合,其寬度和高度與數據集中對象的寬度和高度相匹配。預置的anchor包含在數據集中存在的對象大小的組合,這自然包括數據中存在的不同長寬比和比例。通常在圖像中的每一個位置預置4-10個anchor。

訓練目標檢測網絡的典型任務包括:生成anchor,搜索潛在anchor,將生成的anchor與可能的ground truth配對,將其餘anchor分配給背景類別,然後進行sampling和訓練。

而推理過程就是對anchor的分類和迴歸,score大於閾值的anchor進一步做迴歸,小於閾值的作爲背景捨棄,這樣就得到了目標檢測的結果。

2、Where:如何以及在何處對圖像生成anchor,以用於目標檢測訓練

本質上,生成anchor是爲了確定一組合適的框,這些框可以適合數據中的大多數對象,將假設的、均勻分佈的框放置在圖像上,並創建一個規則,將卷積特徵映射的輸出映射到圖像中的每個位置。

爲了理解錨定框是如何被生成的,假設有一個包含小目標的256px x* 256px圖像,其中大多數目標尺度位於40px * 40px或80px * x 40px之間。下面從兩個方面考量anchor:

a、aspect ratios(橫縱比):因爲假設的ground turth寬高比在1:1和2:1之間。因此,應至少考慮兩個縱橫比(1:1和2:1),用來生成此示例數據集的anchor。

b、scales (尺度):指對象的長度或寬度佔其包含圖像的總長度或寬度的比例。

例如,假設一個圖像的寬度=256px=1個單位,那麼一個40px寬的對象佔據40px/256px=0.15625個單位的寬度,即這個對象佔據整個圖像寬度的15.62%。

爲了選擇一組最能代表數據的尺度,我們可以考慮具有最極端值的對象側度量,即數據集中所有對象的所有寬度和高度之間的最小值和最大值。如果我們的示例數據集中最大和最小的比例是0.15625和0.3125,並且我們要爲anchor選擇三個比例,那麼三個潛在的比例可能是0.15625、0.3125和0.234375(前面兩個尺度的均值)。

如果使用上面提到的兩個縱橫比(1:1和2:1)和這三個比例(0.15625、0.234375和0.3125)來建議此示例數據集的錨定框,那麼我們將總共有六個錨定框來建議輸入圖像中的任何一個位置。

目標檢測器採用這樣的規則來生成anchor,假設檢測器網絡輸入的特徵圖是4-channel 8*8,然後可以在每個單元格中心上生成6個不同aspect ratios和scales的anchor,那麼總共384個,這樣就儘可能的涵蓋所有可能性。

3、When:什麼時候在圖像上生成anchor?

檢測器不預測anchor,而是爲每個anchor預測一組值:a、anchor座標偏移(offset),b、每個類別的置信度得分。

這意味着在每次圖像推理過程中都將始終使用相同的anchor,並且將使用網絡預測的偏移(offset)來更正該anchor。

知道了這一點,就很容易理解ancor需要初始化,並將此數據結構存儲在內存中,以供實際使用時,如:在訓練中與ground ruth匹配,在推斷時將預測的偏移量應用於anchor。在這些點上,anchor的實際生成其實都已經生成了。

4、Why:爲什麼要學習偏移而不是實際值?

理論上,如果CNN接收同一類型的物體兩次,那麼不管CNN在圖像中的哪個位置接收到物體,CNN都應該輸出大致相同的值兩次。

這意味着,如果一幅圖像包含兩輛車,而輸出結果是絕對座標,那麼網絡將預測兩輛車大致相同的座標。

而學習anchor偏移,允許這兩輛車具有相似偏移輸出,但偏移應用於錨定,錨定可映射到輸入圖像中的不同位置。這是在anchor迴歸過程中學習錨定盒偏移的主要原因。

5、How:如何在訓練過程中修正選定的anchor以實現訓練對象檢測模型?

(1)迴歸任務:訓練過程中,網絡迴歸任務學習的target並不是feature map上每個位置的所有anchor的offset,而是與ground truth匹配的anchor的實際偏移,背景框的anchor偏移保持爲零。

這意味着,一旦anchor內的像素空間被完全視爲背景,則anchor不需要調整座標。換言之,由於分配給背景類別的anchor根本不應該移動或更正,因此沒有要預測的偏移量。

(2)分類任務:分類損失通常是使用在總背景框的子集來處理類不平衡。還記得在我們的示例中,每個位置有6個框,總共有384個建議嗎?好吧,大多數都是背景框,這就造成了一個嚴重的階級不平衡。

解決這類不平衡問題的一個流行的解決方案是所謂的 hard negative mining ——根據預先確定的比率(通常爲1:3;foreground:background)選擇一些高權重背景框。在分類損失中處理類不平衡的另一個流行方法是降低易分類實例的權重損失貢獻,這就是RetinaNet的focal loss情況。

(3)推理過程:爲了獲得最終的一組目標檢測,網絡的預測偏移量被應用到相應的anchor中,可能會有成百上千個候選框,但最終,測器會忽略所有被預測爲背景的盒子,保留通過某些標準的前景檢測結果,並應用NMS糾正同一對象的重疊預測。

如本文開頭所述,瞭解SOTA的目標檢測算法,通常會變得令人望而生畏和晦澀難懂,但一旦您瞭解anchor的作用,目標檢測就有了全新的理解。

本文翻譯自以下blog,並做了一些修改。

Anchor Boxes in Object Detection: When, Where and How to Propose Them for Deep Learning Apps,

覺得有用麻煩給個在看啦~  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章