Example #1
0
    def resnet_factory(cls,
                       depth,
                       use_3x3_conv0,
                       use_bn_preprocess,
                       num_branch,
                       branch_dilates,
                       branch_ids,
                       branch_bn_shared,
                       branch_conv_shared,
                       branch_deform,
                       norm_type="local",
                       norm_mom=0.9,
                       ndev=None,
                       fp16=False):
        num_c2_unit, num_c3_unit, num_c4_unit, num_c5_unit = TridentResNetV2Builder.depth_config[
            depth]

        data = X.var("data")
        if fp16:
            data = X.to_fp16(data, "data_fp16")
        c1 = cls.resnet_c1(data, use_3x3_conv0, use_bn_preprocess, norm_type,
                           norm_mom, ndev)
        c2 = cls.resnet_c2(c1, num_c2_unit, 1, 1, norm_type, norm_mom, ndev)
        c3 = cls.resnet_c3(c2, num_c3_unit, 2, 1, norm_type, norm_mom, ndev)
        c4 = cls.resnet_trident_c4(c3, num_c4_unit, 2, branch_dilates,
                                   norm_type, norm_mom, ndev, num_branch,
                                   branch_ids, branch_bn_shared,
                                   branch_conv_shared, branch_deform)
        # stack branch features and merge into batch dim
        c4 = cls.stack_branch_symbols(c4)
        c5 = cls.resnet_c5(c4, num_c5_unit, 1, 2, norm_type, norm_mom, ndev)

        return c1, c2, c3, c4, c5
Example #2
0
    def get_roi_feature(self, conv_fpn_feat, rois, trans, image_rois,
                        batch_image):
        p = self.p
        rcnn_stride = p.stride
        roi_canonical_scale = p.roi_canonical_scale
        roi_canonical_level = p.roi_canonical_level

        _trans = mx.sym.reshape(trans, [-1, image_rois, 2])
        roi_group, offset_group = fpn_roi_assign_offset(
            mx.symbol, rois, _trans, rcnn_stride, roi_canonical_scale,
            roi_canonical_level)

        rois_fpn = dict()
        offset_fpn = dict()
        for i, stride in enumerate(rcnn_stride):
            rois_fpn["stride%s" % stride] = mx.sym.reshape(
                roi_group[i], [-1, 4])
            offset_fpn["stride%s" % stride] = mx.sym.tile(
                mx.sym.reshape(offset_group[i], [-1, 2, 1, 1]),
                (1, 1, p.out_size, p.out_size))

        if p.fp16:
            for stride in rcnn_stride:
                conv_fpn_feat["stride%s" % stride] = X.to_fp32(
                    conv_fpn_feat["stride%s" % stride],
                    name="fpn_stride%s_to_fp32")

        batch_pad = mx.sym.reshape(
            mx.sym.repeat(mx.sym.arange(batch_image),
                          repeats=image_rois,
                          axis=0), [-1, 1])

        fpn_roi_feats = list()
        for stride in rcnn_stride:
            feat_lvl = conv_fpn_feat["stride%s" % stride]
            rois_lvl = rois_fpn["stride%s" % stride]
            offset_lvl = offset_fpn["stride%s" % stride]
            rois_lvl = mx.sym.concat(batch_pad, rois_lvl, dim=1)

            roi_feat = mx.sym.contrib.DeformablePSROIPooling(
                data=feat_lvl,
                rois=rois_lvl,
                trans=offset_lvl,
                spatial_scale=1. / stride,
                output_dim=256,
                group_size=1,
                pooled_size=p.out_size,
                part_size=0,
                sample_per_part=4,
                trans_std=0.1,
                no_trans=False,
                name='delta_r_pooled_feat_stride%s' % stride)
            fpn_roi_feats.append(roi_feat)
        roi_feat = X.add_n(*fpn_roi_feats)

        if p.fp16:
            roi_feat = X.to_fp16(roi_feat, name="delta_r_roi_feat_to_fp16")

        return roi_feat
Example #3
0
    def get_roi_feature(self, conv_fpn_feat, proposal):
        p = self.p
        rcnn_stride = p.stride
        roi_canonical_scale = p.roi_canonical_scale
        roi_canonical_level = p.roi_canonical_level

        group = mx.symbol.Custom(
            op_type="assign_layer_fpn",
            rois=proposal,
            rcnn_stride=rcnn_stride,
            roi_canonical_scale=roi_canonical_scale,
            roi_canonical_level=roi_canonical_level,
            name="assign_layer_fpn"
        )
        proposal_fpn = dict()
        for i, stride in enumerate(rcnn_stride):
            proposal_fpn["stride%s" % stride] = group[i]

        if p.fp16:
            for stride in rcnn_stride:
                conv_fpn_feat["stride%s" % stride] = X.to_fp32(
                    conv_fpn_feat["stride%s" % stride],
                    name="fpn_stride%s_to_fp32"
                )

        fpn_roi_feats = list()
        for stride in rcnn_stride:
            feat_lvl = conv_fpn_feat["stride%s" % stride]
            proposal_lvl = proposal_fpn["stride%s" % stride]
            roi_feat = X.roi_align(
                feat_lvl,
                rois=proposal_lvl,
                out_size=p.out_size,
                stride=stride,
                name="roi_align"
            )
            roi_feat = X.reshape(
                data=roi_feat,
                shape=(-3, -2),
                name='roi_feat_reshape'
            )
            fpn_roi_feats.append(roi_feat)
        roi_feat = X.add_n(*fpn_roi_feats)

        if p.fp16:
            roi_feat = X.to_fp16(roi_feat, name="roi_feat_to_fp16")

        return roi_feat
Example #4
0
    def get_roi_feature(self, rcnn_feat, proposal):
        p = self.p

        if p.fp16:
            rcnn_feat = X.to_fp32(rcnn_feat, "rcnn_feat_to_fp32")

        roi_feat = X.roi_align(rcnn_feat,
                               rois=proposal,
                               out_size=p.out_size,
                               stride=p.stride,
                               name="roi_align")

        if p.fp16:
            roi_feat = X.to_fp16(roi_feat, "roi_feat_to_fp16")

        roi_feat = X.reshape(roi_feat, (-3, -2))

        return roi_feat
Example #5
0
    def get_roi_feature(self, conv_fpn_feat, proposal):
        p = self.p
        rcnn_stride = p.stride

        group = mx.symbol.Custom(rois=proposal, op_type='assign_layer_fpn')
        proposal_fpn = dict()
        proposal_fpn["stride4"] = group[1]
        proposal_fpn["stride8"] = group[2]
        proposal_fpn["stride16"] = group[3]
        proposal_fpn["stride32"] = group[4]

        if p.fp16:
            for stride in rcnn_stride:
                conv_fpn_feat["stride%s" % stride] = X.to_fp32(
                    conv_fpn_feat["stride%s" % stride],
                    name="fpn_stride%s_to_fp32")

        fpn_roi_feats = list()
        for stride in rcnn_stride:
            feat_lvl = conv_fpn_feat["stride%s" % stride]
            proposal_lvl = proposal_fpn["stride%s" % stride]
            roi_feat = X.roi_align(feat_lvl,
                                   rois=proposal_lvl,
                                   out_size=p.out_size,
                                   stride=stride,
                                   name="roi_align")
            roi_feat = X.reshape(data=roi_feat,
                                 shape=(-3, -2),
                                 name='roi_feat_reshape')
            fpn_roi_feats.append(roi_feat)
        roi_feat = X.add_n(*fpn_roi_feats)

        if p.fp16:
            roi_feat = X.to_fp16(roi_feat, name="roi_feat_to_fp16")

        return roi_feat
Example #6
0
    def fpn_conv_down(self, data):
        if self.fpn_feat:
            return self.fpn_feat

        c2, c3, c4, c5 = data

        if self.p.fp16:
            c2 = X.to_fp32(c2, name="c2_to_fp32")
            c3 = X.to_fp32(c3, name="c3_to_fp32")
            c4 = X.to_fp32(c4, name="c4_to_fp32")
            c5 = X.to_fp32(c5, name="c5_to_fp32")

        xavier_init = mx.init.Xavier(factor_type="in",
                                     rnd_type="uniform",
                                     magnitude=3)

        # P5
        p5 = X.conv(data=c5,
                    filter=256,
                    no_bias=False,
                    weight=X.var(name="P5_lateral_weight", init=xavier_init),
                    bias=X.var(name="P5_lateral_bias", init=X.zero_init()),
                    name="P5_lateral")
        p5_conv = X.conv(data=p5,
                         kernel=3,
                         filter=256,
                         no_bias=False,
                         weight=X.var(name="P5_conv_weight", init=xavier_init),
                         bias=X.var(name="P5_conv_bias", init=X.zero_init()),
                         name="P5_conv")

        # P4
        p5_up = mx.sym.UpSampling(p5,
                                  scale=2,
                                  sample_type="nearest",
                                  name="P5_upsampling",
                                  num_args=1)
        p4_la = X.conv(data=c4,
                       filter=256,
                       no_bias=False,
                       weight=X.var(name="P4_lateral_weight",
                                    init=xavier_init),
                       bias=X.var(name="P4_lateral_bias", init=X.zero_init()),
                       name="P4_lateral")
        p5_clip = mx.sym.Crop(*[p5_up, p4_la], name="P4_clip")
        p4 = mx.sym.ElementWiseSum(*[p5_clip, p4_la], name="P4_sum")

        p4_conv = X.conv(data=p4,
                         kernel=3,
                         filter=256,
                         no_bias=False,
                         weight=X.var(name="P4_conv_weight", init=xavier_init),
                         bias=X.var(name="P4_conv_bias", init=X.zero_init()),
                         name="P4_conv")

        # P3
        p4_up = mx.sym.UpSampling(p4,
                                  scale=2,
                                  sample_type="nearest",
                                  name="P4_upsampling",
                                  num_args=1)
        p3_la = X.conv(data=c3,
                       filter=256,
                       no_bias=False,
                       weight=X.var(name="P3_lateral_weight",
                                    init=xavier_init),
                       bias=X.var(name="P3_lateral_bias", init=X.zero_init()),
                       name="P3_lateral")
        p4_clip = mx.sym.Crop(*[p4_up, p3_la], name="P3_clip")
        p3 = mx.sym.ElementWiseSum(*[p4_clip, p3_la], name="P3_sum")

        p3_conv = X.conv(data=p3,
                         kernel=3,
                         filter=256,
                         no_bias=False,
                         weight=X.var(name="P3_conv_weight", init=xavier_init),
                         bias=X.var(name="P3_conv_bias", init=X.zero_init()),
                         name="P3_conv")

        # P2
        p3_up = mx.sym.UpSampling(p3,
                                  scale=2,
                                  sample_type="nearest",
                                  name="P3_upsampling",
                                  num_args=1)
        p2_la = X.conv(data=c2,
                       filter=256,
                       no_bias=False,
                       weight=X.var(name="P2_lateral_weight",
                                    init=xavier_init),
                       bias=X.var(name="P2_lateral_bias", init=X.zero_init()),
                       name="P2_lateral")
        p3_clip = mx.sym.Crop(*[p3_up, p2_la], name="P2_clip")
        p2 = mx.sym.ElementWiseSum(*[p3_clip, p2_la], name="P2_sum")

        p2_conv = X.conv(data=p2,
                         kernel=3,
                         filter=256,
                         no_bias=False,
                         weight=X.var(name="P2_conv_weight", init=xavier_init),
                         bias=X.var(name="P2_conv_bias", init=X.zero_init()),
                         name="P2_conv")

        # P6
        p6 = X.pool(p5_conv,
                    name="P6_subsampling",
                    kernel=1,
                    stride=2,
                    pad=0,
                    pool_type='max')
        if self.p.fp16:
            p6 = X.to_fp16(p6, name="p6_to_fp16")
            p5_conv = X.to_fp16(p5_conv, name="p5_conv_to_fp16")
            p4_conv = X.to_fp16(p4_conv, name="p4_conv_to_fp16")
            p3_conv = X.to_fp16(p3_conv, name="p3_conv_to_fp16")
            p2_conv = X.to_fp16(p2_conv, name="p2_conv_to_fp16")

        conv_fpn_feat = dict()
        conv_fpn_feat.update({
            "stride64": p6,
            "stride32": p5_conv,
            "stride16": p4_conv,
            "stride8": p3_conv,
            "stride4": p2_conv
        })

        self.fpn_feat = conv_fpn_feat
        return self.fpn_feat