예제 #1
0
    def create_block_list(self):
        self.clear_list()

        block1 = InputDownSample()
        self.add_block_list(block1.get_name(), block1, self.data_channel)

        conv1 = ConvBNActivationBlock(in_channels=self.data_channel,
                                      out_channels=32,
                                      kernel_size=3,
                                      padding=1,
                                      stride=2,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, 32)

        conv2 = ConvBNActivationBlock(in_channels=32,
                                      out_channels=32,
                                      kernel_size=3,
                                      padding=1,
                                      stride=2,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv2.get_name(), conv2, 32)

        conv3 = ConvBNActivationBlock(in_channels=32,
                                      out_channels=64,
                                      kernel_size=3,
                                      padding=1,
                                      stride=2,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv3.get_name(), conv3, 64)

        backbone1 = self.factory.get_base_model(BackboneName.ResNet50, data_channel=self.data_channel)
        base_out_channels1 = backbone1.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone1, base_out_channels1[-1])

        layer1 = RouteLayer('8')
        output_channel = sum([base_out_channels1[i] if i >= 0
                              else self.block_out_channels[i] for i in layer1.layers])
        self.add_block_list(layer1.get_name(), layer1, output_channel)

        backbone2 = self.factory.get_base_model(BackboneName.ResNet50, data_channel=self.data_channel)
        base_out_channels2 = backbone2.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone2, base_out_channels2[-1])

        layer2 = RouteLayer('17')
        output_channel = sum([base_out_channels2[i] if i >= 0
                              else self.block_out_channels[i] for i in layer2.layers])
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        self.create_head()
        self.create_loss()
    def create_block_list(self):
        self.block_out_channels = []
        self.index = 0

        c1_channels = 24
        c4_channels = 320

        backbone = self.factory.get_base_model(BackboneName.MobileNetV2_1_0)
        base_out_channels = backbone.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone, base_out_channels[-1])

        aspp = ASPP(c4_channels, 256, bn_name=self.bn_name,
                    activation_name=self.activation_name)
        out_channel = 256
        self.add_block_list(aspp.get_name(), aspp, out_channel)

        up1 = Upsample(scale_factor=8, mode='bilinear')
        self.add_block_list(up1.get_name(), up1, self.block_out_channels[-1])

        layer1 = RouteLayer('3')
        output_channel = sum([base_out_channels[i] if i >= 0
                              else self.block_out_channels[i] for i in layer1.layers])
        self.add_block_list(layer1.get_name(), layer1, output_channel)

        conv1 = ConvBNActivationBlock(in_channels=c1_channels,
                                      out_channels=48,
                                      kernel_size=1,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, 48)

        layer2 = RouteLayer('-3, -1')
        output_channel = sum([base_out_channels[i] if i >= 0
                              else self.block_out_channels[i] for i in layer2.layers])
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        block1 = SeparableConv2dBNActivation(output_channel, 256, 3, relu_first=False,
                                             bn_name=self.bn_name,
                                             activation_name=self.activation_name)
        self.add_block_list(block1.get_name(), block1, 256)

        block2 = SeparableConv2dBNActivation(256, 256, 3, relu_first=False,
                                             bn_name=self.bn_name,
                                             activation_name=self.activation_name)
        self.add_block_list(block2.get_name(), block2, 256)

        conv2 = nn.Conv2d(256, self.class_number, 1)
        self.add_block_list(LayerType.Convolutional, conv2, self.class_number)

        layer3 = Upsample(scale_factor=4, mode='bilinear')
        self.add_block_list(layer3.get_name(), layer3, self.block_out_channels[-1])

        self.create_loss()
예제 #3
0
    def create_block_list(self):
        self.block_out_channels = []
        self.index = 0

        basic_model = self.factory.get_base_model("./cfg/det3d/complex-darknet19.cfg")
        base_out_channels = basic_model.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, basic_model, base_out_channels[-1])

        input_channel = self.block_out_channels[-1]
        output_channel = 1024
        conv1 = ConvBNActivationBlock(input_channel, output_channel,
                                      kernel_size=3, stride=1, padding=1,
                                      bnName=self.bn_name, activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, output_channel)

        input_channel = self.block_out_channels[-1]
        output_channel = 1024
        conv2 = ConvBNActivationBlock(input_channel, output_channel,
                                      kernel_size=3, stride=1, padding=1,
                                      bnName=self.bn_name, activationName=self.activation_name)
        self.add_block_list(conv2.get_name(), conv2, output_channel)

        layer1 = RouteLayer('12')
        output_channel = sum([base_out_channels[i] if i >= 0 else self.block_out_channels[i] for i in layer1.layers])
        self.add_block_list(layer1.get_name(), layer1, output_channel)

        reorg = ReorgBlock()
        output_channel = reorg.stride * reorg.stride * self.out_channels[-1]
        self.add_block_list(reorg.get_name(), reorg, output_channel)

        layer2 = RouteLayer('-3,-1')
        output_channel = sum([base_out_channels[i] if i >= 0 else self.block_out_channels[i] for i in layer2.layers])
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        input_channel = self.block_out_channels[-1]
        output_channel = 1024
        conv3 = ConvBNActivationBlock(input_channel, output_channel,
                                      kernel_size=3, stride=1, padding=1,
                                      bnName=self.bn_name, activationName=self.activation_name)
        self.add_block_list(conv3.get_name(), conv3, output_channel)

        input_channel = self.block_out_channels[-1]
        output_channel = 75
        conv4 = nn.Conv2d(in_channels=input_channel,
                          out_channels=output_channel,
                          kernel_size=1,
                          stride=1,
                          padding=0,
                          bias=True)
        self.add_block_list(LayerType.Convolutional, conv4, output_channel)
예제 #4
0
    def create_block_list(self):
        self.clear_list()

        backbone = self.factory.get_base_model(BackboneName.ResNet50)
        base_out_channels = backbone.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone, base_out_channels[-1])

        if self.is_jpu:
            jup = JPUBlock(layers='4,8,14,17',
                           in_planes=(512, 1024, 2048),
                           width=512,
                           bn_name=self.bn_name,
                           activation_name=self.activation_name)
            self.add_block_list(jup.get_name(), jup, 512 + 512 + 512 + 512)

        self.enc_head(2048, base_out_channels)

        self.create_loss()

        if self.is_aux:
            route = RouteLayer('14')
            output_channel = sum([
                base_out_channels[i] if i >= 0 else self.block_out_channels[i]
                for i in route.layers
            ])
            self.add_block_list(route.get_name(), route, output_channel)

            fcn_head = FCNHeadBlock(1024,
                                    self.class_number,
                                    16,
                                    bn_name=self.bn_name,
                                    activation_name=self.activation_name)
            self.add_block_list(fcn_head.get_name(), fcn_head,
                                self.class_number)
예제 #5
0
    def dsn_head(self, base_out_channels):
        route = RouteLayer('14')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in route.layers
        ])
        self.add_block_list(route.get_name(), route, output_channel)

        conv1 = ConvBNActivationBlock(in_channels=output_channel,
                                      out_channels=512,
                                      kernel_size=3,
                                      stride=1,
                                      padding=1,
                                      bias=True,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, 512)

        dropout = nn.Dropout2d(0.1)
        self.add_block_list(LayerType.Dropout, dropout,
                            self.block_out_channels[-1])

        out_conv = nn.Conv2d(512,
                             self.class_number,
                             kernel_size=1,
                             stride=1,
                             padding=0,
                             bias=True)
        self.add_block_list(LayerType.Convolutional, out_conv,
                            self.class_number)

        up1 = Upsample(scale_factor=16, mode='bilinear')
        self.add_block_list(up1.get_name(), up1, self.block_out_channels[-1])
    def make_layer(self, base_out_channels, conv_output_channel, scale_factor, route_layer_indexs):
        layer1 = Upsample(scale_factor=scale_factor, mode='bilinear')
        self.add_block_list(layer1.get_name(), layer1, self.block_out_channels[-1])

        layer2 = RouteLayer(route_layer_indexs)
        output_channel = sum([base_out_channels[i] if i >= 0
                              else self.block_out_channels[i] for i in layer2.layers])
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        conv1 = ConvBNActivationBlock(self.block_out_channels[-1], conv_output_channel,
                                      kernel_size=1, stride=1, padding=0,
                                      bnName=self.bn_name, activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, conv_output_channel)

        layer3 = RouteLayer('-1,-3')
        output_channel = sum([base_out_channels[i] if i >= 0 else
                              self.block_out_channels[i] for i in layer3.layers])
        self.add_block_list(layer3.get_name(), layer3, output_channel)
예제 #7
0
    def createOrderedDict(self, modelDefine, inputChannels):
        self.index = 0
        self.blockDict.clear()
        self.outChannelList.clear()
        self.filters = 0
        self.input_channels = 0

        for module_def in modelDefine:
            if module_def['type'] == BlockType.InputData:
                data_channel = int(module_def['data_channel'])
                self.input_channels = data_channel
            elif module_def['type'] == LayerType.RouteLayer:
                block = RouteLayer(module_def['layers'])
                self.filters = sum([inputChannels[i] if i >= 0 else self.outChannelList[i]
                                    for i in block.layers])
                self.addBlockList(LayerType.RouteLayer, block, self.filters)
                self.input_channels = self.filters
            elif module_def['type'] == LayerType.ShortRouteLayer:
                block = ShortRouteLayer(module_def['from'], module_def['activation'])
                self.filters = self.outChannelList[block.layer_from] + \
                               self.outChannelList[-1]
                self.addBlockList(LayerType.ShortRouteLayer, block, self.filters)
                self.input_channels = self.filters
            elif module_def['type'] == LayerType.ShortcutLayer:
                block = ShortcutLayer(module_def['from'], module_def['activation'])
                self.filters = self.outChannelList[block.layer_from]
                self.addBlockList(LayerType.ShortcutLayer, block, self.filters)
                self.input_channels = self.filters
            elif module_def['type'] == DarknetBlockName.ReorgBlock:
                stride = int(module_def['stride'])
                block = ReorgBlock(stride=stride)
                self.filters = block.stride * block.stride * self.outChannelList[-1]
                self.addBlockList(DarknetBlockName.ReorgBlock, block, self.filters)
                self.input_channels = self.filters
            else:
                self.create_layer(module_def)
                self.create_convolutional(module_def)
                self.create_loss(module_def)
예제 #8
0
    def create_block_list(self):
        self.block_out_channels = []
        self.index = 0

        backbone = self.factory.get_base_model(BackboneName.Vgg16)
        base_out_channels = backbone.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone, base_out_channels[-1])

        layer1 = ConvBNActivationBlock(in_channels=base_out_channels[-1],
                                       out_channels=4096,
                                       kernel_size=7,
                                       padding=3,
                                       bias=True,
                                       bnName=self.bn_name,
                                       activationName=self.activation_name)
        self.add_block_list(layer1.get_name(), layer1, 4096)

        dropout1 = nn.Dropout()
        self.add_block_list(LayerType.Dropout, dropout1, 4096)

        layer2 = ConvBNActivationBlock(in_channels=4096,
                                       out_channels=4096,
                                       kernel_size=1,
                                       padding=0,
                                       bias=True,
                                       bnName=self.bn_name,
                                       activationName=self.activation_name)
        self.add_block_list(layer2.get_name(), layer2, 4096)

        dropout2 = nn.Dropout()
        self.add_block_list(LayerType.Dropout, dropout2, 4096)

        layer3 = nn.Conv2d(4096, self.class_number, kernel_size=1)
        self.add_block_list(LayerType.Convolutional, layer3, self.class_number)

        upsample1 = Upsample(scale_factor=2, mode='bilinear')
        self.add_block_list(LayerType.Upsample, upsample1,
                            self.block_out_channels[-1])

        layer4 = RouteLayer('13')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer4.layers
        ])
        self.add_block_list(layer4.get_name(), layer4, output_channel)

        layer5 = nn.Conv2d(512, self.class_number, kernel_size=1)
        self.add_block_list(LayerType.Convolutional, layer5, self.class_number)

        layer6 = AddLayer('-1,-3')
        index = layer6.layers[0]
        output_channel = base_out_channels[
            index] if index >= 0 else self.block_out_channels[index]
        self.add_block_list(layer6.get_name(), layer6, output_channel)

        layer7 = RouteLayer('9')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer7.layers
        ])
        self.add_block_list(layer7.get_name(), layer7, output_channel)

        layer8 = nn.Conv2d(256, self.class_number, kernel_size=1)
        self.add_block_list(LayerType.Convolutional, layer8, self.class_number)

        layer9 = RouteLayer('-3')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer7.layers
        ])
        self.add_block_list(layer9.get_name(), layer9, output_channel)

        upsample2 = Upsample(scale_factor=2, mode='bilinear')
        self.add_block_list(LayerType.Upsample, upsample2,
                            self.block_out_channels[-1])

        layer10 = AddLayer('-1,-3')
        index = layer10.layers[0]
        output_channel = base_out_channels[
            index] if index >= 0 else self.block_out_channels[index]
        self.add_block_list(layer10.get_name(), layer10, output_channel)

        upsample3 = Upsample(scale_factor=8, mode='bilinear')
        self.add_block_list(LayerType.Upsample, upsample3,
                            self.block_out_channels[-1])

        self.create_loss()
예제 #9
0
    def create_block_list(self):
        self.clear_list()

        spatial_path = SpatialPath(self.data_channel,
                                   128,
                                   bn_name=self.bn_name,
                                   activation_name=self.activation_name)
        self.add_block_list(spatial_path.get_name(), spatial_path, 128)

        backbone = self.factory.get_base_model(BackboneName.ResNet18)
        base_out_channels = backbone.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone, base_out_channels[-1])

        inter_channels = 128
        global_context = GlobalAvgPooling(512,
                                          inter_channels,
                                          bn_name=self.bn_name,
                                          activation_name=self.activation_name)
        self.add_block_list(global_context.get_name(), global_context,
                            base_out_channels[-1])

        layer1 = RouteLayer('9')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer1.layers
        ])
        self.add_block_list(layer1.get_name(), layer1, output_channel)

        context_path1 = ContextPath(512,
                                    inter_channels,
                                    bn_name=self.bn_name,
                                    activation_name=self.activation_name)
        self.add_block_list(context_path1.get_name(), context_path1,
                            inter_channels)

        layer2 = RouteLayer('7')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer2.layers
        ])
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        context_path2 = ContextPath(256,
                                    inter_channels,
                                    bn_name=self.bn_name,
                                    activation_name=self.activation_name)
        self.add_block_list(context_path2.get_name(), context_path2,
                            inter_channels)

        ffm = FeatureFusionBlock(256,
                                 256,
                                 4,
                                 bn_name=self.bn_name,
                                 activation_name=self.activation_name)
        self.add_block_list(ffm.get_name(), ffm, 256)

        conv1 = ConvBNActivationBlock(in_channels=256,
                                      out_channels=64,
                                      kernel_size=3,
                                      padding=1,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, 64)

        dropout = nn.Dropout(0.1)
        self.add_block_list(LayerType.Dropout, dropout,
                            self.block_out_channels[-1])

        conv2 = nn.Conv2d(64, self.class_number, 1)
        self.add_block_list(LayerType.Convolutional, conv2, self.class_number)

        layer = Upsample(scale_factor=8, mode='bilinear')
        self.add_block_list(layer.get_name(), layer,
                            self.block_out_channels[-1])

        self.create_loss()
예제 #10
0
    def entry_flow(self, entry_block3_stride):
        # Entry flow
        conv1 = ConvBNActivationBlock(in_channels=self.data_channel,
                                      out_channels=32,
                                      kernel_size=3,
                                      stride=2,
                                      padding=1,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv1.get_name(), conv1, 32)

        conv2 = ConvBNActivationBlock(in_channels=32,
                                      out_channels=64,
                                      kernel_size=3,
                                      stride=1,
                                      padding=1,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=self.activation_name)
        self.add_block_list(conv2.get_name(), conv2, 64)

        block1 = XceptionConvBlock([64, 128, 128, 128],
                                   stride=2,
                                   bn_name=self.bn_name,
                                   activation_name=self.activation_name)
        self.add_block_list(block1.get_name(), block1, 128)

        double_sep_conv1 = DoubleSeparableConv2dBlock(
            [128, 256, 256],
            bn_name=self.bn_name,
            activation_name=self.activation_name)
        self.add_block_list(double_sep_conv1.get_name(), double_sep_conv1, 256)

        sep_conv1 = SeparableConv2dBNActivation(
            inplanes=256,
            planes=256,
            dilation=1,
            stride=2,
            bn_name=self.bn_name,
            activation_name=self.activation_name)
        self.add_block_list(sep_conv1.get_name(), sep_conv1, 256)

        layer1 = RouteLayer('-3')
        output_channel = sum(
            [self.block_out_channels[i] for i in layer1.layers])
        self.add_block_list(layer1.get_name(), layer1, output_channel)

        conv3 = ConvBNActivationBlock(in_channels=128,
                                      out_channels=256,
                                      kernel_size=1,
                                      stride=2,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=ActivationType.Linear)
        self.add_block_list(conv3.get_name(), conv3, 256)

        layer2 = AddLayer('-3,-1')
        output_channel = 256
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        double_sep_conv2 = DoubleSeparableConv2dBlock(
            [256, 728, 728],
            bn_name=self.bn_name,
            activation_name=self.activation_name)
        self.add_block_list(double_sep_conv2.get_name(), double_sep_conv2, 728)

        sep_conv2 = SeparableConv2dBNActivation(
            inplanes=728,
            planes=728,
            dilation=1,
            stride=entry_block3_stride,
            bn_name=self.bn_name,
            activation_name=self.activation_name)
        self.add_block_list(sep_conv2.get_name(), sep_conv2, 728)

        layer3 = RouteLayer('-3')
        output_channel = sum(
            [self.block_out_channels[i] for i in layer3.layers])
        self.add_block_list(layer3.get_name(), layer3, output_channel)

        conv4 = ConvBNActivationBlock(in_channels=256,
                                      out_channels=728,
                                      kernel_size=1,
                                      stride=entry_block3_stride,
                                      bias=False,
                                      bnName=self.bn_name,
                                      activationName=ActivationType.Linear)
        self.add_block_list(conv4.get_name(), conv4, 728)

        layer4 = AddLayer('-3,-1')
        output_channel = 728
        self.add_block_list(layer4.get_name(), layer4, output_channel)
예제 #11
0
    def enc_head(self, in_channels, base_out_channels):
        if self.is_jpu:
            conv1 = ConvBNActivationBlock(in_channels=in_channels,
                                          out_channels=512,
                                          kernel_size=1,
                                          bias=False,
                                          bnName=self.bn_name,
                                          activationName=self.activation_name)
            self.add_block_list(conv1.get_name(), conv1, 512)
        else:
            conv1 = ConvBNActivationBlock(in_channels=in_channels,
                                          out_channels=512,
                                          kernel_size=3,
                                          padding=1,
                                          bias=False,
                                          bnName=self.bn_name,
                                          activationName=self.activation_name)
            self.add_block_list(conv1.get_name(), conv1, 512)

        if self.lateral:
            route1 = RouteLayer('8')
            output_channel = sum([
                base_out_channels[i] if i >= 0 else self.block_out_channels[i]
                for i in route1.layers
            ])
            self.add_block_list(route1.get_name(), route1, output_channel)

            connect1 = ConvBNActivationBlock(
                in_channels=output_channel,
                out_channels=512,
                kernel_size=1,
                bias=False,
                bnName=self.bn_name,
                activationName=self.activation_name)
            self.add_block_list(connect1.get_name(), connect1, 512)

            route2 = RouteLayer('14')
            output_channel = sum([
                base_out_channels[i] if i >= 0 else self.block_out_channels[i]
                for i in route2.layers
            ])
            self.add_block_list(route2.get_name(), route2, output_channel)

            connect2 = ConvBNActivationBlock(
                in_channels=output_channel,
                out_channels=512,
                kernel_size=1,
                bias=False,
                bnName=self.bn_name,
                activationName=self.activation_name)
            self.add_block_list(connect2.get_name(), connect2, 512)

            route3 = RouteLayer('-5,-3,-1')
            output_channel = sum([
                base_out_channels[i] if i >= 0 else self.block_out_channels[i]
                for i in route2.layers
            ])
            self.add_block_list(route3.get_name(), route3, output_channel)

            fusion = ConvBNActivationBlock(in_channels=output_channel,
                                           out_channels=512,
                                           kernel_size=3,
                                           padding=1,
                                           bias=False,
                                           bnName=self.bn_name,
                                           activationName=self.activation_name)
            self.add_block_list(fusion.get_name(), fusion, 512)

        encmodule = EncBlock(in_channels=512,
                             nclass=self.class_number,
                             se_loss=self.is_se_loss,
                             bn_name=self.bn_name,
                             activation_name=self.activation_name)
        self.add_block_list(encmodule.get_name(), encmodule, 512)

        dropout = nn.Dropout2d(0.1, False)
        self.add_block_list(LayerType.Dropout, dropout,
                            self.block_out_channels[-1])

        conv2 = nn.Conv2d(self.block_out_channels[-1], self.class_number, 1)
        self.add_block_list(LayerType.Convolutional, conv2, self.class_number)

        up = Upsample(scale_factor=8, mode='bilinear')
        self.add_block_list(up.get_name(), up, self.class_number)
예제 #12
0
    def create_block_list(self):
        self.block_out_channels = []
        self.index = 0

        backbone = self.factory.get_base_model(BackboneName.ResNet101)
        base_out_channels = backbone.get_outchannel_list()
        self.add_block_list(BlockType.BaseNet, backbone, base_out_channels[-1])

        dropout1 = nn.Dropout(p=0.5)
        self.add_block_list(LayerType.Dropout, dropout1,
                            self.block_out_channels[-1])

        layer1 = RouteLayer('31')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer1.layers
        ])
        self.add_block_list(layer1.get_name(), layer1, output_channel)

        dropout2 = nn.Dropout(p=0.5)
        self.add_block_list(LayerType.Dropout, dropout2,
                            self.block_out_channels[-1])

        layer2 = RouteLayer('-3')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer1.layers
        ])
        self.add_block_list(layer2.get_name(), layer2, output_channel)

        conv1 = nn.Conv2d(2048, 512, 1, bias=False)
        self.add_block_list(LayerType.Convolutional, conv1, 512)

        layer3 = RouteLayer('-3')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer1.layers
        ])
        self.add_block_list(layer3.get_name(), layer3, output_channel)

        conv2 = nn.Conv2d(1024, 256, 1, bias=False)
        self.add_block_list(LayerType.Convolutional, conv2, 256)

        refinenet1 = RefineNetBlock(512,
                                    512,
                                    4,
                                    activation_name=self.activation_name)
        output_channel = 256
        self.add_block_list(refinenet1.get_name(), refinenet1, output_channel)

        layer4 = RouteLayer('8')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer1.layers
        ])
        self.add_block_list(layer4.get_name(), layer4, output_channel)

        conv3 = nn.Conv2d(512, 256, 1, bias=False)
        self.add_block_list(LayerType.Convolutional, conv3, 256)

        refinenet2 = RefineNetBlock(256,
                                    256,
                                    4,
                                    activation_name=self.activation_name)
        output_channel = 256
        self.add_block_list(refinenet2.get_name(), refinenet2, output_channel)

        layer5 = RouteLayer('4')
        output_channel = sum([
            base_out_channels[i] if i >= 0 else self.block_out_channels[i]
            for i in layer1.layers
        ])
        self.add_block_list(layer5.get_name(), layer5, output_channel)

        conv4 = nn.Conv2d(256, 256, 1, bias=False)
        self.add_block_list(LayerType.Convolutional, conv4, 256)

        refinenet3 = RefineNetBlock(256,
                                    256,
                                    4,
                                    activation_name=self.activation_name)
        output_channel = 256
        self.add_block_list(refinenet3.get_name(), refinenet3, output_channel)

        crp = CRPBlock(256, 256, 4)
        output_channel = 256
        self.add_block_list(crp.get_name(), crp, output_channel)

        conv5 = nn.Conv2d(256,
                          self.class_number,
                          kernel_size=3,
                          stride=1,
                          padding=1,
                          bias=True)
        self.add_block_list(LayerType.Convolutional, conv5, self.class_number)

        layer6 = Upsample(scale_factor=4, mode='bilinear')
        self.add_block_list(layer6.get_name(), layer6,
                            self.block_out_channels[-1])

        self.create_loss()