为期7天的图像分割训练营很快就进入了尾声,朱老师和伍老师都给我留下了深刻的印象。我也学到了很多知识,做如下总结。
图像分割综述
首先学习构建了basic_model模型
import paddle
import paddle.fluid as fluid
from paddle.fluid.dygraph import to_variable
from paddle.fluid.dygraph import Conv2D
from paddle.fluid.dygraph import Pool2D
import numpy as np
np.set_printoptions(precision=2)
class BasicModel(fluid.dygraph.Layer):
# BasicModel contains:
# 1. pool: 4x4 max pool op, with stride 4
# 2. conv: 3x3 kernel size, takes RGB image as input and output num_classes channels,
# note that the feature map size should be the same
# 3. upsample: upsample to input size
#
# TODOs:
# 1. The model takes an random input tensor with shape (1, 3, 8, 8)
# 2. The model outputs a tensor with same HxW size of the input, but C = num_classes
# 3. Print out the model output in numpy format
def __init__(self, num_classes=59):
super(BasicModel, self).__init__()
self.pool = Pool2D(pool_size=2,pool_stride=2)
self.conv = Conv2D(num_channels=3, num_filters=num_classes, filter_size=1)
def forward(self, inputs):
x = self.pool(inputs)
x = fluid.layers.interpolate(x, out_shape=(inputs.shape[2], inputs.shape[3]))
x = self.conv(x)
return x
def main():
place = paddle.fluid.CUDAPlace(0)
with fluid.dygraph.guard(place):
model = BasicModel(num_classes=59)
model.eval()
input_data = np.random.rand(1,3,8,8).astype(np.float32)
print('Input data shape: ', input_data.shape)
input_data = to_variable(input_data)
output_data = model(input_data)
output_data = output_data.numpy()
print('Output data shape: ', output_data.shape)
if __name__ == "__main__":
main()
FCN网络
FCN网络是语义分割网络,就是像素级分类。主要学习了三种上采样方法,分别是Up-sampleing, Transpose Conv,和Un-pooling。
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):
# TODO: create fcn8s model
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 =