Example #1
0
def main(args):
    model = HyperRegression(args,
                            input_width=CPI_WIDTH,
                            input_height=CPI_HEIGHT)
    model = model.cuda()
    resume_checkpoint = args.resume_checkpoint
    print(f"Resume Path: {resume_checkpoint}")
    checkpoint = torch.load(resume_checkpoint)
    model_serialize = checkpoint['model']
    model.load_state_dict(model_serialize)
    model.eval()
    save_path = os.path.join(os.path.split(resume_checkpoint)[0], 'results')
    if not os.path.exists(save_path):
        os.mkdir(save_path)

    data_test = SDDData(width=CPI_WIDTH,
                        height=CPI_HEIGHT,
                        split='test',
                        normalize=False,
                        root=args.data_dir)

    metrics = {"car": defaultdict(list), "ped": defaultdict(list)}

    for scene_id in range(len(data_test.dataset.scenes)):
        data_test.test_id = scene_id
        print("scene", scene_id, "n_datas", len(data_test))

        test_loader = torch.utils.data.DataLoader(dataset=data_test,
                                                  batch_size=1,
                                                  shuffle=False,
                                                  num_workers=0,
                                                  pin_memory=True)

        pedestrian_gt = []
        car_gt = []

        pedestrian_x = None
        car_x = None
        for bidx, data in enumerate(test_loader):
            x, y_gt = data

            if bidx % 2 == 0:
                pedestrian_x = x
                pedestrian_gt.append(y_gt)
            else:
                car_x = x
                car_gt.append(y_gt)

        for bidx, (obj_name, x, y_gt) in enumerate([("ped", pedestrian_x,
                                                     pedestrian_gt),
                                                    ("car", car_x, car_gt)]):

            y_gt = torch.stack(y_gt).float().to(args.gpu)
            x = x.float().to(args.gpu)

            _, y_pred = model.decode(x, 100)

            log_py, log_px, _ = model.get_logprob(x.repeat(len(y_gt), 1, 1, 1),
                                                  y_gt)
            log_py = log_py.cpu().detach().numpy().squeeze()
            log_px = log_px.cpu().detach().numpy().squeeze()

            metrics[obj_name]["nll_px"].extend(-1.0 * log_px)
            metrics[obj_name]["nll_py"].extend(-1.0 * log_py)

            y_gt_np = y_gt.detach().cpu().numpy().reshape((-1, 2))

            y_pred = y_pred.cpu().detach().numpy().squeeze()

            oracle_err = np.array([
                mmfp_utils.compute_oracle_FDE(
                    y_pred.reshape(1, *y_pred.shape, 1, 1),
                    yg.reshape(
                        1,
                        1,
                        2,
                        1,
                    )) for yg in y_gt_np
            ])
            metrics[obj_name]["oracle_err"].append(oracle_err.mean())

            hist_gt, *_ = np.histogram2d(y_gt_np[:, 0],
                                         y_gt_np[:, 1],
                                         bins=np.linspace(0, 512, 512))
            hist_pred, *_ = np.histogram2d(y_pred[:, 0],
                                           y_pred[:, 1],
                                           bins=np.linspace(0, 512, 512))

            wemd = computeWEMD(hist_pred, hist_gt)
            metrics[obj_name]["wemd"].append(wemd)

            log_metrics = {
                "oracle_err": oracle_err.mean(),
                "wemd": wemd,
                "nll_px": (-1 * log_px).mean(),
                "nll_py": (-1 * log_py).mean()
            }
            print(f"scene {scene_id}", obj_name, log_metrics)
            testing_sequence = data_test.dataset.scenes[
                data_test.test_id].sequences[bidx]
            objects_list = []
            for k in range(3):
                objects_list.append(
                    decode_obj(testing_sequence.objects[k],
                               testing_sequence.id))
            objects = np.stack(objects_list, axis=0)
            gt_object = np.array([[[[0], [0], [0], [0], [bidx]]]]).astype(
                float)  # mock it and draw dots instead
            drawn_img_hyps = draw_hyps(testing_sequence.imgs[2],
                                       y_pred,
                                       gt_object,
                                       objects,
                                       normalize=False)

            for (x1, y1) in y_gt_np:
                color = (255, 0, 0)
                cv2.circle(drawn_img_hyps, (x1, y1), 3, color, -1)
            cv2.imwrite(
                os.path.join(save_path,
                             f"{scene_id}-{bidx}-{obj_name}-hyps.jpg"),
                drawn_img_hyps)

    total_metrics = defaultdict(list)

    for k, mets in metrics.items():
        for obj_name, nums in mets.items():
            print(f"Mean {k} {obj_name}: ", np.array(nums).mean())
            total_metrics[obj_name].extend(nums)

    for obj_name, nums in mets.items():
        print(f"Total mean {obj_name}: ", np.array(nums).mean())
Example #2
0
def main(args):
    model = HyperRegression(args)
    model = model.cuda()
    resume_checkpoint = args.resume_checkpoint
    print(f"Resume Path: {resume_checkpoint}")
    checkpoint = torch.load(resume_checkpoint, map_location="cpu")
    model_serialize = checkpoint['model']
    model.load_state_dict(model_serialize)
    model.eval()
    save_path = os.path.join(os.path.split(resume_checkpoint)[0], 'results')
    if not os.path.exists(save_path):
        os.mkdir(save_path)
    data_test = SDDData(split='test', normalize=False, root=args.data_dir)
    nll_px_sum = 0
    nll_py_sum = 0

    multimod_emd_sum = 0

    counter = 0.0

    results = []
    for session_id in range(len(data_test.dataset.scenes)):
        data_test.test_id = session_id
        test_loader = torch.utils.data.DataLoader(
            dataset=data_test, batch_size=1, shuffle=False,
            num_workers=0, pin_memory=True)
        for bidx, data in enumerate(test_loader):

            x, y_gt = data
            x = x.float().to(args.gpu)
            y_gt = y_gt.float().to(args.gpu).unsqueeze(1)
            _, y_pred = model.decode(x, 1000)

            log_py, log_px, _ = model.get_logprob(x, y_gt)

            log_py = log_py.cpu().detach().numpy().squeeze()
            log_px = log_px.cpu().detach().numpy().squeeze()

            hyps_name = f"{session_id}-{bidx}-hyps.jpg"
            print(hyps_name)
            print("nll_x", str(-1.0 * log_px))
            print("nll_y", str(-1.0 * log_py))
            print("nll_(x+y)", str(-1.0 * log_px + log_py))

            nll_px_sum = nll_px_sum + -1.0 * log_px
            nll_py_sum = nll_py_sum + -1.0 * log_py
            counter = counter + 1.0
            y_pred = y_pred.cpu().detach().numpy().squeeze()

            testing_sequence = data_test.dataset.scenes[data_test.test_id].sequences[bidx]
            objects_list = []
            for k in range(3):
                objects_list.append(decode_obj(testing_sequence.objects[k], testing_sequence.id))
            objects = np.stack(objects_list, axis=0)
            gt_object = decode_obj(testing_sequence.objects[-1], testing_sequence.id)
            drawn_img_hyps = draw_hyps(testing_sequence.imgs[-1], y_pred, gt_object, objects, normalize=False)
            cv2.imwrite(os.path.join(save_path, hyps_name), drawn_img_hyps)

            multimod_emd = mmfp_utils.wemd_from_pred_samples(y_pred)
            multimod_emd_sum += multimod_emd
            print("multimod_emd", multimod_emd)

            _, _, height, width = x.shape

            (X, Y), (log_px_grid, log_py_grid) = get_grid_logprob(height, width, x, model)

            draw_sdd_heatmap(
                objects=objects_list,
                gt_object=gt_object,
                testing_sequence=testing_sequence,
                log_px_pred=log_px_grid,
                X=X, Y=Y,
                save_path=os.path.join(save_path, f"{session_id}-{bidx}-heatmap.png")
            )

            result_row = {
                "session_id": session_id,
                "bidx": bidx,
                "nll_x": float(-1.0 * log_px),
                "nll_y": float(-1.0 * log_py),
                "multimod_emd": float(multimod_emd)
            }
            results.append(result_row)

    print("Mean log_p_x: ", nll_px_sum / counter)
    print("Mean log_p_y: ", nll_py_sum / counter)
    print("Mean multimod_emd:", multimod_emd_sum / counter)

    with open(os.path.join(save_path, "metrics.json"), "w") as f:
        json.dump(results, f)
Example #3
0
def main_worker(gpu, save_dir, ngpus_per_node, args):
    # basic setup
    cudnn.benchmark = True
    normalize = False
    args.gpu = gpu
    if args.gpu is not None:
        print("Use GPU: {} for training".format(args.gpu))

    model = HyperRegression(args)

    torch.cuda.set_device(args.gpu)
    model = model.cuda(args.gpu)
    start_epoch = 0
    optimizer = model.make_optimizer(args)
    if args.resume_checkpoint is None and os.path.exists(
            os.path.join(save_dir, 'checkpoint-latest.pt')):
        args.resume_checkpoint = os.path.join(
            save_dir, 'checkpoint-latest.pt')  # use the latest checkpoint
    if args.resume_checkpoint is not None:
        if args.resume_optimizer:
            model, optimizer, start_epoch = resume(
                args.resume_checkpoint,
                model,
                optimizer,
                strict=(not args.resume_non_strict))
        else:
            model, _, start_epoch = resume(args.resume_checkpoint,
                                           model,
                                           optimizer=None,
                                           strict=(not args.resume_non_strict))
        print('Resumed from: ' + args.resume_checkpoint)

    # initialize datasets and loaders

    # initialize the learning rate scheduler
    if args.scheduler == 'exponential':
        scheduler = optim.lr_scheduler.ExponentialLR(optimizer, args.exp_decay)
    elif args.scheduler == 'step':
        scheduler = optim.lr_scheduler.StepLR(optimizer,
                                              step_size=args.epochs // 2,
                                              gamma=0.1)
    elif args.scheduler == 'linear':

        def lambda_rule(ep):
            lr_l = 1.0 - max(0, ep - 0.5 * args.epochs) / float(
                0.5 * args.epochs)
            return lr_l

        scheduler = optim.lr_scheduler.LambdaLR(optimizer,
                                                lr_lambda=lambda_rule)
    else:
        assert 0, "args.schedulers should be either 'exponential' or 'linear'"

    # main training loop
    start_time = time.time()
    entropy_avg_meter = AverageValueMeter()
    latent_nats_avg_meter = AverageValueMeter()
    point_nats_avg_meter = AverageValueMeter()
    if args.distributed:
        print("[Rank %d] World size : %d" % (args.rank, dist.get_world_size()))

    print("Start epoch: %d End epoch: %d" % (start_epoch, args.epochs))
    data = SDDData(split='train', normalize=normalize, root=args.data_dir)
    data_test = SDDData(split='test', normalize=normalize, root=args.data_dir)
    train_loader = torch.utils.data.DataLoader(dataset=data,
                                               batch_size=args.batch_size,
                                               shuffle=True,
                                               num_workers=0,
                                               pin_memory=True)
    test_loader = torch.utils.data.DataLoader(dataset=data_test,
                                              batch_size=1,
                                              shuffle=False,
                                              num_workers=0,
                                              pin_memory=True)
    for epoch in range(start_epoch, args.epochs):
        # adjust the learning rate
        if (epoch + 1) % args.exp_decay_freq == 0:
            scheduler.step(epoch=epoch)

        # train for one epoch
        print("Epoch starts:")
        for bidx, data in enumerate(train_loader):
            # if bidx < 2:
            x, y = data
            #y = y.float().to(args.gpu).unsqueeze(1).repeat(1, 10).unsqueeze(2)
            x = x.float().to(args.gpu)
            y = y.float().to(args.gpu).unsqueeze(1)
            y = y.repeat(1, 20, 1)
            y += torch.randn(y.shape[0], y.shape[1], y.shape[2]).to(args.gpu)
            step = bidx + len(train_loader) * epoch
            model.train()
            recon_nats = model(x, y, optimizer, step, None)
            point_nats_avg_meter.update(recon_nats.item())
            if step % args.log_freq == 0:
                duration = time.time() - start_time
                start_time = time.time()
                print(
                    "[Rank %d] Epoch %d Batch [%2d/%2d] Time [%3.2fs] PointNats %2.5f"
                    % (args.rank, epoch, bidx, len(train_loader), duration,
                       point_nats_avg_meter.avg))
                # print("Memory")
                # print(process.memory_info().rss / (1024.0 ** 3))
        # save visualizations
        if (epoch + 1) % args.viz_freq == 0:
            # reconstructions
            model.eval()
            for bidx, data in enumerate(test_loader):
                x, _ = data
                x = x.float().to(args.gpu)
                _, y_pred = model.decode(x, 100)
                y_pred = y_pred.cpu().detach().numpy().squeeze()
                # y_pred[y_pred < 0] = 0
                # y_pred[y_pred >= 0.98] = 0.98
                testing_sequence = data_test.dataset.scenes[
                    data_test.test_id].sequences[bidx]
                objects_list = []
                for k in range(3):
                    objects_list.append(
                        decode_obj(testing_sequence.objects[k],
                                   testing_sequence.id))
                objects = np.stack(objects_list, axis=0)
                gt_object = decode_obj(testing_sequence.objects[-1],
                                       testing_sequence.id)
                drawn_img_hyps = draw_hyps(testing_sequence.imgs[-1], y_pred,
                                           gt_object, objects, normalize)
                cv2.imwrite(
                    os.path.join(save_dir, 'images',
                                 str(bidx) + '-' + str(epoch) + '-hyps.jpg'),
                    drawn_img_hyps)
        if (epoch + 1) % args.save_freq == 0:
            save(model, optimizer, epoch + 1,
                 os.path.join(save_dir, 'checkpoint-%d.pt' % epoch))
            save(model, optimizer, epoch + 1,
                 os.path.join(save_dir, 'checkpoint-latest.pt'))