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.sh 和 gnet_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實現就基本完成了!