def eval_net():
    # Assign imdb_name and imdbval_name according to args.dataset.
    if args.dataset == "voc":
        args.imdb_name = "voc_2007_trainval+voc_2012_trainval"
        args.imdbval_name = "voc_2007_test"
    elif args.dataset == "coco":
        args.imdb_name = "coco_2014_train+coco_2014_valminusminival"
        args.imdbval_name = "coco_2014_minival"
    # Import config
    if args.dataset == 'coco':
        cfg = (coco320, coco512)[args.input_size == 512]
    elif args.dataset == 'voc':
        cfg = (voc320, voc512)[args.input_size == 512]
    # Create imdb, roidb and blob_dataset
    print('Create or load an evaluted imdb.')
    imdb, roidb = combined_roidb(args.imdbval_name, False)
    imdb.competition_mode(on=True)
    print('{:d} roidb entries'.format(len(roidb)))

    blob_dataset = BlobDataset(imdb,
                               roidb,
                               transform=BaseTransform(cfg['min_dim'], MEANS),
                               target_normalization=True)

    # Construct networks.
    print('Construct {}_refinedet network.'.format(args.network))
    if args.network == 'vgg16':
        refinedet = VGGRefineDet(cfg['num_classes'], cfg)
    elif args.network == 'resnet101':
        refinedet = ResNetRefineDet(cfg['num_classes'], cfg)
    refinedet.create_architecture()
    # For CPU
    net = refinedet
    # For GPU/GPUs
    if args.cuda:
        if num_gpus > 1:
            net = torch.nn.DataParallel(refinedet)
        else:
            net = refinedet.cuda()
        cudnn.benchmark = True
    # Load weights
    net.load_weights(args.model_path)

    net.eval()
    print('Test RefineDet on:', args.imdbval_name)
    print('Using the specified args:')
    print(args)

    #data_loader = data.DataLoader(blob_dataset,
    #                              batch_size=1,
    #                              num_workers=0,
    #                              shuffle=False,
    #                              collate_fn=detection_collate,
    #                              pin_memory=True)
    # all detections are collected into:
    #    all_boxes[cls][image] = N x 5 array of detections in
    #    (x1, y1, x2, y2, score)
    num_images = len(imdb.image_index)
    # num_images = len(blob_dataset)
    num_classes = imdb.num_classes
    # num_object_classes + 1 ?
    print(num_classes)
    all_boxes = [[[] for _ in range(num_images)] for _ in range(num_classes)]
    empty_array = np.transpose(np.array([[], [], [], [], []]), (1, 0))

    output_dir = get_output_dir(imdb, args.result_path)
    _t = {'im_detect': Timer(), 'misc': Timer()}
    det_file = os.path.join(output_dir, 'detections.pkl')

    # pdb.set_trace()
    for idx in range(num_images):
        img, gt, h, w = blob_dataset.pull_item(idx)
        input = Variable(img.unsqueeze(0), volatile=True)
        if args.cuda:
            input = input.cuda()

        # timers forward
        _t['im_detect'].tic()
        #start = time.time()
        # pdb.set_trace()
        detection = net(input)
        detect_time = _t['im_detect'].toc(average=True)
        #detect_time = time.time() - start
        print('im_detect: {:d}/{:d} {:.3f}s\n'.format(idx + 1, num_images,
                                                      detect_time))
        # skip jc = 0, because it's the background class
        for jc in range(1, num_classes):
            dets = detection[0, jc, :]
            mask = dets[:, 0].gt(0.).expand(5, dets.size(0)).t()
            dets = torch.masked_select(dets, mask).view(-1, 5)
            if dets.dim() > 0:
                boxes = dets[:, 1:]
                boxes[:, 0] *= w
                boxes[:, 2] *= w
                boxes[:, 1] *= h
                boxes[:, 3] *= h
                scores = dets[:, 0].cpu().numpy()
                cls_dets = np.hstack((boxes.cpu().numpy(),
                                      scores[:,
                                             np.newaxis])).astype(np.float32,
                                                                  copy=False)
                all_boxes[jc][idx] = cls_dets
            else:
                all_boxes[jc][idx] = empty_array

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

    print('Evaluating detections')
    imdb.evaluate_detections(all_boxes, output_dir)
Esempio n. 2
0
def main():
    images_path = './images.pkl'
    targets_path = './targets.pkl'
    
    args.dataset_root = COCO_ROOT
    cfg = coco320
    # data
    dataset = COCODetection(root=args.dataset_root,
                            transform=SSDAugmentation(cfg['min_dim'], MEANS))
    data_loader = data.DataLoader(dataset, args.batch_size,
                                  num_workers=args.num_workers,
                                  shuffle=False, collate_fn=detection_collate,
                                  pin_memory=True)
    ## load train data
    batch_iterator = iter(data_loader)
    # data_loader[0]
    images_list, targets_list = next(batch_iterator)
    pdb.set_trace()
    # images = torch.stack(images_list, 0)
    images_array_list = [Variable(cur_image).data.numpy() for cur_image in images_list]
    targets_array_list = [Variable(cur_targets).data.numpy() for cur_targets in targets_list]
    # store data
    fw_images = open(images_path, 'wb')
    cPickle.dump(images_array_list, fw_images)
    fw_images.close()
    fw_targets = open(targets_path, 'wb')
    cPickle.dump(targets_array_list, fw_targets)
    fw_targets.close()
    
    # load data
    images_array_list = cPickle.load(open(images_path, 'rb'))
    targets_array_list = cPickle.load(open(targets_path, 'rb'))
    
    images = torch.stack([torch.Tensor(cur_image) for cur_image in
                          images_array_list], 0)
    # targets = [torch.Tensor(cur_target) for cur_target in targets_array_list]
    targets = torch.stack([torch.Tensor(cur_target) for cur_target in
                           targets_array_list], 0)
    
    print(type(images))
    print(type(targets))
    
    refinedet = ResNetRefineDet(cfg['num_classes'], cfg)

    refinedet.create_architecture(
        os.path.join(args.save_folder, args.basenet), pretrained=True,
        fine_tuning=True)
    net = refinedet
    if args.cuda:
        net = torch.nn.DataParallel(refinedet).cuda()
        cudnn.benchmark = True

    params = net.state_dict()
    # for k, v in params.items():
    #     print(k)
    #     print(v.shape)
    optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=args.momentum,
                          weight_decay=args.weight_decay)
    net.train()
    print('Using the specified args:')
    print(args)

    if args.cuda:
        images = Variable(images.cuda())
        targets = Variable(targets.cuda())
        # targets = [Variable(ann.cuda(), volatile=True) for ann in targets]
    else:
        images = Variable(images)
        targets = Variable(targets)

    # forward
    t0 = time.time()
    optimizer.zero_grad()
    bi_loss_loc, bi_loss_conf, multi_loss_loc, multi_loss_conf = \
        net(images, targets)
    loss = bi_loss_loc + bi_loss_conf + multi_loss_loc + multi_loss_conf
    loss.backward()
    optimizer.step()
    t1 = time.time()
    print('timer: %.4f sec.' % (t1 - t0))
Esempio n. 3
0
def train():
    # Assign imdb_name and imdbval_name according to args.dataset.
    if args.dataset == "voc":
        #args.imdb_name = "voc_2007_trainval"
        args.imdb_name = "voc_2007_trainval+voc_2012_trainval"
        args.imdbval_name = "voc_2007_test"
    elif args.dataset == "coco":
        args.imdb_name = "coco_2014_train+coco_2014_valminusminival"
        args.imdbval_name = "coco_2014_minival"
    # Import config
    if args.dataset == 'coco':
        cfg = (coco320, coco512)[args.input_size == 512]
    elif args.dataset == 'voc':
        cfg = (voc320, voc512)[args.input_size == 512]
    # Create imdb, roidb and blob_dataset
    print('Create or load an imdb.')
    imdb, roidb = combined_roidb(args.imdb_name)
    blob_dataset = BlobDataset(imdb,
                               roidb,
                               transform=SSDAugmentation(
                                   cfg['min_dim'], MEANS),
                               target_normalization=True)

    # Construct networks.
    print('Construct {}_refinedet network.'.format(args.network))
    if args.network == 'vgg16':
        refinedet = VGGRefineDet(cfg['num_classes'], cfg)
    elif args.network == 'resnet101':
        refinedet = ResNetRefineDet(cfg['num_classes'], cfg)
    refinedet.create_architecture(os.path.join(args.save_folder, args.basenet),
                                  pretrained=True,
                                  fine_tuning=True)
    #pdb.set_trace()
    # For CPU
    net = refinedet
    # For GPU/GPUs
    if args.cuda:
        if num_gpus > 1:
            net = torch.nn.DataParallel(refinedet)
        else:
            net = refinedet.cuda()
        cudnn.benchmark = True
    # Resume
    if args.resume_checkpoint:
        print('Resuming training, loading {}...'.format(
            args.resume_checkpoint))
        net.load_weights(args.resume_checkpoint)

    # pdb.set_trace()
    # params = net.state_dict()
    # for k, v in params.items():
    #     print(k)
    #     print(v.shape)
    optimizer = optim.SGD(filter(lambda p: p.requires_grad, net.parameters()),
                          lr=args.lr,
                          momentum=args.momentum,
                          weight_decay=args.weight_decay)
    net.train()
    print('Training RefineDet on:', args.imdb_name)
    print('Using the specified args:')
    print(args)

    step_index = 0
    str_input_size = str(cfg['min_dim'])
    model_info = 'refinedet{0}_'.format(str_input_size) + args.dataset
    model_save_folder = os.path.join(args.save_folder, model_info)
    if not os.path.exists(model_save_folder):
        os.mkdir(model_save_folder)

    data_loader = data.DataLoader(blob_dataset,
                                  args.batch_size,
                                  num_workers=args.num_workers,
                                  shuffle=True,
                                  collate_fn=detection_collate,
                                  pin_memory=True)
    # Create batch iterator
    # Number of iterations in each epoch
    num_iter_per_epoch = len(blob_dataset) // args.batch_size
    # number of epoch, in case of resuming from args.start_iter
    num_epoch = (cfg['max_iter'] - args.start_iter) // num_iter_per_epoch
    iteration = args.start_iter
    arm_loss_loc = 0
    arm_loss_conf = 0
    odm_loss_loc = 0
    odm_loss_conf = 0
    for epoch in range(0, num_epoch):
        # pdb.set_trace()
        for i_batch, (images, targets) in enumerate(data_loader):
            if iteration in cfg['lr_steps']:
                step_index += 1
                adjust_learning_rate(optimizer, args.gamma, step_index)

            if args.cuda:
                images = Variable(images.cuda())
                targets = Variable(targets.cuda())
            else:
                images = Variable(images)
                targets = Variable(targets)
            # forward
            t0 = time.time()
            # backprop
            optimizer.zero_grad()
            bi_loss_loc, bi_loss_conf, multi_loss_loc, multi_loss_conf = \
                net(images, targets)
            loss = bi_loss_loc.mean() + bi_loss_conf.mean() + \
                   multi_loss_loc.mean() + multi_loss_conf.mean()
            loss.backward()
            optimizer.step()
            t1 = time.time()
            if num_gpus > 1:
                arm_loss_loc = bi_loss_loc.mean().data[0]
                arm_loss_conf = bi_loss_conf.mean().data[0]
                odm_loss_loc = multi_loss_loc.mean().data[0]
                odm_loss_conf = multi_loss_conf.mean().data[0]
            else:
                arm_loss_loc = bi_loss_loc.data[0]
                arm_loss_conf = bi_loss_conf.data[0]
                odm_loss_loc = multi_loss_loc.data[0]
                odm_loss_conf = multi_loss_conf.data[0]

            if iteration % 10 == 0:
                print('timer: %.4f sec.' % (t1 - t0))
                print('iter ' + repr(iteration) +
                      (' || ARM Loss Loc: %.4f  || ARM Loss Conf: %.4f' +
                       ' || ODM Loss Loc: %.4f  || ODM Loss Conf: %.4f' +
                       ' || Loss: %.4f ||') %
                      (arm_loss_loc, arm_loss_conf, odm_loss_loc,
                       odm_loss_conf, loss.data[0]) + ' ')


#                 print('iter ' + repr(iteration) +
#                       ' || Loss: %.4f ||' % (loss.data[0]) + ' ')
# print('iter ' + repr(iteration) +
#       ' || Loss: %.4f ||' % (loss.data[0]), end=' ')

            if iteration != 0 and iteration % 10000 == 0:
                #if iteration != 0 and iteration % cfg['checkpoint_step'] == 0:
                print('Saving state, iter:', iteration)
                torch.save(
                    refinedet.state_dict(),
                    os.path.join(model_save_folder,
                                 model_info + '_' + repr(iteration) + '.pth'))

            iteration += 1

    torch.save(refinedet.state_dict(),
               os.path.join(args.save_folder, args.dataset + '.pth'))
def train():
    # Assign imdb_name and imdbval_name according to args.dataset.
    if args.dataset == "voc":
        # args.imdb_name = "voc_2007_trainval"
        args.imdb_name = "voc_2007_trainval+voc_2012_trainval"
        args.imdbval_name = "voc_2007_test"
    elif args.dataset == "coco":
        args.imdb_name = "coco_2014_train+coco_2014_valminusminival"
        args.imdbval_name = "coco_2014_minival"
    # Import config
    if args.dataset == 'coco':
        cfg = (coco320, coco512)[args.input_size == 512]
    elif args.dataset == 'voc':
        cfg = (voc320, voc512)[args.input_size == 512]
    # Create imdb, roidb and blob_dataset
    print('Create or load an imdb.')
    imdb, roidb = combined_roidb(args.imdb_name)
    blob_dataset = BlobDataset(imdb,
                               roidb,
                               transform=SSDAugmentation(
                                   cfg['min_dim'], MEANS),
                               target_normalization=True)

    # Construct networks.
    print('Construct {}_refinedet network.'.format(args.network))
    if args.network == 'vgg16':
        refinedet = VGGRefineDet(cfg['num_classes'], cfg)
    elif args.network == 'resnet101':
        refinedet = ResNetRefineDet(cfg['num_classes'], cfg)

    pretrained_model = os.path.join(path_cfg.DATA_DIR, args.pretrained_folder,
                                    args.base_model)
    refinedet.create_architecture(pretrained_model,
                                  pretrained=True,
                                  fine_tuning=True)
    # For CPU
    net = refinedet
    # For GPU/GPUs
    if args.cuda:
        net = refinedet.cuda()
        if num_gpus > 1:
            net = torch.nn.DataParallel(net)
        cudnn.benchmark = True
    # Resume
    if args.resume_checkpoint:
        print('Resuming training, loading {}...'.format(
            args.resume_checkpoint))
        net.load_weights(args.resume_checkpoint)

    # pdb.set_trace()
    # params = net.state_dict()
    # for k, v in params.items():
    #     print(k)
    #     print(v.shape)
    optimizer = optim.SGD(filter(lambda p: p.requires_grad, net.parameters()),
                          lr=args.lr,
                          momentum=args.momentum,
                          weight_decay=args.weight_decay)
    net.train()
    print('Training RefineDet on:', args.imdb_name)
    print('Using the specified args:')
    print(args)

    output_folder = os.path.join(path_cfg.OUTPUT_DIR, args.output_folder)
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    str_input_size = str(cfg['min_dim'])
    model_info = 'refinedet{}_{}'.format(str_input_size, args.dataset)
    model_output_folder = os.path.join(output_folder,
                                       '{}'.format(args.network), model_info)
    if not os.path.exists(model_output_folder):
        os.makedirs(model_output_folder)

    data_loader = data.DataLoader(blob_dataset,
                                  args.batch_size,
                                  num_workers=args.num_workers,
                                  shuffle=True,
                                  collate_fn=detection_collate,
                                  pin_memory=True)
    # Create batch iterator
    # Number of iterations in each epoch
    base_batch_size = 32
    batch_multiplier = float(args.batch_size) / base_batch_size
    # number of epoch, in case of resuming from args.start_iter
    # fixed number of epoches, no matter what args.batch_size is
    num_epoch = (cfg['max_iter'] - args.start_iter) // (len(blob_dataset) //
                                                        base_batch_size)
    base_iteration = args.start_iter
    lr_steps = [int(x / batch_multiplier) for x in cfg['lr_steps']]
    actual_iteration = 0
    decay_step = 0
    # print('num_epoch: {}, batch_multiplier: {}, maximum base_iteration {} actual_iteration: {}')
    for epoch in range(0, num_epoch):
        # pdb.set_trace()
        t0 = time.time()
        for i_batch, (images, targets) in enumerate(data_loader):
            if actual_iteration in lr_steps:
                decay_step += 1
                adjust_learning_rate(optimizer, args.gamma, decay_step)

            if args.cuda:
                images = Variable(images.cuda())
                targets = Variable(targets.cuda())
            else:
                images = Variable(images)
                targets = Variable(targets)
            t1_data = time.time()
            # forward and backprop
            optimizer.zero_grad()
            bi_loss_loc, bi_loss_conf, multi_loss_loc, multi_loss_conf = \
                net(images, targets)
            loss = bi_loss_loc.mean() + bi_loss_conf.mean() + \
                   multi_loss_loc.mean() + multi_loss_conf.mean()
            # loss = bi_loss_loc.mean() + bi_loss_conf.mean()
            loss.backward()
            optimizer.step()
            t1 = time.time()
            if num_gpus > 1:
                arm_loss_loc = bi_loss_loc.mean().item()
                arm_loss_conf = bi_loss_conf.mean().item()
                odm_loss_loc = multi_loss_loc.mean().item()
                odm_loss_conf = multi_loss_conf.mean().item()
            else:
                arm_loss_loc = bi_loss_loc.item()
                arm_loss_conf = bi_loss_conf.item()
                odm_loss_loc = multi_loss_loc.item()
                odm_loss_conf = multi_loss_conf.item()

            if actual_iteration % 10 == 0:
                print('timer: %.4f sec, data loading timer: %.4f sec' %
                      (t1 - t0, t1_data - t0))
                print('iter ' + repr(actual_iteration) +
                      (' || ARM Loss Loc: %.4f  || ARM Loss Conf: %.4f' +
                       ' || ODM Loss Loc: %.4f  || ODM Loss Conf: %.4f' +
                       ' || Loss: %.4f ||') %
                      (arm_loss_loc, arm_loss_conf, odm_loss_loc,
                       odm_loss_conf, loss.item()) + ' ')
            # save checkpoint.
            if actual_iteration != 0 and actual_iteration % (int(
                    10000 / batch_multiplier)) == 0:
                print('Saving state, iter:', base_iteration)
                torch.save(
                    refinedet.state_dict(),
                    os.path.join(
                        model_output_folder, '_'.join([
                            args.network, model_info,
                            repr(base_iteration) + '.pth'
                        ])))
            # update counts.
            actual_iteration += 1
            base_iteration = int(actual_iteration * batch_multiplier)
            t0 = time.time()

    torch.save(
        refinedet.state_dict(),
        os.path.join(model_output_folder,
                     '_'.join([args.network, model_info + '.pth'])))