层次化透明度传播

https://arxiv.org/pdf/2004.03249.pdf

https://github.com/Yaoyi-Li/HOP-Matting

http://www.alphamatting.com/eval_25_highres.php

作者:Yaoyi Li, Qingyao Xu, and Hongtao Lu,上海交大,2020

摘要:近年来,深度网络在抠图领域取得巨大成功。和传统的、基于传播的抠图方法相比,一些顶尖的深度网络倾向于隐式地在神经网络中进行传播。一个全新的、能够更直接地在像素间直接传播alpha matte的结构是被需要的。因此,本文提出一种层次化的透明度传播的抠图方法,透明度信息在不同语义层级的每个点的领域传播。层次化结构是基于一个全局的和多个局部的传播块。使用HOP结构后,高分辨率特征图的每个特征点对会根据图像的样子(appearance)连接起来。针对输入图像的大小变化问题,我们进一步提出一种尺度钝感的位置编码算法,并提出一种用于抠图的随机插值的数据增强技术。大量实验和消冗研究表明,我们的方法比最先进的方法性能更好。

关键词:抠图,层次化传播,层次化变换

1. 引言

抠图是将前景物体和背景分离,是将图像视为一副合成图像,要估计前景物体的透明度,输出结果是alpha matte,alpha matte表示的是每个像素处前景和背景之间的变换[41]。

公式上,一张RGB图像I被建模为前景F和背景B的凸组合(convex combination)[8,41]:

I_{p} =\alpha _{p} F_{p} +(1-\alpha _{p})B_{p}\alpha _{p}\in [0,1]  (1)

其中,\alpha _{p}是位置p处要估计的alpha matte值。抠图的原始定义仍然存在定义不清的问题。因此,在绝大多数抠图任务中,三元图(图1(b))作为输入的粗标注,其表示已知的前景、背景区域和有待预测的不确定区域。

传统的基于传播的抠图算法[24,14,23,4,1]是根据图像外观的相似性在像素之间传播透明度,以生成alpha matte。这种归纳偏置(inductive bias)为一些深度网络[37,3]所用,以带来效果上的提升。SampleNet[37]使用inpainting network来执行传播,该方法是预测前景和背景,而不是预测透明度。此外,inpainting部分的传播只在语义信息强的特征图上进行,而不在高分辨率特征上进行。AdaMatting[3]在传播的最后阶段使用了卷积式的LSTM,其中传播是基于卷积和保存在ConvLSTM的cell中的数据进行的。ConvLSTM和直接传播的区别类似于LSTM和transformer的区别。

本文提出一种新的层次化透明度传播结构,其中,透明度信息可以在不同语义级别的特征间进行传递。该结构有两个传播块,称为HOP块和局部HOP块。HOP块通过像Transformer那样的注意力机制和聚合机制来执行信息的传递。尽管如此,全局HOP块和局部HOP块都被设计为双源transformers。更具体地说,注意力图中节点之间的关系是根据外观特征计算的,传递的信息是透明度特征,这和自注意力以及常规注意力[2,44]不同。因为有HOP结构,我们的网络用全局HOP块在分辨率低、语义信息强的特征上学习上下文透明度,用局部HOP块在高分辨率特征上refine模糊的伪影。图1所示是我们的方法与3种最先进方法在现实世界图像上的效果。除了HOP结构,我们还提出一种尺度钝感的位置编码方法,以除了输入图像尺寸的变化,该方法是基于[9,32]提出的相对位置编码方法。我们还提出了随机插值用来数据增强,以进一步提升性能。

图1 在原PDF上放大看会有显著区别

具体地说,我们的方法和以往的深度学习抠图方法有以下不同:

(1). 我们提出了一种全新的层次化传递结果,它是利用一系列的全局和局部HOP块,利用不同语义级别的透敏度和外观信息进行信息传播。

(2). 使用随机插值来做训练过程的数据增强,实验表明这样能带来显著提升。

(3). 在Composition-1k和alphamatting.com数据集上的实验表明我们的方法和最先进方法相比是具有竞争力的。

2. 相关工作

大多数抠图方法可以大致分为基于传播的方法[24,14,23,4,1],基于采样的方法[40,11,13,10]和基于学习的方法[45,30,29,37,18,3]。本节会回顾一些和我们工作高度相关的深度学习方法。

一般的基于深度学习的方法是给定图像和三色图直接预测alpha matte。[7]使用了一个端到端的CNN,输入是用closed-form matting[24]和KNN matting[4]得到的mattes以及归一化的原图,以更好地利用局部和全局的结构信息。DeepMatting[15]是一个两阶段网络来预测alpha matte,第一阶段是编码-解码卷积网络,输入是原图和对应的trimap,第二阶段是用一个浅层的网络来refine第一阶段预测的粗alpha matte。[30]使用GAN来抠图,并使用扩张卷积来捕获全局上下文信息。[36]提出一个叫做VDRN的深度残差编码器和一个复杂的解码器。AdaMatting将抠图分为两步:三色图的自适应调整和alpha的预测,并使用带有两个不同解码器分支的深度卷积网络,以多任务方式来抠图。IndexNet[29]将池化中的索引作为特征图的函数,并提出一种索引引导的编码-解码网络,该网络使用可学习的索引引导的池化和上采样。[18]提出一个context-aware的网络来同时预测前景和alpha matte。Context-aware Matting使用两个解码器,一个用于局部特征,一个用于上下文信息。GCA Matting[25]在抠图中提出了引导的上下文注意力机制,类似于图像修复过程。

一些方法没有直接预测alpha matte,这些方法表明改变自由度会影响到网络的性能。[37]提出SampleNet来逐步地估计前景、背景和alpha matte,而不是同步地预测它们。[47]提出用两个解码分支分别估计前景和背景,然后用一个融合分支来获得结果。

以上这些方法都严重地依赖于作为输入的三色图来减小分辨率空间。近年来出现一些针对具体实际问题,利用图像语义信息而不需要任何三色图的方法。[35]将端到端的CNN与closed-form matting相结合,以自动地生成人像的trimap,然后再生成alpha matte。[5]提出一个语义人像抠图网络,使用一个带有抠图网络的语义分割网络来自动地提取人像的alpha mattes。

3. 方法

为了实现在一个高分辨率层级上对输入图像的透明度的传播,我们提出了一个全新的、层次化的透明度传播结构,其中神经网络可以看做是多层的、有不同图的图卷积网络[22],透明度可以在每两个像素之间传播。本节先介绍我们的层次化透明度传播块,接着再介绍用在HOP块中的尺度钝感的位置编码器。再之后介绍实现细节。

3.1 层次化透明度传播块

通常,non-local块[42]或者transformer[38]能够通过其自注意力机制[27]来全局地执行信息传递。然而,如果直接使用原始的non-local块或者图像的transformer在抠图中,会导致两种缺陷。一方面,non-local块计算量很大,虽然有一些减少其计算量的方法,但是在高分辨率特征图上传播透明度信息计算量还是很大,而抠图就是需要高分辨率。另一方面,non-local和transformer都是在输入的特征图上建立一个全连接的图,连边的权重是由输入特征图的节点生成的。在抠图任务中,每个节点的特征就是透明度信息。在视频分类[42]、语义分割[49]或图像修复[46]等语义任务中,基于不同特征节点之间的关系来传播语义特征是很简单的,而抠图任务中的传播需要更多的非语义的外观信息。

受稀疏Transformer[6,19]、局部自注意力[32]和引导上下文注意力[25]的成功经验启发,我们提出的层次化透明度传播结构包括两个不同的传播块,称为全局HOP块和局部HOP块,在这里,外观和透明度预测一起被用于传播。

图2 HOP结构。为了展示方便,只展示了一个4-scale-level的decoder和2个局部HOP块,而在我们的实现中,我们使用的是一个5-level decode和3个局部HOP块。(a)是网络架构,外观编码器只以RGB图为输入。(b)在不同的语义级别的特征图上层次化透明度信息传播的示意图。橙色线表示特征传播。

所提的HOP结构如图2(a)所示。在我们的方法里,有两个编码器分支,一个提供透明度信息,另一个提供图像外观信息。将透明度编码器(opacity)和外观编码器(appearance)的特征图分别表示为F^O\in R^{HW\times C}F^A\in R^{HW\times C},其位置(i,j)处的特征元素分别表示为f_{(i,j)}^O\in R^Cf_{(i,j)}^A\in R^C,全局HOP块定义为:

q_{(i,j)} =W_{QK} f_{(i,j)}^A

k_{(x,y)} =W_{QK} f_{(x,y)}^A

a_{(i,j),(x,y)} =softmax_{(x,y)} (\frac{q_{(i,j)}^{T} k_{(x,y)}  }{ \vert q_{(i,j)}    \vert \vert  k_{(x,y)}  \vert}  )

g_{(i,j)} =W_{out} (\sum_{(x,y)}a_{(i,j),(x,y)}f_{(x,y)}^O   )+f_{(i,j)}^O (2)

其中,W_{QK} 既是key也是query的线性变换器,W_{out} 是用来对齐传递信息和输入特征图F^O的变换器,softmax操作是执行在(x,y)维度。此外,F^O是该注意力机制(不带任何transformation)的value项,我们也可以将v_{(x,y)} =W_{out} f_{(x,y)}^O视为value项。图3(c)所示是全局HOP块的详细结构。

图3 对于两个局部块,为了展示方便,示意图中我们仅仅展示一个query数据点

在全局HOP块中,key和value是同质的,这一点和自注意力[27,38]或传统注意力机制[2,44]不同。在自注意力中,query,key和value都是从同一个特征计算来的,而在传统的注意力机制中,key和value是来自同一地方。然而,在HOP块中,query和key是共享相同的外观特征,而value则是使用透明度特征。

同样的,我们可以构造只关注每个特征元素的局部领域的局部HOP块:

a_{(i,j),(x,y)}=softmax_{(x,y)\in N_{((i,j),s)}}(\frac{q_{(i,j)}^{T} k_{(x,y)}  }{ \vert q_{(i,j)}    \vert \vert  k_{(x,y)}  \vert}  )

g_{(i,j)} =W_{out} (\sum_{(x,y)\in N_{((i,j),s}}a_{(i,j),(x,y)}f_{(x,y)}^O   )+f_{(i,j)}^O (3)

其中N_{((i,j),s)}是元素位置为(i,j)的窗口大小为s的领域。

在我们的传播图中,每个节点有两个不同特征:透明度和外观。外观特征仅用来生成图的连边权重,而透明度特征则是实际上要传播的信息。HOP块和自注意力的区别也可从图3中看出。消冗研究中,我们将比较我们的HOP块与全局、局部自注意力的性能。

利用HOP块,我们构造了层次化透明度传播结构来估计alpha matte,如图2(b)所示。HOP结构包括一个全局HOP块和多个局部HOP块。示意图省略了HOP块之间的转置卷积,以显示透明度信息是如何层次化传播的。最底下的全局HOP块会在来自bottleneck的特征图上执行全局的透明度传播,在这里,特征图更多包含的是语义信息,而纹理信息更少。将语义特征全局地传播,以利用整张图像的全部信息,是很直观的。然后,在转置卷积的不同阶段之间,局部HOP块被插入到网络当中,在这里,高分辨率特征图中包含更多的纹理信息。因此,使用局部HOP块只关注每个query位置的领域,以提取纹理信息是很符合我们的动机的。通过我们的HOP结构,透明度信息在不同层级的特征上传播,从语义特征到纹理特征,从低分辨率到高分辨率。

此外,我们提出的HOP结构可以看做是一个4层的图卷积网络[22],在每一层有不同的图,在网络的不同阶段节点数是变化的。全局HOP块的图是全连接图,局部HOP块的图是稀疏图。所有的连边权重是通过注意力机制计算的,类似于图注意力网络[39]。

3.2 位置编码

先前一些工作[38,9,32]中,自注意力机制使用位置编码总是能带来提升。本节介绍我们的方法如何使用位置编码。我们用两种不同的位置编码方法:在全局HOP块中使用尺度不敏感的位置编码,在局部HOP块中使用局部相对位置编码。图4是不同位置编码示意图。

图 4 不同位置编码示意图。蓝色框表示query的位置。每个位置的坐标表示行方向偏移和列方向偏移。SI-PE:尺度不敏感位置编码,R-PE:相对位置编码,A-PE:绝对位置编码,LR-PE:局部相对位置编码

尺度不敏感位置编码    [38]将位置编码引入到Transformer中,以提高NLP性能。Transformer-xl[9]进一步将绝对编码扩展到相对位置编码。直观地,在用于抠图的2维编码中,我们可以将嵌入划分为行和列编码,以扩展相对或绝对位置编码。但是,先前的位置编码存在一个致命的缺陷是关注的领域大小是固定的,一旦推理图像大于训练图像尺寸,会出现一些训练过程从未出现的新的位置编码。抠图中,测试图像尺寸大于训练图像块(patchs)是非常常见的。为了解决这个问题,我们提出一种尺度不敏感的全局HOP块。

在我们的尺度不敏感的位置编码中,我们定义领域半径为s。半径以外的任何点的位置编码是相同的。半径以内的点,使用相对位置编码(图4(a))。因此,全局HOP块可以写为:

公式(4)

其中,为简便起见,我们和[38,9]那样使用正弦编码r_{d} ,在实际实现中,s取值为7。有了尺度不敏感位置编码,我们的HOP抠图可处理任何形状和大小的图像。除了位置嵌入,我们还设计了一个trimap嵌入来学习无论前景、背景、未知区域是否有不同注意力权重的情况。

因此公式中的(e_{\vert i-x \vert }+e_{\vert j-y \vert } )被修改为(e_{\vert i-x \vert }+e_{\vert j-y \vert }+W_{T}t_{(x,y)}   ),其中t_{(x,y)} 是位置(x,y)从缩放多的trimap的数据点。

局部相对位置编码    局部HOP块里,领域大小是固定的,因此不需要尺度不敏感位置编码。我们并不提出一个全新的局部相对位置编码方法,而是将[32]提出的局部相对位置编码扩展为一个方向不变性(direction-invariant)版本。局部HOP块中的编码方式是图4(d)。

与以往的位置编码[38,9,32]不同,我们在抠图中用的位置编码都是方向不变性(direction-invariant)的,这意味着嵌入只与query和key位置之间沿行或列的绝对距离有关。这一特性是因为抠图更像是一个语义较少的低级视觉任务,并且应该是旋转不变的(rotation-invariant)。

3.3 损失函数和实现细节

我们的网络的训练仅仅使用alpha matte来构造损失函数,损失函数为估计值和真值的差值的绝对值真值:

L=\frac{1}{ \vert T_{ u}  \vert } \sum_{i\in T_{ u} } \vert \alpha _{i} -\alpha _{i}^{gt }  \vert  (5)

其中,\alpha _{i} 是位置i处估计的alpha matte,\alpha _{i}^{gt } 是对应的真值,T_{ u} 是trimap中未知区域像素的个数。

我们选择在ImageNet[34]上预训练的ResNet-34[15]的前11个块作为透明度编码器的主干。外观编码器的主干选择为一些堆叠的步幅卷积层来提取更多的低级特征信息。训练数据由Adobe Image Matting[45]的前景和MS COCO[26]的背景合成。我们使用[25]中提出的基础数据增强。训练阶段的归一化使用批量归一化[20]和频域归一化(spectral normalization)[31]。使用Adam优化器[21]。遵循[16]使用FP16位精度训练。使用Warmup[12]和cosine decay[28]学习率调整策略。

4 实验

我们进行了广泛的实验和消冗研究。报告了在两个广泛使用的数据集上的结果:Composition-1k测试集和alphamatting.com数据集[33]。评价指标为[33]提出的均方误差(MSE)、绝对差和(SAD)、梯度误差(Grad)和连通性误差(Conn)。我们还将HOP结构中的注意力图可视化,以更好地理解它们是怎么起作用的。

4.1 随机插值数据增强

经验上讲,深度抠图的效果很容易受图像大小的影响。这是因为典型抠图方法关注的是图像中细节纹理信息,而对图像的resize操作会模糊边缘或高频信息,导致性能下降。因此大多数抠图方法都是在原图上评估的,没有使用任何resize操作。Context-aware Matting[18]中,作者指出,前景和背景的图片格式不同会导致轻微的伪影,这有助于网络区分前景和背景。本节我们也会给出一些新的发现,也即基于深度网络的抠图方法对插值运算很敏感,我们会介绍我们方法中的随机插值数据增强。

我们在Composition-1k测试集[45]上实验证明这一发现。首先,我们对RGB图像使用选定的插值算法放大1.5倍,再用相同的插值算法缩小至原尺寸。举个例子,假设图像大小是800×800,选定的插值算法是双线性插值,我们先将图像用双线性插值放大到1200×1200,再用双线性插值将图像缩小至800×800。最后,将缩放过的图像输入给网络,并计算预测值和原始真值之间的误差。需要注意的是,我们不是先缩小再放大,因为先缩小会导致更多的信息丢失。

表1 在Composition-1k上不同插值的结果。RI表示随机插值数据增强

评价结果见表1。我们还比较了真值缩放前后的误差,以供参考。真值缩放前后误差是指,不使用网络推理,直接将真值缩放,计算缩放后的真值和缩放前的真值之间的误差。这个结果表明插值本身就会带来误差,该误差可以作为评估抠图方法的下界。HOP-5×5是我们的基线模型,其表示局部HOP块的邻域大小为5×5,HOP块中不使用位置编码和trimap嵌入。从表1中可以看到,不同的插值测试之间的的差距要大于下界。换言之,相比较插值本身,不同的插值算法会带来更多的误差。还可以看到,HOP-5×5抠图的双线性插值与cubic插值之间的差距,要大于IndexNet抠图的双线性插值与cubic插值之间的差距。我们的解释是,在训练阶段的数据增强中,我们按照DeepMatting[45]提出的将背景图片用cubic插值缩放到和前景图片相同大小。这使得我们的方法在测试的时候用cubic插值表现更佳。

基于前面的发现,我们提出随机插值数据增强用到我们的方法中。训练阶段的数据预处理中,我们随机地、等概率地选择一种插值算法,用于任何插值操作。因此,在训练的一个小批量中,合成图像可能是由不同的插值算法生成的。此外,前景、背景、alpha matte图像在合成前可以用不同的插值算法来缩放。如表1所示,使用随机插值数据增强的训练,不仅提高了性能,而且缩小了双线性插值和cubic插值之间的差距。

4.2 在Composition-1k测试集上的结果

Composition-1k测试集[45]包含1000张合成图像,其合成于50个不同的前景。我们将我们的方法和最先进方法进行比较,结果如表2所示。w/o HOP+RI表示主干网络没有HOP块,训练的时候使用随机插值数据增强。我们方法的不同版本都优于最先进方法。在Composition-1k测试集上的一些定性结果如图5所示。DeepMatting[45]的结果来自源码和IndexNet[29]提供的预训练模型。

表2 在Composition-1k 上的定量结果。PosE表示位置编码,TriE表示Trimap嵌入,RI表示随机插值数据增强。
图5 在Composition-1k  上的定性对比

此外,我们在表4中与一些最先进模型比较了参数量和模型速度。我们对Composition-1k测试集中的每张图像在NVIDIA RTX 2080 Ti GPU上评估平均推理时间。需要注意的是,Context-aware Matting和DeepMatting需要大于11G GPU来估计Composition-1k测试集的高分辨率图像的alpha matte。因此我们在这两个方法上将图像缩小至0.8倍。

表 4 在 Composition-1k  测试集上的参数量和速度对比。使用单个NVIDIA RTX 2080 Ti,11G内存。DeepMatting和Context-aware的图像缩小0.8倍。

4.3 在Alphamatting.com数据集上的结果

alphamatting.com数据集有8个测试图像用于线上基准评估。每个测试图像有3个trimap,即small、large、user。表3是我们方法在alphamatting.com上的排名的平均值。合计排名是在每种评估指标下所有3种trimap的结果排名的平均值。如表3所示,在不同的评估指标下,我们的HOP Matting 优于其它最先进方法。

表3 在alphamatting.com基准上的分数

4.4 消冗研究

为了验证网络的各个组成部分都是有用的,我们在Composition-1k测试集上进行了3个不同的实验。我们首先去掉不同的HOP块来评估HOP-5×5模型。从表5的结果可以看出,层次化透明度传播结构能够提升抠图的性能。Global & Local Self-attention是指用全局自注意力替换全局HOP、用局部自注意力替换局部HOP的方法。第二项消冗研究中,我们表明了在我们方法中使用位置编码、trimap嵌入和随机插值数据增强的效果。在Composition-1k测试集[45]上评估的定量结果见表6。补充材料中,我们还报告了不同邻域窗口大小的结果。

表5 HOP-Local-k表示解码器中第k个局部HOP块
表6

4.5 HOP结构的可视化

将HOP结构的注意力图可视化能够很方便地有助于理解在我们方法中透明度信息是如何层次化地传播的。为实现此目的,我们在输入图像上的梯度图来可视化我们模型所关注的地方。我们在预测的alpha matte的未知区域上随机选择一个像素。然后将较大的损失分配给该单个像素,并且假设预测的所有其他像素完全正确而没有任何损失。然后,执行反向传播,并将梯度反向传播至输入图像。梯度图显示了输入图像的每个像素与预测中选定的alpha matte像素之间的关系。我们在图6中展示了Composition-1k测试集[45]的图像的梯度图。无HOP块的结果来自表5中我们为消冗研究训练的模型。如图6所示,带有HOP块的模型能够聚合整张图的信息,并且能更加关注具有相似外观的区域,无HOP块的模型则更关注所选预测点周围的局部区域。

图6

5. 结论及未来工作

本文提出层次化透明度传播方法来抠图,使用局部HOP块和全局HOP块来实现不同语义级别的特征图的透明度信息传播。实验结果证明该方法的优越性。此外,消冗研究表明我们的位置编码和随机插值数据增强是有用的。考虑到全连接注意力网络的成功[32],未来研究全连接HOP块网络是由希望的。另外一个有趣的未来工作是堆叠的局部HOP块和全卷积块的混合网络。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容