圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image

文章目錄

      • 圖像生成-ICCV2019-SinGAN: Learning a Generative Model from a Single Natural Image
        • 主要創新點
        • 模型架構圖
        • 生成器
          • 生成器源碼
        • 判別器
          • 判別器源碼
        • 損失函數
        • 需要源碼講解的私信我

SinGAN 通過多尺度全卷積 GAN 金字塔結構,從單張自然圖像中學習內部 patch 分布,無需條件輸入即可生成多樣化、高質量的新圖像,并適用于廣泛的圖像處理任務。

論文鏈接:SinGAN: Learning a Generative Model from a Single Natural Image

源碼鏈接:/tamarott/SinGAN

主要創新點
  1. 單圖像內部統計學習:SinGAN 通過多尺度 patch-GAN 層次結構,從單張圖像中學習其內部統計信息,而不是依賴于整個數據庫中的圖像樣本
  2. 多尺度結構捕獲圖像特征:每個 patch-GAN 負責捕獲圖像在不同尺度下的 patch 分布,能夠同時學習全局結構(如大物體的排列)和細節紋理信息。
  3. 突破傳統紋理生成:與傳統的紋理生成方法不同,SinGAN 不僅局限于生成紋理圖像,而是處理更復雜的自然圖像結構,能夠生成具有全局一致性和細節多樣性的高質量圖像。
  4. 多尺度生成器金字塔: SinGAN 使用多尺度生成器金字塔 {G0, ..., GN},每個生成器在不同尺度上生成與對應下采樣版本圖像相符的真實圖像樣本,通過對抗訓練實現生成器和判別器的博弈。生成過程從粗糙尺度開始,逐步通過各生成器添加細節,并通過上采樣前一尺度的生成圖像細化全局結構,同時確保噪聲在每個尺度上得到充分利用。
模型架構圖

主要由一下幾部分組成:

  1. 生成器:對于生成器是由下往上訓練的,生成器采用五個全卷積層來實現,對于不同層次生成器接收到的東西也隨著層數遞增也不一樣的,不同層次輸入的圖像大小也不一樣,其實就是和StyleGan的原理是一樣的,對應于StyleGan的潛在向量空間latent。
  2. 判別器:判別器和生成器一樣的, 根據尺度不一樣而一一對應,判別器就是要把生成器生成的判別為假,真的判別為真
  3. 多層次噪聲優化 : 對于生成器會隨機初始化一個噪聲輸入到生成器的中,噪聲對于圖像的影響也會很大,通常的做法是統計整個數據集的一些特征來對噪聲進行初始化,本文中是對于下一層次生成的圖像和噪聲來拼接生成,來補充噪聲的信息。

在這里插入圖片描述

生成器

多尺度生成器金字塔:模型包含一個由生成器組成的金字塔 {G0, …, GN},每個生成器 Gn 對應于圖像的一個尺度 xn,其中 xn 是通過因子 rn 對原始圖像 x 進行下采樣得到的。生成器 Gn 的任務是生成與圖像 xn 中的 patch 分布相符的真實圖像樣本。

生成過程:圖像生成從最粗的尺度(GN)開始,并通過每個生成器逐步到達最精細的尺度。在每個尺度上,生成器 Gn 通過與對應尺度的判別器 Dn 進行對抗訓練,學習生成與訓練圖像 xn 中的 patch 區分不出的樣本。

細節添加:在生成過程中,每個生成器不僅生成新的細節,還將前一個尺度的生成圖像 ?xn+1 上采樣到當前尺度后,與當前的噪聲 zn 一起輸入到卷積層中。這個操作確保了每個尺度上的細節添加和圖像的結構細化。

噪聲和圖像合成:每個生成器的輸入包括隨機噪聲 zn 和上采樣后的前一尺度圖像 ?xn+1。生成器通過卷積層進行殘差學習,生成缺失的細節,最終得到當前尺度的圖像輸出 ?xn。

自適應生成大小:由于生成器是全卷積的,它們能夠在測試時生成任意大小和縱橫比的圖像,只需調整噪聲圖的維度。

在這里插入圖片描述

生成器源碼
class GeneratorConcatSkip2CleanAdd(nn.Module):def __init__(self, opt):super(GeneratorConcatSkip2CleanAdd, self).__init__()self.is_cuda = torch.cuda.is_available()  # 判斷是否有 GPUN = opt.nfc  # 初始化卷積層輸出通道數# 定義頭部卷積層,處理輸入圖像self.head = ConvBlock(opt.nc_im, N, opt.ker_size, opt.padd_size, 1)  self.body = nn.Sequential()  # 存儲中間卷積層# 構建中間層for i in range(opt.num_layer - 2):N = int(opt.nfc / pow(2, (i + 1)))  # 每層輸出通道數逐步減少block = ConvBlock(max(2 * N, opt.min_nfc), max(N, opt.min_nfc), opt.ker_size, opt.padd_size, 1)self.body.add_module('block%d' % (i + 1), block)  # 添加到 body 中# 定義尾部卷積層,用于輸出最終圖像self.tail = nn.Sequential(nn.Conv2d(max(N, opt.min_nfc), opt.nc_im, kernel_size=opt.ker_size, stride=1, padding=opt.padd_size),nn.Tanh()  # 使用 Tanh 激活函數輸出圖像)def forward(self, x, y):# 經過頭部卷積層處理輸入 xx = self.head(x)# 通過中間卷積層x = self.body(x)# 通過尾部卷積層生成圖像x = self.tail(x)# 根據 y 和 x 的尺寸差值進行裁剪,確保兩者尺寸相同ind = int((y.shape[2] - x.shape[2]) / 2)y = y[:, :, ind:(y.shape[2] - ind), ind:(y.shape[3] - ind)]# 將生成的圖像與輸入 y 相加return x + y
判別器

判別器與生成器的關系

  • 每個生成器 Gn 都配有一個對應的判別器 Dn,目的是通過對比生成圖像與真實圖像之間的差異,指導生成器改進生成的圖像。
  • 判別器 Dn 的目標是判別每個輸入圖像塊是“真實”圖像塊(來自原始圖像 xn)還是“偽造”圖像塊(由生成器生成的圖像塊)。
  • 損失函數
    • 判別器使用 WGAN-GP 損失(Wasserstein GAN with Gradient Penalty)來訓練,以確保訓練過程的穩定性。通過計算生成樣本和真實圖像樣本在各自圖像塊上的判別結果,最終得出一個平均的判別分數。
    • 判別器的損失不僅針對單個圖像塊,還針對整個圖像進行定義,這有助于學習整個圖像的結構,特別是邊界條件,而不僅僅是關注圖像的局部區域。
判別器源碼
class WDiscriminator(nn.Module):def __init__(self, opt):super(WDiscriminator, self).__init__()self.is_cuda = torch.cuda.is_available()  # 檢查是否有可用的GPUN = int(opt.nfc)  # 初始通道數self.head = ConvBlock(opt.nc_im, N, opt.ker_size, opt.padd_size, 1)  # 第一層卷積塊self.body = nn.Sequential()  # 中間層,包含多個卷積塊for i in range(opt.num_layer - 2):  # 添加多層卷積塊,num_layer指定總層數N = int(opt.nfc / pow(2, (i + 1)))  # 根據層數逐漸減少通道數block = ConvBlock(max(2 * N, opt.min_nfc), max(N, opt.min_nfc), opt.ker_size, opt.padd_size, 1)  # 創建每一層卷積塊self.body.add_module('block%d' % (i + 1), block)  # 添加每一層卷積塊到序列self.tail = nn.Conv2d(max(N, opt.min_nfc), 1, kernel_size=opt.ker_size, stride=1, padding=opt.padd_size)  # 輸出層,1個輸出通道def forward(self, x):x = self.head(x)  # 通過第一層卷積塊x = self.body(x)  # 通過中間層的多個卷積塊x = self.tail(x)  # 通過輸出層return x  # 返回最終的輸出
損失函數

在這里插入圖片描述

在這里插入圖片描述

需要源碼講解的私信我

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71562.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71562.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71562.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Networking Based ISAC Hardware Testbed and Performance Evaluation

文章目錄 Applications and Challenges of Networked SensingCooperation Mechanism in Networked SensingChallenges and Key Enabling Technologies 5G NR Frame Structure Based ISAC ApproachSignals Available for Radio SensingMulti-Dimensiona Resource Optimization S…

2025年主流原型工具測評:墨刀、Axure、Figma、Sketch

2025年主流原型工具測評:墨刀、Axure、Figma、Sketch 要說2025年國內產品經理使用的主流原型設計工具,當然是墨刀、Axure、Figma和Sketch了,但是很多剛入行的產品經理不了解自己適合哪些工具,本文將從核心優勢、局限短板、協作能…

我代表中國受邀在亞馬遜云科技全球云計算大會re:Invent中技術演講

大家好我是小李哥,本名叫李少奕,目前在一家金融行業公司擔任首席云計算工程師。去年5月很榮幸在全球千萬名開發者中被選為了全球亞馬遜云科技認證技術專家(AWS Hero),是近10年來大陸地區僅有的第9名大陸專家。同時作為…

LeetCode 解題思路 12(Hot 100)

解題思路: 定義三個指針: prev(前驅節點)、current(當前節點)、nextNode(臨時保存下一個節點)遍歷鏈表: 每次將 current.next 指向 prev,移動指針直到 curre…

Ubuntu搭建最簡單WEB服務器

安裝apache2 sudo apt install apache2 檢查狀態 $ sudo systemctl status apache2 ● apache2.service - The Apache HTTP ServerLoaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor prese>Active: active (running) since Thu 2025-03-06 09:51:10…

Linux 軟硬鏈接

目錄 軟硬鏈接 軟鏈接 硬鏈接 軟硬鏈接的區別 硬鏈接場景 軟連接場景 軟硬鏈接 軟鏈接 我們可以通過以下命令創建一個文件的軟連接 ln -s mytest softlink-mytest 通過 ls -i -l 命令我們可以看到,軟鏈接文件的inode號與源文件的inode號是不同的&#xff0c…

不同開發語言之for循環的用法、區別總結

一、Objective-C &#xff08;1&#xff09;標準的c風格 for (int i 0; i < 5; i) {NSLog("i %d", i); } &#xff08;2&#xff09;for in循環。 NSArray *array ["apple", "banana", "orange"]; for (NSString *fruit in …

計算機畢設-基于springboot的物業管理系統的設計與實現(附源碼+lw+ppt+開題報告)

博主介紹&#xff1a;?多個項目實戰經驗、多個大型網購商城開發經驗、在某機構指導學員上千名、專注于本行業領域? 技術范圍&#xff1a;Java實戰項目、Python實戰項目、微信小程序/安卓實戰項目、爬蟲大數據實戰項目、Nodejs實戰項目、PHP實戰項目、.NET實戰項目、Golang實戰…

景聯文科技:以精準數據標注賦能AI進化,構筑智能時代數據基石

在人工智能技術席卷全球的浪潮中&#xff0c;高質量數據已成為驅動AI模型進化的核心燃料。作為全球領先的AI數據服務解決方案提供商&#xff0c;景聯文科技深耕數據標注領域多年&#xff0c;以技術為基、以專業為本&#xff0c;致力于為全球客戶提供全場景、高精度、多模態的數…

批量合并 Word 文檔,支持合并成一個 Word,也支持按文件夾合并

我們經常會碰到需要將多個 Word 文檔批量合并成一個 Word 文檔的場景&#xff0c;比如需要合并后打印、合并后方便整理存檔等等。如果是人工的操作&#xff0c;會非常的麻煩。因此我們通常會借助一些批量處理腳本或者尋找批量處理的工具來幫我們實現批量合并 Word 文檔的操作。…

數據安全基石:備份文件的重要性與自動化實踐

在數字化時代&#xff0c;數據已成為企業和個人不可或缺的重要資產。無論是企業的運營數據、客戶資料&#xff0c;還是個人的學習資料、家庭照片&#xff0c;這些數據都承載著巨大的價值。然而&#xff0c;數據的安全問題也日益凸顯&#xff0c;硬件故障、軟件錯誤、人為失誤以…

用IdleHandler來性能優化及原理源碼分析

背景&#xff1a; 經常在做一些app冷啟動速度優化等性能優化工作時候&#xff0c;經常可能會發現有時候需要引入一些第三方sdk&#xff0c;或者庫&#xff0c;這些庫一般會要求我們在onCreate中進行初始化等&#xff0c;但是onCreate屬于生命周期的回調方法&#xff0c;如果on…

SyntaxError: Invalid or unexpected token in JSON at position x

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

04.基于C++實現多線程TCP服務器與客戶端通信

基于C實現多線程TCP服務器與客戶端通信 目錄 一、項目背景與目標二、從零開始理解網絡通信三、相關技術背景知識 1. 守護進程(Daemon Process)2. 線程池(Thread Pool)3. RAII設計模式 四、項目整體結構與邏輯五、核心模塊詳細分析 1. TCP服務器模塊2. 線程池模塊3. 任務處理模…

從0到1入門Linux

一、常用命令 ls 列出目錄內容 cd切換目錄mkdir創建新目錄rm刪除文件或目錄cp復制文件或目錄mv移動或重命名文件和目錄cat查看文件內容grep在文件中查找指定字符串ps查看當前進程狀態top查看內存kill終止進程df -h查看磁盤空間存儲情況iotop -o直接查看比較高的磁盤讀寫程序up…

Nginx負載均衡配置詳解:輕松實現高可用與高性能

在現代Web應用中&#xff0c;負載均衡是確保系統高可用性和高性能的關鍵技術之一。Nginx作為一款高性能的HTTP服務器和反向代理服務器&#xff0c;其負載均衡功能被廣泛應用于各種場景。本文將詳細介紹如何使用Nginx實現負載均衡配置&#xff0c;幫助開發者輕松應對高并發和大流…

使用chroot預安裝軟件到ubuntu22中

1、安裝依賴 # 安裝依賴工具 sudo apt update && sudo apt install -y \ squashfs-tools \ genisoimage \ xorriso \ isolinux \ syslinux-utils \ p7zip-full sudo apt update sudo apt install grub-pc-bin grub-efi-amd64-bin -y # 創建工作目錄 mkdir -p ./custom-…

php代碼審計工具-rips

代碼審計 代碼審計就是檢查所寫的代碼中是否有漏洞&#xff0c;檢查程序的源代碼是否有權限從而被黑客攻擊&#xff0c;同時也檢查了書寫的代碼是否規范。通過自動化的審查和人工審查的方式&#xff0c;逐行檢查源代碼&#xff0c;發現源代碼中安全缺陷所造成的漏洞&#xff0…

Docker參數,以及倉庫搭建

一。Docker的構建參數 注釋&#xff1a; 1.對于CMD&#xff0c;如果不想顯示&#xff0c;而是使用交互界面&#xff1a;docker run -ti --rm --name test2 busybox:v5 sh 2.對于CMD&#xff0c;一個交互界面只可以使用一個&#xff0c;如果想多次使用CMD&#xff0c;則用ENTR…

基于Python Django的人臉識別上課考勤系統(附源碼,部署)

博主介紹&#xff1a;?程序員徐師兄、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;…