用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
- 改了資料集檔案夾名稱的話講程式路徑裡面的VOC0712都替換為你的資料集名稱$dataset_name,否則不需要修改,為了不要覆寫原來的模型建議修改資料集名稱
- 類别數:num_classes = open(label_map_file).read().count(‘label’)
- 測試圖檔數量:num_test_image = len(open(name_size_file).readlines())
(4)$CAFFE_ROOT/example/ssd/ssd_pascal.py參數設定
- solver_param 中’max_iter’: 120000, 表示最大疊代次數
- solver_param 中’test_interval’: 10000, 每次評估模型效果的間隔疊代次數,用于觀察是否收斂及過拟合
- 其他參數可酌情修改
(四)開始訓練
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似乎不影響測試速度