## NVIDIA 遷移學(xué)習(xí)工具TLT使用教程

1览芳、 TLT安裝&運(yùn)行

TLT需要在docker中運(yùn)行寄摆,因此第一步拉取鏡像

首先登陸NGC喇闸,如果你是第一次注冊NGC蒸眠,你需要獲得一個(gè)API KEY漾橙,這個(gè)值需要保存下來,因?yàn)樗粫?huì)顯示一次楞卡,并且以后會(huì)經(jīng)常用到

拉取鏡像

docker pull nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3

啟動(dòng)鏡像

sudo docker run -it -v /home/zhaobing/data:/data --gpus all nvcr.io/nvidia/tlt-streamanalytics:v2.0_py3

2霜运、準(zhǔn)備數(shù)據(jù)集

2.1準(zhǔn)備KITTI格式數(shù)據(jù)集

對于目標(biāo)檢測任務(wù),TLT支持的數(shù)據(jù)集形式為KITTI數(shù)據(jù)集形式,訓(xùn)練前蒋腮,需要將該形式的數(shù)據(jù)集轉(zhuǎn)化為TFRecords.

KITTI數(shù)據(jù)集形式

<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"><v:formulas></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path></v:stroke></v:shapetype><v:shape id="圖片_x0020_1" o:spid="_x0000_i1038" type="#_x0000_t75" style="width:415.5pt;height:196.5pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.png" o:title=""></v:imagedata></v:shape>TLT要求圖像分辨率統(tǒng)一淘捡,不支持多分辨率圖像自動(dòng)resize訓(xùn)練.需要自行將圖像分辨率統(tǒng)一并對應(yīng)修改label文件中bbox位置。labels標(biāo)注為每張圖片對應(yīng)一個(gè)txt文檔池摧,對于每個(gè)標(biāo)注目標(biāo)焦除,標(biāo)注信息包括15個(gè)元素。對于2D目標(biāo)檢測作彤,第1個(gè)元素為目標(biāo)類別膘魄,5-8為四個(gè)坐標(biāo)值。目前官方未提供常見的數(shù)據(jù)集格式如VOC,COCO數(shù)據(jù)集轉(zhuǎn)換為KITTI數(shù)據(jù)集形式的腳本竭讳,整理了二者轉(zhuǎn)換為KITTI格式的腳本如下创葡。

<v:shape id="圖片_x0020_2" o:spid="_x0000_i1037" type="#_x0000_t75" style="width:415pt;height:38pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.png" o:title=""></v:imagedata></v:shape>

<v:shape id="_x0000_i1025" type="#_x0000_t75" style="width:63pt;height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image003.emz" o:title=""></v:imagedata></v:shape><v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:70pt;
height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.emz" o:title=""></v:imagedata></v:shape>

2.2轉(zhuǎn)tfrecord

生成訓(xùn)練集tfrecord格式文件,需先準(zhǔn)備.config配置文件绢慢,例如將如下信息生成為train.config

<v:shape id="_x0000_i1027" type="#_x0000_t75" style="width:61.5pt;height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image005.emz" o:title=""></v:imagedata></v:shape>

image_directory_path設(shè)置與root_directory_path相同灿渴。

執(zhí)行轉(zhuǎn)換命令:

tlt-dataset-convert -d <path_to_tfrecords_conversion_spec> -o <path_to_output_tfrecords>

測試集同理。

3.生成實(shí)驗(yàn)配置文件

各種目標(biāo)檢測網(wǎng)絡(luò)實(shí)驗(yàn)配置文件寫法不同,根據(jù)自己選擇的目標(biāo)檢測算法骚露,定義相應(yīng)配置文件蹬挤,參考

https://docs.nvidia.com/metropolis/TLT/tlt-getting-started-guide/index.html#spec_file_yolov3_topic

7.2-7.9.

Yolov3配置文件spec.txt內(nèi)容如下所示。

<v:shape id="_x0000_i1028" type="#_x0000_t75" style="width:58.5pt;height:41pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.emz" o:title=""></v:imagedata></v:shape>

推薦將自己想要訓(xùn)練集的所有類別填到target_class_mapping荸百,可以默認(rèn)設(shè)置一個(gè)key闻伶,一個(gè)value對應(yīng)一個(gè)類別,也可以多個(gè)key對應(yīng)一個(gè)value够话,這樣訓(xùn)練時(shí)多個(gè)類別將合并為一個(gè)value類進(jìn)行訓(xùn)練蓝翰。

4.模型訓(xùn)練

tlt-train yolo --gpus 0 -e /data/tlt/spec.txt -r /data/tlt/output_yolov3 -k tlt_encode

其中,

-e spec.txt配置文件位置

-r 實(shí)驗(yàn)結(jié)果存放位置

-k 加密模型的key,設(shè)置為tlt_encode

注意兩個(gè)特殊選項(xiàng)

量化感知訓(xùn)練:對于DetectNet_v2, SSD, DSSD, YOLOv3, RetinaNet and FasterRCNN女嘲,tlt支持采用量化感知進(jìn)行訓(xùn)練畜份。

量化感知訓(xùn)練,就是在量化的過程中欣尼,對網(wǎng)絡(luò)進(jìn)行訓(xùn)練爆雹,從而讓網(wǎng)絡(luò)參數(shù)能更好地適應(yīng)量化帶來的信息損失。這種方式的準(zhǔn)確性普遍比訓(xùn)練后進(jìn)行量化要高愕鼓。

將spec.txt中的enable_qat 參數(shù)設(shè)置為 True即可

自動(dòng)混合精度:訓(xùn)練階段混合使用FP32和FP16.

開啟方法钙态,tlt-train訓(xùn)練時(shí),export 一個(gè)環(huán)境變量即可菇晃。

export tf_enable_auto_mixed_precision=1

5.模型驗(yàn)證

tlt-evaluate yolo -e /data/tlt/spec.txt \

-m /data/tlt/output_yolov3/weights/yolo_darknet53_epoch_002.tlt \

-k tlt_encode

6.模型推理

tlt-infer yolo -i /data/tlt/000158.jpg \ -o /data/tlt/000158.jpg \ -e /data/tlt/spec.txt \

-m /data/tlt/output_yolov3/weights/yolo_darknet53_epoch_003.tlt \ -k tlt_encode

7.模型裁剪

tlt-prune [-h] -m <pretrained_model>

-o <output_file> -k <key>

[-n <normalizer>]

[-eq <equalization_criterion>]

[-pg <pruning_granularity>]

[-pth <pruning threshold>]

[-nf <min_num_filters>]

[-el [<excluded_list>]

示例:

tlt-prune -m /data/tlt/output_voc/weights/yolo_darknet53_epoch_006.tlt \

-o /data/tlt/output_voc/yolo_prune.tlt \

-eq union \

-pth 0.7 -k tlt_encode

pth設(shè)置越大册倒,模型裁剪后體積越小。

8.模型導(dǎo)出

將訓(xùn)練生成.tlt模型導(dǎo)出成INT8磺送、FP16驻子、FP32模型(.etlt),用于后續(xù)Deepstream的部署。

8.1 導(dǎo)出為FP16估灿、FP32模型

<v:shape id="圖片_x0020_5" o:spid="_x0000_i1036" type="#_x0000_t75" style="width:389.5pt;height:112pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png" o:title=""></v:imagedata></v:shape>

tlt-export [-h] {classification, detectnet_v2, ssd, dssd, faster_rcnn, yolo, retinanet}

-m <path to the .tlt model file generated by tlt train>

-k <key>

[-o <path to output file>]

[--cal_data_file <path to tensor file>]

[--cal_image_dir <path to the directory images to calibrate the model]

[--cal_cache_file <path to output calibration file>]

[--data_type <Data type for the TensorRT backend during export>]

[--batches <Number of batches to calibrate over>]

[--max_batch_size <maximum trt batch size>]

[--max_workspace_size <maximum workspace size]

[--batch_size <batch size to TensorRT engine>]

[--experiment_spec <path to experiment spec file>]

[--engine_file <path to the TensorRT engine file>]

[--verbose Verbosity of the logger]

[--force_ptq Flag to force PTQ]

示例:

tlt-export yolo -m /data/tlt/output_yolov3/yolo_pruned.tlt -k tlt_encode -o /data/tlt/output_yolov3/yolo_prune.etlt --data_type fp32 -e /data/tlt/spec.txt

注意----data_type 說明想要導(dǎo)出的模型類型崇呵,此時(shí)可選擇fp32或者fp16.

8.2 導(dǎo)出為INT8模型

INT8格式模型推薦轉(zhuǎn)換模式,需要訓(xùn)練數(shù)據(jù)參與馅袁,還會(huì)生成.bin文件

<v:shape id="圖片_x0020_4" o:spid="_x0000_i1035" type="#_x0000_t75" style="width:415pt;height:180pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png" o:title=""></v:imagedata></v:shape>

示例:

tlt-export yolo \

-m /data/tlt/output_yolov3/yolo_pruned.tlt \

-o /data/tlt/output_yolov3/yolo_prunedint8.tlt \

-k tlt_encode \

--data_type int8 \

--cal_cache_file /data/tlt/output_yolov3/calibration.bin \

-e /data/tlt/spec.txt \

--cal_image_dir /data/tlt/train_dataset/images

注意:FP32,FP16,INT8導(dǎo)出過程中域慷,均可以導(dǎo)出engine文件,但是由于engine與gpu型號相關(guān)汗销,除非到處環(huán)境與未來應(yīng)用GPU相同芒粹,否則無意義。

9.使用Deepstream部署

<v:shape id="圖片_x0020_6" o:spid="_x0000_i1034" type="#_x0000_t75" alt="../_images/dstream_deploy_options.png" style="width:415pt;height:252pt;visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png" o:title="dstream_deploy_options"></v:imagedata></v:shape>

模型部署在x86或者jetson卡上大溜,除了nv自研Detectnet_v2比較簡單外化漆,其他目標(biāo)檢測模型都需要結(jié)合TensorRT OSS在目標(biāo)環(huán)境下轉(zhuǎn)換為engine,再進(jìn)行部署。

9.1 TensorRT OSS安裝

l TensorRT OSS on X86

1. Install Cmake (>=3.13).

sudo apt remove --purge --auto-remove cmake

wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz

tar xvf cmake-3.13.5.tar.gz

cd cmake-3.13.5/

./configure

make -j$(nproc)

sudo make install

sudo ln -s /usr/local/bin/cmake /usr/bin/cmake

2. Get GPU Arch.****獲得算力數(shù)值

cd /usr/local/cuda/samples/1_Utilities/deviceQuery

sudo make

./deviceQuery

T4的話钦奋,該值為75

3. Build TensorRT OSS

git clone -b release/7.0 https://github.com/nvidia/TensorRT

cd TensorRT/

git submodule update --init --recursive

export TRT_SOURCE=pwd

cd $TRT_SOURCE

mkdir -p build && cd build

/usr/local/bin/cmake .. -DGPU_ARCHS=xy -DTRT_LIB_DIR=/usr/lib/aarch64-linux-gnu/ -DCMAKE_C_COMPILER=/usr/bin/gcc -DTRT_BIN_DIR=pwd/out

make nvinfer_plugin -j$(nproc)

libnvinfer_plugin.so*文件將生成到`pwd`/out/文件夾

4.****替換原始的TensorRT的原始libnvinfer_plugin.so*

sudo mv /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.x.y ${HOME}/libnvinfer_plugin.so.7.x.y.bak // backup original libnvinfer_plugin.so.x.y

sudo cp $TRT_SOURCE/pwd/out/libnvinfer_plugin.so.7.m.n /usr/lib/x86_64-linux-gnu/libnvinfer_plugin.so.7.x.y

sudo ldconfig

此步容易出錯(cuò)座云,參考下文jetson做法疙赠。

l TensorRT OSS on Jetson

1.****安裝Cmake(>=3.13)

<pre>sudo apt remove --purge --auto-remove cmake</pre>

<pre>wget https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz</pre>

<pre>tar xvf cmake-3.13.5.tar.gz</pre>

<pre>cd cmake-3.13.5/</pre>

<pre>./configure</pre>

<pre>make -j$(nproc)</pre>

<pre>sudo make install</pre>

<pre>sudo ln -s /usr/local/bin/cmake /usr/bin/cmake</pre>

2.build TensorRT OSS

<pre>git clone -b release/7.0 https://github.com/nvidia/TensorRT</pre>

<pre>cd TensorRT/</pre>

<pre>git submodule update --init --recursive</pre>

<pre>export TRT_SOURCE=pwd</pre>

<pre>cd $TRT_SOURCE</pre>

<pre>mkdir -p build && cd build</pre>

<pre>/usr/local/bin/cmake .. -DGPU_ARCHS=72 -DTRT_LIB_DIR=/usr/lib/aarch64-linux-gnu/ -DCMAKE_C_COMPILER=/usr/bin/gcc -DTRT_BIN_DIR=pwd/out</pre>

<pre>make nvinfer_plugin -j$(nproc)</pre>

<v:shape id="圖片_x0020_7" o:spid="_x0000_i1033" type="#_x0000_t75" style="width:220pt;height:100pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.png" o:title=""></v:imagedata></v:shape>

GPU_ARCH根據(jù)型號選擇填寫。

libnvinfer_plugin.so*文件將生成到`pwd`/out/文件夾

<v:shape id="圖片_x0020_9" o:spid="_x0000_i1032" type="#_x0000_t75" style="width:151.5pt;height:97pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png" o:title="ce42db35c91a0bae1b2c27d59a66dd8"></v:imagedata></v:shape>

3.****替換原始的TensorRT的原始libnvinfer_plugin.so*

<pre>sudo mv /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.7.x.y ${HOME}/libnvinfer_plugin.so.7.x.y.bak // backup original libnvinfer_plugin.so.x.y</pre>

<pre>sudo cp pwd/out/libnvinfer_plugin.so.7.m.n /usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.7.x.y</pre>

<pre>sudo ldconfig</pre>

<pre>注意朦拖,此處無需按照上述官方操作圃阳,以jetson nx為例,原始tensorrt的libnvinfer_plugin.so*文件在/usr/lib/aarch64-linux-gnu/路徑下璧帝,如libnvinfer_plugin.so捍岳,libnvinfer_plugin.so.7.1.3,libnvinfer_plugin.so.7.1.0.將這三個(gè)文件備份后刪除睬隶,將新生成的文件拷貝至此文件夾即可锣夹。</pre>

9.2將TLT模型整合到Deeepstream

1. 下載官方部署示例源碼

git clone https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps.git
  1. Build Sample Application

<v:shape id="圖片_x0020_8" o:spid="_x0000_i1031" type="#_x0000_t75" style="width:415.5pt;height:44.5pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image012.png" o:title=""></v:imagedata></v:shape>

3. 部署官方模型示例

Wget https://nvidia.box.com/shared/static/8k0zpe9gq837wsr0acoy4oh3fdf476gq.zip -O models.zip

Models文件夾中含有NV官方訓(xùn)練好的faster rcnn,yolov3,ssd,detecnet_v2等目標(biāo)檢測網(wǎng)絡(luò)訓(xùn)練.etlt模型苏潜。

以yolov3為例银萍,pgie_yolov3_tlt_config.txt和nvdsinfer_customparser_yolo_tlt目錄下yolo_labels.txt無需修改,分別運(yùn)行下面兩行命令恤左,可生成對應(yīng)engine贴唇,并對engine進(jìn)行性能測試。

<v:shape id="_x0000_i1029" type="#_x0000_t75" style="width:415.5pt;height:217pt" o:ole=""><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image013.emz" o:title=""></v:imagedata></v:shape>

3****.自己訓(xùn)練的.etlt轉(zhuǎn)換為engine

將TLT訓(xùn)練的.etlt文件拷貝到該目錄下(yolo_fp16.etlt)

修改nvdsinfer_customparser_yolo_tlt目錄下yolo_labels.txt修改為自己任務(wù)類別飞袋,加上background類別戳气。

修改pgie_yolov3_tlt_config.txt文件,指定模型路徑和秘鑰巧鸭,注意密鑰要和TLT訓(xùn)練時(shí)設(shè)定的密鑰相同瓶您,如本項(xiàng)目中,設(shè)定的密鑰為tlt_encode蹄皱,要修改才能讀取。

tlt-encoded-model=./ yolo_fp16.etlt

tlt-model-key=nvidia_tlt

pgie_yolov3_tlt_config.txt指定輸出engine的精度芯肤,我們這里選擇導(dǎo)出FP16精度

network-mode=2

修改類別數(shù)巷折,記得要加background

num-detected-classes=21

轉(zhuǎn)化為engine及性能測試與上節(jié)命令相同。

參考:

官方文檔

https://docs.nvidia.com/metropolis/TLT/tlt-getting-started-guide/text/deploying_to_deepstream.html#tensorrt-open-source-software-oss

2崖咨,deepstream_tlt_apps

https://github.com/NVIDIA-AI-IOT/deepstream_tlt_apps

3.示例

https://blog.csdn.net/zong596568821xp/article/details/107386744

https://zongxp.blog.csdn.net/article/details/107709786

<v:shape id="圖片_x0020_3" o:spid="_x0000_i1030" type="#_x0000_t75" style="width:415.5pt;height:178pt;
visibility:visible;mso-wrap-style:square"><v:imagedata src="file:///C:/Users/ZHAOBI~1/AppData/Local/Temp/msohtmlclip1/01/clip_image014.png" o:title=""></v:imagedata></v:shape>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锻拘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子击蹲,更是在濱河造成了極大的恐慌署拟,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歌豺,死亡現(xiàn)場離奇詭異推穷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)类咧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進(jìn)店門馒铃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蟹腾,“玉大人,你說我怎么就攤上這事区宇⊥拗常” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵议谷,是天一觀的道長炉爆。 經(jīng)常有香客問我,道長卧晓,這世上最難降的妖魔是什么芬首? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮禀崖,結(jié)果婚禮上衩辟,老公的妹妹穿的比我還像新娘。我一直安慰自己波附,他們只是感情好艺晴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掸屡,像睡著了一般封寞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仅财,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天狈究,我揣著相機(jī)與錄音,去河邊找鬼盏求。 笑死抖锥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的碎罚。 我是一名探鬼主播磅废,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼荆烈!你這毒婦竟也來了拯勉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤憔购,失蹤者是張志新(化名)和其女友劉穎宫峦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玫鸟,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡导绷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屎飘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诵次。...
    茶點(diǎn)故事閱讀 38,789評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡账蓉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逾一,到底是詐尸還是另有隱情铸本,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布遵堵,位于F島的核電站箱玷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陌宿。R本人自食惡果不足惜锡足,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壳坪。 院中可真熱鬧舶得,春花似錦、人聲如沸爽蝴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蝎亚。三九已至九孩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間发框,已是汗流浹背躺彬。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梅惯,地道東北人宪拥。 一個(gè)月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像铣减,于是被迫代替她去往敵國和親她君。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評論 2 351