python - 用于语义分割的 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
解决方案
推荐阅读
- c# - 在匿名方法中获取匿名对象的值
- java - 通过后台删除 hybris 中的动态属性
- c# - 使粒子到达某个位置后消失
- batch-file - 使用 MSBuild 任务 RoboCopy 批量复制项目列表
- ios - Swift 从 URL 获取所有项目
- python - 枕头图像转换
- android - 如何将动态创建的 .xml 文件与主 AndroidManifest.xml 合并
- json - 基于 Azure ARM JSON 的变量标签
- python - Django - 如何根据日期通过 highchart.js 表示帖子应用程序中任何帖子的查看次数
- java - 在异常处理程序中将数据保存到数据库 - Spring