自作データセットでdeeplabの学習テスト

前回作成したデータセットを使用して、モバイル向けを想定した学習をテストしていく。

local_test.shの編集

local_test.sh をコピーして以下の箇所を編集。

# sh download_and_convert_voc2012.sh

L45: 今回は事前にデータセットを自作してDL・変換は不要なのでコメントアウト。

# wget -nd -c "${TF_INIT_ROOT}/${TF_INIT_CKPT}"
# tar -xf "${TF_INIT_CKPT}"

L68-69: 以前テストした際に取得済のためコメントアウト。

NUM_ITERATIONS=100
python "${WORK_DIR}"/train.py \
 --logtostderr \
 --train_split="trainval" \
 --model_variant="mobilenet_v2" \
 --output_stride=16 \
 --decoder_output_stride=4 \
 --train_crop_size=753 \
 --train_crop_size=753 \
 --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}" \

train.pvに与える学習用パラメータを変更。
L75: 学習回数。適当に100に変更。
L78: 学習用データセットのファイル名。今回はそのまま。
L79: モデルの種類。モバイル向けに"mobilenet_v2"に変更。
L80-82: Atrous畳み込みのレート。mobilenet_v2の場合削除。
L83: 出力用ストライド。とりあえずそのまま。
L84: デコーダの出力ストライド。これもとりあえずそのまま。
L85-86: 画像の切り出しサイズ。(縦, 横)。とりあえずiPhone8想定で753に変更。
L87: バッチサイズ。とりあえずそのまま。
L89: バッチ正規化。GPUないのでtrueのまま。
L90-92: ディレクトリ周り。今回はそのまま。

  --initialize_last_layer=false \
  --last_layers_contain_logits_only=false \
  --dataset="tmp"

train.pvのパラメータに以下を追加。
initialize_last_layer: チェックポイントの引き継ぎ。falseを指定。(不要?)
last_layers_contain_logits_only: logitsの考慮。falseを指定。(不要?)
dataset: データセット名。自作なので"tmp"を指定。(後でtmpを定義する)

python "${WORK_DIR}"/eval.py \
 --logtostderr \
 --eval_split="val" \
 --model_variant="mobilenet_v2" \
 --output_stride=16 \
 --decoder_output_stride=4 \
 --eval_crop_size=753 \
 --eval_crop_size=753 \
 --checkpoint_dir="${TRAIN_LOGDIR}" \
 --eval_logdir="${EVAL_LOGDIR}" \
 --dataset_dir="${PASCAL_DATASET}" \
 --max_number_of_evaluations=1 \

eval.pvに与えるパラメータを変更。
L99: 評価用データセットのファイル名。今回はそのまま。
L100: モデルの種類。train.pvに合わせる。
L101-103: Atrous畳み込みのレート。train.pvに合わせる。
L104: 出力用ストライド。train.pvに合わせる。
L105: デコーダの出力ストライド。train.pvに合わせる。
L106-107: 画像の切り出しサイズ。train.pvに合わせる。
L108-110: ディレクトリ周り。今回はそのまま。
L111: 評価の繰り返し回数。変更不要。

  --dataset="tmp"

eval.pvのパラメータに以下を追加。
dataset: データセット名。自作なので"tmp"を指定。

python "${WORK_DIR}"/vis.py \
 --logtostderr \
 --vis_split="val" \
 --model_variant="mobilenet_v2" \
 --output_stride=16 \
 --decoder_output_stride=4 \
 --vis_crop_size=753 \
 --vis_crop_size=753 \
 --checkpoint_dir="${TRAIN_LOGDIR}" \
 --vis_logdir="${VIS_LOGDIR}" \
 --dataset_dir="${PASCAL_DATASET}" \
 --max_number_of_iterations=1 \

vis.pvに与えるパラメータを変更。
L116: 評価用データセットのファイル名。eval.pvに合わせる。
L117: モデルの種類。train.pvに合わせる。
L118-120: Atrous畳み込みのレート。train.pvに合わせる。
L121: 出力用ストライド。eval.pvに合わせる。
L122: デコーダの出力ストライド。eval.pvに合わせる。
L123-124: 画像の切り出しサイズ。train.pvに合わせる。
L125-127: ディレクトリ周り。今回はそのまま。
L128: 視覚化の繰り返し回数。変更不要。

  --dataset="tmp"

vis.pvのパラメータに以下を追加。
dataset: データセット名。自作なので"tmp"を指定。

python "${WORK_DIR}"/export_model.py \
 --logtostderr \
 --checkpoint_path="${CKPT_PATH}" \
 --export_path="${EXPORT_PATH}" \
 --model_variant="mobilenet_v2" \
 --output_stride=16 \
 --decoder_output_stride=4 \
 --num_classes=6 \
 --crop_size=753 \
 --crop_size=753 \
 --inference_scales=1.0

export_model.pyに与えるパラメータを変更。
L136-137: ディレクトリ周り。今回はそのまま。
L138: モデルの種類。train.pvに合わせる。
L139-141: Atrous畳み込みのレート。train.pvに合わせる。
L142: 出力用ストライド。train.pvに合わせる。
L143: デコーダの出力ストライド。train.pvに合わせる。
L144: クラス数(識別物体数)。自作のデータセットに合わせて6に変更。
L145-146: 画像の切り出しサイズ。train.pvに合わせる。
L147: 推論スケール。とりあえずそのまま。

データセットの定義

datasets/segmentation_dataset.py を編集して以下の箇所を編集。

_TMP_INFORMATION = DatasetDescriptor(
   splits_to_sizes={
       'train': 50,
       'trainval': 70,
       'val': 20,
   },
   num_classes=6,
   ignore_label=255,
)

L111: データセット定義を追加する。
local_test.shを編集するならsplits_to_sizesは'train','trainval','val'の3つでよいはず。
num_classesはexport_modelのnum_classesと合わせる。
ignore_labelは255でよいはず。

_DATASETS_INFORMATION = {
   'cityscapes': _CITYSCAPES_INFORMATION,
   'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
   'ade20k': _ADE20K_INFORMATION,
   'tmp': _TMP_INFORMATION,
}

L112-116: データセット名の定義。任意の文字列を追加(local_test.shで追加したパラメータと合わせる)

ログディレクトリの整理

以下フォルダの中を空にする。

datasets/pascal_voc_seg/exp/train_on_trainval_set/eval
datasets/pascal_voc_seg/exp/train_on_trainval_set/export
datasets/pascal_voc_seg/exp/train_on_trainval_set/train
datasets/pascal_voc_seg/exp/train_on_trainval_set/vis

WARNING対応

試しに実行したら警告が出たので対応していく。

Instructions for updating

WARNING:tensorflow:From (略) is deprecated and will be removed in a future version.
Instructions for updating:

TensorFlowで使用している機能が将来的にPythonで廃止されるのでアップデートせよ的なお知らせ。
気になるならTensorFlowをアップデートすることである程度は解消するが、1.9にアップデートしても警告0にはならなかったので気にしないでよい。

missing in checkpoint

WARNING:tensorflow:Variable MobilenetV2/ (略) missing in checkpoint

保存してあるチェックポイントにMobilenetV2の変数が見つからない。
パラメータで指定するモデルにMobilenetV2を指定したのにXcpetionの初期チェックポイントを読んでいるのが原因。

wget -nd -c http://download.tensorflow.org/models/deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz
tar -xf deeplabv3_mnv2_pascal_train_aug_2018_01_29.tar.gz 

local_test_mobilenetv2.shを参考に初期チェックポイントをDL・解凍。
train.pvに与えるパラメータtf_initial_checkpointを修正。

実行結果

testBuildDeepLabWithDensePredictionCell (__main__.DeeplabModelTest) ... 2019-08-06 22:37:09.223860: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-08-06 22:37:09.224471: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
ok
testBuildDeepLabv2 (__main__.DeeplabModelTest) ... ok
testForwardpassDeepLabv3plus (__main__.DeeplabModelTest) ... ok
testWrongDeepLabVariant (__main__.DeeplabModelTest) ... ok
test_session (__main__.DeeplabModelTest)
Returns a TensorFlow Session for use in executing tests. ... ok

----------------------------------------------------------------------
Ran 5 tests in 40.297s

OK
INFO:tensorflow:Training on trainval set
INFO:tensorflow:Initializing model from path: /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/init_models/deeplabv3_mnv2_pascal_train_aug/model.ckpt-30000
WARNING:tensorflow:From /anaconda3/envs/deeplabnomkl_mytraning_update/lib/python3.6/site-packages/tensorflow/contrib/slim/python/slim/learning.py:737: Supervisor.__init__ (from tensorflow.python.training.supervisor) is deprecated and will be removed in a future version.
Instructions for updating:
Please switch to tf.train.MonitoredTrainingSession
2019-08-06 22:38:07.409344: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-08-06 22:38:07.409549: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
INFO:tensorflow:Restoring parameters from /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/init_models/deeplabv3_mnv2_pascal_train_aug/model.ckpt-30000
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Starting Session.
INFO:tensorflow:Saving checkpoint to path /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt
INFO:tensorflow:Starting Queues.
INFO:tensorflow:global_step/sec: 0
INFO:tensorflow:Recording summary at step 0.
INFO:tensorflow:global_step/sec: 0.0116928
INFO:tensorflow:Recording summary at step 7.
INFO:tensorflow:global step 10: loss = 1.8829 (65.212 sec/step)
INFO:tensorflow:Saving checkpoint to path /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt
INFO:tensorflow:global_step/sec: 0.0166631
INFO:tensorflow:Recording summary at step 18.
INFO:tensorflow:global step 20: loss = 1.8518 (59.254 sec/step)
INFO:tensorflow:global_step/sec: 0.0200046
INFO:tensorflow:Recording summary at step 29.
INFO:tensorflow:global step 30: loss = 1.8234 (56.182 sec/step)
INFO:tensorflow:global step 40: loss = 1.7341 (49.373 sec/step)
INFO:tensorflow:Saving checkpoint to path /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt
INFO:tensorflow:global_step/sec: 0.0199862
INFO:tensorflow:Recording summary at step 41.
INFO:tensorflow:global step 50: loss = 1.7660 (45.447 sec/step)
INFO:tensorflow:global_step/sec: 0.018346
INFO:tensorflow:Recording summary at step 52.
INFO:tensorflow:global step 60: loss = 1.7412 (52.092 sec/step)
INFO:tensorflow:Saving checkpoint to path /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt
INFO:tensorflow:global_step/sec: 0.0183332
INFO:tensorflow:Recording summary at step 63.
INFO:tensorflow:global step 70: loss = 1.7237 (51.025 sec/step)
INFO:tensorflow:global_step/sec: 0.018328
INFO:tensorflow:Recording summary at step 74.
INFO:tensorflow:global step 80: loss = 1.6865 (47.623 sec/step)
INFO:tensorflow:Saving checkpoint to path /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt
INFO:tensorflow:global_step/sec: 0.0183387
INFO:tensorflow:Recording summary at step 85.
INFO:tensorflow:global step 90: loss = 1.6959 (47.418 sec/step)
INFO:tensorflow:global_step/sec: 0.0166667
INFO:tensorflow:Recording summary at step 96.
INFO:tensorflow:global step 100: loss = 1.7856 (46.314 sec/step)
INFO:tensorflow:Stopping Training.
INFO:tensorflow:Finished training! Saving model to disk.
INFO:tensorflow:Evaluating on val set
INFO:tensorflow:Performing single-scale test.
INFO:tensorflow:Eval num images 20
INFO:tensorflow:Eval batch size 1 and num batch 20
INFO:tensorflow:Waiting for new checkpoint at /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train
INFO:tensorflow:Found new checkpoint at /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-100
INFO:tensorflow:Graph was finalized.
2019-08-07 00:12:37.972983: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-08-07 00:12:37.973204: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
INFO:tensorflow:Restoring parameters from /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-100
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Starting evaluation at 2019-08-06-15:12:40
INFO:tensorflow:Evaluation [2/20]
INFO:tensorflow:Evaluation [4/20]
INFO:tensorflow:Evaluation [6/20]
INFO:tensorflow:Evaluation [8/20]
INFO:tensorflow:Evaluation [10/20]
INFO:tensorflow:Evaluation [12/20]
INFO:tensorflow:Evaluation [14/20]
INFO:tensorflow:Evaluation [16/20]
INFO:tensorflow:Evaluation [18/20]
INFO:tensorflow:Evaluation [20/20]
INFO:tensorflow:Finished evaluation at 2019-08-06-15:13:28
miou_1.0[0.0696081]
INFO:tensorflow:Visualizing on val set
INFO:tensorflow:Performing single-scale test.
WARNING:tensorflow:From /Users/yogo/tensorflow/models/research/deeplab/vis.py:270: Supervisor.__init__ (from tensorflow.python.training.supervisor) is deprecated and will be removed in a future version.
Instructions for updating:
Please switch to tf.train.MonitoredTrainingSession
INFO:tensorflow:Waiting for new checkpoint at /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train
INFO:tensorflow:Found new checkpoint at /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-100
INFO:tensorflow:Starting visualization at 2019-08-06-15:13:36
INFO:tensorflow:Visualizing with model /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-100
2019-08-07 00:13:36.561572: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-08-07 00:13:36.561758: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
INFO:tensorflow:Running local_init_op.
INFO:tensorflow:Done running local_init_op.
INFO:tensorflow:Restoring parameters from /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-100
INFO:tensorflow:Visualizing batch 1 / 20
INFO:tensorflow:Visualizing batch 2 / 20
INFO:tensorflow:Visualizing batch 3 / 20
INFO:tensorflow:Visualizing batch 4 / 20
INFO:tensorflow:Visualizing batch 5 / 20
INFO:tensorflow:Visualizing batch 6 / 20
INFO:tensorflow:Visualizing batch 7 / 20
INFO:tensorflow:Visualizing batch 8 / 20
INFO:tensorflow:Visualizing batch 9 / 20
INFO:tensorflow:Visualizing batch 10 / 20
INFO:tensorflow:Visualizing batch 11 / 20
INFO:tensorflow:Visualizing batch 12 / 20
INFO:tensorflow:Visualizing batch 13 / 20
INFO:tensorflow:Visualizing batch 14 / 20
INFO:tensorflow:Visualizing batch 15 / 20
INFO:tensorflow:Visualizing batch 16 / 20
INFO:tensorflow:Visualizing batch 17 / 20
INFO:tensorflow:Visualizing batch 18 / 20
INFO:tensorflow:Visualizing batch 19 / 20
INFO:tensorflow:Visualizing batch 20 / 20
INFO:tensorflow:Finished visualization at 2019-08-06-15:14:06
INFO:tensorflow:Prepare to export model to: /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/export/frozen_inference_graph.pb
INFO:tensorflow:Exported model performs single-scale inference.
2019-08-07 00:18:43.779666: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
2019-08-07 00:18:43.779901: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 4. Tune using inter_op_parallelism_threads for best performance.
INFO:tensorflow:Restoring parameters from /Users/yogo/tensorflow/models/research/deeplab/datasets/pascal_voc_seg/exp/train_on_trainval_set/train/model.ckpt-100
INFO:tensorflow:Froze 297 variables.
INFO:tensorflow:Converted 297 variables to const ops.
(deeplabnomkl_mytraning_update) bash-3.2$ 

miou(精度は)約0.07。低い!学習回数が少ないのでこんなものか?

視覚化された結果。
左が入力画像、真ん中がお手本、右が実際の結果。何だろうこれは…?髪の毛の輪郭等を見るとそれなりに正しい箇所もあるが、2クラスしか抽出されていないのが気になる。
データセット数と学習回数で改善するか?

雑感

結果が怪しいのでGPU環境に移して学習回数を増やしてみるつもり。

モバイル向けとわかっていたので、local_test_mobilenetv2.shをベースにするべきだった。

eval.pvのmax_number_of_evaluationsを評価対象のデータセット数と勘違いして20に変更したところ、無限ループ発生。
ラベル画像の作成に失敗していてクラス数が合わずにエラーが発生。これについては別途まとめる。

精度を上げて実用レベルまで持っていきたいので今後はデータセットの作成手法を勉強する必要があり。3Dモデルから効率よく作成できないか先行事例を探してみようと思う。 ■


この記事が気に入ったらサポートをしてみませんか?