单目3D目标检测

单目相机只能获取平面图像,如何能进行3D目标检测呢?在vSLAM领域,我们可以根据单目相机的运动模型对周围环境进行3D重建,但这需要相机运动时,周围物体保持静止或缓慢移动状态,才能正确完成3D重建,且重建必须建立在多帧连续图像的基础上。而在目标检测领域,往往要求实时检测,且相机和物体直接可能存在高速运动并且运动速度未知。因此,采用与vSLAM类似的几何方法来确定物体的3D边框并不可行。

另一方面,目标检测任务并不需要重构物体完整的3D形状,仅仅确定3D边框即可。因此,单目3D目标检测任务可以转化为通过2D图像估计3D边框的一系列关键点的问题,关键点的回归显然可以通过构造一个深度网络模型来实现,同时,我们也可以通过一些先验条件进行约束,来减小误差。(同类型物体往往具有相近的大小)

2017年,一篇名为《3DBBox Estimation Using Deep Learning and Geometry》的文章,为基于单目图像进行3D 目标检测和姿态估计奠定了基础。该方法主要创新点在于:

(1)采用一种discrete-continuous CNN架构,称为MultiBin回归,来估计物体的方向

(2)回归物体的大小和尺寸

通过以上两条回归,再结合物体的2D检测框,可以通过投影几何提供的约束来解算出相应的3D边框。模型框图如下所示:


上图中,共享卷积特征可以用任何经典的网络作为back bone,由于需要2D检测框参与解算,我们可以和2D检测模型共用一个back bone 做特征提取,百度Apollo就基于yolov2改造了一个yolo-3D模型。

3d box的长宽高回归

尺寸的回归并不直接回归长宽高,而是回归其残差。以 KITTI 数据集为例,车,货车,卡车 和 公交车都是不同的类,并且不同类的区分方差很小且单峰。例如,车和自行车的尺寸方差在厘米的数量级上。因此,我们直接使用 L2损失, 作为一个标准,在训练的数据集上对于每一个尺寸我们计算相对于平均值的残差,尺寸的估计损失L_{dims} 通过以下的公式计算: 

                      L_{dims}= \frac{1}{n} \Sigma (D^*-\bar{D} -\sigma )

其中D^* 是 box 的真实尺寸,\bar{D} 是一个特定类的物体平均尺寸,\sigma 是网络预测相对于平均值估计的残差。

角度回归

文章提出了MultiBin 结构用来方向估计。首先离散方向角并分为n 个overlapping bins。对于每一个bin,CNN网络估计输出的角度在第i个bin 的置信度 c_{i} 和 每个bin 为了获得输出角所需要的(residual rotation correction ) 旋转残差修正。

旋转残差用两个数字表示,用角度的sine 和 cosine值,所有每个bin i的3个输出是:(c_{i} ,cos(\Delta \theta _{i} ),sin(\Delta \theta _{i} )). 有效的cosine 和 sine 值利用一个L_{2} 归一化层在二维输入的顶部获得。MultiBin 方向的全部损失用一下公式表示:

L_{\theta } =L_{conf} +\omega *L_{loc}

L_{conf} 置信损失等于每个bin 的softmax loss 的置信。L_{loc} 是用于最小化估计的角度和真实的角度,所有和真实角度有重叠的bins 会用来估计正确的角度。定位损失尝试最小化真实数据和所有余弦值最大的bins的误差。 定位误差L_{loc} 一下方式计算:

L_{loc} =-\frac{1}{n_{\theta ^* } } \Sigma (\theta ^*-c_{i}  -\Delta \theta _{i})

其中n_{\theta ^* } 是和真实角度有覆盖的 \theta ^* 的bins 的个数。c_{i} 是bin i的中心角度, \Delta \theta _{i} 是bin i的中心需要的变化量。

根据推论,会选择具有最大置信度的bin,最后的结果会利用bin Δθ的中心来估计。 MultiBin 模块有两个分支。一个是计算置信度 c_{i} 另外一个是计算 Δθ 的 sine 和 cosine 值。 最后3n 个参数用来估计 n 个 bin。

3D box的计算

(1) 3D Bounding Box 估计(下面简化为3Dbb)

为了在3Dbb中利用已有的成熟的2D object detection 的工作,这里我们构建两者的关系, 3Dbb 投影到2Dbb (是不是跟SLAM的里面的3D-to-2D很像,没错,后面就是用PnP 算的)。3Dbb 的中心为 T=[t_{x} ,t_{y} ,t_{z} ]^T, 尺寸D=[dx,dy,dz]  以及方向角R(θ,ϕ,α), 这里用方位角,海拨,(roll)转动角来表示(正常开车没有pitch 和 yaw)。物体相对相机坐标的位姿(R,T)∈SE(3)(R,T)∈SE(3),相机的内参 矩阵K,投影的3D点为X_{0} =[X,Y,Z,1]^T ,在物体图像坐标为x=[x,y,1]^T

x=K[R,T] X_{0}                     (1)

假设原始图像中物体的坐标中心就是3Dbb 的中心,(这个假设是个比较强的假设)同时尺寸DD 也已知,候选的3Dbb 坐标可以表示成X_{1}=[\frac{dx}{2} ,\frac{dy}{2} ,\frac{dz}{2} ]^T  , X_{2}=[\frac{-dx}{2} ,\frac{dy}{2} ,\frac{dz}{2} ]^T  ,…..,  X_{8}=[\frac{-dx}{2} ,\frac{-dy}{2} ,\frac{-dz}{2} ]^T 。 3Dbb 和 2Dbb 能够匹配形成约束,需要3Dbb的每一角能投映射到2Dbb至少一个边上。

例如X_{0}=[\frac{dx}{2} ,\frac{-dy}{2} ,\frac{dz}{2} ]^T 和2Dbb左边的最小的x_{min} 链接,点到带你的对应约束可以如下方程:

x_{min} =(K[R,T][\frac{dx}{2} ,\frac{-dy}{2} ,\frac{dz}{2},1 ]^T )_{x}     (2)

其中(.)x(.)x 表示相对于 x 坐标系,剩余 2Dbb 得的 x_{max} ,y_{min} ,y_{max} 也可以得到相似的方程,也就是可以得到四个与3Dbb的约束。但是这个用来获取degrees of freedom(DoF) (three for translation, three fro rotation, and three for box dimensions) 是不够的,另外还有一些几何约束可以通过box 的visual appearance 获取,这个主要的标准就是这些约束和visual appearance 紧密相关,同时可以用来加强3Dbb的约束。

2 选择回归参数

(θ,ϕ,α) 对3Dbb 具有很大的影响,其次文章选择回归box 的尺寸,而不是平移矩阵T ,因为尺寸估计的方差比较小(先验所有的车具有相同的大小) 也不会因为物体的方向角变化而变化。具体的实现细节在后面的章节中。

3 相应的约束

根据方程2, 通过CNN获取的 3Dbb 的方向角和尺寸以及 2Dbb 的约束,最小重投影误差就可以得到平移矩阵 T.

2D detection box 可以对应到 3Dbb 8个角点 中的任意一个,这样可能性就有 8^4=4096 种, 很多情况下我们假设物体是朝上的。2Dbb 上面和下面的只对应3D box 的上部和下部,可能性就降为 1024种, 另外当物体的roll 为0 的时候,2D box 的边坐标 x_{min} ,x_{max} 就是可以对应3Dbb 的边。相似的,y_{min} ,y_{max} 只对应水平3D box 的点。因此, 每个2D detection box的垂直边 对应[\pm \frac{dx}{2} ,,\pm \frac{dz}{2} ]

每个2D detection box的水平边 对应[,,\pm \frac{dy}{2} ,\pm \frac{dz}{2} ] 因此得到的 4^4 =256 种。 在KITTI 数据库中,物体 pitch 和 roll  的角度都是零,所以随后得到 64 种的映射关系。

以上是论文对2D-3D越是关系的解释,个人觉得论述的还不是很清楚。下面给出我自己的说明。首先我们得先搞清楚空间中得某个点在坐标系旋转过后对应得点。

以正前方为X轴,以左手坐标系建立O_XYZ坐标系。Yaw、Pitch、Roll建立坐标系,从基准正前方出发,相机以向上和向右旋转为正。


由于求取旋转矩阵是,坐标轴之间的旋转都是以逆时针进行的,所以实际角度有如下关系:


旋转矩阵表示:


在具体到行车场景下,无论人还是车都是立于地面的,所以只有在yaw方向得偏转,roll和pitch均为0。也就是说,\theta 、\phi 均为0。把\phi 和\theta 代入上式得到

\begin{bmatrix}
x\\ 
y\\
z 

\end{bmatrix}= \begin{bmatrix}
cos\theta cos\psi  & -cos\phi sin\psi +sin\phi sin\theta cos\psi  & 0\\ 
cos\theta sin\psi & cos\phi cos\psi +sin\phi sin\theta sin\psi & 0\\ 
 0&  0& cos\phi cos\theta 
\end{bmatrix}\begin{bmatrix}
X\\ 
Y\\ 
Z
\end{bmatrix}

上式中,第一行第三列和第二行第三列均为0,对应的Z(\pm \frac{dz}{2} )可以忽略,2*2=4,总可能性除以4等于256种。第三行的第一、二列为0,对应的X(\pm \frac{dx}{2} )和Y(\pm \frac{dy}{2} )可以忽略,同样2*2=4,总可能性再除以4等于64种。

改进

基于图像的三维检测方法将3DBBox到2DBBox的几何约束当作其重要的组件,然而四条边仅能提供四个几何约束,这使得2DBBox有微小误差时也会造成3D检测性能的急剧下降。

针对以上问题,2020年1月的 一篇文章《RTM3D: Real-time Monocular 3D Detection from Object Keypoints for Autonomous Driving》提出单过程单目3D检测,并且没有利用2D 检测器处理3D检测,如图1所示,分为两部分:

首先对3D box进行参数估计,其中8个顶点,1个中心点,这9个点为3D box提供了18个几何约束。受CenterNet启发,对8个顶点和中心点进行建模来解决关键点建群、顶点顺序问题。SIFT,SUFT以及其他传统方法进行关键点检测,并计算图像金字塔来解决尺度不一致问题。CenterNet使用了相似的策略进行后处理操作,增加准确性,但处理速度变慢。注意,2D目标检测中的特征金字塔网络(FPN)不适用于关键点检测网络,因为在小尺度预测的情况下,相邻的关键点可能会重叠。我们提出多尺度金字塔关键点检测方法来产生尺度空间响应。通过soft-weighted金字塔的方法,可以得到最终的关键点激活图。

当给定9个投影点时,下一步就是最小化由物体的位置、尺寸、方向参数化的3D点的透视图上的重投影误差。重投影误差由SE3空间的多元公式表示。对维度、方向、距离的先验信息对基于特征点的方法影响进行讨论。获得此信息的前提是不增加计算量,以免影响检测速度。 我们对这些先验模型进行建模,并将重投影和先验误差项建立整体能量函数,以进一步改善3D估计。

然后,我们通过使用透视投影的几何约束将3D边界框的估计重新构造为使能量函数最小化的问题。

主要贡献

我们将单目三维检测作为关键点检测问题,并结合几何约束来更有效、准确地生成三维物体的属性。

我们提出了一种新颖的单阶段多尺度网络用于三维关键点检测,为多尺度目标提供精确的投影点。

我们提出一个整体的能量函数,可以联合优化先验和三维目标信息。

在KITTI基准上的评估,我们是第一个只使用图像的实时三维检测方法,在相同的运行时间下,在与其他竞争对手的比较中,我们也能获得更好的准确性。

方法

 特征点监测网络

关键点检测网络仅将RGB图像作为输入,并从3D bounding box的顶点和中心生成透视点。如下图所示,包含三个主要部分:主干网络、特征点金字塔网络和检测头。主要结构采用单步策略,与anchor-free 2D目标检测器采用相似分布,从而进行快速检测。

关键点检测结构:它仅以RGB图像为输入,并输出主要中心heatmap,顶点heatmap和顶点坐标作为基本模块来估计3D边界框。 它还可以预测其他先验,以进一步提高3D检测的性能。

主干网络:

    在权衡速度和精度时,选用了ResNet18 和DLA-34 结构。两模块都是将单张RGB作为输入,并且进行S=4的下采样。ResNet18 和DLA-34是用作图像分类的网络,其最大下采样因子为×32。

  我们通过三个双线性插值和1×1卷积层对bottleneck三次进行上采样。 在上采样层之前,我们连接了相应的低级特征图,同时添加了一个1×1卷积层以减小通道维度。 经过三个上采样层后,通道分别为256、128、64。

关键点特征金字塔:

图像中的关键点在大小上没有差异。 因此,关键点检测不适合使用特征金字塔网络(FPN),因为FPN网络只适合于检测不同金字塔层中的多尺度2Dbox框,而框是有大小的。 我们提出了关键点特征金字塔网络(KFPN),以检测点向空间中尺度不变的关键点,如下图所示。


假设我们有F尺度的特征图,我们先将每个尺度f,1<f<F,还原到最大尺度,然后,我们通过softmax 运算生成轻权重以表示每个尺度的重要性。 通过线性加权和获得最终的尺度空间得分图Sscore。 定义如下:

S_{score} =\sum_{f}\hat{f} \odot softmax(\hat{f} )

https://github.com/kaixinbear/rtm/blob/master/src/lib/models/networks/resnet_FP.py

检测头:

由三个基本组件和六个可选组件组成,可以选择组合来提高3D检测准确性。 受CenterNet [47]的启发,我们选一个关键点作为连接所有特征的主要中心。 由于截断情况下对象的3D投影点可能会超出图像边界,因此将更适当地选择2D框中心点。

Heatmap定义为M\in [0,1]^{\frac{H}{S}*\frac{W}{S}*C},其中C是目标种类的数量,另一部分是由顶点和中心点投影出的9个透视点V\in [0,1]^{\frac{H}{S}*\frac{W}{S}*9}

对于一个目标的关键点整合,我们还对从maincenter的局部偏移V_{c}\in R^{\frac{H}{S}*\frac{W}{S}*18}进行回归作为标志,将距离V_{c} 坐标最近的V的关键点作为一个对象的集合。

尽管9个关键点的18个的约束能够恢复物体的3D信息,但是越多的先验条件能够增加更多的约束,中心偏移M_{os}\in R^{\frac{H}{S}*\frac{W}{S}*18},顶点偏移V_{os}\in R^{\frac{H}{S}*\frac{W}{S}*18}是heatmap中对每个关键点的离散误差。

3D目标的维度D 方差较小很容易预测,对象的旋转R(θ)只有在自主驾驶场景对方向θ(偏航)进行参数化。我们引用基于Multi-Bin [28]方法对局部方向进行回归。将局部角度的余弦偏移和正弦偏移概率在1个bin中进行分类,并使用2个bin生成方向特征图。(这个看上去和上一篇论文的方法有点类似)。

我们还对3D box的中心深度进行回归,用来初始化3D bounding box估计的值,并进行加速。

heatmap

所谓heatmap就是GT中每个object的中心坐标加入Gaussian。

heatmap中的heat就是probability的"热度",所以heatmap就是描述bounding box的corner (cornernet)/center (centernet)点的distribution。probability高的地方就是bounding box的预测位置,然后把这些peaks全部拿出来构型就是结果了。这种方法跟经典的直接回归坐标点(或者坐标点跟anchor的offset)不同的地方在于需要在ground truth坐标位置加上2d的Gaussian生成heatmap,输出predicted heatmap,然后让predicted和ground truth差越来越小进行训练。

其实这种方法是从human pose检测得到的灵感,这种gaussian probability map会让训练更robust,收敛更快,因为它不局限于一个坐标点定的hard define。它还有一个好处在于直接用全卷积,就像是图像分割FCN的思路加上bounding box尺寸单独进行回归。

训练:

关键点的所有heatmap按照[47].[19]进行训练,使用focal loss 解决了正反例的不平衡,其中K是不同关键点的通道数,在maincenter K=C,在计算顶点K=9. N是一张图像的maincenter或顶点数,α 和 β为减少损失权重的超参数,Pxy可以由高斯核定义并以真正的关键点为中心。对于σ,我们找到了训练数据中的2D box的最大最小区域Amax,Amin,并设置两个超参数σmax,σmin 然后定义大小为A的目标 ,为了对维度和距离进行回归,定义残差部分为:

                         L_{D}=\frac{1}{3N}\sum_{x=1}^{H/S}\sum_{y=1}^{W/S}\mathbb{I}_{xy}^{obj}(D_{xy}-\Delta \tilde{D_{xy}})^{2}

                        L_{Z}=\frac{1}{3N}\sum_{x=1}^{H/S}\sum_{y=1}^{W/S}\mathbb{I}_{xy}^{obj}(log(Z_{xy})-log(\Delta \tilde{Z_{xy}}))^{2}

我们设置,其中为训练数据的平均和标准差维度,代表maincenter是否出现在位置x,y,maincenter,顶点由L1损失进行训练:


                        L_{off}^{m}=\frac{1}{2N}\sum_{x=1}^{H/S}\sum_{y=1}^{W/S}\mathbb{I}_{xy}^{obj}\left | M_{os}^{xy}-(\frac{p^{m}}{s}-\tilde{p_{m}}) \right |

                        L_{off}^{v}=\frac{1}{2N}\sum_{x=1}^{H/S}\sum_{y=1}^{W/S}\mathbb{I}_{xy}^{ver}\left | V_{os}^{xy}-(\frac{p^{v}}{s}-\tilde{p_{v}}) \right |

其中为maincenter和顶点在原始图像的位置,使用L1损失的顶点回归坐标为:


                        L_{ver}=\frac{1}{N}\sum_{k=1}^{8}\sum_{x=1}^{H/S}\sum_{y=1}^{W/S}\mathbb{I}_{xy}^{ver}\left | V_{c}^{(2k-1):(2k)xy}-\left | \frac{p^{v}-p^{m}}{S} \right | \right |

最后为关键点检测的多任务损失进行定义:

 L=\omega _{main}L_{kp}^{C}+\omega _{kpver}L_{kp}^{8}+\omega _{ver}L_{ver}+\omega _{dim}L_{D}+\omega _{ori}L_{ori}+\omega _{z}L_{dis}+\omega _{off}^{m}L_{off}^{m}+\omega _{off}^{v}L_{off}^{v}

上式中,前两项L_{kp}^K 在论文中有定义。L_{dis} 应为L_{z} ,是物体中心到相机中心的距离,L_{ori} 应为物体中心到相机中心的方位。

3D bounding box估计

考虑一张图像,有一组 i = 1...N的目标,由9个关键点和其他先验知识表达,由我们的关键点检测网络给出。我们将关键点定义为\hat{kp_{ij} } ,其中j\in 1...9\hat{D_{i} } 维度方向\hat{\theta _{i} } 距离\hat{Z_{i} } 。相应的3D bounding box B_{i} 由它的旋转R_{i} (\theta ),,以及维度定义。位置T_{i}=\begin{bmatrix}
T_{i}^{x}, & T_{i}^{y}, & T_{i}^{z}
\end{bmatrix}^{T}以及维度D_{i}=\begin{bmatrix}
h_{i}, & w_{i}, & l_{i}
\end{bmatrix}^{T}定义。

我们的目标是找出3D box,找出哪一个box的中心点和顶点投影与2D 关键点  最匹配。这能够最小化3D 关键点和2D 关键点的投影损失,并将它和其他先验损失定义为一个非线性最小二乘优化问题:

                \begin{aligned}
R^{*}, T^{*}, D^{*}=\underset{\{R, T, D\}}{\arg \max } \sum_{R_{i}, T_{i}, D_{i}}\left\|e_{c p}\left(R_{i}, T_{i}, D_{i}, \widehat{k p}_{i}\right)\right\|_{\Sigma_{i}}^{2} \\
+\omega_{d}\left\|e_{d}\left(D_{i}, \widehat{D}_{i}\right)\right\|_{2}^{2}+\omega_{r}\left\|e_{r}\left(R_{i}, \hat{\theta}_{i}\right)\right\|_{2}^{2}
\end{aligned}

 其中 e_{c p}(\ldots), e_{d}(\ldots), e_{r}(\ldots)相机点、维度先验、方向先验的损失。

\sum_{} 是关键点投影误差的协方差矩阵。它是从对应于关键点的heatmap中提取的置信度:

\Sigma_{i}=\operatorname{diag}\left(\operatorname{Softmax}\left(V\left(\widehat{k p_{i}}^{1: 8}\right), M\left(\widehat{k p_{i}}^{9}\right)\right)\right)

Camera-Point:

按照[10],我们定义了8顶点和中心点的齐次坐标:

P_{3 D}^{i}=\operatorname{diag}\left(D_{i}\right) \text { Cor }C o r=\left[\begin{array}{ccccccccc}
0 & 0 & 0 & 0 & -1 & -1 & -1 & -1 & -1 / 2 \\
1 / 2 & -1 / 2 & -1 / 2 & 1 / 2 & 1 / 2 & -1 / 2 & -1 / 2 & 1 / 2 & 0 \\
1 / 2 & 1 / 2 & -1 / 2 & -1 / 2 & 1 / 2 & 1 / 2 & -1 / 2 & -1 / 2 & 0 \\
1 & 1 & 1 & 1 & 1 & 1 & 1 & 1 & 1
\end{array}\right]

给定内参矩阵K,我们将3D点投影到图像坐标为:

\begin{aligned}
k p_{i} &=\frac{1}{s_{i}} K\left[\begin{array}{cc}
R & T \\
0^{T} & 1
\end{array}\right] \operatorname{diag}\left(D_{i}\right) C o r \\
&=\frac{1}{s_{i}} K \exp \left(\xi^{\wedge}\right) \operatorname{diag}\left(D_{i}\right) C o r
\end{aligned}

其中\xi \in \mathfrak{s e}_{3},使用exp将se3转换到SE3空间,投影坐标应与检测网络检测到的二维关键点紧密配合。因此,相机点误差定义为:

e_{c p}=\widehat{k p}_{i}-k p_{i}

最小化相机点误差需要se3空间的雅可比矩阵

\frac{\partial e_{c p}}{\partial \delta \xi}=-\left[\begin{array}{ccc}
\frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} \\
0 & \frac{f_{y}}{Z^{\prime}} 0 & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}
\end{array}\right] \cdot\left[I, \quad-P^{\prime \wedge}\right]

\frac{\partial e_{c p}}{\partial D_{i}}=-\frac{1}{9} \sum_{c o l=1}^{9}\left[\begin{array}{ccc}
\frac{f_{x}}{Z^{\prime}} & 0 & -\frac{f_{x} X^{\prime}}{Z^{\prime 2}} \\
0 & \frac{f_{y}}{Z^{\prime}} 0 & -\frac{f_{y} Y^{\prime}}{Z^{\prime 2}}
\end{array}\right] \cdot R \cdot \text { Cor }_{c o l}

其中,P^{\prime}=\left[X^{\prime}, Y^{\prime}, Z^{\prime}\right]^{T}=\left(\exp \left(\xi^{\wedge} P\right)\right)_{1: 3}

维度先验:

Ed被定义如下:

e_{d}=\widehat{D}_{i}-D_{i}

旋转先验:

我们在SE3空间定义Er,并使用log将error映射到切向量空间:

e_{r}=\log \left(R^{-1} R(\hat{\theta})\right)_{s \in 3}^{\vee}

这些多元方程可以通过g2o库[18]中的Gaussnewton或Levenberg-Marquardt算法求解。我们采用由关键点检测网络产生的先验信息作为初始值,这对提高检测速度非常重要。

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