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
Ubuntu:16.04.5
python:3.6.4
tensorflow-gpu:1.12.0
deeplab版本:r1.13.0
deeplab源码下载:在官网https://github.com/tensorflow/models下载r1.13.0分支,我之前直接下载的model-master,但是后面遇到了很多困难放弃了,所以改用早起的版本。
测试一下环境配置是否成功。
添加依赖库到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
注意,这里有可能会出现以下错误:
这时将model_test.py代码的140行改为:
出现以下结果,说明你的环境配置成功:
这步接触到labelme的基本没问题
这步主要参考:
https://blog.csdn.net/lucifer_24/article/details/88720098
这博客有一个很好的链接:
https://note.youdao.com/ynoteshare1/index.html?id=032620eac64634508cd4f9e65be4617c&type=note#/
# 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)
# 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文件文件夹路径
文件路径:’/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, #这里就是你上一步创建的数据类
}
文件路径:
‘/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
文件路径:’/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.')
网址:https://github.com/tensorflow/models/blob/master/research/deeplab/g3doc/model_zoo.md
# 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路径
验证指令:
# 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
可视化指令:
# 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