[CVPR2020]论文翻译:SCATTER: Selective Context Attentional Scene Text Recognizer

幻灯片1.PNG
幻灯片2.PNG
幻灯片3.PNG
幻灯片4.PNG
幻灯片5.PNG
幻灯片6.PNG
幻灯片7.PNG

Abstract

场景文本识别(STR)是针对复杂图像背景识别文本的任务,是一个活跃的研究领域。当前最先进的 (SOTA) 方法仍然难以识别以任意形状编写的文本。本文介绍了一种名为"选择性上下文"文本识别器(SCATTER)的STR新架构。SCATTER 在训练期间利用具有中间监督的堆叠块体系结构,为成功训练深度 BiLSTM 编码器铺平了道路,从而改进了上下文依赖的编码。使用两步 1维注意力机制进行解码。第一个注意力步骤将来自 CNN 骨干的可视要素与 BiLSTM 图层计算的上下文要素重新加权。第二个注意力步骤,类似于前面的论文,将特征视为一个序列,并关注序列内关系。实验表明,该方法在不规则文本识别基准上的平均性能超过SOTA性能3.7%。

1. Introduction

我们处理在自然场景中阅读文本的任务,通常称为场景文本识别 (STR)。尽管STR自90年代末以来一直活跃,但直到最近才达到商业应用的水平,这主要是因为计算机视觉任务的深度神经网络研究取得了进步。STR 的应用包括识别自动驾驶中的街道标志、公司logo、盲人辅助技术和混合现实中的翻译应用。

自然场景中的文本具有多种背景和任意成像条件的特点,这些特征可能导致低对比度、模糊、失真、低分辨率、不均匀的照明和其他现象和伪影。此外,可能的字体类型和大小的绝对数量增加了 STR 算法必须克服的另一层困难。通常,识别场景文本可分为两个主要任务 - 文本检测和文本识别。文本检测是识别自然图像中包含任意文本形状的区域的任务。文本识别处理将包含一个或多个单词的裁剪图像解码到其内容的数字字符串中的任务。

本文提出了一种文本识别方法;我们假设输入是从自然图像裁剪的文本图像,输出是裁剪图像中识别的文本字符串。根据以前的工作[1,16]分类,文本图像可分为两类:不规则文本 任意形状的文本(如曲线文本)如图1所示,以及具有几乎水平对齐字符的文本的常规文本(补充材料中提供了示例)。
传统的文本识别方法 [37、 38、42] 按字符检测和识别文本字符,但是,这些方法具有固有的局限性: 它们不利用字符之间的顺序建模和上下文依赖关系。

现代方法将STR视为序列预测问题。此技术可减轻对字符级注释(每字符边界框)需求,同时实现卓越的精度。这些基于序列的方法大多数依赖于连接主义时序分类 (CTC) [31, 7] 或基于注意力的机制 [33, 16]。最近,Baek等人[1] 提出了一个模块化的四步 STR 框架,其中各个组件可互换,允许使用不同的算法。图 1 (a) 描述了此模块化框架及其性能最佳的组件配置。在这项工作中,我们在这个框架上构建并扩展它。

虽然准确识别常规场景文本仍然是一个开放问题,但最近不规则的STR基准(例如,ICD15、SVTP)已将研究重点转移到任意形状识别文本的问题上。例如,Sheng 等人 [30] 采用了用于 STR 的转换器 [35] 模型,利用转换器捕获长程上下文依赖关系的能力。[16] 中的作者通过 2D 注意力模块将 CNN 骨干网的视觉特征传递到解码器。Mask TextSpotter [17] 使用共享骨干结构统一了检测和识别任务。对于识别阶段,使用两种类型的预测分支,并且根据置信度更高的分支的输出选择最终预测。第一个分支使用字符的语义分割,并需要额外的字符级注释。第二个分支使用 2D 空间注意力解码器。

大部分上述STR方法通常在编码器和/或解码器中使用递归神经网络(RNN)或其他序列建模层(例如,多头注意力[30])执行顺序建模步骤。执行此步骤以将视觉特征图转换为上下文特征图,从而更好地捕获长期依赖关系。在这项工作中,我们建议使用堆叠的块体系结构进行重复的特征处理,该概念类似于在其他计算机视觉任务中使用的概念,例如[40]和随后的[27,26]。以上作者表明,与中间监督结合使用的重复处理可用于逐步完善预测。

在本文中,我们提出了选择性上下文注意力文本识别器(SCATTER)体系结构。

如图1所示,我们的方法利用堆叠块结构进行重复处理,并在训练中进行中间监督,并采用了新颖的选择性解码器。选择解码器从网络的两个不同层接收特征,即来自CNN骨干的视觉特征和BiLSTM层计算的上下文特征,同时使用两步一维的注意力机制。图2示出了针对不同的堆叠布置在中间辅助解码器处计算的精度等级,从而证明了随着相继添加附加块,性能的提高。有趣的是,按顺序进行附加块训练可以带来中间解码器的准确性的提高(与使用较浅的堆叠结构进行训练相比)。

本文提出了两个主要贡献:
  1. 我们提出了一种用于文本识别的重复处理体系结构,并在中间选择性解码器的监督下进行了训练。使用这种架构,我们训练了一个深层的BiLSTM编码器,从而在不规则文本上达到SOTA结果。
  2. 选择性注意力解码器,通过采用两步注意力机制同时解码视觉和上下文特征。第一注意力步要弄清楚要注意哪些视觉和上下文特征。第二步将特征视为一个序列,并处理序列内关系。

2. Related Work

STR在过去几年中引起了相当大的关注[34、36、3、20]。关于场景文本检测和识别的综合调查可以在[43,1,21]中找到。
如上所述,STR可以分为两类:常规文本和不规则文本(补充材料中提供了更多示例)。早期的论文[37,38,42]专注于常规文本,并使用了自下而上的方法,该方法涉及使用滑动窗口对单个字符进行分割,然后使用手工制作的特征来识别字符。上述自下而上方法的一个显着问题是,它们难以使用上下文信息。相反,他们依靠准确的字符分类器。 Shi等。 2015 [31]和He等。 [11]认为单词是不同长度的序列,并采用RNN对序列进行建模而没有明确的字符分离。 Shi等。 2016 [32]提出了一种成功的使用序列方法的端到端可训练架构,而无需依赖于字符级注释。
他们的解决方案使用BiLSTM层从输入特征图中提取顺序特征向量,然后将这些向量馈入关注门控循环单元(GRU)模块进行解码。
上面提到的方法在STR准确性上大大提高了公共基准。因此,最近的工作将重点转移到了识别形状不规则的文本这一更具挑战性的问题上,从而促进了新的研究方向。诸如输入校正,字符级分割,2D注意特征图和自我注意之类的话题已经出现,将信封推向不规则的STR。 Shi等。 2018 [33]调整为定向或
基于空间变压器网络(STN)的弯曲文本。
刘等。 2018 [19]引入了字符感知神经网络(Char-Net)来检测和纠正单个字符。编码器-解码器框架中用于语音识别任务的CTC注意机制的组合用于[45]中的STR,显示了联合CTC注意学习的好处。 [7]中的作者提出了两个监督分支来处理显式和隐式语义信息。在[4]中,门被插入到循环解码器中,用于控制先前嵌入向量的传输权重,这表明解码并不一定需要上下文。 Mask TextSpotter [17]的作者以端到端的方式统一了文本检测和文本识别。为了识别,他们使用了两个单独的分支,一个使用视觉(局部)特征的分支,另一个使用了2D注意形式的上下文信息的分支。
最近的方法提出了利用各种注意力机制来改善结果的方法。 Li等。 [16]结合了视觉和上下文特征,同时在编码器-解码器中利用了2D注意。其他研究人员借鉴了自然语言处理(NLP)领域的思想,并采用了基于转换器的架构[35]。其中之一是Sheng等。 [30],它为编码器和解码器都使用了一种自动注意机制。
我们的方法与上述方法不同,因为它是第一个使用堆叠式块体系结构进行文本识别的方法。即,我们表明,以中间选择性解码器作为监督训练的文本识别重复处理(与[40,27,26]相似)越来越多地完善了文本预测。

3. Methodology


如图 3 所示,我们提出的结构由四个主要组件组成:

  1. 变换:使用空间变换网络(STN)[13]对输入文本图像进行规范化。
  2. 特征提取:使用文本注意力模块 [7] 将输入图像映射到特征图表示形式。
  3. 视觉特征优化:为视觉特征中的每一列提供直接监督。此部分通过将每个要素列分类为单个符号来优化每个要素列中的表示形式。
  4. 选择性上下文优化块:每个块由一个两层 BILSTM 编码器组成,用于输出上下文特征。上下文特征 CNN 主干网计算的可视特征串联在一起。然后,将此串联特征图送入选择性解码器,该解码器采用两步 1维注意力机制,如图 4 所示。



    在本节中,我们描述了SCATTER的训练结构,同时描述了训练和推理的区别。

3.1. Transformation

转换步骤在裁剪的文本图像 X 上操作,并将其转换为规范化图像 X'。我们使用薄板样条 (TPS) 变换(STN 的变体),如 [1] 中使用的。TPS 在一组基准点之间采用平滑的样条插值。具体地说,它会检测文本区域顶部和底部的预定义基准点数,并规范化预测区域到恒定的预定义大小。

3.2. Feature Extraction

在此步骤中,卷积神经网络 (CNN) 从输入图像中提取特征。我们使用 29 层 ResNet 作为 CNN 的骨干,如 [5] 中使用的。特征编码器的输出为 512 通道(按 N 列)。具体地说,特征编码器获取输入图像 X'并输出特征图 F =[f1、f2、...、fN]。在特征提取之后,我们使用类似于 [7] 的文本注意力模块。注意力特征图可视为长度 N 的可视特征序列,表示为 V = [v1、v2、...,vN ],其中每列表示序列中的帧。

3.3. Visual Feature Refinement

在这里,视觉特征序列V用于中间解码。此中间监督旨在优化 V 的每个列中的字符嵌入(表示),并使用基于 CTC 的解码。我们通过一个完全连接的层馈送 V,该层输出长度为 N 的序列 H。输出序列被输入 CTC [8] 解码器以生成最终输出。CTC 解码器将输出序列张量转换为标签序列上的条件概率分布,然后选择最可能的标签。The transcription procedure

3.4. Selective-Contextual Refinement Block

3.4.1 Selective-Decoder

我们采用两步注意力机制,如图4所示。首先,我们在特征图 D上操作1维自注意力机制。全连接层从这些特征中计算注意力特征图。接下来,在注意力图和D之间计算像素积,生成注意力特征 D'。D'的解码使用单独的注意解码器完成,因此对于每个t时间步数,解码器输出yt,类似于 [5, 2]。

3.5. Training Losses

3.6. Inference

一旦训练完成,在测试时间,我们将删除所有中间解码器,因为它们仅用于额外的监督和中间特征的改进。 视觉特征V由所有块中的BiLSTM层处理,并且还通过跳过连接直接馈送到最终的选择解码器。 最终的选择性解码器用于预测字符的输出序列。 这些变化的可视化可以在图3和图1(b)中看到,图3中所有绿色操作都在推理过程中被禁用。

4. Experiment

在本节中,我们通过实验论证了我们提出的框架的有效性。首先,我们将简要讨论用于训练和测试的数据集,然后描述我们的实现和评估设置。接下来,我们将模型与公共基准数据集(包括常规文本和不规则文本)的最先进的方法进行比较。最后,我们解决我们的方法的计算成本。

4.1. Dataset

在这项工作中,所有SCATTER模型都在三个综合数据集上进行训练。该模型在四个规则场景文本数据集:ICDAR2003,ICDAR2013,IIIT5K,SVT和三个不规则文本数据集:ICDAR2015,SVTP和CUTE上进行了评估。

训练数据集是三个数据集的联合:

MJSynth(MJ)[12]是图像数据集中的合成文本,其中包含900万个单词盒图像,这些图像是由90K个英语单词的词典生成的。
SynthText(ST)[10]是图像数据集中的合成文本,旨在用于场景文本检测和识别。如[1]中所使用的,我们使用由5.5M样本组成的SynthText数据集的变体。此变体不包含任何非字母数字字符。
SynthAdd(SA)[16]是图像数据集中的合成文本,包含120万个单词框图像。此数据集是使用与ST中相同的合成引擎生成的,旨在缓解其他数据集中缺少非字母数字字符(例如标点符号)的情况。

所有实验均在以下所述的七个真实单词的STR基准数据集中进行评估。与许多STR手稿(例如[33,1,16])一样,基准数据集通常会根据文本布局分为规则文本和不规则文本。

规则文本数据集包括以下内容:

IIIT5K[25]由从Google图像搜索中裁剪的2000幅训练图像和3000幅测试图像组成。
SVT[37]是从Google街景图像收集的数据集,包含257个训练图像和647个测试单词盒裁剪图像。
ICDAR2003[23]包含867个字盒裁剪的图像以进行测试。
ICDAR2013 [15]包含848个训练和1,015个测试字盒裁剪图像。

不规则的文本数据集包括以下内容:

ICDAR2015[14]包含4,468份训练和2,077个测试的单词框裁剪图像,所有图像均由Google Glass捕获,没有仔细定位或聚焦。
SVTP[28]是从Google街景图像中收集的数据集,由645个裁剪后的文字框图像组成,用于测试。
CUTE 80[29]包含288个裁剪过的单词盒图像以进行测试,其中许多是弯曲的文本图像

4.2. Implementation Detail

我们使用Baek等人的代码https://github.com/clovaai/deep-text-recognition-benchmark[1]作为基线,我们的网络结构更改是在此基础上实现的。所有实验均在带有16GB内存的Tesla V100 GPU上使用PyTorch框架进行训练和测试。至于训练细节,我们没有进行任何类型的预训练。我们使用AdaDelta优化器进行训练,并使用以下训练参数:衰减率为0.95,梯度限幅为5,批量大小为128(在MJ, ST和SA上采样率分别为40%,40%,20%)。我们在训练期间使用数据增强,并通过随机调整它们的大小并添加额外的失真来增强40%的输入图像。每个模型在统一训练集上训练了6 个epoch。对于我们内部
验证数据集,我们使用IC13,IC15,IIIT和SVT训练部分的并集来选择最佳模型,如[1]中所述。按照常规做法,在训练和测试期间,所有图像的大小都会调整为32×100。在本文中,我们使用36个符号类别:10位数字和26个不区分大小写的字母。对于用于CTC解码的特殊符号,将附加的“ [UNK]”和“ [blank]”添加到标签集中。对于选择解码器,添加了三个特殊的标点符号:“ [GO]”,“ [S]”和“ [UNK]”,它们指示序列的开头,序列的结尾和未知字符(非字母) -numeric)。

推断时,我们采用与[16、39、22]类似的机制,其中高度大于其宽度的图像分别顺时针和逆时针旋转90度。旋转的版本与原始图像一起被识别。预测置信度得分将计算为直到“ [S]”之前的平均解码器概率。然后,我们选择置信度得分最高的预测作为最终预测。与[33、16、30]不同,我们不使用波束搜索进行解码,尽管[16]中的作者报告称,由于它增加了等待时间,因此将准确性提高了约0.5%。

4.3. Comparison to State-of-the-art

在本节中,我们将结果与最新的SOTA识别方法进行比较,然后在几种规则和不规则场景文本基准上测量所提出框架的准确性。如表1所示,在不规则场景文本基准(即IC15,SVTP,CUTE)上,我们的具有5个块的SCATTER体系结构优于当前的SOTA,即Mask TextSpotter [17]算法,平均绝对差值为3.7%。我们的方法在IC15上的精度提高了+4.0 pp(78.2%对82.2%),在SVTP上提高了+3.3 pp(83.6%对86.9%),是在CUTE上屏蔽TextSpotter [17]的第二好的方法( 88.5%与87.5%)的数据集。另外,所提出的方法在SVT和IC03常规场景文本数据集上均优于其他方法,并且在其他常规场景文本数据集(即IIIT5K和IC13)上实现了可比的SOTA性能。

总而言之,我们的模型在7个基准中的4个中获得最高的识别分数,在另外2个基准中获得次优的分数。与其他在常规或不规则场景文本基准测试中表现良好的方法不同,我们的方法在所有基准测试中均表现最佳。

我们想简要讨论Mask TextSpotter [17]与这项工作之间的主要区别。 [17]中的算法依赖于包含字符级的注释,这是我们算法不需要的信息。如原始论文中所述,这些注释对常规和不规则文本数据集的平均贡献分别为0.9 pp和0.6 pp。因此,在没有字符级别注释的情况下,我们的模型在常规文本上的效果略好(93.9%比94%),并且效果明显更好
不规则文字(分别为79.4%和83.7%)。另一方面,我们的方法不需要这些注释,这些注释既昂贵又难以注释,特别是对于真实数据。



在图5中,我们显示了我们方法的失败案例。失败案例主要由模糊图像,部分字符遮挡,困难的光照条件和标点符号的误识别组成。

4.4. Computational Costs

如图1所示,在推理过程中,只有最后一块的选择性解码器保持活动状态。我们提出的具有单个块的结构的总计算成本为20.1 ms。推理期间每个中间上下文细化块的额外计算成本转换为每个块3.2毫秒。对于5块体系结构(我们的最佳设置),这意味着总共增加了12.8毫秒,总前向传播耗时32.9毫秒。

此外,给定推理时间的计算预算,可以通过训练带有大量块的系统并将其修剪以进行推理来提高性能。例如,用五个块训练的体系结构然后被修剪为单个块,就能够胜过仅用单个块训练的结构。图2(2c)展示了一个训练有五个块的网络以及中间解码器的平均测试精度。这表明在常规的不规则数据集上(在相同的计算预算下),修剪分别导致+0.4 pp和+1.3 pp的增加。 SCATTER的这一新颖功能允许在需要时进行更快的推断,在某些情况下,修剪甚至可以提高结果。

5. Ablation Experiments

在本节中,我们将进行一系列实验,以更好地理解性能改进并分析关键贡献的影响。 在本节中,我们使用规则和不规则测试数据集的结果的加权平均值(按样本数)。 为了完整起见,表2中的第一行和第二行显示了[1]中的报告结果,以及我们的自定义训练设置对[1]的重新训练模型的改进结果。

5.1. Intermediate Supervision & Selective Decoding

表2(a)部分显示了通过添加中间CTC监督和提出的选择性解码器而提高的准确性。 在(a)节的第二行和第三行之间,我们添加了一个CTC解码器,用于中间监督,可将规则文本和不规则文本的基线结果分别提高+0.2 pp和+0.4 pp。 第四行通过用提出的选择性解码器替换标准注意力解码器(分别对常规文本和不规则文本分别为+0.4 pp和+2.7 pp)展示了与基线结果相比的改进。
表2(b)部分显示了通过更改中间监督的数量(从1到3),使用具有4个BiLSTM层的SCATTER体系结构,精度的单调提高。 对于规则文本和不规则文本,(b)节的准确性的相对提高分别为+0.7 pp和+2.9 pp。

5.2. Stable Training of a Deep BiLSTM Encoder

如介绍部分所述,以前的论文仅使用2层BiLSTM编码器。 [45]中的作者报告说,当BiLSTM编码器中的层数增加时,精度会下降。我们重现[45]中报告的实验,该实验是在编码器中增加BiLSTM层数的基础架构上训练基线架构(结果在补充材料中)。我们观察到与[45]中类似的现象,即使用两个以上BiLSTM层时精度降低。与该发现相反,表2表明,在SCATTER中增加BiLSTM层数的总体趋势是,在增加中间监督数的同时,提高了准确性。对于规则和非规则文本数据集,识别精度最多可单调提高10个BiLSTM层。

从表2(c)可以明显看出,当在编码器中使用10个以上的BiLSTM层进行训练时,规则和不规则文本的准确度结果略有下降(分别为-0.4 pp和-0.5 pp),而规则和不规则文本均下降(相似现象是在验证集上观察到)。预计增加网络容量将导致更具挑战性的训练程序。其他训练方法可能需要考虑成功地训练以融合非常深的编码器。这样的方法可能包括增量训练,在这种训练中,我们首先使用少量块在较浅的网络中进行训练,然后在训练过程中逐渐堆叠更多的块。

中间预测的示例在表3中可见,显示了SCATTER逐渐完善文本预测的能力。

5.3. Oracle Decoder Voting

在表4中,显示了在经过5个块训练的SCATTER体系结构上中间解码器的测试精度。 最后一行总结了甲骨文的潜在结果,即对于每个测试图像,如果任何一个解码器中都存在一个正确的预测,它都会选择正确的预测。 如果存在在不同解码器预测之间进行选择的最佳策略,则所有数据集上的结果将达到新的最新水平。 通过这样的预言,可能会提高准确性,整个数据集的精度在+0.8 pp至最高+5 pp之间。 可能的预测选择策略可能基于集成技术或预测每个特定图像使用哪个解码器的元模型。

6. Conclusions and Future Work

在这项工作中,我们提出了一个名为SCATTER的堆叠块网络结构,该结构可实现SOTA识别精度,并为使用深层BiLSTM编码器的STR网络提供稳定,更强大的训练。这是通过在网络层上添加中间监督并依靠新颖的选择性解码器来实现的。

我们还证明,使用中间选择性解码器作为监督训练的,用于文本识别的重复处理结构,日益完善了文本预测。另外,由于我们提出的新颖性不限于我们的注意力公式,所以其他注意力方法也可以受益于堆叠注意解码器。

我们考虑了未来工作的两个有希望的方向。首先,在图2中,我们显示训练较深的网络,然后修剪最后的解码器(和层)比训练较浅的网络更可取。考虑到计算预算的限制,这可能导致性能提高。最后,我们看到了在针对每个图像的不同解码器的预测之间开发最佳选择策略的潜力。

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