图像生成-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()  # 判断是否有 GPU
        N = 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):
        # 经过头部卷积层处理输入 x
        x = 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()  # 检查是否有可用的GPU
        N = 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  # 返回最终的输出

损失函数

在这里插入图片描述

在这里插入图片描述

需要源码讲解的私信我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/981364.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指纹细节提取(Matlab实现)

指纹细节提取概述指纹作为人体生物特征识别领域中应用最为广泛的特征之一,具有独特性、稳定性和便利性。指纹细节特征对于指纹识别的准确性和可靠性起着关键作用。指纹细节提取,即从指纹图像中精确地提取出能够表征指纹唯一性的关键特征点,是…

泵吸式激光可燃气体监测仪:快速精准守护燃气管网安全

在城市化进程加速的今天,燃气泄漏、地下管网老化等问题时刻威胁着城市安全。如何实现精准、高效的可燃气体监测,守护“城市生命线”,成为新型基础设施建设的核心课题。泵吸式激光可燃气体监测仪,以创新科技赋能安全监测&#xff0…

HTML label 标签使用

点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签&#xff0c;可以使表单更加友好和易于使用&#xff0c;同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…

数字万用表的使用教程

福禄克经济型数字万用表前面板按键功能介绍示意图 1. 万用表简单介绍 万用表是一种带有整流器的、可以测量交、直流电流、电压及电阻等多种电学参量的磁电式仪表。分为数字万用表&#xff0c;钳形万用表&#xff0c; &#xff08;1&#xff09;表笔分为红、黑二只。使用时黑色…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

2025年AI PPT工具精选:让演示文稿更智能、更高效

&#x1f4a1; 做PPT太难&#xff1f;没灵感&#xff1f;排版不好看&#xff1f;别怕&#xff0c;AI已经帮你安排好了&#xff01; 想知道2025年最值得推荐的AI PPT工具是哪款&#xff1f;答案就是——秒出PPT&#xff01;&#x1f680; 不仅能一键生成PPT&#xff0c;还能自…

qt-C++笔记之ubuntu22.04源码安装Qt6.8.2

qt-C笔记之ubuntu22.04源码安装Qt6.8.2 code review! 文章目录 qt-C笔记之ubuntu22.04源码安装Qt6.8.21.作者环境&#xff1a;ubuntu22.04、cmake202.安装3.关联已安装的 Qt6 到 Qt Creator4.附&#xff1a;ubuntu18.0的处理&#xff0c;可尝试&#xff0c;作者没有遇到这个问题…

单例模式(线程案例)

单例模式可以分为两种&#xff1a;1.饿汉模式 2.懒汉模式 一.饿汉模式 //饿汉模式&#x1f447; class MySingleTon{//因为这是一个静态成员变量&#xff0c;在类加载的时候&#xff0c;就创建了private static MySingleTon mySingleTon new MySingleTon();//创建一个静…

基于Matlab的多目标粒子群优化

在复杂系统的设计、决策与优化问题中&#xff0c;常常需要同时兼顾多个相互冲突的目标&#xff0c;多目标粒子群优化&#xff08;MOPSO&#xff09;算法应运而生&#xff0c;作为群体智能优化算法家族中的重要成员&#xff0c;它为解决此类棘手难题提供了高效且富有创新性的解决…

(2025年)工会考试该如何高效备考?有学习方法吗?

工会考试备考文章 工会考试高效备考指南 工会在维护职工权益、促进企业和谐发展中扮演着重要角色&#xff0c;工会考试则是选拔优秀工会工作者的关键途径。面对工会考试涉及的法律法规、组织管理以及维权服务等多方面知识&#xff0c;掌握科学备考方法是成功的关键。 法律法规是…

《机器学习数学基础》补充资料:向量范数

《机器学习数学基础》第1章1.5.3节介绍了向量范数的基本定义。 本文在上述基础上&#xff0c;介绍向量范数的有关性质。 注意&#xff1a; 以下均在欧几里得空间讨论&#xff0c;即欧氏范数。 1. 性质 实&#xff08;或复&#xff09;向量 x \pmb{x} x &#xff0c;范数 ∥…

Unity NGUI新手向几个问题记录

1.点Button没反应 制作Button组件时&#xff0c;不光要挂载Button脚本&#xff0c;还有挂载BoxCollider BoxCollider 接收事件 2.Button点击事件的增加与删除 使用.onClick.add增加事件&#xff0c;使用.onClick.Remove,.onClick.RemoveAt,onClick.RemoveRang,onClick.Clear移…

servlet tomcat

在spring-mvc demo程序运行到DispatcherServlet的mvc处理 一文中&#xff0c;我们实践了浏览器输入一个请求&#xff0c;然后到SpringMvc的DispatcherServlet处理的整个流程. 设计上这些都是tomcat servlet的处理 那么究竟这是怎么到DispatcherServlet处理的&#xff0c;本文将…

UniApp 中封装 HTTP 请求与 Token 管理(附Demo)

目录 1. 基本知识2. Demo3. 拓展 1. 基本知识 从实战代码中学习&#xff0c;上述实战代码来源&#xff1a;芋道源码/yudao-mall-uniapp 该代码中&#xff0c;通过自定义 request 函数对 HTTP 请求进行了统一管理&#xff0c;并且结合了 Token 认证机制 请求封装原理&#xff…

【音视频】ffmpeg命令分类查询

一、ffmpeg命令分类查询 -version&#xff1a;显示版本 ffmpeg -version-buildconf&#xff1a;显示编译配置&#xff0c;这里指的是你编译好的ffmpeg的选项 ffmpeg -buildconf-formats:显示可用格式&#xff08;muxersdemuxers&#xff09;&#xff0c;复用器和解复用器&am…

基于Windows11的DockerDesktop安装和布署方法简介

基于Windows11的DockerDesktop安装和布署方法简介 一、下载安装Docker docker 下载地址 https://www.docker.com/ Download Docker Desktop 选择Download for Winodws AMD64下载Docker Desktop Installer.exe 双点击 Docker Desktop Installer.exe 进行安装 测试Docker安装是…

C++发展

目录 ​编辑C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&a…

爬虫Incapsula reese84加密案例:Etihad航空

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 1.js运行 atob(‘aHR0cHM6Ly93d3cuZXRpaGFkLmNvbS96aC1jbi8=’) 拿到网址,F12打开调试工具,随便搜索航班,切换到network搜索一个时间点可以找…

【分享】网间数据摆渡系统,如何打破传输瓶颈,实现安全流转?

在数字化浪潮中&#xff0c;企业对数据安全愈发重视&#xff0c;网络隔离成为保护核心数据的重要手段。内外网隔离、办公网与研发网隔离等措施&#xff0c;虽为数据筑牢了防线&#xff0c;却也给数据传输带来了诸多难题。传统的数据传输方式在安全性、效率、管理等方面暴露出明…

uploadlabs经验总结

目录 一、基础上传漏洞&#xff08;太过简单目前环境不可能存在&#xff09; 1、抓包然后改后缀进行绕过 2、抓包然后改上传文件类型进行绕过 3、改后缀大小写绕过&#xff0c;以及收尾加空格&#xff0c;加::$DATA,加点等等 4、黑名单不完整绕过&#xff0c;复习后缀绕过&…