caffe-ssd编译以及训练自己的数据集

编译caffe之前首先要配置好cuda8.0+cuDNN5.1+opencv3.x的环境
注意:如果是cuda9.x的版本,要注意gcc编译器的版本问题。具体参照:cuda和gcc版本不兼容以及解决办法解决gcc与cuda版本不兼容问题

编译caffe


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

训练和评价demo


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的数据,所以我们要进行转换。转换的方法是:

  • 将图像用工具进行标注,得到txt标注文件
  • 将txt文件和图片转换成VOC格式(用脚本)
  • 将VOC格式转换为LMDB格式,利用SSD示例代码提供的转换脚本。

VOC标准数据集如下图所示
VOC文件夹组成
(1) 在$CAFFE_ROOT/data/VOCdevkit目录下创建MyDataSet目录,然后进入到该目录下,创建上图所示的三个文件夹。其中,Annotation存放XML文件,JPEGImages存放所有的图片,ImageSets下建立一个Main目录,该目录下有4个txt文件

  • train.txt :用来训练的图片文件的文件名列表
  • val.txt:用来验证的图片文件的文件名列表
  • trainval.txt:用来训练和验证的图片文件的文件名列表
  • test.txt :用来测试的图片文件的文件名列表

(2)在CAFFE_ROOT/data/目录下创建MyDataSet目录,同时将$CAFFE_ROOT/data/VOC0712下的labelmap_voc.prototxt,create_list.sh,create_data.sh
这三个文件copy到MyDataSet目录下,并对以上文件进行修改

  • labelmap_voc.prototxt
    将该文件中的类别修改成和自己的数据集相匹配,注意需要保留一个label 0 , background类别
item {
  name: "Cat"					#xml文件中的类别名					
  label: 0
  display_name: "Cat"				#检测时显示的类别名
}
  • create_list.sh
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				#修改这里,改成自己的数据集名

  • create_data.sh
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开始训练

猜你喜欢

转载自blog.csdn.net/weixin_42749767/article/details/82772149