STEP-7:Pytorch-目標(biāo)檢測和邊界框

感謝伯禹學(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è)輸入圖像高為 h,寬為w。我們分別以圖像的每個(gè)像素為中心生成不同形狀的錨框。設(shè)大小為s\in (0,1]且寬高比為r > 0,那么錨框的寬和高將分別為ws\sqrt{r}hs/\sqrt{r}。當(dāng)中心位置給定時(shí),已知寬和高的錨框是確定的。

????下面我們分別設(shè)定好一組大小s_1,\ldots,s_n和一組寬高比r_1,\ldots,r_m。如果以每個(gè)像素為中心時(shí)使用所有的大小與寬高比的組合,輸入圖像將一共得到whnm個(gè)錨框。雖然這些錨框可能覆蓋了所有的真實(shí)邊界框,但計(jì)算復(fù)雜度容易過高。因此,我們通常只對(duì)包含s_1r_1的大小與寬高比的組合感興趣,即

(s_1, r_1), (s_1, r_2), \ldots, (s_1, r_m), (s_2, r_1), (s_3, r_1), \ldots, (s_n, r_1).

????也就是說,以相同像素為中心的錨框的數(shù)量為n+m-1。對(duì)于整個(gè)輸入圖像,我們將一共生成wh(n+m-1)個(gè)錨框。
????這里需要注意的是,其實(shí)不同的方法使用的生成錨框的方法不同,具體實(shí)現(xiàn)細(xì)節(jié)可以參考論文。

二:交并比(IoU)

我們剛剛提到某個(gè)錨框較好地覆蓋了圖像中的狗。如果該目標(biāo)的真實(shí)邊界框已知,這里的“較好”該如何量化呢?一種直觀的方法是衡量錨框和真實(shí)邊界框之間的相似度。我們知道,Jaccard系數(shù)(Jaccard index)可以衡量兩個(gè)集合的相似度。給定集合\mathcal{A}\mathcal{B},它們的Jaccard系數(shù)即二者交集大小除以二者并集大?。?/p>

J(\mathcal{A},\mathcal{B}) = \frac{\left|\mathcal{A} \cap \mathcal{B}\right|}{\left| \mathcal{A} \cup \mathcal{B}\right|}.

實(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è)邊界框相等。

IoU計(jì)算圖示

三:標(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è)圖像中錨框分別為A_1, A_2, \ldots, A_{n_a},真實(shí)邊界框分別為B_1, B_2, \ldots, B_{n_b},且n_a \geq n_b。定義矩陣\boldsymbol{X} \in \mathbb{R}^{n_a \times n_b},其中第i行第j列的元素x_{ij}為錨框A_i與真實(shí)邊界框B_j的交并比。
首先,我們找出矩陣\boldsymbol{X}中最大元素,并將該元素的行索引與列索引分別記為i_1,j_1。我們?yōu)殄^框A_{i_1}分配真實(shí)邊界框B_{j_1}。顯然,錨框A_{i_1}和真實(shí)邊界框B_{j_1}在所有的“錨框—真實(shí)邊界框”的配對(duì)中相似度最高。接下來,將矩陣\boldsymbol{X}中第i_1行和第j_1列上的所有元素丟棄。找出矩陣\boldsymbol{X}中剩余的最大元素,并將該元素的行索引與列索引分別記為i_2,j_2。我們?yōu)殄^框A_{i_2}分配真實(shí)邊界框B_{j_2},再將矩陣\boldsymbol{X}中第i_2行和第j_2列上的所有元素丟棄。此時(shí)矩陣\boldsymbol{X}中已有兩行兩列的元素被丟棄。
依此類推,直到矩陣\boldsymbol{X}中所有n_b列元素全部被丟棄。這個(gè)時(shí)候,我們已為n_b個(gè)錨框各分配了一個(gè)真實(shí)邊界框。
接下來,我們只遍歷剩余的n_a - n_b個(gè)錨框:給定其中的錨框A_i,根據(jù)矩陣\boldsymbol{X}的第i行找到與A_i交并比最大的真實(shí)邊界框B_j,且只有當(dāng)該交并比大于預(yù)先設(shè)定的閾值時(shí),才為錨框A_i分配真實(shí)邊界框B_j。

如下圖所示,假設(shè)矩陣\boldsymbol{X}中最大值為x_{23},我們將為錨框A_2分配真實(shí)邊界框B_3。然后,丟棄矩陣中第2行和第3列的所有元素,找出剩余陰影部分的最大元素x_{71},為錨框A_7分配真實(shí)邊界框B_1。接著如圖(中)所示,丟棄矩陣中第7行和第1列的所有元素,找出剩余陰影部分的最大元素x_{54},為錨框A_5分配真實(shí)邊界框B_4。最后如圖(右)所示,丟棄矩陣中第5行和第4列的所有元素,找出剩余陰影部分的最大元素x_{92},為錨框A_9分配真實(shí)邊界框B_2。之后,我們只需遍歷除去A_2, A_5, A_7, A_9的剩余錨框,并根據(jù)閾值判斷是否為剩余錨框分配真實(shí)邊界框。

image

現(xiàn)在我們可以標(biāo)注錨框的類別和偏移量了。如果一個(gè)錨框A被分配了真實(shí)邊界框B,將錨框A的類別設(shè)為B的類別,并根據(jù)BA的中心坐標(biāo)的相對(duì)位置以及兩個(gè)框的相對(duì)大小為錨框A標(biāo)注偏移量。由于數(shù)據(jù)集中各個(gè)框的位置和大小各異,因此這些相對(duì)位置和相對(duì)大小通常需要一些特殊變換,才能使偏移量的分布更均勻從而更容易擬合。設(shè)錨框A及其被分配的真實(shí)邊界框B的中心坐標(biāo)分別為(x_a, y_a)(x_b, y_b),AB的寬分別為w_aw_b,高分別為h_ah_b,一個(gè)常用的技巧是將A的偏移量標(biāo)注為

\left( \frac{ \frac{x_b - x_a}{w_a} - \mu_x }{\sigma_x}, \frac{ \frac{y_b - y_a}{h_a} - \mu_y }{\sigma_y}, \frac{ \log \frac{w_b}{w_a} - \mu_w }{\sigma_w}, \frac{ \log \frac{h_b}{h_a} - \mu_h }{\sigma_h}\right),

其中常數(shù)的默認(rèn)值為\mu_x = \mu_y = \mu_w = \mu_h = 0, \sigma_x=\sigma_y=0.1, \sigma_w=\sigma_h=0.2。如果一個(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ù)測邊界框B,模型會(huì)計(jì)算各個(gè)類別的預(yù)測概率。設(shè)其中最大的預(yù)測概率為p,該概率所對(duì)應(yīng)的類別即B的預(yù)測類別。我們也將p稱為預(yù)測邊界框B的置信度。在同一圖像上,我們將預(yù)測類別非背景的預(yù)測邊界框按置信度從高到低排序,得到列表L。從L中選取置信度最高的預(yù)測邊界框B_1作為基準(zhǔn),將所有與B_1的交并比大于某閾值的非基準(zhǔn)預(yù)測邊界框從L中移除。這里的閾值是預(yù)先設(shè)定的超參數(shù)。此時(shí),L保留了置信度最高的預(yù)測邊界框并移除了與其相似的其他預(yù)測邊界框。
接下來,從L中選取置信度第二高的預(yù)測邊界框B_2作為基準(zhǔn),將所有與B_2的交并比大于某閾值的非基準(zhǔn)預(yù)測邊界框從L中移除。重復(fù)這一過程,直到L中所有的預(yù)測邊界框都曾作為基準(zhǔn)。此時(shí)L中任意一對(duì)預(yù)測邊界框的交并比都小于閾值。最終,輸出列表L中的所有預(yù)測邊界框。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容