Refinedet训练自己的数据集--配置:caffe+python2.7+CUDA8.0

0.前言

本文记录自己在使用Refinedet算法训练自己的数据集时的过程。
文件夹的具体内容如下。大文件的名字是Refinedet-VL30.
在这里插入图片描述

1.数据集准备

数据集按照标准的VOC格式进行制作就可以。我把数据集放到了data路径下,名字为VL30.
在这里插入图片描述

2.环境配置

  1. caffe安装

首先是要完成caffe环境大安装,这期间遇到了很多的错误,出错就去查度娘找博客就可以,很多方法多试一试,不一定哪个就好使了。

  1. 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
  1. 编译

在终端输入下列命令,编译过程中还是会出很多错误,继续查对应的错误,然后慢慢改吧。

	make all -j24
	make py

将Refinedet的Python路径添加到.bashrc中并生效。

	1.终端输入 vim ~/.bashrc
	2.在文件中添加语句 export PYTHONPATH=/home/caffe/python 就是你安装caffe目录下的python
	3.终端输入 source ~/.bashrc 使其生效

至此编译成功以后,环境配置就完成了。

3.数据转换

  1. 首先修改data/voc0712/文件夹下的 labelmap_voc.prototxt 文件,将类别改成自己数据集的具体内容。
    在这里插入图片描述
  2. 修改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
  1. 修改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.训练自己的数据集

  1. 更改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,
  1. 将VGG_ILSVRC_16_layers_fc_reduced.caffemodel模型复制到models/VGGNet文件夹下。
  2. 终端输入下列命令执行程序。
	python examples/refinedet/VGG16_voc2007_320.py

5.测试模型

  1. 编译
	cd Refinedet-VL45/test/lib
	make all -j24
  1. 修改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')
  1. 终端输入以下命令,并将结果保存下来。注意每个模型都会测一次,所以时间比较长。
	python test/refinedet_test.py 2>1 | tee test_model_120000.log

6.训练结果显示

1.因为系统没有图形界面,这一部分还没有调试好。有时间完善后更新。

7.错误总结

  1. 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
  1. 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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值