YOLOv3:從代碼到模型

目標(biāo)檢測(cè)應(yīng)用的學(xué)習(xí)师溅,YOLOv3的模型原理和代碼理解茅信,數(shù)據(jù)集為VOC,框架為tensorflow墓臭。內(nèi)容僅是個(gè)人學(xué)習(xí)過(guò)程中的理解蘸鲸,如有不對(duì)感謝指正!

代碼先跑起來(lái)

0起便、源碼下載地址https://github.com/YunYang1994/tensorflow-yolov3

主要文件說(shuō)明:
+--core
|? ? ? --backbone.py:DarkNet53網(wǎng)絡(luò)結(jié)構(gòu)
|? ? ? --common.py:卷積棚贾、殘差等方法的定義
|? ? ? --config.py:參數(shù)設(shè)置,包括數(shù)據(jù)和模型路徑
|? ? ? --dataset.py:數(shù)據(jù)集處理
|? ? ? --yolov3.py:整體網(wǎng)絡(luò)架構(gòu)
+--scripts
|? ? ? --voc_annotation.py:生成數(shù)據(jù)集的txt標(biāo)注文件
+--mAP
|? ? ? --main.py:可視化展示各個(gè)類別的mAP
--train.py:訓(xùn)練模型主程序
--convert_weight.py:將預(yù)訓(xùn)練好的模型參數(shù)導(dǎo)入
--freeze_graph.py:將保存下來(lái)的模型轉(zhuǎn)成pb文件
--image_demo.py:輸入一張圖片榆综,輸出檢測(cè)結(jié)果圖
--evaluate.py:模型測(cè)試妙痹,生成預(yù)測(cè)結(jié)果的文件
1、準(zhǔn)備數(shù)據(jù)集
直接貼上作者的代碼注釋:

先下載voc數(shù)據(jù)集的三部分鼻疮,包括兩個(gè)訓(xùn)練集和一個(gè)測(cè)試集怯伊,再分別解壓,把/dataset文件夾下的VOC/整理成圖中的結(jié)構(gòu)方便程序調(diào)用判沟,運(yùn)行voc_annotation.py耿芹,生成訓(xùn)練和測(cè)試兩個(gè)txt文件,最后在config.py中把這兩個(gè)文件的路徑改對(duì)挪哄。
2吧秕、訓(xùn)練模型
運(yùn)行train.py,迭代30次后在checkpoint文件夾中保存了最后的模型迹炼。
3砸彬、單個(gè)圖片測(cè)試
先運(yùn)行freeze_graph.py,把ckpt文件轉(zhuǎn)換成pb文件斯入,文件頭的ckpt_file要改成最后保存的模型路徑砂碉,然后運(yùn)行,總目錄下會(huì)生成一個(gè)pb文件刻两。
運(yùn)行image_demo.py增蹭,文件頭的pb_file路徑就是剛生成的pb文件,image_path設(shè)置為想要測(cè)試的圖片路徑磅摹,需要核對(duì)input_size是否合適滋迈。

從代碼學(xué)習(xí)模型

一、數(shù)據(jù)輸入

1户誓、數(shù)據(jù)預(yù)處理
從數(shù)據(jù)集中的圖片開始杀怠,如上文所述,先運(yùn)行了一個(gè)voc_annotation.py厅克,這段程序?qū)Ψ胖煤玫娜齻€(gè)訓(xùn)練和測(cè)試集文件做了以下幾個(gè)操作,以其中一個(gè)文件為例:
1橙依、從該文件下/ImagesSet/Main/中得到所有圖片的索引字符串证舟,也就是對(duì)應(yīng)圖片文件夾中每張圖片的名字(不帶后綴)硕旗;
2、根據(jù)得到的索引遍歷每張圖片和它對(duì)應(yīng)的標(biāo)注信息女责,它們分別放在/JPEGImages和/Annotations文件夾下;
3漆枚、把每張圖片的路徑和對(duì)應(yīng)標(biāo)注信息拼接起來(lái),標(biāo)注信息中包含所有的真實(shí)檢測(cè)框抵知,每個(gè)框用五個(gè)值來(lái)表示(x,y,w,h,Class)墙基;
4、把拼接好的信息存儲(chǔ)刷喜,寫成txt文件中的一行残制。
運(yùn)行結(jié)束后dataset/文件夾下會(huì)得到兩個(gè)txt文件,分別是訓(xùn)練和測(cè)試的數(shù)據(jù)信息:

圖片路徑+(檢測(cè)框位置+框內(nèi)物體類別)

2掖疮、數(shù)據(jù)讀取
訓(xùn)練模型時(shí)讀取剛剛保存下來(lái)的voc_train.txt文件初茶,在每次迭代周期內(nèi),利用迭代器得到每個(gè)batch的數(shù)據(jù)浊闪,數(shù)據(jù)格式如下:

每次迭代輸入一個(gè)batch的數(shù)據(jù)

其中bs設(shè)置為6恼布,416是圖片的尺寸,label中的30代表輸出標(biāo)簽的維度搁宾,3是每個(gè)特征點(diǎn)的anchor數(shù)折汞,而25則是(bbox位置4+bbox置信度1+bbox物體類別20),bbox中的150是可以容納bbox的最大數(shù)量盖腿。在這里把txt文件中的每一行數(shù)據(jù)做了兩個(gè)操作:
1爽待、按照?qǐng)D片路徑把圖片讀取進(jìn)來(lái),作為input_data奸忽;
2堕伪、把每個(gè)特征框分別和三個(gè)尺度的anchors做iou,iou值大于某個(gè)閾值時(shí)栗菜,就可以認(rèn)為這個(gè)框?qū)儆诋?dāng)前的bbox類(s欠雌、m或l),從而將每張圖片的bbox歸為三類疙筹,以及對(duì)應(yīng)的三種標(biāo)簽富俄。
input_data用于輸入backbone網(wǎng)絡(luò)得到預(yù)測(cè)框,得到的預(yù)測(cè)框也會(huì)有三種尺度而咆,再和對(duì)應(yīng)尺度的真實(shí)bbox和label計(jì)算loss霍比。

二、得到預(yù)測(cè)框

1暴备、網(wǎng)絡(luò)結(jié)構(gòu)

YOLOv3的網(wǎng)絡(luò)結(jié)構(gòu)很多博客里講的十分詳細(xì)悠瞬,采用了darknet-53的前52層,去掉了下圖中后三層結(jié)構(gòu)(平均池化、全連接和softmax)浅妆。backbone為全卷積結(jié)構(gòu)望迎,使用了大量的殘差跳層;并且為了降低池化帶來(lái)的梯度負(fù)面效果凌外,直接放棄了Pooling辩尊,通過(guò)將卷積的步長(zhǎng)設(shè)置為2來(lái)實(shí)現(xiàn)2倍的降采樣;為了實(shí)現(xiàn)多個(gè)尺度的檢測(cè)精度康辑,把不同層的輸出都送入后續(xù)的檢測(cè)網(wǎng)絡(luò)摄欲,類似FPN的尺度融合,分別對(duì)應(yīng)著sbbox疮薇、mbbox和lbbox胸墙。

從scale3到scale1,特征圖的尺寸分別為[bs,52,52,256]惦辛、[bs,26,26,512]劳秋、[bs,13,13,1024],感受野從小到大胖齐,能檢測(cè)的目標(biāo)大小也越來(lái)越大玻淑。三個(gè)scale特征圖輸出后再經(jīng)過(guò)卷積和拼合,得到了三個(gè)尺度的檢測(cè)輸出呀伙,即yolov3.py文件中__build_network()的輸出:

三個(gè)卷積輸出代表著將圖片劃分成不同數(shù)目的網(wǎng)格后补履,每個(gè)網(wǎng)格延伸出的預(yù)測(cè)框結(jié)果。以conv_lbbox為例剿另,batchsize先不管箫锤,那么這個(gè)三維矩陣的其中兩維是[13,13],代表著把原圖經(jīng)過(guò)卷積運(yùn)算雨女,劃分成了13*13的網(wǎng)格谚攒,每個(gè)網(wǎng)格以自身為中心會(huì)生成三個(gè)anchors(相當(dāng)于預(yù)先設(shè)定好的先驗(yàn)預(yù)測(cè)框,網(wǎng)絡(luò)的輸出實(shí)際上是這些先驗(yàn)框的偏移量)氛堕,每個(gè)anchor的預(yù)測(cè)參數(shù)有:(4個(gè)坐標(biāo)偏移量馏臭,1個(gè)目標(biāo)置信度,20個(gè)類別預(yù)測(cè))讼稚,每個(gè)網(wǎng)格3個(gè)anchor括儒,因此每個(gè)網(wǎng)格都對(duì)應(yīng)著3*(4+1+20)=75個(gè)值。

2锐想、Bounding box相關(guān)

anchor先驗(yàn)框的設(shè)定
對(duì)于三種感受野的網(wǎng)格圖帮寻,其對(duì)應(yīng)的anchors尺寸也是不一樣的:網(wǎng)格數(shù)目少,感受野較大的特征圖赠摇,用于檢測(cè)較大目標(biāo)固逗,anchor的尺寸也比較大浅蚪;網(wǎng)格數(shù)目多,感受野較小的特征圖抒蚜,用于檢測(cè)較小目標(biāo)掘鄙,anchor的尺寸相應(yīng)比較小。

網(wǎng)格數(shù)不同時(shí)嗡髓,anchors能框到的大小,藍(lán)色代表anchor收津,黃色代表groundtruth

anchor具體尺寸的設(shè)定饿这,則是根據(jù)訓(xùn)練集的真實(shí)檢測(cè)框經(jīng)過(guò)聚類得到的,這樣能夠給模型一個(gè)更合適的先驗(yàn)框撞秋,避免了手動(dòng)設(shè)定時(shí)和數(shù)據(jù)集不匹配的問(wèn)題长捧。VOC數(shù)據(jù)集使用的anchor先驗(yàn)尺寸如下:

代碼中沒(méi)有聚類的操作,這些尺寸信息直接從一個(gè)txt文件中讀取

s吻贿、m和l代表三種尺寸的網(wǎng)格圖串结,每個(gè)網(wǎng)格生成三個(gè)先驗(yàn)框。因?yàn)榭虻闹行狞c(diǎn)已經(jīng)確定舅列,就是所在網(wǎng)格的中心肌割,所以每個(gè)先驗(yàn)框只用兩個(gè)數(shù)值來(lái)表示,即寬和高帐要“殉ǎ可以看到感受野越大的網(wǎng)格圖,對(duì)應(yīng)先驗(yàn)框就越大榨惠。
預(yù)測(cè)偏移量
在YOLOv2中作者提到奋早,faster R-CNN的anchor機(jī)制存在線性回歸的不穩(wěn)定性,因?yàn)榛貧w的offset可以使box偏移到圖片的任何地方赠橙,所以就改用預(yù)測(cè)相對(duì)位置的方法耽装。因此每個(gè)預(yù)測(cè)框的4個(gè)位置值分別代表:預(yù)測(cè)框的中心點(diǎn)相對(duì)于所在網(wǎng)格單元左上角的相對(duì)偏移量tx、ty期揪,和預(yù)測(cè)框的寬和高相對(duì)于先驗(yàn)框的寬和高的偏移量tw掉奄、th。

藍(lán)色實(shí)線框?yàn)轭A(yù)測(cè)框横侦,黑色虛線框?yàn)橄闰?yàn)框

如圖所示挥萌,c_xc_y是當(dāng)前網(wǎng)格左上角的坐標(biāo),p_wp_h是當(dāng)前網(wǎng)格先驗(yàn)框的寬和高枉侧,那么模型輸出的每個(gè)預(yù)測(cè)框引瀑,都用t_x,t_y,p_w,p_h四個(gè)值來(lái)表示。首先榨馁,用sigmoid函數(shù)把t_xt_y的值約束在0到1之間憨栽,再把這個(gè)偏移量加到網(wǎng)格左上角的坐標(biāo)上,就得到了預(yù)測(cè)框的中心點(diǎn),sigmoid函數(shù)讓偏移量始終小于1屑柔,這樣預(yù)測(cè)框的中心也就基本保持在網(wǎng)格內(nèi)屡萤;然后把寬和高的預(yù)測(cè)值p_wp_h經(jīng)過(guò)指數(shù)變換,乘到先驗(yàn)框的寬和高上,得到了預(yù)測(cè)框的寬和高弃衍。
注意這里得到的b_x,b_y,b_w,b_h吃型,都是相對(duì)于這張?zhí)卣鲌D的坐標(biāo),并不是在圖片中檢測(cè)框的真正位置措译。要得到圖片中檢測(cè)框的位置,還需要根據(jù)特征圖的寬高和圖片的寬高饰序,做等比例的坐標(biāo)變換:
real_x=b_x/W_f*W_p
real_y=b_y/H_f*H_p
real_w=b_w/W_f*W_p
real_h=b_h/H_f*H_p
voc數(shù)據(jù)集中圖片的寬高相等领虹,特征圖的寬高也相等,因此可以直接b_x,b_y,b_w,b_h上乘一個(gè)系數(shù)求豫,就得到了圖片上檢測(cè)框的真正位置塌衰。已知三種不同尺寸的輸出特征圖分別是下采樣8倍、16倍和32倍的結(jié)果蝠嘉,所以把得到的b_x,b_y,b_w,b_h乘上相應(yīng)的下采樣倍數(shù)即可最疆。

紅框內(nèi)是網(wǎng)絡(luò)輸出的預(yù)測(cè),藍(lán)框是乘以下采樣的倍數(shù)是晨,最后得到檢測(cè)框的實(shí)際位置

三肚菠、計(jì)算損失

模型的損失包括三種,分別是邊界框損失(giou_loss)罩缴、是否包含目標(biāo)的置信度損失(conf_loss)以及具體類別的分類損失(prob_loss)蚊逢。
1、邊界框損失

首先看一下GIoU的前身IoU箫章,即兩個(gè)檢測(cè)框的交并比烙荷。IoU的計(jì)算方式是,兩個(gè)檢測(cè)框的交集比上他們的并集檬寂,是0到1之間的某個(gè)值终抽,交并比越大說(shuō)明兩個(gè)檢測(cè)框重合度越高。
IoU=\frac{A\bigcap B}{A\bigcup B}
但是IoU作為損失函數(shù)時(shí)有一個(gè)問(wèn)題桶至,它只能簡(jiǎn)單地反映兩個(gè)檢測(cè)框的重疊程度昼伴,當(dāng)兩個(gè)框沒(méi)有相交時(shí),IoU無(wú)法表示它們的距離镣屹,而且當(dāng)兩個(gè)框的IoU值相同時(shí)圃郊,實(shí)際檢測(cè)框的位置可以有很多種可能:

IoU相同,但是檢測(cè)框位置不同

因此女蜈,基于IoU存在的問(wèn)題持舆,YOLOv3中使用GIoU作為檢測(cè)框的損失函數(shù)色瘩,其計(jì)算方式為:
GIoU=IoU-\frac{|C-A\bigcup B|}{|C|}

其中C代表AB的最小外接矩形的面積,這種度量方式解決了兩個(gè)檢測(cè)框沒(méi)有相交時(shí)逸寓,無(wú)法比較兩個(gè)圖像的距離遠(yuǎn)近的問(wèn)題居兆。

所以,第一項(xiàng)損失就是模型輸出的預(yù)測(cè)框和真實(shí)標(biāo)注框之間的GIoU距離竹伸,在代碼中實(shí)現(xiàn)方法為:

其中泥栖,respond_bbox是指每個(gè)網(wǎng)格是否對(duì)這個(gè)真實(shí)標(biāo)注框負(fù)責(zé),也就是是否包含中心落在這個(gè)網(wǎng)格的檢測(cè)框佩伤,包含為1聊倔,不包含為0,這是在數(shù)據(jù)標(biāo)注的過(guò)程中處理好的生巡,dataset.py的代碼中對(duì)應(yīng)方法為:

也就是只要當(dāng)前網(wǎng)格產(chǎn)生的3個(gè)先驗(yàn)框中,和目標(biāo)真實(shí)框的IoU大于閾值(圖中閾值為0.3)的就為正樣本见妒,置信度設(shè)為1孤荣,如果3個(gè)先驗(yàn)框的IoU都小于閾值,那么這里面和目標(biāo)IoU最大的標(biāo)注為正樣本须揣。所以盐股,當(dāng)網(wǎng)格負(fù)責(zé)這個(gè)標(biāo)注框時(shí),后續(xù)的giou損失才有效耻卡,當(dāng)不負(fù)責(zé)時(shí)疯汁,整個(gè)loss就為0,不參與loss計(jì)算卵酪。
另一個(gè)bbox_loss_scale指的是幌蚊,給goiu_loss加的權(quán)重,它的計(jì)算方式就在圖中上一行溃卡,可以理解為:
bbox\_loss\_scale=2-1*\frac{bbox\_area}{image\_area}

因此溢豆,當(dāng)網(wǎng)格對(duì)某個(gè)真實(shí)標(biāo)注框負(fù)責(zé),并且預(yù)測(cè)框相對(duì)于圖片的比例越小瘸羡,對(duì)應(yīng)的損失權(quán)重就越大漩仙,總體效果就是增加了小目標(biāo)的檢測(cè)精度。
2犹赖、置信度損失
第二項(xiàng)置信度損失队他,就是上述每個(gè)網(wǎng)格是否對(duì)這個(gè)真實(shí)標(biāo)注框負(fù)責(zé)的準(zhǔn)確度評(píng)價(jià),不管當(dāng)前網(wǎng)格內(nèi)有沒(méi)有負(fù)責(zé)目標(biāo)峻村,都需要計(jì)算當(dāng)前的判斷是否準(zhǔn)確麸折。

紅框內(nèi)表示和真實(shí)框IoU>0.5的預(yù)測(cè)框不參與置信度計(jì)算

模型采用輸出置信度conv_raw_conf和真實(shí)標(biāo)注信息respond_bbox的交叉熵來(lái)計(jì)算置信度:當(dāng)網(wǎng)格的預(yù)測(cè)框包含物體時(shí),應(yīng)遵循真實(shí)標(biāo)注信息respond_bbox的標(biāo)簽權(quán)重雀哨,標(biāo)簽為1時(shí)才有值磕谅;當(dāng)網(wǎng)格預(yù)測(cè)框沒(méi)有物體時(shí)私爷,這時(shí)標(biāo)簽權(quán)重為(1-respond_bbox)*weight,多乘了一個(gè)weight膊夹,可以理解為把IoU匹配結(jié)果較差的預(yù)測(cè)框也排除掉衬浑,不計(jì)算它的置信度損失。
把這兩種情況下的交叉熵?fù)p失加起來(lái)放刨,再乘以一個(gè)focal權(quán)重工秩,代碼中conf_focal等于預(yù)測(cè)置信度pred_conf和真實(shí)標(biāo)注信息respond_bbox的均方誤差,最后就得到了總體的置信度損失进统。
3助币、分類損失
分類損失也采用了交叉熵的計(jì)算方式,當(dāng)所在網(wǎng)格有負(fù)責(zé)檢測(cè)框時(shí)螟碎,計(jì)算真實(shí)類別標(biāo)簽和預(yù)測(cè)類別的sigmoid交叉熵眉菱。這里采用了sigmoid而不是softmax,把每個(gè)類別的判定都看做二分類的判定掉分,即是屬于還是不屬于這個(gè)類俭缓,這樣做的好處是可以允許一個(gè)框同屬于多個(gè)類別。

最后酥郭,把這三種loss加起來(lái)作為最后的迭代損失华坦,參與模型更新。

圖中構(gòu)成總loss的每一項(xiàng)損失不从,都是三個(gè)尺度預(yù)測(cè)框損失的和惜姐,也即三種尺度的先驗(yàn)框各自獨(dú)立計(jì)算損失函數(shù)。而特征融合椿息,是把darknet輸出的三種特征圖相繼整合再卷積歹袁,得到不同感受野的預(yù)測(cè)結(jié)果,在測(cè)試時(shí)則需要統(tǒng)一考慮三種預(yù)測(cè)結(jié)果撵颊。

四宇攻、測(cè)試圖片

目前為止YOLOv3的訓(xùn)練過(guò)程基本上結(jié)束了,從數(shù)據(jù)準(zhǔn)備倡勇、模型運(yùn)行到損失迭代大致能夠連通思路逞刷,接下來(lái)看看測(cè)試時(shí)是如何工作的。
1妻熊、輸入圖片
讀取一張圖片夸浅,將其整理成[1,416,416,3]的形式,作為input_data送入模型扔役。
2帆喇、得到預(yù)測(cè)輸出
模型運(yùn)行后會(huì)得到三種不同尺度的預(yù)測(cè)框集合,即sbbox亿胸、mbbox和lbbox坯钦,每個(gè)集合里面都包含了在當(dāng)前感受野下的一個(gè)或多個(gè)預(yù)測(cè)框预皇。
3、結(jié)果篩選
得到了很多檢測(cè)框婉刀,有可能包含一些重復(fù)的吟温、越界的或置信度很低的框框,所以需要對(duì)它們進(jìn)行篩選突颊,這里篩選分為兩步:
第一鲁豪,直接按照幾個(gè)規(guī)則去掉不合格的檢測(cè)框,比如檢測(cè)框超過(guò)了圖片邊界的律秃,還有置信度低于0.3的爬橡,這些明顯不是正確答案的檢測(cè)框先排除;
第二棒动, 對(duì)剩下的框進(jìn)行非極大值抑制(NMS)處理糙申,算法流程為:

假設(shè)一共有n個(gè)候選框,根據(jù)預(yù)測(cè)的置信度從大到小排列船惨。
1郭宝、從最大的置信度的box開始,分別判斷其余的box與最大置信度的box的IoU值掷漱,大于閾值時(shí)則丟棄,小于閾值則保留榄檬,同時(shí)保留最大置信度的box卜范;
2、在剩余的box內(nèi)再次選置信度最大的并標(biāo)記保留鹿榜,與剩下的box做與第一步的相同的操作海雪,就這樣直到找到滿足條件所有的保留框。

代碼中IoU的閾值設(shè)為0.45舱殿,處理過(guò)程中每個(gè)候選框要么作為當(dāng)前置信度最高的框被保留奥裸,要么在和最優(yōu)候選框的IoU對(duì)比時(shí)被淘汰,一直這樣操作直到把候選框清零沪袭,被保留下來(lái)的框就是最后檢測(cè)的結(jié)果啦湾宙。
拿兩張圖片試試:

因?yàn)檫@個(gè)模型是直接從頭開始訓(xùn)練的,沒(méi)有加載預(yù)訓(xùn)練的參數(shù)冈绊,所以在有些物體的識(shí)別上還存在一些誤差侠鳄。

結(jié)束!

參考博客

1死宣、yolo系列之yolo v3【深度解析】
2伟恶、一文看懂YOLO v3
3、 深度學(xué)習(xí)筆記(十三)YOLO V3 (Tensorflow)
3毅该、yolov3損失函數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末博秫,一起剝皮案震驚了整個(gè)濱河市潦牛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挡育,老刑警劉巖巴碗,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異静盅,居然都是意外死亡良价,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門蒿叠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)明垢,“玉大人,你說(shuō)我怎么就攤上這事市咽∪” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵施绎,是天一觀的道長(zhǎng)溯革。 經(jīng)常有香客問(wèn)我,道長(zhǎng)谷醉,這世上最難降的妖魔是什么致稀? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮俱尼,結(jié)果婚禮上抖单,老公的妹妹穿的比我還像新娘。我一直安慰自己遇八,他們只是感情好矛绘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著刃永,像睡著了一般货矮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斯够,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天囚玫,我揣著相機(jī)與錄音,去河邊找鬼雳刺。 笑死劫灶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的掖桦。 我是一名探鬼主播本昏,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼枪汪!你這毒婦竟也來(lái)了涌穆?” 一聲冷哼從身側(cè)響起怔昨,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宿稀,沒(méi)想到半個(gè)月后趁舀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祝沸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年矮烹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩锐。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡奉狈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涩惑,到底是詐尸還是另有隱情仁期,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布竭恬,位于F島的核電站跛蛋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痊硕。R本人自食惡果不足惜赊级,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岔绸。 院中可真熱鬧此衅,春花似錦、人聲如沸亭螟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)预烙。三九已至,卻和暖如春道媚,著一層夾襖步出監(jiān)牢的瞬間扁掸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工最域, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谴分,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓镀脂,卻偏偏與公主長(zhǎng)得像牺蹄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薄翅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容