Deeplab V3 训练自己遥感图像数据集

一、遥感图像数据集批量裁剪

二、labelme标签标定数据集

json批量转换后,得到四个文件夹

Deeplab V3 训练自己遥感图像数据集_第1张图片

注意:img和label的文件名要一致,否则在后续转tfrecord文件时会出错

三、制作数据集

首先制作数据集目录

ImageSets             
  +Segmentation       #存放train.txt,trainval.txt,val.txt等文件
RSImages              #存放img对应的数据
SegmentationClassRaw  #存放label对应的灰度图
tfrecord              #存放.tfrecord数据文件

执行remove_gt_colormap.py文件,将label文件转换为对应的灰度图

Deeplab V3 训练自己遥感图像数据集_第2张图片

接着将数据源划分数据集,测试集

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文件

  •  image_folder:RSImages对应的文件路径
  • semantic_segmentation_folder:SegmentationClassRaw  对应的文件路径
  • list_folder:train.txt,trainval.txt,val.txt等文件路径
  • output_dir:生成tfrecord存放的文件路径

Deeplab V3 训练自己遥感图像数据集_第3张图片

注:根据你的数据量设置_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,
}
  • 'rs_seg':数据集名称,在train.py会用到
  • _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/' 

训练结果保存为 

Deeplab V3 训练自己遥感图像数据集_第4张图片 

 六、模型测试

修改vis.py参数,输出测试结果和分割结果

Deeplab V3 训练自己遥感图像数据集_第5张图片

训练次数太少,训练结果测试准确性不高。

七、查看训练过程图

tensorboard --logdir=data/train_res

  • data/train_res为模型.ckpt存放的路径

Deeplab V3 训练自己遥感图像数据集_第6张图片

你可能感兴趣的:(Python,Tensorflow)