deeplab v3+训练自己的数据集

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yeyustudy/article/details/83858165

数据集的制作及相关代码修改

源代码链接:deeplab v3+
笔者使用的是类似voc2012的数据集,最终的目的是进行语义分割。要想获得这样的数据集可以使用labelme进行标注,也可以使用PS进行处理。笔者使用了PS进行标注,生成了灰度图。
为了方便,使用的数据集形式与官方数据集一致,如下所示:
在这里插入图片描述
其中,在SegmentationClass中Segmentation里存放train.txt,val.txt等文件,里面记录着用作训练集验证集的文件名。JPEGImages中存放着所有的数据,SegmentationClass中存放着JPEGImages中数据对应的标签。tfrecord之后会存放经过处理的数据。train中会存放生成的训练文件,eval会存放生成的评估文件,vis会存放最终对eval的分割结果。
建立好文件夹后,首先要将原始图片转变为tensorflow支持的tfrecord格式。这里对download_and_convert_voc2012.sh文件的某些语句进行注释,因为我们不需要下载与解压voc数据集。如下所示:

# Helper function to download and unpack VOC 2012 dataset.
#download_and_uncompress() {
#  local BASE_URL=${1}
#  local FILENAME=${2}

# if [ ! -f "${FILENAME}" ]; then
#    echo "Downloading ${FILENAME} to ${WORK_DIR}"
#    wget -nd -c "${BASE_URL}/${FILENAME}"
#  fi
#  echo "Uncompressing ${FILENAME}"
#  tar -xf "${FILENAME}"
#}

# Download the images.
#BASE_URL="http://host.robots.ox.ac.uk/pascal/VOC/voc2012/"
#FILENAME="VOCtrainval_11-May-2012.tar"

#download_and_uncompress "${BASE_URL}" "${FILENAME}"

运行download_and_convert_voc2012.sh文件制作数据集:

# From the tensorflow/models/research/deeplab/datasets directory.
sh download_and_convert_voc2012.sh

在segmentation_dataset.py中修改如下内容为自己数据的train数据量、val数据量及分类数(num_classes),注意,此处的分类数包括背景:

    splits_to_sizes={
        'train': 2358,
 #       'train_aug': 10582,
 #      'trainval': 2913,
        'val': 590,
    },
    num_classes=6,
    ignore_label=255,

为了使用预训练的权重,更改train.py中的True改为False:

flags.DEFINE_boolean('initialize_last_layer', False,
                     'Initialize the last layer.')

之后按照官方教程进行训练即可

可能出现问题

1、如果数据集中的图片大小不一致,在运行eval.py的时候可能出现类似tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape mismatch in tuple component 1. Expected [513,513,3], got [513,616,3] 这样的错误,此时需要根据根据数据集中最大的图片尺寸修改即可,例如数据集中图片尺寸最大为624*823,可以设置eval_crop_size为625与825.
2、如果出现类似错误:InvalidArgumentError (see above for traceback): assertion failed: [predictions out of bound] [Condition x < y did not hold element-wise:] [x (mean_iou/confusion_matrix/control_dependency_1:0) = ] [0 3 3…] [y (mean_iou/ToInt64_2:0) = ] [150]
在eval.py修改代码如下:

   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)

猜你喜欢

转载自blog.csdn.net/yeyustudy/article/details/83858165