天天看點

用SSD訓練自己的資料集(VOC2007格式)

用SSD訓練自己的資料集(VOC2007格式)

一. 配置caffe環境

ubunt16.04下caffe環境安裝

二. 下載下傳,編譯及測試ssd源碼

(一)下載下傳源碼

github連結

或者執行 git clone https://github.com/weiliu89/caffe.git

(二)編譯源碼

編譯過程中可能會出現缺失一些python子產品,按提示安裝

(1)修改Markfile配置

參考ubunt16.04下caffe環境安裝

中修改Makefile.config

(2)編譯python接口

make -j8  多核編譯,時間較長
make pycaffe
           

(3)下載下傳訓練好的模型

下載下傳連結原始連結可能需要翻牆,可自行找其他連結下載下傳,檔案名為models_VGGNet_VOC0712_SSD_300x300.tar.gz,解壓至CAFFE_ROOT/目錄下

(4) 下載下傳VOC2007資料

cd $CAFFE_ROOT/data
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
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
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
           

(5) 産生LMDB格式資料集檔案

在data/VOC0712/中生成trainval.txt, test.txt, and test_name_size.txt in

可以通過修改create_list.sh和create_data.sh來針對自己的資料集産生LMDB檔案

cd $CAFFE_ROOT
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
           

産生的trainval和test資料位于CAFFE_ROOT/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb和CAFFE_ROOT/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb

(三)測試源碼

score_ssd_pascal.py裡面的test_image_num應該是4952的,源程式有報相關錯誤可以改一下

cd $CAFFE_ROOT
python examples/ssd/score_ssd_pascal.py
           

應該會得到0.77*左右的MAP score,說明模型可以正常運作

三. 使用SSD訓練自己的資料集

(一)下載下傳預訓練參數及模型

下載下傳連結

(二)制作資料集

制作自己的圖檔資料集(VOC2007格式)

将制作好的VOC2007檔案夾放置在data/VOCdevkit檔案夾下,沒有則建立VOCdevkit檔案夾

(三)修改配置檔案

(1)修改$CAFFE_ROOT/data/$dataset_name/下create_list.sh和create_data.sh兩個檔案

create_list.sh:

root_dir=$HOME/data/VOCdevkit/
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
for dataset in trainval test
do
dst_file=$bash_dir/$dataset.txt
if [ -f $dst_file ]
then
    rm -f $dst_file
fi
for name in VOC2007 VOC2012  # 資料集檔案夾名稱$dataset_name
           

create_data.sh,其中資料集檔案夾名稱$dataset_name,這個檔案夾是指存放create_list.sh和create_data.sh兩個檔案及labelmap檔案的地方的檔案夾名,建議和VCOdevkit下面的資料集名稱一緻

data_root_dir="$HOME/data/VOCdevkit" # 為了避免錯誤可以用絕對路徑
dataset_name="VOC0712"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
           

(2)修改$CAFFE_ROOT/data/$dataset_name/下labelmap_voc.prototxt

name: "cat" # xml檔案中的類别名
label: 1
display_name: "Cat" # 檢測時顯示的類别名
           

(3)修改訓練檔案$CAFFE_ROOT/data/example/ssd/ssd_pascal.py

  1. 改了資料集檔案夾名稱的話講程式路徑裡面的VOC0712都替換為你的資料集名稱$dataset_name,否則不需要修改,為了不要覆寫原來的模型建議修改資料集名稱
  2. 類别數:num_classes = open(label_map_file).read().count(‘label’)
  3. 測試圖檔數量:num_test_image = len(open(name_size_file).readlines())

(4)$CAFFE_ROOT/example/ssd/ssd_pascal.py參數設定

  1. solver_param 中’max_iter’: 120000, 表示最大疊代次數
  2. solver_param 中’test_interval’: 10000, 每次評估模型效果的間隔疊代次數,用于觀察是否收斂及過拟合
  3. 其他參數可酌情修改

(四)開始訓練

cd $CAFFE_ROOT
python example/ssd/ssd_pascal.py
           

成功訓練後在ssd_pascal.py檔案中的job_dir路徑下生成日志檔案,snapshot_dir路徑下存有斷點模型,訓練中斷後會從最大疊代次數繼續訓練,

(五)測試訓練結果

(1)修改example/ssd/score_ssd_pascal.py檔案

修改方式與ssd_pascal.py相同,其中在det_eval_param添加’show_per_class_result’: True參數可現實每個類别的AP(average precision)

(2)進行測試

cd $CAFFE_ROOT
python example/ssd/score_ssd_pascal.py
           

四. 曾出現過的bug

(1) 原檔案中num_classes和num_test_image經常變動的話容易忘記修改而報錯,可通過讀取labelmap和testfile自動得到相應數值

(2) 修改test_batch_size似乎不影響測試速度

繼續閱讀