--- title: SinGAN Learning a Generative Model from a Single Natural Image 論文閱讀 tags: Deep Learning description: DarkTheme --- # SinGAN : Learning a Generative Model from a Single Natural Image 論文閱讀 ## 摘要 這篇論文如其名"Sin"GAN,其中的Sin代表了single,也就是說他只用一張圖片就能訓練好一個GAN模型 他透過一個像金字塔的全捲基GAN模型,在不同的圖片解析下學習該解析的patchs的分布狀況,其效果在各種圖像任務上都有不錯的成果。 ## 單圖像訓練的問題 1. 僅限於紋理圖片 2. 用noise生成多樣本 缺點:noise會造成混淆,導致模型訓練結果會因為noise被影響 3. 只用單一樣本 的話會有甚麼問題 GAN 是要讓輸入 生成對應的輸出 再透過辨別器來辨別這個生成出來的結果 是不是分布在真正數據的分布上 所以說這個真實數據並不能只有一個樣本點,這樣就算訓練到極致 也只會生成出跟訓練樣本一模一樣的圖片 舉個例子來說 如果要訓練 數字圖片生成 那我們就得餵給他很多數字照片 不能只給他一張圖片 這樣他沒辦法生成出像是數字的圖片   再來就提到這篇論文的核心概念 回到前面的問題 樣本數不夠 那我們可以把一張圖片切成很多個部分 這樣就有足夠多的樣本了 以 200x200的圖片為例 * 切成 11x11 的大小 => 190x190 = 36100張圖片 看起來足夠多樣本數了,但是要合併成大圖片,對於大區塊的組成效果會很差 * 切成 151x151 的大小 => 50x50 = 2500張圖片 樣本空間有 256x3(RGB)x151x151 = 17511168 遠遠大於2500這個樣本數 ※如常見的MNIST 數字訓練集 樣本空間 28x28x2=1568 樣本數 55000 足夠多的樣本才能訓練出好的效果 所以這篇提供了一個新的思維 先把圖片從200x200 降解析度到 40x40 再切成 11x11 的樣本 這樣就能有足夠多的樣本 也有足夠大的區塊了  接下來就是從低解析度逐漸到高解析度 逐步把細節補回 以上,就是SinGAN的核心想法 ## 相關任務 ### 單圖像生成 單圖像生成(其他人做的是讓模型overfit)在特定任務下 如超解析度、複雜紋理生成上 都有不錯的效果  但此篇架構在非純紋理上的生成,有更好的效果  ### 其他任務 這些任務都通過相同的網路架構,且除了原始圖片沒有額外的訊息與訓練  ## 整體model 架構 就如前面所提及 這是一個金字塔型的GAN架構 每一層都是獨立的GAN網路  ### Generator  第N層  第N-1 ~ 0層   其輸入為 **隨機noise Zn** 和 **前一個Scale生成的圖片**(經過upsampleing 可能是插值法之類的 沒明說) ψn 表示 五個 **CONV(3x3)** 激勵函數為 BatchNorm-LeakyReLU 後,加上**原本的圖片**(殘差網路)輸出 而其中CONV的作用是修補前一層(n+1層)缺失的細節 最初為32個kernel的大小,經過四個scale,會變為2倍 如G(N-1) 的輸入就是GN生成的圖片 如果沒有理解錯誤的話 [github issue的討論1](https://github.com/tamarott/SinGAN/issues/26) [github issue的討論2](https://github.com/tamarott/SinGAN/issues/63) 論文內提供的github模型跑的結果 可能要載下來看會比較清楚兩者差別 * fake_sample.png 前一個Scale生成的圖片  * G(z_opt).png 經過模型生成的結果  這邊的訓練樣本是圖片中的 patches ,並非整個圖片  ### Discriminator 其損失函數由 adversarial term & reconstruction term 組成  * adversarial term 使用的是WGAN-GP loss,可以提高訓練穩定性。 特別的是計算對象為 生成圖 和 原生圖(原圖降解析)其中的patches(架構和生成器相同) 輸出分數為**單個patch結果的平均值** * reconstruction term  這邊使用 root mean squared error (RMSE) 均方根誤差 目的應該是為了讓重構的品質更加優秀 原文: which gives an indication of the amount of details that need to be added at that scale. which gives an indication of the amount of details that need to be added at that scale. [github issue討論](https://github.com/tamarott/SinGAN/issues/97) ## 效果展示  ### 參數調整 * 改變輸入 上面的 n =N-1 表示在那層直接使用原始圖片輸入(原本為噪聲+上一層的輸出)    * 層數對於效果的差別 層數對於效果影響相當大,其原因在於更深入的MODEL細節捕捉較多  * 超解析的效果對比  * 塗鴉  * 融合物體  ## 心得總結 1. 像是人臉這種較複雜的訓練起來效果就不是很好,雖然可以透過在N-1、N-2層輸入降解析的原始圖片,但其結果會非常相似於原始圖片 2. 受限於單圖片訓練架構,創造性、可用性相對較低 3. 訓練時間很長,測試了官方提供的SR,訓練321X481的圖片,跑了整天還沒跑完。 其效能不確定是否設定錯誤,分別透過CPU和GPU運算 使用率都很低,且速度差異不大。 且容易內存不夠(rtx 3060ti 8gb)  ## 參考資料 [論文連結 arxiv](https://arxiv.org/pdf/1905.01164.pdf) [論文實作github-pytorch](https://github.com/tamarott/SinGAN) [論文補充](https://tomer.net.technion.ac.il/files/2019/09/SingleImageGan_SM.pdf) [ICCV2019最佳论文SinGAN全面解读,看这一篇就懂了](https://www.sohu.com/a/362210741_610300) [ICCV2019 bestpaper SinGAN 笔记](https://zhuanlan.zhihu.com/p/89670603) {%hackmd theme-dark %}
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up