機器學習筆記08:目標檢測基礎;圖像風格遷移;

目標檢測基礎


錨框

目標檢測算法通常會在輸入圖像中採樣大量的區域,然後判斷這些區域中是否包含我們感興趣的目標,並調整區域邊緣從而更準確地預測目標的真實邊界框(ground-truth bounding box)。不同的模型使用的區域採樣方法可能不同。這裡我們介紹其中的一種方法:它以每個像素為中心生成多個大小和寬高比(aspect ratio)不同的邊界框。這些邊界框被稱為錨框(anchor box)。我們將在後面基於錨框實踐目標檢測。


生成多個錨框

假設輸入圖像高為 h ,寬為 w 。我們分別以圖像的每個像素為中心生成不同形狀的錨框。設大小為 s∈(0,1] 且寬高比為 r>0 ,那麼錨框的寬和高將分別為 ws√r 和 hs/√r 。當中心位置給定時,已知寬和高的錨框是確定的。


下面我們分別設定好一組大小 s1,…,sn 和一組寬高比 r1,…,rm 。如果以每個像素為中心時使用所有的大小與寬高比的組合,輸入圖像將一共得到 whnm 個錨框。雖然這些錨框可能覆蓋了所有的真實邊界框,但計算複雜度容易過高。因此,我們通常只對包含 s1 或 r1 的大小與寬高比的組合感興趣,即

(s1,r1),(s1,r2),…,(s1,rm),(s2,r1),(s3,r1),…,(sn,r1)


也就是說,以相同像素為中心的錨框的數量為 n+m−1 。對於整個輸入圖像,我們將一共生成 wh(n+m−1) 個錨框。


以上生成錨框的方法已實現在MultiBoxPrior函數中。指定輸入、一組大小和一組寬高比,該函數將返回輸入的所有錨框。


交併比

我們剛剛提到某個錨框較好地覆蓋了圖像中的狗。如果該目標的真實邊界框已知,這裡的“較好”該如何量化呢?一種直觀的方法是衡量錨框和真實邊界框之間的相似度。我們知道,Jaccard係數(Jaccard index)可以衡量兩個集合的相似度。給定集合 A 和 B ,它們的Jaccard係數即二者交集大小除以二者並集大小:

J(A,B)=|A∩B|/|A∪B|


實際上,我們可以把邊界框內的像素區域看成是像素的集合。如此一來,我們可以用兩個邊界框的像素集合的Jaccard係數衡量這兩個邊界框的相似度。當衡量兩個邊界框的相似度時,我們通常將Jaccard係數稱為交併比(Intersection over Union,IoU),即兩個邊界框相交面積與相併面積之比,如圖所示。交併比的取值範圍在0和1之間:0表示兩個邊界框無重合像素,1表示兩個邊界框相等。


機器學習筆記08:目標檢測基礎;圖像風格遷移;


標註訓練集的錨框

在訓練集中,我們將每個錨框視為一個訓練樣本。為了訓練目標檢測模型,我們需要為每個錨框標註兩類標籤:一是錨框所含目標的類別,簡稱類別;二是真實邊界框相對錨框的偏移量,簡稱偏移量(offset)。在目標檢測時,我們首先生成多個錨框,然後為每個錨框預測類別以及偏移量,接著根據預測的偏移量調整錨框位置從而得到預測邊界框,最後篩選需要輸出的預測邊界框。


我們知道,在目標檢測的訓練集中,每個圖像已標註了真實邊界框的位置以及所含目標的類別。在生成錨框之後,我們主要依據與錨框相似的真實邊界框的位置和類別信息為錨框標註。那麼,該如何為錨框分配與其相似的真實邊界框呢?


假設圖像中錨框分別為 A1,A2,…,Ana ,真實邊界框分別為 B1,B2,…,Bnb ,且 na≥nb 。定義矩陣 X∈Rna×nb ,其中第 i 行第 j 列的元素 xij 為錨框 Ai 與真實邊界框 Bj 的交併比。首先,我們找出矩陣 X 中最大元素,並將該元素的行索引與列索引分別記為 i1,j1 。我們為錨框 Ai1 分配真實邊界框 Bj1 。顯然,錨框 Ai1 和真實邊界框 Bj1 在所有的“錨框—真實邊界框”的配對中相似度最高。接下來,將矩陣 X 中第 i1 行和第 j1 列上的所有元素丟棄。找出矩陣 X 中剩餘的最大元素,並將該元素的行索引與列索引分別記為 i2,j2 。我們為錨框 Ai2 分配真實邊界框 Bj2 ,再將矩陣 X 中第 i2 行和第 j2 列上的所有元素丟棄。此時矩陣 X 中已有兩行兩列的元素被丟棄。依此類推,直到矩陣 X 中所有 nb 列元素全部被丟棄。這個時候,我們已為 nb 個錨框各分配了一個真實邊界框。接下來,我們只遍歷剩餘的 na−nb 個錨框:給定其中的錨框 Ai ,根據矩陣 X 的第 i 行找到與 Ai 交併比最大的真實邊界框 Bj ,且只有當該交併比大於預先設定的閾值時,才為錨框 Ai 分配真實邊界框 Bj 。


如圖所示,假設矩陣 X 中最大值為 x23 ,我們將為錨框 A2 分配真實邊界框 B3 。然後,丟棄矩陣中第2行和第3列的所有元素,找出剩餘陰影部分的最大元素 x71 ,為錨框 A7 分配真實邊界框 B1 。接著如圖9.3(中)所示,丟棄矩陣中第7行和第1列的所有元素,找出剩餘陰影部分的最大元素 x54 ,為錨框 A5 分配真實邊界框 B4 。最後如圖9.3(右)所示,丟棄矩陣中第5行和第4列的所有元素,找出剩餘陰影部分的最大元素 x92 ,為錨框 A9 分配真實邊界框 B2 。之後,我們只需遍歷除去 A2,A5,A7,A9 的剩餘錨框,並根據閾值判斷是否為剩餘錨框分配真實邊界框。


機器學習筆記08:目標檢測基礎;圖像風格遷移;


現在我們可以標註錨框的類別和偏移量了。如果一個錨框 A 被分配了真實邊界框 B ,將錨框 A 的類別設為 B 的類別,並根據 B 和 A 的中心座標的相對位置以及兩個框的相對大小為錨框 A 標註偏移量。由於數據集中各個框的位置和大小各異,因此這些相對位置和相對大小通常需要一些特殊變換,才能使偏移量的分佈更均勻從而更容易擬合。設錨框 A 及其被分配的真實邊界框 B 的中心座標分別為 (xa,ya) 和 (xb,yb) , A 和 B 的寬分別為 wa 和 wb ,高分別為 ha 和 hb 。


我們根據錨框與真實邊界框在圖像中的位置來分析這些標註的類別。首先,在所有的“錨框—真實邊界框”的配對中,錨框 A4 與貓的真實邊界框的交併比最大,因此錨框 A4 的類別標註為貓。不考慮錨框 A4 或貓的真實邊界框,在剩餘的“錨框—真實邊界框”的配對中,最大交併比的配對為錨框 A1 和狗的真實邊界框,因此錨框 A1 的類別標註為狗。接下來遍歷未標註的剩餘3個錨框:與錨框 A0 交併比最大的真實邊界框的類別為狗,但交併比小於閾值(默認為0.5),因此類別標註為背景;與錨框 A2 交併比最大的真實邊界框的類別為貓,且交併比大於閾值,因此類別標註為貓;與錨框 A3 交併比最大的真實邊界框的類別為貓,但交併比小於閾值,因此類別標註為背景。


返回值的第二項為掩碼(mask)變量,形狀為(批量大小, 錨框個數的四倍)。掩碼變量中的元素與每個錨框的4個偏移量一一對應。由於我們不關心對背景的檢測,有關負類的偏移量不應影響目標函數。通過按元素乘法,掩碼變量中的0可以在計算目標函數之前過濾掉負類的偏移量。


圖像風格遷移

如果你是一位攝影愛好者,也許接觸過濾鏡。它能改變照片的顏色樣式,從而使風景照更加銳利或者令人像更加美白。但一個濾鏡通常只能改變照片的某個方面。如果要照片達到理想中的樣式,經常需要嘗試大量不同的組合,其複雜程度不亞於模型調參。


在本節中,我們將介紹如何使用卷積神經網絡自動將某圖像中的樣式應用在另一圖像之上,即樣式遷移(style transfer)。這裡我們需要兩張輸入圖像,一張是內容圖像,另一張是樣式圖像,我們將使用神經網絡修改內容圖像使其在樣式上接近樣式圖像。圖9.12中的內容圖像為本書作者在西雅圖郊區的雷尼爾山國家公園(Mount Rainier National Park)拍攝的風景照,而樣式圖像則是一副主題為秋天橡樹的油畫。最終輸出的合成圖像在保留了內容圖像中物體主體形狀的情況下應用了樣式圖像的油畫筆觸,同時也讓整體顏色更加鮮豔


機器學習筆記08:目標檢測基礎;圖像風格遷移;


方法

用一個例子來闡述基於卷積神經網絡的樣式遷移方法。首先,我們初始化合成圖像,例如將其初始化成內容圖像。該合成圖像是樣式遷移過程中唯一需要更新的變量,即樣式遷移所需迭代的模型參數。然後,我們選擇一個預訓練的卷積神經網絡來抽取圖像的特徵,其中的模型參數在訓練中無須更新。深度卷積神經網絡憑藉多個層逐級抽取圖像的特徵。我們可以選擇其中某些層的輸出作為內容特徵或樣式特徵。以圖為例,這裡選取的預訓練的神經網絡含有3個卷積層,其中第二層輸出圖像的內容特徵,而第一層和第三層的輸出被作為圖像的樣式特徵。接下來,我們通過正向傳播(實線箭頭方向)計算樣式遷移的損失函數,並通過反向傳播(虛線箭頭方向)迭代模型參數,即不斷更新合成圖像。樣式遷移常用的損失函數由3部分組成:內容損失(content loss)使合成圖像與內容圖像在內容特徵上接近,樣式損失(style loss)令合成圖像與樣式圖像在樣式特徵上接近,而總變差損失(total variation loss)則有助於減少合成圖像中的噪點。最後,當模型訓練結束時,我們輸出樣式遷移的模型參數,即得到最終的合成圖像。


機器學習筆記08:目標檢測基礎;圖像風格遷移;


定義損失函數

下面我們來描述樣式遷移的損失函數。它由內容損失、樣式損失和總變差損失3部分組成。


內容損失

與線性迴歸中的損失函數類似,內容損失通過平方誤差函數衡量合成圖像與內容圖像在內容特徵上的差異。平方誤差函數的兩個輸入均為extract_features函數計算所得到的內容層的輸出。


樣式損失

樣式損失也一樣通過平方誤差函數衡量合成圖像與樣式圖像在樣式上的差異。為了表達樣式層輸出的樣式,我們先通過extract_features函數計算樣式層的輸出。假設該輸出的樣本數為1,通道數為 c ,高和寬分別為 h 和 w ,我們可以把輸出變換成 c 行 hw 列的矩陣 X 。矩陣 X 可以看作是由 c 個長度為 hw 的向量 x1,…,xc 組成的。其中向量 xi 代表了通道 i 上的樣式特徵。這些向量的格拉姆矩陣(Gram matrix) XX⊤∈Rc×c 中 i 行 j 列的元素 xij 即向量 xi 與 xj 的內積,它表達了通道 i 和通道 j 上樣式特徵的相關性。我們用這樣的格拉姆矩陣表達樣式層輸出的樣式。需要注意的是,當 hw 的值較大時,格拉姆矩陣中的元素容易出現較大的值。此外,格拉姆矩陣的高和寬皆為通道數 c 。為了讓樣式損失不受這些值的大小影響,下面定義的gram函數將格拉姆矩陣除以了矩陣中元素的個數,即 chw 。


總變差損失

有時候,我們學到的合成圖像裡面有大量高頻噪點,即有特別亮或者特別暗的顆粒像素。一種常用的降噪方法是總變差降噪(total variation denoising)。假設 xi,j 表示座標為 (i,j) 的像素值,降低總變差損失。


機器學習筆記08:目標檢測基礎;圖像風格遷移;


分享到:


相關文章: