[翻译]Learning Deep Features for Discriminative Localization

英文原文请点这里

摘要 在这项工作中, 我们重新审视了《 Network in network》中提出的全局平均 池化层(global average pooling),并阐明了它是如何通过图片标签就能让卷积神经网络具有卓越的定位能力。虽然这项技术以前被当做正则化训练的一种方法,但是我们发现它实际构建了一种通用的适用于各种任务的能定位的深度表示。尽管global average pooling很简单,我们仍然能够在2014年的ILSVRC物体定位比赛中得到37.1%的top-5错误率,与CNN的34.2%top-5错误率非常接近。我们证明了我们的网络能在各种任务中区分图像区域进行定位,尽管没有经过(定位)训练。

1 Introduction

最近Zhou等人的《Object detectors emerge in deep scene cnns》表明CNN的各个层的卷积单元实际上是物体检测器,尽管没有对物体的位置进行监督。尽管卷积层定位物体的能力很出色,但当用全连接层进行分类时,这种能力会丧失。最近,一些流行的全连接层和卷积层的神经网络,比如Network in Network(NIN)和GoogLeNet,已经提出通过避免使用全连接层的方式来最小化参数并且保持高性能的方法。

为了实现这一目标,NIN使用global average pooling来做正则化,避免训练过程中的过拟合。在我们的实验中,发现global average pooling的优势远不止正则化——实际上,只需要稍微调整一下,网络就可以保持卓越的定位能力,直到最后一层。这样的微调使辨别图像区域变得十分简单,即使对那些最初没训练的网络也是如此。如图1(a)所示,在物体分类上训练的CNN能够成功的将动作分类的区分区域定位为与人类交互的物体而非人类本身。


图1. 简单修改的global average pooling层结合我们的class activation mapping(CAM)技术使训练过的分类CNN既能分类又能定位每类图具体的分类区域,比如brushing teeth中的toothbrush和cutting trees中的chainsaw

尽管我们的方法显得很简单,在ILSVRC的弱监督物体定位比赛中,我们最好的网络在测试集中达到了37.1%的top-5错误率,这与全监督的AlexNet达到的34.2%top-5错误率极其接近。此外,我们还证明所提方法中的深度特征可以很容易地用于其他数据集的分类、定位和概念发现(concept discovery)。

1.1 Related Work

卷积神经网络在视觉识别任务中有着令人印象深刻的表现。近期的研究表明,尽管在图片级的标签上训练,CNN在定位上也有着卓越的能力。本文中,我们证明了只要使用正确的架构,就能将这种能力泛化到不仅仅是定位物体,而是标定图片中具体哪一个区域正在用于分辨物体。这里,我们讨论与这些研究最相关的两条主线:弱监督对象定位和可视化CNN的内部表示。

弱监督物体定位(Weakly-supervised object localization) 最近已经有很多用CNN做弱监督定位的研究了。Bergamo等人提出了一种“自己学习的(self-taught)”物体定位方法,为了实现物体定位,通过掩盖图片区域来寻找引起最大激活的区域。Cinbis等人用CNN特征结合多实例的学习定位物体。Oquab等人提出了一种能转换中级图像的方法,并且展示了一些物体的定位能通过评估CNN在多重叠区域的输出实现。但是,这些作者并没有对定位能力做评估。此外,这些方法虽然产生了想要的结果,但并不是端到端的训练,需要提前做一系列额外工作,然后输入网络来定位物体,这使它们很难泛化到真实世界的数据集。我们的方法是一个端到端的,而且只需要输入图片就可以定位物体。
与我们的方法最相近的是Oquab提出的基于global max pooling的方法。不同于global average pooling,他们用global max pooling来定位物体的点。但是,它们的定位局限于物体边缘的点,而不是确定物体的全部范围。我们认为虽然max和average很相似,但是平均池化更鼓励网络识别完整的物体区域。背后的原理是average pooling网络相比于max pooling识别整个物体的辨别性区域的损失更小。在3.2部分有详细的说明及验证试验。此外,不同于Oquab,我们证明了这种定位能力能够泛化,甚至能用于侦测网络没有训练过的数据。
我们使用class activation map来代表每个图中的激活图的权重,如第2部分所述。我们想要强调的是,global average pooling不是我们提出来的新技术,我们的创新点在于用它来精确定位区别性区域(discriminative localization)。我们相信,这种简单的技术可移植性很好,能应用于快速精确地解决很多计算机视觉中的定位问题。
可视化卷积神经网络: 最近有很多关于可视化卷积神经网络内部的研究,试图对其属性有更好的表现。Zeiler等人用反卷积网络来可视化激活每个单元的模式。Zhou等人发现CNNs被训练识别场景时会学习物体侦测,并证明了统一网络既能进行场景识别,又能进行物体定位。这些研究都只分析了卷积层,忽略了全连接层,因此是不全面的(国外论文好文艺,原文如是描述:thereby painting an incomplete picture of the full story)。通过移除全连接层并尽可能保持性能,能从头到尾更好的了解我们的网络。
Mahendran等人和Dosoviskiy等人通过转化不同层的深度特征分析了CNN的可视化解码。虽然这些方法可以转化全连接层,但是只展示了深层特征中什么信息被保留,并没有凸显出这些信息的相对重要性。不同于Mahendran和Dosoviskiy,我们的方法你能凸显出图片的那个区域是区别性区域。总的来说,我们的方法是对CNN的另一种深入呈现。(又是很文艺的说法:our approach provides another glimpse into the soul of CNN)

2 Class Activation Mapping

这一部分,我们描述了用CNN的global average pooling(GAP)生成class activation maps(CAM)的过程。某一确切分类的CAM代表了CNN用于做分类时所看的区别性区域的位置(如图3)。生成CAM的过程如图2。


图2 CAM:预测的类别分数被映射回先前的卷积层以生成类别激活图(CAM),CAM凸显了特定类的区别性区域

图3 ILSVRC中四个分类的CAM图。这些图将图片中用于分类的区别性区域高亮标记,例如,hen和briard的头,barbell上的圆盘,

我们使用了与Network in Network和GoogLeNet相似的网络结构——网络的大部分都是卷积层,只在输出层前(用于分类的softmax)使用global average pooling层,并将它们作为得出分类的全连接层的特征。通过这种简单的连接结构,我们可以把图片中的重要区域用输出层权重映射回卷积层特征的方式标记出来,我们称这种技术为类激活映射(CAM)。
如图2所示,全局平均池化层输出最后一个卷积层的每个单元的特征图(feature map)的平均值。这些值的加权总和用于生成最后的输出。也可以说,我们计算最后一个卷积层特征图的加权总和来获得我们的CAM。我们在下面用更规范的方式描述softmax的情况。同样的技术可以用于其他的回归函数或损失函数。
对于一个给定的图,用fk(x, y)代表最后一个卷积层在空间坐标(x,y)中单元k的激活值。然后,对于每个单元k,通过GAP后的结果Fk为∑x,yfk(x, y)。则,对于每个类c,输入softmax的Sc为∑kwc,kFk,wc,k代表单元k对应的类c的权重。实际上,wc,k就是Fk对类c的重要性。最后类c的sotfmax输出Pc为exp(Sc)/∑cexp(Sc)。这里我们忽略偏差项:我们明确地把softmax的偏差项设置为0因为它几乎对分类表现没有影响。
把Fk=∑x,yfk(x, y)带入Sc,得
公式1

我们用Mc定义类别c的CAM,则空间每个元素为
公式2

则Sc = ∑x,yMc(x,y),所以Mc(x,y)直接表明了把空间网格(x,y)激活对图片划分为类别c的的重要性。
根据先前的研究,直观地讲,我们都希望用一些可视化方法看到每个被激活的单元的激活区域,fk就是这种可视化方法。CAM简单说就是不同空间区域的线性加权可视化。将类激活图的大小改变成输入图片的大小,就能清楚地看出与特定类最相关的区域。
图3展示了一些CAM输出的用例,可以看到不同类的区别性区域已经高亮。在图4,我们展示了同一张图用不同类别的c生成的CAM图的不同之处。我们发现即使是同一张图,对不同类的区别性区域也不同。这说明我们的方法与预期一样。我们在前面的部分证明了这一点。
图4 同一张图片的top-5预测类生成的CAM图。预测的类和是该类的概率在CAM图上方。我们发现预测为各个类的高亮区域都不同,比如dome激活了上半部分而palace激活的是下半部分。

全局平均池化层(GAP)VS全局最大池化层(GMP):鉴于之前有的研究使用GMP做弱监督物体定位,我们认为很有必要直观地对比一下GAP和GMP的高亮区域的不同。比起GMP的鼓励网络只关注1个discriminaltive part,GAP更鼓励网络识别对象的整个范围。因为当求平均数时,这个值可以通过找所有discriminative part来最大激活而低激活减少了特定的输出。另一方面,对于GMP,所有图的低分区域(除了最有区分力的一个),都不会对得分有影响,因为你只取了max。我们在第三部分用ILSVRC数据集验证了此想法:GMP的分类性能与GAP相当,GAP的定位能力要强于GMP。

3 Weakly-supervised Object Localization

在这一部分,我们在ILSVRC2014数据集上评估了CAM的定位能力。我们先描述了实验的设置和用到的CNN网络,见3.1部分。然后在3.2部分验证了我们的技术不会在学习定位时对网络产生不利影响,并详细给出了弱监督对象定位的结果。

3.1 Setup

我们用下面这些流行的CNN网络评估CAM的影响:AlexNet,VGGnet和GoogLeNet。通常来讲,我们把这些网络的全连接层全部移除,替换为GAP,然后接一个softmax全连接层。
我们发现GAP前的最后一个卷积层有较高空间分辨率时网络的定位能力可以得到改善,我们之称为图分辨率(mapping resolution)。为了做到这一点,我们移除了一些网络的卷积层。具体来说,我们做了下面改动:对AlexNet,我们移除conv5之后的卷积层(pool5到prob),得到图分辨率(mapping resolution)为13x13。对VGGnet,我们溢出了conv5-3后的所有卷积层(pool5到prob),得到14x14的图分辨率。对GoogLeNet,我们溢出了inception4e后的卷积层(pool4到prob),得到14x14的图分辨率。对上述的每个网络,我们都添加一个3x3,步长为1,padding为1,1024个单元的卷积层,然后接一个GAP层和一个softmax层。最后对每个网络在ILSVRC的1.3M张要分成1000类的训练图片进行精调(fine-tuned),分别产生我们最终的AlexNet-GAP,VGGnet-GAP和GoogLeNet-GAP。
对于分类,我们与原始的AlexNet,VGGnet和GoogleNet与做了比较,也提供了Network in Network的结果。对于定位,我们与原始的GoogLeNet和NIN进行了比较,还用反向传播代替了CAM。此外,为了比较average pooling和max pooling,我们也提供了用max pooling训练的GoogLeNet的结果(GoogLeNet-GMP)。
我们使用一样的误差矩阵(top-1,top-5)作为ILSVRC对分类和定位的评估指标。对于分类,我们对ILSVRC的验证集进行了评估,对于定位,我们在验证集和测试集上都做了评估。

3.2 Results

我们先提供了在分类上的结果,以证明我们的方法没有对分类性能产生明显的不良影响。然后我们有证明了我们的方法在弱监督物体定位上十分有效。
分类:Tb.1总结了原始网络与我们的GAP网络的分类性能。我们发现多数情况下从各个网络中移除多余的网络层使分类性能下降了1%~2%。我们观察到AlexNet是移除全连接层后分类性能受影响最大的网络。作为补偿,我们在它的GAP层前添加了两个卷积层,得到AlexNet-GAP网络。我们发现AlexNet-GAP与AlexNet的性能相当。因此,总体而言,我们的GAP网络很大程度地保留了网络的分类性能。此外,与预期的一样,我们观察到GoogLeNet-GAP和GoogLeNet-GMP的分类性能相似。注意,为了在定位上得到好的表现,网络的分类性能很重要,因为它决定了网络是否能准确地分类和定位的边界。

Table 1

定位:为了做定位,我们需要生成一个边界框及其关联的物体类别。为了生成CAM的边界框,我们使用简单阈值来划分热力图。我们先用大于CAM最大值的20%的值做一个边框,然后我们再用覆盖分割图中最大连通分量做一个边框。我们把预测的top-5全部如此标记出来。图6(a)展示了用这项技术生成的示例边框。在ILSVRC验证集上的定位性能见Tbl2,输出示例图见图5。

Table 2

图5. CNN-GAPs的CAM和特定类的反向传播方法

图6 (a)GoogLeNet-GAP的定位示例

我们观察到我们的GAP网络表现优于所有使用GoogLeNet-GAP的方法,达到了top-5上最低定位错误率43%,没有用任何一个带标注的边界框上训练就能达到这样表现的网络是前所未有的。我们也可以看到CAM方法明显优于反向传播的方法(比较结果见图6(b))。此外,我们发现GoogLeNet-GAP比GoogLeNet的定位性能更好,尽管得到的分类没有GoogLeNet好。我们是认为GoogLeNet(7x7)的低分辨率导致它丢失了精确地定位能力。最后,我们发现GoogLeNet-GAP比GoogLeNet-GMP表现更杰出,它的合理范围说明了average pooling在识别物体范围上比max pooling更重要。


图6(b) 使用GoogLeNet-GAP的定位(上面两个)与使用AlexNet反向传播的定位比较。真实框为绿色,预测的框为红色

为了进一步比较我们的方法与现有的弱监督和全监督CNN方法,我们评估了GoogLeNet-GAP在ILSVRC的测试集上的表现。使用一个稍微不同于上的边界框选择策略:我们选择两个边界框(一松一紧),一个从top 1st和2nd预测类的CAM中选择,一个从top 3rd预测类的CAM中选择。我们发现这种启发式方法对改善验证集表现很有帮助,表现在表3种陈列。启发式的弱监督GoogLeNet-GAP在达到top-5错误率37.1%,与全监督的AlexNet(34.2%)十分接近。虽然令人印象深刻,但如果想用同样的结构得到与全监督的网络相同的性能,还有的路要走(如,弱监督的GoogLeNet-GAP vs 全监督的GoogLeNet)。


Table 3

4 Deep Features for Generic Localization

CNN的更高层(比如AlexNet的fc6,fc7)已经被证明能提取到很有效的通用特征(generic features),其在各种个图片数据集上都有极好的性能。这里,我们证明了我们的GAP CNN学到的特征可以很好地作为通用特征,识别出用于分类的区别性区域,尽管没有针对这些特定任务进行训练。为了得到与softmax层相似的权重,我们在GAP的输出上简单训练了一个SVM。
首先,对比我们的方法与一些基准模型在下面场景及物体分类任务中的表现:SUN397 [27], MIT Indoor67[18], Scene15 [11], SUN Attribute [17], Caltech101[6], Caltech256 [9], Stanford Action40 [28], andUIUC Event8 [12]。实验设置与B. Zhou, A. Lapedriza, J. Xiao, A. Torralba, and A. Oliva.Learning deep features for scene recognition using places database. In Advances in Neural Information Processing Systems,2014.一样。表5对比了我们最好的网络GoogLeNet-GAP提取的特征与AlexNet的fc7提取的特征和GoogLeNet的ave pool提的特征比较。

表5

与预期一样,GoogLeNet-GAP和GoogLeNet的表现明显优于AlexNet。同时,我们也发现GoogLeNet-GAP和GoogLeNet表现相近,尽管前者含有更少的卷积层。总的来说,我们发现GoogLeNet-GAP的特征与最先进的技术提取的特征不相上下。
更重要的是,我们想探究使用我们的CAM技术生成的定位图是否比GoogLeNet-GAP更具有信息性,即使在这种情况下也是。图8展示了各种数据集下生成的例图。我们发现所有数据中大多数区别性区域都被高亮标出。总体来说,我们的方法在一般任务中可以有效地生成能定位的深度特征。
在4.1部分,我们将探索鸟类的更细粒度的识别,并展示我们如何评估定位能力,使用它进一步提高性能。4.2部分证明了GoogLeNet-GAP可以用于从图片中提取通用视觉模式。

4.1 Fine-grained Recognition

在这一部分,我们将提取到的通用定位深度特征用于在CUB-200-2011数据中识别200种鸟类。这个数据集包含11788张图片,5994张训练集,5794张测试集。我们选择这个数据集是因为它也包含边界框注解,能让我们评估我们定位的能力。表4总结了结果。


表4

我们发现,GoogLeNet-GAP与现有方法表现相当,在没有用任何带边界标记的数据训练过的情况下得到了全图(full-image)63%的准确率。使用边界框训练时,准确率增加至70.5%。现在,给出我们网络的定位能力,可以用3.2部分(即阈值)的方法先标出训练集和测试集中鸟的边界框,然后我们用GoogLeNet-GAP从边界框内提取特征来训练和测试。我们发现性能提高至了67.8%。在细粒度识别中,定位能力非常重要,因为类别之间的差别是极细微的,如果有更集中的裁剪区域,则会带来更好的区分度。
此外,我们发现GoogLeNet-GAP能准确定位41%的交并比为0.5(IoU,两个边界框的重叠度)的鸟,其他的只有5.5%(不确定翻译,原文为as compared to a chance performance of 5.5%)。我们在图7中足了一些可视化,进一步验证了我们方法的定位能力。


图7 选择的CUB200类别中的4个鸟的CAM和预测边框(红色)。在4.1部分,我们评估了边界框的准确率(0.5交并比的有41%)。我们发现提取这些GoogLeNet-GAP的CAM边界框并且再用SVM训练,可以将鸟的分类准确率提高约5%(表4)

4.2 Pattern Discovery

这一部分,探索我们的技术是否能识别一般元素或出物体外的图片模式,比如文本或者更高维的概念。给一些包含普通概念的图片,我们想确定网络认为哪些区域是重要的,以及是否符合输入模式。我们使用了与以前相似的方法:在GoogLeNet-GAP网络的GAP层训练了一个线性SVM,并使用CAM技术识别重要区域。我们用我们的深度特征做了三个模式的实验,结果在下方总结。注意在这种情况下,我们不需要拆分训练集和测试集——只用CNN做视觉模式探索。
发现场景中信息丰富的物体:我们从SUN数据集[27]中抽取10个包含至少200个完全注解图像的场景类别,从而产生总共4675个完全注解的图片。我们针对每个场景类别训练一对一线性SVM,并使用线性SVM的权重计算CAM。图9绘制了预测风景类别的CAM,并列出了两个场景类别的CAM高激活区域中高频覆盖的前6个物体。我们发现高激活区域经常对应于指示特定场景类别的物体。

图9 两个场景的信息丰富的物体。对Dining room和Bathroom,我们展示了原图(top),列出了6个场景中高频出现的物体以及出现频率。bottom是CAM以及列出的6个激活区域高频覆盖的物体。

弱标记图像的概念定位:使用B. Zhou, V. Jagadeesh, and R. Piramuthu. Conceptlearner:Discovering visual concepts from weakly labeled image collections.Proc. CVPR, 2015中的hard-negative mining方法学习概念检测器并用我们的CAM技术定位图片概念。为了训练一个短语的概念检测器,positive set由包含文本标题中的短语的图片组成,negative set由随机选择的图片组成,文本标题中没有任何相关词语。图10,我们可视化了排名最高的图片以及两个概念检测器的CAM图。注意,即使这些短语比典型的物体名更抽象,CAM也会将这些概念的信息区域进行定位。
图10 弱标签图片学到的信息区域概念。尽管概念相当抽象,但我们的GoogLeNet-GAP网络充分定位了这些概念。

弱监督文本检测器:我们用350个Google Street View图片训练弱监督文本检测器,positive set包含SVT数据集的文本,negative set包含从SUN数据集种随意采样的室外风景图片。如图11所示,我们的方法没使用边界框注解就准确地标出了文本区域。

图11 学习一个弱监督文本检测器。尽管我们的网络没有用text或者任何边界框注解训练,还是准确地标出了text的位置

视觉问题回答:(Interpreting visual question answering)我们用我们的方法标出与B. Zhou, Y. Tian, S. Sukhbaatar, A. Szlam, and R. Fergus.Simple baseline for visual question answering. arXivpreprint arXiv:1512.02167, 2015.中提出的视觉问题答案相关的深度特征。在Open-Ended track中,整体准确率为55.89%。如图12所示,我们的方法标出了与预测答案相关的图像区域。

图12 在视觉问题回答中预测答案相关区域的标定示例

5 Visualizing Class-Specific Units

Zhou等人展示了CNN不同层的卷积单元可以作为视觉概念检测器,识别诸如纹理和材质之类的low-level concepts和物体或者场景这些high-level concepts。深入神经网络,这些单元变得越来越有识别能力。但是,很多网络由于全连接层,变得很难确定识别不同类的不同单元起到的重要性。这里,使用GAP和排序的softmax权重,可以直接可视化这些单元对给定类的识别的重要性。这里我们将其称为CNN的指定类单元(class-specific units)。
图13展示了AlexNet*-GAP的指定类单元,分别在ILSVRC数据集做物体识别(top)和Places Database做风景识别(bottom)。我们使用与Zhou等人相似的处理估计接收区域和分割最后一个卷积层的每个单元的激活图。然后我们简单地使用softmax的权重来对每个单元做指定类的排序。从图中我们可以看出到底是哪个单元将物体分类的区别性区域标记了出来。例如,检测狗脸和体表皮毛的单元对分类湖地猎犬很重要,检测沙发、桌子和壁炉的单元对分类客厅很重要。 因此我们可以推断CNN实际上学习了一个单词包,每个单词都是一个特定类区别性区域的单元。 这些特定于类的单元的组合可以指导CNN对每个图像进行分类。


图13 可视化AlexNet*-GAP分别在ImageNet(top)和Places(bottom)上的指定类单元。展示每个数据集的前3个选定类的单元。每一行展示了接收区域单元分割最自信的图像。例如,检测黑板,椅子和桌子对场景分类中教室的类别判定很重要

6 Conclusion

本文针对使用GAP的CNN网络提出了一个叫做CAM的通用技术,这个技术可以让做过分类训练的CNN网络学会进行物体定位,不需要进行额外的边界框注解训练。CAM可以可视化预测类在任何给定图片上的得分,标出CNN检测到的物体的区别性区域。我们在ILSVRC上评估了我们的方法,进行了弱监督物体定位,证明了我们的全局平均池化层的CNN可以进行准确的物体定位。此外,我们证明了CAM定位技术可以推广到其他视觉识别任务中,也就是说,我们的技术可以生成通用的用于定位的深层特征,可以帮助其他用CNN做任务的研究人员,作为他们理解区别性区域的基础。

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

推荐阅读更多精彩内容