Example #1
0
    def __init__(self, num_features_in, num_anchors=9, feature_size=256):
        super(RegressionModel, self).__init__()

        self.conv1 = MetaConv2d(num_features_in,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act1 = nn.ReLU()

        self.conv2 = MetaConv2d(feature_size,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act2 = nn.ReLU()

        self.conv3 = MetaConv2d(feature_size,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act3 = nn.ReLU()

        self.conv4 = MetaConv2d(feature_size,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act4 = nn.ReLU()

        self.output = MetaConv2d(feature_size,
                                 num_anchors * 4,
                                 kernel_size=3,
                                 padding=1)
Example #2
0
    def __init__(self,
                 inplanes,
                 planes,
                 stride=1,
                 downsample=None,
                 act=GroupSort(2, axis=1)):
        super(Bottleneck, self).__init__()

        self.conv1 = MetaConv2d(inplanes, planes, kernel_size=1, bias=False)

        self.conv2 = MetaConv2d(planes,
                                planes,
                                kernel_size=3,
                                stride=stride,
                                padding=1,
                                bias=False)

        self.conv3 = MetaConv2d(planes, planes * 4, kernel_size=1, bias=False)

        self.act = act
        self.downsample = downsample
        self.stride = stride
        self.bn1 = MetaBatchNorm2d(planes)
        self.bn2 = MetaBatchNorm2d(planes)
        self.bn3 = MetaBatchNorm2d(planes * 4)
Example #3
0
    def __init__(self, C3_size, C4_size, C5_size, feature_size=256):
        super(PyramidFeatures, self).__init__()

        # upsample C5 to get P5 from the FPN paper
        self.P5_1 = MetaConv2d(C5_size,
                               feature_size,
                               kernel_size=1,
                               stride=1,
                               padding=0)
        self.P5_upsampled = nn.Upsample(scale_factor=2, mode='nearest')
        self.P5_2 = MetaConv2d(feature_size,
                               feature_size,
                               kernel_size=3,
                               stride=1,
                               padding=1)

        # add P5 elementwise to C4
        self.P4_1 = MetaConv2d(C4_size,
                               feature_size,
                               kernel_size=1,
                               stride=1,
                               padding=0)
        self.P4_upsampled = nn.Upsample(scale_factor=2, mode='nearest')
        self.P4_2 = MetaConv2d(feature_size,
                               feature_size,
                               kernel_size=3,
                               stride=1,
                               padding=1)

        # add P4 elementwise to C3
        self.P3_1 = MetaConv2d(C3_size,
                               feature_size,
                               kernel_size=1,
                               stride=1,
                               padding=0)
        self.P3_2 = MetaConv2d(feature_size,
                               feature_size,
                               kernel_size=3,
                               stride=1,
                               padding=1)

        # "P6 is obtained via a 3x3 stride-2 conv on C5"
        self.P6 = MetaConv2d(C5_size,
                             feature_size,
                             kernel_size=3,
                             stride=2,
                             padding=1)

        # "P7 is computed by applying ReLU followed by a 3x3 stride-2 conv on P6"
        self.P7_1 = nn.ReLU()
        self.P7_2 = MetaConv2d(feature_size,
                               feature_size,
                               kernel_size=3,
                               stride=2,
                               padding=1)
Example #4
0
    def __init__(self,
                 num_features_in,
                 num_anchors=9,
                 num_classes=80,
                 prior=0.01,
                 feature_size=256):
        super(ClassificationModel, self).__init__()

        self.num_classes = num_classes
        self.num_anchors = num_anchors

        self.conv1 = MetaConv2d(num_features_in,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act1 = nn.ReLU()

        self.conv2 = MetaConv2d(feature_size,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act2 = nn.ReLU()

        self.conv3 = MetaConv2d(feature_size,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act3 = nn.ReLU()

        self.conv4 = MetaConv2d(feature_size,
                                feature_size,
                                kernel_size=3,
                                padding=1)
        self.act4 = nn.ReLU()

        self.output = MetaConv2d(feature_size,
                                 num_anchors * num_classes,
                                 kernel_size=3,
                                 padding=1)
        self.output_act = nn.Sigmoid()
Example #5
0
 def __init__(self,
              inplanes,
              planes,
              stride=1,
              downsample=None,
              act=nn.ReLU()):
     super(BasicBlock, self).__init__()
     self.conv1 = MetaConv2d(inplanes,
                             planes,
                             kernel_size=3,
                             stride=stride,
                             padding=1,
                             bias=False)
     self.act = act
     self.conv2 = MetaConv2d(planes,
                             planes,
                             kernel_size=3,
                             stride=1,
                             padding=1,
                             bias=False)
     self.downsample = downsample
     self.stride = stride
Example #6
0
    def _make_layer(self,
                    block,
                    planes,
                    blocks,
                    stride=1,
                    act=nn.ReLU(inplace=True),
                    conv=nn.Conv2d):
        downsample = None
        if stride != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.Sequential(
                MetaConv2d(self.inplanes,
                           planes * block.expansion,
                           kernel_size=1,
                           stride=stride,
                           bias=False),
                MetaBatchNorm2d(planes * block.expansion),
            )

        layers = [block(self.inplanes, planes, stride, downsample, act=act)]
        self.inplanes = planes * block.expansion
        for i in range(1, blocks):
            layers.append(block(self.inplanes, planes, act=act))

        return nn.Sequential(*layers)
Example #7
0
    def __init__(self,
                 num_classes,
                 block,
                 layers,
                 act=nn.ReLU(),
                 conv=nn.Conv2d):
        self.inplanes = 4
        super(ResNetReduced, self).__init__()
        self.conv1 = MetaConv2d(3,
                                4,
                                kernel_size=7,
                                stride=2,
                                padding=3,
                                bias=False)
        self.act = act
        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
        self.layer1 = self._make_layer(block, 4, layers[0])
        self.layer2 = self._make_layer(block, 8, layers[1], stride=2)
        self.layer3 = self._make_layer(block, 16, layers[2], stride=2)
        self.layer4 = self._make_layer(block, 32, layers[3], stride=2)
        self.bn1 = MetaBatchNorm2d(4)
        if block == BasicBlock:
            fpn_sizes = [
                self.layer2[layers[1] - 1].conv2.out_channels,
                self.layer3[layers[2] - 1].conv2.out_channels,
                self.layer4[layers[3] - 1].conv2.out_channels
            ]
        elif block == Bottleneck:
            fpn_sizes = [
                self.layer2[layers[1] - 1].conv3.out_channels,
                self.layer3[layers[2] - 1].conv3.out_channels,
                self.layer4[layers[3] - 1].conv3.out_channels
            ]
        else:
            raise ValueError(f"Block type {block} not understood")

        self.fpn = PyramidFeatures(fpn_sizes[0],
                                   fpn_sizes[1],
                                   fpn_sizes[2],
                                   feature_size=32)

        self.regressionModel = RegressionModel(32,
                                               num_anchors=15,
                                               feature_size=32)
        self.classificationModel = ClassificationModel(32,
                                                       num_classes=num_classes,
                                                       num_anchors=15,
                                                       feature_size=32)

        self.anchors = Anchors()

        self.regressBoxes = BBoxTransform()

        self.clipBoxes = ClipBoxes()

        self.focalLoss = losses.FocalLoss()

        for m in self.modules():
            if isinstance(m, conv):
                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                m.weight.data.normal_(0, math.sqrt(2. / n))
            elif isinstance(m, MetaBatchNorm2d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()

        prior = 0.01

        self.classificationModel.output.weight.data.fill_(0)
        self.classificationModel.output.bias.data.fill_(-math.log(
            (1.0 - prior) / prior))

        self.regressionModel.output.weight.data.fill_(0)
        self.regressionModel.output.bias.data.fill_(0)

        self.freeze_bn()