Tensorflow - 语义分割 Deeplab API 之 Demo Tensorflow - 语义分割 Deeplab API 之 ModelZoo Tensorflow DeepLab 语义分割还提供了在 PASCAL VOC 2012, Cityscapes, ADE20K 三个分割数据集上的训练实现.

<h2>1. Train on PASCAL VOC 2012</h2>

<h3>1.1 数据集准备</h3>

主要包括 PASCAL VOC 2012 语义分割数据集下载,和转换为 Tensorflow 的 TFRecord.

Shell 脚本 - download_and_convert_voc201.sh:

#!/bin/bash
# Usage:
#   bash ./download_and_convert_voc2012.sh
#
# 假设该 Shell 脚本所在路径的目录结构为:
#  + datasets
#     - build_data.py
#     - build_voc2012_data.py
#     - download_and_convert_voc2012.sh
#     - remove_gt_colormap.py
#     + pascal_voc_seg
#       + VOCdevkit
#         + VOC2012
#           + JPEGImages
#           + SegmentationClass
#

# Exit immediately if a command exits with a non-zero status.
set -e

CURRENT_DIR=$(pwd)  # 当前路径
WORK_DIR="./pascal_voc_seg"  
mkdir -p "${WORK_DIR}"
cd "${WORK_DIR}"

# 该函数用于 PASCAL VOC 2012 分割数据集的下载和解压
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}"
}

# 下载VOC2012图片.
BASE_URL="http://host.robots.ox.ac.uk/pascal/VOC/voc2012/"
FILENAME="VOCtrainval_11-May-2012.tar"

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

cd "${CURRENT_DIR}"

# PASCAL VOC 2012 分割数据集的根目录
PASCAL_ROOT="${WORK_DIR}/VOCdevkit/VOC2012"

# Remove the colormap in the ground truth annotations.
SEG_FOLDER="${PASCAL_ROOT}/SegmentationClass"
SEMANTIC_SEG_FOLDER="${PASCAL_ROOT}/SegmentationClassRaw"

echo "Removing the color map in ground truth annotations..."
python ./remove_gt_colormap.py \
  --original_gt_folder="${SEG_FOLDER}" \
  --output_dir="${SEMANTIC_SEG_FOLDER}"

# Build TFRecords of the dataset.
# First, create output directory for storing TFRecords.
OUTPUT_DIR="${WORK_DIR}/tfrecord"
mkdir -p "${OUTPUT_DIR}"

IMAGE_FOLDER="${PASCAL_ROOT}/JPEGImages"
LIST_FOLDER="${PASCAL_ROOT}/ImageSets/Segmentation"

echo "Converting PASCAL VOC 2012 dataset..."
python ./build_voc2012_data.py \
  --image_folder="${IMAGE_FOLDER}" \
  --semantic_segmentation_folder="${SEMANTIC_SEG_FOLDER}" \
  --list_folder="${LIST_FOLDER}" \
  --image_format="jpg" \
  --output_dir="${OUTPUT_DIR}"

Tensorflow DeepLab 推荐的 VOC2012 数据目录结构为:

+ datasets
  + pascal_voc_seg
    + VOCdevkit
      + VOC2012
        + JPEGImages
        + SegmentationClass
    + tfrecord
    + exp
      + train_on_train_set # 保存了训练的输出, 可视化等结果信息.
        + train
        + eval
        + vis

<h3>1.2 训练 - train/eval/vis</h3>

  • Tensorflow DeepLab 模型结果复现需要使用大 BatchSize (>12), 并设置 fine_tune_batch_norm = True. 这里为了演示,训练时使用了小 BatchSize. 如果 GPU 显存有限,可以在 ModelZoo 中提供的断点模型 Checkpoints 上进行 finetune,其 batchnorm 参数已经训练过,采用小一点的学习率,并设置 fine_tune_batch_norm = False.
  • 如果设置 output_stride=8,则需要改变 atrous_rates: 从 [6, 12, 18] 修改为 [12, 24, 36].
  • 如果不想使用解码结构 decoder module,可以跳过 flag - decoder_output_stride.

xception_65 为例:
训练 Train

# From tensorflow/models/research/
python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=30000 \
    --train_split="train" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --train_crop_size=513 \
    --train_crop_size=513 \
    --train_batch_size=1 \
    --dataset="pascal_voc_seg" \
    --tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
    --train_logdir=${PATH_TO_TRAIN_DIR} \
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_INITIAL_CHECKPOINT} - 初始化的断点checkpoint, 一般时在 ImageNet 上的预训练断点.
  • ${PATH_TO_TRAIN_DIR} - 训练过程中断点,事件的保存路径.
  • ${PATH_TO_DATASET} - PASCAL VOC2012 数据集路径.

验证 Eval

# From tensorflow/models/research/
python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=513 \
    --eval_crop_size=513 \
    --dataset="pascal_voc_seg" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \
    --eval_logdir=${PATH_TO_EVAL_DIR} \
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_CHECKPOINT} - 训练的断点路径,如 train_logdir.
  • ${PATH_TO_EVAL_DIR} - 评测结果保存路径.
  • ${PATH_TO_DATASET} - PASCAL VOC 2012 数据集路径.

可视化 Visualization

# From tensorflow/models/research/
python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=513 \
    --vis_crop_size=513 \
    --dataset="pascal_voc_seg" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \
    --vis_logdir=${PATH_TO_VIS_DIR} \
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_CHECKPOINT} - 训练的断点路径,如 train_logdir.
  • $${PATH_TO_VIS_DIR} - 评测结果保存路径.
  • ${PATH_TO_DATASET} - PASCAL VOC 2012 数据集路径.
  • 如果想要保存分割结果,可以设置 also_save_raw_predictions = True.

<h3>1.3 运行 Tensorboard</h3>

如果时按照上面推荐的目录结构,可以直接运行:

tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
  • ${PATH_TO_LOG_DIRECTORY} - 指向包含了 tain, eval, vis 的路径, 如上面的 train_on_train_set 路径.

Tensorboard 可能需要几分钟准备数据.

<h3>1.4 例子</h3>

local_test.sh Shell 脚本来在 PASCAL VOC2012数据集上运行 train.py, eval.py, vis.py, export_model.py.

# From tensorflow/models/research/deeplab
sh local_test.sh
#!/bin/bash
# This script is used to run local test on PASCAL VOC 2012. Users could also
# modify from this script for their use case.
#
# Usage:
#   # From the tensorflow/models/research/deeplab directory.
#   sh ./local_test.sh
#

# Exit immediately if a command exits with a non-zero status.
set -e

# Move one-level up to tensorflow/models/research directory.
cd ..

# Update PYTHONPATH.
export PYTHONPATH=$PYTHONPATH:pwd:pwd/slim

# Set up the working environment.
CURRENT_DIR=$(pwd)
WORK_DIR="${CURRENT_DIR}/deeplab"

# Run model_test first to make sure the PYTHONPATH is correctly set.
python "${WORK_DIR}"/model_test.py -v

# Go to datasets folder and download PASCAL VOC 2012 segmentation dataset.
DATASET_DIR="datasets"
cd "${WORK_DIR}/${DATASET_DIR}"
sh download_and_convert_voc2012.sh

# Go back to original directory.
cd "${CURRENT_DIR}"

# Set up the working directories.
PASCAL_FOLDER="pascal_voc_seg"
EXP_FOLDER="exp/train_on_trainval_set"
INIT_FOLDER="${WORK_DIR}/${DATASET_DIR}/${PASCAL_FOLDER}/init_models"
TRAIN_LOGDIR="${WORK_DIR}/${DATASET_DIR}/${PASCAL_FOLDER}/${EXP_FOLDER}/train"
EVAL_LOGDIR="${WORK_DIR}/${DATASET_DIR}/${PASCAL_FOLDER}/${EXP_FOLDER}/eval"
VIS_LOGDIR="${WORK_DIR}/${DATASET_DIR}/${PASCAL_FOLDER}/${EXP_FOLDER}/vis"
EXPORT_DIR="${WORK_DIR}/${DATASET_DIR}/${PASCAL_FOLDER}/${EXP_FOLDER}/export"
mkdir -p "${INIT_FOLDER}"
mkdir -p "${TRAIN_LOGDIR}"
mkdir -p "${EVAL_LOGDIR}"
mkdir -p "${VIS_LOGDIR}"
mkdir -p "${EXPORT_DIR}"

# Copy locally the trained checkpoint as the initial checkpoint.
TF_INIT_ROOT="http://download.tensorflow.org/models"
TF_INIT_CKPT="deeplabv3_pascal_train_aug_2018_01_04.tar.gz"
cd "${INIT_FOLDER}"
wget -nd -c "${TF_INIT_ROOT}/${TF_INIT_CKPT}"
tar -xf "${TF_INIT_CKPT}"
cd "${CURRENT_DIR}"

PASCAL_DATASET="${WORK_DIR}/${DATASET_DIR}/${PASCAL_FOLDER}/tfrecord"

# Train 10 iterations.
NUM_ITERATIONS=10
python "${WORK_DIR}"/train.py \
  --logtostderr \
  --train_split="trainval" \
  --model_variant="xception_65" \
  --atrous_rates=6 \
  --atrous_rates=12 \
  --atrous_rates=18 \
  --output_stride=16 \
  --decoder_output_stride=4 \
  --train_crop_size=513 \
  --train_crop_size=513 \
  --train_batch_size=4 \
  --training_number_of_steps="${NUM_ITERATIONS}" \
  --fine_tune_batch_norm=true \
  --tf_initial_checkpoint="${INIT_FOLDER}/deeplabv3_pascal_train_aug/model.ckpt" \
  --train_logdir="${TRAIN_LOGDIR}" \
  --dataset_dir="${PASCAL_DATASET}"

# Run evaluation. 
# This performs eval over the full val split (1449 images) and will take a while.
# Using the provided checkpoint, one should expect mIOU=82.20%.
python "${WORK_DIR}"/eval.py \
  --logtostderr \
  --eval_split="val" \
  --model_variant="xception_65" \
  --atrous_rates=6 \
  --atrous_rates=12 \
  --atrous_rates=18 \
  --output_stride=16 \
  --decoder_output_stride=4 \
  --eval_crop_size=513 \
  --eval_crop_size=513 \
  --checkpoint_dir="${TRAIN_LOGDIR}" \
  --eval_logdir="${EVAL_LOGDIR}" \
  --dataset_dir="${PASCAL_DATASET}" \
  --max_number_of_evaluations=1

# Visualize the results.
python "${WORK_DIR}"/vis.py \
  --logtostderr \
  --vis_split="val" \
  --model_variant="xception_65" \
  --atrous_rates=6 \
  --atrous_rates=12 \
  --atrous_rates=18 \
  --output_stride=16 \
  --decoder_output_stride=4 \
  --vis_crop_size=513 \
  --vis_crop_size=513 \
  --checkpoint_dir="${TRAIN_LOGDIR}" \
  --vis_logdir="${VIS_LOGDIR}" \
  --dataset_dir="${PASCAL_DATASET}" \
  --max_number_of_iterations=1

# Export the trained checkpoint.
CKPT_PATH="${TRAIN_LOGDIR}/model.ckpt-${NUM_ITERATIONS}"
EXPORT_PATH="${EXPORT_DIR}/frozen_inference_graph.pb"

python "${WORK_DIR}"/export_model.py \
  --logtostderr \
  --checkpoint_path="${CKPT_PATH}" \
  --export_path="${EXPORT_PATH}" \
  --model_variant="xception_65" \
  --atrous_rates=6 \
  --atrous_rates=12 \
  --atrous_rates=18 \
  --output_stride=16 \
  --decoder_output_stride=4 \
  --num_classes=21 \
  --crop_size=513 \
  --crop_size=513 \
  --inference_scales=1.0

图片测试 Demo - 参考 Tensorflow - 语义分割 Deeplab API 之 Demo.

<h2>2. Train on Cityscapes Dataset</h2>

在 Cityscapes 语义分割数据集上的训练类似于 PASCAL VOC2012 数据集的训练.

<h3>2.1 数据集准备</h3>

Shell 脚本 convert_cityscapes.sh 包括了数据集下载和转换为 TFRecord.
在 Cityscapes 数据集下载前需要注册 - https://www.cityscapes-dataset.com/

# From the tensorflow/models/research/deeplab/datasets directory.
sh convert_cityscapes.sh
#!/bin/bash
# Usage:
#   bash ./preprocess_cityscapes.sh
#
# The folder structure is assumed to be:
#  + datasets
#    - build_cityscapes_data.py
#    - convert_cityscapes.sh
#    + cityscapes
#      + cityscapesscripts (downloaded scripts)
#      + gtFine
#      + leftImg8bit
#

# Exit immediately if a command exits with a non-zero status.
set -e

CURRENT_DIR=$(pwd)
WORK_DIR="."

# Root path for Cityscapes dataset.
CITYSCAPES_ROOT="${WORK_DIR}/cityscapes"

# Create training labels.
python "${CITYSCAPES_ROOT}/cityscapesscripts/preparation/createTrainIdLabelImgs.py"

# Build TFRecords of the dataset.
# First, create output directory for storing TFRecords.
OUTPUT_DIR="${CITYSCAPES_ROOT}/tfrecord"
mkdir -p "${OUTPUT_DIR}"

BUILD_SCRIPT="${CURRENT_DIR}/build_cityscapes_data.py"

echo "Converting Cityscapes dataset..."
python "${BUILD_SCRIPT}" \
  --cityscapes_root="${CITYSCAPES_ROOT}" \
  --output_dir="${OUTPUT_DIR}" \

得到的数据保存路径为:./deeplab/datasets/cityscapes/tfrecord.

推荐的数据集组成结构如:

+ datasets
  + cityscapes
    + leftImg8bit
    + gtFine
    + tfrecord
    + exp
      + train_on_train_set
        + train
        + eval
        + vis

<h3>2.2 训练 - train/eval/vis</h3>

  • Tensorflow DeepLab 模型结果复现需要使用大 BatchSize (>8), 并设置 fine_tune_batch_norm = True. 这里为了演示,训练时使用了小 BatchSize. 如果 GPU 显存有限,可以在 ModelZoo 中提供的断点模型 Checkpoints 上进行 finetune,其 batchnorm 参数已经训练过,采用小一点的学习率,并设置 fine_tune_batch_norm = False.
  • 如果设置 output_stride=8,则需要改变 atrous_rates: 从 [6, 12, 18] 修改为 [12, 24, 36].
  • 如果不想使用解码结构 decoder module,可以跳过 flag - decoder_output_stride.

xception_65 为例:
训练Train

# From tensorflow/models/research/
python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=90000 \
    --train_split="train" \
    --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=1 \
    --dataset="cityscapes" \
    --tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
    --train_logdir=${PATH_TO_TRAIN_DIR} \
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_INITIAL_CHECKPOINT} - 初始化断点Checkpoint的路径, 一般为 ImageNet上预训练的断点.
  • ${PATH_TO_TRAIN_DIR} - 模型训练过程断点保存路径.
  • ${PATH_TO_DATASET} - Cityscapes 数据集路径.

验证Eval:

# From tensorflow/models/research/
python deeplab/eval.py \
    --logtostderr \
    --eval_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --eval_crop_size=1025 \
    --eval_crop_size=2049 \
    --dataset="cityscapes" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \
    --eval_logdir=${PATH_TO_EVAL_DIR} \
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_CHECKPOINT} - 模型训练过程保存的断点路径, 如 train_logdir.
  • ${PATH_TO_EVAL_DIR} - 验证结果保存的路径.
  • ${PATH_TO_DATASET} - Cityscapes 数据集路径.

可视化Visualization:

# From tensorflow/models/research/
python deeplab/vis.py \
    --logtostderr \
    --vis_split="val" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --vis_crop_size=1025 \
    --vis_crop_size=2049 \
    --dataset="cityscapes" \
    --colormap_type="cityscapes" \
    --checkpoint_dir=${PATH_TO_CHECKPOINT} \
    --vis_logdir=${PATH_TO_VIS_DIR} \
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_CHECKPOINT} - 模型训练过程保存的断点路径, 如 train_logdir.
  • ${PATH_TO_VIS_DIR} - 验证结果保存的路径.
  • ${PATH_TO_DATASET} - Cityscapes 数据集路径.
  • 如果想要保存分割结果,可以设置 also_save_raw_predictions = True.

<h3>2.3 运行 Tensorboard</h3>

如果时按照上面推荐的目录结构,可以直接运行:

tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
  • ${PATH_TO_LOG_DIRECTORY} - 指向包含了 tain, eval, vis 的路径, 如上面的 train_on_train_set 路径.

Tensorboard 可能需要几分钟准备数据.

<h2>3. Train on ADE20K Dataset</h2>

在 ADE20K 语义分割数据集上的训练类似于 PASCAL VOC2012 数据集的训练.

<h3>3.1 数据集准备</h3>

Shell 脚本 download_and_convert_ade20k.sh 包括了数据集下载和转换为 TFRecord.

# From the tensorflow/models/research/deeplab/datasets directory.
sh convert_cityscapes.sh
#!/bin/bash
# Usage:
#   bash ./download_and_convert_ade20k.sh
#
# The folder structure is assumed to be:
#  + datasets
#     - build_data.py
#     - build_ade20k_data.py
#     - download_and_convert_ade20k.sh
#     + ADE20K
#       + tfrecord
#       + ADEChallengeData2016
#         + annotations
#           + training
#           + validation
#         + images
#           + training
#           + validation

# Exit immediately if a command exits with a non-zero status.
set -e

CURRENT_DIR=$(pwd)
WORK_DIR="./ADE20K"
mkdir -p "${WORK_DIR}"
cd "${WORK_DIR}"

# Helper function to download and unpack ADE20K 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}"
  unzip "${FILENAME}"
}

# Download the images.
BASE_URL="http://data.csail.mit.edu/places/ADEchallenge"
FILENAME="ADEChallengeData2016.zip"

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

cd "${CURRENT_DIR}"

# Root path for ADE20K dataset.
ADE20K_ROOT="${WORK_DIR}/ADEChallengeData2016"

# Build TFRecords of the dataset.
# First, create output directory for storing TFRecords.
OUTPUT_DIR="${WORK_DIR}/tfrecord"
mkdir -p "${OUTPUT_DIR}"

echo "Converting ADE20K dataset..."
python ./build_ade20k_data.py  \
  --train_image_folder="${ADE20K_ROOT}/images/training/" \
  --train_image_label_folder="${ADE20K_ROOT}/annotations/training/" \
  --val_image_folder="${ADE20K_ROOT}/images/validation/" \
  --val_image_label_folder="${ADE20K_ROOT}/annotations/validation/" \
  --output_dir="${OUTPUT_DIR}"

得到的数据保存路径为:./deeplab/datasets/ADE20K/tfrecord.

推荐的数据集组成结构如:

+ datasets
   - build_data.py
   - build_ade20k_data.py
   - download_and_convert_ade20k.sh
   + ADE20K
     + tfrecord
    + exp
      + train_on_train_set
        + train
        + eval
        + vis
     + ADEChallengeData2016
       + annotations
         + training
         + validation
       + images
         + training
         + validation

<h3>3.2 训练 - train/eval/vis</h3>

  • Tensorflow DeepLab 模型结果复现需要使用大 BatchSize (>12), 并设置 fine_tune_batch_norm = True. 这里为了演示,训练时使用了小 BatchSize. 如果 GPU 显存有限,可以在 ModelZoo 中提供的断点模型 Checkpoints 上进行 finetune,其 batchnorm 参数已经训练过,采用小一点的学习率,并设置 fine_tune_batch_norm = False.
  • 需要 fine-tune 参数 min_resize_valuemax_resize_value 以得到较好的结果. 且要保证 resize_factor == output_stride.
  • 如果设置 output_stride=8,则需要改变 atrous_rates: 从 [6, 12, 18] 修改为 [12, 24, 36].
  • 如果不想使用解码结构 decoder module,可以跳过 flag - decoder_output_stride.

xception_65 为例:
训练Train

# From tensorflow/models/research/
python deeplab/train.py \
    --logtostderr \
    --training_number_of_steps=90000 \
    --train_split="train" \
    --model_variant="xception_65" \
    --atrous_rates=6 \
    --atrous_rates=12 \
    --atrous_rates=18 \
    --output_stride=16 \
    --decoder_output_stride=4 \
    --train_crop_size=513 \
    --train_crop_size=513 \
    --train_batch_size=4 \
    --min_resize_value=513 \
    --max_resize_value=513 \
    --resize_factor=16 \
    --dataset="ade20k" \
    --tf_initial_checkpoint=${PATH_TO_INITIAL_CHECKPOINT} \
    --train_logdir=${PATH_TO_TRAIN_DIR}\
    --dataset_dir=${PATH_TO_DATASET}
  • ${PATH_TO_INITIAL_CHECKPOINT} - 初始化断点Checkpoint的路径, 一般为 ImageNet上预训练的断点.
  • ${PATH_TO_TRAIN_DIR} - 模型训练过程断点保存路径.
  • ${PATH_TO_DATASET} - ADE20K 数据集路径.

<h3>3.3 运行 Tensorboard</h3>

如果时按照上面推荐的目录结构,可以直接运行:

tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
  • ${PATH_TO_LOG_DIRECTORY} - 指向包含了 tain, eval, vis 的路径, 如上面的 train_on_train_set 路径.

Tensorboard 可能需要几分钟准备数据.

<h2>4. Tensorflow DeepLab API 问题</h2>

<h3>4.1 backbone network 问题</h3>

如果不是只使用提供的 backbone network,如 Xception,可以修改 core/feature_extractor.py 以支持更多的主干网络.

<h3>4.2 新数据集训练问题</h3>

如果需要在新的数据集上进行模型训练,可以修改 dataset/build_{cityscapes,voc2012}_data.pydataset/segmentation_dataset.py 来构建新的数据集.

<h3>4.3 PASCAL VOC augmented 训练数据集下载</h3>

PASCAL VOC augmented website

<h3>4.4 DenseCRF 问题</h3>

DeepLab 没有进行 DenseCRF 处理,可以参考: densecrf.

<h3>4.5 模型训练和 BN 参数 fine-tune</h3>

如果硬件资源有限,建议采用 DeepLab 提供的断点 Checkpoint 来进行直接 fine-tune,因为断点已经训练好了 batch norm 参数. 如,设置晓得学习率,设置fine_tune_batch_norm = false,由于学习率小而延长训练迭代次数.

如果确实要重新训练模型,建议:

  • 1 - 设置 output_stride = 16,或者 output_stride = 32, 记得同时修改对应的 atrous_rates,例如,atrous_rates = [3, 6, 9] 对应 output_stride = 32.
  • 2 - 尽可能的采用多张 GPUs, 修改 train.py 中的 num_clones 参数,尽可能的设置大的 train_batch_size.
  • 3 - 调整 train.py 中的 train_crop_size 参数,可以设置小一点,如 513x513, 或 321x321. 这样可以设置大的 train_batch_size.
  • 4 - 采用小型主干网络backbone network, 如 MobileNet-v2.

<h3>4.6 模型训练的同步</h3>

train.py 中, 可以设置 num_replices参数 - 训练的机器数量,和 num_ps_tasks 参数. 一般设置 num_ps_tasks = num_replicas / 2.
可以查看更多细节 - slim.deployment.model_deploy.

<h3>4.7 提供的断点模型的精度复现</h3>

可以尝试运行:

sh local_test.sh

或者

sh local_test_mobilenetv2.sh

首先,确保可以根据 DeepLab 提供的设置能够复现结果.
然后,可以试着修改,进行调试.

<h3>4.8 eval_crop_size 的选值</h3>

DeepLab 采用整张图片进行测试,也就是说,eval_crop_size = output_stride * k + 1.
其中,k 是整数,设置 k 使得 eval_crop_size 稍微大于数据集中图片尺寸的最大值.
例如,对于 PASCAL 数据集,设置 eval_crop_size = 513x513,比图片尺寸 512 稍大.
同样地,所有的图片维度都等于 1024x2048.

Last modification:October 9th, 2018 at 09:31 am