CornerNet icon indicating copy to clipboard operation
CornerNet copied to clipboard

Could you please explain why nstack == 2?

Open rossqin opened this issue 5 years ago • 3 comments

Dear contributor, from kp.py, I see lines( I attached it at the end) which make me confused.

Can It be interpreted as "The backbone network has a small PRE(two layers) component, followed by 2 paralleled branches, each of which predicts corners respectively?"

Cheers, Ross

` class kp(nn.Module): def init( self, n, nstack, dims, modules, out_dim, pre=None, cnv_dim=256, make_tl_layer=make_tl_layer, make_br_layer=make_br_layer, make_cnv_layer=make_cnv_layer, make_heat_layer=make_kp_layer, make_tag_layer=make_kp_layer, make_regr_layer=make_kp_layer, make_up_layer=make_layer, make_low_layer=make_layer, make_hg_layer=make_layer, make_hg_layer_revr=make_layer_revr, make_pool_layer=make_pool_layer, make_unpool_layer=make_unpool_layer, make_merge_layer=make_merge_layer, make_inter_layer=make_inter_layer, kp_layer=residual ): super(kp, self).init()

    self.nstack    = nstack
    self._decode   = _decode

    curr_dim = dims[0]

    self.pre = nn.Sequential(
        convolution(7, 3, 128, stride=2),
        residual(3, 128, 256, stride=2)
    ) if pre is None else pre

    self.kps  = nn.ModuleList([
        kp_module(
            n, dims, modules, layer=kp_layer,
            make_up_layer=make_up_layer,
            make_low_layer=make_low_layer,
            make_hg_layer=make_hg_layer,
            make_hg_layer_revr=make_hg_layer_revr,
            make_pool_layer=make_pool_layer,
            make_unpool_layer=make_unpool_layer,
            make_merge_layer=make_merge_layer
        ) for _ in range(nstack) # nstack : 2, so from here, we get two branches
    ])
    self.cnvs = nn.ModuleList([
        make_cnv_layer(curr_dim, cnv_dim) for _ in range(nstack)
    ])

    self.tl_cnvs = nn.ModuleList([
        make_tl_layer(cnv_dim) for _ in range(nstack)
    ])
    self.br_cnvs = nn.ModuleList([
        make_br_layer(cnv_dim) for _ in range(nstack)
    ])

    ## keypoint heatmaps
    self.tl_heats = nn.ModuleList([
        make_heat_layer(cnv_dim, curr_dim, out_dim) for _ in range(nstack)
    ])
    self.br_heats = nn.ModuleList([
        make_heat_layer(cnv_dim, curr_dim, out_dim) for _ in range(nstack)
    ])

    ## tags
    self.tl_tags  = nn.ModuleList([
        make_tag_layer(cnv_dim, curr_dim, 1) for _ in range(nstack)
    ])
    self.br_tags  = nn.ModuleList([
        make_tag_layer(cnv_dim, curr_dim, 1) for _ in range(nstack)
    ])

    for tl_heat, br_heat in zip(self.tl_heats, self.br_heats):
        tl_heat[-1].bias.data.fill_(-2.19)
        br_heat[-1].bias.data.fill_(-2.19)

    self.inters = nn.ModuleList([
        make_inter_layer(curr_dim) for _ in range(nstack - 1)
    ])

    self.inters_ = nn.ModuleList([
        nn.Sequential(
            nn.Conv2d(curr_dim, curr_dim, (1, 1), bias=False),
            nn.BatchNorm2d(curr_dim)
        ) for _ in range(nstack - 1)
    ])
    self.cnvs_   = nn.ModuleList([
        nn.Sequential(
            nn.Conv2d(cnv_dim, curr_dim, (1, 1), bias=False),
            nn.BatchNorm2d(curr_dim)
        ) for _ in range(nstack - 1)
    ])

    self.tl_regrs = nn.ModuleList([
        make_regr_layer(cnv_dim, curr_dim, 2) for _ in range(nstack)
    ])
    self.br_regrs = nn.ModuleList([
        make_regr_layer(cnv_dim, curr_dim, 2) for _ in range(nstack)
    ])

    self.relu = nn.ReLU(inplace=True)

`

rossqin avatar Jun 07 '19 16:06 rossqin

I think nstack == 2 means there are 2 stacked hourglass network.

moothes avatar Jun 28 '19 01:06 moothes

nstack==2 means there are two top_left branch and two bottom right branch.

tanhangkai avatar Jul 04 '19 10:07 tanhangkai

@tanhangkai Why CornerNet need two top_left branch and two bottom right branch??Why do you do this? What are the benefits of doing so?

YJLCV avatar Sep 13 '19 02:09 YJLCV