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

NO IMAGE

用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似乎不影響測試速度