You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提升水体语义分割效果?新手U-Net模型泛化难题求助

水体语义分割模型泛化性问题求助

我是计算机视觉新手,这是我的第一个项目。用Kaggle水体分割数据集(1888张图)训练U-Net做水体语义分割,模型在测试集表现尚可,但在新图像上预测效果极差,换不同预训练模型表现更差。附上模型代码及测试集、新图像分割结果,求改进方案或问题排查方向。

模型代码

from keras.models import Model
from keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D, concatenate, Conv2DTranspose, BatchNormalization, Dropout, Lambda
from tensorflow.keras.optimizers import Adam
from keras.layers import Activation, MaxPool2D, Concatenate


def conv_block(input, num_filters):
    x = Conv2D(num_filters, 3, padding="same")(input)
    x = BatchNormalization()(x)    
    x = Activation("relu")(x)

    x = Conv2D(num_filters, 3, padding="same")(x)
    x = BatchNormalization()(x)  #Not in the original network
    x = Activation("relu")(x)

    return x


def encoder_block(input, num_filters):
    x = conv_block(input, num_filters)
    p = MaxPool2D((2, 2))(x)
    return x, p   


def decoder_block(input, skip_features, num_filters):
    x = Conv2DTranspose(num_filters, (2, 2), strides=2, padding="same")(input)
    x = Concatenate()([x, skip_features])
    x = conv_block(x, num_filters)
    return x


def build_unet(input_shape, n_classes):
    inputs = Input(input_shape)

    s1, p1 = encoder_block(inputs, 64)
    s2, p2 = encoder_block(p1, 128)
    s3, p3 = encoder_block(p2, 256)
    s4, p4 = encoder_block(p3, 512)

    b1 = conv_block(p4, 1024) #Bridge

    d1 = decoder_block(b1, s4, 512)
    d2 = decoder_block(d1, s3, 256)
    d3 = decoder_block(d2, s2, 128)
    d4 = decoder_block(d3, s1, 64)

    if n_classes == 1:  #Binary
      activation = 'sigmoid'
    else:
      activation = 'softmax'

    outputs = Conv2D(n_classes, 1, padding="same", activation=activation)(d4)  #Change the activation based on n_classes
    print(activation)

    model = Model(inputs, outputs, name="U-Net")
    return model
model = build_unet(input_shape, n_classes=1)
model.compile(optimizer=Adam(learning_rate = 1e-3), loss='binary_crossentropy', metrics=['accuracy'])
model.summary()

分割结果展示

测试集分割结果

测试集分割结果

新图像分割结果

新图像分割结果

问题排查方向与改进方案

  • 数据集分布差异:对比新图像与训练/测试集的场景、光照、分辨率、色彩等特征,若差异过大,需补充同类样本或用数据增强模拟新场景(亮度调整、旋转翻转等)。
  • 预处理一致性:确保新图像和训练时的预处理完全一致,包括尺寸缩放、归一化方式、通道顺序,避免遗漏直方图均衡化等操作。
  • 缓解过拟合:在卷积块或编码器中加入Dropout(0.2-0.5);减少模型滤波器数量(如把1024改为512);增加数据增强多样性(随机裁剪、颜色抖动)。
  • 优化训练策略:降低学习率至1e-4或用学习率衰减;加入Early Stopping防止过拟合;改用IoU、Dice系数作为核心评估指标,替代单一的accuracy。
  • 预训练模型适配:使用预训练模型时,严格遵循其预处理要求;采用先冻结编码器再微调的策略,避免破坏预训练特征。

内容的提问来源于stack exchange,提问作者Rakebun Lucky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:40:32