U-Net · 看懂逐像素分割

缩小看整体,放大找位置,把同尺度的特征接回来

此刻

怎么做

会骗你

文字版:U-Net 漫游在做什么

U-Net 解决的是「逐像素」的问题:不是判断这张图是什么,而是判断每一个像素属于什么。它的结构长得像字母 U:左边一路缩小提取语义,右边一路放大还原位置,中间用几条横向的连线把同尺度的特征接回来。

画面上正在发生什么

沿 U 形走一遍:左边每下一级,池化把宽高减半、卷积把通道加倍,64×64×1 一路缩到 4×4×128。缩小的过程让网络看得越来越「宏观」——知道这是什么了,但也把「到底在哪」丢掉了大半。

右边每上一级,转置卷积把宽高翻倍,然后拼接左边同尺度的特征,再做卷积。点开「放大一处拼接」,可以看清两路通道是怎样沿通道方向接在一起的——不是相加,是拼接,通道数因此变成两路之和。这条横向连线就是 U-Net 的核心:把左边还没被缩小破坏的位置信息,直接送到右边负责还原的地方。

什么时候它会骗你

  • 拼接和相加不一样。ResNet 的捷径是逐元素相加,要求形状完全相同;U-Net 的跳接是沿通道拼接,通道数相加、宽高必须相同。两者的目的也不同:前者为了让梯度好传,后者为了把位置信息送回来。
  • 医学图像分割最容易在数据划分上翻车。同一个病人的多个切片、同一次扫描的多张图,必须整体留在同一集合里。按切片随机划分会让模型认出「这是哪个病人」,Dice 分数虚高得离谱。
  • 分割任务的类别极不平衡。要分割的目标往往只占整张图很小一块。这时准确率毫无意义(全判为背景也能有 99%),必须用 Dice、IoU 这类指标,损失函数也常要用 Dice Loss 或加权交叉熵。

常见问题

U-Net 的跳跃连接到底解决了什么?
解决位置信息丢失。编码器为了提取语义不断下采样,解码器仅靠上采样无法还原精确边界。跳接把编码器同尺度的高分辨率特征直接拼过来,让解码器同时拥有「是什么」(深层语义)和「在哪里」(浅层位置),边界因此清晰得多。
为什么 U-Net 在医学影像里这么流行?
因为它在小样本上表现好。医学标注数据昂贵稀少,U-Net 结构对称、参数量适中,配合数据增强在几十到几百张标注图上就能训出可用的模型。它对输入尺寸也比较灵活。
语义分割和实例分割有什么区别?
语义分割只判断每个像素属于哪一类,同类的两个物体不加区分;实例分割还要把同类的不同个体分开(这是第 1 个细胞、那是第 2 个)。U-Net 做的是语义分割;要做实例分割需要 Mask R-CNN 这类方法,或者在 U-Net 输出上再加分水岭等后处理。

本页使用合成教学图像,特征图为本机小型模型的实际输出;网络规模远小于原始 U-Net,用于展示结构而非复现论文性能。

作者与维护:覃秉丰 · 关于覃秉丰 · 引用本页讲解

继续学习