Beispiel #1
0
def demo():
    net = Resnet18_8s(ver_dim=vote_num * 2, seg_dim=2)
    net = NetWrapper(net).cuda()
    net = DataParallel(net)

    optimizer = optim.Adam(net.parameters(), lr=train_cfg['lr'])
    model_dir = os.path.join(cfg.MODEL_DIR, "switch_linemod_train")
    load_model(net.module.net, optimizer, model_dir, -1)

    image, points_3d, bb8_3d = read_data()
    image = image[None, ...]
    seg_pred, vertex_pred = net(image)

    # visualize_mask(mask)
    # visualize_vertex(vertex, vertex_weights)
    # visualize_hypothesis(image, seg_pred, vertex_pred, corner_target)
    # visualize_voting_ellipse(image, seg_pred, vertex_pred, corner_target)

    eval_net = DataParallel(EvalWrapper().cuda())
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    camera_matrix = np.array([[572.4114, 0., 325.2611],
                              [0., 573.57043, 242.04899], [0., 0., 1.]])
    pose_pred = pnp(points_3d, corner_pred, camera_matrix)

    projector = Projector()
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')
    print(bb8_2d_pred)
    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...])
Beispiel #2
0
def demo():
    net = Resnet18_8s(ver_dim=vote_num * 2, seg_dim=2)
    net = NetWrapper(net).cuda()
    net = DataParallel(net)

    optimizer = optim.Adam(net.parameters(), lr=train_cfg['lr'])
    model_dir = os.path.join(cfg.MODEL_DIR, "cat_demo")
    load_model(net.module.net, optimizer, model_dir, args.load_epoch)
    data, points_3d, bb8_3d = read_data()
    image, mask, vertex, vertex_weights, pose, corner_target = [
        d.unsqueeze(0).cuda() for d in data
    ]
    seg_pred, vertex_pred, loss_seg, loss_vertex, precision, recall = net(
        image, mask, vertex, vertex_weights)

    eval_net = DataParallel(EvalWrapper().cuda())
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    camera_matrix = np.array([[572.4114, 0., 325.2611],
                              [0., 573.57043, 242.04899], [0., 0., 1.]])
    pose_pred = pnp(points_3d, corner_pred, camera_matrix)

    projector = Projector()
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')
    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(),
                                  'linemod')
    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...],
                           bb8_2d_gt[None, None, ...])
def demo():
    net = Resnet18_8s(ver_dim=vote_num * 2, seg_dim=2)
    net = NetWrapper(net).cuda()
    net = DataParallel(net)

    optimizer = optim.Adam(net.parameters(), lr=train_cfg['lr'])
    model_dir = os.path.join(cfg.MODEL_DIR, "cat_linemod_train")  #cat_demo

    load_model(net.module.net, optimizer, model_dir, args.load_epoch)

    data, points_3d, bb8_3d = read_data()

    image, mask, vertex, vertex_weights, pose, corner_target = [
        d.unsqueeze(0).cuda() for d in data
    ]

    seg_pred, vertex_pred, loss_seg, loss_vertex, precision, recall = net(
        image, mask, vertex, vertex_weights)

    eval_net = DataParallel(EvalWrapper().cuda())

    #向量方形图,语义分割图,然后 ransac 计算 kp,,向量方向图一旦准了,kp也就准了
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]

    camera_matrix = np.array([[572.4114, 0., 325.2611],
                              [0., 573.57043, 242.04899], [0., 0., 1.]])

    pose_pred = pnp(points_3d, corner_pred, camera_matrix)

    projector = Projector()
    #
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')

    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(),
                                  'linemod')

    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]

    print("loss_seg:{} , loss_vertex:{} , precision:{},recall:{},  ".format(
        loss_seg, loss_vertex, precision, recall))
    #399.pth
    #loss_seg:tensor([0.0015], device='cuda:0', grad_fn=<MeanBackward0>) , loss_vertex:tensor([0.0016], device='cuda:0', grad_fn=<DivBackward1>) ,
    #precision:tensor([0.9434], device='cuda:0'),recall:tensor([0.9677], device='cuda:0'),
    #199.pth
    # loss_seg:tensor([0.0015], device='cuda:0', grad_fn=<MeanBackward0>) , loss_vertex:tensor([0.0016], device='cuda:0', grad_fn=<DivBackward1>) ,
    # precision:tensor([0.9583], device='cuda:0'),recall:tensor([0.9524], device='cuda:0'),
    erro = bb8_2d_pred - bb8_2d_gt
    erro = np.abs(erro)
    err = np.reshape(erro, (erro.size, ))
    #abserr = map(abs,err)

    print("reproject sum_error:{} ".format(np.sum(err)))
    ## 199  reproject sum_error:13.385891544820552
    ## 399  reproject sum_error:12.718721049803733

    ##看了是有提高   准召定义  准确下降,召回上升
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...],
                           bb8_2d_gt[None, None, ...])
Beispiel #4
0
def demo(idx):
    
    data, bb8_3d = read_data(idx)
    print("BB8_3D: ",bb8_3d)
    image, mask, pose = [d.unsqueeze(0).cuda() for d in data]
    projector = Projector()
    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(), 'blender')
    print(bb8_2d_gt)
    
    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_bounding_box(image[None, ...], bb8_2d_gt[None, None, ...])
Beispiel #5
0
def inference(input_image, count=0):
    c_timer = time.time()
    rgb = input_image
    if args.input != 'image':
        color = cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB)
        rgb = color
    pre_start = time.time()
    print(pre_start - c_timer, "s BGR2RGB")
    #rgb = Image.open(input_image)
    #print(rgb.shape)
    start = time.time()
    transformer = transforms.Compose([
        transforms.ToTensor(),
        transforms.Normalize(mean=[0.485, 0.456, 0.406],
                             std=[0.229, 0.224, 0.225])
    ])
    rgb = transformer(rgb)
    rgb = rgb.unsqueeze(0).cuda()
    seg_pred, vertex_pred = net(rgb)
    eval_net = DataParallel(EvalWrapper().cuda())
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    end = time.time()
    print(end - start, "s - to go from image to corner prediction")
    image = imagenet_to_uint8(rgb.detach().cpu().numpy())[0]
    pose_pred = pnp(points_3d, corner_pred, camera_matrix)
    projector = Projector()
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'logitech')
    end_ = time.time()
    print(end_ - end, "s - to project the corners and show the result")
    seg_mask = torch.argmax(seg_pred, 1)
    if args.debug:
        visualize_mask(seg_mask, count)
        pose_test = np.array([[1, 0, 0, 0], [0, 1, 0, 0.3], [0, 0, 1, 1.2]])
        print(pose_pred)
        #print(pose_test)
        bb8_2d_gt = projector.project(bb8_3d, pose_test, 'logitech')
    if pose_pred[2][3] < 0.4:
        if pose_pred[2][3] > -0.4:
            if isinstance(rgb, torch.Tensor):
                rgb = rgb.permute(0, 2, 3, 1).detach().cpu().numpy()
            rgb = rgb.astype(np.uint8)
            _, ax = plt.subplots(1)
            ax.imshow(cv2.cvtColor(input_image, cv2.COLOR_BGR2RGB))
            #plt.show()
            plt.savefig('temp{}.png'.format(count))
            plt.close()

            print("image was culled due to pose being unreasonable")
    else:
        visualize_bounding_box(image[None, ...],
                               bb8_2d_pred[None, None, ...],
                               save=True,
                               count=count)  #,bb8_2d_gt[None, None, ...])
Beispiel #6
0
def demo():
    net = Resnet18_8s(ver_dim=vote_num * 2, seg_dim=2)
    net = NetWrapper(net).cuda()
    net = DataParallel(net)

    optimizer = optim.Adam(net.parameters(), lr=train_cfg['lr'])
    model_dir = os.path.join(cfg.MODEL_DIR, "cat_demo")
    load_model(net.module.net, optimizer, model_dir, -1)
    data, points_3d, bb8_3d = read_data()
    #print("BB8_3D: ",bb8_3d)
    image, mask, vertex, vertex_weights, pose, corner_target = [
        d.unsqueeze(0).cuda() for d in data
    ]
    seg_pred, vertex_pred, loss_seg, loss_vertex, precision, recall = net(
        image, mask, vertex, vertex_weights)
    seg_mask = torch.argmax(seg_pred, 1)

    print("seg_mask", seg_mask, type(seg_mask), seg_mask.shape, seg_mask[0])

    visualize_mask(seg_mask)
    visualize_mask(mask)
    #visualize_vertex(vertex, vertex_weights)
    #visualize_hypothesis(image, seg_pred, vertex_pred, corner_target)
    visualize_voting_ellipse(image, seg_pred, vertex_pred, corner_target)

    eval_net = DataParallel(EvalWrapper().cuda())
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    print("Corner Predictions: ", corner_pred)

    camera_matrix = np.array([[572.4114, 0., 325.2611],
                              [0., 573.57043, 242.04899], [0., 0., 1.]])
    pose_pred = pnp(points_3d, corner_pred, camera_matrix)

    projector = Projector()
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')
    print("Pose prediction :\n", pose_pred)
    print("GT pose: \n", pose[0].detach().cpu().numpy())

    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(),
                                  'linemod')
    print(bb8_2d_gt)

    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...],
                           bb8_2d_gt[None, None, ...])
Beispiel #7
0
 def visualize_bounding_box(corners_pred, corners_targets, rgb):
     visualize_bounding_box(corners_pred, corners_targets, rgb)
Beispiel #8
0
    # camera_matrix = np.array([[572.4114, 0., 325.2611],
    #                           [0., 573.57043, 242.04899],
    #                           [0., 0., 1.]])
    # pose_pred = pnp(points_3d, corner_pred, camera_matrix)

    # projector = Projector()
    # bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')
    # bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(), 'linemod')
    # image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    # visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...], bb8_2d_gt[None, None, ...])
=======
    seg_pred, vertex_pred, loss_seg, loss_vertex, precision, recall = net(image, mask, vertex, vertex_weights)
    raise TypeError
    eval_net = DataParallel(EvalWrapper().cuda())
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    camera_matrix = np.array([[572.4114, 0., 325.2611],
                              [0., 573.57043, 242.04899],
                              [0., 0., 1.]])
    pose_pred = pnp(points_3d, corner_pred, camera_matrix)

    projector = Projector()
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')
    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(), 'linemod')
    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...], bb8_2d_gt[None, None, ...])
>>>>>>> 2c722555563b8a77e36b246d82747754cf8dfae7


if __name__ == "__main__":
    demo()
Beispiel #9
0
def demo():
    net = Resnet18_8s(ver_dim=vote_num * 2, seg_dim=2)
    net = NetWrapper(net).cuda()
    net = DataParallel(net)

    optimizer = optim.Adam(net.parameters(), lr=train_cfg['lr'])
    model_dir = os.path.join(cfg.MODEL_DIR, 'cat_demo')
    load_model(net.module.net, optimizer, model_dir, args.load_epoch)
    data, points_3d, bb8_3d = read_data()
    image, mask, vertex, vertex_weights, pose, corner_target = [
        d.unsqueeze(0).cuda() for d in data
    ]

    # Run the net
    seg_pred, vertex_pred, loss_seg, loss_vertex, precision, recall = net(
        image, mask, vertex, vertex_weights)

    print('vertex_pred.shape')
    print(vertex_pred.shape)
    print(' ')

    print('vertex_pred[0]')
    print(vertex_pred)
    print(' ')

    # Various visualizations
    #visualize_vertex_field(vertex_pred,vertex_weights, keypointIdx=3)
    print('asdasdsadas')
    print(seg_pred.shape, mask.shape)
    visualize_mask(np.squeeze(seg_pred.cpu().detach().numpy()),
                   mask.cpu().detach().numpy())
    rgb = Image.open('data/demo/cat.jpg')
    img = np.array(rgb)
    #visualize_overlap_mask(img, np.squeeze(seg_pred.cpu().detach().numpy()), None)

    # Run the ransac voting
    eval_net = DataParallel(EvalWrapper2().cuda())
    #corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    corner_pred, covar = [
        x.cpu().detach().numpy()[0] for x in eval_net(seg_pred, vertex_pred)
    ]
    print('Keypoint predictions:')
    print(corner_pred)
    print(' ')
    print('covar: ', covar)
    print(' ')
    camera_matrix = np.array([[572.4114, 0., 325.2611],
                              [0., 573.57043, 242.04899], [0., 0., 1.]])

    # Fit pose to points
    #pose_pred = pnp(points_3d, corner_pred, camera_matrix)
    #evaluator = Evaluator()
    #pose_pred = evaluator.evaluate_uncertainty(corner_pred,covar,pose,'cat',intri_matrix=camera_matrix)

    def getWeights(covar):
        cov_invs = []
        for vi in range(covar.shape[0]):  # For every keypoint
            if covar[vi, 0, 0] < 1e-6 or np.sum(np.isnan(covar)[vi]) > 0:
                cov_invs.append(np.zeros([2, 2]).astype(np.float32))
                continue
            cov_inv = np.linalg.inv(scipy.linalg.sqrtm(covar[vi]))
            cov_invs.append(cov_inv)
        cov_invs = np.asarray(cov_invs)  # pn,2,2
        weights = cov_invs.reshape([-1, 4])
        weights = weights[:, (0, 1, 3)]
        return weights

    weights = getWeights(covar)
    pose_pred = uncertainty_pnp(corner_pred, weights, points_3d, camera_matrix)

    print('Predicted pose: \n', pose_pred)
    print('Ground truth pose: \n', pose[0].detach().cpu().numpy())
    print(' ')

    projector = Projector()
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'linemod')
    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(),
                                  'linemod')
    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_points(image[None, ...],
                     corner_target.detach().cpu().numpy(),
                     pts_pred=corner_pred[None, :, :])
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...],
                           bb8_2d_gt[None, None, ...])
Beispiel #10
0
def demo(idx):
    net = Resnet18_8s(ver_dim=vote_num * 2, seg_dim=2)
    net = NetWrapper(net).cuda()
    net = DataParallel(net)

    optimizer = optim.Adam(net.parameters(), lr=train_cfg['lr'])
    model_dir = os.path.join(cfg.MODEL_DIR, "intake_demo")
    load_model(net.module.net, optimizer, model_dir, -1)
    data, points_3d, bb8_3d = read_data(idx)
    #print("BB8_3D: ",bb8_3d)
    image, mask, vertex, vertex_weights, pose, corner_target = [
        d.unsqueeze(0).cuda() for d in data
    ]
    seg_pred, vertex_pred, loss_seg, loss_vertex, precision, recall = net(
        image, mask, vertex, vertex_weights)
    seg_mask = torch.argmax(seg_pred, 1)

    visualize_mask(seg_mask)
    visualize_mask(mask)
    #visualize_vertex(vertex, vertex_weights)
    #visualize_hypothesis(image, seg_pred, vertex_pred, corner_target)
    #visualize_voting_ellipse(image, seg_pred, vertex_pred, corner_target)
    #############
    eval_net = DataParallel(EvalWrapper().cuda())
    uncertain_eval_net = DataParallel(UncertaintyEvalWrapper().cuda())
    corner_pred = eval_net(seg_pred, vertex_pred).cpu().detach().numpy()[0]
    net.eval()
    loss_seg, loss_vertex, precision, recall = [
        torch.mean(val) for val in (loss_seg, loss_vertex, precision, recall)
    ]
    print("LOSS SEG :", loss_seg, "\nLOSS VERTEX : ", loss_vertex,
          "\nPRECISION :", precision, '\nRECALL :', recall)

    ###############
    #print("Corner Predictions: ",corner_pred)
    camera_matrix = np.array([[700, 0., 320.], [0., 700, 240.], [0., 0., 1.]])
    pose_pred = pnp(points_3d, corner_pred, camera_matrix)
    projector = Projector()
    print("Pose prediction :\n", pose_pred)
    pose_gt = pose[0].detach().cpu().numpy()
    print("GT Pose :\n", pose[0].detach().cpu().numpy())
    s = 0
    import math as m
    for i in range(3):
        if pose_pred[2][3] < 0:
            print('NB!')
        s += (pose_pred[i][3] - pose_gt[i][3])**2
    s = m.sqrt(s)
    print("--->",
          loss_seg.detach().cpu().numpy(),
          loss_vertex.detach().cpu().numpy(),
          precision.detach().cpu().numpy(),
          recall.detach().cpu().numpy(), s)
    bb8_2d_pred = projector.project(bb8_3d, pose_pred, 'blender')
    bb8_2d_gt = projector.project(bb8_3d, pose[0].detach().cpu().numpy(),
                                  'blender')
    #print(bb8_2d_gt)

    image = imagenet_to_uint8(image.detach().cpu().numpy())[0]
    visualize_bounding_box(image[None, ...], bb8_2d_pred[None, None, ...],
                           bb8_2d_gt[None, None, ...])
Beispiel #11
0
def val(net,
        PVNet,
        dataloader,
        epoch,
        lr,
        writer,
        val_prefix='val',
        use_camera_intrinsic=False,
        use_motion=False):
    for rec in recs:
        rec.reset()

    test_begin = time.time()
    eval_net = DataParallel(EvalWrapper().cuda(
    ))  # if not use_motion else DataParallel(MotionEvalWrapper().cuda())
    # uncertain_eval_net=DataParallel(UncertaintyEvalWrapper().cuda())
    net.eval()

    if val_prefix == 'val':
        if (train_cfg['eval_epoch'] and epoch % train_cfg['eval_inter'] == 0
                and epoch >= train_cfg['eval_epoch_begin']) or args.test_model:
            iterations = train_cfg["eval_iterations"] + 1
        else:
            iterations = train_cfg["train_iterations"] + 2
    else:
        iterations = 2

    evaluatorList = []
    losses_vertex = np.zeros(int(
        (iterations)))  # /train_cfg["skips"])+(train_cfg["skips"]-1)))
    losses_q = np.zeros(int(
        (iterations)))  # /train_cfg["skips"])+(train_cfg["skips"]-1)))
    norm_q = np.zeros(int(
        (iterations)))  # /train_cfg["skips"])+(train_cfg["skips"]-1)))
    norm_v = np.zeros(int(
        (iterations)))  # /train_cfg["skips"])+(train_cfg["skips"]-1)))
    deltas = np.zeros(int(
        (iterations)))  # /train_cfg["skips"])+(train_cfg["skips"]-1)))
    for i in range(iterations):
        # if (i % train_cfg["skips"]==0) or (i==0):
        evaluatorList.append(Evaluator())

    data_counter = 0
    PVNet.eval()
    for idx, data in tqdm(enumerate(dataloader)):
        if use_camera_intrinsic:
            image, mask, vertex, vertex_weights, pose, corner_target, Ks = [
                d for d in data
            ]
        else:
            image, mask, vertex, vertex_weights, pose, corner_target = [
                d for d in data
            ]
            # image = image
            # mask = mask
            # vertex = vertex
            # vertex_weights = vertex_weights
            # pose = pose
            im = image.half()

        with torch.no_grad():

            pose = pose.cpu().numpy()
            delta = train_cfg["delta"]
            id = 0
            for t in range(iterations):
                if t == 0:
                    seg_pred, vertex_init = PVNet(im)
                    mask_init = torch.argmax(seg_pred, 1)
                    vertex_init = vertex_init.cpu().float()
                else:
                    vertex_init_pert = vertex_init
                    _, _, q_pred, loss, precision, recall = net(
                        image, mask, vertex, vertex_weights,
                        vertex_init_pert.detach(), vertex_init.detach())
                    loss, precision, recall = [
                        torch.mean(val) for val in (loss, precision, recall)
                    ]
                    # losses_seg[t] = losses_seg[t] + loss_seg
                    # losses_vertex[id] = losses_vertex[id] + loss_vertex
                    # losses_q[id] = losses_q[id] + loss_q

                    # q_gt = vertex_init - vertex

                    norm_q[id] = norm_q[id] + ((1/torch.sum(vertex_weights).cpu().numpy()) * \
                        (np.linalg.norm((vertex_weights.cpu().numpy() * (q_pred.cpu().numpy()  - (vertex_init.cpu().numpy() - vertex.cpu().numpy())))**2)))

                    if t > 0:

                        # 0.01 * (0.99)**t
                        # mask_init = mask
                        # delta = compute_step_size(delta, vertex.detach(), vertex_init.detach(), vertex_weights.detach(), -q_pred.detach(), train_cfg,t)
                        deltas[id] = deltas[id] + delta
                        vertex_init = vertex_init - (delta * q_pred.cpu())
                        # vertex_init = normalise_vector_field(vertex_init,vertex_init0)

                    # if data_counter==1000:
                    #     plot_mask_vfield(image, rgb_pth, mask_init, mask_pth, vertex_init, t)
                norm_v[id] = norm_v[id] + ((1/torch.sum(vertex_weights).cpu().numpy()) * \
                        (np.linalg.norm((vertex_weights.cpu().numpy() * (vertex_init.cpu().numpy()- vertex.cpu().numpy())))**2))

                # if args.use_uncertainty_pnp:
                #     mean,cov_inv=uncertain_eval_net(mask_init,vertex_init)
                #     mean=mean.cpu().numpy()
                #     cov_inv=cov_inv.cpu().numpy()
                # else:
                #     corner_pred=eval_net(mask_init,vertex_init).cpu().detach().numpy()

                # b=pose.shape[0]
                # pose_preds=[]
                # for bi in range(b):
                #     intri_type='use_intrinsic' if use_camera_intrinsic else 'linemod'
                #     K=Ks[bi].cpu().numpy() if use_camera_intrinsic else None
                #     if args.use_uncertainty_pnp:
                #         pose_preds.append(evaluatorList[id].evaluate_uncertainty(mean[bi],cov_inv[bi],pose[bi],args.linemod_cls,
                #                                                         intri_type,vote_type,intri_matrix=K))
                #     else:
                #         pose_preds.append(evaluatorList[id].evaluate(corner_pred[bi],pose[bi],args.linemod_cls,intri_type,
                #             vote_type,intri_matrix=K))

                # if args.save_inter_result:
                #     mask_pr = torch.argmax(seg_pred, 1).cpu().detach().numpy()
                #     mask_gt = mask.cpu().detach().numpy()
                #     # assume b3th.join(args.save_inter_dir, '{}_mask_gt.png'.format(idx)), mask_gt[0])
                #     imsave(os.path.join(args.save_inter_dir, '{}_rgb.png'.format(idx)),
                #         imagenet_to_uint8(image.cpu().detach().numpy()[0]))
                #     save_pickle([pose_preds[0],pose[0]],os.path.join(args.save_inter_dir, '{}_pose.pkl'.format(idx)))

                if t > 0:
                    vals = [loss, precision, recall]
                    for rec, val in zip(recs, vals):
                        rec.update(val)

                if t == 0:
                    corners_init = corner_pred[np.newaxis, ...]
                if t == iterations - 1:
                    corners_end = corner_pred[np.newaxis, ...]
                    visualize_bounding_box(image,
                                           corners_init,
                                           t,
                                           corners_targets=corners_end)
                id += 1

        data_counter += 1

    proj_err_list = []
    add_list = []
    p_increase_add = 0
    p_decrease_v = 0
    p_decrease_q = 0
    first_a = []
    first_v = []
    largest_a = 0
    smallest_v = 0
    smallest_q = 0
    # if val_prefix == 'val':
    id = 0

    for i in range(iterations):
        # if (i % train_cfg["skips"]==0) or (i==0):
        # proj_err,add,cm=evaluatorList[id].average_precision(False)
        # losses_q[id] = losses_q[id] / len(dataloader)
        norm_q[id] = norm_q[id] / len(dataloader)
        norm_v[id] = norm_v[id] / len(dataloader)
        if i == 0:
            # first_a = add
            # largest_a = add
            first_v = norm_v[id]
            smallest_v = norm_v[id]
        if i == 1:
            first_q = norm_q[id]
            smallest_q = norm_q[id]
        # proj_err_list.append(proj_err)
        # add_list.append(add)
        # losses_vertex[id] = losses_vertex[id] / len(dataloader)
        deltas[id] = deltas[id] / len(dataloader)
        if i > 0:
            deltas[id] = deltas[id] + deltas[id - 1]
            if norm_v[id] < smallest_v:
                smallest_v = norm_v[id]
                if i > 1:
                    smallest_q = norm_q[id]
            # if add > largest_a:
            #     largest_a = add
        id += 1
    # if (largest_a == first_a):
    # largest_a = max(add_list.remove(largest_a))

    # print("after loop")
    # print("smallest_v after: ", smallest_v)
    # print("first_v after: ",first_v)
    # print("largest_a after: ", largest_a)
    # print("add list: ",add_list)
    print('X-X^: ', norm_v)
    # print('smallest_q after', smallest_q)
    # print('first_q after', first_q)
    # p_increase_add = ((largest_a - first_a)/first_a)*100
    p_decrease_v = ((first_v - smallest_v) / first_v) * 100
    p_decrease_q = ((first_q - smallest_q) / first_q) * 100
    print(train_cfg['exp_name'])
    # print('add percentage increase ', p_increase_add)
    print('X-X^ percentage decrease: ', p_decrease_v)
    print('q-q^ percentage decrease: ', p_decrease_q)

    #     distance = np.array(list(range(len(add_list)))) * (train_cfg["delta"]*train_cfg["skips"])
    #     # distance = deltas
    #     print(add_list)
    #     print(norm_v)
    #     print(norm_q)
    #     # distance = np.array(list(range(iterations)))
    #     # print((np.array(list(range(len(add_list)))) * train_cfg["delta"]).shape)
    #     # print(deltas.shape)
    #     fig = plt.figure(figsize=[24,12])
    #     ax1 = plt.subplot(241)
    #     ax1.plot(distance,add_list)
    #     ax1.axvline(x=(train_cfg["train_iterations"]) * train_cfg["sigma"],color='gray',linestyle='--')
    #     ax1.set_title('ADD')
    #     ax1.set_xlabel(r"$\rho_E$")
    #     ax1.grid()
    #     ax2 = plt.subplot(242)
    #     ax2.plot(distance,proj_err_list)
    #     ax2.set_title('2D proj')
    #     ax2.axvline(x=(train_cfg["train_iterations"]) * train_cfg["sigma"],color='gray',linestyle='--')
    #     ax2.set_xlabel(r"$\rho_E$")
    #     ax2.grid()
    #     ax3 = plt.subplot(243)
    #     ax3.plot(distance[1:],norm_q[1:]/norm_q[1])
    #     ax3.set_title(r'$||q - \hat{q}||$')
    #     ax3.axvline(x=(train_cfg["train_iterations"]) * train_cfg["sigma"],color='gray',linestyle='--')
    #     ax3.set_xlabel(r"$\rho_E$")
    #     ax3.grid()
    #     ax4 = plt.subplot(244)
    #     ax4.plot(distance[1:],norm_v[1:]/norm_v[1])
    #     ax4.set_title(r'$||x-\hat{x}||$')
    #     ax4.axvline(x=(train_cfg["train_iterations"]) * train_cfg["sigma"],color='gray',linestyle='--')
    #     ax4.set_xlabel(r"$\rho_E$")
    #     ax4.grid()
    #     ax5 = plt.subplot(246)
    #     ax5.plot(distance[1:],losses_vertex[1:]/losses_vertex[1])
    #     ax5.set_title(r'$\mathcal{L}_X$')
    #     ax5.axvline(x=(train_cfg["train_iterations"]) * train_cfg["sigma"],color='gray',linestyle='--')
    #     ax5.set_xlabel(r"$\rho_E$")
    #     ax5.grid()
    #     ax6 = plt.subplot(247)
    #     ax6.plot(distance[1:],losses_q[1:]/losses_q[1])
    #     ax6.set_title(r'$\mathcal{L}_q$')
    #     ax6.axvline(x=(train_cfg["train_iterations"]) * train_cfg["sigma"],color='gray',linestyle='--')
    #     ax6.set_xlabel(r"$\rho_E$")
    #     ax6.grid()
    #     fig.suptitle(r"""Date: {}, Epoch: {}
    #         $T_T$ = {}, $\sigma$ = {}: $\rho_T$ = {}.
    #         $T_E$ = {}, $\delta$ = {}: $\rho_E$ = {}.""".format( \
    #         date.today(),epoch,(train_cfg["train_iterations"]),train_cfg["sigma"],(train_cfg["train_iterations"])*train_cfg["sigma"],\
    #         (train_cfg["eval_iterations"]),train_cfg["delta"],(train_cfg["eval_iterations"])*train_cfg["delta"]))
    #     plt.savefig('{}/{}_{}_{}.png'.format(train_cfg["exp_name"],date.today(),epoch,train_cfg["delta"]))

    with torch.no_grad():
        batch_size = image.shape[0]
        nrow = 5 if batch_size > 5 else batch_size
        recorder.rec_segmentation(F.softmax(seg_pred, dim=1),
                                  num_classes=2,
                                  nrow=nrow,
                                  step=epoch,
                                  name='{}/image/seg'.format(val_prefix))
        recorder.rec_vertex(vertex_init,
                            vertex_weights,
                            nrow=4,
                            step=epoch,
                            name='{}/image/ver'.format(val_prefix))

    losses_batch = OrderedDict()
    for name, rec in zip(recs_names, recs):
        losses_batch['{}/'.format(val_prefix) + name] = rec.avg
    if (train_cfg['eval_epoch'] and epoch % train_cfg['eval_inter'] == 0
            and epoch >= train_cfg['eval_epoch_begin']
            and val_prefix == 'val'):  # or args.test_model:
        print(val_prefix)
        # proj_err,add,cm=evaluatorList[-1].average_precision(False)
        # losses_batch['{}/scalar/projection_error'.format(val_prefix)]=proj_err
        # losses_batch['{}/scalar/add'.format(val_prefix)]=add
        # losses_batch['{}/scalar/cm'.format(val_prefix)]=cm
        recorder.rec_loss_batch(losses_batch, epoch, epoch, val_prefix)
        # writer.add_scalar('projection error', proj_err, epoch)
        # writer.add_scalar('add',add,epoch)
        # writer.add_scalar('vertex loss',loss_vertex, epoch)
        # writer.add_scalar('q loss',loss_q, epoch)
        # writer.add_scalar('seg loss', loss_seg, epoch)
        writer.add_scalar('learning rate', lr, epoch)

    for rec in recs:
        rec.reset()

    print('epoch {} {} cost {} s'.format(epoch, val_prefix,
                                         time.time() - test_begin))

    return add_list, first_a, first_v, largest_a, smallest_v, smallest_q, p_increase_add, p_decrease_v, p_decrease_q