上篇对FCN的论文解读提到,FCN的训练依赖大量数据,并且仍存在分割结果不精细的弱点。今天要说的Unet就是受到FCN启发针对医学图像做语义分割,且可以利用少量的数据学习到一个对边缘提取十分鲁棒的模型,在生物医学图像分割领域有很大作用。据我了解,Unet是现在很多公司的魔改对话,在移动/嵌入式端的,也已经有把Unet做到了实时的例子。
这就是整个网络的结构,大体分为收缩和扩张路径来组成。因为形似一个字母U,得名Unet。收缩路径仍然是利用传统卷积神经网络的卷积池化组件,其中经过一次下采样之后,channels变为原来的2倍。扩张路径由2 * 2的反卷积,反卷机的输出通道为原来通道数的一半,再与原来的feature map(裁剪之后)串联,得到和原来一样多的通道数的feature map,再经过2个尺寸为3 * 3的卷积和ReLU的作用。裁剪特征图是必要的,因为在卷积的过程中会有边界像素的丢失。在最后一层通过卷积核大小为1 * 1的卷积作用得到想要的目标种类。在Unet中一共有23个卷积层。但是这个网络需要谨慎的选择输入图片的尺寸,以保证所有的Max Pooling操作作用于长宽为偶数的feature map。
Trick 1
由于网络没有全连接层,并且只使用每个卷积的有效部分,所以只有分割图像完全包含在输入图像中可以获得完整的上下文像素。而这个策略允许通过重叠区块无缝分割任意大的图像,为了预测图像边界区域中的像素,通过镜像的输入图像来外推丢失的上下文。这种平铺策略对于将网络应用于大图像很重要,否则分辨率将受到GPU内存的限制。可以把这个问题理解为要对超级大的图像中的小目标进行检测,那么一个可行的策略就是把原图分成很多patch,再对每个patch分别检测,最后把结果组合在一起。
Trick 2
Trick 3
很多细胞分割任务中的一大挑战是分离同一类接触体,本文采用加权损失,其中接触单元之间的分离背景标签在损失函数中获得大的权重。以此方法提升对于相互接触的相同物体之间缝隙的分割效果。
代码实现
caffe版本Unet: https://github.com/warden3344/unet
keras版本Unet: https://github.com/zhixuhao/unet
我的实现: https://github.com/BBuf/Keras-Semantic-Segmentation