問題の説明:
DeeplabV3 +独自のデータセットを使用する訓練、損失は約0.4ショックされている、テスト0.55(悪い結果)の近傍にMIOU値を設定し、長い時間を投げる、そして最終的には改善された、最も最近計算結果:試験はMIOU> 0.8を設定し、意図していました一緒に明らかにされていません。
参考リンク:
1. https://blog.csdn.net/u011974639/article/details/80948990;
2. https://blog.csdn.net/qq_32799915/article/details/80070711
3. https://github.com/tensorflow/models/issues/3730
データセットの説明:
;標識[256、256、1]、フォーマットをPNG画像[256、256]、[3]、JPG形式:2クラス、前記のデータ。
具体的な変更の手順:
1.画像サイズの変更
スクリプトを記述し、画像サイズは、拡大のように変更されます画像[512、512、3]、標識[512、512、1]。あなたは画像サイズを変更したい理由としては、私は後で説明します。
2. RUNデータセットbuild_voc2012_data.py
.Tfrecordは、データを生成しました。VOC2012データセットの前に正常に実行されているので便宜上、私は、VOC2012データセット内に直接、独自のデータセットを置き換えますVOC2012データセットを実行する方法がわからない場合は、を参照してください。DeeplabV3 + VOC2012トレーニングデータセットを使用します。
3. segmentation_dataset.py下のデータセットを変更します。
私だけ2のようなので、num_classesは2を取るよう、独自のデータセット、データセットに応じて修正します。
_PASCAL_VOC_SEG_INFORMATION = DatasetDescriptor(
splits_to_sizes={
'train': 1689, # 在PASCAL数据集上更改为自己的数据
# 'train_aug': 10582,
# 'trainval': 2913,
'val': 564, # 样本数:1689 + 564 = 2253
},
num_classes=2, # 一共有2类,0:背景 1:**
ignore_label=255, # ignore_label 用来 crop size 做填充的,默认为255
4. train_utils.py utilsパッケージを変更します。
データセットの不均衡ので、重み係数の損失が修正されます。計算後、画素比率PX(0):PX(1)= 15:1、そうlabel0_weight = 1、label1_weight = 15を取ります。
# 训练自己的数据集,针对数据不平衡,此处进行修改
ignore_weight = 0
label0_weight = 1 # 背景的权重系数
label1_weight = 15 # ** 的权重系数
not_ignore_mask = tf.to_float(tf.equal(scaled_labels, 0)) * label0_weight + \
tf.to_float(tf.equal(scaled_labels, 1)) * label1_weight + \
tf.to_float(tf.equal(scaled_labels, ignore_label)) * ignore_weight
tf.losses.softmax_cross_entropy(
one_hot_labels,
tf.reshape(logits, shape=[-1, num_classes]),
weights=not_ignore_mask,
scope=loss_scope)
同時に、たexclude_listを変更します。
exclude_list = ['global_step', 'logits'] # 训练自己的数据集时,此处进行修改
5.変更train.py
自分のコンピュータに応じてパラメータを設定し、私はそれが2 1080tiGPUが含まれているため、2に設定num_clonesここになります。
、BN層を訓練する必要があるメモリが十分に、調節可能なCrop_sizeサイズでない場合は、12を超える値をBATCH_SIZEが、[321、321]未満でない方法Crop_sizeを小さく設定したため、私は、悪い影響していました。
トレーニングがこれまでに完了した後、[256、256]から[321、321]> 0.8から0.55から、モデルMIOU値にCrop_sizeは、依然として最適化です。
python train.py \
--logtostderr \
--num_clones=2 \ # 设置GPU的数量,默认为1
--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=321 \ # 该值最小为[321, 321]
--train_crop_size=321 \
--train_batch_size=12 \
--initialize_last_layer=False \
--last_layers_contain_logits_only=True \
--training_number_of_steps=30000 \
--fine_tune_batch_norm=True \ # 当batch_size大于12时,设置为True
--tf_initial_checkpoint='./weights/deeplabv3_pascal_train_aug/model.ckpt' \
--train_logdir='./checkpoint' \ # 保存训练的中间结果的路径
--dataset_dir='./datasets/tfrecord' # 生成的tfrecord的路径
一度試してみてください。
1.事前研修の重みを変更します。
公式サイトから初期化するために使用されるさまざまな事前研修の重みをダウンロードし、その結果は変わりませんでした。
2. initialize_last_layerの値を変更し、last_layers_contain_logits_only
これらの3例は、結果を少し変え、計算されています。
3. BATCH_SIZEとLearning_rateを調整します
MIOU差が0.1を超えない、輸送手段の最大数は100Kステップを落ち、異なるBATCH_SIZEとlearning_rate値を試してみました。
4. [変更Crop_size
Crop_sizeセットアップ要件:
[321、321] 1未満ではありません
2.(Crop_size - 1)/ 4 =整数
Crop_sizeが[256、256]に設定した画像が小さすぎる場合には、コンボリューションの範囲の大膨張が、それは最小の特徴マップASPP(atrous空間ピラミッドプーリング)モジュール必要としていない場合ので、結果は、良好ではないであろう。初めに、自分の写真を拡大します理由です。
最后一句:
因为一个参数(crop_size)设置错误,导致结果迟迟不理想,想想觉得真的是……
哎……