1. unet 简介
unet 属于 fcn 的一种变体,它可以说是最常用、最简单的一种分割模型,它简单、高效、易懂、容易构建,且可以从小数据集中训练。2015 年,unet 在论文 u-net: convolutional networks for biomedical image segmentation 中被提出 。unet 的初衷是为了解决医学图像分割的问题,在解决细胞层面的分割的任务方面,其在 2015 年的 isbi cell tracking 比赛中获得了多个第一。之后,unet 凭借其突出的分割效果而被广泛应用在语义分割的各个方向(如卫星图像分割,工业瑕疵检测等)。
unet 网络结构如上图所示,其网络结构是对称的,形似英文字母 u,故而被称为 unet 。就整体而言,unet 是一个encoder-decoder的结构(与 fcn 相同),前半部分是特征提取,后半部分是上采样。
- encoder:左半部分,由两个 3x3 的卷积层(relu) 一个 2x2 的 maxpooling 层组成一个下采样模块;
- decoder:右半部分,由一个上采样的卷积层 特征拼接 concat 两个 3x3 的卷积层(relu)构成一个上采样模块。
encoder 由卷积操作和下采样操作组成,所用卷积结构统一为 3x3
的卷积核,padding=0
,striding=1
。没有 padding 所以每次卷积之后特征图的 h 和 w 变小了,在跳层连接(skip connection)时需注意特征图的维度。
decoder 用以恢复特征图的原始分辨率,除了卷积以外,该过程的关键步骤就是上采样与跳层连接。上采样常用转置卷积和插值两种方式实现。在插值实现方式中,双线性插值(bilinear)的综合表现较好也较为常见 。要想网络获得好的效果,跳层连接基本必不可少。unet 中的跳层连接通过拼接将底层的位置信息与深层的语义信息相融合。需要注意的是,在 fcn 中,特征图是以相加的方式进行融合:
- fcn:通过特征图对应像素值的相加来融合特征;
- unet :通过通道数的拼接,以形成更厚的特征(当然这样会更佳消耗显存)。
- 相加方式:特征图维度没有变化,但每个维度包含了更多特征。对于普通分类任务这种不需要从特征图复原到原始分辨率的任务来说,这是一个高效的选择;
- 拼接方式:保留了更多的维度/位置信息,这使得后面的网络层可在浅层特征与深层特征间自由选择,这对语义分割任务来说更具优势。
unet网络结构特点:
- u型网络结构;
- 跳层连接;
跳层连接
- 在上采样过程中融合下采样过程中的特征图;
- 融合方式为concatenate,按特征图通道数进行叠加;
- d在实际中,融合的两张特征图尺寸可能不同,一般可采用裁剪和padding(unet采用方式)两种方式进行解决;
unet 的优点主要有:
- 深/浅层特征有着各自意义:网络越深,感受野越大,网络关注那些全局特征(更抽象、更本质);浅层网络则更加关注纹理等局部特征特征;
- 通过特征拼接来实现边缘特征的找回。通过上采样(转置卷积)固然能够得到更大尺寸的特征图,但特征图的边缘是缺少信息的。毕竟每一次下采样提取特征的同时,必然会损失一些边缘特征,而上采样并不能找回这些失去的特征。
任务:给一张细胞结构图,将每个细胞相互分离出来;
训练集和测试集各有图片30张,图片大小为5125121;
【github代码地址】-- 实测可运行