U-Net网络框架
U-Net原理图
U-Net与FCN一样,都是采用Encoder加Decoder来实现图像分割。与FCN不同的是U-Net结合了很多浅层的信息,对于不同尺度物体分割效果要好些。
U-Net网络结构
网络结构如上图所示,从左到右分别为Encoder层、中间层和Decoder层。
Encoder层包括四个Encoder,每个Encoder都包括两个卷积层,然后pooling下采样作为下一层网络输入;
中间层包含两个卷积;
Decoder层包含四个Decoder,每个Decoder对输入先进行上采样,然后与对应的浅层信息连起来(这里会出现feature大小不一样的情况,可以用Crop或是Padding来解决),再经过两个卷积得到输出;
将最终输出经过1x1卷积得到channels为num_classes的分割结果。
整体结构像个U型。
上图为feature map的尺度变化
U-Net代码
import numpy as np
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph import to_variable
from paddle.fluid.dygraph import Layer
from paddle.fluid.dygraph import Conv2D
from paddle.fluid.dygraph import BatchNorm
from paddle.fluid.dygraph import Pool2D
from paddle.fluid.dygraph import Conv2DTranspose
class Encoder(Layer):
def __init__(self, num_channels, num_filters):
super(Encoder, self).__init__()
#TODO: encoder contains:
# 1 3x3conv + 1bn + relu +
# 1 3x3conc + 1bn + relu +
# 1 2x2 pool
# return features before and after pool
self.conv1 = Conv2D(num_channels,
num_filters,
filter_size=3,
stride=1,
padding=1)
self.bn1 = BatchNorm(num_filters, act='relu')
self.conv2 = Conv2D(num_filters,
num_filters,
filter_size=3,
stride=1,
padding=1