text to image(四):《Stackgan》

2023-05-16

        继续介绍文本生成图像的相关工作,本文给出的是2016年12月10日发表于 arXiv 的文章《Stackgan: Text to photo-realistic image synthesis with stacked generative adversarial networks》

        论文地址:https://arxiv.org/pdf/1612.03242v1.pdf

        源码地址:https://github.com/hanzhanggit/StackGAN-Pytorch

        原本想要看一下tensorflow的代码,但是源码要求tensorflow0.12版本,代码也出了很多问题... 改用pytorch代码对模型进行解析。

        个人感觉StackGAN本质上仍然是只是两个cGAN的组合,突破性并不是很大。不过它是第一次在只给定文本的条件下生成真实的256*256的图片。

 

一、相关工作

         在介绍StackGAN前,首先对cGAN(Conditional GAN)进行大致的介绍。在GAN中,损失函数如下所示:

           Conditional GAN的想法是把原始的生成过程变成基于某些额外信息的生成,损失函数变为:

       D 和 G 拟合的分布都变成了条件概率分布。在 CGAN 的工作中,这个额外的 y 信息,是通过在输入层直接拼接样本与 y 信息的向量而实现的。具体使用的 y 信息有 one-hot vector,也有图像(也就是基于另一个图像去生成)。

二、基本思想

       StackGAN本质上就是两个Conditional GAN的堆叠。如果我们没办法一次生成高分辨率又 plausible 的图片,那么可以分两次生成。第一阶段的Conditional GAN利用文本描述提取出的嵌入向量(text embedding)粗略勾画物体主要的形状和颜色,生成低分辨率的图片。第二阶段的对抗生成网络将第一阶段的低分辨率图片和文本描述提取出的嵌入向量(text embedding)作为输入,生成细节丰富的高分辨率图片。

       关于词嵌入向量可以参考https://blog.csdn.net/zlrai5895/article/details/81255243部分内容。StackGAN的模型结构图如下:

      

  • 三、数据集介绍

本次实验使用的数据集是COCO2014,关于COCO数据集的介绍可参考https://blog.csdn.net/zlrai5895/article/details/81255243部分内容。

四、模型结构

还是先上结构图:

 

        1、文本编码器

       我们使用预训练好的char-CNN-RNN文本编码器https://github.com/reedscot/icml2016中给出了训练该编码器的网络源码以及预训练好的编码器。我们并不对此进行详细介绍。直接使用文本编码器生成的COCO数据集嵌入向量text_embedding

         2、第一阶段

        由结构图可见,对于获得的text_embeddingstackGAN 没有直接将 embedding 作为 condition,而是用embedding 接了一个 FC 层得到了一个正态分布的均值和方差,然后从这个正态分布中 sample 出来要用的 condition。最终的conditionc0)是

                                                                   

       意为element_wise multiply. 之所以这样做的原因是,embedding 通常比较高维(1024),而相对这个维度来说, text 的数量其实很少,如果将 embedding 直接作为 condition,那么这个 latent variable 在 latent space 里就比较稀疏,这对我们的训练不利。(实际上降了维,在处理后1024维降到了128维)。为了避免过拟合,generator 的 loss 里面加入了对这个分布的正则化:

                                                 

       得到的c与服从标准正态分布z连接起来,作为第一阶段generator的输入。

       generator 使用的并不是常用的 Deconv ,而是若干个上采样加保持大小不变的 3x3 的 conv 的组合,这是最近提出的一种避免 Deconv 棋盘效应的上采样方法。discriminator 是若干步长为 2 的 conv ,再与 resize 的 embedding 合起来,接一个 FC。

       第一阶段的输出是64*64的低分辨率图像。以batch_size=16为例,部分代码如下:

def forward(self, text_embedding, noise):
        print(text_embedding.shape,noise.shape)#[16,1024]   [16,100]
        c_code, mu, logvar = self.ca_net(text_embedding)
        print(noise.shape,c_code.shape) # (torch.Size([16, 100]), torch.Size([16, 128]))
        z_c_code = torch.cat((noise, c_code), 1) # 16x228
        h_code = self.fc(z_c_code)# torch.Size([16, 16384])
 

        h_code = h_code.view(-1, self.gf_dim, 4, 4)  #torch.Size([16, 1024, 4, 4])
        h_code = self.upsample1(h_code) #torch.Size([16, 512, 8, 8])
        h_code = self.upsample2(h_code)#torch.Size([16, 256, 16, 16])
        h_code = self.upsample3(h_code)#torch.Size([16, 128, 32, 32])
        h_code = self.upsample4(h_code)#torch.Size([16, 64, 64, 64])
        # state size 3 x 64 x 64
        fake_img = self.img(h_code)##torch.Size([16, 3, 64, 64])
        return None, fake_img, mu, logvar

其中 有关self.fc的定义:

ngf = self.gf_dim     #1024
        # TEXT.DIMENSION -> GAN.CONDITION_DIM
        self.ca_net = CA_NET()

        # -> ngf x 4 x 4
        self.fc = nn.Sequential(
            nn.Linear(ninput, ngf * 4 * 4, bias=False),
            nn.BatchNorm1d(ngf * 4 * 4),
            nn.ReLU(True))

       3、第二阶段

        第二阶段的 generator 并没有噪声输入,而是将第一阶段生成的低分辨率图像下采样以后与replicated的c0连接起来作为输入。经过若干 residual blocks ,再进行与第一阶段相同的上采样过程得到图片。

         第二阶段的 discriminator 与第一阶段大体相同。

         部分代码如下:

def forward(self, text_embedding, noise):
        _, stage1_img, _, _ = self.STAGE1_G(text_embedding, noise)
                                        #fake_img [16,3,64,64]
        stage1_img = stage1_img.detach()#返回一个新的 从当前图中分离的 Variable。 返回的 
                                        # Variable 永远不会需要梯度 
        encoded_img = self.encoder(stage1_img) #[16,256,512] output:[16,512,16,16]

        c_code, mu, logvar = self.ca_net(text_embedding)# 输入torch.Size([16, 1024]) 
                                                        #输出 torch.Size([16, 128]))
        c_code = c_code.view(-1, self.ef_dim, 1, 1)#output:[16,128,1,1]
        c_code = c_code.repeat(1, 1, 16, 16)  #output: [16,128,16,16]  replicated
        i_c_code = torch.cat([encoded_img, c_code], 1) #output:[16,640,16,16]  cat
        h_code = self.hr_joint(i_c_code)
                                # input:[16,128+128*4,16,16] output:[16,512,16,16]
        h_code = self.residual(h_code)  #output:[16,512,16,16]

        h_code = self.upsample1(h_code)#[16,256,32,32]
        h_code = self.upsample2(h_code)#[16,128,64,64]
        h_code = self.upsample3(h_code)#[16,64,128,128]
        h_code = self.upsample4(h_code)#[16,32,256,256]

        fake_img = self.img(h_code)#[16,3,256,256]
        return stage1_img, fake_img, mu, logvar

其中self.hr_joint和self.residual代码如下:

 self.hr_joint = nn.Sequential(
            conv3x3(self.ef_dim + ngf * 4, ngf * 4),#  output:[16,128+128*4,128*4]
            nn.BatchNorm2d(ngf * 4),
            nn.ReLU(True))
self.residual = self._make_layer(ResBlock, ngf * 4)


 def _make_layer(self, block, channel_num):
        layers = []
        for i in range(cfg.GAN.R_NUM):
            layers.append(block(channel_num))
        return nn.Sequential(*layers)

class ResBlock(nn.Module):
    def __init__(self, channel_num):
        super(ResBlock, self).__init__()
        self.block = nn.Sequential(
            conv3x3(channel_num, channel_num),
            nn.BatchNorm2d(channel_num),
            nn.ReLU(True),
            conv3x3(channel_num, channel_num),
            nn.BatchNorm2d(channel_num))
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        residual = x
        out = self.block(x)
        out += residual
        out = self.relu(out)
        return out

 

五、训练

第一阶段的损失函数:

第二阶段的损失函数:

  代表了真实的图像

模型结构图中可以注意到的是,text_bedding 也是最后鉴别器的输入之一。在训练期间,鉴别器将真实图片+对应的text_bedding作为正样本对。负样本对包括两种:真实的图片+不配套的text_bedding、生成的图片+对应的text_bedding。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

text to image(四):《Stackgan》 的相关文章

  • 数学/算法使图像适合屏幕保留纵横比

    我需要数学 算法方面的帮助来拍摄已知尺寸的图像并适合两个屏幕尺寸之一 720 x 480 或 1280 x 1024 图像尺寸来自 XML 文件 但这些尺寸是 Web 尺寸 我还从 XML 中选择了一些图像 这些图像的分辨率可能比 Web
  • 使用 PHP 中的 GD 库在图像上绘图

    我创建了一个代码来生成随机图案图像 它创建一个具有给定宽度和高度的图像 并用 40x40 像素的小矩形填充它 这是我的代码
  • 如何在Django中显示内存中的图片?

    我知道如何将图片显示为内存中的页面 如下所示 import cStringIO mStream cStringIO StringIO picBin return HttpResponse mStream getvalue image jpg
  • 如何用python创建透明的径向渐变?

    我正在尝试创建一个渐变到清晰背景的径向渐变 我的目标是创建这个渐变并将其作为背景粘贴到另一个图像 到目前为止 我已经能够创建圆形渐变 但它不透明 我在 stackoverflow 中找到了以下代码 imgsize 650 650 image
  • Laravel 上传前如何压缩图像?

    我正在制作一个图片库网站 用户可以在其中上传任何图像 它们将显示在前端 我需要在不影响图像质量的情况下压缩图像 以减小图像大小 以便页面加载速度不会影响那么大 我使用以下代码来上传图像 rules array file gt require
  • 您如何在 Android 上处理超高 MP 相机(和图像)? - “画布:尝试绘制太大的位图”

    我有一个活动 用户可以像这样打开相机 getPictureUri createImageFromFile true let photoUri it openCameraActivity REQUEST IMAGE CAPTURE it ph
  • Java中读取图像文件的方式有什么区别?

    在java中读取图像文件有多种方法 例如BufferedImage and ImageIcon仅举几例 我想知道这些情况有什么区别 它们是否依赖于上下文 在特定情况下只能使用其中一个 阅读所选图像的最佳方式是什么JFileChooser由用
  • Python 的高效图像缩略图控制?

    Python GUI 应用程序显示大量缩略图的最佳选择是什么 例如10000 或更多 出于性能原因 此类缩略图控件必须支持虚拟项目 即仅请求应用程序当前对用户可见的那些缩略图 In wxPython http wxpython org 您可
  • WPF 中图像的淡入淡出

    当我更改幻灯片放映等图像源时 如何实现淡入和淡出图像 我的图像从本地和网络加载 并且其数量是可变的 谢谢 您可以编写一个扩展方法 通过动画显示图像来淡出图像Opacity属性设置为 0 然后设置Source属性并最终将不透明度动画回到 1
  • 如何通过 md5 比较图像?

    该方法是否比较图像的像素值 我猜它不会起作用 因为它们的尺寸彼此不同 但如果它们相同但格式不同怎么办 例如 我截图并保存为 jpg另一个并保存为 gif MD5哈希是实际的二进制数据 因此不同的格式将具有完全不同的二进制数据 因此 要使 M
  • 图像处理方面的空间和时间表征有什么区别?

    我是学习图像处理的初学者 我对空间和时间表征的概念有点困惑 那么 对于空间表征来说 是不是像一张二维地图 包含了一些关于地图的统计信息呢 就时间特征而言 值是相对于时间的吗 这意味着什么以及我们为何关心 谢谢 当您在不同时间拍摄一系列图像时
  • 模糊匹配两个字符串 ur r

    我有两个向量 每个向量都包含一系列字符串 例如 V1 c pen document folder warn V2 c pens copy folder warning 我需要找出哪两个最匹配 我直接使用编辑距离 但这还不够好 就我而言 钢笔
  • jQuery 选择首屏上方的图像

    我目前正在使用 jQuery 延迟加载插件来加载图像 我正在使用 javascript 来替换 src 和 data original 属性 这会导致负载上出现轻微闪烁 我想知道是否有一种方法可以使用 jquery 仅选择折叠下方或折叠上方
  • JavaFX HTMLEditor - 插入图像功能

    我正在使用 JavaFX 集成的 HTMLEditor 它具有的所有功能都很好 但我还需要具有在 HTML 文本中插入图像的功能 你知道我可以使用的一些来源吗 或者其他一些可以在 JavaFX 中使用的 HTML WYSIWYG 编辑器并且
  • 使用 Opera 在 JavaScript 中更新图像源

    我定期使用 Image 对象加载远程图像 以便稍后在画布上绘制 Image 对象仅在 JS 中创建 它不存在于 DOM 中 该代码在 Chrome 和 Firefox 上运行良好 在 Opera 中 问题在于 每当修改图像源时 浏览器似乎总
  • 从 mx:Image 复制位图数据

    如何从 mx image 组件复制位图数据 我需要在应用程序的多个屏幕中显示相同的图像 并且不想多次下载该图像 我可以只使用 urlrequest 将图像下载为位图并复制它 但我喜欢只设置图像组件的源的方式 Image延伸SWFLoader
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • 控制 HTML 中的图像加载顺序

    有没有办法控制网页上图像的加载顺序 我正在考虑尝试通过首先加载轻量级 加载 图形来模拟预加载器 有任何想法吗 Thanks 使用 Javascript 并填充图像src属性稍后 这 告诉浏览器链接到页面上的 URL 因此不会向服务器发送请求
  • 帮助将二进制图像数据从 SQL Server 读取到 PHP 中

    我似乎无法找到将二进制数据从 SQL 服务器读取到 PHP 的方法 我正在开发一个项目 需要能够将图像直接存储在 SQL 表中 而不是文件系统上 目前 我一直在使用这样的查询 插入 myTable 文档 选择 从 OPENROWSET BU

随机推荐

  • 记一次阿里云服务器被攻击导致无法ssh登陆(root也不行)

    服务器被攻击导致无法ssh 博主早上登陆准备做一些骚操作 xff0c 结果突然发现ssh不上服务器 xff0c 并且收到短信说服务器被挖矿病毒攻击 xff0c 然后服务器就斯密达了 xff0c 发现报错如下 xff1a Permission
  • Python geometry_msgs.msg.PoseStamped() Examples

    https www programcreek com python example 70252 geometry msgs msg PoseStamped
  • github 下载历史版本的代码

    操作如下所示 xff1a 根据历史commit xff0c 找到历史版本 xff0c 然后下载
  • 欢迎使用CSDN-markdown编辑器

    转 Eclipse下tomcat输出路径配置 标签 xff1a tomcateclipseserverpath 2012 07 12 16 09 7256人阅读 评论 0 收藏 举报 分类 xff1a eclipse tomcat xff0
  • 那根你想顺着去打人的网线是怎么制作的?

    更多精彩关注微信公众号 xff1a 信息技术员 现代社会大家都很浮躁 xff0c 总有人嚷嚷着要顺着网线去打人 xff0c 也不问问自己会做网线么 xff1f 本文手把手教你怎么制作一根网线 一 准备工作 1 网线一根 2 网线钳一把 3
  • Linux下动态库使用小结

    1 xff0e 静态库和动态库的基本概念 静态库 xff0c 是在可执行程序连接时就已经加入到执行码中 xff0c 在物理上成为执行程序的一部分 xff1b 使用静态库编译的程序运行时无需该库文件支持 xff0c 哪里都可以用 xff0c
  • 傻瓜式教学——手把手教你电脑三种方式连接打印机

    如何判断打印机和电脑的连接方式 xff1f 电脑连接打印机有三种方式情况 xff0c 一是通过USB直连 xff0c 二是通过网络连接 xff0c 三是通过共享连接 可通过下面方法判断连接方式 如果通过 口和电脑连接 xff0c 则是USB
  • 服务器为什么能够稳定可靠运行?

    前几天github服务器故障 xff0c 传言服务器被偷走一度上了热搜 xff0c 后证实传言是P图 xff08 下图为假 xff09 但确实每次大型互联网公司服务器故障都引发了人们的广泛讨论 其中还有不少上了热搜 那么服务器到底是何方神圣
  • Yanmar(洋马)发动机SPN-FMI代码在仪表显示

    分享一个自己在仪表上显示洋马发动机SPN FMI代码过程的记录 1 问 xff1a SPN和FMI什么意思 xff1f 答 xff1a 见SAE J1939 73 5 6 诊断故障码定义 诊断故障代码 xff08 DTC xff09 由4
  • APM调试,地面站随手记

    最近随公司调试4轴和8轴APM多旋翼 xff0c 本文将心得记录下来 xff0c 以备自己和他人查阅 xff0c 水平有限 xff0c 如有错误 xff0c 请不吝赐教 本文不定期更新 xff0c 转载请注明出处 2016 9 8 一 自检
  • 解决同一局域网下不同网段能ping通但是ssh不上服务器的情况

    一 xff1a 问题描述 xff1a 在公司的局域网网络环境下有四个ip网段 xff0c 分别是192 168 1 0 2 0 3 0 5 0 xff0c 服务器用的是5 0网段的 xff0c 而个人电脑用的则是1 0网段的 xff0c 在
  • STM32单片机电源端并联电容的重要性

    如图 xff0c 笔者用TQFP 32 100PIN 0 55MM转直插的转接板焊了一个STM32F207VET6的板子 板上引出了SWD调试接口 xff08 仅占用PA13和PA14 xff09 xff0c USART1串口引脚 xff0
  • Linux信号量常用操作表

    以下函数失败时均返回 1 xff0c 所在头文件为 include lt sys sem h gt 创建用于区分信号量的键值key xff1a key t key 61 ftok 34 foo bar 34 39 a 39 xff0c 第一
  • 一文加强对React的记忆(2021 年 6 月更新),收藏再也不用查看文档、教程了

    我不经常使用 React xff0c 所以每当我需要在 React 中做最小的事情时 xff0c 我都必须查看文档 教程或在论坛上发布问题 这就是我决定做这个记忆辅助工具的原因 xff0c 鉴于我的记忆力不是那么好 xff0c 我想为什么不
  • 13.实现鼠标中断处理

    简介 上节实现了对键盘中断服务子程序的处理和修改优化了中断程序 xff0c 但只是简单的在中断服务子程序中记录断码或通码 xff0c 缓冲区使用效率不高 目标 实现鼠标中断处理 优化中断缓存 pc中8259A中断控制器连接模型如下 1 鼠标
  • 【Linux】在Linux上安装VNC

    有幸能够亲自在服务器上面操作一下 xff0c 这篇博客来说一说 xff0c 如何在Linux上安装VNC 首先要知道的是 xff0c VNC是什么 VNC xff08 Virtual Network Computing xff09 xff0
  • win10开启自带的手机投屏功能方式

    本篇文章主要讲解win10开启自带的手机投屏方式 日期 xff1a 2023年1月15日 作者 xff1a 任聪聪 开启后效果 点击连接 打开连接或通过手机其他网络进行连接 连接步骤 xff1a 步骤一 打开手机端的wifi网络设置 xff
  • TensorFlow学习(三):tf.scatter_nd函数

    scatter nd indices updates shape name 61 None 根据indices将updates散布到新的 xff08 初始为零 xff09 张量 根据索引对给定shape的零张量中的单个值或切片应用稀疏upd
  • text to image(八):《Image Generation from Scene Graphs》

    最近在翻阅文本生成图像的相关工作 xff0c 目前比较新的有突破性的工作是李飞飞工作团队18年cvpr发表的 Image Generation from Scene Graphs 论文地址 xff1a https arxiv org abs
  • text to image(四):《Stackgan》

    继续介绍文本生成图像的相关工作 xff0c 本文给出的是2016年12月10日发表于 arXiv 的文章 Stackgan Text to photo realistic image synthesis with stacked gener