搭建SSD框架
https://github.com/balancap/SSD-Tensorflow 下载解压
训练模型
标记数据,生成 txt 文件,train.txt,trainval.txt,test.txt,val.txt
修改 datasets 文件夹中 pascalvoc_common.py 文件,将训练类修改别成自己的
#原始的
#VOC_LABELS={
# 'none':(0,'Background'),
# 'aeroplane':(1,'Vehicle'),
# 'bicycle':(2,'Vehicle'),
# 'bird':(3,'Animal'),
# 'boat':(4,'Vehicle'),
# 'bottle':(5,'Indoor'),
# 'bus':(6,'Vehicle'),
# 'car':(7,'Vehicle'),
# 'cat':(8,'Animal'),
# 'chair':(9,'Indoor'),
# 'cow':(10,'Animal'),
# 'diningtable':(11,'Indoor'),
# 'dog':(12,'Animal'),
# 'horse':(13,'Animal'),
# 'motorbike':(14,'Vehicle'),
# 'person':(15,'Person'),
# 'pottedplant':(16,'Indoor'),
# 'sheep':(17,'Animal'),
# 'sofa':(18,'Indoor'),
# 'train':(19,'Vehicle'),
# 'tvmonitor':(20,'Indoor'),
#}
#修改后的
VOC_LABELS={
'none':(0,'Background'),
'pantograph':(1,'Vehicle'),
}
SSD-Tensorflow-master—>datasets—>pascalvoc_to_tfrecords.py 。。。然后更改文件的 83 行读取方式为’rb’ )如果你的文件不是.png 格式,也可以修改图片的类型。
此外, 修改 67 行,可以修改几张图片转为一个 tfrecords
在 SSD-Tensorflow-master 文件夹下创建 tf_conver_data.sh
#!/bin/bash
#thisisashellscripttoconvertpascalVOCdatasetsintotf-recordsonly
#directorywheretheoriginaldatasetisstored
DATASET_DIR=/home/buu123/Model/SSD/SSD-Tensorflow-master/VOCdevkit/VOC2007/
#VOC 数据保存的文件夹
#outputdirectorywheretostoreTFRecordsfiles
OUTPUT_DIR=/home/buu123/Model/SSD/SSD-Tensorflow-master/VOCdevkit/VOC2007/Seg mentationClass
#自己建立的保存 tfrecords 数据的文件夹
python./tf_convert_data.py\
--dataset_name=pascalvoc\
--dataset_dir=${DATASET_DIR}\
--output_name=voc_2007_train\
--output_dir=${OUTPUT_DIR}
在终端运行 tf_convert_data.sh 文件
训练模型
train_ssd_network.py 修改第 154 行的最大训练步数,将 None 改为比如 50000。 (tf.contrib.slim.learning.training 函数中 max-step 为 None 时训练会无限进行。)train_ssd_network.py,网络参数配置,若需要改,再此文件中进行修改,修改如图 33 中的数字 600,可以改变训练多长时间保存一次模型
需要改的地方:
(1) nets/ssd_vgg_300.py (因为使用此网络结构) ,修改 87 和 88 行的类别 default_params=SSDParams(
img_shape=(300,300),
num_classes=21, #根据自己的数据修改为类别+1
no_annotation_label=21,#根据自己的数据修改为类别+1
feat_layers=[‘block4’,‘block7’,‘block8’,‘block9’,‘block10’,‘block11’],
feat_shapes=[(38,38),(19,19),(10,10),(5,5),(3,3),(1,1)],
anchor_size_bounds=[0.15,0.90], #anchor_size_bounds=[0.20,0.90],
(2)train_ssd_network.py,修改类别 120 行,GPU 占用量,学习率,batch_size 等 tf.app.flags.DEFINE_integer( ‘num_classes’,21,‘Numberofclassestouseinthedataset.’)
#根据自己的数据修改为类别+1
(3)eval_ssd_network.py 修改类别,66 行
#=# #Mainevaluationflags. #=#
tf.app.flags.DEFINE_integer(
‘num_classes’,21,‘Numberofclassestouseinthedataset.’)
#根据自己的数据修改为类别+1
(4)datasets/pascalvoc_2007.py 根据自己的训练数据修改整个文件
TRAIN_STATISTICS={
‘none’:(0,0),
‘aeroplane’:(238,306), #238 图片书, 306 目标总数
‘bicycle’:(243,353),
‘bird’:(330,486),
‘boat’:(181,290),
‘bottle’:(244,505),
‘bus’:(186,229),
‘car’:(713,1250),
‘cat’:(337,376),
‘chair’:(445,798),
‘cow’:(141,259),
‘diningtable’:(200,215),
‘dog’:(421,510),
‘horse’:(287,362),
‘motorbike’:(245,339),
‘person’:(2008,4690),
‘pottedplant’:(245,514),
‘sheep’:(96,257),
‘sofa’:(229,248),
‘train’:(261,297),
‘tvmonitor’:(256,324),
‘total’:(5011,12608), //5011 为训练的图片书,12608 为目标总数
}
TEST_STATISTICS={
‘none’:(0,0),
‘aeroplane’:(1,1),
‘bicycle’:(1,1),
‘bird’:(1,1),
‘boat’:(1,1),
‘bottle’:(1,1),
‘bus’:(1,1),
‘car’:(1,1),
‘cat’:(1,1),
‘chair’:(1,1),
‘cow’:(1,1),
‘diningtable’:(1,1),
‘dog’:(1,1),
‘horse’:(1,1),
‘motorbike’:(1,1),
‘person’:(1,1),
‘pottedplant’:(1,1),
‘sheep’:(1,1),
‘sofa’:(1,1),
‘train’:(1,1),
‘tvmonitor’:(1,1),
‘total’:(20,20),
}
SPLITS_TO_SIZES={
‘train’:5011, #训练数据量
‘test’:4952, #测试数据量
}
SPLITS_TO_STATISTICS={
‘train’:TRAIN_STATISTICS,
‘test’:TEST_STATISTICS,
}
NUM_CLASSES=20 #类别,根据自己数据的实际类别修改(不包含背景)
新建 train.sh 文件
#!/bin/bash DATASET_DIR=./tfrecords ### 训 练 集 转 化 成 tfrecords 存 储 的 路 径
TRAIN_DIR=./logs/ ### 存 储 训 练 结 果 的 路 径 , 包 括 checkpoint 和 event , 自 行 指 定 CHECKPOINT_PATH=./checkpoints/vgg_16.ckpt###下载 vgg_16 模型
pythontrain_ssd_network.py\
--train_dir=${TRAIN_DIR}\
-dataset_dir=${DATASET_DIR}\
--dataset_name=xxxxxx\###具体指定,改为 your_data_name, 如果你在前面搞清楚了如何转
换自己的数据的话 --dataset_split_name=train\
--model_name=ssd_300_vgg\
--num_classes=4
--checkpoint_path=${CHECKPOINT_PATH} \ --checkpoint_model_scope=vgg_16 \ #### 改 为 vgg_16 --
checkpoint_exclude_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_ 300_vgg/block9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_ vgg/block7_box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ss d_300_vgg/block11_box \ --trainable_scopes=ssd_300_vgg/conv6,ssd_300_vgg/conv7,ssd_300_vgg/block8,ssd_300_vgg/bl ock9,ssd_300_vgg/block10,ssd_300_vgg/block11,ssd_300_vgg/block4_box,ssd_300_vgg/block7 _box,ssd_300_vgg/block8_box,ssd_300_vgg/block9_box,ssd_300_vgg/block10_box,ssd_300_vgg /block11_box\--save_summaries_secs=60\
--save_interval_secs=600\
--weight_decay=0.0005\
--optimizer=adam\
--learning_rate=0.001\
--learning_rate_decay_factor=0.94\
--batch_size=32
测试模型
将得到的训练模型输入到 checkpoints 文件夹中,在终端运行 test.py