Beispiel #1
0
    def __init__(self, pretrained=False):
        super(Detector, self).__init__()

        self.t = 100

        # ---------------------------
        # TODO: Param
        self.a_hw = [
            [32.00, 32.00],
            [40.32, 40.32],
            [50.80, 50.80],
            [22.63, 45.25],
            [28.51, 57.02],
            [35.92, 71.84],
            [45.25, 22.63],
            [57.02, 28.51],
            [71.84, 35.92],
        ]
        self.scales = 5
        # self.scales = [0,0,1,1,2]
        self.first_stride = 8
        # self.view_size = 1025
        self.view_size = 641
        self.iou_th = (0.4, 0.5)
        self.classes = 20
        # self.classes = 80
        self.nms_th = 0.05
        self.nms_iou = 0.5
        self.max_detections = 3000
        self.balanced_fpn = False
        # 统计了BIFPN中所有的结点 没有分开算
        self.w_2_in = nn.Parameter(torch.Tensor(
            2, 6).fill_(1))  # 6代表两个input的结点的个数,2代表每个结点分配的权重
        self.w_3_in = nn.Parameter(torch.Tensor(
            3, 2).fill_(1))  # 2代表两个input的结点的个数,3代表每个结点分配的权重
        self.eps = 0.0001
        self.w_relu = nn.ReLU()
        # ---------------------------

        # fpn =======================================================
        self.backbone = backbone(pretrained=pretrained)
        self.relu = nn.ReLU(inplace=True)

        self.conv_out6 = nn.Conv2d(2048,
                                   256,
                                   kernel_size=3,
                                   padding=1,
                                   stride=2)
        self.conv_out7 = nn.Conv2d(256,
                                   256,
                                   kernel_size=3,
                                   padding=1,
                                   stride=2)
        self.prj_5 = nn.Conv2d(2048, 256, kernel_size=1)
        self.prj_4 = nn.Conv2d(1024, 256, kernel_size=1)
        self.prj_3 = nn.Conv2d(512, 256, kernel_size=1)
        self.conv_5 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.conv_4 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.conv_3 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        # bifpn ======================================================
        self.bi1_prj1_5 = nn.Conv2d(2048, 256, kernel_size=1)
        self.bi1_prj1_5bn = nn.BatchNorm2d(256, momentum=0.01, eps=1e-3)
        self.bi1_prj1_4 = nn.Conv2d(1024, 256, kernel_size=1)
        self.bi1_prj1_4bn = nn.BatchNorm2d(256, momentum=0.01, eps=1e-3)
        self.bi1_prj1_3 = nn.Conv2d(512, 256, kernel_size=1)
        self.bi1_prj1_3bn = nn.BatchNorm2d(256, momentum=0.01, eps=1e-3)
        self.bi1_prj2_5 = ConvBlock(256)
        self.bi1_prj2_4 = ConvBlock(256)
        self.bi1_prj2_3 = ConvBlock(256)
        self.bi1_prj3_5 = ConvBlock(256)
        self.bi1_prj3_4 = ConvBlock(256)
        self.bi1_prj3_3 = ConvBlock(256)

        self.bi2_prj1_5 = ConvBlock(256)
        self.bi2_prj1_4 = ConvBlock(256)
        self.bi2_prj1_3 = ConvBlock(256)
        self.bi2_prj2_5 = ConvBlock(256)
        self.bi2_prj2_4 = ConvBlock(256)
        self.bi2_prj2_3 = ConvBlock(256)
        self.bi2_prj3_5 = ConvBlock(256)
        self.bi2_prj3_4 = ConvBlock(256)
        self.bi2_prj3_3 = ConvBlock(256)
        # -------------------------------------------
        self.bi1_prj2_5 = DepthWiseConvBlock(256)
        self.bi1_prj2_4 = DepthWiseConvBlock(256)
        self.bi1_prj2_3 = DepthWiseConvBlock(256)
        self.bi1_prj3_5 = DepthWiseConvBlock(256)
        self.bi1_prj3_4 = DepthWiseConvBlock(256)
        self.bi1_prj3_3 = DepthWiseConvBlock(256)

        self.bi2_prj1_5 = DepthWiseConvBlock(256)
        self.bi2_prj1_4 = DepthWiseConvBlock(256)
        self.bi2_prj1_3 = DepthWiseConvBlock(256)
        self.bi2_prj2_5 = DepthWiseConvBlock(256)
        self.bi2_prj2_4 = DepthWiseConvBlock(256)
        self.bi2_prj2_3 = DepthWiseConvBlock(256)
        self.bi2_prj3_5 = DepthWiseConvBlock(256)
        self.bi2_prj3_4 = DepthWiseConvBlock(256)
        self.bi2_prj3_3 = DepthWiseConvBlock(256)

        # head =======================================================
        self.conv_cls = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      len(self.a_hw) * self.classes,
                      kernel_size=3,
                      padding=1))
        self.conv_reg = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, len(self.a_hw) * 4, kernel_size=3, padding=1))

        # reinit head =======================================================
        for layer in self.conv_cls.children():
            if isinstance(layer, nn.Conv2d):
                nn.init.constant_(layer.bias, 0)
                nn.init.normal_(layer.weight, mean=0, std=0.01)
        for layer in self.conv_reg.children():
            if isinstance(layer, nn.Conv2d):
                nn.init.constant_(layer.bias, 0)
                nn.init.normal_(layer.weight, mean=0, std=0.01)
        pi = 0.01
        _bias = -math.log((1.0 - pi) / pi)
        nn.init.constant_(self.conv_cls[-1].bias, _bias)

        # generate anchors =======================================================
        self._view_anchors_yxyx, self._view_anchors_yxhw = \
            gen_anchors(self.a_hw, self.scales, self.view_size, self.first_stride)
        self.view_hwan = self._view_anchors_yxyx.shape[0]
        self.register_buffer('view_anchors_yxyx', self._view_anchors_yxyx)
        self.register_buffer('view_anchors_yx', self._view_anchors_yxhw[:, :2])
        self.register_buffer('view_anchors_hw', self._view_anchors_yxhw[:, 2:])
Beispiel #2
0
    def __init__(self, pretrained=False):
        super(Detector, self).__init__()

        # ---------------------------
        # TODO: Param
        self.a_hw = [
            [32.00, 32.00],
            [40.32, 40.32],
            [50.80, 50.80],
            [22.63, 45.25],
            [28.51, 57.02],
            [35.92, 71.84],
            [45.25, 22.63],
            [57.02, 28.51],
            [71.84, 35.92],
        ]
        self.scales = 5
        self.first_stride = 8
        self.view_size = 1025
        self.iou_th = (0.4, 0.5)
        self.classes = 80
        self.nms_th = 0.05
        self.nms_iou = 0.5
        self.max_detections = 3000
        self.balanced_fpn = False
        # ---------------------------

        # fpn =======================================================
        self.backbone = backbone(pretrained=pretrained)
        self.relu = nn.ReLU(inplace=True)
        self.conv_out6 = nn.Conv2d(2048,
                                   256,
                                   kernel_size=3,
                                   padding=1,
                                   stride=2)
        self.conv_out7 = nn.Conv2d(256,
                                   256,
                                   kernel_size=3,
                                   padding=1,
                                   stride=2)
        self.prj_5 = nn.Conv2d(2048, 256, kernel_size=1)
        self.prj_4 = nn.Conv2d(1024, 256, kernel_size=1)
        self.prj_3 = nn.Conv2d(512, 256, kernel_size=1)
        self.conv_5 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.conv_4 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.conv_3 = nn.Conv2d(256, 256, kernel_size=3, padding=1)

        # head =======================================================
        self.conv_cls = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256,
                      len(self.a_hw) * self.classes,
                      kernel_size=3,
                      padding=1))
        self.conv_reg = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, len(self.a_hw) * 4, kernel_size=3, padding=1))

        # reinit head =======================================================
        for layer in self.conv_cls.children():
            if isinstance(layer, nn.Conv2d):
                nn.init.constant_(layer.bias, 0)
                nn.init.normal_(layer.weight, mean=0, std=0.01)
        for layer in self.conv_reg.children():
            if isinstance(layer, nn.Conv2d):
                nn.init.constant_(layer.bias, 0)
                nn.init.normal_(layer.weight, mean=0, std=0.01)
        pi = 0.01
        _bias = -math.log((1.0 - pi) / pi)
        nn.init.constant_(self.conv_cls[-1].bias, _bias)

        # generate anchors =======================================================
        self._view_anchors_yxyx, self._view_anchors_yxhw = \
            gen_anchors(self.a_hw, self.scales, self.view_size, self.first_stride)
        self.view_hwan = self._view_anchors_yxyx.shape[0]
        self.register_buffer('view_anchors_yxyx', self._view_anchors_yxyx)
        self.register_buffer('view_anchors_yx', self._view_anchors_yxhw[:, :2])
        self.register_buffer('view_anchors_hw', self._view_anchors_yxhw[:, 2:])
Beispiel #3
0
    def __init__(self, pretrained=False):
        super(Detector, self).__init__()

        # ---------------------------
        # TODO: Param
        self.regions = [0, 64, 128, 256, 512, 9999]
        self.first_stride = 8
        self.view_size = 1025
        self.classes = 80
        self.nms_th = 0.05
        self.nms_iou = 0.6
        self.max_detections = 3000
        self.center_offset_ratio = 1.5
        # ---------------------------

        # fpn =======================================================
        self.backbone = Backbone(pretrained=pretrained)
        self.relu = nn.ReLU(inplace=True)
        self.conv_out6 = nn.Conv2d(2048,
                                   256,
                                   kernel_size=3,
                                   padding=1,
                                   stride=2)
        self.conv_out7 = nn.Conv2d(256,
                                   256,
                                   kernel_size=3,
                                   padding=1,
                                   stride=2)
        self.prj_5 = nn.Conv2d(2048, 256, kernel_size=1)
        self.prj_4 = nn.Conv2d(1024, 256, kernel_size=1)
        self.prj_3 = nn.Conv2d(512, 256, kernel_size=1)
        self.conv_5 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.conv_4 = nn.Conv2d(256, 256, kernel_size=3, padding=1)
        self.conv_3 = nn.Conv2d(256, 256, kernel_size=3, padding=1)

        # head =======================================================
        self.conv_cls = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, self.classes, kernel_size=3, padding=1))
        self.conv_reg = nn.Sequential(
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True), nn.Conv2d(256,
                                             256,
                                             kernel_size=3,
                                             padding=1), nn.ReLU(inplace=True),
            nn.Conv2d(256, 4, kernel_size=3, padding=1))

        # reinit head =======================================================
        for layer in self.conv_cls.children():
            if isinstance(layer, nn.Conv2d):
                nn.init.constant_(layer.bias, 0)
                nn.init.normal_(layer.weight, mean=0, std=0.01)
        for layer in self.conv_reg.children():
            if isinstance(layer, nn.Conv2d):
                nn.init.constant_(layer.bias, 0)
                nn.init.normal_(layer.weight, mean=0, std=0.01)
        pi = 0.01
        _bias = -math.log((1.0 - pi) / pi)
        nn.init.constant_(self.conv_cls[-1].bias, _bias)

        # learnable parameter for scales =====================================
        self.scale_div = nn.Parameter(torch.ones(len(self.regions) - 1))

        # generate anchors ===================================================
        self._a_center_yx, self._a_tlbr_max_minmax, self._a_center_offset_max = \
            gen_anchors(self.view_size, self.first_stride, self.regions, self.center_offset_ratio)
        self.a_shw = self._a_center_yx.shape[0]
        self.register_buffer('a_center_yx', self._a_center_yx)
        self.register_buffer('a_tlbr_max_minmax', self._a_tlbr_max_minmax)
        self.register_buffer('a_center_offset_max', self._a_center_offset_max)