版权所有,翻版必究。https://blog.csdn.net/fightingxyz/article/details/105488802#comments_13092868
环境:win10,Anaconda3,tensorflow1.15.0,tensorflow-gpu1.14.0,pycharm。
官网代码:可以从https://github.com/tensorflow/models下载model_master。下载解压后:
在research中寻找deeplab代码:
第一步:
数据集准备:使用网上的数据。这里使用的是VOCdevkit打开是VOC2012.里面有五个文件。
http://host.robots.ox.ac.uk/pascal/VOC/voc2012/index.html#devkit(官网)
VOC2012数据集下载地址:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar(本文使用)
分别为下面文件:
网上即可下载:大约1.9G。
文件放置的位置为deeplab文件下datasets文件中。然后建立了一个pascal_voc_seg文件夹。将数据放在这个文件夹中。
可建立可不建立。因为官网代码里面有个地方默认设置了所以我不想改地址,就加了一个pascal_voc_seg文件夹。
本来没有exp文件和tfrecord文件。本文是进行后面步骤才有的。因为后面添加了生成tfrecord格式的文件夹。然后exp是代码默认生成的后续存放结果图和标签的地方。因为我又重新建立位置放置了,所以不用管。
第二步:
准备要一个预训练模型:在此采用的是xception65_coco_voc_trainval(http://download.tensorflow.org/models/deeplabv3_pascal_trainval_2018_01_04.tar.gz)
得到:
文件的位置,放在deeplab下即可。虽然位置会有不同,但是没什么影响,看你自己了。下面是我的布局。
第三步:
数据的生成:在deeplab提供了download_and_convert_voc2012.sh脚本,进行下载和生成相应的TFRecord,但是在Windows中需要自己进行改进。找到./deeplab/datasets中的remove_gt_colormap.py.运行。这就h是为什么建立一个pascal_vog_seg文件夹的目的。不用改这个地方。大约在30行左右。
原来的segementationclass数据样子:
然后你的\pascal_voc_seg\VOCdevkit\VOC2012中会增加一个SegmentationClassRaw文件夹。其中的图如下所示:
第四步:
在pascal_voc_seg目录下,建立tfrecord文件夹,用来保存输出的tfrecord文件。
需要修改的地方(主要也是数据的存放输出位置)为:
特别重要(因为你下载的图片为jpg格式,如果不更改就会出现问题。博主当时也是找了好久。数据明明存在,确实读不出来,(lll¬ω¬)):
(这个参数在build_data中),如果你的输入图像时jpg格式就将这里 改为jpg。如果时png格式就将image_format参数改为png格式。然后运行程序 build_voc2012_data.py。
你会发现,在你的保存路径./pascal_vog_seg/tfrecord中得到结果:
第五步:
开始训练:运行train.py文件。不过需要进行一些配置。
总图(网络找到的):
详解:
(1)存放模型的位置:
(2)训练次数,看你需要了。
(3)批次。和你使用的机器有关,内存不多的话将它改为最小值,即train_batch_size=1
(4)fine_tune_batch_norm,因为train_batch_size=1,所以将它改为False
(5)源码给的是513,这需要比较大的内存,设备不够,减小。网上有几篇文章提到需要大于300,暂时没有找到出处。
(6)atrous_rates参数的设置。可以从官网中看出,还需要设置xception_65.
(7)model_variant设置为xception_65.(此参数在common中)
(8)同样common.py文件中还需要添加'decoder_output_stride',设置为4,运行的时候发现需要设置为string类型。
(9)'output_stride',设置为16
(10)datasets就是存放数据的文件。然后train_split设置为train。dataset_dir设置为之前存放tfrecord数据的位置。
(11)预训练模型的位置。即之前下载的那个数据。
参数设置完成之后开始运行train.py。这是我的保存路径下\deeplab\model_save的数据。
第六步:
运行eval.py文件。也需要配置一些参数。
总图:
有些参数不在说明,上诉应该很清楚了。不懂请百度谢谢。eval_splt和train_split一样只是一个训练一个验证而已。将对应处的改为val.
注意这里使用的是原始数据大小。也可以换做其他设置,可以试试。
需要注意的是:eval.py在运行行会一直检测等待。怎么解决呢?有人说这样做:将你的代码中的
改为:
但是我测试无效,不过也可以尝试,没准你们的欧克了呢。我将此处改为(目的就是为了执行一次,也需要时间等待):
结果为(先不分析结果,后续博客再说):
第七步:
和eval.py类似,vis.py在运行时会一直检测等待,需要修改vis.py。先说参数的配置(话说第六步可进行可不进行)。
总图:
仍然是对一些参数进行修改,相应你已经轻车熟路了!
想不想你的结果保存并显示出来,那就把false改为True吧!(运行后你的结果会出现在你设置的文件夹)
看我的保存路径!出现两个文件夹!
如果没有看接下来一段那你的程序会停止不动哦!哈哈哈哈!怎么修改呢?查看程序不动说明有些地方没有进行。我的修改简单粗暴:
首先把下面的替换为:
然后上面那个,去掉for语句,直接将值赋值,然后运行!:
这句要注释!!!!(新增)
!!!!
结果:
后续发现问题会继续添加。不喜勿喷!!!后面研究用自己的数据训练。以及该变这个并不太还好的测试程序。不适合自己的习惯!!!
补充:
Could not create cudnn handle: CUDNN_STATUS_ALLOC_FAILED
解决方法:在程序中添加以下语句即可。
import tensorflow as tf
config = tf.ConfigProto(gpu_options=tf.GPUOptions(allow_growth=True))
sess = tf.Session(config=config)