DeepLabのローカルテストを理解していく
以前に動作確認した際に、エラーが出なかったのでOK!で終わってしまったのでローカルテストの内容をザックリ理解する。
local_test.sh
#!/bin/bash
# Copyright 2018 The TensorFlow Authors All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
#
# 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
#
#
L1: bashの使用
L2: コピーライト
L3-14: Apatchライセンス
L17:-18 このスクリプトはPASCAL VOC 2012のローカルテストに使用する。ユーザーはスクリプトを修正できる。
L20-22: 実行方法tensorflow/models/research/deeplabで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
L27: コマンドが0以外のステータスで終了した場合、スクリプトを終了
L30: 親ディレクトリ( tensorflow/models/research )に移動
L33: PYTHONPATHの設定
# 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}"
L36: tensorflow/models/researchをCURRENT_DIRに設定
L37: tensorflow/models/research/deeplabをWORK_DIRに設定
L40: PYTHONPATHの正常確認のためmodel_test.pvを実行
L43: datasetsをDATASET_DIRに設定
L44: tensorflow/models/research/deeplab/datasetsに移動
L45: PASCAL VOC 2012のデータをDLして前処理
L48: tensorflow/models/researchに移動
# 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}"
L51-57: pascal_voc_segと配下のディレクトリ名の設定
L58-62: ディレクトリ作成
# 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}"
L65: DL元フォルダの設定
L66: DL元ファイル名の設定
L67: deeplab/datasets/pascal_voc_seg/init_modelsに移動
L68: 学習済みチェックポイントをDL
L69: DLした学習済みチェックポイントを解凍
L70: tensorflow/models/researchに移動
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}"
L72: deeplab/datasets/pascal_voc_seg/tfrecordをPASCAL_DATASETに設定
L75: NUM_ITERATIONS=10に設定
L76-93: 以下のオプションで学習を実行
logtostderr: ログを標準エラーに出力
train_split: 学習データファイル名。'train_split-*'のパターンになる。
model_variant: ネットワークバックボーン
atrous_rates: Atrous畳み込みのレート?
output_stride: 出力ストライド
decoder_output_stride: デコーダの出力ストライド
train_crop_size: 学習時に画像を水増しするために切り出すサイズ?(縦, 横)学習したモデルを実際に使用する際の画像サイズにも影響。
train_batch_size: バッチサイズ
training_number_of_steps: 学習回数=NUM_ITERATIONS=10
fine_tune_batch_norm: バッチ正規化。GPU節約のためにはfalseにしてバッチサイズを小さくする。
tf_initial_checkpoint: 初期チェックポイントの保存されたディレクトリ
train_logdir: 学習結果出力先ディレクトリ
dataset_dir: データセットの読込ディレクトリ
# 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
L98-112: 以下のオプションで評価を実行(以降、学習と同じものは割愛)
eval_split: 評価データファイル名。'eval_sprit-*'のパターンになる。
eval_crop_size: クロップサイズ(縦, 横)。学習と同値にするべき。
eval_logdir: 評価結果出力先ディレクトリ
max_number_of_evaluations: 評価回数
# 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
L115-129: 以下のオプションで結果の視覚化を実行
vis_split: データファイル名。'vis_split-*'のパターンになる。
vis_crop_size: クロップサイズ(縦, 横)。学習と同値にするべき。
vis_logdir: 視覚化出力先ディレクトリ
max_number_of_iterations: イテレーション回数
# 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
L132: tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-10をCKPT_PATHに設定
L133: tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/export/frozen_inference_graph.pbをEXPORT_PATHに設定
L135-148: 以下のオプションでモデルのエクスポートを実行
checkpoint_path: エクスポート元のチェックポイントのパス
export_path: 出力ファイルのパス
num_classes: 識別するタグの数=ラベルの数
crop_size: クロップサイズ(縦, 横)。学習と同値にするべき。
inference_scales: 推論スケール。1.0だと単一スケール推論で高速のはず。
感想
・自分でモデルを作成する場合、このスクリプトをいじるだけでよい。
・TFrecord形式でデータセットを作成して、dataset_dirで与える。
・作成したモデルに与える画像のサイズによってクロップサイズは変えた方がよい。
・モバイル向けの場合、model_variantを'MobileNet-v2'にしてatrous_ratesはなしにする。