深度學(xué)習(xí)框架之caffe(一) —編譯安裝

摘要:本系列文章主要講解caffe的整個(gè)使用流程薪前,適合初級(jí)入門(mén)caffe奏篙,通過(guò)學(xué)習(xí)本篇文章柴淘,理清項(xiàng)目訓(xùn)練、測(cè)試流程。初級(jí)教程为严,高手請(qǐng)繞道敛熬。

目錄
深度學(xué)習(xí)框架之caffe(一) —編譯安裝
深度學(xué)習(xí)框架之caffe(二) —模型訓(xùn)練和使用
深度學(xué)習(xí)框架之caffe(三) —通過(guò)NetSpec自定義網(wǎng)絡(luò)
深度學(xué)習(xí)框架之caffe(四) —可視化與參數(shù)提取
深度學(xué)習(xí)框架之caffe(五) —模型轉(zhuǎn)換至其他框架

caffe 主要特點(diǎn)

與其他框架的性能對(duì)比

caffe使用

以u(píng)buntu16操作系統(tǒng)為例,windows等操作系統(tǒng)上的使用自行閱讀

文檔

官方文檔
[windows 下配置] (http://blog.csdn.net/happynear/article/details/45372231)

下載源碼

  1. 最原始版本:伯克利BVLC版【2月內(nèi)有更新】
  2. for windows: 基礎(chǔ)版, happynear【1月內(nèi)有更新】
  3. 其他:賈楊清自己的版本【近3年沒(méi)有維護(hù)】
  4. 最新版本:caffe2【一周內(nèi)有更新】

編譯

此后如無(wú)特殊聲明第股,默認(rèn)使用ubuntu16系統(tǒng)+BVLC版caffe源碼荸型,以CAFFE_ROOT表示caffe根目錄

下載源碼

打開(kāi)BVLC版github項(xiàng)目主頁(yè),可使用下載或 git clone 將源碼下載本地炸茧,推薦使用后者,這樣如果后期你對(duì)caffe源碼進(jìn)行了較好的修改稿静,可在修改過(guò)程中進(jìn)行版本管理梭冠,甚至可以使用git merge request 向源碼維護(hù)者發(fā)出請(qǐng)求,將你所做的改進(jìn)合并到源碼中改备,便于大家對(duì)開(kāi)源代碼的共同維護(hù)和升級(jí)控漠。git clone 命令如下:

git clone https://github.com/BVLC/caffe.git

安裝依賴(lài)庫(kù)

caffe需要很多依賴(lài)庫(kù):詳細(xì)參見(jiàn)官方安裝說(shuō)明文檔
cuda: gpu模式必須
BLAS: 科學(xué)計(jì)算工具,可使用ATLAS, MKL或OpenBLAS
Boost:
protobuf, glog, gflags,hdf5等
其他可選: opencv, lmdb, leveldb, cudnn
python接口及其依賴(lài)庫(kù):python2.7 或python3.3+悬钳, numpy盐捷,boost.python
matlab接口: MATLAB環(huán)境及mex編譯器

依賴(lài)庫(kù)安裝步驟如下:

$ sudo apt-get update 
$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev  \
libopencv-dev  libhdf5-serial-dev  protobuf-compiler
$ sudo apt-get install --no-install-recommends libboost-all-dev
$ sudo apt-get install libatlas-base-dev

編譯源碼

  1. caffe默認(rèn)編譯方式(Makefile.config)
    Caffe 開(kāi)發(fā)者提供了比較簡(jiǎn)單的編譯方式,使得用戶(hù)即使不清楚通用的編譯方式默勾,也能很快地完成對(duì)源碼的編譯碉渡,只需用戶(hù)根據(jù)本機(jī)軟硬件的環(huán)境,通過(guò)修改Makefile.config文件母剥,對(duì)編譯環(huán)境進(jìn)行簡(jiǎn)單的配置即可滞诺。
    注:初次使用源碼時(shí),根目錄下提供了一個(gè)配置樣例文件(Makefile.config.example)环疼,用戶(hù)需要進(jìn)行一次文件拷貝才能產(chǎn)生Makefile.config文件习霹,其部分內(nèi)容如下,用戶(hù)可根據(jù)本機(jī)環(huán)境進(jìn)行適當(dāng)?shù)男薷模?/li>
## Refer to http://caffe.berkeleyvision.org/installation.html
# Contributions simplifying and improving our build system are welcome!

# cuDNN acceleration switch (uncomment to build with cuDNN).
# USE_CUDNN := 1(caffe默認(rèn)不使用cuda的cudnn模塊炫隶,需要手動(dòng)開(kāi)啟)

# CPU-only switch (uncomment to build without GPU support).
# CPU_ONLY := 1(默認(rèn)gpu模式淋叶,無(wú)gpu時(shí)開(kāi)啟)

# uncomment to disable IO dependencies and corresponding data layers
# USE_OPENCV := 0
# USE_LEVELDB := 0
# USE_LMDB := 0

# uncomment to allow MDB_NOLOCK when reading LMDB files (only if necessary)
#   You should not set this flag if you will be reading LMDBs with any
#   possibility of simultaneous read and write
# ALLOW_LMDB_NOLOCK := 1

# Uncomment if you're using OpenCV 3
 OPENCV_VERSION := 3 #(采用opencv3)

# To customize your choice of compiler, uncomment and set the following.
# N.B. the default for Linux is g++ and the default for OSX is clang++
# CUSTOM_CXX := g++

# CUDA directory contains bin/ and lib/ directories that we need.
CUDA_DIR := /usr/local/cuda # cuda目錄
# On Ubuntu 14.04, if cuda tools are installed via
# "sudo apt-get install nvidia-cuda-toolkit" then use this instead:
# CUDA_DIR := /usr


具體的編譯過(guò)程如下:

cd $CAFFE_ROOT
cp Makefile.config.example Makefile.config
# 根據(jù)本機(jī)環(huán)境修改 Makefile.config 
make all -j8
make test -j8
make runtest
  1. cmake 通用編譯方式
    大部分有開(kāi)發(fā)經(jīng)驗(yàn)的用戶(hù),都會(huì)對(duì)cmake編譯方式有一定的了解伪阶,caffe也支持cmake的編譯方式煞檩,該方式下,配置環(huán)境的設(shè)置可利用圖形化工具cmake-gui進(jìn)行相關(guān)參數(shù)(參數(shù)命名與Makefile.config中的命名基本一致)的配置望门,cmake經(jīng)驗(yàn)豐富的形娇,可直接修改根目錄下的CMakeLists.txt文件,部分內(nèi)容如下:
cmake_minimum_required(VERSION 2.8.7)
if(POLICY CMP0046)
  cmake_policy(SET CMP0046 NEW)
endif()
if(POLICY CMP0054)
  cmake_policy(SET CMP0054 NEW)
endif()

# ---[ Caffe project
project(Caffe C CXX)

# ---[ Caffe version【caffe版本號(hào)】
set(CAFFE_TARGET_VERSION "1.0.0" CACHE STRING "Caffe logical version")
set(CAFFE_TARGET_SOVERSION "1.0.0" CACHE STRING "Caffe soname version")
add_definitions(-DCAFFE_VERSION=${CAFFE_TARGET_VERSION})

# ---[ Using cmake scripts and modules
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules)

include(ExternalProject)
include(GNUInstallDirs)

include(cmake/Utils.cmake)
include(cmake/Targets.cmake)
include(cmake/Misc.cmake)
include(cmake/Summary.cmake)
include(cmake/ConfigGen.cmake)

# ---[ Options 【參數(shù)配置筹误,與Makefile.config類(lèi)似】
caffe_option(CPU_ONLY  "Build Caffe without CUDA support" OFF) # TODO: rename to USE_CUDA
caffe_option(USE_CUDNN "Build Caffe with cuDNN library support" ON IF NOT CPU_ONLY)
caffe_option(USE_NCCL "Build Caffe with NCCL library support" OFF)
caffe_option(BUILD_SHARED_LIBS "Build shared libraries" ON)
caffe_option(BUILD_python "Build Python wrapper" ON)
set(python_version "2" CACHE STRING "Specify which Python version to use")
caffe_option(BUILD_matlab "Build Matlab wrapper" OFF IF UNIX OR APPLE)
caffe_option(BUILD_docs   "Build documentation" ON IF UNIX OR APPLE)
caffe_option(BUILD_python_layer "Build the Caffe Python layer" ON)
caffe_option(USE_OPENCV "Build with OpenCV support" ON)
caffe_option(USE_LEVELDB "Build with levelDB" ON)
caffe_option(USE_LMDB "Build with lmdb" ON)
caffe_option(ALLOW_LMDB_NOLOCK "Allow MDB_NOLOCK when reading LMDB files (only if necessary)" OFF)
caffe_option(USE_OPENMP "Link with OpenMP (when your BLAS wants OpenMP and you get linker errors)" OFF)

# ---[ Dependencies
include(cmake/Dependencies.cmake)

具體編譯步驟:

cd $CAFFE_ROOT
mkdir build
cd build
# 編譯
cmake .. # 按默認(rèn)配置編譯
# or 設(shè)置部分參數(shù)
cmake -DCMAKE_BUILD_TYPE=Release \
    -DBUILD_python=OFF \
    -DBUILD_python_layer=OFF \
    -DCMAKE_INSTALL_PREFIX=/usr/local \
   ..

# note:編譯工程桐早,可有需求地執(zhí)行
make all -j8       # 編譯所有
make caffe -j8     # 只編譯caffe的C++庫(kù),生成libcaffe.so
make pycaffe -j8 #編譯python接口
  1. 編譯結(jié)果
    編譯成功后,在build目錄下可以看到如下圖所示的子目錄結(jié)構(gòu):


    image.png
    • lib 靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)目錄哄酝,存放libcaffeproto.a libcaffe.so libcaffe.so.1.0.0等庫(kù)文件
    • tools 可執(zhí)行程序友存,包括訓(xùn)練,計(jì)算均值陶衅,提取特征屡立,數(shù)據(jù)轉(zhuǎn)換等可執(zhí)行程序
    • examples 部分使用樣例程序

踩過(guò)的坑

編譯caffe源碼失敗的主要原因在于操作系統(tǒng)在不同的版本下某些庫(kù)的路徑會(huì)發(fā)生一定的變動(dòng)。最初的caffe 源碼中提供的Makefile.config.example是支持ubuntu12-14系統(tǒng)的搀军,因此Makefile.config中對(duì)依賴(lài)庫(kù)的路徑設(shè)置(主要是python頭文件和hdf5)都是在ubuntu12-14系統(tǒng)可行膨俐,而對(duì)于ubuntu16,python的包含目錄和apt源提供的hdf5庫(kù)有一定的改動(dòng)罩句,直接采用原來(lái)的Makefile.config編譯會(huì)報(bào)錯(cuò)焚刺,需要進(jìn)行相應(yīng)的路徑修改。但最新版本的caffe源碼已經(jīng)能夠支持ubuntu16门烂,仍需根據(jù)實(shí)際的ubuntu版本進(jìn)行相應(yīng)的修改乳愉。

  1. caffe.pb.h丟失問(wèn)題:
    /home/ubuntu/caffe/include/caffe/blob.hpp:9:34: fatal error: caffe/proto/caffe.pb.h: No such file or directory
    問(wèn)題分析: caffe使用protobuf進(jìn)行數(shù)據(jù)傳輸(類(lèi)似json數(shù)據(jù)格式),用戶(hù)通過(guò)編輯 .proto文件確定數(shù)據(jù)協(xié)議屯远,數(shù)據(jù)結(jié)構(gòu)中存在哪些數(shù)據(jù)蔓姚,數(shù)據(jù)類(lèi)型是怎么樣的,給C++調(diào)用時(shí)慨丐,需通過(guò)protoc命令將改文件轉(zhuǎn)換成c++所需的頭文件(.pb.h)坡脐,caffe下.proto文件在src/caffe/proto/caffe.proto
    解決方法: 用protoc從caffe/src/caffe/proto/caffe.proto生成caffe.pb.h和caffe.pb.cc
cd CAFFE_ROOT
protoc ./src/caffe/proto/caffe.proto  --cpp_out=./include/caffe/
  1. ubuntu16下 python路徑引起的問(wèn)題:
    fatal error: numpy/arrayobject.h沒(méi)有那個(gè)文件或目錄
    問(wèn)題分析: caffe的python接口需要python.h 和numpy支持,需要添加兩種頭文件的路徑(Makefile.config Line66-67)
    ubuntu14下自帶的python頭文件在/usr/include/python2.7(python3.4)下房揭,通過(guò)pip install numpy 命令安裝的numpy頭文件在/usr/local/lib/python2.7/dist-packages/numpy/core/include挨措,Makefile.config中默認(rèn)按該路徑添加相關(guān)頭文件路徑
    而ubuntu16下通過(guò)pip安裝的python的numpy庫(kù)頭文件在/usr/lib/python2.7/dist-packages/numpy/core/include,若不修改崩溪,頭文件路徑引用錯(cuò)誤浅役,依舊找不到相關(guān)頭文件,因此報(bào)錯(cuò)伶唯。
    解決方法: 修改為正確的python頭文件目錄觉既。若不熟悉ubuntu路徑,可先通過(guò)find命令找到這兩個(gè)頭文件所在的路徑(約Line66-67):
sudo find / -name Python.h
sudo find / -name arrayobject.h

然后在Makefile.config 中修改為正確的路徑:

PYTHON_INCLUDE := /usr/include/python2.7 \
              /usr/lib/python2.7/dist-packages/numpy/core/include
  1. ubuntu16下HDF5安裝路徑引起的問(wèn)題:
    “fatal error: hdf5.h: 沒(méi)有那個(gè)文件或目錄”
    問(wèn)題分析: 首先確定是否正確安裝hdf5庫(kù)乳幸,防患未然瞪讼,執(zhí)行命令sudo apt-get install libhdf5-serial-dev安裝hdf5,若提示已經(jīng)安裝粹断,則有可能是hdf5庫(kù)版本不同(有l(wèi)ibhdf5-dev和libhdf5-serial-dev兩種) hdf5-serial, 的頭文件路徑是/usr/include/hdf5/serial/符欠,庫(kù)文件名是hdf5_serial, 因此需要對(duì)Makefile.config進(jìn)行相應(yīng)的修改,將以下兩行(約Line 94-95):
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib

改成:

INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib \
/usr/lib/x86_64-linux-gnu/hdf5/serial

即在末尾添加hdf5頭文件和庫(kù)文件名瓶埋,每臺(tái)計(jì)算機(jī)的默認(rèn)安裝路徑也可能不完全相同希柿,可根據(jù)具體情況添加诊沪。

  1. ubuntu16下python3.5路徑引起的問(wèn)題:
    忘了,找到時(shí)再更新
  2. 使用anaconda python接口時(shí)anaconda自帶的protobuf引起的問(wèn)題:
    通過(guò) sudo apt install libprotobuf-dev安裝的protobuf版本一般相對(duì)較低曾撤,而anaconda自帶的也有protobuf端姚,所以在用anaconda中的python編譯pycaffe的過(guò)程中,解決問(wèn)題1時(shí)可能因?yàn)閮蓚€(gè)protobuf
  3. python下import caffe 出現(xiàn)的問(wèn)題:
    ImportError: libcublas.so.8.0: cannot open shared object file: No such file or directory
    GPU版的_caffe.so 依賴(lài)libcublas.so.8.0庫(kù)文件(so文件相當(dāng)于Windows下的dll文件)挤悉,ubuntu系統(tǒng)對(duì)依賴(lài)庫(kù)文件的搜索路徑是/usr/lib和環(huán)境變量$LD_LIBRARY_PATH渐裸,cuda安裝默認(rèn)路徑是/usr/local, 安裝完成后需進(jìn)行環(huán)境變量的配置装悲,以便其他依賴(lài)cuda的應(yīng)用能夠正常訪(fǎng)問(wèn)共享庫(kù)文件(環(huán)境變量的配置詳細(xì)參考帖子):
export PATH=/usr/local/cuda-8.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

ImportError: No module named google.protobuf.internal
未安裝python下的protobuf庫(kù)昏鹃。caffe依賴(lài)protobuf,python接口下調(diào)用caffe也需要protobuf第三方庫(kù)诀诊。安裝命令為:sudo pip install protobuf

注意事項(xiàng)

熟悉編譯原理和可執(zhí)行程序依賴(lài)庫(kù)調(diào)用的人盆顾,可以不局限于本文提供的流程和方式,比如畏梆,

  • 將caffe編譯后的目錄添加到環(huán)境變量中,以供所有程序默認(rèn)可訪(fǎng)問(wèn):
# 讓C++等程序默認(rèn)可訪(fǎng)問(wèn)
export LD_LIBRARY_PATH=$CAFFE_ROOT/build/lib:LD_LIBRARY_PATH
# 讓python默認(rèn)訪(fǎng)問(wèn)
export PYTHONPATH=$CAFFE_ROOT/python:PYTHONPATH
# 可在任意目錄下執(zhí)行caffe訓(xùn)練命令
export PATH=$CAFFE_ROOT/build/tools:$PATH
  • 同一臺(tái)主機(jī)上多個(gè)caffe庫(kù)共存
    caffe默認(rèn)編譯目錄是build奈懒,生成一些so文件(動(dòng)態(tài)依賴(lài)庫(kù)奠涌,類(lèi)似Windows下的dll)。反復(fù)執(zhí)行make all/pycaffe 時(shí)會(huì)覆蓋上一次的編譯結(jié)果磷杏。當(dāng)python2和python3的接口都需要溜畅,或者同時(shí)需要cpu和gpu兩個(gè)版本時(shí),可以將第一次配置下生成的相關(guān)文件(build/lib下的so文件极祸,build/tools下的可執(zhí)行程序慈格,python/caffe目錄)拷貝到其他路徑,這樣修改配置參數(shù)后遥金,可編譯生成另一種配置下的caffe庫(kù)浴捆,同時(shí)可進(jìn)一步講這些生成文件拷貝到一個(gè)新的路徑下,或者添加到環(huán)境變量稿械。如我的計(jì)算機(jī)可以有不同功用选泻,版本的caffe庫(kù):
    /home/ubuntu/caffe_py2 (python2接口庫(kù))
    /home/ubuntu/caffe_py3 (python3 接口庫(kù))
    /home/ubuntu/caffe_fastrcnn_py2(python2下支持faster rcnn的 caffe庫(kù))
    有了這些不同版本,不同配置的caffe庫(kù)美莫,即使把CAFFE_ROOT下的源碼刪除页眯,也一樣能調(diào)用caffe相關(guān)庫(kù)和命令

注: 采用cmake編譯方式時(shí)也可直接通過(guò)參數(shù)-D-DCMAKE_INSTALL_PREFIX=path_to_install設(shè)置caffe的安裝路徑

  • 基于caffe的項(xiàng)目程序發(fā)布時(shí)對(duì)依賴(lài)庫(kù)的整理
    通過(guò)命令ldd libcaffe.so 可查看caffe的依賴(lài)庫(kù),如下圖(圖中所列依賴(lài)庫(kù)不完整厢呵,僅截取部分)窝撵,
    image.png

當(dāng)基于caffe的項(xiàng)目編譯成可執(zhí)行程序,并拷貝到其他電腦上時(shí)襟铭,只需將caffe的依賴(lài)庫(kù)文件拷貝過(guò)去碌奉,同時(shí)將庫(kù)文件所在的目錄添加到環(huán)境變量$LD_LIBRARY_PATH中即可運(yùn)行短曾,而無(wú)需在目標(biāo)主機(jī)上執(zhí)行一遍編譯過(guò)程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末道批,一起剝皮案震驚了整個(gè)濱河市错英,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隆豹,老刑警劉巖椭岩,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異璃赡,居然都是意外死亡判哥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)碉考,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)塌计,“玉大人,你說(shuō)我怎么就攤上這事侯谁⌒拷觯” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵墙贱,是天一觀的道長(zhǎng)热芹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)惨撇,這世上最難降的妖魔是什么伊脓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮魁衙,結(jié)果婚禮上报腔,老公的妹妹穿的比我還像新娘。我一直安慰自己剖淀,他們只是感情好纯蛾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著纵隔,像睡著了一般茅撞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上巨朦,一...
    開(kāi)封第一講書(shū)人閱讀 51,301評(píng)論 1 301
  • 那天米丘,我揣著相機(jī)與錄音,去河邊找鬼糊啡。 笑死拄查,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的棚蓄。 我是一名探鬼主播堕扶,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碍脏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了稍算?” 一聲冷哼從身側(cè)響起典尾,我...
    開(kāi)封第一講書(shū)人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糊探,沒(méi)想到半個(gè)月后钾埂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡科平,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年褥紫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞪慧。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡髓考,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出弃酌,到底是詐尸還是另有隱情氨菇,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布妓湘,位于F島的核電站查蓉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏多柑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一楣责、第九天 我趴在偏房一處隱蔽的房頂上張望竣灌。 院中可真熱鬧,春花似錦秆麸、人聲如沸初嘹。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屯烦。三九已至,卻和暖如春房铭,著一層夾襖步出監(jiān)牢的瞬間驻龟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工缸匪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翁狐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓凌蔬,卻偏偏與公主長(zhǎng)得像露懒,于是被迫代替她去往敵國(guó)和親闯冷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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