def __init__(self, inc, outc, inner_inc, inner_outc, inner_module=None, depth=1, bn_momentum=0.05, dimension=-1): ME.MinkowskiNetwork.__init__(self, dimension) self.depth = depth self.conv = nn.Sequential( conv_norm_non( inc, inner_inc, 3, 2, dimension, region_type=self.REGION_TYPE, norm_type=self.NORM_TYPE, nonlinearity=self.NONLINEARITY), *[ get_block( self.NORM_TYPE, inner_inc, inner_inc, bn_momentum=bn_momentum, region_type=self.REGION_TYPE, dimension=dimension) for d in range(depth) ]) self.inner_module = inner_module self.convtr = nn.Sequential( conv_tr( in_channels=inner_outc, out_channels=inner_outc, kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=self.REGION_TYPE, dimension=dimension), get_norm( self.NORM_TYPE, inner_outc, bn_momentum=bn_momentum, dimension=dimension), get_nonlinearity(self.NONLINEARITY)) self.cat_conv = conv_norm_non( inner_outc + inc, outc, 1, 1, dimension, norm_type=self.NORM_TYPE, nonlinearity=self.NONLINEARITY)
def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS REGION_TYPE = self.REGION_TYPE self.normalize_feature = normalize_feature self.conv1 = conv( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, region_type=ME.RegionType.HYPERCUBE, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.pool2 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv2 = conv( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.pool3 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv3 = conv( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.pool4 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv4 = conv( in_channels=CHANNELS[3], out_channels=CHANNELS[4], kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=ME.RegionType.HYPERCUBE, dimension=D) self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4 = get_block( BLOCK_NORM_TYPE, CHANNELS[4], CHANNELS[4], bn_momentum=bn_momentum, region_type=ME.RegionType.HYPERCUBE, dimension=D) self.conv4_tr = conv_tr( in_channels=CHANNELS[4], out_channels=TR_CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=ME.RegionType.HYPERCUBE, dimension=D) self.norm4_tr = get_norm( NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[4], TR_CHANNELS[4], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv3_tr = conv_tr( in_channels=CHANNELS[3] + TR_CHANNELS[4], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv2_tr = conv_tr( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv1_tr = conv( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D)
def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS DEPTHS = self.DEPTHS REGION_TYPE = self.REGION_TYPE self.normalize_feature = normalize_feature self.conv1 = conv( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[1]) ]) self.pool2 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv2 = conv( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[2]) ]) self.pool3 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv3 = conv( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[3]) ]) self.pool3_tr = ME.MinkowskiPoolingTranspose(kernel_size=2, stride=2, dimension=D) self.conv3_tr = conv_tr( in_channels=CHANNELS[3], out_channels=TR_CHANNELS[3], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[-3]) ]) self.pool2_tr = ME.MinkowskiPoolingTranspose(kernel_size=2, stride=2, dimension=D) self.conv2_tr = conv_tr( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=1, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[-2]) ]) self.conv1_tr = conv_tr( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.final = conv( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D)