《U-Net: Convolutional Networks for Biomedical Image Segmentation》学习笔记

本文介绍了U-Net网络模型,一种适用于小数据集的快速图像分割模型,尤其在生物医学图像领域表现出色。U-Net结构独特,采用下采样增加特征通道,上采样融合浅层特征,有效处理图像边缘信息。在训练过程中,通过像素级损失函数和形态学运算优化边界分割,并利用数据增强提升模型泛化能力。

1. 总述

在15年的文章:《U-Net: Convolutional Networks for Biomedical Image Segmentation》中提出了一种基于少量数据进行训练的网络的模型,得到了不错的分割精度,并且网络的速度很快。对于分割一副512*512大小的图像只需要不到1s的时间。它的网络模型结构是这样的,看起来像是一个U型,故也叫U-net
这里写图片描述
从上面的U-net网络图结构可以看出下降的部分是采用conv+max-pool来实现的,并且在下采样过程中逐次增加feature channels;对于上升部分是使用左边的feature map拷贝和剪裁(是因为每次卷积过程中边缘像素的丢失)+up_convolution,这样的结构使得在上采样过程中网络可以传播到更高分辨率的层。
整个网络的思路跟FCN是差不多的,一个区别是它没有用VGG等CNN模型作为预训练模型,因为u-net做的是医学图像的二值分割,没必要用ImageNet的预训练模型,而且u-net这个结构我们是可以根据自己的数据集自由加深网络结构的,比如在处理具有更大的感受野的目标的时候;另一个区别是u-net在进行浅层特征融合的时候,采用的是叠加的做法,而不是FCN中的求和操作,也就是上图中的白色模块,是直接从左边的蓝色模块叠加过来的(如果是在Caffe中实现的,u-net是Concat层,而fcn是Eltwise层)。

在实现 U-Net 模型时,计算 IoU(Intersection over Union,交并比)是评估分割性能的重要指标之一。IoU 衡量的是模型预测的分割结果与真实标签之间的重叠程度,其计算方式为: $$ \text{IoU} = \frac{\text{Intersection}}{\text{Union}} = \frac{\text{TP}}{\text{TP} + \text{FP} + \text{FN}} $$ 其中 TP(True Positive)表示预测为正且实际也为正的像素数量,FP(False Positive)表示预测为正但实际为负的像素数量,FN(False Negative)表示预测为负但实际为正的像素数量。 在 U-Net 的训练和评估过程中,可以通过以下方式实现 IoU 的计算: ### 1. 使用 PyTorch 实现 IoU 指标 ```python import torch def iou_score(output, target, smooth=1e-6): """ 计算二分类 IoU :param output: 模型输出 (B, 1, H, W) :param target: 真实标签 (B, 1, H, W) :param smooth: 平滑项,防止除零 :return: IoU 值 """ output = torch.sigmoid(output) # 将输出转换为概率 output = (output > 0.5).float() # 转换为二值图像 intersection = torch.sum(output * target) union = torch.sum(output) + torch.sum(target) - intersection iou = (intersection + smooth) / (union + smooth) return iou ``` ### 2. 使用 TensorFlow/Keras 实现 IoU 指标 ```python import tensorflow as tf def iou_score(y_true, y_pred, smooth=1e-6): """ 计算二分类 IoU :param y_true: 真实标签 (B, H, W, 1) :param y_pred: 模型输出 (B, H, W, 1) :param smooth: 平滑项 :return: IoU 值 """ y_pred = tf.sigmoid(y_pred) y_pred = tf.round(y_pred) # 将输出转换为 0 或 1 intersection = tf.reduce_sum(y_true * y_pred) union = tf.reduce_sum(y_true) + tf.reduce_sum(y_pred) - intersection iou = (intersection + smooth) / (union + smooth) return iou ``` ### 3. 多分类 IoU 实现 如果任务是多类别分割,可以扩展上述方法,对每个类别分别计算 IoU 并取平均值(mIoU): ```python def miou_score(y_true, y_pred, num_classes=3, smooth=1e-6): """ 计算多分类 mIoU :param y_true: 真实标签 (B, H, W) :param y_pred: 模型输出 (B, H, W) :param num_classes: 类别数量 :param smooth: 平滑项 :return: mIoU 值 """ ious = [] for cls in range(num_classes): intersection = tf.reduce_sum(tf.cast(tf.logical_and(tf.equal(y_true, cls), tf.equal(y_pred, cls)), tf.float32)) union = tf.reduce_sum(tf.cast(tf.equal(y_true, cls), tf.float32)) + \ tf.reduce_sum(tf.cast(tf.equal(y_pred, cls), tf.float32)) - intersection iou = (intersection + smooth) / (union + smooth) ious.append(iou) return tf.reduce_mean(ious) ``` 这些实现方式可以在 U-Net 的训练和验证阶段中集成,以评估模型的分割性能。通常,IoU 会与 Dice Loss 等损失函数结合使用,以提高模型的收敛速度和分割精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值