0.前言
本文记录自己在使用Refinedet算法训练自己的数据集时的过程。
文件夹的具体内容如下。大文件的名字是Refinedet-VL30.
1.数据集准备
数据集按照标准的VOC格式进行制作就可以。我把数据集放到了data路径下,名字为VL30.
2.环境配置
- caffe安装
首先是要完成caffe环境大安装,这期间遇到了很多的错误,出错就去查度娘找博客就可以,很多方法多试一试,不一定哪个就好使了。
- Refinedet安装
在终端输入命令
cp Makefile.config.example Makefile.config
修改Makefile.config文件
1.USE_CUDNN := 1
2.OPENCV_VERSION := 3
3.CUDA_DIR := /usr/local/cuda-8.0
4.INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/x86_64-linux-gnu/hdf5/serial/
5.PYTHON_INCLUDE := /usr/include/python2.7 \
/usr/lib/python2.7/dist-packages/numpy/core/include
- 编译
在终端输入下列命令,编译过程中还是会出很多错误,继续查对应的错误,然后慢慢改吧。
make all -j24
make py
将Refinedet的Python路径添加到.bashrc中并生效。
1.终端输入 vim ~/.bashrc
2.在文件中添加语句 export PYTHONPATH=/home/caffe/python 就是你安装caffe目录下的python
3.终端输入 source ~/.bashrc 使其生效
至此编译成功以后,环境配置就完成了。
3.数据转换
- 首先修改data/voc0712/文件夹下的 labelmap_voc.prototxt 文件,将类别改成自己数据集的具体内容。
- 修改create_list.sh的内容,具体如下。执行文件,然后再将下方的两个test改成trainval再执行一次。两次执行都成功以后,在文件夹下可以看到 test.txt test_name_size.txt trainval.txt trainval_name_size.txt 四个文件。
#!/bin/bash
#root_dir=$HOME/data/VOCdevkit/
root_dir=/home/clj/Refinedet-VL30/data
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 VL30
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" ] 转换trainval文件时把text改成trainval就可以
then
$bash_dir/../../build/tools/get_image_size $root_dir $dst_file $bash_dir/$dataset"_name_size.txt"
fi
# Shuffle trainval file.
if [ $dataset == "test" ] 转换trainval文件时把text改成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
- 修改create_data.sh文件,具体如下。修改后执行该文件。执行成功后,在该文件夹下会生成lmdb文件夹,文件夹中还包括两个文件夹,同时,在examples/VOC0712下也有同样的两个文件夹,至此数据转化结束。
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
#root_dir=$cur_dir/../..
root_dir=/home/clj/Refinedet-VL30
cd $root_dir
redo=1
data_root_dir=/home/clj/Refinedet-VL30/data
dataset_name="VOC0712"
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 trainval test
do
python2 $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
4.训练自己的数据集
- 更改examples/refinedet/下的VGG16_VOC2007_320.py文件。
1.类别数 num_classes = 31
2.GPU数量 gpus = "0"
3.batch size数量 accum_batch_size = 4
4.测试集数量 num_test_image = 600
5.最大迭代次数 'max_iter': 120000,
- 将VGG_ILSVRC_16_layers_fc_reduced.caffemodel模型复制到models/VGGNet文件夹下。
- 终端输入下列命令执行程序。
python examples/refinedet/VGG16_voc2007_320.py
5.测试模型
- 编译
cd Refinedet-VL45/test/lib
make all -j24
- 修改test/lib/datasets/pascal_voc.py文件。
1.路径 self._devkit_pathcd='/home/clj/Refinedet-VL30/data'
self._data_path = os.path.join(self._devkit_path, 'VL30')
2.类别名称
self._classes = ('__background__', # always index 0
'0001', '0002', '0003', '0004',
'0005', '0006', '0007', '0008', '0009',
'0010', '0011', '0012', '0013', '0014',
'0015', '0016', '0017', '0018', '0019',
'0020', '0021', '0022', '0023', '0024',
'0025', '0026', '0027', '0028', '0029',
'0030')
3.路径
def _do_python_eval(self, output_dir = 'output'):
annopath = os.path.join(
self._devkit_path,
#'VOC' + self._year,
'VL30/'
'Annotations',
'{:s}.xml')
imagesetfile = os.path.join(
self._devkit_path,
#'VOC' + self._year,
'VL30/'
'ImageSets',
'Main',
self._image_set + '.txt')
- 终端输入以下命令,并将结果保存下来。注意每个模型都会测一次,所以时间比较长。
python test/refinedet_test.py 2>1 | tee test_model_120000.log
6.训练结果显示
1.因为系统没有图形界面,这一部分还没有调试好。有时间完善后更新。
7.错误总结
- could not open or find file …
原因:^M是Windows系统下的换行符,因为制作数据集使用的是Windows系统,因此文件中换行格式不匹配,使得生成的文件多了M字符,找不到对应的图片和标注信息。
解决:vim\打开ImageSets/Main下的test.txt和trainval.txt文件输入以下三条语句,再重新执行create_list.sh文件。
:e ++ff=dos
:set ff=unix
:wq
- F0910 00:50:22.650843 80198 io.cpp:63] Check failed: fd != -1 (-1 vs. -1) File not found: models/VGGNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel
原因:没有将VGG_ILSVRC_16_layers_fc_reduced.caffemodel文件放到models/VGGNet文件夹下。
解决:复制一份到文件夹下。
8.总结
Refindet相比tf版的SSD,在训练自己数据的时候需要改动的参数和文件还是相对少一点的。不过这个环境配置是个大问题,tf不需要编译还是舒服一点。
训练过程中也是遇到各种问题,什么样的都见过了,不过一个一个错误改过来,跑通的那一刻还是很爽的。相信自己可以的,慢慢找,一定能找到错误改过来!
感谢大神的博客 https://blog.csdn.net/xiao_lxl/article/details/84976999