使用SSD(caffe)训练自己的数据集以及遇到的问题

本人刚刚接触深度学习一个月左右,也是第一次使用SSD框架,很多东西可能描述不准确,大家多多包涵!

1.数据集准备

        首先,我们需要一个数据集,数据集的标准是按照VOC2007制作的,如何制作我并不是很了解就不说了,我是老师给的数据集,数据集也存在不少坑,后面会讲。

       VOC数据集格式:

 

包涵Annotation、ImageSets、JPEGImages三个文件夹

(1)Annotation目录下放的是xml文件,这个xml文件是我使用的数据集的标注文件。

<annotation verified="no">
  <folder>1pps1</folder>
  <filename>0000001</filename>
  <path>F:\2\1pps1\0000001.jpg</path>
  <source>
    <database>Unknown</database>
  </source>
  <size>
    <width>2592</width>
    <height>1944</height>
    <depth>3</depth>
  </size>
  <segmented>0</segmented>
  <object>
    <name>6</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>787</xmin>
      <ymin>172</ymin>
      <xmax>959</xmax>
      <ymax>305</ymax>
    </bndbox>
  </object>
  <object>
    <name>6</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>789</xmin>
      <ymin>312</ymin>
      <xmax>921</xmax>
      <ymax>466</ymax>
    </bndbox>
  </object>
  <object>
    <name>7</name>
    <pose>Unspecified</pose>
    <truncated>0</truncated>
    <difficult>0</difficult>
    <bndbox>
      <xmin>514</xmin>
      <ymin>1233</ymin>
      <xmax>604</xmax>
      <ymax>1333</ymax>
    </bndbox>
  </object>
</annotation>

 (2)ImageSet目录下的Main目录里存放的是用于表示训练的图片集和测试的图片集,简单来说就是记录哪些是训练集、哪些是测试集

(3)JPEGImages目录下存放所有图片集(与xml文件一一对应)

 2.数据预处理

缩小图片尺寸:因为原图片训练耗时过多缩小一下和快很多

xml标注文件size节点、bndbox等同比缩小

生成trainval.txt、train.txt、val.txt、test.txt

3.VOC数据转换成LMDB数据

SSD提供了VOC数据到LMDB数据的转换脚本: data/VOC0712/create_list.sh 和./data/VOC0712/create_data.sh,这两个脚本是完全针对VOC0712目录下的数据进行的转换。

(1)进入caffe-ssd路径,在data目录下创建一个自己的文件夹,我创建的是VOC2020文件夹

cd data
mkdir VOC2020

(2)把data/VOC0712目录下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 这三个文件拷贝到VOC2020下

cp VOC0712/create_list.sh VOC2020/
cp VOC0712/create_data.sh VOC2020/
cp VOC0712/labelmap_voc.prototxt VOC2020/

(3)在caffe-ssd/examples下创建VOC2020文件夹 ,用于存放后续生成的lmdb文件

mkdir VOC2020

(4)修改labelmap_voc.prototxt文件、create_list.sh文件和create_data.sh文件

    ------labelmap_voc.prototxt文件

 -------create_list.sh文件

完整文件内容如下:

#!/bin/bash

root_dir=/home/dl/deeplearning/Public_File/data/VOCdevkit #这个路径下面有你自己存放Annotations、ImageSets、JPEGImages文件的数据集文件夹
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 VOC2020  #这里修改为自己的数据集名称
  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

------- create_data.sh文件

到这三个文件都改好了

(5)在 caffe-ssd目录下运行

./data/mydataset/create_list.sh
./data/mydataset/create_data.sh

这时会在caffe-ssd/data/VOC2020下生成三个文件

如果你是在Windows下处理得到的trainval.txt和test.txt数据,可能因为换两种系统换行符不一样,导致生成的txt文件换行有问题

我就是在自己电脑上处理的再传到服务器上就出错了,错误如下:

 这种情况这样修改一下一般能得到解决:

运行./data/mydataset/create_data.sh时报错如下:

解决方法:

sys.path.insert(0,'/home/dl/deeplearning/a_wang/caffe-ssd/python')#路径根据自己的情况修改

运行成功后会在examples/mydataset/文件夹下看到两个子文件夹,VOC2020_trainval_lmdb, VOC2020_test_lmdb;里面均包含data.dmb和lock.dmb; 

现在VOC数据已经转换成LMDB数据

4.训练

使用预训练好的VGGnet model :链接:https://pan.baidu.com/s/18ZuLkByyEUNRfd90L21Nkw 密码:ylnx 

在caffe/models路径下新建VGGNet文件夹,将下载好的模型放进去

修改caffe-ssd/examples/ssd下的ssd_pascal.py  需根据自己情况修改

82行:train_data路径;
84行:test_data路径;
237-246行:model_name、save_dir、snapshot_dir、job_dir、output_result_dir路径;
259-263行:name_size_file、label_map_file路径;
266行:num_classes修改为类别数+1;
360行:num_test_image:测试集图片数目

 

 

 

最后,如果你只有一个GPU, 需要修改285行: gpus=”0,1,2,3 改为gpu="0"

然后开始训练:

python ./examples/ssd/ssd_pascal.py 

 这时我又报了没有caffe模块的错,解决方法与上次类似

再运行就能成功开始训练了:

目前已经训练了几个小时,等过几天出了结果再进行下一步:

 参考https://blog.csdn.net/yu734390853/article/details/79481660,遇到的问题解决博客不一一列出了

猜你喜欢

转载自blog.csdn.net/qq_41706331/article/details/89389669