PaddlePaddle图像分割7日打卡营之语义分割-FCN网络
一、FCN网络介绍
FCN = Fully Convolutional Networks
什么是Fully Convolutional?
简而言之:全卷积,没有FC
- 如何做语义分割?
语义分割 ~=像素级分类
- 和图像分类有什么关系?
替换FC, 换成Conv
- 全卷积网络FCN VS 图像分类网络
二、FCN网络是如何工作的
三、如何实现FCN
import numpy as np
import paddle.fluid as fluid
from paddle.fluid.dygraph import to_variable
from paddle.fluid.dygraph import Conv2D
from paddle.fluid.dygraph import Conv2DTranspose
from paddle.fluid.dygraph import Dropout
from paddle.fluid.dygraph import BatchNorm
from paddle.fluid.dygraph import Pool2D
from paddle.fluid.dygraph import Linear
from vgg import VGG16BN
class FCN8s(fluid.dygraph.Layer):
'''
组建FCN8s网络
'''
def __init__(self,num_classes=59):
super(FCN8s,self).__init__()
backbone=VGG16BN(pretrained=False)
self.layer1 = backbone.layer1
self.layer1[0].conv._padding = [100,100]
self.pool1 = Pool2D(pool_size=2,pool_stride=2,ceil_mode=True)
self.layer2 = backbone.layer2
self.pool2 = Pool2D(pool_size=2,pool_stride=2,ceil_mode=True)
self.layer3 = backbone.layer3
self.pool3 = Pool2D(pool_size=2,pool_stride=2,ceil_mode=True)
self.layer4 = backbone.layer4
self.pool4 = Pool2D(pool_size=2,pool_stride=2,ceil_mode=True)
self.layer5 = backbone.layer5
self.pool5 = Pool2D(pool_size=2,pool_stride=2,ceil_mode=True)
self.fc6 = Conv2D(512,4096,7,act='relu')
self.fc7 = Conv2D(4096,4096,1,act='relu')
self.drop6 = Dropout()
self.drop7 = Dropout()
self.score = Conv2D(4096,num_classes,1)
self.score_pool3 = Conv2D(256,num_classes,1)
self.score_pool4 = Conv2D(512,num_classes,1)
self.up_output = Conv2DTranspose(num_channels=num_classes,
num_filters=num_classes,
filter_size=4,
stride =2,
bias_attr=False)
self.up_pool4 = Conv2DTranspose(num_channels=num_classes,
num_filters=num_classes,
filter_size=4,
stride =2,
bias_attr=False)
self.up_final = Conv2DTranspose(num_channels=num_classes,
num_filters=num_classes,
filter_size=16,
stride =16,
bias_attr=False)
def forward(self,inputs):
x=self.layer1(inputs)
x=self.pool1(x)
x=self.layer2(x)
x=self.pool2(x)
x=self.layer3(x)
x=self.pool3(x)
pool3= x
x=self.layer4(x)
x=self.pool4(x)
pool4= x
x=self.layer5(x)
x=self.pool5(x)
x=self.fc6(x)
x=self.drop6(x)
x=self.fc7(x)
x=self.drop7(x)
x=self.score(x)
x=self.up_output(x)
up_output = x
x=self.score_pool4(pool4)
x = x [:,:,5:5+up_output.shape[2],5:5+up_output.shape[3]]
up_pool4 =x
x=up_pool4 + up_output
x=self.score_pool3(pool3)
x=x[:,:,9:9+up_pool4.shape[2],9:9+up_pool4.shape[3]]
up_pool3=x
x= up_pool3 +up_pool4
x= self.up_final(x)
x=x[:,:,31:31+inputs.shape[2],31:31+inputs.shape[3]]
return x
(文档图片来源于:https://aistudio.baidu.com/)