一、环境搭建
1.1下载caffe-ssd代码:
git clone https://github.com/weiliu89/caffe.git
cd caffe
git checkout ssd
1.2 caffe环境配置
具体请看博客Ubuntu16.04系统中caffe环境配置和博客Mac系统中caffe环境配置,以上方法仅供参考,由于caffe环境配置问题较多,编译报错,根据具体的问题再搜索解决方法。
二、数据集准备
这里介绍voc数据集格式训练。
2.1 数据集标注
具体标注方法参考博客labelimg安装及数据集标柱。
2.1 数据集转换
JPEGImages存储的是图片,Annotations存储的是标签文件,ImageSets用于存储txt文件
2.1.1 生成图片名的txt文件
txt文件包含trainval.txt, test.txt, val.txt,txt文件中存储的是图片名(不带后缀.jpg或者.png,只是名字),txt文件由getTxt.py文件生成,代码中包含了训练集与测试集的划分。
生成的文件会保存在ImageSets/Main文件夹下
import os
import random
from os import listdir, getcwd
testval_percent = 0.01 # train_percent = 1 - testval_precent
testOfval_percent = 1 # test_percent = testOfval_percent * testval_percent
imgpath = 'JPEGImages'
total_img = os.listdir(imgpath)
num = len(total_img)
list = range(num)
tv = int(num * testval_percent)
tr = int(tv * testOfval_percent)
testval = random.sample(list, tv)
test = random.sample(testval, tr)
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/trainval.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')
wd = os.getcwd()
for i in list:
name = total_img[i][:-4] + '\n'
if i in testval:
if i in test:
ftest.write(name)
else:
fval.write(name)
else:
ftrain.write(name)
ftrain.close()
fval.close()
ftest.close()
# os.system("cat train.txt val.txt > trainval.txt")
2.1.2 生成数据和标签路径的txt文件
在caffe-ssd/data目录下创建mydataset目录,同时将caffe-ssd/data/VOC0712目录下的create_list.sh,create_data.sh, labelmap_voc.prototxt这三个文件复制到cafe-ssd/data/mydataset目录下,第三个文件重命名为labelmap_mydataset.prototxt。
修改create_list.sh文件
#!/bin/bash
root_dir=/home/test/caffe-ssd/data/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 MyDataSet # 也需要修改,修改为VOCdevkit下级目录的名字
do
if [[ $dataset == "test" && $name == "VOC2012" ]]
then
continue
......
运行脚本文件:
sh create_list.sh
在caffe-ssd/data/mydataset目录下会生成三个文件trainval.txt,test.txt,test_name_size.txt
其中trainval.txt 和 test.txt 文件中包含了图片和标签的路径
test_name_size.txt包含了测试集的路径和图片大小
2.1.3 生成lmdb文件
修改标签名称文件labelmap_mydataset.prototxt
item { #背景要保留
name: "none_of_the_above"
label: 0
display_name: "background"
}
item { #标签
name: "car"
label: 1
display_name: "car"
}
修改create_data.sh文件
在caffe-ssd/example下新建文件夹mydataset
cur_dir=$(cd $( dirname ${BASH_SOURCE[0]} ) && pwd )
root_dir=/home/test/caffe-ssd # 修改成ssd-caffe的根目录
cd $root_dir
redo=1
data_root_dir=/home/test/caffe-ssd/data/VOCdevkit #数据集目录
dataset_name="mydataset" #改为mydataset
mapfile="$root_dir/data/$dataset_name/labelmap_mydataset.prototxt" # 修改标签文件的名称
anno_type="detection"
db="lmdb"
修改caffe-ssd/scripts/create_annoset.py文件
import sys
caffe_root = '/home/test/caffe-ssd/' #要加入的内容,caffe-ssd的路径
sys.path.insert(0, caffe_root + 'python') #python路径,对应caffe中编译的版本
from caffe.proto import caffe_pb2
from google.protobuf import text_format
运行脚本
sh create_data.sh
在caffe-ssd/example/mydataset文件夹下生成lmdb文件。
三、训练
3.1 下载预训练权重
下载vggNet的预训练权重,下载后,放到caffe-ssd/models/VGGNet下。
3.2 修改ssd_pascal.py文件
修改caffe-ssd/example/ssd/ssd_pascal.py文件,也可以复制一份,命名为ssd_mydataset.py,并修改其中的内容,
同样需要在导入caffe之前加入caffe-ssd的路径
caffe_root = '/home/test/caffe-ssd/' #要加入的内容,caffe-ssd的路径
sys.path.insert(0, caffe_root + 'python') #python路径,对应caffe中编译的版本
修改参数配置
1. train_data和test_data分别修改为生成的lmdb路径
train_data = "examples/mydataset/mydataset_trainval_lmdb"
test_data = "examples/mydataset/mydataset_test_lmdb"
2. num_test_image该变量修改成自己数据集中测试数据的数量
3. num_classes 该变量修改成自己数据集中标签类别数量数+1
4. gpus=’0,1,2,3’设置要使用的gpu
5. max_iter为迭代次数
6. setpvalue为分步迭代的阈值,但是最后一个值等于max_iter
7. snapshot迭代多少次保存一次结果
8. bath_size根据需要调整
9. base_lr根据需要调整学习率
10.resize_width,resize_height改变图像大小
3.3 训练
python example/ssd/ssd_mydataset.py