如何改进U-Net分割OCT图像时含噪声的预测结果?
U-Net OCT分割降噪优化方案
当前20组小样本训练下出现散点噪声,是小样本分割场景的典型问题,按落地优先级可采取以下可直接复现的优化措施:
零成本快速修复(无需新增标注)
- 替换损失函数:弃用纯
binary_crossentropy。OCT分割的目标层区域占整图比例通常低于10%,纯BCE会被占绝大多数的背景像素主导,模型倾向于误判低置信度背景为前景。直接替换为BCE+Dice组合损失,同时兼顾像素级分类准确率和分割区域重合度,对类别不均衡场景适配性极强,替换代码如下:
# 定义组合损失 def bce_dice_loss(y_true, y_pred): bce_loss = tf.keras.losses.binary_crossentropy(y_true, y_pred) smooth = 1e-6 y_true_flat = tf.keras.backend.flatten(y_true) y_pred_flat = tf.keras.backend.flatten(y_pred) intersection = tf.keras.backend.sum(y_true_flat * y_pred_flat) dice_coef = (2. * intersection + smooth) / (tf.keras.backend.sum(y_true_flat) + tf.keras.backend.sum(y_pred_flat) + smooth) return 0.5 * bce_loss + 0.5 * (1 - dice_coef) # 模型编译时替换损失,同时增加IoU作为核心评估指标 model.compile( optimizer=tf.keras.optimizers.Adam(learning_rate=1e-4), loss=bce_dice_loss, metrics=[ 'accuracy', tf.keras.metrics.MeanIoU(num_classes=2, name='miou') ] )
- 调整推理逻辑:sigmoid输出的概率图不要默认用0.5作为二值化阈值,从现有训练集划5张当验证集,遍历0.3-0.9的阈值区间,选验证集上MiOU最高的阈值(医学薄结构分割通常在0.6-0.7区间),可直接滤除大部分低置信度散点。
- 添加轻量后处理:二值化后用3x3卷积核做形态学开运算(先腐蚀后膨胀),再过滤所有面积小于阈值的孤立连通域、仅保留和主目标连通的区域,这一步在小样本场景下可消除90%以上的离散噪声点,且不会破坏主目标结构。
- 修正训练正则策略:当前模型底层Dropout设为0.3,20组小样本下过高的Dropout会导致特征学习不稳定,将所有卷积层的Dropout比例统一调整为0.1;训练时添加早停回调,监控验证集MiOU指标,patience设为5,自动恢复验证集最优权重,避免过拟合。
现有数据挖掘优化(无需专家新标注)
- 做适配OCT场景的数据增强:OCT图像为规则分层结构,禁止使用大角度旋转、垂直翻转、随机裁剪这类破坏层语义的增强,仅使用以下同步作用于图像和掩码的增强操作,将训练集规模扩充8-10倍:
- 水平翻转
- ±10%范围内的亮度/对比度随机扰动
- ±5%图像高度范围内的垂直平移
- 添加测试时增强(TTA):推理时对同一张测试图分别做原图、水平翻转、轻微亮度调整三次预测,将三次预测的概率图取平均后再做二值化,可进一步降低随机预测噪声。
后续扩量后的优化方向
等专家标注数据量达到100组以上后,可进一步做两点优化:
- 将编码器替换为ImageNet预训练的ResNet18/ResNet34做迁移学习,大幅提升特征提取稳定性和泛化性
- 在现有损失基础上添加边界损失,优化目标区域边缘分割精度,减少边缘毛刺
内容的提问来源于stack exchange,提问作者DumboTheMighty
相关产品推荐
相关产品推荐

