MaskDistill-不需要标注数据的语义分割

<p>
</p><h1><span style="font-size:16px">
</span></h1><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-773d6580b2a668bc.jpeg" img-data="{"format":"jpeg","size":80477,"height":668,"width":982}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><h1><span style="font-size:16px">本篇分享论文</span><span style="font-size:16px"><strong>『Discovering Object Masks with Transformers for Unsupervised Semantic Segmentation』,</strong></span><span style="font-size:16px">苏黎世联邦理工学院&鲁汶大学提出MaskDistill,用Transformer来进行无监督语义分割,在PASCAL VOC上SOTA!代码已开源!</span></h1>
<span style="font-size:16px">详细信息如下:</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-ab5670f8b0001e30.jpeg" img-data="{"format":"jpeg","size":33706,"height":306,"width":827}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><ol><li><span style="font-size:15px">论文地址:https://arxiv.org/abs/2206.06363</span></li><li><span style="font-size:15px">代码地址:https://github.com/wvangansbeke/MaskDistill</span></li></ol><h1><span style="font-size:16px">
</span></h1><p><span style="font-size:16px">
</span></p><p><span><strong> </strong></span><span style="font-size:19px"><strong>01 </strong></span><span><strong> </strong></span></p><h1><strong><span style="font-size:18px">摘要</span></strong></h1><span style="font-size:16px">
</span><span style="font-size:16px">无监督语义分割的任务旨在将像素聚类成具有语义意义的组。具体来说,分配给同一簇的像素应该共享高级语义属性,例如它们的对象或部件类别。</span><span style="font-size:16px">
</span><span style="font-size:16px">本文提出了 MaskDistill:一种基于三个关键思想的无监督语义分割新框架。首先,</span><span style="font-size:16px"><strong>作者提倡一种数据驱动的策略来生成对象掩码,作为语义分割的像素分组先验</strong></span><span style="font-size:16px">。这种方法省略了手工制作的先验,这些先验通常是为特定的场景组合而设计的,并限制了目前框架的适用性。其次,</span><span style="font-size:16px"><strong>MaskDistill 对对象掩码进行聚类以获得用于训练初始对象分割模型的伪ground-truth。第三,利用这个模型过滤掉低质量的对象掩码</strong></span><span style="font-size:16px">。这种策略减轻了之前像素分组中的噪声,并产生了一个干净的掩码集合,使用这些掩码来训练最终的分割模型。</span><span style="font-size:16px">
</span><span style="font-size:16px">通过结合这些组件,可以在 PASCAL (+11% mIoU) 和 COCO (+4% mask AP50) 上大大优于以前的无监督语义分割工作。有趣的是,与现有方法相反,本文的框架不锁定低级图像线索,也不限于以对象为中心的数据集。</span>
<p><span style="font-size:16px">
</span></p><p><span style="font-size:16px">
</span></p><p><span><strong> </strong></span><span style="font-size:19px"><strong>02 </strong></span><span><strong> </strong></span></p><strong><span style="font-size:18px">Motivation</span></strong>
<span style="font-size:16px">
</span><span style="font-size:16px">为图像中的每个像素分配类别标签的任务(语义分割)已被广泛研究。语义分割工具用于许多领域,如自动驾驶、医学成像和农业。今天,研究人员通过深度卷积网络处理分割任务,该网络从完全标注的数据集中学习分层图像表示,其中每个像素都与一个类别标签相关联。然而,收集这样的标注会消耗大量的时间和金钱。</span><span style="font-size:16px">
</span><span style="font-size:16px">因此,一些工作探索了劳动强度较低的标记形式来训练分割模型,例如涂鸦、边界框、点击和图像级标签。还有一些工作研究了半监督方法,这些方法通过在训练期间利用额外的未标记图像来提高性能。在本文中,作者更进一步,以自监督的方式学习分割模型。具体来说,目标是学习一个聚类函数,将语义相关的像素分配给同一个聚类,而不依赖于人工标记。</span><span style="font-size:16px">
</span><span style="font-size:16px">为了实现这一概念,端到端方法通过对图像增强视图中像素的聚类分配施加一致性来学习聚类功能。然而,这些方法倾向于锁定低级图像线索,如颜色或纹理。此外,聚类强烈依赖于网络的初始化。与这些方法不同,作者不采用端到端策略。</span><span style="font-size:16px">
</span><span style="font-size:16px">另一组工作提出了一种自下而上的方法来解决这个问题。首先,他们利用边缘检测或显着性估计等低级或中级视觉先验来寻找可能共享相同语义的图像区域。在第二步中,他们使用图像区域来学习捕获语义信息的像素嵌入。特别是,图像区域充当正则化器,消除了分割对网络初始化的依赖。随后可以通过 K-means 对像素嵌入进行聚类以获得图像分割。虽然自下而上的方法获得了更好的结果,但它们也存在一些缺点。</span><span style="font-size:16px">
</span><span style="font-size:16px">最重要的是,手工制作的先验(例如边缘或显着性)对像素进行分组的依赖限制了它们的使用。例如,显着性估计仅适用于以对象为中心的图像。此外,一些作品需要标记来识别适当的图像区域。</span><span style="font-size:16px">
</span><span style="font-size:16px">本文提出了 MaskDistill,这是一个解决上述限制的新框架。与自底向上方法一样,MaskDistill 首先识别可能属于同一对象的像素组。由于对象性是一个高级构造,因此避免使用手工制作的先验,而是提倡数据驱动的方法。作者观察到自监督视觉Transformer学习空间结构的图像表示。</span><span style="font-size:16px">
</span><span style="font-size:16px">特别是,可以通过视觉Transformer中的注意力层提取高度准确的对象掩码。与依赖手工先验的现有工作不同,这有助于将本文的框架扩展到更具挑战性的数据集。特别是,手工制作的先验往往是为特定的场景组合而设计的。例如,显着性估计适用于对象较少的图像(例如PASCAL),但不适用于更复杂的场景(例如 COCO)。本文的框架不存在这个问题。</span><span style="font-size:16px">
</span><span style="font-size:16px">本文对对象掩码进行聚类,并将结果用作伪ground-truth来训练对象分割模型,例如 Mask R-CNN。该模型预测对象掩码候选者及其置信度分数。作者观察到,较高的置信度分数与质量较好的对象掩码相关。基于这一观察,作者通过利用模型的预测构建了一组更清晰的对象掩码。具体来说,作者过滤掉每张图像的置信度分数低的预测。生成的对象掩码集用作伪ground-truth来训练最终的语义分割模型。</span><span style="font-size:16px">
</span><span style="font-size:16px">本文的贡献是:</span><ol><li><p><span style="font-size:16px">开发了一个新的自下而上的框架来解决无监督语义分割的任务,</span></p></li><li><p><span style="font-size:16px">提出了一种数据驱动的策略来获得用于语义分割的像素分组先验基于自监督Transformer模型,</span></p></li><li><p><span style="font-size:16px">使用置信对象掩码候选者来改进分割结果,</span></p></li><li><p><span style="font-size:16px">在无监督设置下,在 PASCAL和COCO数据集上SOTA。</span></p></li></ol><h1><span style="font-size:16px">
</span></h1><span style="font-size:16px">
</span><p><span><strong> </strong></span><span style="font-size:19px"><strong>03 </strong></span><span><strong> </strong></span></p><h1><strong><span style="font-size:18px">方法</span></strong>
</h1><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-ca62d4943f46c1a9.jpeg" img-data="{"format":"jpeg","size":88045,"height":386,"width":851}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">本文的方法遵循自下而上的方案来解决无监督语义分割任务。首先,作者提倡一种数据驱动的方法,通过自监督的视觉Transformer来挖掘对象掩码。其次,通过对象分割模型,即 Mask R-CNN提取每个图像的多个对象掩码。第三,讨论如何使用找到的对象掩码训练最终的分割模型。作为关键组件,作者仅使用具有高置信度分数的对象掩码。该策略减轻了掩码蒸馏步骤中引入的噪声。上图显示了本文提出的 MaskDistill 框架的概述。</span><h2><span><strong><span style="font-size:16px">3.1 Learning Objectness</span></strong></span></h2><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-4e84f7446da1f7e1.jpeg" img-data="{"format":"jpeg","size":29075,"height":345,"width":392}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">端到端方法不太可能发现属于高级对象类别的图像区域,例如鸟类、猫、建筑物等。出于这个原因,作者遵循之前的工作,并提倡一种自下而上的方法来解决无监督语义分割的任务。特别是,在进行语义分割之前,首先将图像分解为其不同的组件是有利的。现有方法通过手工制作的低级(例如,超像素或边缘)或中级(例如,显着性)像素分组先验来实现这一点。然而,这样的先验是次优的。</span><span style="font-size:16px">
</span><span style="font-size:16px">基于超像素或边缘的低级先验会产生图像的过度分割,从而产生具有低语义内容的图像区域(见上图中的第一行)。不同的是,中级先验可以聚合来自不同对象的部分(参见上图中的中间行)。为了解决这些缺点,作者提出通过依赖自监督表示学习以数据驱动的方式获得像素分组先验。上图中的底行显示了一些示例。与手工制作的像素分组先验不同,本文的方法生成与真实目标对齐的对象掩码。</span><span style="font-size:16px">
</span><span style="font-size:16px">在本文中,作者基于自监督的视觉Transformer来挖掘对象掩码。做出这个决定的原因有三个。首先,transformers 在patch级别进行推理,这允许模型构建一个表示不同图像区域之间相似性的亲和图(affinity graph)。</span><span style="font-size:16px">
</span><span style="font-size:16px">其次,自监督视觉Transformer学习了丰富的空间表示,这些表示可以捕获对象信息,这有助于它们用于挖掘对象掩码。此外,这些表示对每个图像组件的详细信息进行编码,这些信息可能超出人类定义的分类法。</span><span style="font-size:16px">
</span><span style="font-size:16px">第三,自监督的视觉Transformer不依赖于人类标记,这使模型能够利用大型未标记数据集。受这些发现的启发,作者提出从视觉Transformer中的最终自注意力层中提取对象信息。</span><h2><span><strong><span style="font-size:16px">3.2 Distilling Object Masks Using Self-Attention</span></strong></span></h2><h3><strong><span style="font-size:16px">Preliminaries</span></strong><span style="font-size:16px"/></h3><span style="font-size:16px">首先将图像<span/>reshape为 N 个patch序列。每个patch的大小为 S × S 像素。作者将图像patch称为patch token。patch token进一步与特殊分类token [CLS] 连接,从而产生由 N + 1 个token组成的输入序列<span/>。作者使用来自最终多头自注意力 (MSA) 块的特征<span/>来计算对象掩码,其中每个头 h 执行单个自注意力操作。</span><h3><strong><span style="font-size:16px">Construct Affinity Graphs</span></strong></h3><span style="font-size:16px">Follow在之前的工作,作者构建了一个亲和图来测量图像patch之间的相似性。给定输入序列<span/>,将亲和向量<span/> 计算为最终 MSA 块中分类token [CLS] 和patch token [I] 之间的成对相似性。</span><span style="font-size:16px">
</span><span style="font-size:16px">类似地,亲和矩阵<span/>测量所有patch token [I] 对之间的成对相似性。特别是,元素<span/>在序列的两个token i 和 j 之间计算,作为它们的特征表示<span/>和<span/>的点积,其中 <span/>。最后,作者对注意力头 <span/> 上的亲和力进行平均:</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-575dc005086027f8.jpeg" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><h3><strong><span style="font-size:16px">Select Discriminative Tokens</span></strong><span style="font-size:16px"/></h3><span style="font-size:16px">本文的目标是选择可能对应于对象部分的patch token。特别是,作者根据CLS token<span/>相应的的亲和力关注前 k 个响应。形式上,定义patch集<span/>,其中<span/>表示图<span/>中从分类token [CLS] 到patch token<span/>的有向边。</span><span style="font-size:16px">
</span><span style="font-size:16px">此外,将 <span/> 中具有最大(即 top-1)亲和力的patch定义为源patch<span/>。该区域往往对应于最具辨别力的图像组件,例如鸟的喙、犀牛的角等。</span><h3><strong><span style="font-size:16px">Construct Initial Masks</span></strong></h3><span style="font-size:16px">根据其源 s 和proposal <span/>,为每个图像 X 生成单个对象掩码<span/>。源 s 应该属于预测的对象掩码,因为它代表对象最具辨别力的部分。遵循之前的工作,作者将信息从 s 扩散到proposal <span/>。</span><span style="font-size:16px">
</span><span style="font-size:16px">特别是,只有<span/> 中与 s 相似的patch被进一步视为proposal <span/>。仅当<span/>时,对象掩码<span/>在位置 j 设置为 1。因此,如果 s 和<span/>之间的成对相似性总和为正,则块 j 与 s 属于同一对象。最后,使用最近邻插值对获得的掩码进行整形和上采样到原始图像大小(H,W),得到<span/>。</span><h3><strong><span style="font-size:16px">Distill Mask R-CNN</span></strong></h3><span style="font-size:16px">为了为每个图像生成多个候选对象掩码,作者训练了一个region proposal网络,即 Mask R-CNN。该对象分割模型需要每个图像的类别 c、边界框坐标 b 和前景-背景掩码 M。</span>
<span style="font-size:16px">请注意,在上一步中已经获得了对象掩码及其对应的边界框坐标。但是,这些掩码与类无关。为了给每个掩码分配一个类标签 c,作者将聚类算法(例如,K-means)应用于掩码图像的输出 [CLS] token。现在,可以通过以下目标函数训练 Mask R-CNN:</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-1b3a21815ca9beb1.jpeg" img-data="{"format":"jpeg","size":4520,"height":35,"width":458}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><span style="font-size:16px">
</span><span style="font-size:16px">其中<span/>表示预测的类、边界框和掩码。重要的是,经过训练的模型预测每个图像的多个对象掩码候选者及其相关的置信度分数。作者利用这些预测作为伪ground-truth来训练下一节中的分割模型。</span><h2><span><strong><span style="font-size:16px">3.3 Training a Segmentation Model from Noisy Object Mask Candidates</span></strong></span></h2><span style="font-size:16px">考虑一组图像<span/>及其对应的对象掩码候选<span/>和置信度分数<span/>。一些掩码将不可避免地分配到错误的集群或不会与对象或部分对齐。有趣的是,作者通过实验观察到模型非常confident的掩码<span/>往往是正确的。与以前的方法不同,这使模型能够利用置信度分数来抑制先前噪声的影响。</span><span style="font-size:16px">
</span><span style="font-size:16px">具体来说,只接受来自 Mask R-CNN 超过阈值 τ <span/>作为的置信预测。最后,模型聚合属于同一图像的掩码以获得每个图像的初始语义分割<span/>。当两个候选重叠时,模型只保留最confident的掩码。构建的掩码用作伪ground-truth来训练语义分割模型。</span><span style="font-size:16px">
</span><span style="font-size:16px">最后,作者训练了一个语义分割模型<span/>,参数化权重为θ。该函数用softmax 操作,以对集群<span/>执行软分配。为了克服类不平衡,同时获得细粒度的分割结果,作者采用了难像素挖掘策略。在每batch中选择前 k 个最困难的像素<span/>来训练<span/>。特别是,目标函数变为:</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-e590770f7fb8a167.jpeg" img-data="{"format":"jpeg","size":5167,"height":67,"width":407}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">如果像素 i 属于 c 类,则获得的分割掩码<span/>为 1,否则为 0。</span><h1><span style="font-size:16px">
</span></h1><span style="font-size:16px">
</span><p><span><strong> </strong></span><span style="font-size:19px"><strong>04 </strong></span><span><strong> </strong></span></p><h1><strong><span style="font-size:18px">实验</span></strong></h1><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-a34e9b30efdb6b3e.jpeg" img-data="{"format":"jpeg","size":17239,"height":167,"width":390}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">上表分析了 MaskDistill 的不同组件对 PASCAL 的 val 集的影响。通过 K-means 对初始对象掩码进行聚类时,实现了 39.0% mIoU(第一行)。对象掩码是通过自监督视觉Transformer的亲和图<span/>获得的。当使用使用初始对象掩码(从 39.0% 到 42.0% mIoU - 第二行)训练的 Mask R-CNN 模型进行预测时,结果会得到进一步改进。</span><span style="font-size:16px">
</span><span style="font-size:16px">这表明本文的对象掩码候选者捕获了高级对象信息,这很难通过手工制作的先验来实现。最后,作者利用 Mask R-CNN 预测的置信度分数。结果表明,通过仅使用来自 Mask R-CNN 的可靠对象掩码候选,分割结果从 42.0% 提高到 45.8% mIoU。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-0f7d18c07a1f2fbc.jpeg" img-data="{"format":"jpeg","size":17395,"height":277,"width":289}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">上图量化了在初始对象掩码的 K-means 聚类期间更改簇 C 数量的影响。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-57b5dbbb4660b113.jpeg" img-data="{"format":"jpeg","size":16892,"height":291,"width":287}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><span style="font-size:16px">
</span><span style="font-size:16px">上图显示了 top-k 选择的影响。为了减轻虚假细节(例如背景杂波)的影响,作者在<span/>中选择与最具辨别力的patch token相对应的前 k 个patch。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-485def287276b565.jpeg" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><span style="font-size:16px">
</span><span style="font-size:16px">上图研究了选择具有阈值 τ 的最confident的对象掩码候选者的影响。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-127be3209281303d.jpeg" img-data="{"format":"jpeg","size":34044,"height":415,"width":376}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">上表将本文的结果与 PASCAL 验证集上的 state-of-theart 进行了比较。MaskDistill 在线性分类器设置下的表现始终优于先前的工作。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-10a99637fe7c085a.jpeg" img-data="{"format":"jpeg","size":77157,"height":516,"width":859}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<span style="font-size:16px">上图展示了本文方法在PASCAL 数据集上的定性结果。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-5ebc624b7b9ec7d3.jpeg" img-data="{"format":"jpeg","size":110940,"height":546,"width":884}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><span style="font-size:16px">
</span><span style="font-size:16px">上表将本文的结果与其他两种无监督对象掩码生成方法进行了比较:DINO和 LOST。</span><span style="font-size:16px">
</span><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-1c7c53a7b2b61a17.jpeg" img-data="{"format":"jpeg","size":71428,"height":368,"width":856}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><div class="image-package"><img src="https://upload-images.jianshu.io/upload_images/11486041-9cdd77dc37f4c7d4.jpeg" img-data="{"format":"jpeg","size":102768,"height":753,"width":543}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><span style="font-size:16px">
</span><span style="font-size:16px">上图显示了COCO20k 上的几个示例,其中本文的方法可以检索每个图像的多个高质量对象掩码。</span><span style="font-size:16px">
</span><span style="font-size:16px">
</span><p><span><strong> </strong></span><span style="font-size:19px"><strong>05 </strong></span><span><strong> </strong></span></p><strong><span style="font-size:18px">总结</span></strong>
<p><span style="font-size:16px">
</span></p><span style="font-size:16px">本文提出了一个新的无监督语义分割框架。它首先从自监督的视觉Transformer中提取对象掩码。接下来,它通过利用最confident的对象掩码候选作为像素分组先验来学习语义分割模型。该策略解决了先前工作中存在的几个限制。</span><span style="font-size:16px">
</span><span style="font-size:16px">首先,本文的方法以数据驱动的方式学习像素分组先验,而不是通过手工制作的先验。其次,分割模型不锁定低级图像特征,而是学习对象级信息。第三,本文的方法可以更好地处理具有多个对象的图像。最后,广泛的实验评估表明,本文的方法明显优于最先进的方法。</span><span style="font-size:16px">
</span><span style="font-size:16px">毫无疑问,本文的工作仍然存在一些局限性。首先,尚不清楚自监督视觉Transformer的预训练数据集如何影响对象掩码的质量。有趣的是,最近的研究表明,可以使用以对象和场景为中心的数据集来学习空间结构化表示。这一观察表明,在精选数据集(例如 ImageNet)上训练Transformer并不重要。此外,还可以通过扩展预训练数据集和模型的大小来改进结果。</span><span style="font-size:16px">
</span><h3><span><strong><span style="font-size:16px">参考资料</span></strong></span></h3><span style="font-size:16px">[1]</span><span style="font-size:16px">https://arxiv.org/abs/2206.06363</span><span style="font-size:16px">[2]</span><span style="font-size:16px">https://github.com/wvangansbeke/MaskDistill</span>
<span><strong>▊ </strong><strong>作者简介</strong></span><span style="font-size:16px">研究领域:FightingCV公众号运营者,研究方向为多模态内容理解,专注于解决视觉模态和语言模态相结合的任务,促进Vision-Language模型的实地应用。</span><span style="font-size:16px">知乎/公众号:FightingCV</span><p><strong><span style="font-size:17px">已建立深度学习公众号——</span><span style="font-size:17px"><strong>FightingCV</strong></span><span style="font-size:17px">,欢迎大家关注!!!</span></strong></p><p><strong><span style="font-size:17px">
</span></strong></p><p><strong>ICCV</strong>、<strong>CVPR、NeurIPS、ICML</strong>论文解析汇总:<span><strong>https://github.com/xmu-xiaoma666/FightingCV-Paper-Reading</strong></span></p><p><span><strong>
</strong></span></p><p><strong>面向小白</strong>的<strong>Attention</strong>、<strong>重参数</strong>、<strong>MLP</strong>、<strong>卷积</strong>核心代码学习:<span><strong>https://github.com/xmu-xiaoma666/External-Attention-pytorch</strong></span></p><p>
</p><p>
</p>

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

推荐阅读更多精彩内容