收藏 | 目標(biāo)檢測Anchor的What/Where/When/Why/How
點擊下方卡片,關(guān)注“新機器視覺”公眾號
視覺/圖像重磅干貨,第一時間送達
也許你正在學(xué)習(xí)計算機視覺的路上,并且已經(jīng)深入研究了圖像分類和滑動窗口檢測器。
在掌握了這些概念之后,了解最新技術(shù)(SOTA)目標(biāo)檢測,往往會變得令人望而生畏和晦澀難懂,尤其是在理解Anchor時。
毋庸諱言,深入大量流行的YOLO、SSD、R-CNN、Fast RCNN、Faster RCNN、Mask RCNN和RetinaNet,了解Anchor是一項艱巨的工作,尤其是在您對實際代碼了解有限時。
如果我告訴你,你可以利用今天深入學(xué)習(xí)目標(biāo)檢測背后的Anchor呢?本文目標(biāo)是幫助讀者梳理Anchor的以下內(nèi)容:
What:anchor是什么? Where:如何以及在何處對圖像生成anchor以用于目標(biāo)檢測訓(xùn)練? When:何時可以生成anchor? Why:為什么要學(xué)習(xí)偏移而不是實際值? How:如何在訓(xùn)練過程中修正選定的anchor以實現(xiàn)訓(xùn)練對象檢測模型?
1、What:anchor是什么?
anchor是指預(yù)定義的框集合,其寬度和高度與數(shù)據(jù)集中對象的寬度和高度相匹配。預(yù)置的anchor包含在數(shù)據(jù)集中存在的對象大小的組合,這自然包括數(shù)據(jù)中存在的不同長寬比和比例。通常在圖像中的每一個位置預(yù)置4-10個anchor。

訓(xùn)練目標(biāo)檢測網(wǎng)絡(luò)的典型任務(wù)包括:生成anchor,搜索潛在anchor,將生成的anchor與可能的ground truth配對,將其余anchor分配給背景類別,然后進行sampling和訓(xùn)練。
而推理過程就是對anchor的分類和回歸,score大于閾值的anchor進一步做回歸,小于閾值的作為背景舍棄,這樣就得到了目標(biāo)檢測的結(jié)果。
2、Where:如何以及在何處對圖像生成anchor,以用于目標(biāo)檢測訓(xùn)練
本質(zhì)上,生成anchor是為了確定一組合適的框,這些框可以適合數(shù)據(jù)中的大多數(shù)對象,將假設(shè)的、均勻分布的框放置在圖像上,并創(chuàng)建一個規(guī)則,將卷積特征映射的輸出映射到圖像中的每個位置。
為了理解錨定框是如何被生成的,假設(shè)有一個包含小目標(biāo)的256px x* 256px圖像,其中大多數(shù)目標(biāo)尺度位于40px * 40px或80px * x 40px之間。下面從兩個方面考量anchor:
a、aspect ratios(橫縱比):因為假設(shè)的ground turth寬高比在1:1和2:1之間。因此,應(yīng)至少考慮兩個縱橫比(1:1和2:1),用來生成此示例數(shù)據(jù)集的anchor。
b、scales?(尺度):指對象的長度或?qū)挾日计浒瑘D像的總長度或?qū)挾鹊谋壤?/p>
例如,假設(shè)一個圖像的寬度=256px=1個單位,那么一個40px寬的對象占據(jù)40px/256px=0.15625個單位的寬度,即這個對象占據(jù)整個圖像寬度的15.62%。
為了選擇一組最能代表數(shù)據(jù)的尺度,我們可以考慮具有最極端值的對象側(cè)度量,即數(shù)據(jù)集中所有對象的所有寬度和高度之間的最小值和最大值。如果我們的示例數(shù)據(jù)集中最大和最小的比例是0.15625和0.3125,并且我們要為anchor選擇三個比例,那么三個潛在的比例可能是0.15625、0.3125和0.234375(前面兩個尺度的均值)。
如果使用上面提到的兩個縱橫比(1:1和2:1)和這三個比例(0.15625、0.234375和0.3125)來建議此示例數(shù)據(jù)集的錨定框,那么我們將總共有六個錨定框來建議輸入圖像中的任何一個位置。
目標(biāo)檢測器采用這樣的規(guī)則來生成anchor,假設(shè)檢測器網(wǎng)絡(luò)輸入的特征圖是4-channel 8*8,然后可以在每個單元格中心上生成6個不同aspect ratios和scales的anchor,那么總共384個,這樣就盡可能的涵蓋所有可能性。
3、When:什么時候在圖像上生成anchor?
檢測器不預(yù)測anchor,而是為每個anchor預(yù)測一組值:a、anchor坐標(biāo)偏移(offset),b、每個類別的置信度得分。
這意味著在每次圖像推理過程中都將始終使用相同的anchor,并且將使用網(wǎng)絡(luò)預(yù)測的偏移(offset)來更正該anchor。
知道了這一點,就很容易理解ancor需要初始化,并將此數(shù)據(jù)結(jié)構(gòu)存儲在內(nèi)存中,以供實際使用時,如:在訓(xùn)練中與ground ruth匹配,在推斷時將預(yù)測的偏移量應(yīng)用于anchor。在這些點上,anchor的實際生成其實都已經(jīng)生成了。
4、Why:為什么要學(xué)習(xí)偏移而不是實際值?
理論上,如果CNN接收同一類型的物體兩次,那么不管CNN在圖像中的哪個位置接收到物體,CNN都應(yīng)該輸出大致相同的值兩次。
這意味著,如果一幅圖像包含兩輛車,而輸出結(jié)果是絕對坐標(biāo),那么網(wǎng)絡(luò)將預(yù)測兩輛車大致相同的坐標(biāo)。
而學(xué)習(xí)anchor偏移,允許這兩輛車具有相似偏移輸出,但偏移應(yīng)用于錨定,錨定可映射到輸入圖像中的不同位置。這是在anchor回歸過程中學(xué)習(xí)錨定盒偏移的主要原因。
5、How:如何在訓(xùn)練過程中修正選定的anchor以實現(xiàn)訓(xùn)練對象檢測模型?
(1)回歸任務(wù):訓(xùn)練過程中,網(wǎng)絡(luò)回歸任務(wù)學(xué)習(xí)的target并不是feature map上每個位置的所有anchor的offset,而是與ground truth匹配的anchor的實際偏移,背景框的anchor偏移保持為零。
這意味著,一旦anchor內(nèi)的像素空間被完全視為背景,則anchor不需要調(diào)整坐標(biāo)。換言之,由于分配給背景類別的anchor根本不應(yīng)該移動或更正,因此沒有要預(yù)測的偏移量。
(2)分類任務(wù):分類損失通常是使用在總背景框的子集來處理類不平衡。還記得在我們的示例中,每個位置有6個框,總共有384個建議嗎?好吧,大多數(shù)都是背景框,這就造成了一個嚴重的階級不平衡。

解決這類不平衡問題的一個流行的解決方案是所謂的 hard negative mining ——根據(jù)預(yù)先確定的比率(通常為1:3;foreground:background)選擇一些高權(quán)重背景框。在分類損失中處理類不平衡的另一個流行方法是降低易分類實例的權(quán)重損失貢獻,這就是RetinaNet的focal loss情況。
(3)推理過程:為了獲得最終的一組目標(biāo)檢測,網(wǎng)絡(luò)的預(yù)測偏移量被應(yīng)用到相應(yīng)的anchor中,可能會有成百上千個候選框,但最終,測器會忽略所有被預(yù)測為背景的盒子,保留通過某些標(biāo)準的前景檢測結(jié)果,并應(yīng)用NMS糾正同一對象的重疊預(yù)測。
如本文開頭所述,了解SOTA的目標(biāo)檢測算法,通常會變得令人望而生畏和晦澀難懂,但一旦您了解anchor的作用,目標(biāo)檢測就有了全新的理解。
本文翻譯自以下blog,并做了一些修改。
Anchor Boxes in Object Detection: When, Where and How to Propose Them for Deep Learning Apps,
本文僅做學(xué)術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
