在tensorflow上用其他数据集训练DeepLabV3+

1.clone 谷歌官方源码到本地
2.添加Python环境变量
在终端添加(一次性买卖,本终端有效,其他的无效):export PYTHONPATH=$PYTHONPATH:/home/xxx/Downloads/models-master/research/slim
也可以添加在bashrc里面,这样对当前用户都有效

vim ~/.bashrc
export PYTHONPATH=/home/xxx/Downloads/models-master/research/slim:$PYTHONPATH

attention:此处不添加的话,后面会报Python路径的错

File "deeplab/train.py", line 22, in <module>
from deeplab import common
ImportError: No module named deeplab

3.测试一下

#在deeplab/research目录下运行
python deeplab/model_test.py

接下来,开始照猫画虎,训练数据了,根据demo,跑了一遍voc的数据,弄清楚了voc的长什么样,然后把自己的数据整成了voc的格式。
4.生成图像mask。
数据本身提供的是灰度图,自己先把他们整成mask,这两者的区别在于一个看得出分割结果,一个就是漆黑一片。mask的话,其实也就是灰度图映射一下,将其灰度值变成0,1,2,3这样。之前的标注为N分类,自己只需要做二分类,所以就把其他类都变成了background。根据之前train.txt来对文件进行读写。这里要注意,有的txt换行的最后字符为\n,有的为\r\n,要注意区分。

import cv2
files = [line.split('jpg ')[1] for line in open('train.txt')]
#train.txt like this  ColorImage/Record008/Camera 6/171206_030615827_Camera_6.jpg Label/Record008/Camera 6/171206_030615827_Camera_6_bin.png
for path in files:
    path = path[:-2]
    img = cv2.imread(path)
  
    print(img.shape) 
    base = 'mask'   
    img[np.where((img!=49).all(axis = 2))] = 0
    img[np.where((img==49).all(axis = 2))] = 1
    #img[np.where((img==[255,0,0]).all(axis = 2))] =0
    #img[np.where((img==[255,0,255]).all(axis = 2))] =1 
    cv2.imwrite(path[:-8]+'.png',img)    

5.生成voctrain.txt vocval.txt为接下来生成tfrecord做准备。
这里需要的格式为Record008/Camera 6/171206_030905729_Camera_6,不需要后缀,且label和image要同名,自己懒得改生成的脚本,所以就按照voc脚本的格式来了。
只要把之前的train.txt截取一部分就好了

def voc_train(text):
    files = [line.split(' L')[0] for line in open(text)]
    with open('voctrain.txt','w') as file:
        for label in files:
            file.write(label[11:-4]+'\n')           

if __name__ == '__main__':
    voc_train('train.txt')

6.生成tfrecord
在4.5步骤之后,就可以愉快的采用提供的voc的脚本来生成tfrecord啦

 python build_voc2012_data.py   --image_folder="/media/chunyan/DATA/720data/apollo/ColorImage"  --semantic_segmentation_folder="/media/chunyan/DATA/720data/apollo/Label"  --list_folder="/media/chunyan/DATA/720data/apollo/txt"  --image_format="jpg"  --output_dir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/apollo/tfrecord"

7.训练模型
首先,对/models/research/deeplab/dataset 下 segmentation_dataset.py进行修改,添加自己数据集的信息在115行后添加

_APOLLO_INFORMATION = DatasetDescriptor(
    splits_to_sizes={
        'voctrains':4000,
        'voctrain':29991
        'vocval':300,
},
    num_classes =2,
    ignore_label =255,
# 在 125行DATASETS_INFORMATION中添加
'apollo':_APOLLO_INFORMATION,

开始训练

python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=40000 \
    --train_split="voctrains" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --train_crop_size=769 \
    --train_crop_size=769 \
    --train_batch_size=2 \
    --dataset="pascal_voc_seg" \
    --tf_initial_checkpoint="/home/chunyan/Downloads/models-master/research/deeplab/xception65/model.ckpt" \
    --train_logdir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/log" \
    --dataset_dir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/tfrecord"

这里 把initialize_last_layer改为false,不用最后一层的权重,flags.DEFINE_boolean('initialize_last_layer', False,

                 'Initialize the last layer.')

batchsize = 8 ,显存不够,所以bn不能动了,要把参数设为False 根据When fine_tune_batch_norm=True, use at least batch size larger than 12 (batch size more than 16 is better). Otherwise, one could use smaller batch size and set fine_tune_batch_norm=False.

7.评估模型:

python deeplab/eval.py \
    --logtostderr \
    --eval_split="vocval" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=2710 \
    --eval_crop_size=3384 \
    --dataset="pascal_voc_seg" \
    --checkpoint_dir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/log" \
    --eval_logdir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/eval"\
    --dataset_dir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/tfrecord"

注意:
--eval_crop_size=2710 这里=后不能有空格,--eval_crop_size= 2710 不然报错 所有的=后面都不能有空格 不然报错。absl.flags._exceptions.IllegalFlagValueError: flag --eval_crop_size=: invalid literal for int() with base 10: ''
跑完后会算出MIOU的值,来评估模型的好坏。

8.可视化分割结果

python deeplab/vis.py \
    --logtostderr \
    --vis_split="vocval" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=2710 \
    --vis_crop_size=3384 \
    --dataset="pascal_voc_seg" \
    --checkpoint_dir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/log" \
    --vis_logdir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/vis"\
    --dataset_dir="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/tfrecord"

这样在segmentation_results文件夹下,会生成每张图的原图与彩色分割结果。




9.导出模型:

python deeplab/export_model.py \
   --logtostderr \
   --checkpoint_path="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/log/model.ckpt-40000" \
   --export_path="/home/chunyan/Downloads/models-master/research/deeplab/datasets/pascal_voc_seg/export/frozen_inference_graph.pb" \
   --model_variant="xception_65" \
   --atrous_rates=6 \
   --atrous_rates=12 \
   --atrous_rates=18 \
   --output_stride=16 \
   --decoder_output_stride=4 \
   --num_classes=2 \
   --crop_size=2710 \
   --crop_size=3384 \
   --inference_scales=1.0

导出模型,生成frozen_inference_graph.pb以便接下来inference。这里的crop_size我是按照图片大小设置的,尝试了一下,输入不同分辨率的图像,分割效果差距很大,crop_size大小最佳。
10.测试图片,根据demo.ipynb 改了一下,输入一个文件夹的图,输出分割后的图在另一个文件夹,一张图需要4.6S,在1080TI下,还是蛮慢的。
生成的结果:


参数设置:

eval_crop_size = output_stride * k + 1
export_model 的时候crop_size 的参数选择:根据自己的测试,此时的crop_size 应该等于你要输入测试图像的大小,如果比测试图像大,预测出来的效果会很稀疏,不好。如果比测试图像小,直接报错。之前设置成原图的大小,也报错了,然后改成了960,960就ok了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容