1. 程式人生 > >caffe深度學習【九】目標檢測 yolo v1的caffe實現 基於VOC2007資料集

caffe深度學習【九】目標檢測 yolo v1的caffe實現 基於VOC2007資料集

        YOLO v1演算法原文的作者是在darknet框架下實現的, 原文作者的實現    ,這裡主要講的是caffe版本的YOLO實現,主要採用yeahkun寫的:點選開啟連結  其實只是步驟相對來說有點繁瑣,但是要跑通並不困難:

大致步驟包括:

1、編譯caffe-yolo 

2、下載VOC2007資料集

3、生成list檔案

4、生成LMDB檔案

5、訓練

6、測試

下面是每一步的具體操作:

1、編譯caffe-yolo

先從github上把 caffe-yolo 的程式碼下下來,連結在這裡    

重新編譯caffe,有同學會覺得,自己明明已經配好了caffe,為什麼meic每次跑其他網路或演算法時都要重新編譯呢?

原因:這些新網路或演算法的作者自己新定義了一些內容,比如新的layer,所以需要重新將這些原始檔編譯一下,否則就不能使用這個新的演算法。

下載下來的檔名叫 caffe-yolo-master

首先把 caffe-yolo-master 目錄下的 Makefile.config.example 複製一份並改名為 Makefile.config

(這一步跟之前配置普通版本的caffe是一模一樣的,相信配過caffe的都很熟悉)

在命令列輸入:

cd caffe-yolo-master
cp Makefile.config.example Makefile.config

然後修改 Makefile.config 

檔案,把裡面的這兩行:

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/

然後在終端輸入:

make clean
make all
make pycaffe

3步分開輸入,不要同時輸入,就會完成caffe的編譯,如果有錯誤,可以參考我之前的部落格進行解決,關於caffe編譯出現的各種坑。

2、下載VOC2007資料集

當前是在caffe-yolo-master 目錄下,先cd進入到/data/yolo目錄下:

cd ./data/yolo

然後從github上下載VOC2007的資料集:

終端輸入:

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar

下載好的資料集如下:

3、生成list檔案

在 /data/yolo 目錄下有一個 get_list.py 的檔案,通過它可以生成包含所有圖片的標籤的list

本案例只用到VOC2007,所以對 get_list.py 的  for name in ["VOC2007", "VOC2012"]:

刪除   "VOC2012"

只留下  "VOC2007"

如下圖:

原來:

變成:

然後到程式碼的最後面,因此這裡不需要生成2012的test的list,所以如圖所示,把這一段都註釋掉:

儲存退出

執行:

python get_list.py

就會在/data/yolo/目錄下生成兩個list:

trainval.txt是訓練和驗證集

test_2007是測試集

4、生成LMDB檔案

同樣是在 /data/yolo 目錄下有一個 convert.sh 的檔案,通過它可以生成包含資料的lmdb檔案格式。

這裡有很多路徑需要修改

沒修改之前的檔案如下:

ROOT_DIR改成你的VOC圖片的根目錄,比如我的圖片路徑是 /home/lincanran/caffe-yolo-master/data/yolo,那麼這個地方就是:

ROOT_DIR=/home/lincanran/caffe-yolo-master/data/yolo/

LMDB_DIR生成的lmdb想要存放的地方lmdb這個資料夾需要我們提前先建立好,不然執行會報錯。

下面分2步進行:

(1)生成訓練驗證集的lmdb

生成訓練驗證集時,就不用改

直接執行:(要在/data/yolo 目錄下)

sh convert.sh

會生成:

(2)生成測試集的lmdb

將原來的訓練驗證集部分註釋掉,取消註釋下面測試集的部分

也就是原來的:

# 2007 + 2012 trainval
LIST_FILE=$CAFFE_ROOT/data/yolo/trainval.txt
LMDB_DIR=./lmdb/trainval_lmdb
SHUFFLE=true

# 2007 test
# LIST_FILE=$CAFFE_ROOT/data/yolo/test_2007.txt
# LMDB_DIR=./lmdb/test2007_lmdb
# SHUFFLE=false

現在改成:

# 2007 + 2012 trainval
#LIST_FILE=$CAFFE_ROOT/data/yolo/trainval.txt
#LMDB_DIR=./lmdb/trainval_lmdb
#SHUFFLE=true


# 2007 test
LIST_FILE=$CAFFE_ROOT/data/yolo/test_2007.txt
LMDB_DIR=./lmdb/test2007_lmdb
SHUFFLE=false

改完之後,同樣直接執行:

sh convert.sh

會生成:

5、訓練

首先我們用別人預訓練好的GoogLeNet模型,從連結:點選開啟連結  處下載,點選readme.md裡面的那個caffemodel_url的連結進行下載,名字是bvlc_googlenet.caffemodel

caffe-yolo 的prototxt檔案都放在了/examples/yolo目錄下

先進入到該目錄:

cd home/yourpath/caffe-yolo-master/examples/yolo

主要是要修改下面3個檔案:

修改其中的solver的路徑、網路結構的路徑,lmdb資料存放的路徑等等

(1)gnet_train.prototxt

這裡路徑改成剛剛第4步生成的2個lmdb的路徑

batch_size根據你自己的實際情況去修改

(2)gnet_solver.prototxt

這裡基本不用怎麼修改

max_iter是要迭代的最大次數

snapshot_prefix是訓練好的caffemodel儲存的地址,你需要先建立好資料夾

solver_mode是指定GPU或者CPU訓練

(3)train.sh

1是填寫你的solver.prototxt檔案,即上面(2)gnet_solver.prototxt

2是初始化引數權重,因為我們用預訓練好的模型,所以這裡填 ./bvlc_googlenet.caffemodel

3是已經編譯好的caffe-yolo-master目錄下的caffe可執行檔案的地址(注意:不要用你自己之前安裝的caffe,要用剛剛第一步編譯好的caffe-yolo版本)

4是指定訓練使用的GPU,這裡我用了2,3兩塊

儲存退出

全部修改完成後,

在終端執行:

sh train.sh

訓練開始,如下圖所示:

6、測試

測試和平時的caffe差不多,直接sh test.sh就行,但需要先修改好 test.shgnet_test.prototxt 這兩個檔案裡的路徑。

(1)gnet_test.prototxt

這裡路徑改成剛剛第4步生成的測試集的lmdb的路徑

batch_size根據需要去修改

(2)test.sh

PROTO是上面的(1)gnet_test.prototxt

MODEL是第5步訓練得到的caffemodel模型(注意,這裡是用VOC訓練集訓練得到的caffemodel,不要用下載的bvlc_googlenet.caffemodel,下載的這個只是預訓練用的而已)

ITER是測試迭代的次數,和(1)gnet_test.prototxt中的batch_size相乘,就是總測試集圖片的數量

GPU_ID是指定測試時所用的GPU

下面記得要換成 test_detection,而不是訓練時候的train了

其他都差不多

全部修改完成後,

在終端執行:

sh test.sh

測試開始!!

整個基於VOC2007資料集的yolo v1的caffe實現就基本完成了!