本人刚刚接触深度学习一个月左右,也是第一次使用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,遇到的问题解决博客不一一列出了