我正在尝试在 WiSe 数据集( https://cvhci.anthropomatik.kit.edu/~mhaurile/wise/ )上训练DeepLab v3+ 模型( https://github.com/tensorflow/models/research/deeplab/) . 我已经修改了提供的脚本中的参数并开始运行脚本,但即使损失不断减少(从步骤 10 的大约 2.7 到步骤 100 的大约 1.9),我在导出的预测中得到全零检查站。即使在每张火车图像上,我都得到了一个全零的预测。
数据集信息(我已经处理了数据集以满足我的需要):
训练图像:1222
Val 图像:100
总图像:1322
总类:9(包括背景)train.py
类:['background', 'TitleSlide', 'PresTitle', 'ImageCaption', 'Image', 'Code', 'Enumeration', 'Tables', 'Paragraph'] \
我将以下代码添加到datasets/data_generator.py
:
_WISE_SEG_INFORMATION = DatasetDescriptor(
splits_to_sizes={
'train': 1222,
'trainval': 1322,
'val': 100,
},
num_classes=10, # 8 foreground + 1 background + 1 ignore
ignore_label=255,
)
_DATASETS_INFORMATION = {
'cityscapes': _CITYSCAPES_INFORMATION,
'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
'ade20k': _ADE20K_INFORMATION,
'wise_seg': _WISE_SEG_INFORMATION,
}
请注意,在我的数据集中,实际上没有图像具有标签为 255 的任何像素。每个标签都在 [0, 8] 范围内。我也尝试设置num_classes
为9,但没有任何成功。
我的目录结构如下:
deeplab
├── datasets
│ ├── wise_seg
│ │ ├── exp
│ │ │ └── train_on_train_set
│ │ │ ├── eval
│ │ │ ├── export
│ │ │ ├── train
│ │ │ └── vis
│ │ ├── init_models
│ │ │ └── xception
| | | ├── model.ckpt.data-00000-of-00001
| | | └── model.ckpt.index
│ │ ├── tfrecord
│ │ └── WiSe
│ │ ├── Annotations
│ │ ├── ImageSets
│ │ │ └── Segmentation
| | | ├── train.txt
| | | ├── trainval.txt
| | | └── val.txt
│ │ ├── JPEGImages
│ │ ├── SegmentationClass
│ │ └── SegmentationClassRaw
│ └── __pycache__
|------ Other stuff
我用来运行培训的命令:
python ./train.py \
--logtostderr \
--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,513" \
--train_batch_size=16 \
--training_number_of_steps=30000 \
--fine_tune_batch_norm=true \
--tf_initial_checkpoint="./datasets/wise_seg/init_models/xception/model.ckpt" \
--train_logdir="./datasets/wise_seg/train" \
--dataset="wise_seg" \
--initialize_last_layer=false \
--last_layers_contain_logits_only=false \
--dataset_dir="./datasets/wise_seg/tfrecord"
请注意,我已设置initialize_last_layer = False
和last_layers_contain_logits_only = False
。我使用了 ImageNet 预训练的 Xception-65 模型作为骨干网络,我从这里给出的链接下载了它(具体来说,我使用了xception_65_imagenet
)。
我还做了以下更改utils/train_utils.py
:
exclude_list = ['global_step', 'logits']
if not initialize_last_layer:
exclude_list.extend(last_layers)
当我执行训练时,它可以成功进入训练部分,现在已经训练到大约 110 步。我使用以下命令导出了一个中间检查点:
python ./export_model.py \
--logtostderr \
--checkpoint_path="./datasets/wise_seg/exp/train_on_train_set/train/model.ckpt-41" \
--export_path="./datasets/wise_seg/exp/train_on_train_set/export/frozen_inference_graph-41.pb" \
--model_variant="xception_65" \
--atrous_rates=6 \
--atrous_rates=12 \
--atrous_rates=18 \
--output_stride=16 \
--decoder_output_stride=4 \
--num_classes=${3} \
--crop_size=513 \
--crop_size=513 \
--inference_scales=1.0
检查点成功导出。然后我尝试使用此处给出的示例笔记本运行推理。具体来说,当我运行以下部分时,0
会在输出中打印:
graph_path = './datasets/wise_seg/exp/train_on_train_set/export/frozen_inference_graph-41.pb'
MODEL = DeepLabModel(graph_path)
resized_im, seg_map = MODEL.run(Image.open('./datasets/wise_seg/WiSe/JPEGImages/130110-3MQQHISL3D-540_frame11610.jpg'))
print(sum(sum(seg_map)))
任何给定的图像都会发生同样的情况。为什么会这样?任何帮助将不胜感激。