Example #1
0
    # train set
    # -- Note: Use validation set and disable the flipped to enable faster loading.
    cfg.TRAIN.USE_FLIPPED = True
    cfg.USE_GPU_NMS = args.cuda
    imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdb_name)
    train_size = len(roidb)

    print('{:d} roidb entries'.format(len(roidb)))

    output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    sampler_batch = sampler(train_size, args.batch_size)

    dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                             imdb.num_classes, training=True)

    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             sampler=sampler_batch,
                                             num_workers=args.num_workers)

    # initilize the tensor holder here.
    im_data = torch.FloatTensor(1)
    im_info = torch.FloatTensor(1)
    num_boxes = torch.LongTensor(1)
    gt_boxes = torch.FloatTensor(1)

    # ship to cuda
    if args.cuda:
        im_data = im_data.cuda()
Example #2
0
    # train val test set
    roidb_path = os.path.join(args.roidb_dir, args.dataset, args.imdb_name)
    roidb = get_roidb(roidb_path)

    roidb_val_path = os.path.join(args.roidb_dir, args.dataset,
                                  args.valdb_name)
    roidb_val = get_roidb(roidb_val_path)

    roidb_test_path = os.path.join(args.roidb_dir, args.dataset,
                                   args.testdb_name)
    roidb_test = get_roidb(roidb_test_path)
    logger.info('{:d} roidb entries'.format(len(roidb)))

    dataset = roibatchLoader(roidb,
                             phase='train',
                             len_train=args.len_train,
                             length_support=args.length_support,
                             shot=args.shot)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             num_workers=args.num_workers,
                                             shuffle=True)

    dataset_val = roibatchLoader(roidb_val,
                                 phase='val',
                                 length_support=args.length_support,
                                 shot=args.shot)
    dataloader_val = torch.utils.data.DataLoader(dataset_val,
                                                 batch_size=args.batch_size,
                                                 num_workers=args.num_workers,
                                                 shuffle=False)
Example #3
0
    # train set
    roidb_path = args.roidb_dir + "/" + args.dataset + "/" + args.imdb_name
    roidb = get_roidb(roidb_path)

    print('{:d} roidb entries'.format(len(roidb)))

    model_dir = args.save_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(model_dir):
        os.makedirs(model_dir)
    output_dir = args.output_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # sampler_batch = sampler(train_size, args.batch_size)
    dataset = roibatchLoader(roidb)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             num_workers=args.num_workers,
                                             shuffle=True)

    support_set_roidb = get_roidb(args.trimmed_support_set_data)

    # initialize the network here.
    if args.net == 'c3d':
        tdcnn_demo = c3d_tdcnn_fewshot(pretrained=True)
    elif args.net == 'res18':
        tdcnn_demo = resnet_tdcnn(depth=18, pretrained=True)
    elif args.net == 'res34':
        tdcnn_demo = resnet_tdcnn(depth=34, pretrained=True)
    elif args.net == 'res50':
Example #4
0
        fasterRCNN.train()

        # Get database, and merge the class proto
        imdb, roidb, ratio_list, ratio_index = combined_roidb(
            args.dataset,
            "trainvalStep{}".format(group),
            classes=cfg.CLASSES[:now_cls_high],
            ext=cfg.EXT,
            data_extra=flatten(class_proto[:now_cls_low], distinct=True))

        train_size = len(roidb)
        sampler_batch = RcnnSampler(train_size, cfg.TRAIN.BATCH_SIZE)
        dataset = roibatchLoader(roidb,
                                 ratio_list,
                                 ratio_index,
                                 cfg.TRAIN.BATCH_SIZE,
                                 now_cls_high,
                                 training=True)
        dataloader = torch.utils.data.DataLoader(
            dataset,
            batch_size=cfg.TRAIN.BATCH_SIZE,
            sampler=sampler_batch,
            num_workers=min(cfg.TRAIN.BATCH_SIZE * 2, os.cpu_count()))
        tqdm.write('{:d} roidb entries'.format(len(roidb)))

        iters_per_epoch = train_size // cfg.TRAIN.BATCH_SIZE

        tqdm.write("===== Representation learning {} =====".format(group))
        repr_labels = []
        repr_features = []
        repr_images = []
Example #5
0
def evaluator(model, args, evl_rec=False):

    fasterRCNN = model
    np.random.seed(cfg.RNG_SEED)
    if args.dataset == "pascal_voc":
        args.imdb_name = "voc_2007_trainval"
        args.imdbval_name = "voc_2007_test"
        args.set_cfgs = [
            'ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'
        ]
    elif args.dataset == "pascal_voc_0712":
        args.imdb_name = "voc_2007_trainval+voc_2012_trainval"
        args.imdbval_name = "voc_2007_test"
        args.set_cfgs = [
            'ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]'
        ]

    args.cfg_file = "cfgs/{}_ls.yml".format(
        args.net) if args.large_scale else "cfgs/{}.yml".format(args.net)

    if args.cfg_file is not None:
        cfg_from_file(args.cfg_file)
    if args.set_cfgs is not None:
        cfg_from_list(args.set_cfgs)

    print('Using config:')
    pprint.pprint(cfg)
    cfg.TRAIN.USE_FLIPPED = False

    imdb, roidb, ratio_list, ratio_index = combined_roidb(
        args.imdbval_name, False)
    imdb.competition_mode(on=True)

    print('{:d} roidb entries'.format(len(roidb)))

    im_data = torch.FloatTensor(1)
    im_info = torch.FloatTensor(1)
    num_boxes = torch.LongTensor(1)
    gt_boxes = torch.FloatTensor(1)

    # ship to cuda
    if args.cuda:
        im_data = im_data.cuda()
        im_info = im_info.cuda()
        num_boxes = num_boxes.cuda()
        gt_boxes = gt_boxes.cuda()

    # make variable
    im_data = Variable(im_data)
    im_info = Variable(im_info)
    num_boxes = Variable(num_boxes)
    gt_boxes = Variable(gt_boxes)

    if args.cuda:
        cfg.CUDA = True

    if args.cuda:
        fasterRCNN.cuda()

    start = time.time()
    max_per_image = 100

    vis = False

    if vis:
        thresh = 0.05
    else:
        thresh = 0.0

    save_name = 'faster_rcnn_10'
    num_images = len(imdb.image_index)
    all_boxes = [[[] for _ in xrange(num_images)]
                 for _ in xrange(imdb.num_classes)]

    output_dir = get_output_dir(imdb, save_name)

    # These models are pytorch pretrained with RGB channel
    rgb = True if args.net in ('res18', 'res34', 'inception') else False

    dataset = roibatchLoader(roidb, ratio_list, ratio_index, 1, \
               imdb.num_classes, training=False, normalize = False, rgb=rgb)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=1,
                                             shuffle=False,
                                             num_workers=0,
                                             pin_memory=True)
    data_iter = iter(dataloader)

    _t = {'im_detect': time.time(), 'misc': time.time()}
    det_file = os.path.join(output_dir, 'detections.pkl')

    fasterRCNN.eval()
    empty_array = np.transpose(np.array([[], [], [], [], []]), (1, 0))

    if evl_rec:
        true_postive, ground_truth = 0.0, 0.0
        recall = AverageMeter()

    for i in range(num_images):

        data = next(data_iter)
        im_data.data.resize_(data[0].size()).copy_(data[0])
        im_info.data.resize_(data[1].size()).copy_(data[1])
        gt_boxes.data.resize_(data[2].size()).copy_(data[2])
        num_boxes.data.resize_(data[3].size()).copy_(data[3])

        det_tic = time.time()

        rois, cls_prob, bbox_pred, \
        rpn_loss_cls, rpn_loss_box, \
        RCNN_loss_cls, RCNN_loss_bbox, \
        rois_label = fasterRCNN(im_data, im_info, gt_boxes, num_boxes)

        scores = cls_prob.data
        boxes = rois.data[:, :, 1:5]

        if cfg.TEST.BBOX_REG:
            # Apply bounding-box regression deltas
            box_deltas = bbox_pred.data
            if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED:
                # Optionally normalize targets by a precomputed mean and stdev
                if args.class_agnostic:
                    box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \
                          + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda()
                    box_deltas = box_deltas.view(1, -1, 4)
                else:
                    box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \
                          + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda()
                    box_deltas = box_deltas.view(1, -1, 4 * len(imdb.classes))

            pred_boxes = bbox_transform_inv(boxes, box_deltas, 1)
            pred_boxes = clip_boxes(pred_boxes, im_info.data, 1)

        else:
            # Simply repeat the boxes, once for each class
            pred_boxes = np.tile(boxes, (1, scores.shape[1]))

        pred_boxes /= data[1][0][2].item()

        if evl_rec:
            # evluate rpn recall only
            boxes_per_img = boxes.squeeze().cpu().numpy() / data[1][0][2].item(
            )
            #pdb.set_trace()
            #TP, GT = evaluate_final_recall(pred_boxes.squeeze().cpu().numpy(), i, imdb, thr=0.5)
            TP, GT = evaluate_recall(boxes_per_img, i, imdb, thr=0.5)
            recall.update(TP, GT)

            sys.stdout.write('TP/GT: {}/{} | Recall: {:.3f} \r'.format(
                TP, GT, recall.avg))
            sys.stdout.flush()
            continue

        scores = scores.squeeze()
        pred_boxes = pred_boxes.squeeze()
        det_toc = time.time()
        detect_time = det_toc - det_tic
        misc_tic = time.time()
        if vis:
            im = cv2.imread(imdb.image_path_at(i))
            im2show = np.copy(im)
        for j in xrange(1, imdb.num_classes):
            inds = torch.nonzero(scores[:, j] > thresh).view(-1)
            # if there is det
            if inds.numel() > 0:
                cls_scores = scores[:, j][inds]
                _, order = torch.sort(cls_scores, 0, True)
                if args.class_agnostic:
                    cls_boxes = pred_boxes[inds, :]
                else:
                    cls_boxes = pred_boxes[inds][:, j * 4:(j + 1) * 4]

                cls_dets = torch.cat((cls_boxes, cls_scores.unsqueeze(1)), 1)
                # cls_dets = torch.cat((cls_boxes, cls_scores), 1)
                cls_dets = cls_dets[order]
                keep = nms(cls_dets, cfg.TEST.NMS)
                cls_dets = cls_dets[keep.view(-1).long()]
                if vis:
                    im2show = vis_detections(im2show, imdb.classes[j],
                                             cls_dets.cpu().numpy(), 0.3)
                all_boxes[j][i] = cls_dets.cpu().numpy()
            else:
                all_boxes[j][i] = empty_array

        # Limit to max_per_image detections *over all classes*
        if max_per_image > 0:
            image_scores = np.hstack(
                [all_boxes[j][i][:, -1] for j in xrange(1, imdb.num_classes)])
            if len(image_scores) > max_per_image:
                image_thresh = np.sort(image_scores)[-max_per_image]
                for j in xrange(1, imdb.num_classes):
                    keep = np.where(all_boxes[j][i][:, -1] >= image_thresh)[0]
                    all_boxes[j][i] = all_boxes[j][i][keep, :]

        misc_toc = time.time()
        nms_time = misc_toc - misc_tic

        sys.stdout.write('im_detect: {:d}/{:d} {:.3f}s {:.3f}s   \r' \
          .format(i + 1, num_images, detect_time, nms_time))
        sys.stdout.flush()

        if vis:
            cv2.imwrite('result.png', im2show)
            pdb.set_trace()
            #cv2.imshow('test', im2show)
            #cv2.waitKey(0)

    if evl_rec:
        print('\r\nThe average rpn recall is: {:.4f}'.format(recall.avg))
        return recall.avg

    with open(det_file, 'wb') as f:
        pickle.dump(all_boxes, f, pickle.HIGHEST_PROTOCOL)

    print('Evaluating detections')
    mAP = imdb.evaluate_detections(all_boxes, output_dir)

    end = time.time()
    print("test time: %0.4fs" % (end - start))
    return mAP
    def train(self):
        #参数
        net='vgg16'
        num_workers=1
        lr_decay_step=5
        large_scale=False
        dataset='pascal_voc'
        imdb_name = "voc_2007_trainval"
        imdbval_name = "voc_2007_test"
        set_cfgs = ['ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]', 'MAX_NUM_GT_BOXES', '20']
        save_dir='models'
        batch_size=1
        optimizer='sgd'
        resume=False
        checksession=1
        checkepoch=1
        checkpoint=0
        mGPUs=False
        use_tfboard=False
        start_epoch=1
        max_epochs=20
        lr_decay_gamma=0.1
        disp_interval=100
        session=1
        cfg.TRAIN.USE_FLIPPED = False
        cfg.USE_GPU_NMS = True
        cfg_file = "./mydetector/cfgs/{}_ls.yml".format(net) if large_scale else "./mydetector/cfgs/{}.yml".format(net)
        if cfg_file is not None:
            cfg_from_file(cfg_file)
        if set_cfgs is not None:
            cfg_from_list(set_cfgs)

        print('Using config:')
        pprint.pprint(cfg)
        np.random.seed(cfg.RNG_SEED)

        # torch.backends.cudnn.benchmark = True

        # train set
        # -- Note: Use validation set and disable the flipped to enable faster loading.

        imdb, roidb, ratio_list, ratio_index = combined_roidb(imdb_name)
        train_size = len(roidb)

        print('{:d} roidb entries'.format(len(roidb)))

        output_dir = save_dir + "/" + net + "/" + dataset
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)

        sampler_batch = sampler(train_size, batch_size)

        dataset = roibatchLoader(roidb, ratio_list, ratio_index, batch_size, \
                                 imdb.num_classes, training=True)

        dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size,
                                                 sampler=sampler_batch, num_workers=num_workers)

        # initilize the tensor holder here.
        im_data = torch.FloatTensor(1)
        im_info = torch.FloatTensor(1)
        num_boxes = torch.LongTensor(1)
        gt_boxes = torch.FloatTensor(1)

        # ship to cuda
        im_data = im_data.cuda()
        im_info = im_info.cuda()
        num_boxes = num_boxes.cuda()
        gt_boxes = gt_boxes.cuda()

        # make variable
        im_data = Variable(im_data)
        im_info = Variable(im_info)
        num_boxes = Variable(num_boxes)
        gt_boxes = Variable(gt_boxes)

        # initilize the network here.
        if net == 'vgg16':
            fasterRCNN = vgg16(imdb.classes, pretrained=True, class_agnostic=False)
        elif net == 'res101':
            fasterRCNN = resnet(imdb.classes, 101, pretrained=True, class_agnostic=False)
        elif net == 'res50':
            fasterRCNN = resnet(imdb.classes, 50, pretrained=True, class_agnostic=False)
        elif net == 'res152':
            fasterRCNN = resnet(imdb.classes, 152, pretrained=True, class_agnostic=False)
        else:
            print("network is not defined")
            pdb.set_trace()

        fasterRCNN.create_architecture()

        lr = cfg.TRAIN.LEARNING_RATE
        lr = lr
        # tr_momentum = cfg.TRAIN.MOMENTUM
        # tr_momentum = args.momentum

        params = []
        for key, value in dict(fasterRCNN.named_parameters()).items():
            if value.requires_grad:
                if 'bias' in key:
                    params += [{'params': [value], 'lr': lr * (cfg.TRAIN.DOUBLE_BIAS + 1), \
                                'weight_decay': cfg.TRAIN.BIAS_DECAY and cfg.TRAIN.WEIGHT_DECAY or 0}]
                else:
                    params += [{'params': [value], 'lr': lr, 'weight_decay': cfg.TRAIN.WEIGHT_DECAY}]

        fasterRCNN.cuda()

        if optimizer == "adam":
            lr = lr * 0.1
            optimizer = torch.optim.Adam(params)

        elif optimizer == "sgd":
            optimizer = torch.optim.SGD(params, momentum=cfg.TRAIN.MOMENTUM)

        if resume:
            load_name = os.path.join(output_dir,
                                     'faster_rcnn_{}_{}_{}.pth'.format(checksession, checkepoch,
                                                                       checkpoint))
            print("loading checkpoint %s" % (load_name))
            checkpoint = torch.load(load_name)
            session = checkpoint['session']
            start_epoch = checkpoint['epoch']
            fasterRCNN.load_state_dict(checkpoint['model'])
            optimizer.load_state_dict(checkpoint['optimizer'])
            lr = optimizer.param_groups[0]['lr']
            if 'pooling_mode' in checkpoint.keys():
                cfg.POOLING_MODE = checkpoint['pooling_mode']
            print("loaded checkpoint %s" % (load_name))

        if mGPUs:
            fasterRCNN = nn.DataParallel(fasterRCNN)

        iters_per_epoch = int(train_size / batch_size)

        if use_tfboard:
            from tensorboardX import SummaryWriter
            logger = SummaryWriter("logs")

        for epoch in range(start_epoch, max_epochs + 1):
            # setting to train mode
            fasterRCNN.train()
            loss_temp = 0
            start = time.time()

            if epoch % (lr_decay_step + 1) == 0:
                adjust_learning_rate(optimizer, lr_decay_gamma)
                lr *= lr_decay_gamma

            data_iter = iter(dataloader)
            for step in range(iters_per_epoch):
                data = next(data_iter)
                with torch.no_grad():
                    im_data.resize_(data[0].size()).copy_(data[0])
                    im_info.resize_(data[1].size()).copy_(data[1])
                    gt_boxes.resize_(data[2].size()).copy_(data[2])
                    num_boxes.resize_(data[3].size()).copy_(data[3])

                fasterRCNN.zero_grad()
                rois, cls_prob, bbox_pred, \
                rpn_loss_cls, rpn_loss_box, \
                RCNN_loss_cls, RCNN_loss_bbox, \
                rois_label = fasterRCNN(im_data, im_info, gt_boxes, num_boxes)

                loss = rpn_loss_cls.mean() + rpn_loss_box.mean() \
                       + RCNN_loss_cls.mean() + RCNN_loss_bbox.mean()
                loss_temp += loss.item()

                # backward
                optimizer.zero_grad()
                loss.backward()
                if net == "vgg16":
                    clip_gradient(fasterRCNN, 10.)
                optimizer.step()

                if step % disp_interval == 0:
                    end = time.time()
                    if step > 0:
                        loss_temp /= (disp_interval + 1)

                    if mGPUs:
                        loss_rpn_cls = rpn_loss_cls.mean().item()
                        loss_rpn_box = rpn_loss_box.mean().item()
                        loss_rcnn_cls = RCNN_loss_cls.mean().item()
                        loss_rcnn_box = RCNN_loss_bbox.mean().item()
                        fg_cnt = torch.sum(rois_label.data.ne(0))
                        bg_cnt = rois_label.data.numel() - fg_cnt
                    else:
                        loss_rpn_cls = rpn_loss_cls.item()
                        loss_rpn_box = rpn_loss_box.item()
                        loss_rcnn_cls = RCNN_loss_cls.item()
                        loss_rcnn_box = RCNN_loss_bbox.item()
                        fg_cnt = torch.sum(rois_label.data.ne(0))
                        bg_cnt = rois_label.data.numel() - fg_cnt

                    print("[session %d][epoch %2d][iter %4d/%4d] loss: %.4f, lr: %.2e" \
                          % (session, epoch, step, iters_per_epoch, loss_temp, lr))
                    print("\t\t\tfg/bg=(%d/%d), time cost: %f" % (fg_cnt, bg_cnt, end - start))
                    print("\t\t\trpn_cls: %.4f, rpn_box: %.4f, rcnn_cls: %.4f, rcnn_box %.4f" \
                          % (loss_rpn_cls, loss_rpn_box, loss_rcnn_cls, loss_rcnn_box))
                    if use_tfboard:
                        info = {
                            'loss': loss_temp,
                            'loss_rpn_cls': loss_rpn_cls,
                            'loss_rpn_box': loss_rpn_box,
                            'loss_rcnn_cls': loss_rcnn_cls,
                            'loss_rcnn_box': loss_rcnn_box
                        }
                        logger.add_scalars("logs_s_{}/losses".format(session), info,
                                           (epoch - 1) * iters_per_epoch + step)

                    loss_temp = 0
                    start = time.time()

            save_name = os.path.join(output_dir, 'faster_rcnn_{}_{}_{}.pth'.format(session, epoch, step))
            save_checkpoint({
                'session': session,
                'epoch': epoch + 1,
                'model': fasterRCNN.module.state_dict() if mGPUs else fasterRCNN.state_dict(),
                'optimizer': optimizer.state_dict(),
                'pooling_mode': cfg.POOLING_MODE,
                'class_agnostic': False,
            }, save_name)
            print('save model: {}'.format(save_name))
Example #7
0
        args.net, args.dataset)

    if args.cfg_file is not None:
        cfg_from_file(args.cfg_file)
    if args.set_cfgs is not None:
        cfg_from_list(args.set_cfgs)

    cfg.USE_GPU_NMS = args.cuda
    cfg.CUDA = args.cuda

    print('Using config:')
    pprint.pprint(cfg)

    roidb_path = args.roidb_dir + "/" + args.dataset + "/" + args.imdbval_name
    roidb = get_roidb(roidb_path)
    dataset = roibatchLoader(roidb, phase='test')
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             num_workers=args.num_workers,
                                             shuffle=False)

    num_videos = len(dataset)
    args.num_videos = num_videos
    print('{:d} roidb entries'.format(num_videos))

    model_dir = args.load_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(model_dir):
        raise Exception(
            'There is no input directory for loading network from ' +
            model_dir)
    output_dir = args.output_dir + "/" + args.net + "/" + args.dataset
Example #8
0
    if args.active_learning:
        num_images_ws = len(imdb_ws.image_index)
    if args.imdbval_name != "Stanford_Dog":
        num_images_n = len(imdb_n.image_index)

    all_boxes = [[[] for _ in range(num_images_s)]
                 for _ in range(imdb_s.num_classes)]
    if args.active_learning:
        all_boxes_ws = [[[] for _ in range(num_images_ws)]
                        for _ in range(imdb_ws.num_classes)]
    if args.imdbval_name != "Stanford_Dog":
        all_boxes_n = [[[] for _ in range(num_images_n)]
                       for _ in range(imdb_n.num_classes)]

    output_dir = get_output_dir(imdb_s, save_name)
    dataset_s = roibatchLoader(roidb_s, ratio_list_s, ratio_index_s, 1, \
                              imdb_s.num_classes, is_ws = False, training=False, normalize = False)
    dataloader_s = torch.utils.data.DataLoader(
        dataset_s,
        batch_size=1,
        shuffle=False,
        num_workers=0,
    )
    if args.active_learning:
        dataset_ws = roibatchLoader(roidb_ws, ratio_list_ws, ratio_index_ws, 1, \
                                  imdb_ws.num_classes, is_ws = True, training=False, normalize = False)
        dataloader_ws = torch.utils.data.DataLoader(dataset_ws,
                                                    batch_size=1,
                                                    shuffle=False,
                                                    num_workers=0,
                                                    pin_memory=True)
    if args.imdbval_name != "Stanford_Dog":
Example #9
0
                os.path.join(
                    input_dir, 'meta_type_{}'.format(args.meta_type),
                    str(args.phase) + '_shots_' + str(args.shots) +
                    '_mean_class_attentions.pkl'), 'rb'))

    num_images = len(imdb.image_index)
    all_boxes = [[[] for _ in range(num_images)] for _ in range(num_cls)]

    output_dir = os.path.join(input_dir, args.dataset)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    dataset = roibatchLoader(roidb,
                             ratio_list,
                             ratio_index,
                             args.batch_size,
                             num_cls,
                             training=False,
                             normalize=False)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             shuffle=False,
                                             num_workers=0,
                                             pin_memory=True)

    data_iter = iter(dataloader)

    _t = {'im_detect': time.time(), 'misc': time.time()}
    det_file = os.path.join(output_dir, 'detections.pkl')

    with torch.no_grad():
    if torch.cuda.is_available() and not args.cuda:
        print(
            "WARNING: You have a CUDA device, so you should probably run with --cuda"
        )

    # train set
    # -- Note: Use validation set and disable the flipped to enable faster loading.
    cfg.TRAIN.USE_FLIPPED = False
    cfg.USE_GPU_NMS = args.cuda
    '''Dataloader for the training'''
    imdb_train, roidb_train, ratio_list_train, ratio_index_train = combined_roidb(
        args.imdb_name)
    train_size = len(roidb_train)
    print('{:d} roidb entries'.format(len(roidb_train)))
    sampler_batch = sampler(train_size, args.batch_size)
    dataset_train = roibatchLoader(roidb_train, ratio_list_train, ratio_index_train, args.batch_size, \
                             imdb_train.num_classes, training=True)
    dataloader_train = torch.utils.data.DataLoader(
        dataset_train,
        batch_size=args.batch_size,
        sampler=sampler_batch,
        num_workers=args.num_workers)
    '''Dataloader for the validation/testing'''
    imdb_val, roidb_val, ratio_list_val, ratio_index_val = combined_roidb(
        args.imdbval_name)
    val_size = len(roidb_val)
    print('{:d} roidb entries'.format(len(roidb_train)))
    sampler_batch = sampler(val_size, args.batch_size)
    dataset_val = roibatchLoader(roidb_val, ratio_list_val, ratio_index_val, args.batch_size, \
                             imdb_val.num_classes, training=True)
    dataloader_val = torch.utils.data.DataLoader(dataset_val,
                                                 batch_size=args.batch_size,
Example #11
0
  train_size_s = len(roidb_s)
  train_size_ws = len(roidb_ws)
  # train_size = number of images
  
  print('{:d} strong roidb entries'.format(len(roidb_s)))
  print('{:d} weak roidb entries'.format(len(roidb_ws)))

  output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
  if not os.path.exists(output_dir):
    os.makedirs(output_dir)

  sampler_batch_s = sampler(train_size_s, args.batch_size)
  sampler_batch_ws = sampler(train_size_ws, args.batch_size)

  dataset_s = roibatchLoader(roidb_s, ratio_list_s, ratio_index_s, args.batch_size, \
                 imdb_s.num_classes, is_ws= False, training=True)
  dataloader_s = torch.utils.data.DataLoader(dataset_s, batch_size=args.batch_size, 
                sampler=sampler_batch_s, num_workers=args.num_workers)

  dataset_ws = roibatchLoader(roidb_ws, ratio_list_ws, ratio_index_ws, args.batch_size,
                imdb_ws.num_classes, is_ws = True, training=True)
  dataloader_ws = torch.utils.data.DataLoader(dataset_ws, batch_size=args.batch_size,
                sampler=sampler_batch_ws, num_workers=args.num_workers)

  # initilize the tensor holder here.
  im_data = torch.FloatTensor(1)
  im_info = torch.FloatTensor(1)
  num_boxes = torch.LongTensor(1)
  gt_boxes = torch.FloatTensor(1)
  im_label = torch.FloatTensor(1)  
    # train set
    # -- Note: Use validation set and disable the flipped to enable faster loading.
    cfg.TRAIN.USE_FLIPPED = True
    cfg.USE_GPU_NMS = args.cuda

    # create dataloader
    imdb, roidb, ratio_list, ratio_index, query = combined_roidb(
        args.imdb_name, True, seen=args.seen)
    train_size = len(roidb)
    print('{:d} roidb entries'.format(len(roidb)))
    sampler_batch = sampler(train_size, args.batch_size)
    # cfg.train_categories = imdb.list
    dataset = roibatchLoader(roidb,
                             ratio_list,
                             ratio_index,
                             query,
                             args.batch_size,
                             imdb.num_classes,
                             training=True,
                             m_imdb=imdb)
    assert dataset.list == imdb.list, (dataset.list, imdb.list)
    assert dataset.list_ind == imdb.inverse_list, (dataset.list, imdb.list)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             sampler=sampler_batch,
                                             num_workers=args.num_workers)

    # create output directory
    output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
Example #13
0
        os.makedirs(output_dir)

    # -------------------------
    # SOURCE DATA
    # -------------------------
    imdb_s, roidb_s, ratio_list_s, ratio_index_s = combined_roidb(
        args.imdb_name)
    train_size_s = len(roidb_s)

    print('{:d} roidb entries'.format(len(roidb_s)))

    sampler_batch_s = sampler(train_size_s, args.batch_size)

    dataset_s = roibatchLoader(roidb_s,
                               ratio_list_s,
                               ratio_index_s,
                               args.batch_size,
                               imdb_s.num_classes,
                               training=True)

    dataloader_s = torch.utils.data.DataLoader(dataset_s,
                                               batch_size=args.batch_size,
                                               sampler=sampler_batch_s,
                                               num_workers=args.num_workers)

    # -------------------------
    # TARGET DATA
    # -------------------------
    imdb_t, roidb_t, ratio_list_t, ratio_index_t = combined_roidb(
        args.imdbval_name)
    train_size_t = len(roidb_t)
  imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdb_name)

  cfg.TRAIN.USE_FLIPPED = False
  imdbval, roidbval, ratio_listval, ratio_indexval = combined_roidb(args.imdbval_name)  

  print('{:d} roidb training entries'.format(len(roidb)))
  print('{:d} roidb validation entries'.format(len(roidbval)))

  output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
  if not os.path.exists(output_dir):
    os.makedirs(output_dir)

  
  
  dataset = {}
  dataset = {'train': roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                           imdb.num_classes, args.RGB, args.NIR, args.DEPTH, training=True),
              'val': roibatchLoader(roidbval, ratio_listval, ratio_indexval, args.batch_size, \
                           imdbval.num_classes, args.RGB, args.NIR, args.DEPTH, training=True, normalize = False)}
  set_size = {}
  '''set_size = {'train': len(roidb),
            'val': len(roidbval)}'''
  set_size = {phase: len(dataset[phase]) for phase in ['train','val']}
  train_sampler_batch = sampler(set_size['train'], args.batch_size)
  dataloader = {}
  dataloader={'train': torch.utils.data.DataLoader(dataset['train'], batch_size=args.batch_size,
                             sampler=train_sampler_batch, num_workers=args.num_workers),
              'val': torch.utils.data.DataLoader(dataset['val'], batch_size=args.batch_size,
                                shuffle=False, num_workers=0,
                                pin_memory=True)}

Example #15
0
    cfg.TRAIN.USE_FLIPPED = True
    cfg.USE_GPU_NMS = args.cuda
    imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdb_name)
    test_imdb, test_roidb, test_ratio_list, test_ratio_index = combined_roidb(
        args.imdbval_name, False)
    test_imdb.competition_mode(on=True)

    train_size = len(roidb)

    print("{:d} roidb entries".format(len(roidb)))

    sampler_batch = sampler(train_size, args.batch_size)

    dataset = roibatchLoader(roidb,
                             ratio_list,
                             ratio_index,
                             args.batch_size,
                             imdb.num_classes,
                             training=True)

    dataloader = torch.utils.data.DataLoader(
        dataset,
        batch_size=args.batch_size,
        sampler=sampler_batch,
        num_workers=args.num_workers,
    )

    test_dataset = roibatchLoader(
        test_roidb,
        test_ratio_list,
        test_ratio_index,
        1,
   max_per_image = 100
 
   vis = args.vis
 
   if vis:
     thresh = 0.05
   else:
     thresh = 0.00
 
   save_name = 'faster_rcnn_'+str(args.checksession)
   num_images = len(imdb.image_index)
   all_boxes = [[[] for _ in xrange(num_images)]
                for _ in xrange(imdb.num_classes)]
 
   output_dir = get_output_dir(imdb, save_name)
   dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                         imdb.num_classes, args.RGB, args.NIR, args.DEPTH, training=False, normalize = False)
   dataloader = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size,
                             shuffle=False, num_workers=0,
                             pin_memory=True)
 
   data_iter = iter(dataloader)
 
   _t = {'im_detect': time.time(), 'misc': time.time()}
   det_file = os.path.join(output_dir, 'detections_'+str(args.checksession)+'.pkl')
 
   fasterRCNN.eval()
   empty_array = np.transpose(np.array([[],[],[],[],[]]), (1,0))
   InferTime = np.zeros(num_images)
   for i in range(num_images):
 
       data = next(data_iter)
Example #17
0
    # target dataset
    imdb_t, roidb_t, ratio_list_t, ratio_index_t = combined_roidb(
        args.imdb_name_target)
    train_size_t = len(roidb_t)

    print('{:d} source roidb entries'.format(len(roidb)))
    print('{:d} target roidb entries'.format(len(roidb_t)))

    output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    sampler_batch = sampler(train_size, args.batch_size)
    sampler_batch_t = sampler(train_size_t, args.batch_size)

    dataset_s = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                               imdb.num_classes, training=True, target=False)

    dataloader_s = torch.utils.data.DataLoader(dataset_s,
                                               batch_size=args.batch_size,
                                               sampler=sampler_batch,
                                               num_workers=args.num_workers)
    dataset_t = roibatchLoader(roidb_t, ratio_list_t, ratio_index_t, args.batch_size, \
                               imdb.num_classes, training=True, target=True)
    dataloader_t = torch.utils.data.DataLoader(dataset_t,
                                               batch_size=args.batch_size,
                                               sampler=sampler_batch_t,
                                               num_workers=args.num_workers)
    # initilize the tensor holder here.
    im_data = torch.FloatTensor(1)
    s = torch.FloatTensor(1)
    t = torch.FloatTensor(1)
  unsup_ratio_index = np.asarray(unsup_ratio_index)

  unsup_train_size = unsup_ratio_list.shape[0]
  print('Remaining unsupervised {:d} roidb entries. Done!'.format(unsup_train_size))

  #pdb.set_trace()

  output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
  if not os.path.exists(output_dir):
    os.makedirs(output_dir)

  # two supervised datum streams
  sup_sampler_batch_1 = sampler(train_size, args.batch_size)
  sup_sampler_batch_2 = sampler(train_size, args.batch_size)

  dataset = roibatchLoader(ori_roidb, ratio_list, ratio_index, args.batch_size, \
                           imdb.num_classes, training=True)

  sup_dataloader_1 = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size, sampler=sup_sampler_batch_1, num_workers=args.num_workers)
  
  sup_dataloader_2 = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size, sampler=sup_sampler_batch_2, num_workers=args.num_workers)

  # one unsupervised datum stream
  unsup_sampler_batch = sampler(unsup_train_size, args.batch_size)
  unsup_dataset = roibatchLoader(ori_roidb, unsup_ratio_list, unsup_ratio_index, \
                           args.batch_size, imdb.num_classes, training=True)
  unsup_dataloader = torch.utils.data.DataLoader(unsup_dataset, batch_size=args.batch_size, sampler=unsup_sampler_batch, num_workers=args.num_workers)

  #pdb.set_trace()


    cfg.USE_GPU_NMS = args.cuda

    imdb_cityscapes, roidb_cityscapes, ratio_list_cityscapes, ratio_index_cityscapes = combined_roidb(
        'fullycityscapes_train')
    train_size_cityscapes = len(roidb_cityscapes)

    print('{:d} roidb entries in pretrain dataset'.format(
        len(roidb_cityscapes)))

    output_dir = args.save_dir + "/" + args.net + "/" + 'foggycityscapes'
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    sampler_batch_cityscapes = sampler(train_size_cityscapes, args.batch_size)

    dataset_cityscapes = roibatchLoader(roidb_cityscapes, ratio_list_cityscapes, ratio_index_cityscapes, args.batch_size, \
                                    imdb_cityscapes.num_classes, training=True)

    dataloader_cityscapes = torch.utils.data.DataLoader(
        dataset_cityscapes,
        batch_size=args.batch_size,
        sampler=sampler_batch_cityscapes,
        num_workers=args.num_workers)

    # initilize the tensor holder here.
    im_data = torch.FloatTensor(1)
    im_info = torch.FloatTensor(1)
    num_boxes = torch.LongTensor(1)
    gt_boxes = torch.FloatTensor(1)

    # ship to cuda
    if args.cuda:
def test_model_while_training(fasterRCNN, args):

    # args = parse_args()
    # args = set_dataset_args(args, test=True)
    # np.random.seed(cfg.RNG_SEED)

    if args.cfg_file is not None:
        cfg_from_file(args.cfg_file)
    if args.set_cfgs is not None:
        cfg_from_list(args.set_cfgs)

    cfg.TRAIN.USE_FLIPPED = False

    # args.imdbval_name = 'clipart_test'

    imdb, roidb, ratio_list, ratio_index = combined_roidb(
        args.imdbval_name_target, False)

    # breakpoint()

    imdb.competition_mode(on=True)

    print('{:d} roidb entries'.format(len(roidb)))

    im_data = torch.FloatTensor(1)
    im_info = torch.FloatTensor(1)
    num_boxes = torch.LongTensor(1)
    gt_boxes = torch.FloatTensor(1)

    if args.cuda:
        im_data = im_data.cuda()
        im_info = im_info.cuda()
        num_boxes = num_boxes.cuda()
        gt_boxes = gt_boxes.cuda()

    # make variable
    im_data = Variable(im_data)
    im_info = Variable(im_info)
    num_boxes = Variable(num_boxes)
    gt_boxes = Variable(gt_boxes)

    if args.cuda:
        cfg.CUDA = True

    # if args.cuda:
    #   fasterRCNN.cuda()

    start = time.time()
    max_per_image = 100

    thresh = 0.0

    save_name = args.load_name.split('/')[-1]
    num_images = len(imdb.image_index)
    all_boxes = [[[] for _ in range(num_images)]
                 for _ in range(imdb.num_classes)]

    output_dir = get_output_dir(imdb, save_name)
    dataset = roibatchLoader(roidb, ratio_list, ratio_index, 1, \
                          imdb.num_classes, training=False, normalize = False, path_return=True)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=1,
                                             shuffle=False,
                                             num_workers=0,
                                             pin_memory=True)

    data_iter = iter(dataloader)

    _t = {'im_detect': time.time(), 'misc': time.time()}
    det_file = os.path.join(output_dir, 'detections.pkl')

    fasterRCNN.eval()
    empty_array = np.transpose(np.array([[], [], [], [], []]), (1, 0))
    for i in range(num_images):

        data = next(data_iter)
        im_data.data.resize_(data[0].size()).copy_(data[0])
        #print(data[0].size())
        im_info.data.resize_(data[1].size()).copy_(data[1])
        gt_boxes.data.resize_(data[2].size()).copy_(data[2])
        num_boxes.data.resize_(data[3].size()).copy_(data[3])

        det_tic = time.time()

        rois, cls_prob, bbox_pred, \
        rpn_loss_cls, rpn_loss_box, \
        RCNN_loss_cls, RCNN_loss_bbox, \
        rois_label, _, _ = fasterRCNN(im_data, im_info, gt_boxes, num_boxes)

        scores = cls_prob.data
        boxes = rois.data[:, :, 1:5]
        # d_pred = d_pred.data
        path = data[4]

        if cfg.TEST.BBOX_REG:
            # Apply bounding-box regression deltas
            box_deltas = bbox_pred.data
            if cfg.TRAIN.BBOX_NORMALIZE_TARGETS_PRECOMPUTED:
                # Optionally normalize targets by a precomputed mean and stdev
                if args.class_agnostic:
                    box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \
                               + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda()
                    box_deltas = box_deltas.view(1, -1, 4)
                else:
                    box_deltas = box_deltas.view(-1, 4) * torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_STDS).cuda() \
                               + torch.FloatTensor(cfg.TRAIN.BBOX_NORMALIZE_MEANS).cuda()
                    box_deltas = box_deltas.view(1, -1, 4 * len(imdb.classes))

            pred_boxes = bbox_transform_inv(boxes, box_deltas, 1)
            pred_boxes = clip_boxes(pred_boxes, im_info.data, 1)
        else:
            # Simply repeat the boxes, once for each class
            pred_boxes = np.tile(boxes, (1, scores.shape[1]))

        pred_boxes /= data[1][0][2].item()

        scores = scores.squeeze()
        pred_boxes = pred_boxes.squeeze()
        det_toc = time.time()
        detect_time = det_toc - det_tic
        misc_tic = time.time()

        for j in range(1, imdb.num_classes):
            inds = torch.nonzero(scores[:, j] > thresh).view(-1)
            # if there is det
            if inds.numel() > 0:
                cls_scores = scores[:, j][inds]
                _, order = torch.sort(cls_scores, 0, True)
                if args.class_agnostic:
                    cls_boxes = pred_boxes[inds, :]
                else:
                    cls_boxes = pred_boxes[inds][:, j * 4:(j + 1) * 4]

                cls_dets = torch.cat((cls_boxes, cls_scores.unsqueeze(1)), 1)
                # cls_dets = torch.cat((cls_boxes, cls_scores), 1)
                cls_dets = cls_dets[order]
                keep = nms(cls_dets, cfg.TEST.NMS)
                cls_dets = cls_dets[keep.view(-1).long()]

                all_boxes[j][i] = cls_dets.cpu().numpy()
            else:
                all_boxes[j][i] = empty_array

        # Limit to max_per_image detections *over all classes*
        if max_per_image > 0:
            image_scores = np.hstack(
                [all_boxes[j][i][:, -1] for j in range(1, imdb.num_classes)])
            if len(image_scores) > max_per_image:
                image_thresh = np.sort(image_scores)[-max_per_image]
                for j in range(1, imdb.num_classes):
                    keep = np.where(all_boxes[j][i][:, -1] >= image_thresh)[0]
                    all_boxes[j][i] = all_boxes[j][i][keep, :]

        # misc_toc = time.time()

        sys.stdout.write('im_detect: {:d}/{:d} {:.3f}s \r' \
            .format(i + 1, num_images, detect_time))
        sys.stdout.flush()

    imdb.evaluate_detections(all_boxes, output_dir)
        cfg_from_file(args.cfg_file)
    if args.set_cfgs is not None:
        cfg_from_list(args.set_cfgs)

    print('Using config:')
    pprint.pprint(cfg)

    # Load dataset
    cfg.TRAIN.USE_FLIPPED = False
    imdb_vu, roidb_vu, ratio_list_vu, ratio_index_vu, query_vu = combined_roidb(
        args.imdbval_name, False, seen=args.seen)
    imdb_vu.competition_mode(on=True)
    dataset_vu = roibatchLoader(roidb_vu,
                                ratio_list_vu,
                                ratio_index_vu,
                                query_vu,
                                1,
                                imdb_vu.num_classes,
                                training=False,
                                seen=args.seen)

    # initilize the network here.
    if args.net == 'vgg16':
        fasterRCNN = vgg16(imdb_vu.classes,
                           pretrained=False,
                           class_agnostic=args.class_agnostic)
    elif args.net == 'res101':
        fasterRCNN = resnet(imdb_vu.classes,
                            101,
                            pretrained=False,
                            class_agnostic=args.class_agnostic)
    elif args.net == 'res50':
  max_per_image = 100

  vis = args.vis

  if vis:
    thresh = 0.05
  else:
    thresh = 0.0

  save_name = 'faster_rcnn_10'
  num_images = len(imdb.image_index)
  all_boxes = [[[] for _ in xrange(num_images)]
               for _ in xrange(imdb.num_classes)]

  output_dir = get_output_dir(imdb, save_name)
  dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                        imdb.num_classes, training=False, normalize = False)
  dataloader = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size,
                            shuffle=False, num_workers=0,
                            pin_memory=True)

  data_iter = iter(dataloader)

  _t = {'im_detect': time.time(), 'misc': time.time()}
  det_file = os.path.join(output_dir, 'detections.pkl')

  fasterRCNN.eval()
  empty_array = np.transpose(np.array([[],[],[],[],[]]), (1,0))
  for i in range(num_images):

      data = next(data_iter)
      im_data.data.resize_(data[0].size()).copy_(data[0])
        # dataset
        imdb, roidb, ratio_list, ratio_index, imdb_test, roidb_test, ratio_list_test, ratio_index_test = combined_roidb_meta(
            args.imdb_name)

        base_train_size = len(roidb)
        meta_train_size = len(roidb_test)

        iters_per_base = int(base_train_size / args.batch_size)
        iters_per_meta = int(meta_train_size / args.batch_size)

        print('{:d} roidb entries'.format(len(roidb)))
        # base data
        sampler_batch = sampler(base_train_size, args.batch_size)
        dataset = roibatchLoader(roidb,
                                 ratio_list,
                                 ratio_index,
                                 args.batch_size,
                                 imdb.num_classes,
                                 training=True)
        dataloader = torch.utils.data.DataLoader(dataset,
                                                 batch_size=args.batch_size,
                                                 sampler=sampler_batch,
                                                 num_workers=args.num_workers,
                                                 pin_memory=True)

        # meta data
        sampler_batch_meta = sampler(meta_train_size, args.batch_size)
        dataset_meta = roibatchLoader(roidb_test,
                                      ratio_list_test,
                                      ratio_index_test,
                                      args.batch_size,
                                      imdb_test.num_classes,
      imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdb_name)
      train_size = len(roidb)
      imdb_classes = imdb.classes

  print('{:d} roidb frame pairs'.format(train_size))

  output_dir = args.save_dir + "/" + args.net + "/" + args.dataset
  if not os.path.exists(output_dir):
    os.makedirs(output_dir)

  if args.use_det:
    vid_sampler_batch = sampler(vid_train_size, args.batch_size)
    det_sampler_batch = sampler(det_train_size, args.batch_size)

    # Build VID and DET datasets
    vid_dataset = roibatchLoader(vid_roidb,vid_ratio_list, vid_ratio_index, 
            args.batch_size, vid_imdb.num_classes, training=True)
    det_dataset = roibatchLoader(det_roidb,det_ratio_list, det_ratio_index, 
            args.batch_size, det_imdb.num_classes, training=True)

    vid_dataloader = torch.utils.data.DataLoader(vid_dataset, 
            batch_size=args.batch_size,
            sampler=vid_sampler_batch,
            num_workers=args.num_workers)
    det_dataloader = torch.utils.data.DataLoader(det_dataset, 
            batch_size=args.batch_size,
            sampler=det_sampler_batch,
            num_workers=args.num_workers)
  else:
    sampler_batch = sampler(train_size, args.batch_size)

    dataset = roibatchLoader(roidb,ratio_list, ratio_index, args.batch_size, imdb.num_classes, training=True)
Example #25
0
def train(args):
    file_utils.rm_all_dir(dir='./train/cache/')  # clean cache
    dataset_name = "voc_2007_trainval"
    args.set_cfgs = ['ANCHOR_SCALES', '[8, 16, 32]', 'ANCHOR_RATIOS', '[0.5,1,2]', 'MAX_NUM_GT_BOXES', '20']
    args.cfg_file = "cfgs/{}_ls.yml".format(args.backbone) if args.large_scale else "cfgs/{}.yml".format(args.backbone)

    if args.cfg_file is not None: cfg_from_file(args.cfg_file)
    if args.set_cfgs is not None: cfg_from_list(args.set_cfgs)

    np.random.seed(cfg.RNG_SEED)

    cfg.TRAIN.USE_FLIPPED = opt.BUBBLE_TRAIN_FLIP
    cfg.USE_GPU_NMS = opt.cuda

    _, _, _, name_lists = file_utils.get_files('./train/images/')
    file_utils.makeTrainIndex(names=name_lists, save_to='./train/trainval.txt')
    imdb, roidb, ratio_list, ratio_index = combined_roidb(dataset_name)
    train_size = len(roidb)

    print('TRAIN IMAGE NUM: {:d}'.format(len(roidb)))

    file_utils.mkdir(dir=[args.save_models])

    sampler_batch = sampler(train_size, args.batch)

    dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch,\
                             imdb.num_classes, training=True)

    dataloader = DataLoader(dataset, batch_size=args.batch,
                            sampler=sampler_batch, num_workers=args.num_workers)

    im_data = Variable(torch.FloatTensor(1).cuda())
    im_info = Variable(torch.FloatTensor(1).cuda())
    num_boxes = Variable(torch.LongTensor(1).cuda())
    gt_boxes = Variable(torch.FloatTensor(1).cuda())

    fasterRCNN = resnet(imdb.classes, 101, pretrained=True, class_agnostic=False)
    fasterRCNN.create_architecture()

    lr = args.lr

    params = []
    for key, value in dict(fasterRCNN.named_parameters()).items():
        if value.requires_grad:
            if 'bias' in key:
                params += [{'params': [value], 'lr': lr * (cfg.TRAIN.DOUBLE_BIAS + 1),\
                            'weight_decay': cfg.TRAIN.BIAS_DECAY and cfg.TRAIN.WEIGHT_DECAY or 0}]
            else:
                params += [{'params': [value], 'lr': lr, 'weight_decay': cfg.TRAIN.WEIGHT_DECAY}]

    if args.optimizer == "adam":
        lr = lr * 0.1
        optimizer = torch.optim.Adam(params)

    elif args.optimizer == "sgd":
        optimizer = torch.optim.SGD(params, momentum=cfg.TRAIN.MOMENTUM)

    if opt.cuda:
        cfg.CUDA = True
        fasterRCNN.cuda()

    if args.resume:
        load_name = os.path.join(args.save_models,
                                 'Speech-Bubble-Detector-{}-{}-{}.pth'.format(args.backbone, args.resume_epoch, args.resume_batch))
        checkpoint = torch.load(load_name)
        args.session = checkpoint['session']
        args.start_epoch = checkpoint['epoch']
        fasterRCNN.load_state_dict(checkpoint['model'])
        optimizer.load_state_dict(checkpoint['optimizer'])
        lr = optimizer.param_groups[0]['lr']
        if 'pooling_mode' in checkpoint.keys():
            cfg.POOLING_MODE = checkpoint['pooling_mode']

    if args.multi_gpus:
        fasterRCNN = nn.DataParallel(fasterRCNN)

    iters_per_epoch = int(train_size / args.batch)

    if args.use_tfboard:
        from tensorboardX import SummaryWriter

        logger = SummaryWriter("logs")

    args.max_epochs = args.epoch
    for epoch in range(1, args.epoch + 1):

        fasterRCNN.train()
        loss_temp = 0
        start = time.time()

        if epoch % (args.lr_decay_step + 1) == 0:
            adjust_learning_rate(optimizer, args.lr_decay_gamma)
            lr *= args.lr_decay_gamma

        data_iter = iter(dataloader)
        for step in range(iters_per_epoch):
            data = next(data_iter)
            im_data.data.resize_(data[0].size()).copy_(data[0])
            im_info.data.resize_(data[1].size()).copy_(data[1])
            gt_boxes.data.resize_(data[2].size()).copy_(data[2])
            num_boxes.data.resize_(data[3].size()).copy_(data[3])

            fasterRCNN.zero_grad()
            rois, cls_prob, bbox_pred, \
            rpn_loss_cls, rpn_loss_box, \
            RCNN_loss_cls, RCNN_loss_bbox, \
            rois_label = fasterRCNN(im_data, im_info, gt_boxes, num_boxes)

            loss = rpn_loss_cls.mean() + rpn_loss_box.mean() \
                   + RCNN_loss_cls.mean() + RCNN_loss_bbox.mean()
            loss_temp += loss.item()

            # backward
            optimizer.zero_grad()
            loss.backward()
            if args.backbone == "vgg16":
                clip_gradient(fasterRCNN, 10.)
            optimizer.step()

            if step % args.display_interval == 0:
                end = time.time()
                if step > 0:
                    loss_temp /= (args.display_interval + 1)

                if args.multi_gpus:
                    loss_rpn_cls = rpn_loss_cls.mean().item()
                    loss_rpn_box = rpn_loss_box.mean().item()
                    loss_rcnn_cls = RCNN_loss_cls.mean().item()
                    loss_rcnn_box = RCNN_loss_bbox.mean().item()
                    fg_cnt = torch.sum(rois_label.data.ne(0))
                    bg_cnt = rois_label.data.numel() - fg_cnt
                else:
                    loss_rpn_cls = rpn_loss_cls.item()
                    loss_rpn_box = rpn_loss_box.item()
                    loss_rcnn_cls = RCNN_loss_cls.item()
                    loss_rcnn_box = RCNN_loss_bbox.item()
                    fg_cnt = torch.sum(rois_label.data.ne(0))
                    bg_cnt = rois_label.data.numel() - fg_cnt

                print("[epoch %d][iter %d/%d] loss: %.4f, lr: %.2e" \
                      % (epoch, step, iters_per_epoch, loss_temp, lr))
                print("\t\t\tfg/bg=(%d/%d), time cost: %f" % (fg_cnt, bg_cnt, end - start))
                print("\t\t\trpn_cls: %.4f, rpn_box: %.4f, rcnn_cls: %.4f, rcnn_box %.4f" \
                      % (loss_rpn_cls, loss_rpn_box, loss_rcnn_cls, loss_rcnn_box))
                if args.use_tfboard:
                    info = {
                        'loss': loss_temp,
                        'loss_rpn_cls': loss_rpn_cls,
                        'loss_rpn_box': loss_rpn_box,
                        'loss_rcnn_cls': loss_rcnn_cls,
                        'loss_rcnn_box': loss_rcnn_box
                    }
                    logger.add_scalars("logs_s_{}/losses".format(args.session), info,
                                       (epoch - 1) * iters_per_epoch + step)

                loss_temp = 0
                start = time.time()

        save_name = args.save_models + args.backbone + '-' + str(epoch) + '.pth'
        save_checkpoint({
            'session': args.session,
            'epoch': epoch + 1,
            'model': fasterRCNN.module.state_dict() if args.multi_gpus else fasterRCNN.state_dict(),
            'optimizer': optimizer.state_dict(),
            'pooling_mode': cfg.POOLING_MODE,
            'class_agnostic': False,
        }, save_name)
        print('save model: {}'.format(save_name))

    if args.use_tfboard:
        logger.close()
Example #26
0
    tgt_imdb_val, tgt_roidb_val, tgt_ratio_list_val, tgt_ratio_index_val = combined_roidb(
        args.imdbval_tgt_name, False)
    tgt_val_size = len(tgt_roidb_val)

    print()
    print('{:d} roidb entries for source domain'.format(len(roidb)))
    print('{:d} roidb entries for target domain'.format(len(tgt_roidb)))

    output_dir = args.save_dir + "/" + args.net + "/" + args.model_config
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # define the dataloader for source domain
    sampler_batch = sampler(train_size, args.batch_size)

    dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                             imdb.num_classes, training=True)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=args.batch_size,
                                             sampler=sampler_batch,
                                             num_workers=args.num_workers)

    dataset_val = roibatchLoader(roidb_val, ratio_list_val, ratio_index_val, 1, \
                             imdb_val.num_classes, training=False, normalize=False)
    dataloader_val = torch.utils.data.DataLoader(dataset_val,
                                                 batch_size=1,
                                                 shuffle=False,
                                                 num_workers=0,
                                                 pin_memory=True)

    # define the dataloader for target domain
    tgt_sampler_batch = sampler(tgt_train_size, args.batch_size)
        cfg_from_file(hyp_file)

    if args.set_cfgs is not None:
        cfg_from_list(args.set_cfgs)

    val_imdb, val_roidb, val_ratio_list, val_ratio_index = combined_roidb(
        args.val_imdb_name, training=False, USE_FLIPPED=False)
    val_imdb.competition_mode(on=True)
    val_size = len(val_roidb)

    print('{:d} roidb entries for validation'.format(val_size))

    val_dataset = roibatchLoader(val_roidb,
                                 val_ratio_list,
                                 val_ratio_index,
                                 1,
                                 val_imdb.num_classes,
                                 training=False,
                                 normalize=False)
    val_dataloader = torch.utils.data.DataLoader(val_dataset,
                                                 batch_size=1,
                                                 shuffle=False,
                                                 num_workers=0,
                                                 pin_memory=True)

    model_dir = args.load_dir + "/" + args.net + "/" + args.dataset
    if not os.path.exists(model_dir):
        raise Exception(
            'There is no input directory for loading network from ' +
            model_dir)
    maps = []
Example #28
0
    unlabel_train_size = len(unlabel_roidb)

    print('{:d} roidb entries'.format(len(roidb)))
    print('{:d} roidb entries'.format(len(unlabel_roidb)))

    output_dir = os.path.join(args.save_dir, args.arch, args.net, args.dataset)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    supervised_batch_size = 1
    unsupervised_batch_size = args.batch_size - supervised_batch_size

    sampler_batch = sampler(train_size, supervised_batch_size)
    dataset = roibatchLoader(roidb,
                             ratio_list,
                             ratio_index,
                             supervised_batch_size,
                             imdb.num_classes,
                             training=True)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=supervised_batch_size,
                                             sampler=sampler_batch,
                                             num_workers=args.num_workers,
                                             drop_last=True)

    unlabel_sampler_batch = sampler(unlabel_train_size,
                                    unsupervised_batch_size)
    unlabel_dataset = roibatchLoader(unlabel_roidb,
                                     unlabel_ratio_list,
                                     unlabel_ratio_index,
                                     unsupervised_batch_size,
                                     imdb.num_classes,
Example #29
0
    max_per_image = 100

    vis = args.vis

    if vis:
        thresh = 0.05
    else:
        thresh = 0.0

    save_name = 'faster_rcnn_10'
    num_images = len(imdb.image_index)
    all_boxes = [[[] for _ in xrange(num_images)]
                 for _ in xrange(imdb.num_classes)]

    output_dir = get_output_dir(imdb, save_name)
    dataset = roibatchLoader(roidb, ratio_list, ratio_index, 1, \
                          imdb.num_classes, training=False, normalize = False)
    dataloader = torch.utils.data.DataLoader(dataset,
                                             batch_size=1,
                                             shuffle=False,
                                             num_workers=0,
                                             pin_memory=True)

    data_iter = iter(dataloader)

    _t = {'im_detect': time.time(), 'misc': time.time()}
    det_file = os.path.join(output_dir, 'detections.pkl')

    fasterRCNN.eval()
    empty_array = np.transpose(np.array([[], [], [], [], []]), (1, 0))
    for i in range(num_images):
  # ratio_list.clamp_(0.5, 2)
  # resort aspect ratio

  print('{:d} roidb entries'.format(len(roidb)))

  if args.save_dir is "local":
    output_dir = "models/" + args.net
  else:
    output_dir = "/srv/share/jyang375/models/" + args.net

  if not os.path.exists(output_dir):
    os.makedirs(output_dir)

  sampler_batch = sampler(train_size, args.batch_size)

  dataset = roibatchLoader(roidb, args.batch_size, imdb.num_classes, training=True, normalize = False)

  dataloader = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size,
                            sampler=sampler_batch, num_workers=args.nworker)

  # dataloader = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size, sampler=None, num_workers=args.nworker)

  # initilize the tensor holder here.
  im_data = torch.FloatTensor(1)
  im_info = torch.FloatTensor(1)
  num_boxes = torch.LongTensor(1)
  gt_boxes = torch.FloatTensor(1)

  # ship to cuda
  if args.cuda > 0:
    im_data = im_data.cuda()
Example #31
0
    # train set
    # -- Note: Use validation set and disable the flipped to enable faster loading.
    cfg.TRAIN.USE_FLIPPED = True
    cfg.USE_GPU_NMS = args.cuda
    imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdb_name)
    train_size = len(roidb)

    print('{:d} roidb entries'.format(len(roidb)))

    output_dir = os.path.join(args.save_dir, args.arch, args.net, args.dataset)
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    sampler_batch = sampler(train_size, args.batch_size)

    dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, \
                             imdb.num_classes, training=True)

    dataloader = torch.utils.data.DataLoader(dataset, batch_size=args.batch_size,
                                             sampler=sampler_batch, num_workers=args.num_workers)

    # initilize the tensor holder here.
    im_data = torch.FloatTensor(1)
    im_info = torch.FloatTensor(1)
    num_boxes = torch.LongTensor(1)
    gt_boxes = torch.FloatTensor(1)


    # ship to cuda
    if args.cuda:
        im_data = im_data.cuda()
        im_info = im_info.cuda()
        doc['k_fold'] = k_fold
        with open("cfgs/train.yml", 'w', encoding="utf-8") as f:
            yaml.dump(doc, f)
        print('fold_' + str(k_fold) + ' is running...')

        imdb, roidb, ratio_list, ratio_index = combined_roidb(args.imdb_name, training=True, USE_FLIPPED=True)
        val_imdb, val_roidb, val_ratio_list, val_ratio_index = combined_roidb(args.val_imdb_name, training=False,
                                                                              USE_FLIPPED=False)
        train_size = len(roidb)
        val_size = len(val_roidb)
        print('{:d} roidb entries for training'.format(train_size))
        print('{:d} roidb entries for validation'.format(val_size))

        sampler_batch = sampler(train_size, args.batch_size)

        train_dataset = roibatchLoader(roidb, ratio_list, ratio_index, args.batch_size, imdb.num_classes, training=True)
        train_dataloader = torch.utils.data.DataLoader(train_dataset, batch_size=args.batch_size, sampler=sampler_batch,
                                                       num_workers=args.num_workers)

        val_dataset = roibatchLoader(val_roidb, val_ratio_list, val_ratio_index, 1, val_imdb.num_classes,
                                     training=False, normalize=False)
        val_dataloader = torch.utils.data.DataLoader(val_dataset, batch_size=1, shuffle=False,
                                                     num_workers=0, pin_memory=True)


        output_dir = args.save_dir + "/" + args.net + "/" + args.dataset + "/" + f"_fold_{k_fold}"
        print(f'output_dir is {output_dir}')
        os.makedirs(output_dir, exist_ok=True)

        # initilize the tensor holder here.
        im_data = torch.FloatTensor(1)