Tensorflow - 语义分割 Deeplab API 之 Demo
Tensorflow - 语义分割 Deeplab API 之 ModelZoo
Tensorflow DeepLab 语义分割还提供了在 PASCAL VOC 2012, Cityscapes, ADE20K 三个分割数据集上的训练实现.
1. Train on PASCAL VOC 2012
1.1 数据集准备
主要包括 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 _URL=${1}
local FILENAME=${2}
if [ ! -f \"${FILENAME}\" ]; then
echo \"Downloading ${FILENAME} to ${WORK_DIR}\"
wget -nd -c \"${ _URL}/${FILENAME}\"
fi
echo \"Uncompressing ${FILENAME}\"
tar -xf \"${FILENAME}\"
}
# 下载VOC2012图片.
_URL=\"http://host.robots.ox.ac.uk/pascal/VOC/voc2012/\"
FILENAME=\"VOCtrainval_11-May-2012.tar\"
download_and_uncompress \"${ _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
1.2 训练 - train/eval/vis
- 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.
1.3 运行 Tensorboard
如果时按照上面推荐的目录结构,可以直接运行:
tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
- ${PATH_TO_LOG_DIRECTORY} - 指向包含了
tain,eval,vis的路径, 如上面的train_on_train_set路径.
Tensorboard 可能需要几分钟准备数据.
1.4 例子
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 is used to run local test on PASCAL VOC 2012. Users could also
# modify from this 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.
2. Train on Cityscapes Dataset
在 Cityscapes 语义分割数据集上的训练类似于 PASCAL VOC2012 数据集的训练.
2.1 数据集准备
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
# + cityscapes s (downloaded s)
# + 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}/cityscapes s/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_ =\"${CURRENT_DIR}/build_cityscapes_data.py\"
echo \"Converting Cityscapes dataset...\"
python \"${BUILD_ }\" \\
--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
2.2 训练 - train/eval/vis
- 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.
2.3 运行 Tensorboard
如果时按照上面推荐的目录结构,可以直接运行:
tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
- ${PATH_TO_LOG_DIRECTORY} - 指向包含了
tain,eval,vis的路径, 如上面的train_on_train_set路径.
Tensorboard 可能需要几分钟准备数据.
3. Train on ADE20K Dataset
在 ADE20K 语义分割数据集上的训练类似于 PASCAL VOC2012 数据集的训练.
3.1 数据集准备
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 _URL=${1}
local FILENAME=${2}
if [ ! -f \"${FILENAME}\" ]; then
echo \"Downloading ${FILENAME} to ${WORK_DIR}\"
wget -nd -c \"${ _URL}/${FILENAME}\"
fi
echo \"Uncompressing ${FILENAME}\"
unzip \"${FILENAME}\"
}
# Download the images.
_URL=\"http://data.csail.mit.edu/places/ADEchallenge\"
FILENAME=\"ADEChallengeData2016.zip\"
download_and_uncompress \"${ _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
3.2 训练 - train/eval/vis
- Tensorflow DeepLab 模型结果复现需要使用大 BatchSize (>12), 并设置
fine_tune_batch_norm = True.
这里为了演示,训练时使用了小 BatchSize.
如果 GPU 显存有限,可以在 ModelZoo 中提供的断点模型 Checkpoints 上进行 finetune,其 batchnorm 参数已经训练过,采用小一点的学习率,并设置fine_tune_batch_norm = False. - 需要 fine-tune 参数
min_resize_value和max_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 数据集路径.
3.3 运行 Tensorboard
如果时按照上面推荐的目录结构,可以直接运行:
tensorboard --logdir=${PATH_TO_LOG_DIRECTORY}
- ${PATH_TO_LOG_DIRECTORY} - 指向包含了
tain,eval,vis的路径, 如上面的train_on_train_set路径.
Tensorboard 可能需要几分钟准备数据.
4. Tensorflow DeepLab API 问题
4.1 backbone network 问题
如果不是只使用提供的 backbone network,如 Xception,可以修改 core/feature_extractor.py 以支持更多的主干网络.
4.2 新数据集训练问题
如果需要在新的数据集上进行模型训练,可以修改 dataset/build_{cityscapes,voc2012}_data.py 和 dataset/segmentation_dataset.py 来构建新的数据集.
4.3 PASCAL VOC augmented 训练数据集下载
4.4 DenseCRF 问题
DeepLab 没有进行 DenseCRF 处理,可以参考: densecrf.
4.5 模型训练和 BN 参数 fine-tune
如果硬件资源有限,建议采用 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.
4.6 模型训练的同步
在 train.py 中, 可以设置 num_replices参数 - 训练的机器数量,和 num_ps_tasks 参数. 一般设置 num_ps_tasks = num_replicas / 2.
可以查看更多细节 - slim.deployment.model_deploy.
4.7 提供的断点模型的精度复现
可以尝试运行:
sh local_test.sh
或者
sh local_test_mobilenetv2.sh
首先,确保可以根据 DeepLab 提供的设置能够复现结果.
然后,可以试着修改,进行调试.
4.8 eval_crop_size 的选值
DeepLab 采用整张图片进行测试,也就是说,eval_crop_size = output_stride * k + 1.
其中,k 是整数,设置 k 使得 eval_crop_size 稍微大于数据集中图片尺寸的最大值.
例如,对于 PASCAL 数据集,设置 eval_crop_size = 513x513,比图片尺寸 512 稍大.
同样地,所有的图片维度都等于 1024x2048.
继续阅读与本文标签相同的文章
-
新功能初探 | RDS MySQL 8.0 支持 DML 语句 returning
2026-05-18栏目: 教程
-
浅谈分布式计算的开发与实现(二)
2026-05-18栏目: 教程
-
Apache Flink Meetup · 北京站,可能有你最想听的内容!
2026-05-18栏目: 教程
-
在闲鱼实习做Flutter是什么感受?
2026-05-18栏目: 教程
-
阿里云智能--基础产品技术月刊 2019年8月
2026-05-18栏目: 教程
