前面兩篇文章講了用SSD檢測框架訓練自己的數據集,這篇補充一下SSD的安裝。github鏈接:https://github.com/weiliu89/caffe/tree/ssd
SSD是16年ECCV一篇深度學習目標檢測的文章,詳細知識可以百度或者谷歌,本文我們介紹如何實現。本文默認各位的機子已安裝好opencv, 配置編譯過cpu版本的caffe(沒有也沒關系,下面我會講下).
1. 在home目錄下(也可以其他目錄,當然其他目錄后面就要修改路徑,比較麻煩),獲取SSD的代碼,下載完成后有一個caffe文件夾.(由於本人之前已安裝caffe,為避免文件名沖突,所以新建一個名為caffessd的文件夾,並將此次下載的‘ssd版本’的caffe放在caffessd文件夾下了。)
mkdir caffessd
cd caffessd
git clonehttps://github.com/weiliu89/caffe.git #the name of the file you downloaded is "caffe".
cd caffe
gitcheckout ssd
2. 修改caffe的配置文件.
將已經配置過的cpu版本caffe中的Makefile.config復制到剛才下載的caffe目錄。如果你沒有配置過cpu版本的caffe,可以參考這篇博文. Ubuntu16.04+caffe的安裝和Py-faster-rcnn在CPU電腦的安裝-2. http://blog.csdn.net/jx232515/article/details/72384465.下面我直接把Makefile.config需要修改的部分貼在下面了.可以照着修改也行.
去掉注釋CPU_ONLY:=1
因為使用CPU,所以要注釋掉CUDA有關的行:
#CUDA_DIR := /usr/local/cuda
#CUDA_ARCH := -gencodearch=compute_20,code=sm_20 \
# -gencode arch=compute_20,code=sm_21\
# -gencode arch=compute_30,code=sm_30 \
# -gencode arch=compute_35,code=sm_35 \
# -gencode arch=compute_50,code=sm_50 \
# -gencode arch=compute_50,code=compute_50
去掉注釋WITH_PYTHON_LAYER:= 1
INCLUDE_DIRS := $(PYTHON_INCLUDE)/usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB)/usr/local/lib /usr/lib /usr/lib/i386-linux-gnu/hdf5/serial/usr/lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu/hdf5/serial
#TEST_GPUID:= 0
3.編譯caffe
make -j8
# Make sure to include $CAFFE_ROOT/pythonto your PYTHONPATH.
make py
make test -j8
# (Optional)
make runtest -j8
4.下載VGG-ILSVRC-16-layers-fc-reduced.caffemodel預訓練模型( https://drive.google.com/uc?id=0BzKzrI_SkD1_WVVTSmQxU0dVRzA&export=downloadhttps://pan.baidu.com/s/1o8A7DZs),將它放入caffe/models/VGGNet/目錄下,這樣可以直接使用這個模型跑ssd.
5.下載VOC2007和VOC2012數據集,放到/home/data下。(請注意,這里改變了目錄)
cd $HOME/data
wgethttp://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
wgethttp://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wgethttp://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
# Extract the data.
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar-xvf VOCtest_06-Nov-2007.tar
6.將voc2007數據集轉換格式,用於模型的訓練.
首先進入caffe目錄,可以看到/data/VOC0712/有create_list.sh,create_data.sh .運行就可以轉換數據格式,用於模型訓練.
此處注意create_list.sh和create_data.sh中路徑的修改,修改為自己的路徑,要不會出錯.
(1)本人的create_list.sh修改如下:
#!/bin/bash
root_dir=$HOME/data/zyt/
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 zyt # VOC2012
do
if [[ $dataset == "test" && $name == "VOC2012" ]]
then
continue
fi
echo "Create list for $name $dataset..."
dataset_file=$root_dir/$name/$sub_dir/$dataset.txt
img_file=$bash_dir/$dataset"_img.txt"
cp $dataset_file $img_file
sed -i "s/^/$name\/JPEGImages\//g" $img_file
sed -i "s/$/.jpg/g" $img_file
label_file=$bash_dir/$dataset"_label.txt"
cp $dataset_file $label_file
sed -i "s/^/$name\/Annotations\//g" $label_file
sed -i "s/$/.xml/g" $label_file
paste -d' ' $img_file $label_file >> $dst_file
rm -f $label_file
rm -f $img_file
done
# Generate image name and size infomation.
if [ $dataset == "test" ]
then
$bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
fi
# Shuffle trainval file.
if [ $dataset == "trainval" ]
then
rand_file=$dst_file.random
cat $dst_file | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' > $rand_file
mv $rand_file $dst_file
fi
done
(2)create_data.sh修改如下:
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..
cd $root_dir
redo=1
data_root_dir="$HOME/data/zyt"
dataset_name="zyt"
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
anno_type="detection"
db="lmdb"
min_dim=0
max_dim=0
width=0
height=0
extra_cmd="--encode-type=jpg --encoded"
if [ $redo ]
then
extra_cmd="$extra_cmd --redo"
fi
for subset in test trainval
do
python $root_dir/scripts/create_annoset.py --anno-type=$anno_type --label-map-file=$mapfile --min-dim=$min_dim --max-dim=$max_dim --resize-width=$width --resize-height=$height --check-label $extra_cmd $data_root_dir $root_dir/data/$dataset_name/$subset.txt $data_root_dir/$dataset_name/$db/$dataset_name"_"$subset"_"$db examples/$dataset_name
done
(3)分別執行如下兩條命令轉換數據格式:
# Create the trainval.txt, test.txt, andtest_name_size.txt in data/VOC0712/
./data/VOC0712/create_list.sh
# You can modify the parameters increate_data.sh if needed.
# It will create lmdb files for trainvaland test with encoded original image:
# - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb
# - $HOME/data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb
# and make soft links atexamples/VOC0712/
./data/VOC0712/create_data.sh
此時發現執行create_data.sh時還是出錯了,報錯為:AttributeError: 'module' object has no attribute 'LabelMap',原因是沒有添加環境變量,
解決方式:其中$CAFFE_ROOT是本人caffe的根目錄,注意換成自己的.
vim ~/.bashrc
最后一行將環境變量的值改為exportPYTHONPATH=/home/zhuyating/caffessd/caffe/python:$PYTHONPATH source~/.profile (由於本人將此次下載的caffe放在caffessd文件夾下,故路徑如上所述。)
echo $PYTHONPATH #檢查環境變量的值是否修改成功。
7.訓練模型
因為我們用的是cpu,首先修改examples/ssd/ssd_pascal.py文件
將如下代碼注釋掉
#gpus = "0,1,2,3"
#gpulist = gpus.split(",")
#num_gpus = len(gpulist)
# Divide the mini-batch to different GPUs.
batch_size = 32
accum_batch_size = 32
iter_size = accum_batch_size /batch_size
solver_mode = P.Solver.CPU
device_id = 0
batch_size_per_device = batch_size
#if num_gpus > 0:
# batch_size_per_device = int(math.ceil(float(batch_size) /num_gpus))
# iter_size = int(math.ceil(float(accum_batch_size) /(batch_size_per_device * num_gpus)))
# solver_mode = P.Solver.GPU
# device_id = int(gpulist[0])
然后Linux運行Python文件進行訓練(一般CPU電腦是會死機的):
Python examples/ssd/ssd_pascal.py
如果不想花費時間訓練,可以在這里下載訓練好的模型
https://drive.google.com/uc?id=0BzKzrI_SkD1_WVVTSmQxU0dVRzA&export=download
下載后解壓,將其中的VGGNet文件夾復制到caffe/models下面,呀,你發現caffe/models下面已經有VGGNet文件夾了,這是之前我們做訓練時建立的,沒訓練就沒有了.ok,就可以將VGGNet復制到此處了。
8.測試
1)在圖片測試集上測試
pythonexamples/ssd/score_ssd_pascal.py
這時你可能會有以下幾種報錯:
a.顯示cpu-only的版本不能用gpu,ok,打開score_ssd_pascal.py修改為
solver_mode = P.Solver.CPU
b. 出錯:checked failed: num_test_image_ <= names_.size() (4952 vs.2525)
原因及解決方法:ssd_pascal.py文件中num_test_image參數是4952,而test_name_size.txt里面卻只有2525張圖片的信息。此時要檢查test_name_size.txt是不是只有2525張圖片的信息,若只有2525張圖片的信息,則刪掉test_name_size.txt,重新轉換數據得到4952張圖片的信息或者直接拷貝同學已有的test_name_size.txt替換原來的test_name_size.txt。
2)在視頻上測試
pythonexamples/ssd/ssd_pascal_video.py
當然,直接跑是他自帶的視頻,想跑自己的代碼的話,要先用vim打開該文件,定位到51行,修改視頻路徑為已有本地視頻,這樣就可以跑自己的視頻了。
3)使用攝像頭測試
pythonexamples/ssd/ssd_pascal_webcam.py.