Esempio n. 1
0
    def forward(self, y_true, y_pred):
        """
            - y_pred to bbox_abs
            - get pred_xy_rel and pred_wh_rel
        """
        pred_box_abs, pred_obj, pred_landmark, pred_box_rel = get_absolute_yolo_box(
            y_pred, self.valid_anchors_wh, self.num_landmarks)
        # print(self.valid_anchors_wh)
        # print('=' * 20, 'get_abs_pred', '*' * 20)
        # print(pred_box_abs.shape)
        # print(pred_obj.shape)
        # print(pred_landmark.shape)
        # print(pred_box_rel.shape)
        pred_box_abs = xywh_to_x1x2y1y2(pred_box_abs)
        pred_xy_rel = pred_box_rel[..., 0:2]
        pred_wh_rel = pred_box_rel[..., 2:4]
        """
            - y_true to bbox_rel
            - get true_xy_rel and true_wh_rel
        """
        true_box_rel, true_obj, true_landmark, true_box_abs = get_relative_yolo_box(
            y_true, self.valid_anchors_wh, self.num_landmarks)

        # print(true_obj)
        # print('=' * 20, 'get_rel_pred', '*' * 20)
        # print(true_box_rel.shape)
        # print(true_obj.shape)
        # print(true_landmark.shape)
        # print(true_box_abs.shape)
        true_box_abs = xywh_to_x1x2y1y2(true_box_abs)
        true_xy_rel = true_box_rel[..., 0:2]
        true_wh_rel = true_box_rel[..., 2:4]

        true_wh_abs = true_box_abs[..., 2:4]
        weight = 2 - true_wh_abs[..., 0] * true_wh_abs[..., 1]

        # print('=' * 20, 'calc_loss', '*' * 20)
        xy_loss = self.calc_xy_loss(true_xy_rel, pred_xy_rel, true_obj, weight)
        wh_loss = self.calc_xy_loss(true_wh_rel, pred_wh_rel, true_obj, weight)
        landmark_loss = self.calc_xy_loss(true_landmark, pred_landmark,
                                          true_obj, weight)
        ignore_mask = self.calc_ignore_mask(true_box_abs, pred_box_abs,
                                            true_obj)

        # print('=' * 10, 'xy_loss', '=' * 10)
        # print(xy_loss)
        # print('=' * 10, 'wh_loss', '=' * 10)
        # print(wh_loss)
        # print('=' * 10, 'landmark_loss', '=' * 10)
        # print(landmark_loss)
        # print('-' * 10, 'obj_loss', '-' * 10)
        obj_loss = self.calc_obj_loss(true_obj, pred_obj, ignore_mask)

        return xy_loss + wh_loss + landmark_loss + obj_loss, (xy_loss, wh_loss,
                                                              landmark_loss,
                                                              obj_loss)
Esempio n. 2
0
    def forward(self, inputs, training):
        # y0, y1, y2
        x_s, x_m, x_l = self.backbone(inputs)

        x = self.large_5dbl(x_l)
        y_large = self.large_feature(x)

        x = self.large_upsampling(x)
        x = torch.cat((x, x_m), 1)
        x = self.medium_5dbl(x)
        y_medium = self.medium_feature(x)

        x = self.medium_upsampling(x)
        x = torch.cat((x, x_s), 1)
        x = self.small_5dbl(x)
        y_small = self.small_feature(x)

        # (batch, 3(anchor box) x (5 + num_classes), grid, grid) 형태
        y_small_shape = y_small.shape
        y_medium_shape = y_medium.shape
        y_large_shape = y_large.shape

        # (batch, grid, grid, 3, 5 + num_classes)로 변환환
        y_small = y_small.view(y_small_shape[0], -1, 3, y_small_shape[-2],
                               y_small_shape[-1]).permute(0, -1, -2, 2, 1)
        y_medium = y_medium.view(y_medium_shape[0], -1, 3, y_medium_shape[-2],
                                 y_medium_shape[-1]).permute(0, -1, -2, 2, 1)
        y_large = y_large.view(y_large_shape[0], -1, 3, y_large_shape[-2],
                               y_large_shape[-1]).permute(0, -1, -2, 2, 1)

        if training:
            return y_small, y_medium, y_large

        box_small = get_absolute_yolo_box(y_small, anchors_wh[0:3],
                                          self.num_classes)
        box_medium = get_absolute_yolo_box(y_medium, anchors_wh[3:6],
                                           self.num_classes)
        box_large = get_absolute_yolo_box(y_large, anchors_wh[6:9],
                                          self.num_classes)

        return box_small, box_medium, box_large
Esempio n. 3
0
    def forward(self, inputs, training):
        x_small, x_medium, x_large = self.backbone(inputs)

        x = self.large_scale_dbl5(x_large)
        y_large = self.large_scale_detection(x)

        x = self.large_scale_upsampling(x)
        x = torch.cat((x, x_medium), 1)
        x = self.medium_scale_block(x)
        y_medium = self.medium_scale_detection(x)

        x = self.medium_scale_upsampling(x)
        x = torch.cat((x, x_small), 1)
        x = self.small_scale_block(x)
        y_small = self.small_scale_detection(x)

        y_large_shape = y_large.shape
        y_medium_shape = y_medium.shape
        y_small_shape = y_small.shape

        y_large = y_large.view(y_large_shape[0], -1, 3, y_large_shape[-2],
                               y_large_shape[-1]).permute(0, -1, -2, 2, 1)
        y_medium = y_medium.view(y_medium_shape[0], -1, 3, y_medium_shape[-2],
                                 y_medium_shape[-1]).permute(0, -1, -2, 2, 1)
        y_small = y_small.view(y_small_shape[0], -1, 3, y_small_shape[-2],
                               y_small_shape[-1]).permute(0, -1, -2, 2, 1)

        if training:
            return y_small, y_medium, y_large

        box_small = get_absolute_yolo_box(y_small, anchors_wh[0:3],
                                          self.num_landmarks)
        box_medium = get_absolute_yolo_box(y_medium, anchors_wh[3:6],
                                           self.num_landmarks)
        box_large = get_absolute_yolo_box(y_large, anchors_wh[6:9],
                                          self.num_landmarks)
        return box_small, box_medium, box_large
    def forward(self, y_true, y_pred):
        # iou, ignore_mask 계산에 필요
        pred_box_abs, pred_obj, pred_class, pred_box_rel = get_absolute_yolo_box(
            y_pred, self.valid_anchors_wh, self.num_classes)
        pred_box_abs = xywh_to_x1x2y1y2(pred_box_abs)
        pred_xy_rel = pred_box_rel[..., 0:2]
        pred_wh_rel = pred_box_rel[..., 2:4]
        # print(f'pred_box_abs: {pred_box_abs.shape}')
        # print(f'pred_xy_rel: {pred_xy_rel.shape}')
        # print(f'pred_wh_rel: {pred_wh_rel.shape}')

        # loss 계산에 필요
        true_box_rel, true_obj, true_class, true_box_abs = get_relative_yolo_box(
            y_true, self.valid_anchors_wh, self.num_classes)

        true_box_abs = xywh_to_x1x2y1y2(true_box_abs)
        true_xy_rel = true_box_rel[..., 0:2]
        true_wh_rel = true_box_rel[..., 2:4]

        true_wh_abs = true_box_abs[..., 2:4]
        # print(f'true_box_abs: {true_box_abs.shape}')
        # print(f'true_box_rel: {true_box_rel.shape}')
        # print(f'true_obj_rel: {true_obj.shape}')

        # w, h를 통해 작은 box detect를 위한 조정
        weight = 2 - true_wh_abs[..., 0] * true_wh_abs[..., 1]

        xy_loss = self.calc_xywh_loss(true_xy_rel, pred_xy_rel, true_obj,
                                      weight)
        wh_loss = self.calc_xywh_loss(true_wh_rel, pred_wh_rel, true_obj,
                                      weight)
        class_loss = self.calc_class_loss(true_obj, true_class, pred_class)
        ignore_mask = self.calc_ignore_mask(true_box_abs, pred_box_abs,
                                            true_obj)
        # print(f'ignore_mask: {ignore_mask.shape}')
        obj_loss = self.calc_obj_loss(true_obj, pred_obj, ignore_mask)

        # print(f'xy_loss : {xy_loss}')
        # print(f'wh_loss : {wh_loss}')
        # print(f'class_loss : {class_loss}')
        # print(f'ignore_mask : {ignore_mask}')
        # print(f'obj_loss : {obj_loss}')
        return xy_loss + wh_loss + class_loss + obj_loss, (xy_loss, wh_loss,
                                                           class_loss,
                                                           obj_loss)
Esempio n. 5
0
    def forward(self, y_true, y_pred):

        # print(y_true[0][idx[0]][idx[1]][idx[2]][:5])
        # print(y_pred[0][idx[0]][idx[1]][idx[2]][:5])
        # iou, ignore_mask 계산에 필요
        pred_box_abs, pred_obj, pred_class, pred_box_rel = get_absolute_yolo_box(
            y_pred, self.valid_anchors_wh, self.num_classes)
        pred_box_abs = xywh_to_x1x2y1y2(pred_box_abs)
        pred_xy_rel = pred_box_rel[..., 0:2]
        pred_wh_rel = pred_box_rel[..., 2:4]

        # loss 계산에 필요
        # print('======', y_true[0][idx[0]][idx[1]][idx[2]][:5])
        true_box_rel, true_obj, true_class, true_box_abs = get_relative_yolo_box(
            y_true, self.valid_anchors_wh, self.num_classes)
        # print(true_box_rel)
        # print(true_box_rel[0][9][4][2])
        # print(true_obj[0][9][4][2])

        true_box_abs = xywh_to_x1x2y1y2(true_box_abs)
        true_xy_rel = true_box_rel[..., 0:2]
        true_wh_rel = true_box_rel[..., 2:4]

        true_wh_abs = true_box_abs[..., 2:4]

        # w, h를 통해 작은 box detect를 위한 조정
        weight = 2 - true_wh_abs[..., 0] * true_wh_abs[..., 1]

        xy_loss = self.calc_xywh_loss(true_xy_rel, pred_xy_rel, true_obj,
                                      weight)
        wh_loss = self.calc_xywh_loss(true_wh_rel, pred_wh_rel, true_obj,
                                      weight)
        class_loss = self.calc_class_loss(true_obj, true_class, pred_class)
        ignore_mask = self.calc_ignore_mask(true_box_abs, pred_box_abs,
                                            true_obj)
        obj_loss = self.calc_obj_loss(true_obj, pred_obj, ignore_mask)

        return xy_loss + wh_loss + class_loss + obj_loss, (xy_loss, wh_loss,
                                                           class_loss,
                                                           obj_loss)
Esempio n. 6
0
def main():
    # DB_path = './data/VOC2007_trainval/'
    # csv_file = '2007_train.csv'
    DB_path = './data/ex'
    csv_file = 'ex_train.csv'

    pth_dir = './models/'

    # # 학습했던 모델 불러오기
    saved_pth_dir = './models'
    pth_file = '999_0.8255.pth'

    use_cuda = torch.cuda.is_available()
    device = torch.device(
        'cuda' if torch.cuda.is_available() else torch.device('cpu'))

    num_classes = 20
    lr_rate = 0.001

    dataset = CustomDataset(DB_path, csv_file, num_classes)
    dataloader = DataLoader(dataset,
                            batch_size=BATCH_SIZE,
                            shuffle=True,
                            num_workers=0)

    model = YoloV3(num_classes).to(device)
    # loss_object = [Yololoss(num_classes, valid_anchors_wh) for valid_anchors_wh in anchors_wh_mask]
    optimizer = torch.optim.Adam(model.parameters(), lr=lr_rate)
    loss1 = Yololoss(num_classes, anchors_wh_mask[2]).cuda()

    # EPOCH = 1

    true_idxs = [[9, 4, 2], [9, 10, 1], [8, 1, 1], [4, 2, 1], [6, 4, 2],
                 [6, 10, 1]]
    for epoch in range(EPOCH):
        model.train()
        for image, label in dataloader:
            optimizer.zero_grad()
            if use_cuda:
                image = image.cuda()
                # label[0] = label[0].cuda()
                # label[1] = label[1].cuda()
                label[2] = label[2].cuda()

            outputs = model(image, training=True)
            y_small, y_medium, y_large = outputs

            total_loss, each_loss = loss1(label[2], y_large)
            total_loss.backward()
            optimizer.step()

            print(f'Epoch : {epoch} - loss : {total_loss}')
            print(f'obj_loss : {each_loss[3]}')

            bbox_abs, objectness, classes, bbox_rel = get_absolute_yolo_box(
                y_large, anchors_wh[6:9], num_classes)

            for true_idx in true_idxs[:1]:
                print(true_idx)
                print('Label : ',
                      label[2][0][true_idx[0]][true_idx[1]][true_idx[2]][5:])
                print('Predic: ',
                      y_large[0][true_idx[0]][true_idx[1]][true_idx[2]][5:])
                # print(f'Predict : {bbox_abs[0][9][4][2]} - {objectness[0][9][4][2]}')
            print()