问题:它的输入是什么?它的输出是什么?它是怎么得到这个输出的?它的效果怎样么?
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 做法
准备数据(Pre-processing):
读取超大图 ($5000 \times 5000$)。
确定要切的一个 Patch 位置。
判断位置是否在边缘。
如果是边缘 $\rightarrow$ 执行镜像填充算法(Mirror Padding)生成扩充数据。 $\leftarrow$ (就是这里!)
生成最终输入 Tensor ($1 \times 572 \times 572$)。
网络前向传播(Forward):
nn.Conv2d(padding=0): 网络层里不补 0,只负责卷积。输入 572 -> 输出 388。
结果拼贴(Post-processing):
- 把输出的 388 结果填回大图的对应位置。
现代做法 (如 PyTorch 默认)
准备数据:
- 直接 Resize 或切成固定大小(如 256x256)。
网络前向传播(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.
| Name | PhC-U373 | DIC-HeLa |
|---|---|---|
| IMCB-SG (2014) | 0.2669 | 0.2935 |
| KTH-SE (2014) | 0.7953 | 0.4607 |
| HOUS-US (2014) | 0.5323 | — |
| second-best 2015 | 0.83 | 0.46 |
| u-net (2015) | 0.9203 | 0.7756 |
Vit
OutPut
对于分类任务只取[Class] Token(分类特征)->分类头(Layer Norm 和全连接层)->最终分类(softmax)