优达学城《DeepLearning》2-5:风格迁移
這次我們將學習一種風格轉換方法,該方法具體原來可見論文《Image Style Transfer Using Convolutional Neural Networks》,使用卷積神經網絡進行圖像風格轉換,作者是Gatys。
在本文中,我們使用19層的VGG網絡中的特征提取層,該網絡由一系列卷積層和池化層以及幾個全連接層組成。在下圖中,卷積層按堆棧及其在堆棧中的順序命名。Conv1是圖像在第一個堆棧中通過的第一個卷積層。Conv2_1是第二個堆棧中的第一個卷積層。網絡中最深的卷積層是conv5_4。
分離樣式和內容
風格傳遞依賴于圖像內容和風格的分離。給定一個內容圖像和一個樣式圖像,我們的目標是創建一個新的目標圖像,該圖像應包含我們所需的內容和樣式組件:
- 圖像內容:目標對象及其排列
- 圖像風格:樣式、顏色和紋理
下面是一個示例,圖像內容是一只貓,圖像風格是Hokusai's Great Wave。生成的目標圖像仍然包含貓,但樣式變為波浪、藍色和米色,以及塊打印狀的紋理!
在本筆記本中,我們將使用預訓練的VGG19從圖像中提取內容或樣式特征。然后,我們將形式化內容和樣式丟失的概念,并使用它們來迭代更新目標圖像,直到得到我們想要的結果。我們鼓勵您使用自己的風格和內容圖片,并在Twitter上與@udacity分享您的作品;我們很想看看你的想法!
加載VGG19
VGG19分為兩部分:
- vgg19特征提取層:所有的卷積層和池化層
- vgg19分類器層:最后的三個線性分類器層
我們只需要特征提取部分,我們將在下面加載模型并“凍結”權重。
你可以加載任何你想要的圖片!下面,我們提供了一個helper函數,用于加載任何類型和大小的圖像。load_image函數還將圖像轉換為標準化的張量。
接下來,我將按文件名加載圖像,并強制風格圖像與內容圖像的大小相同。
為了獲得圖像的內容和樣式表示,我們必須通過VGG19網絡將圖像前向傳播,直到到達所需的層,然后從該層獲得輸出。
內容和樣式特征
TODO:獲取特征提取層。
Gram矩陣
每個卷積層的輸出都是一個張量,其維度與batch_size、depth、d以及一定的高度和寬度(h, w)有關。卷積層的Gram矩陣可以計算如下:
- 通過batch_size, d, h, w = tensor.size()獲取depth, height, width。
- reshape張量,使其維度被拉平。
-
通過將重構后的張量乘以它的轉置來計算gram矩陣
注意:兩個矩陣的乘法可以使用函數:torch.mm(matrix1, matrix2)
TODO:完成gram_matrix函數
把他們放一起
現在我們已經編寫了用于提取特征和計算給定卷積層的gram矩陣的函數;讓我們把所有這些碎片放在一起!我們將從圖像中提取特征,并為樣式表示中的每一層計算gram矩陣。
損失和權重
下面給出了在每個相關層中權重樣式表示的選項。建議您使用0-1之間的范圍來衡量這些層。通過對更前面的層(conv1_1和conv2_1)進行更多加權,您可以期望在結果的目標圖像中得到更大的樣式組件。如果您選擇對后面的層進行加權,那么您將會更加強調較小的樣式組件。這是因為每一層都有不同的大小,它們一起創建了一個多尺度的樣式表示
就像在論文中一樣,我們定義了alpha(內容權重)和beta(樣式權重)。這個比例將影響你的最終圖像的風格化程度。建議您保留內容權重= 1,并將樣式權重設置為您想要的比例。
更新Target和計算損失
你將決定一些步驟來更新你的圖像,這與你之前看到的訓練循環類似,只是我們改變了我們的目標圖像,沒有其他關于VGG19或任何其他圖像。因此,steps的數量真的由您來設置!我建議使用至少2000步來獲得好的結果。但是,如果您只是測試不同的權重值或試驗不同的圖像,那么您可能希望從更少的步驟開始。
在迭代循環中,您將計算內容和樣式損失,并相應地更新目標圖像。
內容損失
內容損失是目標特征與內容特征在conv4_2層的均方差。這可以如下計算:
ontent_loss = torch.mean((target_features['conv4_2'] - content_features['conv4_2'])**2)
樣式損失
樣式損失以類似的方式計算,只是您必須遍歷多個層,在我們的字典樣式權重中通過名稱指定。
- 您將計算每一層的目標圖像、target_gram和樣式圖的target_gram的gram矩陣,并比較這些gram矩陣,計算圖層樣式損失。稍后,你會看到這個值被圖層的大小標準化了。
總損失
最后,您將通過將樣式和內容損失相加,并將它們與指定的alpha和beta進行加權,從而創建總的損失。
我們會打印出這個損失;如果損失很大,不要驚慌。改變圖像的風格需要一些時間,您應該關注目標圖像的外觀,而不是任loss值。但是,您應該看到這種損失會隨著迭代次數的增加而減少。
TODO: Define content, style, and total losses.
結果:
Total loss at : 96257672.0
Total loss at : 15236884.0
Total loss at : 7416982.0
Total loss at : 4611283.5
Total loss at : 3088661.5
顯示目標圖像
備注一下原始風格圖像:
?
?
?
?
總結
以上是生活随笔為你收集整理的优达学城《DeepLearning》2-5:风格迁移的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI视频行为分析系统项目复盘——技术篇1
- 下一篇: AI视频行为分析系统项目复盘——技术篇2