PSPNet paddle实现

import numpy as np
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 Dropout
from resnet_dilated import ResNet50

# pool with different bin_size
# interpolate back to input size
# concat
class PSPModule(Layer):
    def __init__(self, num_channels, box_list):
        super(PSPModule,self).__init__()
        self.num_channels = num_channels
        num_sub_channel = num_channels // len(box_list)
        self.box_list = box_list
        self.features = []
        for i in range(len(box_list)):
            self.features.append(
                fluid.dygraph.Sequential(
                    Conv2D(num_channels, num_sub_channel,1,padding=0,stride=1),
                    BatchNorm(num_sub_channel)
                )
            )



    def forward(self, inputs):
        out = [inputs]
        for i, out_size in enumerate(self.box_list):
            x = fluid.layers.adaptive_pool2d(inputs, out_size)
            x = self.features[i](x)
            x = fluid.layers.interpolate(x, inputs.shape[2::])
            out.append(x)
        out = fluid.layers.concat(out, axis=1)

        return out


class PSPNet(Layer):
    def __init__(self, num_classes=59, backbone='resnet50'):
        super(PSPNet, self).__init__()
        res = ResNet50()
        # stem: res.conv, res.pool2d_max
        self.conv = res.conv
        self.pool2d_max = res.pool2d_max
        self.layer1 = res.layer1
        self.layer2 = res.layer2
        self.layer3 = res.layer3
        self.layer4 = res.layer4

        box_list = [1,2,3,6]
        num_channels = 2048
        # psp: 2048 -> 2048*2
        self.pspmodule = PSPModule(num_channels,box_list)
        num_channels *= 2

        # cls: 2048*2 -> 512 -> num_classes
        self.cls = fluid.dygraph.Sequential(
            Conv2D(num_channels, 512,1,padding=0,stride=1),
            BatchNorm(512),
            Conv2D(512, num_classes,1,padding=0,stride=1),
            BatchNorm(num_classes)
        )
        # aux: 1024 -> 256 -> num_classes
        
    def forward(self, inputs):
        x = self.conv(inputs)
        x = self.pool2d_max(x)

        #print(x.shape)
        x = self.layer1(x)
        #print(x.shape)
        x = self.layer2(x)
        # print(x.shape)
        x = self.layer3(x)
        # print(x.shape)
        x = self.layer4(x)
        # print(x.shape)  [2, 2048, 60, 60]
        
        x = self.pspmodule(x)
        x = self.cls(x)
        x = fluid.layers.interpolate(x, inputs.shape[2::])
        # aux: tmp_x = layer3

        return x
            



def main():
    with fluid.dygraph.guard(fluid.CPUPlace()):
        x_data=np.random.rand(2,3, 473, 473).astype(np.float32)
        x = to_variable(x_data)
        model = PSPNet(num_classes=59)
        model.train()
        pred = model(x)
        print(pred.shape)

if __name__ =="__main__":
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值