编译caffe之前首先要配置好cuda8.0+cuDNN5.1+opencv3.x的环境
注意:如果是cuda9.x的版本,要注意gcc编译器的版本问题。具体参照:cuda和gcc版本不兼容以及解决办法解决gcc与cuda版本不兼容问题
1.获取SSD代码。在终端打开想要安装ssd代码的目录,然后在终端下输入:
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd
2.修改配置文件。在终端下输入:
cp Makefile.config.example Makefile.config
如果你用的是Anaconda版的Python,需要修改依赖库的路径,配置文件中默认是Python标准版
3.编译caffe。在终端下输入:
mkdir build
cd build
ccmake .. # 可视化配置
make all -j8 # “-j8”是使用CPU的多核进行编译,可以极大地增加编译的速度
make install
make pycaffe
至此,caffe 的编译工作已经完成,可以在Python编译器输入import caffe
下进行验证,如果没有报错,证明编译完成。
1.预训练模型下载
SSD使用VGGNet进行预训练,github上作者给的链接打不开,可以到VGGNet
下载,密码:fucx,并且将该模型放到$CAFFE_ROOT/models/VGGNet/
路径下
2.下载VOC2007和VOC2012数据集
进入到用户主目录$HOME下,在终端输入:
mkdir data
cd data
# Download the 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
# Extract the data.
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
3.生成LMDB文件
cd $CAFFE_ROOT
# Create the trainval.txt, test.txt, and test_name_size.txt in data/VOC0712/
./data/VOC0712/create_list.sh
# You can modify the parameters in create_data.sh if needed.
# It will create lmdb files for trainval and 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 at examples/VOC0712/
./data/VOC0712/create_data.sh
如果执行过程中出现报错:no module named caffe
这是由于caffe的Python环境变量未配置好,可按照下面方法解决:
vim ~/.bashrc
export PYTHONPATH=/$CAFFE_ROOT/caffe/python
source ~/.bashrc
1.在$CAFFE_ROOT目录下执行以下命令进行训练
# It will create model definition files and save snapshot models in:
# - $CAFFE_ROOT/models/VGGNet/VOC0712/SSD_300x300/
# and job file, log file, and the python script in:
# - $CAFFE_ROOT/jobs/VGGNet/VOC0712/SSD_300x300/
# and save temporary evaluation results in:
# - $HOME/data/VOCdevkit/results/VOC2007/SSD_300x300/
# It should reach 77.* mAP at 120k iterations.
python examples/ssd/ssd_pascal.py
2.执行以下命令可以查看最近的快照的评分:
python examples/ssd/score_ssd_pascal.py
以上的部分是利用SSD训练标准数据集,很多时候我们需要训练自己的数据集。
1.生成训练和测试数据
我们自己的数据基本是jpeg或者其他图片格式的,而caffe输入的一般是LMDB的数据,所以我们要进行转换。转换的方法是:
VOC标准数据集如下图所示
(1) 在$CAFFE_ROOT/data/VOCdevkit目录下创建MyDataSet目录,然后进入到该目录下,创建上图所示的三个文件夹。其中,Annotation存放XML文件,JPEGImages存放所有的图片,ImageSets下建立一个Main目录,该目录下有4个txt文件
(2)在CAFFE_ROOT/data/目录下创建MyDataSet目录,同时将$CAFFE_ROOT/data/VOC0712下的labelmap_voc.prototxt,create_list.sh,create_data.sh
这三个文件copy到MyDataSet目录下,并对以上文件进行修改
item {
name: "Cat" #xml文件中的类别名
label: 0
display_name: "Cat" #检测时显示的类别名
}
root_dir=$HOME/data/VOCdevkit/
sub_dir=ImageSets/Main
bash_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
echo $bash_dir
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 MyDataSet #修改这里,改成自己的数据集名
data_root_dir="$HOME/data/VOCdevkit"
dataset_name="MyDataSet" #修改这里,改成自己的数据集名
mapfile="$root_dir/data/$dataset_name/labelmap_voc.prototxt"
labelmap_voc.prototxt中的类型一定要和XML文件中的类型对应起来,不然执行create_data.sh的时候会出现Unknown Name的报错
(3)修改训练文件$CAFFE_ROOT/data/example/ssd/ssd_pascal.py
改了数据集文件夹名称的话讲程序路径里面的VOC0712都替换为你的数据集名称$dataset_name,否则不需要修改,为了不要覆盖原来的模型建议修改数据集名称
# The database file for training data. Created by data/VOC0712/create_data.sh
train_data = "examples/MyDataSet/MyDataSet_trainval_lmdb"
# The database file for testing data. Created by data/VOC0712/create_data.sh
test_data = "examples/MyDataSet/MyDataSet_test_lmdb"
# Modify the job name if you want.
job_name = "MYSSD_{}".format(resize)
# The name of the model. Modify it if you want.
model_name = "VGG_MyDataSet_{}".format(job_name)
# Modify the job name if you want.
job_name = "MYSSD_{}".format(resize)
# The name of the model. Modify it if you want.
model_name = "VGG_MyDataSet_{}".format(job_name)
# Directory which stores the detection results.
output_result_dir = "{}/data/VOCdevkit/results/MyDataSet/{}/Main".format(os.environ['HOME'], job_name)
# Stores the test image names and sizes. Created by data/VOC0712/create_list.sh
name_size_file = "data/MyDataSet/test_name_size.txt"
# The pretrained model. We use the Fully convolutional reduced (atrous) VGGNet.
pretrain_model = "models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel"
# Stores LabelMapItem.
label_map_file = "data/MyDataSet/labelmap_voc.prototxt"
num_classes = 21 #类别数 = 实际类别数 + 1
num_test_image = 4953 #测试图片数量
# Defining which GPUs to use.
gpus = "0,1" #根据实际的GPU数修改
gpulist = gpus.split(",")
num_gpus = len(gpulist)
(4)在$CAFFE_ROOT下执行python examples/ssd/ssd_pascal.py
开始训练