感謝伯禹學(xué)習(xí)平臺(tái),本次學(xué)習(xí)將記錄記錄如何使用Pytorch高效實(shí)現(xiàn)網(wǎng)絡(luò),熟練掌握Pytorch的基礎(chǔ)知識(shí)。記錄不包含理論知識(shí)的細(xì)節(jié)展開。
這部分比較特殊,主要講解了目標(biāo)檢測中框的設(shè)定,不涉及主流的目標(biāo)檢測網(wǎng)絡(luò)。主要使梳理其中的錨框。由于剛好最近導(dǎo)師項(xiàng)目需要,梳理該部分的基礎(chǔ)知識(shí)。主要使概念理解,不涉及代碼部分,以下內(nèi)容參考以下鏈接。
學(xué)習(xí)代碼可以參考
一:錨框生成
????假設(shè)輸入圖像高為 ,寬為
。我們分別以圖像的每個(gè)像素為中心生成不同形狀的錨框。設(shè)大小為
且寬高比為
,那么錨框的寬和高將分別為
和
。當(dāng)中心位置給定時(shí),已知寬和高的錨框是確定的。
????下面我們分別設(shè)定好一組大小和一組寬高比
。如果以每個(gè)像素為中心時(shí)使用所有的大小與寬高比的組合,輸入圖像將一共得到
個(gè)錨框。雖然這些錨框可能覆蓋了所有的真實(shí)邊界框,但計(jì)算復(fù)雜度容易過高。因此,我們通常只對(duì)包含
或
的大小與寬高比的組合感興趣,即
????也就是說,以相同像素為中心的錨框的數(shù)量為。對(duì)于整個(gè)輸入圖像,我們將一共生成
個(gè)錨框。
????這里需要注意的是,其實(shí)不同的方法使用的生成錨框的方法不同,具體實(shí)現(xiàn)細(xì)節(jié)可以參考論文。
二:交并比(IoU)
我們剛剛提到某個(gè)錨框較好地覆蓋了圖像中的狗。如果該目標(biāo)的真實(shí)邊界框已知,這里的“較好”該如何量化呢?一種直觀的方法是衡量錨框和真實(shí)邊界框之間的相似度。我們知道,Jaccard系數(shù)(Jaccard index)可以衡量兩個(gè)集合的相似度。給定集合和
,它們的Jaccard系數(shù)即二者交集大小除以二者并集大?。?/p>
實(shí)際上,我們可以把邊界框內(nèi)的像素區(qū)域看成是像素的集合。如此一來,我們可以用兩個(gè)邊界框的像素集合的Jaccard系數(shù)衡量這兩個(gè)邊界框的相似度。當(dāng)衡量兩個(gè)邊界框的相似度時(shí),我們通常將Jaccard系數(shù)稱為交并比(Intersection over Union,IoU),即兩個(gè)邊界框相交面積與相并面積之比,如圖所示。交并比的取值范圍在0和1之間:0表示兩個(gè)邊界框無重合像素,1表示兩個(gè)邊界框相等。
三:標(biāo)注訓(xùn)練集的錨框
在訓(xùn)練集中,我們將每個(gè)錨框視為一個(gè)訓(xùn)練樣本。為了訓(xùn)練目標(biāo)檢測模型,我們需要為每個(gè)錨框標(biāo)注兩類標(biāo)簽:一是錨框所含目標(biāo)的類別,簡稱類別;二是真實(shí)邊界框相對(duì)錨框的偏移量,簡稱偏移量(offset)。在目標(biāo)檢測時(shí),我們首先生成多個(gè)錨框,然后為每個(gè)錨框預(yù)測類別以及偏移量,接著根據(jù)預(yù)測的偏移量調(diào)整錨框位置從而得到預(yù)測邊界框,最后篩選需要輸出的預(yù)測邊界框。
我們知道,在目標(biāo)檢測的訓(xùn)練集中,每個(gè)圖像已標(biāo)注了真實(shí)邊界框的位置以及所含目標(biāo)的類別。在生成錨框之后,我們主要依據(jù)與錨框相似的真實(shí)邊界框的位置和類別信息為錨框標(biāo)注。那么,該如何為錨框分配與其相似的真實(shí)邊界框呢?
假設(shè)圖像中錨框分別為,真實(shí)邊界框分別為
,且
。定義矩陣
,其中第
行第
列的元素
為錨框
與真實(shí)邊界框
的交并比。
首先,我們找出矩陣中最大元素,并將該元素的行索引與列索引分別記為
。我們?yōu)殄^框
分配真實(shí)邊界框
。顯然,錨框
和真實(shí)邊界框
在所有的“錨框—真實(shí)邊界框”的配對(duì)中相似度最高。接下來,將矩陣
中第
行和第
列上的所有元素丟棄。找出矩陣
中剩余的最大元素,并將該元素的行索引與列索引分別記為
。我們?yōu)殄^框
分配真實(shí)邊界框
,再將矩陣
中第
行和第
列上的所有元素丟棄。此時(shí)矩陣
中已有兩行兩列的元素被丟棄。
依此類推,直到矩陣中所有
列元素全部被丟棄。這個(gè)時(shí)候,我們已為
個(gè)錨框各分配了一個(gè)真實(shí)邊界框。
接下來,我們只遍歷剩余的個(gè)錨框:給定其中的錨框
,根據(jù)矩陣
的第
行找到與
交并比最大的真實(shí)邊界框
,且只有當(dāng)該交并比大于預(yù)先設(shè)定的閾值時(shí),才為錨框
分配真實(shí)邊界框
。
如下圖所示,假設(shè)矩陣中最大值為
,我們將為錨框
分配真實(shí)邊界框
。然后,丟棄矩陣中第2行和第3列的所有元素,找出剩余陰影部分的最大元素
,為錨框
分配真實(shí)邊界框
。接著如圖(中)所示,丟棄矩陣中第7行和第1列的所有元素,找出剩余陰影部分的最大元素
,為錨框
分配真實(shí)邊界框
。最后如圖(右)所示,丟棄矩陣中第5行和第4列的所有元素,找出剩余陰影部分的最大元素
,為錨框
分配真實(shí)邊界框
。之后,我們只需遍歷除去
的剩余錨框,并根據(jù)閾值判斷是否為剩余錨框分配真實(shí)邊界框。
現(xiàn)在我們可以標(biāo)注錨框的類別和偏移量了。如果一個(gè)錨框被分配了真實(shí)邊界框
,將錨框
的類別設(shè)為
的類別,并根據(jù)
和
的中心坐標(biāo)的相對(duì)位置以及兩個(gè)框的相對(duì)大小為錨框
標(biāo)注偏移量。由于數(shù)據(jù)集中各個(gè)框的位置和大小各異,因此這些相對(duì)位置和相對(duì)大小通常需要一些特殊變換,才能使偏移量的分布更均勻從而更容易擬合。設(shè)錨框
及其被分配的真實(shí)邊界框
的中心坐標(biāo)分別為
和
,
和
的寬分別為
和
,高分別為
和
,一個(gè)常用的技巧是將
的偏移量標(biāo)注為
其中常數(shù)的默認(rèn)值為。如果一個(gè)錨框沒有被分配真實(shí)邊界框,我們只需將該錨框的類別設(shè)為背景。類別為背景的錨框通常被稱為負(fù)類錨框,其余則被稱為正類錨框。
三:預(yù)測錨框
在模型預(yù)測階段,我們先為圖像生成多個(gè)錨框,并為這些錨框一一預(yù)測類別和偏移量。隨后,我們根據(jù)錨框及其預(yù)測偏移量得到預(yù)測邊界框。當(dāng)錨框數(shù)量較多時(shí),同一個(gè)目標(biāo)上可能會(huì)輸出較多相似的預(yù)測邊界框。為了使結(jié)果更加簡潔,我們可以移除相似的預(yù)測邊界框。常用的方法叫作非極大值抑制(non-maximum suppression,NMS)。
我們來描述一下非極大值抑制的工作原理。對(duì)于一個(gè)預(yù)測邊界框,模型會(huì)計(jì)算各個(gè)類別的預(yù)測概率。設(shè)其中最大的預(yù)測概率為
,該概率所對(duì)應(yīng)的類別即
的預(yù)測類別。我們也將
稱為預(yù)測邊界框
的置信度。在同一圖像上,我們將預(yù)測類別非背景的預(yù)測邊界框按置信度從高到低排序,得到列表
。從
中選取置信度最高的預(yù)測邊界框
作為基準(zhǔn),將所有與
的交并比大于某閾值的非基準(zhǔn)預(yù)測邊界框從
中移除。這里的閾值是預(yù)先設(shè)定的超參數(shù)。此時(shí),
保留了置信度最高的預(yù)測邊界框并移除了與其相似的其他預(yù)測邊界框。
接下來,從中選取置信度第二高的預(yù)測邊界框
作為基準(zhǔn),將所有與
的交并比大于某閾值的非基準(zhǔn)預(yù)測邊界框從
中移除。重復(fù)這一過程,直到
中所有的預(yù)測邊界框都曾作為基準(zhǔn)。此時(shí)
中任意一對(duì)預(yù)測邊界框的交并比都小于閾值。最終,輸出列表
中的所有預(yù)測邊界框。