json批量转换后,得到四个文件夹
注意:img和label的文件名要一致,否则在后续转tfrecord文件时会出错
首先制作数据集目录
ImageSets
+Segmentation #存放train.txt,trainval.txt,val.txt等文件
RSImages #存放img对应的数据
SegmentationClassRaw #存放label对应的灰度图
tfrecord #存放.tfrecord数据文件
执行remove_gt_colormap.py文件,将label文件转换为对应的灰度图
接着将数据源划分数据集,测试集
import os
import random
trainval_percent = 0.8
train_percent = 0.7
xmlfilepath = '../data/cov_data/RSImages'
txtsavepath = '../data/cov_data/ImageSets/Segmentation/'
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(txtsavepath+'trainval.txt', 'w')
ftest = open(txtsavepath+'test.txt', 'w')
ftrain = open(txtsavepath+'train.txt', 'w')
fval = open(txtsavepath+'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()
设置dataset_convert.py文件的参数,运行此文件,生成数据集对应的tfrecord文件
注:根据你的数据量设置_NUM_SHARDS,一般设置为4,数据量少,可设置为2
预训练的模型,需要根据你train.py文件设置的model_variant变量对应的骨干网络来选择
FLAGS.model_variant='xception_65'
将下载后的文件放在premodel,并解压
训练前,需修改文件segmentation_dataset.py,按照默认的数据格式,添加如下代码
_RS_SEG_INFORMATION = DatasetDescriptor(
splits_to_sizes={
'train': 44,
#'train_aug': 10582,
'trainval': 64,
'val': 20,
},
num_classes=4, #分类数+2,background和ignore_label
ignore_label=255,
)
找到下面代码,在最后注册自己的数据集
_DATASETS_INFORMATION = {
'cityscapes': _CITYSCAPES_INFORMATION,
'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
'ade20k': _ADE20K_INFORMATION,
'rs_seg':_RS_SEG_INFORMATION,
}
修改train.py
FLAGS.model_variant='xception_65'
train_logdir = data/train_res/'
train_crop_size = [256, 256] #根据训练的图大小和机器配置设置,我的电脑512,总是报内存不足
training_number_of_steps = 500 # 训练次数
#迁移学习相关设置
tf_initial_checkpoint = data/premodel/model.ckpt
initialize_last_layer = False #此变量为true会报错,我猜测主要原因是预训练VOC数据集是21个类别,我的数据集只设置了4个类别
last_layers_contain_logits_only = True
dataset = 'rs_seg' #数据集名称
train_split = 'trainval' #参与训练的数据集,用train也可以
dataset_dir = 'data/cov_data/tfrecord/'
训练结果保存为
修改vis.py参数,输出测试结果和分割结果
训练次数太少,训练结果测试准确性不高。
tensorboard --logdir=data/train_res