一:数据准备:
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
表示显卡内容不能此次处理
解决方法: