原文链接:https://blog.csdn.net/TYtangyan/article/details/90445814?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
按照网上找到的一个FCN8 实现的:如下
代码:
-
def FCN_8S(nClasses, input_height=512, input_width=256, nChannels=1):
-
-
inputs = Input((input_height, input_width, nChannels))
-
-
conv1 = Conv2D(filters=
32, input_shape=(input_height, input_width, nChannels),
-
kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block1_conv1')(inputs)
-
conv1 = Conv2D(filters=
32, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block1_conv2')(conv1)
-
pool1 = MaxPooling2D(pool_size=(
2,
2), name=
'block1_pool')(conv1)
-
-
conv2 = Conv2D(filters=
64, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block2_conv1')(pool1)
-
conv2 = Conv2D(filters=
64, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block2_conv2')(conv2)
-
pool2 = MaxPooling2D(pool_size=(
2,
2), name=
'block2_pool')(conv2)
-
-
-
conv3 = Conv2D(filters=
128, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block3_conv1')(pool2)
-
conv3 = Conv2D(filters=
128, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block3_conv2')(conv3)
-
conv3 = Conv2D(filters=
128, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block3_conv3')(conv3)
-
pool3 = MaxPooling2D(pool_size=(
2,
2), name=
'block3_pool')(conv3)
-
score_pool3 = Conv2D(filters=
3, kernel_size=(
3,
3),padding=
'same',
-
activation=
'relu', name=
'score_pool3')(pool3)
-
-
conv4 = Conv2D(filters=
256, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block4_conv1')(pool3)
-
conv4 = Conv2D(filters=
256, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block4_conv2')(conv4)
-
conv4 = Conv2D(filters=
256, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block4_conv3')(conv4)
-
pool4 = MaxPooling2D(pool_size=(
2,
2), name=
'block4_pool')(conv4)
-
score_pool4 = Conv2D(filters=
3, kernel_size=(
3,
3),padding=
'same',
-
activation=
'relu', name=
'score_pool4')(pool4)
-
-
conv5 = Conv2D(filters=
256, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block5_conv1')(pool4)
-
conv5 = Conv2D(filters=
256, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block5_conv2')(conv5)
-
conv5 = Conv2D(filters=
256, kernel_size=(
3,
3), padding=
'same', activation=
'relu',
-
name=
'block5_conv3')(conv5)
-
pool5 = MaxPooling2D(pool_size=(
2,
2), name=
'block5_pool')(conv5)
-
-
-
fc6 = Conv2D(filters=
1024, kernel_size=(
1,
1), padding=
'same', activation=
'relu',
-
name=
'fc6')(pool5)
-
fc6 = Dropout(
0.3, name=
'dropout_1')(fc6)
-
-
fc7 = Conv2D(filters=
1024, kernel_size=(
1,
1), padding=
'same', activation=
'relu',
-
name=
'fc7')(fc6)
-
fc7 = Dropout(
0.3, name=
'dropour_2')(fc7)
-
-
score_fr = Conv2D(filters=nClasses, kernel_size=(
1,
1), padding=
'same',
-
activation=
'relu',name=
'score_fr')(fc7)
-
-
score2 = Conv2DTranspose(filters=nClasses, kernel_size=(
2,
2), strides=(
2,
2),
-
padding=
"valid", activation=
None,
-
name=
"score2")(score_fr)
-
-
add1 = add(inputs=[score2,score_pool4], name=
"add_1")
-
-
score4 = Conv2DTranspose(filters=nClasses, kernel_size=(
2,
2), strides=(
2,
2),
-
padding=
"valid", activation=
None,
-
name=
"score4")(add1)
-
-
add2 = add(inputs=[score4,score_pool3], name=
"add_2")
-
-
UpSample = Conv2DTranspose(filters=nClasses, kernel_size=(
8,
8), strides=(
8,
8),
-
padding=
"valid", activation=
None,
-
name=
"UpSample")(add2)
-
-
outputs = core.Activation(
'softmax')(UpSample)
-
-
model = Model(inputs=inputs, outputs=outputs)
-
-
adam = optimizers.Adam(lr=
0.0001, beta_1=
0.9, beta_2=
0.999, epsilon=
None,
-
decay=
0.0, amsgrad=
False)
-
-
model.compile(loss=
'categorical_crossentropy', optimizer=adam,
-
metrics=[
'accuracy'])
-
model.summary()
-
return model