1.准备工作
1). 下载预训练模型
http://cs.unc.edu/~wliu/projects/ParseNet/VGG_ILSVRC_16_layers_fc_reduced.caffemodel
将此文件放置在/home/software/caffe/models/VGGNet/
目录下,如果原来有,最好备份一下。
2). 下载VOC2007数据集
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
主要应用VOCtrainval_06-Nov-2007.tar、VOCtest_06-Nov-2007.tar
, 两个文件解压都得到VOCdevkit
。
3).合并VOC2007数据集的trainval和test
将VOCtrainval_06-Nov-2007.tar、VOCtest_06-Nov-2007.tar
解压得到的VOCdevkit
直接合并,则其中Annotations、ImageSets、JPEGImages、SegmentationClass和SegmentationObject
都包含了trainval、train、var和test
类型的文件。
4).文件夹放置
- 将VOCdevkit放在
/home/working/
目录下:
/home/working/VOCdevkit
在
/home/software/caffe/data
目录下,将原来的VOC0712文件夹复制备份,此文件夹包含create_data.sh、create_list.sh、labelmap_voc.prototxt
以及生成的test.txt、test_name_size.txt、trainval.txt
:
/home/software/caffe/data/VOC0712
/home/software/caffe/data/VOC0712_bak
在
/home/software/caffe/examples
目录下,将原来的VOC0712文件夹复制备份,此文件夹用于放置生成的lmdb文件:
/home/software/caffe/examples/VOC0712
/home/software/caffe/examples/VOC0712_bak
在
/home/software/caffe/models/VGGNet
目录下,将原来的VOC0712文件夹复制备份,此文件夹用于放置生成的SSD_300X300模型文件夹:
/home/software/caffe/models/VGGNet/VOC0712
/home/software/caffe/models/VGGNet/VOC0712_bak
在
/home/software/caffe/jobs/VGGNet
目录下,将原来的VOC0712文件夹复制备份,此文件夹用于放置生成的VGG_VOC0712__SSD_300X300.sh
等文件,当将/home/software/caffe/examples/ssd/
目录下的ssd_pascal.py
等Python文件内的run_soon参数改为False的时候,就需要手动执行这个.sh文件启动模型训练:
/home/software/caffe/jobs/VGGNet/VOC0712
/home/software/caffe/jobs/VGGNet/VOC0712_bak
在
/home/software/caffe/jobs/VGGNet
目录下,新建一个results文件夹,此文件夹用于放置模型训练结果,此步骤选做,主要目的是为了模型训练数据集中管理:
/home/software/caffe/jobs/VGGNet/results
2.修改各类原始文件路径
由于第一步新建了用户自己的目录(为了不破坏原始数据),因此需要将各文件内的路径修改指向到用户目录下。
1).修改/home/software/caffe/dataVOC0712
目录下的create_data.sh、create_list.sh
# create_list.sh
# !/bin/bash
# data_root_dir="$HOME/data/VOCdevkit"
root_dir=/home/working/VOCdevkit ## 自行修改
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 VOC2017 ## 自行修改
# create_data.sh
# !/bin/bash
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=$cur_dir/../..
cd $root_dir
redo=1
# data_root_dir="$HOME/data/VOCdevkit"
data_root_dir="/home/working/VOCdevkit" ## 自行修改
dataset_name="BIRD2017"
2).将/home/software/caffe/examples/ssd/ssd_pascal.py
备份
/home/software/caffe/examples/ssd/ssd_pascal_bak.py
/home/software/caffe/examples/ssd/ssd_pascal.py
修改其中的路径及配置:
train_data = "examples/VOC0712/VOC0712_trainval_lmdb" # 训练数据路径,
test_data = "examples/VOC0712/VOC0712_test_lmdb" # 测试数据路径
model_name = "VGG_VOC0712_{}".format(job_name) # 模型名字
save_dir = "models/VGGNet/VOC0712/{}".format(job_name) # 模型保存路径
snapshot_dir = "models/VGGNet/VOC0712/{}".format(job_name) # snapshot快照保存路径
job_dir = "jobs/VGGNet/VOC0712/{}".format(job_name) # job保存路径
output_result_dir = "{}/data/VOCdevkit/results/VOC2007/{}/Main".format(os.environ['HOME'], job_name) # 测试结果txt保存路径
改为:
output_result_dir = "jobs/VGGNet/results/VOC2007/{}/Main".format(job_name)
name_size_file = "data/VOC0712/test_name_size.txt" #
label_map_file = "data/VOC0712/labelmap_voc.prototxt" # label文件路径
num_classes = 21 # 总类别数
gpus = "0,1,2,3" # 使用哪块GPU
改为:
gpus = "0" # 只有1块GPU
batch_size = 32 # 一次处理的图片数
batch_size = 2 # Jetson TX1经测试选择2勉强满足
accum_batch_size = 2
# Evaluate on whole test set.
num_test_image = 4952 # 测试图片数量,这个数量应该和test_name_size.txt保持一致
test_batch_size = 2 # Jetson TX1经测试选择2勉强满足
run_soon = True # 生成文件后自动开始训练
run_soon = False # 手动挡,需要自己执行`/home/software/caffe/jobs/VGGNet/VOC0712/VGG_VOC0712_SSD_300X300.sh`
学习率设置,学习率不宜过小,我设置base_lr 为0.000002,则学习率为:base_lr *25 = 0.00005。
# Use different initial learning rate.
if use_batchnorm:
base_lr = 0.0004
else:
# A learning rate for batch_size = 1, num_gpus = 1.
base_lr = 0.000002
模型保存周期:
solver_para={
···
'snapshot':10000, #原来为80000,改小写方便及时存储模型,否则出错又会从0开始训练
···
}
3.生成文件
注意:以下命令执行均需在caffe根路径下执行,否则会出错!
1).运行create_list.sh
cd home/software/caffe
./data/VOC0712/create_list.sh
生成:
2).运行create_data.sh
cd home/software/caffe
./data/VOC0712/create_data.sh
生成lmdb文件:
3).运行ssd_pascal.py
cd home/software/caffe
python examples/ssd/ssd_pascal.py
./jobs/VGGNet/VOC0712/VGG_VOC0712_SSD_300X300.sh #如果run_soon为True,则无需此步骤
至此训练就正式开始了,过程较长。
4.模型测试
1).图片数据集上测试
cd home/software/caffe
python examples/ssd/score_ssd_pascal.py
2).webcam测试:
在caffe的根目录运行ssd_pascal_webcam.py这个文件,这是使用摄像头实时测试的软件,读取的caffemodel是在caffe/models/VGGNet/VOC0712/SSD_300x300_webcam下最新的model,所以记得在这个文件夹中放入模型。 还要更改下ssd_pascal_webcam.py中label_map_file到你的labelmap_voc.prototxt
cd home/software/caffe
python examples/ssd/ssd_pascal_webcam.py
3).ssd_detect.cpp文件测试:
./build/examples/ssd/ssd_detect.bin models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt models/VGGNet/VOC0712/SSD_300x300/VGG_VOC0712_SSD_300x300_iter_120000.caffemodel examples/videos/test.txt --file_type video --out_file output.txt --confidence_threshold 0.4
参考文献:
SSD算法caffe配置,训练及测试过程
SSD: Single Shot MultiBox Detector 训练KITTI数据集(1)
深度学习ssd配置并在VGG模型上训练自己的数据