Image Generation from Scene Graph
写一点看过的论文和code的感悟
首先看一下论文的总体实现:

个人认为,该模型相较于传统模型两大核心改进点即为Graph Convolution和Cascaded Refinement Network。
Graph Convolution
根据所述,该研究者对场景图进行处理时采用了一种基于边信息传播的方法。具体而言,在该方法中使用(obj\_vecs)表示图中各实体节点的状态向量;经过图卷积操作后,原始的状态向量(obj\_vecs)会整合与之相连的所有节点实体的信息(即具有连接关系的对象),从而生成新的状态表示(new\_obj\_vecs)用于目标检测任务中的mask和边界框预测。与现有的StackGAN++方法相比(该方法直接利用sentence_vecs预测单个图像),本方案通过引入图结构信息使得各实体之间的关系更加明确可辨识,在提升分类准确性的同时实现了对场景复杂性的更高层次建模。
比如我们有这样一张scene graph:

这张图包含三个 object 和三个 relationship,能够提取出具体的关系对。
o通过某种机制转化为p进而生成s。
大象位于树的内部区域。
大象则位于草层之上。
树周围的环境转化为新的结构elephat。
然后将其通过nn.embedding()转换之后得到(3, 3 x 128)(假设每个单词的dim为128)
(3, 3 x 128 ) --> net1 --> (3, 1152): net1 就是一个简单的MLP网络,1152 = 512(o) + 128(p) + 512(s)
得到了512维表示的obj_vec(即`o, s),并使用scatter_add()函数将其更新至new_obj_vecs(3, 512)$
(3, 3 x 512 ) --> net2 --> (3, 128): net2 也是一个简单的MLP网络
新增加的节点对象向量包含了其相邻节点的信息;这正是本文所探讨的核心技术——Graph Convolutional Networks;其信息传递机制主要依赖于graph中的边结构
Scene Layout
先看一下论文中是怎么预测 scene layout的。

obj_vecs通过Mask Network生成Mask;
经过Mask Network处理后,在输入尺寸(3×[?]^{*}?)的基础上输出([?]^{*}?)。其中,mask network相当于一个上采样模块;其掩码尺寸为(M×M)=([?]^{*}?)
obj_vecs * Mask --> layout_masks
(3, 128) * (3 , 16, 16) --> (3, 128, 16, 16): obj_vecs * mask = masked_embeding。
obj_vecs -->layout_boxes
(3, 128) --> Box Net --> (3, 4): box net 也是一个简单的MLP网络
当我们得到Mask 和Box的时候就能用于预测sence layout 了。
layout = masks_to_layout(obj_vecs, layout_boxes, layout_masks, obj_to_img, H, W)
"""
obj_to_img: 这个节点对象对应与哪张图片
image size = (H, W)
"""
AI写代码
其中该模块的核心功能体现在函数nn.function.grid_samples(input, grid)里,
输出通过从输入中选择指定坐标的点来计算,
这些点的值被作为输出结果存储在output变量里。
值得注意的是,在这篇文章里,
输入来源于我们定义的layout_mask张量,
而网格则基于处理后的layout_box生成。
input.shape=(3×128×64×64),grid.shape=(3×64×64×2)

最终得到layout.shape = (1, 128, 64, 64)
CRN
通过给layout添加一个随机噪声,并将其放入级联细化网络后,从而生成输出图像。后续章节中将详细讲解级联网络的相关知识.
