text to image(八):《Image Generation from Scene Graphs》

2023-05-16

最近在翻阅文本生成图像的相关工作,目前比较新的有突破性的工作是李飞飞工作团队18年cvpr发表的《Image Generation from Scene Graphs》 。

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

       源码地址: https://github.com/google/sg2im

       这篇主要就是介绍该论文的工作,穿插对部分代码的理解和讲解。看完代码以后拜服Justin Johnson大神,真厉害!

 

一、相关工作

       先前已经有了很多文本生成图像的方法,比较具有代表性的是StackGANStackGAN++(会在其它博客中给出介绍)。StackGAN存在的比较突出的问题是不能处理比较复杂的文本。比如句子为:A sheep by another sheep standing on the grass with sky above and a boat in the ocean by a tree behind the sheep.

        结果如下图所示:

                                           

左图是StackGAN生成的结果,右图是李飞飞小组提出的新方法的结果。右边的效果明显更好。

 

二、基本思想

     不同于先前的方法,李飞飞小组提出可以使用场景图作为中间媒介。即由原本的

                                       文本----->图像(也就是RNN+GAN的直接搭配)  

      转化为

                                                        文本--→场景图--→图像。

      首先的问题是:什么是场景图,场景图怎么得到?

      场景图是一种可以用来表示文本或者图像结构的表述。如图二所示,即为图一所对应的文本的场景图。

                                                                 

       可以看到,场景图将场景表示为有向图,其中节点(红色)是对象,边(蓝色)给出对象之间的关系。

       关于场景图的获取:一些数据集中提供了与图像配套的场景图,例如Visual Genome数据集。大部分场景图的工作都是基于此数据集的。第二种方法是使用句子或者图像直接生成场景图。从句子中生成的场景图的工作有:《Generating Semantically Precise Scene Graphs from Textual Descriptions for Improved Image Retrieval》。从图像中生成场景图的工作有:《Visual relationship detection with language priors》 、 《Pixels to graphs by associative embedding》 、《Scene graph generation by iterative message passing》、《On support relations and semantic scene graphs》。这里暂时不做详细的介绍。

        获得场景图之后,后续的处理如下图所示:

       首先将场景图(Scene graph)输入图卷积网络(Graph Convolution)获得对象的嵌入向量(Object features)(嵌入向量是什么,后续有解释)。获得的嵌入向量输入对象布局网络。对象布局网络预测对象的bounding boxes和segmentation masks。得到scene layout(场景布局)。将其输入级联细化网络(Cascaded Refinement Network)得到最后的输出图像。

        每个模块的具体实现会在后面配合代码进行介绍。这里给出嵌入向量的概念:我们使用不同的向量来表示不同的对象(词汇),最直接的做法是使用one-hot的形式,但是当词库特别大,词向量会十分冗长。而且两个关系很接近的词汇对应的向量(比如 “国王”和“王后”)之间的关系并不能通过one-hot的词向量表示出来。

        所以引入嵌入向量(词嵌入)来表示不同对象。首先,它也是一个向量,但是长度比较短,而且是一个密集向量。其次,它可以表示关系相近的对象之间的关系(比如“国王”-“男人”+“女人”约等于“王后” ) 这种关系是通过距离表现出来的。比如“猫”和“狗”向量之间的距离比较近,但是“猫”和“天空”距离就比较远。

三、数据集介绍

       在介绍具体的模型结构前,我们先介绍一下实验中用到的数据集。源码中可选的数据集有两个:Visual Genome数据集和COCO数据集。

  1. Visual Genome数据集

     Visual Genome 数据集包括 7 个主要部分:

      区域描述 --------对图像的不同区域进行描述。这些区域是由边框坐标限定的,区域之间允许有重复。数据集中平均对每一张图片有 42 种区域描述。每一个描述都是一个短语包含着从 1 到 16 单词长度,以描述这个区域。

       对象---------------平均每张图片包含21个物体,每个物体周围有一个边框。

      属性---------------平均每张图片有16个属性。一个物体可以有0个或是更多的属性。属性可以是颜色(比如yellow),状态(比如standing),等等。

       关系----------------“关系”将两个物体关联到一起。

       区域图-------------将从区域描述中提取的物体、属性、以及关系结合在一起。表述该区域

       场景图-------------一整幅图片中所有的物体、属性、以及关系的表示

      问答对-------------每张图片都有两类问答:基于整张图片的随意问答(freeform QAs),以及基于选定区域的区域问答(region-based QAs)。在本实验中用不到,所以不做过多解释。

        此外,每一个对象、属性、关系在WordNet中都有自己规范化的ID。

  1. COCO数据集

COCO的数据标注信息包括:

- 类别标志

- 类别数量区分

- 像素级的分割

 

       2014年版本的数据为例,一共有20G左右的图片和500M左右的标签文件。标签文件标记了每个segmentation+bounding box的精确坐标,其精度均为小数点后两位。一个目标的标签示意如下:

{"segmentation":[[392.87, 275.77, 402.24, 284.2, 382.54, 342.36, 375.99, 356.43, 372.23, 357.37, 372.23, 397.7, 383.48, 419.27,407.87, 439.91, 427.57, 389.25, 447.26, 346.11, 447.26, 328.29, 468.84, 290.77,472.59, 266.38], [429.44,465.23, 453.83, 473.67, 636.73, 474.61, 636.73, 392.07, 571.07, 364.88, 546.69,363.0]], "area": 28458.996150000003, "iscrowd": 0,"image_id": 503837, "bbox": [372.23, 266.38, 264.5,208.23], "category_id": 4, "id": 151109}

 

 

四、模型结构

       依旧先上这张整体结构图。;另外,下文提到的向量具体数值均是为了便于理解,并不完全与代码运行后的实际数值相同。

  1. 图卷积网络(GCN)

       由Thomas Kpif于2017年在论文《Semi-supervised Classification with Graph Convolutional Networks》。Thomas Kpif的这篇论文属于谱卷积,即将卷积网络的滤波器与图信号同时搬移到傅里叶域以后进行处理。

        原论文没看太懂,数学推导可以参https://blog.csdn.net/chensi1995/article/details/77232019值得注意的是,图嵌入(graph embedding)、网络嵌入(network embedding)、网络表示学习(network representation learning),这三个概念从原理上来说其实表达的是同一件事,核心思想就是“通过深度学习技术将图中的节点(或边)映射为向量空间中的点,进而可以对向量空间中的点进行聚类、分类等处理”。图卷积神经网络就属于图嵌入技术的一种

       也就是说,图卷积网络的目的是把对象(节点)、关系(边)映射为嵌入向量。

       具体原理可以参考https://blog.csdn.net/tMb8Z9Vdm66wH68VX1/article/details/78705916。 为方便后续理解,这里给出部分内容的截图。

Hl即为第l个隐含层,H0就是输入层。

 

 

可以看到GCN可以有一到多层。

 

下面分析源码:

      首先读取场景图,在代码中场景图的表示是一个由若干字典组成的列表。一幅图像可能有一到多个场景图表述。

      字典有两个key: 'objects' 和'relationships' 。这里给出一个scene graph:{'objects': ['sky', 'grass', 'zebra'], 'relationships': [[0, 'above', 1], [2, 'standing on', 1]]}。对于拥有多个字典(场景图)的列表(图像),在列表中从前到后字典逐渐变复杂,对象数目和关系数目增多。在relationship的列表中,目标用索引表示。一幅图像中有N个目标,则在所有的字典中,目标的索引从0到N-1。

       场景图的处理是encode_scene_graphs函数。函数输入是单个场景图的字典或者包含了多个字典的列表,输出是元组(objs, triples, obj_to_img)。之前讲到在VG数据集中,所有的对象、属性、关系都有规范化的索引,我们暂且称之为词库索引。objs, triples, obj_to_img都是 列表,objs表示所有所有场景图中出现的所有目标的词库索引,triples表示所有场景图中每一张场景图中目标之间的关系,obj_to_img与objs长度相同,用于标注哪些目标属于哪些场景图。比如:

       objs:[11, 17, 130, 0, 11, 17, 129, 0]        最后用0来代表'__image__'

       triples:[[0, 4, 1], [2, 19, 1], [0, 0, 3], [1, 0, 3], [2, 0, 3], [4, 4, 5]]

       obj_to_img:[0, 0, 0, 0, 1, 1, 1, 1,…..N]   总共有N个场景图

       相关代码:

def encode_scene_graphs(self, scene_graphs):
    """
    Encode one or more scene graphs using this model's vocabulary. Inputs to
    this method are scene graphs represented as dictionaries like the following:

    {
      "objects": ["cat", "dog", "sky"],
      "relationships": [
        [0, "next to", 1],
        [0, "beneath", 2],
        [2, "above", 1],
      ]
    }

    This scene graph has three relationshps: cat next to dog, cat beneath sky,
    and sky above dog.

    Inputs:
    - scene_graphs: A dictionary giving a single scene graph, or a list of
      dictionaries giving a sequence of scene graphs.

    Returns a tuple of LongTensors (objs, triples, obj_to_img) that have the
    same semantics as self.forward. The returned LongTensors will be on the
    same device as the model parameters.
    """
    if isinstance(scene_graphs, dict):
      # We just got a single scene graph, so promote it to a list
      scene_graphs = [scene_graphs]

    objs, triples, obj_to_img = [], [], []
    obj_offset = 0
    for i, sg in enumerate(scene_graphs):#对于单幅图像 有好几个场景图  每次进一个场景图
      # Insert dummy __image__ object and __in_image__ relationships
      sg['objects'].append('__image__')
      image_idx = len(sg['objects']) - 1
      for j in range(image_idx):
        sg['relationships'].append([j, '__in_image__', image_idx])
      #首先是对场景图进行处理,除了原本的目标以外,加入新的目标 ,也就是总体的'__image__'
      #加入了新的目标,就需要更新关系列表  也就是 之间的每一个目标  都'__in_image__'在图像里
      #举例:sg['objects']:['sky', 'grass', 'sheep', '__image__']
      #sg['relationships']:  [[0, 'above', 1], [2, 'standing on', 1], [0, #'__in_image__', 3], [1, '__in_image__', 3], [2, '__in_image__', 3]]
      #0 1  .....len(sg['objects']) - 2 分别是原图中目标的索引    
      #image_idx = len(sg['objects']) - 1  是image的索引
      
      for obj in sg['objects']:   
        obj_idx = self.vocab['object_name_to_idx'].get(obj, None)  #获取场景图中目标对应的词库索引
        if obj_idx is None:
          raise ValueError('Object "%s" not in vocab' % obj)
        objs.append(obj_idx)   #对应的词库索引  最后用0来代表'__image__' [11, 17, 130, 0, 11, 17, 129, 0]
        obj_to_img.append(i)   #用于标注  对于当前的图像 这是第几个场景图 [0, 0, 0, 0, 1, 1, 1, 1]
      for s, p, o in sg['relationships']:
        pred_idx = self.vocab['pred_name_to_idx'].get(p, None)  #获取关系对应的词库索引
        if pred_idx is None:
          raise ValueError('Relationship "%s" not in vocab' % p)
        triples.append([s + obj_offset, pred_idx, o + obj_offset])#描述目标之间的关系  不同场景图的不同目标 用不同的索引标注
        #[[0, 4, 1], [2, 19, 1], [0, 0, 3], [1, 0, 3], [2, 0, 3], [4, 4, 5], [6, 19, 5], [4, 0, 7], [5, 0, 7], [6, 0, 7]]
      obj_offset += len(sg['objects'])
    device = next(self.parameters()).device
    objs = torch.tensor(objs, dtype=torch.int64, device=device)#所有场景图中出现的所有目标的词库索引
    triples = torch.tensor(triples, dtype=torch.int64, device=device)  #所有场景图中每一张场景图中目标之间的关系
    obj_to_img = torch.tensor(obj_to_img, dtype=torch.int64, device=device)#  标注哪些目标属于哪些场景图
    return objs, triples, obj_to_img

将对象和关系使用128维的词嵌入表示,将其输入图卷积网络,得到嵌入向量。

相关代码:

obj_vecs = self.obj_embeddings(objs)  #[42,128]  将每个目标用128维的嵌入向量表示
obj_vecs_orig = obj_vecs
pred_vecs = self.pred_embeddings(p)   #[63,128]  将每种关系也用128维的嵌入向量表示

if isinstance(self.gconv, nn.Linear):  #如果没有设计场景图卷积网络 而是直接加了全连接层            
    obj_vecs = self.gconv(obj_vecs)      #得到128维度的输出向量
else:
    obj_vecs, pred_vecs = self.gconv(obj_vecs, pred_vecs, edges)  #如果只有一层
    if self.gconv_net is not None:
        obj_vecs, pred_vecs = self.gconv_net(obj_vecs, pred_vecs, edges)   
        #如果有多层 就把刚才那一层的输出作为输入
        #[42,128]   [63,128]   这里42是对象的数量  63是关系的数量

2、 对象布局网络

对象布局网络由两部分组成,一部分是Mask regression network,一部分是Box regression network,如下图所示:

 

 

(1)预测对象的bounding_box:

使用一个多层感知器来实现。包含有三层,实验中输入层是128的对象嵌入向量,隐藏层的维度取了512,输出层是4维向量,对每个对象的嵌入向量,得到bouding_box的坐标。

代码:

boxes_pred = self.box_net(obj_vecs)   #[42,4]  对于每个对象 预测它们的bounding_box

      

(2)预测mask:

       建立一个mask_net来预测mask。网络的输入是所有场景图中所有对象的嵌入向量。例如一共由42个对象,输入为[42,128,1,1],输出为16*16的mask_pre[42,1,16,16],也就是每个对象的binary masks。网络中主要进行了上采样、卷积等操作。如下列代码所示:

代码:

masks_pred = None
if self.mask_net is not None:
    mask_scores = self.mask_net(obj_vecs.view(O, -1, 1, 1))#输入[42,128,1,1]输出[42,1,16,16]            
    #对于每个对象产生16*16的图像  O是对象的总数目 
masks_pred = mask_scores.squeeze(1).sigmoid()   #[42,16,16]


def _build_mask_net(self, num_objs, dim, mask_size):  #将128维的图像变为1维的mask
    output_dim = 1
    layers, cur_size = [], 1
    while cur_size < mask_size:
      layers.append(nn.Upsample(scale_factor=2, mode='nearest'))#上采样图像成原来的四倍(长宽2倍)
      layers.append(nn.BatchNorm2d(dim))
      layers.append(nn.Conv2d(dim, dim, kernel_size=3, padding=1))
      layers.append(nn.ReLU())
      cur_size *= 2
    if cur_size != mask_size:
      raise ValueError('Mask size must be a power of 2')
    layers.append(nn.Conv2d(dim, output_dim, kernel_size=1))  #最后的输出图像是单通道的layout
return nn.Sequential(*layers)

(3)bounding_box和mask结合生成图像布局

作者设计了masks_to_layout网络来实现这一功能。输入是obj_vecs, layout_boxes, layout_masks, obj_to_img以及 想要产生的图像布局的尺寸H, W。输出是[N,D,H,W]的形式。

N是要生成的图像batch大小,H,W是尺寸,D是通道数。具体结构原理没看太懂。

       如下列代码所示:

layout = masks_to_layout(obj_vecs, layout_boxes, layout_masks,
                               obj_to_img, H, W)
    #输入:  obj_vecs[42,128]   layout_boxes[42,4]  layout_masks[42,16,16]
    #obj_to_img[42]  H:128  W:128 
    #layout:[7,128,128,128]

 

3、级联网络

级联网络来自论文《Photographic image synthesis with cascaded refinement networks》。在得到layout([7,128,128,128])后,作者引入了layout_noise([7, 32, 128, 128]),与其结合成([7, 160, 128, 128])输入级联网络,得到最终的三通道彩图。

级联网络并没有依靠生成对抗网络(GAN)以训练generator与discriminator network的方式来做image-to-image,而是采用了一种级联精练网络Cascaded Refinement Network (CRN)来实现逼真街景图的生成。每个模块接收两个场景布局作为输入,即下采样到模块的输入分辨率和来自前一个模块的输出。这些输入通道连接并传递给一对3*3卷积层; 然后在传递到下一个模块之前使用最近邻插值对输出进行上采样。 第一个模块采用高斯噪声z~ pz作为输入,并且来自最后一个模块的输出被传递到两个最终的卷积层以产生输出图像。

具体的代码模块比较多,这里就不再给出介绍。

https://data-sci.info/wp-content/uploads/2017/08/arch.png

代码:

img = self.refinement_net(layout)   #输入[7, 160, 128, 128]  输出[7, 3, 128, 128]

至此,模型结构部分介绍完毕。

五、训练

模型使用一对鉴别器网络训练图像生成网络f来生成逼真的输出图像。 确保生成的图像的整体外观是真实的; 确保图像中的每个对象看起来都是真实的;它的输入是一个对象的像素,使用双线性插值裁剪并重新缩放到固定大小。除了将每个对象分类为真实或虚假之外,还确保使用辅助分类器来识别每个对象,该分类器预测对象的类别。

我们联合训练图像生成网络f、鉴别器。我们试图最小化6个损失的加权和。

 

Box loss预测对象的位置信息,惩罚真实对象位置与预测位置的误差。

Mask loss pixelwise cross-entropy使用像素交叉熵惩罚地面实况和预测掩模之间的差异; 不用于在Visual Genome上训练的模型。

Pixel loss惩罚GT图像与生成图像之间的L1差异。

Image adversarial loss鼓励生成的图像整体看起来更真实。

Object adversarial loss 鼓励生成的对象看起来更真实。

Auxiliarly classifier loss确保每一个对象都能够被Dobj识别。

 

训练部分的代码涉及鉴别器和生成器,6种损失,比较复杂(再次膜拜大神),这里就不给出详细的代码理解,只写一下训练主函数的基本流程。

  1. 搭建train_loader, val_loader用于加载训练数据和验证集数据。
  2. 建立模型和优化器
  3. 建立对象鉴别器,建立图像鉴别器
  4. 建立两个函数gan_g_loss, gan_d_loss分别用于计算生成器和鉴别器损失。其中gan_d_loss输入为真实图像与假图像 或者真实对象与假对象,输出为鉴别器损失。
  5. 针对对象鉴别器和图像鉴别器分别建立优化器
  6. 加载对象鉴别器和图像鉴别器权重(如果有)
  7. 开始迭代优化各个损失的加权和。(这一过程的实现还是挺复杂的)

 

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

text to image(八):《Image Generation from Scene Graphs》 的相关文章

  • 如何使用 jquery imgAreaSelect 用 php 裁剪图像?

    我正在使用以下 javascript 代码来实例化 jquery图像区域选择 http odyniec net projects imgareaselect 裁剪我的图像 document ready function ladybug im
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • minAreaRect OpenCV 返回的裁剪矩形 [Python]

    minAreaRectOpenCV 中返回一个旋转的矩形 如何裁剪矩形内图像的这部分 boxPoints返回旋转矩形的角点的坐标 以便可以通过循环框内的点来访问像素 但是在 Python 中是否有更快的裁剪方法 EDIT See code在
  • IE10中的图像插值

    这是我的用例 我有一个采用响应式设计的网页 该页面垂直分成两半 我想在右侧显示图像 呈现为 PNG 或 JPG 的 PDF 页面 调整窗口大小后 图像的大小应立即更改 我以为我已经解决了这个问题 我将服务器上的图像渲染得足够大 以适应最大可
  • 有人可以用非常简单的图形方式给出余弦相似度的例子吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 维基百科上的余弦相似度文章 http en wikipedia org wiki Cosine similarity 你能在这里显示向量吗
  • 如何在PHP中将图像从内存上传到AWS S3?

    所以我目前有一个使用 AWS S3 上传图像的上传系统 这是代码 Upload image to S3 s3 Aws S3 S3Client factory array key gt mykey secret gt myskey try s
  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • 在 android 中使用 MediaStore.ACTION_IMAGE_CAPTURE 意图捕获图像

    我正在使用 MediaStore ACTION IMAGE CAPTURE 意图捕获图像 它在大多数设备上运行良好 但它无法按预期在某些最新的 Android 设备中正常工作 我的目的是使用相机捕获图像并将其发送到服务器 但不将该图像存储在
  • JavaFX 图像未在舞台中显示

    我尝试了很多次 尝试了很多方法 但都无法让自己的形象在舞台上如我所愿 我认为这可能与java寻找资源的路径有关 但我不确定 因为我刚刚开始使用视觉库 在本例中为JavaFX 这是我的目录结构 MyProject assets img myI
  • Java-如何将黑白图像加载到二进制中?

    我在 FSE 模式下使用 Java 和 swing 我想将完全黑白图像加载为二进制格式 最好是二维数组 并将其用于基于掩码的每像素碰撞检测 我什至不知道从哪里开始 过去一个小时我一直在研究 但没有找到任何相关的东西 只需将其读入Buffer
  • 加载位图图像至特定尺寸

    我正在尝试使用 allegro 将位图加载到特定大小 al crate bitmap x y 创建特定大小的位图 al load bitmap filename 加载我需要的图像 但为其原始大小 我需要将位图加载到我设置的大小 有任何想法吗
  • 将图像编码为base64有什么效果?

    如果我将图像 jpg 或 png 转换为 base64 那么它会更大 还是具有相同的大小 会大多少呢 是否建议在我的网站上使用 Base64 编码的图像 大约会大 37 非常粗略地说 Base64 编码的二进制数据的最终大小等于原始数据大小
  • 如何提高包含大量小图像的 UCollectionView 的性能?

    在我的 iOS 应用程序中我有UICollectionView显示大约 1200 个小 35x35 点 图像 图像存储在应用程序包中 我正确地重用了UICollectionViewCell但仍然存在性能问题 具体取决于我处理图像加载的方式
  • 正在使用 PIL 保存损坏的图像

    我遇到一个问题 操作图像像素导致保存损坏的图像 因此 我使用 PIL 打开图像 然后将其转换为 NumPy 数组 image Image open myimage png np image np asarray image 然后 我转置图像
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 沿着预定路径移动图像?

    是否可以通过按下 iphone SDK 中的按钮来将图像设置为沿着预定路径运动 我不是在寻找任何奇特的东西 我正在研究一个简单的概念 但这会节省大量动画工作 是的 您可以通过创建一个路径来为任何 CALayer 制作动画CAKeyframe
  • 如何以编程方式将多个 JPEG 合并为无损 wav 中的更大 JPEG (.net)

    我有几张 JPEG 图像 我想将它们组合成一张大 JPEG 图像 我可以通过创建一个来做到这一点Bitmap然后将它们组合在一起 但这样如果我再次将其保存为 JPEG 图像将会恶化 那么 有没有什么方法可以在解码 编码时在不损失质量的情况下
  • Linux - 从第二个选项卡获取文本

    假设我们有这样的文件 一些文本11 一些文本12 一些文本13 一些文本21 一些文本22 一些文本23 文本由制表符分隔 我们知道第 1 列中的一些文本 但希望从第 2 列中获取文本 我知道我可以通过以下方式获取线路 grep somet
  • iOS 11 浏览器图像错误

    在 iOS 11 中滚动页面时出现以下错误 在 Firefox Safari 和 Chrome 中 在 Android 设备中 不会发生该错误 这些是背景图像 我不知道这是否是导致错误的原因 图 2 显示了图像在 Android 中的用途和
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将

随机推荐

  • 最新软件设计师知识点分析(思维导图)

    大家好 xff0c 作为一个考取软件设计师的过来人 xff0c 今天我给大家分享一下关于软件设计师考题的复习经验 1 多做多分析多总结近年来习题 xff08 达到看到题就知道考点是什么怎么解 xff09 2 知道怎么在题中怎么找答案 3 梳
  • 记一次阿里云服务器被攻击导致无法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