U-net


深度学习之语义分割U-net(2015)

what is U-net

上篇文章我们介绍了SegNet网络的相关知识和网络的特点,这篇文章介绍2015年发表的另一篇比较经典的语义分割网络U-net,这篇网络与上篇的SegNet的网络差别不大,但是结构上还是有差别的,并且在U-net网络中运用了跳跃连接,这个特点和SegNet不同,也正是因为此处的不同,有的文章将这两个网络的池化索引和跳跃连接这两个特点进行结合进行网络构建。

U-net网络结构与SegNet结构相似,都拥有编码和解码的过程,但是在有效特征层选取的时候,U-net选取了多个特征层进行特征融合,而SegNet网络值利用了最后一层特征。

U-net网络结构

主干网络结构简介

针对U-net网络,我们选取MobileNet作为主干网络,在之前的文章中已经介绍过,且给出了相关代码,此处给出链接

特征解码

特征解码过程与SegNet网络类似,针对编码过程中提取得到的有效特征层进行上采样解码,并与对应的有效特征层进行连接。

代码如下:


from keras.models import *
from keras.layers import *
from nets.mobilenet import get_mobilenet_encoder
MERGE_AXIS = -1

def _unet( n_classes , encoder , l1_skip_conn=True,  input_height=416, input_width=608  ):

    img_input , levels = encoder( input_height=input_height ,  input_width=input_width )
    [f1 , f2 , f3 , f4 , f5 ] = levels 

    o = f4
    # 26,26,512
    o = ZeroPadding2D((1,1))(o)
    o = Conv2D(512, (3, 3), padding='valid')(o)
    o = BatchNormalization()(o)

    # 52,52,512
    o = ( UpSampling2D((2,2)))(o)
    # 52,52,768
    o =  concatenate([o, f3],axis=MERGE_AXIS )  
    o = ZeroPadding2D((1,1))(o)
    # 52,52,256
    o = Conv2D(256, (3, 3), padding='valid')(o)
    o = BatchNormalization()(o)

    # 104,104,256
    o = UpSampling2D( (2,2)))(o)
    # 104,104,384
    o = concatenate([o,f2],axis=MERGE_AXIS ) )
    o = ZeroPadding2D((1,1))(o)
    # 104,104,128
    o = Conv2D(128 , (3, 3), padding='valid')(o)
    o = BatchNormalization()(o)
    # 208,208,128
    o = UpSampling2D((2,2))(o)

    if l1_skip_conn:
        o = concatenate([o,f1],axis=MERGE_AXIS )

    o = ZeroPadding2D((1,1))(o)
    o = Conv2D( 64 , (3, 3), padding='valid')(o)
    o = BatchNormalization()(o)

    o =  Conv2D(n_classes, (3, 3), padding='same')( o )

    # 将结果进行reshape
    o = Reshape((int(input_height/2)*int(input_width/2), -1))(o)
    o = Softmax()(o)
    model = Model(img_input,o)
    return model

def mobilenet_unet( n_classes ,  input_height=224, input_width=224 , encoder_level=3):
    model =  _unet( n_classes , get_mobilenet_encoder ,  input_height=input_height, input_width=input_width  )
    return model

loss函数

U-net模型中,预测值是经过解码后的特征层的一维序列,对应的真实值就是图片ground truth的一维序列,在loss函数的设计中,本文采用了标准的交叉熵CE作为U-net的loss函数。

至此,U-net相关的代码就介绍完成了,在后期会针对已经介绍的网络进行不断更新。


文章作者: Fanrencli
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Fanrencli !
  目录