text to image(六):《AttnGAN》

2023-05-16

继续介绍文本生成图像的工作,本文给出的是CVPR 2018的文章《AttnGAN: Fine-Grained Text to Image Generation with Attentional Generative Adversarial Networks》。它是StackGAN++的后续工作。

论文地址:https://arxiv.org/abs/1711.10485

源码地址:https://github.com/taoxugit/AttnGAN

 

一、相关工作

GAN的相关理解:https://blog.csdn.net/zlrai5895/article/details/80648898

前作StackGAN的工作:http://blog.csdn.net/zlrai5895/article/details/81292167

前作StackGAN++的工作:https://blog.csdn.net/zlrai5895/article/details/81320447

二、基本思想

通过引入attentional generative network,AttnGAN可以通过关注自然语言描述中的相关单词来合成图像不同子区域的细粒度细节。此外,提出了一种deep attentional multimodal similarity model来计算细粒度图像-文本匹配损失,用于生成器的训练。

它首次表明 the layered attentional GAN 能够自动选择单词级别的condition来生成图像的不同部分。

三、 数据集

本次实验使用的数据集是加利福尼亚理工学院鸟类数据库-2011(CUB_200_2011)。

四、模型结构:


整个模型结构包括两部分

1 : attentional generative network

首先是使用text_encoder的得到sentence features 和word features.

首先是sentence features(sentence embedding)提取condition ,然后与z结合产生低分辨率的图像以及对应的图像特征h0.

 每一层低分辨图像的特征被用来生成下一层的高分辨图像特征.过程如下:

word feature(e,大小为D*Th0 (大小为D’*N)通过attention model ,输出大小为D’*N的张量

h1再进行下一层的操作.

 

所提出的AttnGAN的架构。 每个注意模型自动检索用于生成图像的不同子区域的条件(即,最相关的单词矢量); DAMSM为生成网络提供了细粒度的图像文本匹配损失。仍然以batch_size=2为例,配合代码对模型架构进行解析。首先载入第一个批次的数据:
 

 imgs, captions, cap_lens, class_ids, keys = prepare_data(data)
#imgs[0]:[2,3,64,64]  imgs[1]:[2,3,128,128]  imgs[2]:[2,3,256,256]
#captions:[2,18]   cap_lens:[2]  18,14   class_ids: [2] 87,160   
#[u'087.Mallard/Mallard_0082_75954', u'160.Black_throated_Blue_Warbler/Black_Throated_Blue_Warbler_0027_104004'] 

可以看到相关的信息。一共两句话,id分别是87,160,每句话对应了三个尺度的图像。然后初始化语言模型的第一个隐藏态,调用text_encoder进行编码。

hidden = text_encoder.init_hidden(batch_size)
                # words_embs: batch_size x nef x seq_len
                # sent_emb: batch_size x nef
words_embs, sent_emb = text_encoder(captions, cap_lens, hidden)

1、text_encoder

text_encoder = RNN_ENCODER(self.n_words, nhidden=cfg.TEXT.EMBEDDING_DIM)
#self.n_words:5450  nhidden:256


class RNN_ENCODER(nn.Module):
    def __init__(self, ntoken, ninput=300, drop_prob=0.5,
                 nhidden=128, nlayers=1, bidirectional=True):
        super(RNN_ENCODER, self).__init__()
        self.n_steps = cfg.TEXT.WORDS_NUM  #18
        self.ntoken = ntoken  # size of the dictionary 5450
        self.ninput = ninput  # size of each embedding vector 300
        self.drop_prob = drop_prob  # probability of an element to be zeroed 0.5
        self.nlayers = nlayers  # Number of recurrent layers
        self.bidirectional = bidirectional   #True
        self.rnn_type = cfg.RNN_TYPE
        if bidirectional:
            self.num_directions = 2   #双向编码
        else:
            self.num_directions = 1
        # number of features in the hidden state
        self.nhidden = nhidden // self.num_directions  #128

        self.define_module()
        self.init_weights()


    def forward(self, captions, cap_lens, hidden, mask=None):
        # input: torch.LongTensor of size batch x n_steps
        # --> emb: batch x n_steps x ninput
        emb = self.drop(self.encoder(captions))#captions:[2,18]  
        #转化为嵌入向量 emb:[2,18,300]
        #一共5040个单词 每每个单词用300维的向量表示
        # Returns: a PackedSequence object
        cap_lens = cap_lens.data.tolist()   #[18,12]
        emb = pack_padded_sequence(emb, cap_lens, batch_first=True)
        # #hidden and memory (num_layers * num_directions, batch, hidden_size):
        # tensor containing the initial hidden state for each element in batch.
        # #output (batch, seq_len, hidden_size * num_directions)
        # #or a PackedSequence object:
        # tensor containing output features (h_t) from the last layer of RNN
        output, hidden = self.rnn(emb, hidden)
        # PackedSequence object
        # --> (batch, seq_len, hidden_size * num_directions)
        output = pad_packed_sequence(output, batch_first=True)[0]
        # output = self.drop(output)
        # --> batch x hidden_size*num_directions x seq_len
        words_emb = output.transpose(1, 2)
        # --> batch x num_directions*hidden_size
        if self.rnn_type == 'LSTM':
            sent_emb = hidden[0].transpose(0, 1).contiguous()
        else:
            sent_emb = hidden.transpose(0, 1).contiguous()
        sent_emb = sent_emb.view(-1, self.nhidden * self.num_directions)
        return words_emb, sent_emb





得到的word_emb为[2,256,18]   sent_emb:[2,256]

num_words = words_embs.size(2) #每句话18个词

2、image_encoder

它只在最后一个生成器上被使用,作者尝试把它用在每一个生成器上,但是效果并不好,而且增加了计算成本.

image_encoder用于最后提取256*256图像的图像特征,输入是256*256的图像,输出是2048维的向量。采用的是inceptionv3的网络架构。如下所示:

image_encoder = CNN_ENCODER(cfg.TEXT.EMBEDDING_DIM)# 256

self.emb_features = conv1x1(768, self.nef)  #self.enf:256
self.emb_cnn_code = nn.Linear(2048, self.nef)


def forward(self, x):
        features = None
        # --> fixed-size input: batch x 3 x 299 x 299
        x = nn.Upsample(size=(299, 299), mode='bilinear')(x)
        # 299 x 299 x 3
        x = self.Conv2d_1a_3x3(x)
        # 149 x 149 x 32
        x = self.Conv2d_2a_3x3(x)
        # 147 x 147 x 32
        x = self.Conv2d_2b_3x3(x)
        # 147 x 147 x 64
        x = F.max_pool2d(x, kernel_size=3, stride=2)
        # 73 x 73 x 64
        x = self.Conv2d_3b_1x1(x)
        # 73 x 73 x 80
        x = self.Conv2d_4a_3x3(x)
        # 71 x 71 x 192

        x = F.max_pool2d(x, kernel_size=3, stride=2)
        # 35 x 35 x 192
        x = self.Mixed_5b(x)
        # 35 x 35 x 256
        x = self.Mixed_5c(x)
        # 35 x 35 x 288
        x = self.Mixed_5d(x)
        # 35 x 35 x 288

        x = self.Mixed_6a(x)
        # 17 x 17 x 768
        x = self.Mixed_6b(x)
        # 17 x 17 x 768
        x = self.Mixed_6c(x)
        # 17 x 17 x 768
        x = self.Mixed_6d(x)
        # 17 x 17 x 768
        x = self.Mixed_6e(x)
        # 17 x 17 x 768

        # image region features
        features = x
        # 17 x 17 x 768

        x = self.Mixed_7a(x)
        # 8 x 8 x 1280
        x = self.Mixed_7b(x)
        # 8 x 8 x 2048
        x = self.Mixed_7c(x)
        # 8 x 8 x 2048
        x = F.avg_pool2d(x, kernel_size=8)
        # 1 x 1 x 2048
        # x = F.dropout(x, training=self.training)
        # 1 x 1 x 2048
        x = x.view(x.size(0), -1)
        # 2048

        # global image features
        cnn_code = self.emb_cnn_code(x)
        # 512
        if features is not None:
            features = self.emb_features(features)
        return features, cnn_code

3、生成器网络

第一个生成器与StackGAN的第一个生成器相同,后面的不同。

(1)第一个生成器

输入sent_emb,得到[2,32,64,64]的h_code1和[2,3,64,64]的fake_img1。(这时候还没用到word embedding)

c_code, mu, logvar = self.ca_net(sent_emb)  #由sentence_embeeding生成condition

if cfg.TREE.BRANCH_NUM > 0:
    h_code1 = self.h_net1(z_code, c_code)#z+c------h0
    fake_img1 = self.img_net1(h_code1)   #h0---fake_img1
    fake_imgs.append(fake_img1)  #和stackgan++类似
if cfg.TREE.BRANCH_NUM > 0:
    self.h_net1 = INIT_STAGE_G(ngf * 16, ncf)
    self.img_net1 = GET_IMAGE_G(ngf)

class INIT_STAGE_G(nn.Module):  #可以看出  和stackgan的第一个生成器类似
    def forward(self, z_code, c_code):
        """
        :param z_code: batch x cfg.GAN.Z_DIM
        :param c_code: batch x cfg.TEXT.EMBEDDING_DIM
        :return: batch x ngf/16 x 64 x 64
        """
        c_z_code = torch.cat((c_code, z_code), 1)
        # state size ngf x 4 x 4
        out_code = self.fc(c_z_code)
        out_code = out_code.view(-1, self.gf_dim, 4, 4)
        # state size ngf/3 x 8 x 8
        out_code = self.upsample1(out_code)
        # state size ngf/4 x 16 x 16
        out_code = self.upsample2(out_code)
        # state size ngf/8 x 32 x 32
        out_code32 = self.upsample3(out_code)
        # state size ngf/16 x 64 x 64
        out_code64 = self.upsample4(out_code32)

        return out_code64


class GET_IMAGE_G(nn.Module):
    def __init__(self, ngf):
        super(GET_IMAGE_G, self).__init__()
        self.gf_dim = ngf  #32
        self.img = nn.Sequential(
            conv3x3(ngf, 3),
            nn.Tanh()
        )

    def forward(self, h_code):
        out_img = self.img(h_code)
        return out_img

(2)后面的生成器

我们只给出第二个生成器的部分,其他生成器与它类似。输入上一层的h_code以及c_code,word_embs,mask.mask是个啥不知道,在论文和源码中均未找到解释。大小为[2,18].返回[2,32,128,128]的h_code2和[2,18,64,64]的attn。

if cfg.TREE.BRANCH_NUM > 1:
            h_code2, att1 = self.h_net2(h_code1, c_code, word_embs, mask)                                 #att1:
                  #h_code2:[2,32,128,128]
            fake_img2 = self.img_net2(h_code2)  #[2, 3, 128, 128]
            fake_imgs.append(fake_img2)
            if att1 is not None:
                att_maps.append(att1)
if cfg.TREE.BRANCH_NUM > 1:
    self.h_net2 = NEXT_STAGE_G(ngf, nef, ncf)
    self.img_net2 = GET_IMAGE_G(ngf)

class NEXT_STAGE_G(nn.Module):
    def __init__(self, ngf, nef, ncf):
        super(NEXT_STAGE_G, self).__init__()
        self.gf_dim = ngf
        self.ef_dim = nef
        self.cf_dim = ncf
        self.num_residual = cfg.GAN.R_NUM
        self.define_module()

    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)

    def define_module(self):
        ngf = self.gf_dim
        self.att = ATT_NET(ngf, self.ef_dim)
        self.residual = self._make_layer(ResBlock, ngf * 2)
        self.upsample = upBlock(ngf * 2, ngf)

    def forward(self, h_code, c_code, word_embs, mask):
        """
            h_code1(query):  batch x idf x ih x iw (queryL=ihxiw)  [2,32,64,64]
            word_embs(context): batch x cdf x sourceL (sourceL=seq_len)  [2,256,18] 
            c_code1: batch x idf x queryL    [2,100]
            att1: batch x sourceL x queryL
        """
        self.att.applyMask(mask)  #mask:[2,18]
        c_code, att = self.att(h_code, word_embs)  #c_code:[2,32,64,64]  att:[2,18,64,64]
        h_c_code = torch.cat((h_code, c_code), 1)  #h_c_code:[2,64,64,64]
        out_code = self.residual(h_c_code)

        # state size ngf/2 x 2in_size x 2in_size
        out_code = self.upsample(out_code)   #[2,32,128,128]

        return out_code, att

4、鉴别器网络

与StackGAN++类似,不同分辨率的图像配备了不同的鉴别器。

与StackGAN++中给出的鉴别器略有不同。每一个鉴别器比StackGAN++对应的鉴别器多出了一段相同的代码。

以D_NET64为例:

 

StackGAN++ :

class D_NET64(nn.Module):
    def __init__(self):
        super(D_NET64, self).__init__()
        self.df_dim = cfg.GAN.DF_DIM  #64
        self.ef_dim = cfg.GAN.EMBEDDING_DIM  #128
        self.define_module()

    def define_module(self):
        ndf = self.df_dim
        efg = self.ef_dim
        self.img_code_s16 = encode_image_by_16times(ndf)

        self.logits = nn.Sequential(
            nn.Conv2d(ndf * 8, 1, kernel_size=4, stride=4),
            nn.Sigmoid())

        if cfg.GAN.B_CONDITION:
            self.jointConv = Block3x3_leakRelu(ndf * 8 + efg, ndf * 8)
            self.uncond_logits = nn.Sequential(
                nn.Conv2d(ndf * 8, 1, kernel_size=4, stride=4),
                nn.Sigmoid())

    def forward(self, x_var, c_code=None):
        x_code = self.img_code_s16(x_var)#x_var:[2,3,64,64] x_code:[2,512,4,4]

        if cfg.GAN.B_CONDITION and c_code is not None:
            c_code = c_code.view(-1, self.ef_dim, 1, 1)#输入c_code:[2,128]  输出c_code:[2,128,1,1]
            c_code = c_code.repeat(1, 1, 4, 4)#c_code:[2,128,4,4]
            # state size (ngf+egf) x 4 x 4
            h_c_code = torch.cat((c_code, x_code), 1)# 输出h_c_code:[2,640,4,4]
            # state size ngf x in_size x in_size
            h_c_code = self.jointConv(h_c_code)#输出h_c_code:[2,512,4,4]
        else:
            h_c_code = x_code

        output = self.logits(h_c_code)#4*4的卷积 output:[2,1,1,1]
        if cfg.GAN.B_CONDITION:
            out_uncond = self.uncond_logits(x_code)
            return [output.view(-1), out_uncond.view(-1)]
        else:
            return [output.view(-1)]

 

AttGAN:

class D_NET64(nn.Module):
    def __init__(self, b_jcu=True):
        super(D_NET64, self).__init__()
        ndf = cfg.GAN.DF_DIM  #64
        nef = cfg.TEXT.EMBEDDING_DIM  #256
        self.img_code_s16 = encode_image_by_16times(ndf)
        if b_jcu:
            self.UNCOND_DNET = D_GET_LOGITS(ndf, nef, bcondition=False)
        else:
            self.UNCOND_DNET = None
        self.COND_DNET = D_GET_LOGITS(ndf, nef, bcondition=True)

    def forward(self, x_var):
        x_code4 = self.img_code_s16(x_var)  # x_var:[2,32,64,64]
        return x_code4   # [2,512,4,4]

其中的encode_image_by_16times()函数:

# Downsale the spatial size by a factor of 16
def encode_image_by_16times(ndf):
    encode_img = nn.Sequential(
        # --> state size. ndf x in_size/2 x in_size/2
        nn.Conv2d(3, ndf, 4, 2, 1, bias=False),
        nn.LeakyReLU(0.2, inplace=True),
        # --> state size 2ndf x x in_size/4 x in_size/4
        nn.Conv2d(ndf, ndf * 2, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ndf * 2),
        nn.LeakyReLU(0.2, inplace=True),
        # --> state size 4ndf x in_size/8 x in_size/8
        nn.Conv2d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ndf * 4),
        nn.LeakyReLU(0.2, inplace=True),
        # --> state size 8ndf x in_size/16 x in_size/16
        nn.Conv2d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
        nn.BatchNorm2d(ndf * 8),
        nn.LeakyReLU(0.2, inplace=True)
    )
    return encode_img

获得的x_code4输入D_GET_LOGITS.

class D_GET_LOGITS(nn.Module):
    def __init__(self, ndf, nef, bcondition=False):
        super(D_GET_LOGITS, self).__init__()
        self.df_dim = ndf
        self.ef_dim = nef
        self.bcondition = bcondition
        if self.bcondition:
            self.jointConv = Block3x3_leakRelu(ndf * 8 + nef, ndf * 8)

        self.outlogits = nn.Sequential(
            nn.Conv2d(ndf * 8, 1, kernel_size=4, stride=4),
            nn.Sigmoid())

    def forward(self, h_code, c_code=None):  #[2, 512, 4, 4]
        if self.bcondition and c_code is not None:
            # conditioning output
            c_code = c_code.view(-1, self.ef_dim, 1, 1)  #[c_code]:[2,256,1,1]
            c_code = c_code.repeat(1, 1, 4, 4)   #c_code:[2,256,4,4]
            # state size (ngf+egf) x 4 x 4
            h_c_code = torch.cat((h_code, c_code), 1)  #[2,768,4,4]
            # state size ngf x in_size x in_size
            h_c_code = self.jointConv(h_c_code)  #[2,512,4,4]
        else:
            h_c_code = h_code

        output = self.outlogits(h_c_code)  #[2,1,1,1]
        return output.view(-1)

最终得到[2,1,1,1]的output。

5 DAMSM

这一部分被用来检测图像文本的匹配程度,生成相应的损失函数.

它包括两部分:

text_encoder和image encoder

(1)image encoder即为刚才介绍的第二部分,它的输出是一个2048维的向量,代表了整个图像的特征   .     f'

此外,对输入的图像提取得到768*17*17的特征,reshape成768*289.用来代表local feature .   f

289代表region的数目,768代表的是维度.

由f'得到v'  由  f得到v

(2)the text encoder

是一个双向LSTM.输出sentence embedding和word embedding (e  :D*T)

详情见网络结构的第一部分.

 

 

s=e.transpose()*v

这样 就把图像和句子结合在了一起.s(i,j)代表了句子中的第i个单词和第图像中第j个区域的相关性.

最后s和h结合得到相关损失

五、损失函数和训练过程

损失函数包括三部分:

生成器损失+鉴别器损失+DAMSM损失

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

text to image(六):《AttnGAN》 的相关文章

  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 将签名位图转换为签名字符串(很奇怪的一个)

    基本上我需要将位图图像转换为字符串 但这不是常见的 困境在于该字符串由两部分组成 1 积分 2 线路 我需要将图像转换为由 分隔的两个部分 我得到的一个例子是 221A 221A270A270A25032503200720071716171
  • 使用 ImageMagick 和 PHP 将 PNG 转换为 JPG 并将透明背景设置为白色

    将图像从 PNG 转换为 JPEG 时 如何使用 ImageMagick 带有 php 扩展 将透明背景设置为白色 在撰写本文时 您尚未指定正在使用哪个扩展 但如果您使用命令行 则命令将是 convert image png backgro
  • VideoCapture.read() 返回过去的图像

    我在跑python3 6 with openCV on the Raspberry pi OS is Raspbian 代码的大致结构如下 The image以时间间隔 3 5 分钟 捕获 被捕获image在函数中处理并返回度量 精度的种类
  • 使用 jQuery 清除 IMG

    我正在尝试从 a 中删除加载的图像 img 元素 但清除或删除 src 不会执行此操作 该怎么办 HTML img src https www google com images srpr logo3w png JQUERY img att
  • 取消html5浏览器中的单图请求

    我正在动态加载 大 图像以绘制到 html5 画布中 如下所示 var t new Image t onload t src http myurl 但每隔一段时间就会想取消图片请求完全地 我想出的唯一方法是设置src to i e t sr
  • 将名称字符串编码为唯一的数字

    我有一大堆名字 数以百万计 他们每个人都有一个名字 一个可选的中间名和一个姓氏 我需要将这些名称编码为唯一代表这些名称的数字 编码应该是一对一的 即一个名称只能与一个数字相关联 一个数字只能与一个名称相关联 对此进行编码的明智方法是什么 我
  • 如何在Django中显示内存中的图片?

    我知道如何将图片显示为内存中的页面 如下所示 import cStringIO mStream cStringIO StringIO picBin return HttpResponse mStream getvalue image jpg
  • Laravel 上传前如何压缩图像?

    我正在制作一个图片库网站 用户可以在其中上传任何图像 它们将显示在前端 我需要在不影响图像质量的情况下压缩图像 以减小图像大小 以便页面加载速度不会影响那么大 我使用以下代码来上传图像 rules array file gt require
  • WPF 中图像的淡入淡出

    当我更改幻灯片放映等图像源时 如何实现淡入和淡出图像 我的图像从本地和网络加载 并且其数量是可变的 谢谢 您可以编写一个扩展方法 通过动画显示图像来淡出图像Opacity属性设置为 0 然后设置Source属性并最终将不透明度动画回到 1
  • 考虑到我的图像链接存储在MySQL数据库中,如何通过php显示存储在文件夹中的图像

    作为良好的做法 我只将图像链接存储在数据库中 问题是 我应该如何存储图像的链接 假设它在 c 上 c image jpg 我应该使用哪段 PHP 代码来显示该图像 我只显示路径 我该怎么做才能显示图像 我可以用这个吗 query SELEC
  • 如何将BufferedImage转换为图像以在JSP上显示

    我想转换BufferedImage将显示在 JSP 页面上的图像 我怎样才能实现这个目标 首先 JSP是一种视图技术 提供了编写HTML CSS JS的模板以及与后端Java代码交互以控制页面流和访问后端数据的能力 你的问题更多的是在 HT
  • JavaFX HTMLEditor - 插入图像功能

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

    我正在使用 NLTK 来查找单词的一致性 但我不知道如何获取所有结果并将它们放入list or set 例如 text concordance word 仅打印前 25 个结果 TL DR text concordance lines 10
  • PHP清晰度卷积矩阵

    我正在使用一个卷积矩阵 http www php net manual en function imageconvolution php为了锐度PHP GD我想改变清晰度 level 我会去哪里做出改变如果我想做到的话或多或少尖锐 imag
  • Java 扫描仪问题 (JFrame)

    我正在尝试使用扫描仪来编辑塔防游戏的级别 但是 它不会将级别 图块图像 更新为自定义文件的级别 0 是草 1 是石头 1 是什么都没有 等等 我发现了错误 但如何修复它 我需要添加 更改什么才能消除这个错误 java lang NullPo
  • HTML5 - Canvas - 大图像优化

    我需要建立一个HTML5 canvas其中包含非常大的图像 可能高达 10 15MB 我的第一个想法是将图像分成几个块 这些块将在画布上水平移动时加载 对这个想法有什么想法吗 这是一件好事吗 也许我错过了一些已经实现的优化功能 你说得对 这
  • 在 Java 中有效地对图像进行颜色循环

    我正在编写一个曼德尔布罗分形查看器 我想以智能的方式实现颜色循环 给定一个图像 我想修改它的 IndexColorModel 据我所知 没有办法修改 IndexColorModel 也没有办法为图像提供新的 IndexColorModel
  • .NET:如何判断编码是否支持字符串中的所有字符?

    我需要输出大量文本 其中包括多种语言的各种字符 有时我需要以 Unicode 以外的字符编码 例如 Shift JIS 或 ISO 8859 2 输出文本 以便匹配它要访问的页面 如果文本中包含编码无法处理的字符 例如 ISO 8859 2
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa

随机推荐

  • 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
  • text to image(六):《AttnGAN》

    继续介绍文本生成图像的工作 xff0c 本文给出的是CVPR 2018 的文章 AttnGAN Fine Grained Text to Image Generation with Attentional Generative Advers