为啥 DeepLabV3+ 生成的所有图像都只变成黑色?

Posted

技术标签:

【中文标题】为啥 DeepLabV3+ 生成的所有图像都只变成黑色?【英文标题】:Why do all images resulting by DeepLabV3+ become black only?为什么 DeepLabV3+ 生成的所有图像都只变成黑色? 【发布时间】:2019-04-23 14:44:07 【问题描述】:

我尝试使用 DeepLab v3+ 进行语义分割,但结果全黑。

我把原来的文件删掉了,把原来的数据放到ImageSets/,JPEGImages/和SegmentationClass/各自对应的里面。

我根据PASCAL VOC 2012颜色的规则准备了SegmentationClassRaw图像。

我编辑了 build_voc2012_data.py 和 segmentation_dataset.py

[build_voc2012_data.py]

FLAGS = tf.app.flags.FLAGS

tf.app.flags.DEFINE_string('image_folder',
                           './VOCdevkit/VOC2012/JPEGImages',
                           'Folder containing images.')

tf.app.flags.DEFINE_string(
    'semantic_segmentation_folder',
    './VOCdevkit/VOC2012/SegmentationClassRaw',
    'Folder containing semantic segmentation annotations.')

tf.app.flags.DEFINE_string(
    'list_folder',
    './VOCdevkit/VOC2012/ImageSets/Segmentation',
    'Folder containing lists for training and validation')

tf.app.flags.DEFINE_string(
    'output_dir',
    './tfrecord',
    'Path to save converted SSTable of TensorFlow examples.')


_NUM_SHARDS = 4

# add -->>
FLAGS.image_folder = "./pascal_voc_seg/VOCdevkit/VOC2012/JPEGImages"
FLAGS.semantic_segmentation_folder = "./pascal_voc_seg/VOCdevkit/VOC2012/SegmentationClassRaw"
FLAGS.list_folder = "./pascal_voc_seg/VOCdevkit/VOC2012/ImageSets/Segmentation"
FLAGS.image_format = "png"
FLAGS.output_dir = "./pascal_voc_seg/tfrecord"
# add --<<

[segmentation_dataset.pu]

# add kani 20181115 -->>
_ORIGINAL_INFORMATION = DatasetDescriptor(
    splits_to_sizes=
        'train': 10,
        'trainval': 2,
        'val': 2,
    ,
    num_classes=5,
    ignore_label=255,
)
#add kani 20181115 --<<

# mod kani 20181115 -->>
# _DATASETS_INFORMATION = 
#     'cityscapes': _CITYSCAPES_INFORMATION,
#     'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
#     'ade20k': _ADE20K_INFORMATION,
# 

_DATASETS_INFORMATION = 
    'cityscapes': _CITYSCAPES_INFORMATION,
    'pascal_voc_seg': _PASCAL_VOC_SEG_INFORMATION,
    'ade20k': _ADE20K_INFORMATION,
    'original': _ORIGINAL_INFORMATION,

# mod kani 20181115 --<<

我像这样运行 train.py 和 vis.py。

[train.py 命令]

python train.py   --logtostderr   --train_split=trainval   --model_variant=xception_65   --atrous_rates=3   --atrous_rates=6   --atrous_rates=9   --output_stride=32   --decoder_output_stride=4   --train_crop_size=512   --train_crop_size=512   --train_batch_size=2   --training_number_of_steps=6000   --fine_tune_batch_norm=false   --tf_initial_checkpoint="./datasets/pascal_voc_seg/init_models/deeplabv3_pascal_train_aug/model.ckpt"  --train_logdir="./datasets/pascal_voc_seg/exp/train_on_trainval_set/train"  --dataset_dir="./datasets/pascal_voc_seg/tfrecord" --dataset=original

[vis.py 命令]

python 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="./datasets/pascal_voc_seg/exp/train_on_trainval_set/train"   --vis_logdir="./datasets/pascal_voc_seg/exp/train_on_trainval_set/vis"  --dataset_dir="./datasets/pascal_voc_seg/tfrecord"   --max_number_of_iterations=1   --dataset=original   --max_resize_value=512   --min_resize_value=128

两者都没有问题,但我确认了datasets/pascal_voc_seg/exp/train_on_trainval_set/vis/raw_segmentation_results/中的图片,这些都是黑色的。为什么?

这是因为火车数据大于 512x512 吗? (训练数据量这么大:大约15000x13500)

[构建我的目录]

/tmp/models/research/deeplab  
-README.md  
-common.py  
-datasets/  
--__init__.py  
--build_data.py  
--convert_cityscapes.sh  
--pascal_voc_seg/  
---VOCdevkit/  
----VOC2012/  
-----Annotations/  
-----ImageSets/  
-----JPEGImages/  
-----SegmentationClass/  
-----SegmentationObject/  
---VOCtrainval_11-May-2012.tar  
---exp/  
----train_on_trainval_set/  
-----train/  
------train.py  
-----vis/  
------vis.py  
---init_models/  
----deeplabv3_pascal_train_aug/  
-----frozen_inference_graph.pb  
-----model.ckpt.data-00000-of-00001  
-----model.ckpt.index  
---tfrecord/  
----build_voc_2012.py  
--__pycache__  
--build_data.pyc  
--download_and_convert_ade20k.sh  
--remove_gt_colormap.py  
--build_ade20k_data.py  
--build_voc2012_data.py  
--download_and_convert_voc2012.sh  
--segmentation_dataset.py  
--build_cityscapes_data.py  
--build_voc2012_data.py.org  
-export_model.py  
-local_test.sh  
-model_test.py  
-utils/  
-__init__.py  
-common_test.py  
-deeplab_demo.ipynb  
-g3doc/  
-local_test_mobilenetv2.sh  
-train.py  
-vis.py  
-__pycache__  
-core/  
-eval.py  
-input_preprocess.py  
-model.py  
-train.py.bk  

【问题讨论】:

您确定用于训练的图像尺寸是 15000x13500 吗?根据我的经验,这么大的图像将需要大量的计算时间。你用多少这样的图像来训练网络? 嘿@y_kani,如果您能告诉我您要对哪个数据集执行语义分割,我可以为您提供帮助? 【参考方案1】:

假设您没有尝试将模型用于某些奇异类,我猜图像实际上并非全黑。这是因为您正在查看原始分割结果。输出应该只有一个颜色通道,并且对于您的 5 个类,它可能显示为全黑。一个简单的测试是将输出 PNG 作为 numpy 数组读取,然后使用 np.unique 检查图像的值。如果确实所有 PNG 文件的结果都只是 0,那么您看到黑色图像的原因可能会有所不同。

请注意,我做出上述假设是因为您使用的训练数据非常少。

【讨论】:

以上是关于为啥 DeepLabV3+ 生成的所有图像都只变成黑色?的主要内容,如果未能解决你的问题,请参考以下文章

DeepLabv3 +分割图像边界

DeepLabv3+图像语义分割实战:训练自己的数据集

语义图像分割 NN (DeepLabV3+) 的内存过多问题

DeepLabV3,珊瑚的分割和分类/检测

人工智能必须要知道的语义分割模型:DeepLabv3+

为啥 STM32CubeIDE 有 2 个生成的链接器脚本?