deeplab_v3 训练自己的数据集

目录

  • 1 主要参考博客
  • 2 环境配置
    • 2.1 源码准备
    • 2.2 测试model_test.py
  • 3 制作自己的数据集
    • 3.1 python下labelme并制作json文件
    • 3.2 把json文件生成.png文件
    • 3.3 数据集目录
    • 3.4 生成tfrecord文件
  • 4 训练前代码准备
    • 4.1 修改segmentation_dataset.py
    • 4.2 修改Train_utils.py
  • 5 训练
    • 5.1 修改train.py
    • 5.2 下载预训练模型
    • 5.3 训练指令
  • 6 验证并可视化
    • 6.1 验证
    • 6.2 可视化

1 主要参考博客

https://blog.csdn.net/malvas/article/details/88896283#commentBox
https://blog.csdn.net/lucifer_24/article/details/88720098
https://blog.csdn.net/weixin_43832437/article/details/84931184
https://blog.csdn.net/jairana/article/details/83900226

2 环境配置

Ubuntu:16.04.5
python:3.6.4
tensorflow-gpu:1.12.0
deeplab版本:r1.13.0

2.1 源码准备

deeplab源码下载:在官网https://github.com/tensorflow/models下载r1.13.0分支,我之前直接下载的model-master,但是后面遇到了很多困难放弃了,所以改用早起的版本。

2.2 测试model_test.py

测试一下环境配置是否成功。

添加依赖库到PYTHONPATH,在目录~/deeplab/models-r1.13.0/research下:
在终端添加slim环境变量:

# From ~/deeplab/models-r1.13.0/research
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

调用model_test.py测试:

# From ~/deeplab/models-r1.13.0/research
python deeplab/model_test.py

注意,这里有可能会出现以下错误:
deeplab_v3 训练自己的数据集_第1张图片
这时将model_test.py代码的140行改为:
在这里插入图片描述
出现以下结果,说明你的环境配置成功:
在这里插入图片描述

3 制作自己的数据集

3.1 python下labelme并制作json文件

这步接触到labelme的基本没问题

3.2 把json文件生成.png文件

这步主要参考:
https://blog.csdn.net/lucifer_24/article/details/88720098
这博客有一个很好的链接:
https://note.youdao.com/ynoteshare1/index.html?id=032620eac64634508cd4f9e65be4617c&type=note#/

3.3 数据集目录

# from:'/home/lab/lc/deeplab/data'
+ image #存放所有的原始图片,包括训练集,验证集
+ mask #存放所有的标签文件,即3.2步生成的png文件
+ index   
   - train.txt #所有训练集图片名 
   - trainval.txt #所有交叉验证集图片名,其实这个集合基本没用到,可以省略
   - val.txt #所有验证集图片名
+ tfrecord #存放3.4生成的tfrecord文件
+train #存放后面训练的模型。可以不建立这个文件夹,后面自动生成
+val #存放后面验证生成的lab文件。可以不建立这个文件夹,后面自动生成
+vis #存放后面可视化生成的图片文件。可以不建立这个文件夹,后面自动生成

PS:这里需要注意一个点,image和mask的文件名应该一致,且全部小写,上一步产生的iamge后缀大写,用 rename ‘y/A-Z/a-z/’ * 修改,,mask文件名是000000_gt.png,用 rename ‘s/_gt.png/.png/’ ./* 修改,这样image和mska的文件名就能对应。对应代码如下:

rename   's/\_gt.png/.png/' ./*  #修改后缀
rename 'y/A-Z/a-z/' *   #全部小写

先将image文件夹中的图片名称写进一个all.txt文件中代码如下:

# 文件名写入txt
import random
import glob

img_path = glob.glob('../image/*.jpg') 
for each in img_path:
    with open('../all.txt','a')as f:
        f.write(each[15:-4]+'\n')# 切片换成自己路径对应的文件名位置

然后将all.txt文件中的名称分到train.txt、trainval.txt、val.txt中代码如下:

# 随机分配训练集测试集验证集
import random

with open('/home/lab/lc/deeplab/data/index/all.txt','r')as f:
    lines = f.readlines()
    g = [i for i in range(1, 304)]# 设置文件总数
    random.shuffle(g)
    # 设置需要的文件数,train:trainval:val=6:2:2
    train = g[:182]
    trainval = g[182:243]
    val = g[243:]

    for index, line in enumerate(lines,1):
        if index in train:
            with open('/home/lab/lc/deeplab/data/index/train.txt','a')as trainf:
                trainf.write(line)
        elif index in trainval:
            with open('/home/lab/lc/deeplab/data/index/trainval.txt','a')as trainvalf:
                trainvalf.write(line)
        elif index in val:
            with open('/home/lab/lc/deeplab/data/index/val.txt','a')as valf:
                valf.write(line)

3.4 生成tfrecord文件

# from '/home/lab/lc/deeplab/models-r1.13.0/research/deeplab/datasets' 

python build_voc2012_data.py \
  --image_folder='/home/lab/lc/deeplab/data/image'  \
  --semantic_segmentation_folder='/home/lab/lc/deeplab/data/mask'  \
  --list_folder='/home/lab/lc/deeplab/data/index' \
  --image_format="jpg" \
  --output_dir='/home/lab/lc/deeplab/data/tfrecord'

其中前三个参数分别对应着3.3中创建的image、mask和index文件夹路径,
image_format是image中图片的格式,我这里是jpg格式
output_dir是生成tfrecord文件文件夹路径

4 训练前代码准备

4.1 修改segmentation_dataset.py

文件路径:’/home/lab/lc/deeplab/models-r1.13.0/research/deeplab/datasets/segmentation_dataset.py’
在110行左右,添加自己的数据集描述:

_MYDATA = DatasetDescriptor(
    splits_to_sizes={
        'train':182 ,  # num of samples in images/training
	'trainval':61,
        'val': 61,  # num of samples in images/validation
    },
    num_classes=4, #因为我的有car,road,sidewalk三个标注的类,加上背景类,所以共有4个类
    ignore_label=255, #背景类rgb,这里为黑色
)

然后注册数据集:

_DATASETS_INFORMATION = {
    'cityscapes': _CITYSCAPES_INFORMATION,
    'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
    'ade20k': _ADE20K_INFORMATION,
    'mydata':_MYDATA, #这里就是你上一步创建的数据类
}

4.2 修改Train_utils.py

文件路径:
‘/home/lab/lc/deeplab/models-r1.13.0/research/deeplab/utils/train_utils.py’
在109行左右,修改如下,作用是在使用预训练权重时候,不加载该logit层:

# Variables that will not be restored.
exclude_list = ['global_step','logits']
if not initialize_last_layer:
exclude_list.extend(last_layers)

训练时可能数据不平衡,我的数据集基本平衡,所以如果出现这种情况,可参考以下链接:
https://blog.csdn.net/malvas/article/details/90776327

5 训练

5.1 修改train.py

文件路径:’/home/lab/lc/deeplab/models-r1.13.0/research/deeplab/train.py’
在115行左右,修改如下:

flags.DEFINE_boolean('initialize_last_layer', False,
                     'Initialize the last layer.')

flags.DEFINE_boolean('last_layers_contain_logits_only', True,
                     'Only consider logits as last layers or not.')

5.2 下载预训练模型

网址:https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md

5.3 训练指令

# from '/home/lab/lc/deeplab/models-r1.13.0/research/

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=30000 \
    --train_split="train" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --train_crop_size=513\
    --train_crop_size=513 \
    --train_batch_size=3 \
    --dataset="mydata" \
    --tf_initial_checkpoint='/home/lab/lc/deeplab/models-r1.13.0/research/deeplab/backbone/deeplabv3_pascal_trainval/model.ckpt' \
    --train_logdir='/home/lab/lc/deeplab/data/train' \
    --dataset_dir='/home/lab/lc/deeplab/data/tfrecord'

train_crop_size:为图片大小,第一个为宽,第二个为高,不得小于321*321,一般为image中的图片大小
train_batch_size=3:为batch尺寸,我的显卡为GTX 1080,只能跑3个
dataset:4.1步建立的数据集
tf_initial_checkpoint:下载的预训练模型路径
train_logdir:训练模型保存的路径,我这里是3.3中建立的train文件夹路径
dataset_dir:3.3节中的tfrecord路径

6 验证并可视化

6.1 验证

验证指令:

# from '/home/lab/lc/deeplab/models-r1.13.0/research/

python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=1080 \
    --eval_crop_size=1920 \
    --dataset="mydata" \
    --checkpoint_dir='/home/lab/lc/deeplab/data/train' \
    --eval_logdir='/home/lab/lc/deeplab/data/val' \
    --dataset_dir='/home/lab/lc/deeplab/data/tfrecord' \
    --max_number_of_evaluations=1

eval_crop_size:为图片大小,第一个为宽,第二个为高,不得小于321*321,一般为image中的图片大小
dataset:4.1步建立的数据集
tf_initial_checkpoint:下载的预训练模型路径
eval_logdir:保存验证结果的路径,我这里是3.3中建立的eval文件夹路径
dataset_dir:3.3节中的tfrecord路径
max_number_of_evaluations:令循环验证次数为1,不然可能会出现如下一直等待验证命令

INFO:tensorflow:Waiting for new checkpoint at /home/lab/lc/deeplab/data/train

验证结果:
deeplab_v3 训练自己的数据集_第2张图片

6.2 可视化

可视化指令:

# from '/home/lab/lc/deeplab/models-r1.13.0/research/

python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=1025 \
    --vis_crop_size=2049 \
    --dataset="mydata" \
    --checkpoint_dir="/home/lab/lc/deeplab/data/train" \
    --vis_logdir=/home/lab/lc/deeplab/data/vis' \
    --dataset_dir='/home/lab/lc/deeplab/data/tfrecord' \
    --max_number_of_iterations=1

vis_crop_size:为图片大小,第一个为宽,第二个为高,不得小于321*321,一般为image中的图片大小
dataset:4.1步建立的数据集
tf_initial_checkpoint:下载的预训练模型路径
vis_logdir:保存可视化结果的路径,我这里是3.3中建立的vis文件夹路径
dataset_dir:3.3节中的tfrecord路径
max_number_of_iterations:令循环可视化次数为1,不然可能会出现如下一直等待验证命令

INFO:tensorflow:Waiting for new checkpoint at /home/lab/lc/deeplab/data/train

部分可视化结果:
deeplab_v3 训练自己的数据集_第3张图片
可视化效果展示:
deeplab_v3 训练自己的数据集_第4张图片

你可能感兴趣的:(a)