首页 > 解决方案 > 用于语义分割的 Keras 上的 MeanIoU 实现

问题描述

我正在尝试使用类似 U-Net 的架构来实现语义分割的 MeanIoU 度量,但是随着训练的发展,损失减少并且准确性增加,MeanIoU 几乎保持不变。问题是二进制分类,模型的输出层输出 0 到 1 之间的值的预测图,而不是二进制掩码。

m=64
img_dim = (m, m, 1)

#MODEL DEFINITION
#CONTRACTION PATH
#Conv block 1
inputs= Input(img_dim)
c1 = Conv2D(4, (3,3), activation ="relu", padding="SAME")(inputs)
#c1 = Dropout(0.1)(c1)
c1 = Conv2D(4, (3,3), activation ="relu", padding="SAME")(c1)
p1 = MaxPooling2D((2,2))(c1)
#Conv block 2
c2 = Conv2D(8, (3,3), activation ="relu", padding="SAME")(p1)
#c2 = Dropout(0.1)(c2)
c2 = Conv2D(8, (3,3), activation ="relu", padding="SAME")(c2)
p2 = MaxPooling2D((2,2))(c2)
#Conv block 3
c3 = Conv2D(16, (3,3), activation ="relu", padding="SAME")(p2)
#c3 = Dropout(0.5)(c3)
c3 = Conv2D(16, (3,3), activation ="relu", padding="SAME")(c3)
p3 = MaxPooling2D((2,2))(c3)
#Conv block 4
c4 = Conv2D(32, (3,3), activation ="relu", padding="SAME")(p3)
#c4 = Dropout(0.1)(c4)
c4 = Conv2D(32, (3,3), activation ="relu", padding="SAME")(c4)
p4 = MaxPooling2D((2,2))(c4)
#Conv block 5
c5 = Conv2D(64, (3,3), activation ="relu", padding="SAME")(p4)
#c5 = Dropout(0.1)(c5)
c5 = Conv2D(64, (3,3), activation ="relu", padding="SAME")(c5)


#EXPANSIVE PATH
#UpSampling block 1
s = (2,2)
u6 = Conv2DTranspose(32, (2,2), strides=s, padding="SAME")(c5)
u6 = concatenate([u6, c4])
c6 = Conv2D(32, (3,3), activation ="relu", padding="SAME")(u6)
#c6 = Dropout(0.1)(c6)
c6 = Conv2D(32, (3,3), activation ="relu",  padding="SAME")(c6)
#UpSampling block 2
u7 = Conv2DTranspose(16, (2,2), strides=s, padding="SAME")(c6)
u7 = concatenate([u7, c3])
c7 = Conv2D(16, (3,3), activation ="relu",  padding="SAME")(u7)
#c7 = Dropout(0.1)(c7)
c7 = Conv2D(16, (3,3), activation ="relu",  padding="SAME")(c7)
#UpSampling block 3
u8 = Conv2DTranspose(8, (2,2), strides=s, padding="SAME")(c7)
u8 = concatenate([u8, c2])
c8 = Conv2D(8, (3,3), activation ="relu",  padding="SAME")(u8)
#c8 = Dropout(0.1)(c8)
c8 = Conv2D(8, (3,3), activation ="relu",  padding="SAME")(c8)
#UpSampling block 4
u9 = Conv2DTranspose(8, (2,2), strides=s, padding="SAME")(c8)
u9 = concatenate([u9, c1])
c9 = Conv2D(4, (3,3), activation ="relu",  padding="SAME")(u9)
#c9 = Dropout(0.1)(c9)
c9 = Conv2D(4, (3,3), activation ="relu", padding="SAME")(c9)

outputs = Conv2D(1, (1,1), activation = "sigmoid")(c9)

UNet = tf.keras.Model(inputs=[inputs], outputs=[outputs])

UNet.compile(
    optimizer="Adam",
    loss="binary_crossentropy", 
    metrics=["accuracy", tf.keras.metrics.MeanIoU(num_classes=2)])

这是训练日志:

loss: 0.6478 - accuracy: 0.7090 - mean_io_u_4432: 0.3554
loss: 0.6002 - accuracy: 0.7137 - mean_io_u_4432: 0.3568
loss: 0.5776 - accuracy: 0.7144 - mean_io_u_4432: 0.3572
loss: 0.5440 - accuracy: 0.7151 - mean_io_u_4432: 0.3575
loss: 0.5230 - accuracy: 0.7116 - mean_io_u_4432: 0.3552
loss: 0.5053 - accuracy: 0.7617 - mean_io_u_4432: 0.3556
loss: 0.4750 - accuracy: 0.7843 - mean_io_u_4432: 0.3557
loss: 0.4769 - accuracy: 0.7645 - mean_io_u_4432: 0.3577
loss: 0.4458 - accuracy: 0.7903 - mean_io_u_4432: 0.3572
loss: 0.3988 - accuracy: 0.8258 - mean_io_u_4432: 0.3568
loss: 0.3829 - accuracy: 0.8329 - mean_io_u_4432: 0.3575
loss: 0.3713 - accuracy: 0.8400 - mean_io_u_4432: 0.3576
loss: 0.3560 - accuracy: 0.8501 - mean_io_u_4432: 0.3566
loss: 0.3529 - accuracy: 0.8509 - mean_io_u_4432: 0.3580
loss: 0.3362 - accuracy: 0.8621 - mean_io_u_4432: 0.3580
loss: 0.3262 - accuracy: 0.8663 - mean_io_u_4432: 0.3565
loss: 0.3165 - accuracy: 0.8728 - mean_io_u_4432: 0.3565
loss: 0.3153 - accuracy: 0.8720 - mean_io_u_4432: 0.3577
loss: 0.3178 - accuracy: 0.8693 - mean_io_u_4432: 0.3555
loss: 0.2937 - accuracy: 0.8859 - mean_io_u_4432: 0.3567

标签: pythontensorflowkerasdeep-learningimage-segmentation

解决方案


推荐阅读