您的位置:首页 > 其它

ssd训练自己的数据(物体检测),并测试模型

2018-03-08 11:08 716 查看
写在前面:首先,你安装了ssd,并测试了VOC数据

*********************************************************


第一部分:数据准备(任务繁重)

1.标数据(生成的bounding box是txt格式),标数据的工具:链接:https://pan.baidu.com/s/1dvOXkW3xJtm9g4jR-3ZDhQ 密码:7eqr

2.将txt格式转化为VOC格式,代码链接:https://download.csdn.net/download/yu734390853/10274930

3.在/home/$你的服务器命/data/VOCdevkit下建立自己的数据集名称(以我的为例,我建立的是MyDataSet),在MyDataSet目录下需包含Annotations、ImageSets、JPEGImages三个文件夹:


Annotations目录下存放第二步生成的xml格式数据文件。

ImageSet目录下包含Main文件下,在ImageSets\Main里有四个txt文件:test.txt train.txt trainval.txt val.txt;



生成这四个txt文件的代码如下(Python)(根据自己的路径修改):

import os
import random

trainval_percent = 0.66
train_percent = 0.5
xmlfilepath = 'Annotations'
txtsavepath = 'ImageSets\Main'
total_xml = os.listdir(xmlfilepath)

num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)

ftrainval = open('ImageSets/Main/trainval.txt', 'w')
ftest = open('ImageSets/Main/test.txt', 'w')
ftrain = open('ImageSets/Main/train.txt', 'w')
fval = open('ImageSets/Main/val.txt', 'w')

for i  in list:
name=total_xml[i][:-4]+'\n'
if i in trainval:
ftrainval.write(name)
if i in train:
ftrain.write(name)
else:
fval.write(name)
else:
ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest .close()


txt文件中的内容为图片名字(无后缀)。

JPEGImages目录下存放所有的数据图片

4.在caffe-ssd/data目录下创建一个自己的文件夹MyDataSet(以我的为例):

cd data
mkdir MyDataSet


把data/VOC0712目录下的create_list.sh 、create_data.sh、labelmap_voc.prototxt 这三个文件拷贝到MyDataSet下(以我的为例):

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


5.在caffe-ssd/examples下创建MyDataSet文件夹:

mkdir MyDateSet


用于存放后续生成的lmdb文件;

6.修改labelmap_voc.prototxt文件(改成自己的类别),以及create_list.sh和create_data.sh文件中的相关路径;

#labelmap_voc.prototxt需修改:
item {
name: "none_of_the_above"
label: 0
display_name: "background"
}
item {
name: "aeroplane"
label: 1
display_name: "person"
}

#create_list.sh需修改:
root_dir=/home/yi_miao/data/Mydataset/
...
for name in yourownset
...
#if [[ $dataset == "test" && $name == "VOC2012" ]]
# then
#  continue
# fi

#create_data.sh需修改:
root_dir=/home/yi_miao/caffe-ssd
data_root_dir="/home/yi_miao/data/Mydataset"
dataset_name="Mydataset"


7.在caffe(ssd)根目录下运行命令:

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


此时,在examples/mydataset/文件夹下可以看到两个子文件夹, mydataset_trainval_lmdb, mydataset_test_lmdb;里面均包含data.dmb和lock.dmb;

******到此为止,我们的数据集就做好了。******


接下来

第二部分:开始训练

1.训练时使用ssd demo中提供的预训练好的VGGnet model :链接:https://pan.baidu.com/s/18ZuLkByyEUNRfd90L21Nkw 密码:ylnx

将该模型保存到 : caffe/models/VGGNet下(没有VGGNet,就新建一个)。

2.训练程序为/examples/ssd/ssd_pascal.py,运行之前,我们需要修改相关路径代码,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” ===> 改为”0” ,如果出现 out of memory,则将batch size 相应改小一些。

3.上述修改完成后,在caffe(ssd)根目录下运行:

python ./examples/ssd/ssd_pascal.py


开始训练............
4000
...................


第三部分:测试

1.测试单张图片

测试程序为/examples/ssd/ssd_detect.py,运行之前,我们需要修改相关路径代码,ssd_detect.py作如下修改(#部分为修改内容):

parser.add_argument('--labelmap_file',
default='data/VOC0712/labelmap_voc.prototxt')#**修改为你的路径**
parser.add_argument('--model_def',
default='models/VGGNet/VOC0712/SSD_300x300/deploy.prototxt')#**修改为你的路径**
parser.add_argument('--image_resize', default=300, type=int)
parser.add_argument('--model_weights',
default='models/VGGNet/VOC0712/SSD_300x300/'#**修改为你的路径**
'VGG_VOC0712_SSD_300x300_iter_120000.caffemodel')
parser.add_argument('--image_file', default='examples/images/fish-bike.jpg')#**修改为你的路径**


上述修改完成后,在caffe(ssd)根目录下运行:

Python ./example/ssd/ssd_detect.py


在caffe根目录下会生成检测结果图像。

2.批量检测多张图片

修改ssd_detect.py的代码(加个for循环),代码链接:https://download.csdn.net/download/yu734390853/10275197

*********************************************


有任何问题欢迎交流,QQ:734390853
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息