我正在通过在三个类别(包括背景)中创建自定义数据来训练 Deeplab v3
然后,我的课是背景,熊猫,瓶子,上面有1949张图片。
并且我正在使用 moblienetv2 模型
和 segmentation_dataset.py 已被修改如下。
_MYDATA_INFORMATION = DatasetDescriptor(
splits_to_sizes={
'train': 975, # num of samples in images/training
'trainval': 1949,
'val': 974, # num of samples in images/validation
},
num_classes=3,
ignore_label=0,
)
train.py 已作如下修改。
flags.DEFINE_boolean('initialize_last_layer', False,
'Initialize the last layer.')
flags.DEFINE_boolean('last_layers_contain_logits_only', True,
'Only consider logits as last layers or not.')
train_utils.py 尚未修改。
not_ignore_mask = tf.to_float(tf.not_equal(scaled_labels, ignore_label)) * loss_weight
我得到一些结果,但不是完美的结果。
例如,熊猫和瓶子的口罩颜色相同或不同
我想要的结果是红色的熊猫和绿色的瓶子
所以,我判断重量有问题。
根据其他人的问题, train_utils.py 的配置如下
irgore_weight = 0
label0_weight =1
label1_weight = 10
label2_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, 2)) * label2_weight +
tf.to_float(tf.equal(scaled_labels, ignore_label)) * irgore_weight
tf.losses.softmax_cross_entropy(
one_hot_labels,
tf.reshape(logits, shape=[-1, num_classes]),
weights=not_ignore_mask,
scope=loss_scope)
我在这里有个问题。
体重的标准是什么?
我的数据集包含以下内容。
它是自动生成的,所以我不确切知道哪一个是更多,但是数量差不多。
另外,我正在使用Pascal的颜色图类型。
这是第一个黑色背景,第二个红色第三绿色。
我想将熊猫准确地指定为红色,将瓶子准确地指定为绿色。我该怎么办?
答案 0 :(得分:0)
我认为您可能混淆了标签定义。也许我可以帮您。请再次检查您的 segmentation_dataset.py 。在此,将“ 0”定义为忽略标签。这意味着从训练过程中排除所有标记为“ 0”的像素(更具体地说,在损失函数的计算中排除所有像素,因此对权重的更新没有影响)。鉴于这种情况,至关重要的是不要“忽略”背景类,因为它也是您要正确预测的类。在 train_utils.py 中,将加权因子分配给无效的类-->确保不要将三个训练类[背景,panada,瓶子]与“忽略”标签。
在您的情况下, num_classes = 3应该是正确的,因为它指定了要预测的标签数(模型自动假定这些标签为0、1和2。如果要忽略某些标签,则可以必须使用第四个标签类为它们添加注释(为此选择一个数字> 2),然后将此标签分配给ignore_label。如果您没有要忽略的像素,请设置 ignored_label = 255,然后不会影响您的训练;)