DeeplabV3+ tensorflow学习以及训练自己的数据

一:数据准备:

1、网上下载labelme开源标注工具并根据官网配置环境,然后标注数据并生成标签数据

2、根据voc数据制作方式制作tfrecord数据

二:训练前代码准备:

修改:segmentation_dataset.py、train_utils.py

segmentation_dataset.py在deeplab/datasets下面

在_DATASETS_INFORMATION = {对应的位置根据voc格式添加自己的数据,如下:

_DATASETS_INFORMATION = {
    'cityscapes': _CITYSCAPES_INFORMATION,
    'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
    'ade20k': _ADE20K_INFORMATION,
    'lab': _LAB_DATASET, #此为新添加的自己的数据信息,在训练参数里面对应--datasets参数
}

lab数据集仿照pascal_voc_seg数据集添加数据集信息 如下:

_LAB_DATASET = DatasetDescriptor(
    splits_to_sizes={
        'train': 150,   # 训练集的个数
        'trainval': 250, #训练验证集的个数
        'val': 100,  #验证集的个数
    },
    num_classes=4,   #label+1 (not use ignore label)
    ignore_label=255, # 用于有白边的标注情况
)

修改train_utils.py,此文件在deeplab/util下面,在不需要加载的层里面添加logits,作用是在使用预训练权重的时候不加载此层

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

logits理解:就是对概率求对数log(p/(1-p))

 

如果想在DeepLab的基础上fine-tune其他数据集, 可在train.py中修改输入参数。有一些选项:

使用预训练的所有权重,设置initialize_last_layer=True
只使用网络的backbone,设置initialize_last_layer=False和last_layers_contain_logits_only=False
使用所有的预训练权重,除了logits,因为如果是自己的数据集,对应的classes不同(这个我们前面已经设置不加载logits),可设置initialize_last_layer=False和last_layers_contain_logits_only=True

 

 

遵循的公式是(crop_size-1)/4为整数

 

 

 

问题解析:

1、每次运行完eval.py和vis.py后,程序都没有自己结束,而是提示“Waiting for new checkpoint at tboard_logs”,如何让程序结束

 

2、在执行eval的时候出现如下问题:[`predictions` out of bound]

此问题修改方法如下:

把eval.py的145行修改如下:

修改前:

metric_map = {}

metric_map[predictions_tag] = tf.metrics.mean_iou(
        predictions, labels, dataset.num_classes, weights=weights)

修改后:

metric_map = {}

# insert by trobr
indices = tf.squeeze(tf.where(tf.less_equal(
      labels, dataset.num_classes - 1)), 1)
labels = tf.cast(tf.gather(labels, indices), tf.int32)
predictions = tf.gather(predictions, indices)
# end of insert

metric_map[predictions_tag] = tf.metrics.mean_iou(
     predictions, labels, dataset.num_classes, weights=weights)

3、在运行eval的时候出现Expected [513,513,3], got [513,616,3] 这样的错误,此问题是因为设置的crop_size不满足所有的图片要求

解决方法,查询图片的最大size,设置上即可

4、InternalError: Dst tensor is not initialized.

此问题是GPU内存耗尽,tensorflow默认使用所有的GPU资源,运行程序之前,先运行export CUDA_VISIBLE_DEVICES=1,仅显卡设备1GPU可见

5、tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shap

表示显卡内容不能此次处理

解决方法:

  • 减少批处理Batch 的大小
  • 降低全连接层的维度
  • 增加池化 层
  • 缩小输入图片大小

你可能感兴趣的:(深度学习,tensorflow,图像语义分割)