文章目錄
- 1 語義分割
- 1.1 介紹
- 1.2 語義分割應用
- 1.3 實例分割
- 2 轉置卷積
- 2.1 工作原理
- 2.2 為什么叫“轉置”卷積
- 2.3 轉置卷積也是一種卷積
- 3 FCN
- 3.1 核心思想
- 3.2 網絡架構
- 4 樣式遷移
- 4.1 基于 CNN 的樣式遷移
- 4.2 工作流程
1 語義分割
1.1 介紹
語義分割(Semantic Segmentation) 是一種像素級別的分類任務。它的目標是為圖像中的每一個像素分配一個類別標簽。
- 與普通圖像分割的區別:
- 普通分割(如聚類)只將相似的像素區域劃分為同一組,但可能不知道這些區域代表什么物體。
- 語義分割不僅進行區域劃分,還會為每個像素分配一個有意義的語義標簽(如“狗”、“貓”、“路面”或“背景”)。
- 與圖片分類和目標檢測的區別:
特性 | 圖片分類 | 目標檢測 | 語義分割 |
---|---|---|---|
任務級別 | 圖像級別 | 物體級別 | 像素級別 |
輸出 | 一個類別標簽 | 多個邊界框 + 類別標簽 | 每個像素的類別標簽 |
精度 | 粗略 | 相對精細(邊界框) | 非常精細(像素級) |
示例 | 圖像中有只狗 → “狗” | 圖像中有兩只狗 → 兩個邊界框,均標記為“狗” | 圖像中有兩只狗 → 標記出所有屬于狗的像素,并將其標記為“狗” |

1.2 語義分割應用
由于其像素級的精細度,語義分割在現實中有許多重要應用:
- 圖像背景處理:
- 視頻會議:通過識別出“人”和“背景”,可以輕松實現背景虛化或背景替換,而不需要綠幕。
- 手機人像模式:通過識別出“人”并將其與背景分離,實現更自然的背景虛化效果。

- 自動駕駛:
- 路面分割:這是自動駕駛最關鍵的應用之一。系統需要實時識別出哪些像素是“路面”,哪些是“人行道”、“樹木”或“建筑物”,以便安全行駛。

- 醫學影像分析:
- 識別和分割出病灶區域。
1.3 實例分割
實例分割(Instance Segmentation) 是一個比語義分割更進一步的任務。它不僅要識別每個像素的類別,還要區分同一類別下的不同實例。
- 與語義分割的區別:
- 語義分割:如果圖像中有兩只狗,它會把所有屬于狗的像素都標記為同一個“狗”類別。它不區分這是“狗一”還是“狗二”。
- 實例分割:它會把第一只狗的所有像素標記為“狗1”,把第二只狗的所有像素標記為“狗2”。它能區分出每一個獨立的“實例”。
- 關系:實例分割可以看作是目標檢測的精細化版本,它不僅通過邊界框框出物體,還提供了每個物體的精確像素級輪廓。

2 轉置卷積
傳統的卷積操作通常會減小特征圖(feature map)的高和寬。雖然可以通過填充(padding)來保持高寬不變,但很難有效增大特征圖的尺寸。
然而,語義分割的任務要求我們對圖像中的每一個像素進行分類。如果我們的模型不斷通過卷積來減小圖像尺寸,最終的特征圖(例如 7x7)將無法對應到原始圖像中的每一個像素。
因此,我們需要一種能夠增大特征圖高和寬的卷積操作,這就是轉置卷積。
2.1 工作原理
轉置卷積(也稱為反卷積或部分反向卷積)與常規卷積的工作方式非常相似,但它是“反向”的。
- 常規卷積:一個大輸入區域(例如 2x2)與一個卷積核做點積,生成一個小輸出像素。
- 轉置卷積:一個小輸入像素與卷積核做元素級乘法,生成一個大的輸出區域(與卷積核大小相同)。然后,將所有輸入像素生成的輸出區域疊加(相加),得到最終的輸出特征圖。
步驟:
- 輸入和卷積核:假設有一個 2x2 的輸入和一個 2x2 的卷積核。
- 逐像素處理:遍歷輸入的每一個像素,并與卷積核進行元素級乘法。
- 寫入輸出矩陣:將相乘后的結果,按照與輸入像素對應的位置,寫入到輸出矩陣中。
- 疊加:將所有輸入像素生成的結果矩陣疊加(相加),得到最終的輸出。
通過這種操作,一個較小的輸入特征圖(例如 2x2)可以生成一個較大的輸出特征圖(例如 3x3 或 4x4),從而實現了高和寬的增大。

- 填充(Padding):轉置卷積的填充是在輸出上進行的,這與常規卷積的輸入填充不同。
- 步幅(Stride):轉置卷積的步幅決定了輸入像素在輸出上移動的距離,從而成倍地增大輸出特征圖的尺寸。例如,步幅為 2 會使輸出高寬加倍。
2.2 為什么叫“轉置”卷積
從數學角度看,常規卷積可以被表示為一個矩陣乘法。
- 常規卷積:
- 可以將卷積核 W 構造為一個矩陣 V。
- 將輸入 X 和輸出 Y 展開成向量 X′ 和 Y′。
- 卷積操作等價于矩陣乘法:Y′=V×X′。
- 轉置卷積:
- 轉置卷積則等價于使用矩陣 V 的轉置進行乘法:Y′=VT×X′。
因此,一個常規卷積如果能將輸入從 (H, W) 變為 (H’, W’),那么使用相同超參數的轉置卷積,就可以將輸入從 (H’, W’) 變回 (H, W)。這就是“轉置卷積”名稱的由來,因為它在矩陣乘法層面是常規卷積的轉置。

2.3 轉置卷積也是一種卷積
轉置卷積本質上是一種特殊的卷積操作。它的特殊之處在于,它通過對輸入和卷積核進行巧妙的變換,來實現上采樣(增大高寬)的目的。
- 常規卷積:通常用于下采樣,即減小高和寬。
- 轉置卷積:通常用于上采樣,即增大高和寬。
在相同超參數(如卷積核大小、步幅和填充)的情況下,轉置卷積在形狀上是常規卷積的逆變換。如果一個常規卷積將輸入從 (H, W) 變為 (H’, W’),那么使用相同超參數的轉置卷積,就可以將輸入從 (H’, W’) 變回 (H, W)。

我們可以將轉置卷積的計算過程,等價地轉換為一個常規卷積的計算。為了將轉置卷積等價于一個常規卷積,需要對輸入和卷積核進行特定的預處理:
- 處理輸入:在輸入的行和列之間插入 S?1 行或列的零,其中 S 為轉置卷積的步幅。
- 處理輸入(填充):在輸入的上下左右填充 K?P?1 行或列的零,其中 K 為卷積核大小,P 為轉置卷積的填充。
- 處理卷積核:將卷積核矩陣進行上下左右翻轉。
完成上述轉換后,再對預處理后的輸入和卷積核進行常規卷積計算(填充為 0,步幅為 1),得到的輸出將與原始轉置卷積的輸出完全一致。

形狀的數學關系
假設:
- 常規卷積:輸入高或寬為 N,卷積核大小 K,填充 P,步幅 S,輸出高或寬為 N′。
- 轉置卷積:輸入高或寬為 N′,卷積核大小 K,填充 P,步幅 S,輸出高或寬為 N。
它們之間的數學關系如下:
- 常規卷積:N′=?SN?K+2P?+1
- 轉置卷積:N=S×(N′?1)+K?2P
如果常規卷積的計算結果能夠被整除,即 SN?K+2P 為整數,那么這兩個公式互為逆運算,再次證明了它們在形狀上的逆變換關系。

3 FCN
FCN (Fully Convolutional Network) 是用深度學習解決語義分割問題的奠基性工作。雖然現在有更復雜的模型,但 FCN 的核心思想仍然是理解現代語義分割模型的基礎。
3.1 核心思想
FCN 的核心思想非常簡單,但極具開創性:用轉置卷積層替換傳統 CNN 末尾的全連接層,從而實現對每個像素的預測。
傳統 CNN 的局限性:
- 傳統的 CNN(如用于圖像分類的 AlexNet 或 ResNet)通常以全連接層結束。
- 在進入全連接層之前,會使用全局平均池化層將特征圖壓縮成一個 1x1 的向量。
- 這種設計雖然適合圖像分類(因為只需一個標簽),但會丟失重要的空間信息,無法進行像素級別的預測。
FCN 的解決方案:
- FCN 去掉了傳統 CNN 架構中最后的全連接層和全局池化層。
- 它的整個網絡都由卷積層組成,因此得名“全卷積”。
- 它通過在網絡末尾添加轉置卷積層,將經過多層下采樣(減小尺寸)的特征圖還原到與原始輸入圖像相同的尺寸。
3.2 網絡架構
一個典型的 FCN 模型包含以下幾個關鍵部分:
- 基礎 CNN 網絡:
- 使用一個預訓練的 CNN 模型作為基礎(例如,在 ImageNet 上訓練好的 ResNet)。
- 這個部分用于提取圖像的深層特征。
- FCN 會去掉這個基礎網絡最后的全連接層和全局池化層。
- 1x1 卷積層:
- 緊接著 CNN 輸出的特征圖,添加一個 1x1 的卷積層。
- 作用:主要用于降低通道數,從而減少后續轉置卷積層的計算量。它不會改變特征圖的高和寬。
- 轉置卷積層:
- 這是 FCN 最關鍵的部分。
- 作用:通過轉置卷積,將小尺寸的特征圖放大到與原始輸入圖像相同的尺寸。
- 通道數:轉置卷積層的輸出通道數等于我們想要預測的類別數(K)。
- 輸出:最終輸出一個 H x W x K 的張量,其中 H 和 W 是原始圖像的高和寬,K 是類別數。對于每一個像素點,通道上的值代表了它屬于各個類別的預測分數。

4 樣式遷移
樣式遷移是一種將一張圖像的內容與另一張圖像的樣式相結合的技術,從而生成一張新的合成圖像。
- 內容圖像(Content Image):提供圖像中的主體內容、物體和布局。
- 樣式圖像(Style Image):提供圖像的風格、紋理、色彩和筆觸。
- 合成圖像(Synthesized Image):結合了兩者的圖像,既保留了內容圖像的結構,又呈現出樣式圖像的風格。
簡而言之,樣式遷移可以看作是一種高級的、可自定義的“濾鏡”,它比傳統的固定濾鏡更具靈活性。

4.1 基于 CNN 的樣式遷移
這是樣式遷移領域的奠基性工作。該方法的核心思想是利用卷積神經網絡(CNN) 的不同層級來分別提取圖像的內容特征和樣式特征。
該模型的目標是訓練一張合成圖像(而不是訓練網絡權重)。訓練的目標是讓這張合成圖像在兩個方面與原始圖像相似:
- 內容相似:合成圖像在內容上要與內容圖像非常接近。
- 樣式相似:合成圖像在樣式上要與樣式圖像非常接近。
為了實現這兩個目標,模型需要定義兩個關鍵的損失函數:內容損失和樣式損失。
4.2 工作流程

- 輸入:
- 內容圖像:你想要保留內容的圖像。
- 樣式圖像:你想要應用的風格圖像。
- 合成圖像:一張待優化的圖像,通常從隨機噪聲或內容圖像初始化。
- CNN 特征提取:
- 將三張圖像(內容圖像、樣式圖像、合成圖像)分別輸入同一個預訓練好的 CNN 模型中(例如 VGG 或 ResNet)。
- CNN 的每一層都會輸出一個特征圖,這些特征圖代表了圖像在不同抽象層次上的特征。
- 損失函數:
- 內容損失:在 CNN 的高層(更具語義信息)上,計算合成圖像的特征圖與內容圖像的特征圖之間的差異。目標是讓這個差異最小化,以確保合成圖像保留原始內容。
- 樣式損失:在 CNN 的低層和中層(更具紋理和色彩信息)上,計算合成圖像的特征圖與樣式圖像的特征圖之間的差異。這個差異通常通過計算特征圖的協方差矩陣(也稱為 Gram 矩陣)來衡量,因為它能捕捉不同通道之間的相關性,從而代表樣式信息。
- 訓練:
- 模型通過反向傳播來優化合成圖像的像素值,而不是優化網絡權重。
- 訓練過程不斷調整合成圖像,以同時最小化內容損失和樣式損失。