in meshrcnn/modeling/roi_heads/voxel_head.py [0:0]
def __init__(self, cfg, input_shape):
super(VoxelRCNNConvUpsampleHead, self).__init__()
# fmt: off
num_classes = cfg.MODEL.ROI_HEADS.NUM_CLASSES
conv_dims = cfg.MODEL.ROI_VOXEL_HEAD.CONV_DIM
self.norm = cfg.MODEL.ROI_VOXEL_HEAD.NORM
num_conv = cfg.MODEL.ROI_VOXEL_HEAD.NUM_CONV
input_channels = input_shape.channels
cls_agnostic_voxel = cfg.MODEL.ROI_VOXEL_HEAD.CLS_AGNOSTIC_VOXEL
# fmt: on
self.conv_norm_relus = []
self.num_depth = cfg.MODEL.ROI_VOXEL_HEAD.NUM_DEPTH
self.num_classes = 1 if cls_agnostic_voxel else num_classes
for k in range(num_conv):
conv = Conv2d(
input_channels if k == 0 else conv_dims,
conv_dims,
kernel_size=3,
stride=1,
padding=1,
bias=not self.norm,
norm=get_norm(self.norm, conv_dims),
activation=F.relu,
)
self.add_module("voxel_fcn{}".format(k + 1), conv)
self.conv_norm_relus.append(conv)
self.deconv = ConvTranspose2d(
conv_dims if num_conv > 0 else input_channels,
conv_dims,
kernel_size=2,
stride=2,
padding=0,
)
self.predictor = Conv2d(
conv_dims, self.num_classes * self.num_depth, kernel_size=1, stride=1, padding=0
)
for layer in self.conv_norm_relus + [self.deconv]:
weight_init.c2_msra_fill(layer)
# use normal distribution initialization for voxel prediction layer
nn.init.normal_(self.predictor.weight, std=0.001)
if self.predictor.bias is not None:
nn.init.constant_(self.predictor.bias, 0)