目標檢測—紙上談兵(二)

這是一個閱讀筆記,主要用于記錄在閱讀經典的目標檢測模型論文過程中,得出的總結和思考。并不詳細介紹每個模型,主要總結每個模型的優缺點。其中可能存在錯誤的理解,僅供參考哈。


11. FPN(2016-12)


11.1 FPN是一個高級的特征提取網絡

還記得前面介紹的PVANet嗎?PVANet本身指的是目標檢測器中的特征提取網絡,或者說是基礎網絡(Base Network),PVANet專注于在保證特征提取性能的同時最大化地降低計算成本。和Faster R-CNN風格的RPN,以及檢測網絡組合在一起,才構成的PVANet目標檢測器。

類似的,這篇論文中提出的FPN(Feature Pyramid Network, 特征金字塔網絡)也是一個特征提取網絡/基礎網絡。而FPN專注于如何更好地捕獲多層級的特征表征,從而更好地解決目標的多尺度問題

我們根據時間關系,來聊聊目標檢測器中的基礎網絡在解決多尺度目標方面嘗試過的辦法:

  • 圖像金字塔

如下圖所示:

即將原始輸入圖像在送入網絡前縮放到不同的尺度,對應得到不同層級的特征圖,這些特征圖都包含了很強的語義信息(特征圖中邊框的粗細程度反映了特征圖包含語義信息的強弱,邊框越粗,表示特征圖包含的語義信息越強)。使用同一個檢測網絡依次完成每一個尺度圖像的檢測,最后將檢測結果進行融合。

這種方案在提升多尺度目標檢測性能方面沒的說,肯定是相當有效的。大尺度的特征圖能更好地檢測小目標;小尺度特征圖能更好地檢測大目標。這種方案在基于手工特征(hand-engineered feature)的檢測時代用的最多。

但是,圖像金字塔方案的缺點是會顯著地增大檢測網絡的計算量以及內存占用。這很好理解,圖像金字塔相當于同時要檢測多張圖像。

主流的目標檢測器出于實時性方面的需求,很少采用這種古老的方案。

  • 在一張特征圖上進行多尺度預測

如下圖所示:

這是原始Faster R-CNN風格的的解決方案,即針對單張輸入圖像,得到最高層級的特征圖,然后在上面布置多尺度的anchor。前面在Faster R-CNN的部分已經討論過,這種方案主要問題在于兩點:

(1)由于僅使用了比較粗糙的深層特征圖,丟失圖像中的細節信息,在檢測小目標方面表現不好。

(2)特征圖的感受野是固定的,使用固定感受野的特征圖要預測不同尺度的目標,有點牽強(個人觀點)。

  • 使用多個層級的特征圖同時進行預測

如下圖所示:

這是原始SSD風格的解決方案。基于淺層特征圖感受野較小,且較好地保留了圖像的細節信息,可用于檢測小目標;深層特征圖感受野較大,適合用于檢測大目標。因此同時使用不同層級的特征圖進行預測,不就可以完成多尺度的目標檢測了嗎!

得到的特征圖構成的金字塔看上去是不是有點像古老的圖像金字塔?

這種方案仍然存在兩個缺陷:

(1)雖然這種多層級的預測考慮到了Faster R-CNN的缺點,使得不同感受野的特征圖負責處理對應尺度的目標,但是SSD忽略了一個問題:高分辨率的淺層特征圖雖然保留了圖像更多的細節信息,但是語義信息弱啊!

所以說,SSD得到的特征金字塔僅僅是有點像圖像金字塔方案。前面說了,特征圖中邊框的粗細程度反映了特征圖包含語義信息的強弱,邊框越粗,表示特征圖包含的語義信息越強。

看上圖中,SSD得到的特征金字塔中,層數越淺,邊框越細,意思是語義信息越弱。

再看第一張圖像金字塔得到的特征金字塔,每個層級的特征圖的邊框都很粗,意味著每個層級的特征圖語義信息都很強。

所以說,天下沒有免費的午餐,SSD想要免費得到每個層級都包含豐富語義信息的特征金字塔,不是這么容易的。

SSD中淺層特征圖的語義信息弱,得不到好的特征表征,導致識別環節表現不好。

(2)其實SSD作者也不是沒有考慮到淺層特征圖語義信息弱的問題,相反,作者考慮到了,要不為啥SSD中最淺層的特征圖都使用的VGG-16中的conv4_3呢?這已經是8倍的步長了。作者認為這一層特征圖的語義信息已經還可以了。所以缺陷(1)好像對SSD有點不公平。。。

但是另一個問題又來了,導致SSD雖然打著多尺度預測完美解決多尺度目標的旗號,但是實際上SSD對于小目標的檢測仍然不好。因為,可能,8倍的步長得到的特征圖conv4_3已經算是很粗糙了。

或許我們需要更淺的特征圖來解決小目標預測問題。但特征圖的細節信息和語義信息是一對矛盾兄弟啊!兩者不可兼得?答案是使用多層級特征融合!

  • 進行多層級特征融合,使用融合后的一張特征圖進行預測

如下圖所示(偷個懶,直接在原論文中截圖的,表示形式和上面的有點區別,不過不影響):

這是HyperNet風格的解決方案。前面對HyperNet簡單介紹過,HyperNet將不同層級的特征圖進行融合,使得融合后的特征圖既具有深層特征圖高級的語義信息,同時又保留了淺層特征圖的圖像細節信息

HyperNet使用了conv3(步長為4)的圖像分辨率進行預測,同時融合了conv1(步長為1)和conv5(步長為16)的特征圖信息,融合之后的特征圖稱為Hyper Feature Maps

從效果來看,這種融合方式在PASCAL VOC20017測試集上得到的porposal的召回率還不錯:

但是最終的mAP就不怎么樣了。說明這種融合方式不夠合理?注意到,特征圖融合時,conv5直接經過4倍的上采樣,conv1直接經過4倍的下采樣。不知是否這種融合方式過于簡單粗暴?或許基礎網絡(VGG-16)不夠好?沒看源代碼,沒具體去做ablation實驗,說不清道不明。重點是這種多層級特征融合的思想挺好,融合高層級的特征之后,使得高分辨率的特征圖也擁有了高層級特征圖的語義信息。

  • 基礎網絡設計中的新思想——FPN

FPN的示意圖如下:

看上去是不是有點像SSD,還有點像HyperNet?

FPN采用了和SSD相似的預測方案,即同時使用多個層級的特征圖進行預測,出發點也類似:淺層特征圖包含較多的圖像細節,用于預測小目標;深層特征圖用于預測大目標。

但前面講SSD這種預測方案有缺陷:淺層高分辨率的特征圖語義信息弱的問題如何解決?

FPN又借用了HyperNet的多層級特征融合的思想:將深層的,語義信息較強的特征圖逐漸進行上采樣,使用在channel維度上進行concate,或者使用element-wise的方式相加等方式,與淺層的特征圖進行融合,達到加強淺層特征圖語義信息的效果。

(也不能說FPN就是參考了HyperNet的多層級特征融合思想,因為多層級特征融合思想在2014年底出來的,語義分割領域的經典論文《Fully Convolutional Networks for Semantic Segmentation》中就已經獲得成功了,之后的很多語義分割模型貌似都用了這種思想,具體論文還沒看。。。FPN著重提了這一篇論文:《Learn-
ing to refine object segments
》)

經過多層級特征融合之后可以看到(特征圖邊框粗細程度),每一個層級的特征圖都擁有了豐富的語義信息了。

可以說,FPN通過融合多層級特征,對SSD的基礎網絡進行了升級,得到了在所有層級都擁有高級語義信息的特征金字塔

原來天下真的有免費的午餐。就這樣,FPN通過近乎免費的方式達到了圖像金字塔的效果。

11.2 FPN的具體網絡結構

前面介紹了FPN的整體思路,現在介紹FPN具體的網絡結構,看看它具體是怎樣進行融合的?

FPN由一個bottom-up highway和top-down highway&lateral connection組成。

11.2.1 bottom-up highway

bottom-up highway就是針對一張任意尺寸的輸入圖像,采用一個基礎網絡提取特征圖的前向過程。這里的基礎網絡隨便選,VGG-16、PVANet、Darknet-19、ResNet等都行。

文中作者采用了ResNet作為基礎網絡(論文中嘗試了ResNet-50,ResNet-101),其網絡層配置參考來自相關論文的表格:


論文中,將輸入圖像的短邊統一縮放到800,作為FPN的輸入

首先經過一個7x7,s=2的大卷積層,以及一個3x3,s=2的池化層。

然后ResNet經過了4個階段的卷積過程,即表格中的conv2_x,conv3_x,conv4_x,conv5_x。

其中每一個階段內,特征圖大小是不變的,且conv2_x,conv3_x,conv4_x,conv5_x每個階段對應的特征圖大小分別是原始輸入圖像的1/4,1/8,1/16,1/32。

FPN將以上4個階段中,每個階段的最后一個卷積層的輸出特征圖取出來,得到{C2,C3,C4,C5}。

即,{C2,C3,C4,C5}每張特征圖大小分別是輸入圖像的{1/4,1/8,1/16,1/32}。

假設輸入圖像的尺寸是[H,W],那{C2,C3,C4,C5}特征圖的尺寸分別是:

  • C2.shape=[H/4, W/4, 256]
  • C3.shape=[H/8, W/8, 512]
  • C4.shape=[H/16, W/16, 1024]
  • C5.shape=[H/32, W/32, 2048]
11.2.2 top-down highway&lateral connection

top-down highway&lateral connection指的是特征自頂向下進行融合的過程。

現在要利用{C2,C3,C4,C5},獲取融合之后的特征金字塔:{P2,P3,P4,P5,P6}。

其中,{P2,P3,P4,P5}的長和寬與{C2,C3,C4,C5}一一對應相等,P6是在P5基礎上經過一個最大池化層所得,目的是獲得更大感受野的特征圖。

下面描述如何計算{P2,P3,P4,P5,P6},總的計算過程如下圖所示:

上圖中,Upsample/2可以直接是一個resize操作,采用最近鄰插值方式。"+"表示一個element-wise的加法。

于是,{P2,P3,P4,P5,P6}就構成了FPN的輸出,每個層級的shape如下:

  • P2.shape=[H/4, W/4, 256]
  • P3.shape=[H/8, W/8, 256]
  • P4.shape=[H/16, W/16, 256]
  • P5.shape=[H/32, W/32, 256]
  • P6.shape=[H/64, W/64, 256]

11.3 FPN + RPN

原始的Faster R-CNN僅使用了最高層級的單張特征圖進行預測,現在將基礎網絡換成FPN之后,要同時使用5張不同層級的特征圖,即{P2,P3,P4,P5,P6}進行預測。那RPN如何與FPN進行結合呢?

  • anchor的設計

經典的Faster R-CNN是在一張特征圖上使用了3個尺度和3個橫縱比的anchor,即共有9種不同的anzhor。

基礎網絡采用FPN之后,每個層級的特征圖就負責1個尺度就行了,每層特征圖與其負責的anchor尺度的對應關系如下:

(P2, 32), (P3, 64), (P4, 128), (P5, 256), (P6, 512)

而橫縱比的選擇不變,每個尺度都對應3個橫縱比,即(1/2,1,2)。因此,由于采用FPN的多層級特征進行預測之后,總的anchor類別數由9增加到15種,主要增加了32和64兩個小尺度anchor,希望能改善對小目標的檢測效果。

  • 所有層級的特征圖共享一個RPN

雖然使用了6個特征圖進行預測,但是不同特征圖之間采用共享RPN參數的方式。這是由于每層特征圖都包含了很強的語義信息,所以僅采用一個統一的RPN網絡進行預測是可行的。而且這樣做大大減小了RPN部分的網絡參數數量。

RPN部分的訓練方式不變,訓練時,正負anchor的選擇標準與經典Faster R-CNN中的RPN一致。

11.4 FPN + RPN + Fast R-CNN

  • ROI池化的處理方式

通過RPN得到了N多個proposals的坐標信息,比如box1是一個由RPN產生的proposal,其高和寬分別為h,w。

那么在進行ROI池化時,需要將box1的坐標信息映射回{P2,P3,P4,P5,P6}中哪一個層級的特征圖,從而得到proposal feature map呢?顯然,面積小的proposal應該映射回分辨率較大的特征圖,面積大的proposal應該映射回分辨率較小的特征圖。具體,論文中是這么做的:

其中,k值決定了proposal(高=h,寬=w)應該映射回{P2,P3,P4,P5,P6}中的哪一個特征圖。k0取為4。

比如,當w=h=224時,此時“+”后面的部分為0,那么k=4,該proposal應該映射回P4。

比如,當w=h=112時,此時“+”后面的部分為-1,那么k=3,該proposal應該映射回P3。

如果k是小數,則做一下四舍五入取整。以此類推,達到了越小的proposal應該使用越淺的特征圖的效果。

但是,論文中提到,ROI池化時P6不使用:

那么,如果上面的公式計算得到的k=6,也將該proposal映射回P5。

解決了proposal應該映射回哪一張特征圖之后,最后采用7x7的ROI池化層,即得到了每個proposal的feature vector。

  • 分類回歸層

這里的分類回歸層采用2個1000-d的fc層,然后是分別接分類輸出和回歸輸出,形式與原始的Faster R-CNN保持一致。在Faster R-CNN(ResNet-101),作者使用C4特征圖送入RPN,使用C5卷積層來做預測網絡,但是,FPN中已經將C4、C5都用來提取圖像特征了,因此這里就是用了MLP來做分類回歸層。

好了,FPN以及基于FPN的Faster R-CNN的重點應該就是上面這些內容了。至于訓練的細節,暫時不關注,需要用到時再細看。

11.5 FPN+Faster R-CNN架構在COCO上的表現

加入了FPN后的Faster R-CNN在COCO數據集上大殺四方,就單模型的表現來看,勝過了COCO2016的冠軍G-RMI。如下表所示:

另外,FPN的主要目標是改善目標的多尺度檢測,尤其是對小目標的檢測(這是之前幾乎所有目標檢測器的痛點),實驗結果非常明顯:

和僅使用單層特征圖的RPN相比,使用了FPN多層級特征圖的RPN在COCO上的平均召回率AR提升明顯。其中,在小目標上的AP從32.0升到了44.9,整整提升了12.9個百分點!

論文中還做了很多的Ablation實驗,用于探究FPN中的幾個關鍵idea,即

  • top-down highway,即Upsample/2;
  • lateral connection,即將每個層級的Ci使用卷積1x1x256,然后與上一層級的特征圖相加;
  • 多層級特征圖同時預測
  • RPN在每個特征圖上是否共享卷積等

各自對模型性能的影響,感興趣就仔細讀一下論文吧。

11.6 總結

這篇論文主要有以下貢獻:

  • 為目標檢測網絡提出了新的基礎網絡結構,即FPN。通過bottom-up highway、top-down highway以及lateral connection,巧妙地得到了特征金字塔結構,每個層級的特征圖都擁有高級的語義信息。
  • 通過將FPN與Faster R-CNN進行結合,就單模型性能來看,超越了先前所有的檢測模型,同時速度還能達到約6FPS。
  • 通過將高層級特征圖的語義信息融合到淺層特征圖中,Faster R-CNN(FPN)對小目標的檢測效果提升明顯。

11.7 參考資料


12. TDM(2016-12)


12.1 TDM也是一種用于多尺度特征融合的基礎網絡結構

TDM結構來自于谷歌的這篇論文:

和FPN高度相似,都是致力于設計更好的特征提取網絡,然后與Faster R-CNN架構進行結合用于目標檢測。

TDM和FPN都采用了多層級特征融合的思路,先是一個bottom-up的前向傳播,得到不同層級的特征圖,然后從最高層級的特征圖開始,通過top-down將深層特征圖往下傳,然后通過lateral connection與當前層的特征圖進行融合。然后繼續往下傳播。。。最后每個層級的特征圖都擁有了豐富的語義信息。

FPN和TDM的整體網絡結構如下圖所示:

如果已經熟悉了FPN的網絡結構,TDM的網絡結構一看就懂。總體來看,TDM僅僅使用了FPN中分辨率最高的特征圖進行預測而已。

但是,FPN和TDM在相鄰兩層特征圖如何進行融合方面有區別,如下圖所示:

圖中P4表示一個top-down 特征圖,C3表示bottom-up特征圖,P3表示融合之后的特征圖。兩者區別如下:

  • 卷積方式有區別,比如卷積核大小和位置,見上圖。
  • FPN的top-down 特征圖,以及bottom-up特征圖經過lateral connection的卷積之后,特征圖通道數固定在256。但是TDM的特征圖通道數是可以設置的,如上圖中的C1/C2/C3。
  • 特征圖的融合方式不同,FPN采用的是element-wise addition,而TDM采用的是通道維度上的concate。

預測層上面,FPN使用了6個特征圖同時進行預測,而TDM僅僅使用了融合后,分辨率最大的特征圖進行預測。

從以上對比可以看出,TDM和FPN的思想高度重合,但是兩份工作應該是獨立完成的。

從將論文首次提交到到arxiv.org網站的時間來看,FPN的提交時間是2016-12-9:

本小節要討論的TDM論文提交的時間是2016-12-20:

時間相當接近。

12.2 FPN被TDM打臉了?

怎么說?FPN使用了6個特征圖同時進行預測,而且在FPN的論文中,作者做了ablation實驗,其中一個對比實驗就是僅使用融合之后,分辨率最高的特征圖進行預測(這不就是TDM干的事嗎???)。就是下面這段文字:


但是這樣做得到的實驗結果并不太好:

上圖中,(c)是使用6個特征圖進行預測得到的平均召回率,(f)就是僅使用融合之后,分辨率最高的特征圖進行預測的結果,從結果來看,單純使用一個特征圖進行預測的效果確實不如特征金字塔好。

而且,僅僅使用分辨率最高的特征圖進行預測還有一個缺點,會造成ahchor的數量超級多,因為特征圖的分辨率比較大。會額外增加計算成本和內存占用。

但是,僅從mAP的角度看,雖然僅僅使用分辨率最高的特征圖進行預測,但是TDM+Faster R-CNN在COCO test-dev上面的AP值最高刷到了37.3%:

而FPN+Faster R-CNN在同樣的數據集上的AP值是36.2%:

因此,僅僅從準確率角度來看,FPN通過ablation實驗說明僅使用分辨率最高的特征圖進行預測不好,這一觀點是被TDM打臉了。

但是,這樣對比又有一些不公平:

  • FPN和TDM訓練時使用的數據集大小不一樣,FPN的訓練集更大,具體看論文。
  • TDM刷到37.3%的AP時,使用的基礎網絡是InceptionResNetv2。當使用和FPN相同的ResNet-101時,TDM得到的AP值是35.2,并沒有FPN高。
  • 另外,兩個模型訓練時使用的深度學習框架不一樣,TDM使用的Tensorflow,而FPN應該使用的caffe吧。比如TDM論文中使用Tensorflow重現了Faster R-CNN,結果準確率優于原版Faster R-CNN(caffe實現)。所以,在準確率相差不大(約1%)的情況下,很難得出TDM和FPN到底哪一種作為目標檢測的基礎網絡更好。
  • 還有一點是速度問題,雖然TDM論文中沒有提到模型速度問題,TDM+Faster R-CNN的檢測速度應該要比FPN+Faster R-CNN要慢一些。

總的來說,TDM和FPN這兩篇論文寫得都很詳細,都做了完整的ablation實驗。作為吃瓜群眾,目前我覺得兩種結構都可以考慮。


13. DSSD(2017-1)


13.1 DSSD相對于SSD的改進措施

和YOLO_v2與YOLO關系類似,DSSD是在SSD的基礎上進行優化,DSSD和SSD的作者都是Liu Wei等人。

DSSD在SSD的基礎上做了以下改進:

  • 基礎網絡的選擇上,使用ResNet-101替換掉VGG-16。

更換前后,用于預測的特征圖對比如下圖所示:

  • 嘗試了不同的預測模塊。

原始的SSD使用圖(a)中的預測模塊,即直接一個3x3卷積(可看做1個fc層)得到分類和回歸結果。本文中作者嘗試將預測模塊加深,并且嘗試了3種加深方案。ablation實驗結果如下圖所示:

PM表示Prediction Module,即預測模塊。

從結果來看,上圖(c)的效果最好,因此DSSD采用了圖(c)的預測模塊。

  • 引入了和FPN非常相似的top-down通道,進一步加強淺層特征圖的語義信息。

論文中DSSD的網絡結構稱為hourglass/沙漏造型,但是除去預測模塊,實質上和FPN是一個套路。只是相鄰兩個層級的融合方式有一點點區別,DSSD中相鄰層融合方式如下:

深層特征圖經過一個轉置卷積層達到2倍上采樣的目的,而FPN直接使用雙線性插值的resize操作。

通過top-down通道加強淺層特征圖的語義信息之后,DSSD在小目標的檢測上比原始的SSD效果好了很多。

  • 在anchor的橫縱比選擇上,采用了和YOLO_v2相同的思路,使用了K-means聚類的方式,根據具體數據集的的目標框特點來得到anchor的橫縱比。

經過以上幾點改進之后,DSSD在COCO2015測試集上的表現如下圖所示:

AP最好達到了33.2。作為對比FPN+Faster R-CNN在COCO測試集上達到了35.8:

13.2 DSSD的缺點

相比于SSD,雖然DSSD的準確率提上去了,但是作為one-stage模型引以為傲的速度優勢沒了。如下圖所示:

和SSD類似,DSSD也是使用了兩種輸入圖像分辨率:321和513。性能最好的DSSD513的檢測速度已經,慢到5-6FPS了,這和FPN的檢測速度差不多。完全失去了one-stage模型的速度優勢。

13.3 參考資料


14. Mask R-CNN(2017-3)


...

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容