问题:它的输入是什么?它的输出是什么?它是怎么得到这个输出的?它的效果怎样么?

UNet

OutPut

输出:一个与原图大小相同的多通道图,通道数对应分类数,每个通道图像的像素点都有一个概率,表示当前像素点预测为此类的概率

但是记住,原论文中的输入大小为572 * 572 * 1 ,输出为 338 * 338 * 2,为何这样呢?

源于作者,没有做0填充(现代做法是执行卷积前0填充),而是镜像填充,再具体一点,就是将大图划分为patch时,如果 $572 \times 572$ 的输入方框 跨越原图边界,就进行镜像填充。

寻找代码中实际的处理

镜像填充(不常用):

如果你需要填充一个像素:

  • 零填充:| 0 | 5 | 8 | 1 | 4 |

  • 镜像填充:| 8 | 5 | 8 | 1 | 4 |(它将 5 旁边的 8 复制到了 5 的左边,就像 5 是一面镜子反射了 8 一样。)

下面是现代填充和原文填充对比

原始 U-Net 做法

  1. 准备数据(Pre-processing):

    • 读取超大图 ($5000 \times 5000$)。

    • 确定要切的一个 Patch 位置。

    • 判断位置是否在边缘。

    • 如果是边缘 $\rightarrow$ 执行镜像填充算法(Mirror Padding)生成扩充数据。 $\leftarrow$ (就是这里!)

    • 生成最终输入 Tensor ($1 \times 572 \times 572$)。

  2. 网络前向传播(Forward):

    • nn.Conv2d(padding=0): 网络层里不补 0,只负责卷积。

    • 输入 572 -> 输出 388。

  3. 结果拼贴(Post-processing):

    • 把输出的 388 结果填回大图的对应位置。

现代做法 (如 PyTorch 默认)

  1. 准备数据:

    • 直接 Resize 或切成固定大小(如 256x256)。
  2. 网络前向传播(Forward):

    • nn.Conv2d(padding=1): 网络层内部自动补 0

    • 输入 256 -> 输出 256(尺寸不变)

Result

下面的两种数据集都是SBI Cell Tracking Challenge (CTC) 2015的公开数据集(细胞分割)

Segmentation results (IOU) on the ISBI cell tracking challenge 2015.

NamePhC-U373DIC-HeLa
IMCB-SG (2014)0.26690.2935
KTH-SE (2014)0.79530.4607
HOUS-US (2014)0.5323
second-best 20150.830.46
u-net (2015)0.92030.7756

Vit

OutPut

对于分类任务只取[Class] Token(分类特征)->分类头(Layer Norm 和全连接层)->最终分类(softmax)

Result

VM-Unet

OutPut

Result