コード例 #1
0
ファイル: main.py プロジェクト: sunnyyehuda/FastDepth
def train(train_loader, model, criterion, optimizer, epoch):
    average_meter = AverageMeter()
    model.train()  # switch to train mode
    end = time.time()
    for i, (input, target) in enumerate(train_loader):

        input, target = input.cuda(), target.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute pred
        end = time.time()
        pred = model(input)
        loss = criterion(pred, target)
        optimizer.zero_grad()
        loss.backward()  # compute gradient and do SGD step
        optimizer.step()
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)

        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        if (i + 1) % args.print_freq == 0:
            print('=> output: {}'.format(output_directory))
            print('Train Epoch: {0} [{1}/{2}]\t'
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                      epoch,
                      i + 1,
                      len(train_loader),
                      data_time=data_time,
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))

    avg = average_meter.average()
    with open(train_csv, 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow({
            'mse': avg.mse,
            'rmse': avg.rmse,
            'absrel': avg.absrel,
            'lg10': avg.lg10,
            'mae': avg.mae,
            'delta1': avg.delta1,
            'delta2': avg.delta2,
            'delta3': avg.delta3,
            'gpu_time': avg.gpu_time,
            'data_time': avg.data_time
        })
コード例 #2
0
ファイル: main.py プロジェクト: abdur4373/FCRN_pytorch
def train(train_loader, model, criterion, optimizer, epoch, logger):
    average_meter = AverageMeter()
    model.train()  # switch to train mode
    end = time.time()

    batch_num = len(train_loader)

    for i, (input, target) in enumerate(train_loader):

        # itr_count += 1
        input, target = input.cuda(), target.cuda()
        # print('input size  = ', input.size())
        # print('target size = ', target.size())
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute pred
        end = time.time()

        pred = model(input)  # @wx 注意输出

        # print('pred size = ', pred.size())
        # print('target size = ', target.size())

        loss = criterion(pred, target)
        optimizer.zero_grad()
        loss.backward()  # compute gradient and do SGD step
        optimizer.step()
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        if (i + 1) % args.print_freq == 0:
            print('=> output: {}'.format(output_directory))
            print('Train Epoch: {0} [{1}/{2}]\t'
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'Loss={Loss:.5f} '
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'RML={result.absrel:.2f}({average.absrel:.2f}) '
                  'Log10={result.lg10:.3f}({average.lg10:.3f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'Delta2={result.delta2:.3f}({average.delta2:.3f}) '
                  'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format(
                epoch, i + 1, len(train_loader), data_time=data_time,
                gpu_time=gpu_time, Loss=loss.item(), result=result, average=average_meter.average()))
            current_step = epoch * batch_num + i
            logger.add_scalar('Train/RMSE', result.rmse, current_step)
            logger.add_scalar('Train/rml', result.absrel, current_step)
            logger.add_scalar('Train/Log10', result.lg10, current_step)
            logger.add_scalar('Train/Delta1', result.delta1, current_step)
            logger.add_scalar('Train/Delta2', result.delta2, current_step)
            logger.add_scalar('Train/Delta3', result.delta3, current_step)

    avg = average_meter.average()
コード例 #3
0
ファイル: main.py プロジェクト: JennyGao00/depth
def validate(epoch, valData, model, logger):
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()
    # skip = len(valData) // 9  # save images every skip iters

    for i, (image, depth) in enumerate(valData):
        image = image.cuda()
        depth = depth.cuda()
        # normal = normal.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        end = time.time()
        with torch.no_grad():
            pred = model(image)

        torch.cuda.synchronize()
        gpu_time = time.time() - end

        result = Result()
        result.evaluate(pred.data, depth.data)
        average_meter.update(result, gpu_time, data_time, image.size(0))
        end = time.time()

        if (i + 1) % 10 == 0:
            print('Test Epoch: [{0}/{1}]\t'
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'RML={result.absrel:.2f}({average.absrel:.2f}) '
                  'Log10={result.lg10:.3f}({average.lg10:.3f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'Delta2={result.delta2:.3f}({average.delta2:.3f}) '
                  'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format(
                i + 1, len(valData), data_time=data_time,
                gpu_time=gpu_time, result=result, average=average_meter.average()))


        avg = average_meter.average()

        print('\n*\n'
              'RMSE={average.rmse:.3f}\n'
              'Rel={average.absrel:.3f}\n'
              'Log10={average.lg10:.3f}\n'
              'Delta1={average.delta1:.3f}\n'
              'Delta2={average.delta2:.3f}\n'
              'Delta3={average.delta3:.3f}\n'
              't_GPU={time:.3f}\n'.format(
            average=avg, time=avg.gpu_time))

        logger.add_scalar('Test/rmse', avg.rmse, epoch)
        logger.add_scalar('Test/Rel', avg.absrel, epoch)
        logger.add_scalar('Test/log10', avg.lg10, epoch)
        logger.add_scalar('Test/Delta1', avg.delta1, epoch)
        logger.add_scalar('Test/Delta2', avg.delta2, epoch)
        logger.add_scalar('Test/Delta3', avg.delta3, epoch)
        return avg
コード例 #4
0
def train(train_loader, model, criterion, optimizer, epoch):
	average_meter = AverageMeter()
	model.train() # switch to train mode
	end = time.time()
	for i, (input, target) in enumerate(train_loader):
		input, target = input.cuda(), target.cuda()
		torch.cuda.synchronize()
		data_time = time.time() - end

		# compute pred
		end = time.time()
		pred = model(input)
		loss = criterion(pred, target)
		optimizer.zero_grad()
		loss.backward() # compute gradient and do SGD step
		optimizer.step()
		torch.cuda.synchronize()
		gpu_time = time.time() - end

		depth_in = np.hstack(input.data.cpu().numpy()[:4, 3] / 10.)
		depth_in = cv2.applyColorMap((depth_in * 255).astype(np.uint8), cv2.COLORMAP_HOT)

		tgt_out = np.hstack(np.squeeze(target[:4].data.cpu().numpy())) / 10.
		tgt_out = cv2.applyColorMap((tgt_out * 255).astype(np.uint8), cv2.COLORMAP_HOT)

		out = np.hstack(np.squeeze(pred[:4].data.cpu().numpy()))
		out = np.clip(out / 10., 0., 1.)
		out = cv2.applyColorMap((out * 255).astype(np.uint8), cv2.COLORMAP_HOT)

		if i % 20 == 0:
			cv2.imshow("Training Results", np.vstack([depth_in, tgt_out, out]))
			cv2.waitKey(1)

		# measure accuracy and record loss
		result = Result()
		result.evaluate(pred.data, target.data)
		average_meter.update(result, gpu_time, data_time, input.size(0))
		end = time.time()

		if (i + 1) % args.print_freq == 0:
			print('=> output: {}'.format(output_directory))
			print('Train Epoch: {0} [{1}/{2}]\t'
				  't_Data={data_time:.3f}({average.data_time:.3f}) '
				  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
				  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
				  'MAE={result.mae:.2f}({average.mae:.2f}) '
				  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
				  'REL={result.absrel:.3f}({average.absrel:.3f}) '
				  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
				  epoch, i+1, len(train_loader), data_time=data_time,
				  gpu_time=gpu_time, result=result, average=average_meter.average()))

	avg = average_meter.average()
	with open(train_csv, 'a') as csvfile:
		writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
		writer.writerow({'mse': avg.mse, 'rmse': avg.rmse, 'absrel': avg.absrel, 'lg10': avg.lg10,
			'mae': avg.mae, 'delta1': avg.delta1, 'delta2': avg.delta2, 'delta3': avg.delta3,
			'gpu_time': avg.gpu_time, 'data_time': avg.data_time})
コード例 #5
0
def iterate(mode, args, loader, model, optimizer, logger, epoch):
    block_average_meter = AverageMeter()
    average_meter = AverageMeter()
    meters = [block_average_meter, average_meter]

    # switch to appropriate mode
    assert mode in ["train", "val", "eval", "test_prediction", "test_completion"], \
        "unsupported mode: {}".format(mode)
    if mode == 'train':
        model.train()
        lr = helper.adjust_learning_rate(args.lr, optimizer, epoch)
    else:
        model.eval()
        lr = 0

    for i, batch_data in enumerate(loader):
        start = time.time()
        batch_data = {
            key: val.to(device)
            for key, val in batch_data.items() if val is not None
        }
        gt = batch_data[
            'gt'] if mode != 'test_prediction' and mode != 'test_completion' else None
        data_time = time.time() - start

        start = time.time()
        with torch.no_grad():  # 自己加的
            pred = model(batch_data)
        depth_loss, photometric_loss, smooth_loss, mask = 0, 0, 0, None

        gpu_time = time.time() - start

        # measure accuracy and record loss
        with torch.no_grad():
            mini_batch_size = next(iter(batch_data.values())).size(0)
            result = Result()
            if mode != 'test_prediction' and mode != 'test_completion':
                #result.evaluate(pred.data, gt.data, photometric_loss)
                result.evaluate(pred.data.cpu(), gt.data.cpu(),
                                photometric_loss)
            [
                m.update(result, gpu_time, data_time, mini_batch_size)
                for m in meters
            ]
            logger.conditional_print(mode, i, epoch, lr, len(loader),
                                     block_average_meter, average_meter)
            logger.conditional_save_img_comparison(mode, i, batch_data, pred,
                                                   epoch)
            logger.conditional_save_pred(mode, i, pred, epoch)

    avg = logger.conditional_save_info(mode, average_meter, epoch)
    is_best = logger.rank_conditional_save_best(mode, avg, epoch)
    if is_best and not (mode == "train"):
        logger.save_img_comparison_as_best(mode, epoch)
    logger.conditional_summarize(mode, avg, is_best)

    return avg, is_best
コード例 #6
0
ファイル: main.py プロジェクト: JennyGao00/depth
def train(epoch, trainData, model, crite, optimizer, logger):
    average_meter = AverageMeter()
    model.train()  # switch to train mode
    end = time.time()

    for i, (image, depth) in enumerate(trainData):
        image = image.cuda()
        depth = depth.cuda()
        # normal = normal.cuda()
        # image = torch.autograd.Variable(image)
        # depth = torch.autograd.Variable(depth)
        torch.cuda.synchronize()
        data_time = time.time() - end

        end = time.time()
        optimizer.zero_grad()
        pred = model(image)
        loss = crite(pred, depth)
        loss.backward()
        optimizer.step()
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        result = Result()
        result.evaluate(pred.data, depth.data)
        average_meter.update(result, gpu_time, data_time, image.size(0))
        end = time.time()

        if (i + 1) % 10 == 0:
            print('=> output: {}'.format(opt.output_dir))
            print('Train Epoch: {0} [{1}/{2}]\t'
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'Loss={Loss:.5f} '
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'RML={result.absrel:.2f}({average.absrel:.2f}) '
                  'Log10={result.lg10:.3f}({average.lg10:.3f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'Delta2={result.delta2:.3f}({average.delta2:.3f}) '
                  'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format(
                epoch, i + 1, len(trainData), data_time=data_time,
                gpu_time=gpu_time, Loss=loss.item(), result=result, average=average_meter.average()))
            current_step = epoch * len(trainData) + i
            logger.add_scalar('Train/loss', loss, current_step)
            logger.add_scalar('Train/RMSE', result.rmse, current_step)
            logger.add_scalar('Train/rml', result.absrel, current_step)
            logger.add_scalar('Train/Log10', result.lg10, current_step)
            logger.add_scalar('Train/Delta1', result.delta1, current_step)
            logger.add_scalar('Train/Delta2', result.delta2, current_step)
            logger.add_scalar('Train/Delta3', result.delta3, current_step)
コード例 #7
0
 def compute_depth_metrics(self, verbose=True) -> Result:
     """Computes metrics on the difference between raw and fixed depth values"""
     avg = AverageMeter()
     for i, path in enumerate(self.paths):
         _, depth_raw, depth_fix = self.load_images(path)
         depth_raw = torch.tensor(depth_raw)
         depth_fix = torch.tensor(depth_fix)
         res = Result()
         res.evaluate(depth_raw, depth_fix)
         avg.update(res, 0, 0, 1)
         if verbose:
             stdout.write(f"=> computing img {i}/{len(self)}\r")
     if verbose:
         stdout.write("\n")
     return avg.average()
コード例 #8
0
def train_coarse(train_loader, model, criterion, optimizer, epoch):
    average_meter = AverageMeter()
    model.train()  # switch to train mode
    end = time.time()
    for i, (input, target) in enumerate(train_loader):
        input, target = input.cuda(), target.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute pred
        end = time.time()
        pred = model(input)
        loss = criterion(pred, target)
        optimizer.zero_grad()
        loss.backward()  # compute gradient and do SGD step
        optimizer.step()
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        end = time.time()
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        eval_time = time.time() - end

        if (i + 1) % args.print_freq == 0:
            history_loss.append(loss.item())
            print('=> output: {}'.format(output_directory))
            print('Train Epoch: {0} [{1}/{2}]\t'
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                      epoch,
                      i + 1,
                      len(train_loader),
                      data_time=data_time,
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))
コード例 #9
0
def evaluate(params, loader, model, experiment):
    print("Testing...")
    with experiment.test() and torch.no_grad():
        average = AverageMeter()
        end = time.time()
        for i, (inputs, targets) in enumerate(loader):
            inputs, targets = inputs.to(params["device"]), targets.to(
                params["device"])

            data_time = time.time() - end

            # Predict
            end = time.time()
            outputs = model(inputs)
            gpu_time = time.time() - end

            # Clip prediction
            outputs[outputs > params["depth_max"]] = params["depth_max"]
            outputs[outputs < params["depth_min"]] = params["depth_min"]

            result = Result()
            result.evaluate(outputs.data, targets.data)
            average.update(result, gpu_time, data_time, inputs.size(0))

            # Log images to comet
            img_merged = utils.log_image_to_comet(inputs[0],
                                                  targets[0],
                                                  outputs[0],
                                                  epoch=0,
                                                  id=i,
                                                  experiment=experiment,
                                                  result=result,
                                                  prefix="visual_test")
            if params["save_test_images"]:
                filename = os.path.join(
                    params["experiment_dir"],
                    "image_{}_epoch_{}.png".format(i,
                                                   str(params["start_epoch"])))
                utils.save_image(img_merged, filename)
コード例 #10
0
ファイル: main.py プロジェクト: kopetri/FCRN_pytorch
def validate(val_loader, model, epoch, logger):
    average_meter = AverageMeter()

    model.eval()  # switch to evaluate mode

    end = time.time()

    skip = len(val_loader) // 9  # save images every skip iters

    for i, (input, target) in enumerate(val_loader):

        input, target = input.cuda(), target.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            pred = model(input)

        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)

        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        # save 8 images for visualization
        if args.dataset == 'kitti':
            rgb = input[0]
            pred = pred[0]
            target = target[0]
        else:
            rgb = input

        if i == 0:
            img_merge = utils.merge_into_row(rgb, target, pred)
        elif (i < 8 * skip) and (i % skip == 0):
            row = utils.merge_into_row(rgb, target, pred)
            img_merge = utils.add_row(img_merge, row)
        elif i == 8 * skip:
            filename = output_directory + '/comparison_' + str(epoch) + '.png'
            utils.save_image(img_merge, filename)

        if (i + 1) % args.print_freq == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'RML={result.absrel:.2f}({average.absrel:.2f}) '
                  'Log10={result.lg10:.3f}({average.lg10:.3f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'Delta2={result.delta2:.3f}({average.delta2:.3f}) '
                  'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format(
                      i + 1,
                      len(val_loader),
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))

    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'Rel={average.absrel:.3f}\n'
          'Log10={average.lg10:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'Delta2={average.delta2:.3f}\n'
          'Delta3={average.delta3:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    logger.add_scalar('Test/rmse', avg.rmse, epoch)
    logger.add_scalar('Test/Rel', avg.absrel, epoch)
    logger.add_scalar('Test/log10', avg.lg10, epoch)
    logger.add_scalar('Test/Delta1', avg.delta1, epoch)
    logger.add_scalar('Test/Delta2', avg.delta2, epoch)
    logger.add_scalar('Test/Delta3', avg.delta3, epoch)
    return avg, img_merge
コード例 #11
0
ファイル: main.py プロジェクト: LeonSun0101/YT
def test(model):
    global name
    test_dir = config.test_dir
    test_dataset = YT_dataset(test_dir, config, is_train_set=False)
    test_loader = torch.utils.data.DataLoader(test_dataset,
                                              batch_size=1,
                                              shuffle=False,
                                              num_workers=args.workers,
                                              pin_memory=True)
    file_name = config.test_result_name + str('.csv')
    test_csv_2 = os.path.join(config.test_output_dir, file_name)
    #print(test_csv_2)
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()
    num = 0
    for i, (Y, Y_1_2, Y_1_4, Y_1_8, LR, LR_8, HR,
            name) in enumerate(test_loader):
        Y = Y.cuda()
        LR = LR.cuda()
        LR_8 = LR_8.cuda()
        HR = HR.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end
        end = time.time()
        with torch.no_grad():
            #  print("I am for validation in main 342")
            num = num + 1
            if args.arch == 'VDSR_16':
                pred_HR = model(LR)
            elif args.arch == 'VDSR_16_2':
                pred_HR = model(Y, LR)
            elif args.arch == 'VDSR':
                pred_HR, residule = model(LR_8, Y)
            elif args.arch == 'ResNet_bicubic':
                pred_HR, residule = model(LR_8, Y)
            elif args.arch == 'resnet50_15_2' or 'resnet50_15_3':
                pred_HR, residule = model(Y, LR, LR_8)
            else:
                pred_HR, thermal0 = model(Y, LR)

        gpu_time = time.time() - end

        image_pred_HR = trans_norm_tensor_into_T(pred_HR)
        #image_pred_HR = trans_norm_tensor_into_T(thermal0)

        image_LR = trans_norm_tensor_into_rgb(LR)
        image_HR = trans_norm_tensor_into_rgb(HR)
        #image_HR=trans_norm_tensor_into_T(HR)
        name_HR = str(
            config.test_output_dir_HR) + str(num) + str('_HR') + str(".png")
        name_pred_HR = str(
            config.test_output_dir_pred_HR) + str(num) + str(".png")
        name_HR_bicubic_HR_res = str(
            config.test_output_dir_res) + str(num) + str(".png")
        #name_bicubic_HR = str(config.test_output_dir_bicubic_HR) + str(num) + str(".png")
        #cv2.imwrite(name_HR,image_HR[...,::-1])
        #print(name_pred_HR)
        #cv2.imwrite(name_pred_HR,image_pred_HR[...,::-1])
        #cv2.waitKey(0)
        torch.cuda.synchronize()

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred_HR, HR)
        average_meter.update(result, gpu_time, data_time,
                             Y.size(0))  # Y.size(0) batch_size
        end = time.time()
        # save 8 images for visualization,对验证集合生产图片
        dir_small = '/home1/sas/datasets/crop/smallthan7/'
        dir_big = '/home1/sas/datasets/crop/bigthan/'
        dir_out = '/home/zju231/sas/data/old_val_resnet50_15_1/'
        #dir_out='/home1/sas/results_model/pytorch/YT-SD/resnet50_30_thermal0/'
        #dir_out=test_dir
        name1 = dir_out + str(name[0][:-4]) + str('.png')
        cv2.imwrite(name1, image_pred_HR)
        name2 = dir_out + str(name[0][:-4]) + str('_HR.png')
        #cv2.imwrite(name2, image_HR[..., ::-1])
        name3 = dir_out + str(name[0][:-4]) + str('_Y.png')
        #cv2.imwrite(name3, np.squeeze(np.array(Y.cpu())) * 255)
        name4 = dir_out + str(name[0][:-4]) + str('_LR.png')
        #cv2.imwrite(name4, image_LR[..., ::-1])

        print('Test: [{0}/{1}]\t'
              't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
              'PSNR={result.psnr:.5f}({average.psnr:.5f}) '
              'RMSE={result.rmse:.5f}({average.rmse:.5f}) '
              'MAE={result.mae:.5f}({average.mae:.5f}) '
              'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
              'REL={result.absrel:.3f}({average.absrel:.3f}) '
              'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                  i + 1,
                  len(test_loader),
                  gpu_time=gpu_time,
                  result=result,
                  average=average_meter.average()))
    avg = average_meter.average()

    print('\n*\n'
          'PSNR={average.psnr:.5f}\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    if 1:
        with open(test_csv_2, 'w') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writeheader()
            writer.writerow({
                'psnr': 10 * math.log(1 / (avg.mse), 10),
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })
コード例 #12
0
ファイル: main.py プロジェクト: LeonSun0101/YT
def validate(val_loader, model, epoch, batch_epoch, write_to_file=True):
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()
    for i, (Y, Y_1_2, Y_1_4, Y_1_8, LR, LR_8, HR,
            name) in enumerate(val_loader):
        Y = Y.cuda()
        Y_1_2 = Y_1_2.cuda()
        Y_1_4 = Y_1_4.cuda()
        Y_1_8 = Y_1_8.cuda()
        LR_8 = LR_8.cuda()
        LR = LR.cuda()
        HR = HR.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end
        # compute output
        end = time.time()
        with torch.no_grad():
            #  print("I am for validation in main 342")
            if args.arch == 'VDSR_16':
                pred_HR = model(LR)
            elif args.arch == 'VDSR_16_2':
                pred_HR = model(Y, LR)
            elif args.arch == 'VDSR':
                pred_HR, residule = model(LR_8, Y)
            elif args.arch == 'ResNet_bicubic':
                pred_HR, residule = model(LR_8, Y)
            elif args.arch == 'resnet50_15_6' or 'resnet50_15_11' or 'resnet50_15_12':
                pred_HR = model(Y_1_2, LR)
            elif args.arch == 'resnet50_15_2' or 'resnet50_15_3' or 'resnet50_15_5' or 'resnet50_15_8' or 'resnet50_15_9':
                pred_HR, residule = model(Y, LR, LR_8)

            else:
                if config.use_different_size_Y == 1:
                    pred_HR, pred_thermal0 = model(Y, Y_1_2, Y_1_4, Y_1_8, LR)
                else:
                    pred_HR, pred_thermal = model(Y, LR)
        torch.cuda.synchronize()
        gpu_time = time.time() - end
        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred_HR, HR)
        average_meter.update(result, gpu_time, data_time,
                             Y.size(0))  #Y.size(0) batch_size
        end = time.time()

        # save 8 images for visualization,对验证集合生产图片
        skip = config.skip
        if i == 0:
            img_merge = utils.merge_into_row_with_YT(Y, LR, pred_HR, HR)
        elif (i < 8 * skip) and (i % skip == 0):
            row = utils.merge_into_row_with_YT(Y, LR, pred_HR, HR)
            img_merge = utils.add_row(img_merge, row)
        elif i == 8 * skip:  #储存最终的图片
            filename = output_directory + '/Compair_data_epoch_' + str(
                epoch) + '_batch_eopch_' + str(batch_epoch + 1) + '.png'
            utils.save_image(img_merge, filename)
            print("生成第" + str(batch_epoch + 1) + "图片")

    if (i + 1) % args.print_freq == 0:
        print('Test: [{0}/{1}]\t'
              't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
              'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
              'MAE={result.mae:.2f}({average.mae:.2f}) '
              'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
              'REL={result.absrel:.3f}({average.absrel:.3f}) '
              'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                  i + 1,
                  len(val_loader),
                  gpu_time=gpu_time,
                  result=result,
                  average=average_meter.average()))
    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'dataset epoch': epoch,
                'batch epoch': batch_num + 1,
                'psnr': 10 * math.log(1 / (avg.mse), 10),
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })
    return avg, img_merge
コード例 #13
0
ファイル: main.py プロジェクト: LeonSun0101/YT
def train(train_loader, val_loader, model, criterion, optimizer, epoch, lr):
    average_meter = AverageMeter()
    model.train()  # switch to train mode
    global batch_num, best_result
    end = time.time()
    #every batch
    for i, (Y, Y_1_2, Y_1_4, Y_1_8, LR, LR_8, HR,
            name) in enumerate(train_loader):  #处理被train_loader进去的每一个数据
        batch_num = batch_num + 1
        Y = Y.cuda()
        Y_1_2 = Y_1_2.cuda()
        Y_1_4 = Y_1_4.cuda()
        Y_1_8 = Y_1_8.cuda()
        LR = LR.cuda()
        LR_8 = LR_8.cuda()
        HR = HR.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        end = time.time()

        if args.arch == 'VDSR_16':
            pred_HR = model(LR)
            loss = criterion(pred_HR, HR, Y)
        elif args.arch == 'VDSR_16_2':
            pred_HR = model(Y, LR)
            loss = criterion(pred_HR, HR, Y)
        elif args.arch == 'VDSR':
            pred_HR, residule = model(LR_8, Y)
            loss = criterion(pred_HR, HR, Y)
        elif args.arch == 'ResNet_bicubic':
            pred_HR, residule = model(LR_8, Y)
            loss = criterion(pred_HR, HR, Y)
        elif args.arch == 'resnet50_15_6' or 'resnet50_15_11' or 'resnet50_15_12':
            pred_HR = model(Y_1_2, LR)
            loss = criterion(pred_HR, HR, Y)

        elif args.arch == 'resnet50_15_2' or 'resnet50_15_3' or 'resnet50_15_5' or 'resnet50_15_8' or 'resnet50_15_9':
            pred_HR, residule = model(Y, LR, LR_8)
            loss = criterion(pred_HR, HR, Y)

        else:
            if config.loss_num == 2:

                if config.LOSS_1 == 'l2':
                    # 均方差
                    criterion1 = criteria.MaskedMSELoss().cuda()
                elif config.LOSS_1 == 'l1':
                    criterion1 = criteria.MaskedL1Loss().cuda()
                elif config.LOSS_1 == 'l1_canny':
                    # 均方差
                    criterion1 = criteria.MaskedL1_cannyLoss().cuda()
                elif config.LOSS_1 == 'l1_from_rgb_sobel':
                    # 均方差
                    criterion1 = criteria.MaskedL1_from_rgb_sobel_Loss().cuda()
                elif aconfig.LOSS_1 == 'l1_canny_from_GT_canny':
                    criterion1 = criteria.MaskedL1_canny_from_GT_Loss().cuda()
                elif aconfig.LOSS_1 == 'l1_from_GT_sobel':
                    criterion1 = criteria.MaskedL1_from_GT_sobel_Loss().cuda()
                elif config.LOSS_1 == 'l2_from_GT_sobel_Loss':
                    criterion1 = criteria.MaskedL2_from_GT_sobel_Loss().cuda()

                if config.use_different_size_Y == 1:
                    pred_HR, pred_thermal0 = model(Y, Y_1_2, Y_1_4, Y_1_8, LR)
                else:
                    pred_HR, pred_thermal0 = model(Y, LR)
                #final loss
                loss0 = criterion(pred_HR, HR, Y)
                #therma upsample loss
                loss1 = criterion1(pred_thermal0, HR, Y)
                loss = config.LOSS_0_weight * loss0 + config.LOSS_1_weight * loss1
            else:
                if config.use_different_size_Y == 1:
                    pred_HR, pred_thermal0 = model(Y, Y_1_2, Y_1_4, Y_1_8, LR)
                    #writer = SummaryWriter(log_dir='logs')
                    #writer.add_graph(model, input_to_model=(Y,Y_1_2,Y_1_4,Y_1_8,LR,))
                else:
                    pred_HR, pred_thermal0 = model(Y, LR)
                loss = criterion(pred_HR, HR, Y)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred_HR, HR, loss.cpu().detach().numpy())
        average_meter.update(result, gpu_time, data_time, Y.size(0))
        end = time.time()

        if (i + 1) % args.print_freq == 0:

            print('=> output: {}'.format(output_directory))
            print('Dataset Epoch: {0} [{1}/{2}]\t'
                  'Batch Epoch: {3} \t'
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n'
                  'PSNR={result.psnr:.5f}({average.psnr:.5f}) '
                  'MSE={result.mse:.3f}({average.mse:.3f}) '
                  'RMSE={result.rmse:.3f}({average.rmse:.3f}) '
                  'MAE={result.mae:.3f}({average.mae:.3f}) '
                  'Delta1={result.delta1:.4f}({average.delta1:.4f}) '
                  'REL={result.absrel:.4f}({average.absrel:.4f}) '
                  'Lg10={result.lg10:.4f}({average.lg10:.4f}) '
                  'Loss={result.loss:}({average.loss:}) '.format(
                      epoch,
                      i + 1,
                      len(train_loader),
                      batch_num,
                      data_time=data_time,
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))
        else:
            pass
        if (batch_num + 1) % config.save_fc == 0:

            print("==============Time to evaluate=================")
            utils.adjust_learning_rate(optimizer, batch_num, lr)
            print("==============SAVE_MODEL=================")
            avg = average_meter.average()
            average_meter = AverageMeter()
            with open(train_csv, 'a') as csvfile:
                writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                writer.writerow({
                    'dataset epoch': epoch,
                    'batch epoch': batch_num + 1,
                    'psnr': 10 * math.log(1 / (avg.mse), 10),
                    'mse': result.mse,
                    'rmse': result.rmse,
                    'absrel': result.absrel,
                    'lg10': result.lg10,
                    'mae': result.mae,
                    'delta1': result.delta1,
                    'delta2': result.delta2,
                    'delta3': result.delta3,
                    'gpu_time': result.gpu_time,
                    'data_time': result.data_time,
                    'loss': result.loss
                })

            #------------------#
            #    VALIDATION    #
            #------------------#
            result_val, img_merge = validate(
                val_loader, model, epoch,
                batch_num)  # evaluate on validation set,每次训练完以后都要测试一下
            #------------------#
            # SAVE BEST MODEL  #
            #------------------#
            is_best = result_val.rmse < best_result.rmse
            if is_best:
                best_result = result_val
                with open(best_txt, 'w') as txtfile:
                    txtfile.write(
                        "dataset epoch={}\nbatch epoch={}\npsnr={:.5f}\nmse={:.3f}\nrmse={:.3f}\nabsrel={:.3f}\nlg10={:.3f}\nmae={:.3f}\ndelta1={:.3f}\nt_gpu={:.4f}\n"
                        .format(epoch, batch_num + 1,
                                10 * math.log(1 / (best_result.mse), 10),
                                best_result.mse, best_result.rmse,
                                best_result.absrel, best_result.lg10,
                                best_result.mae, best_result.delta1,
                                best_result.gpu_time))
                if img_merge is not None:
                    img_filename = output_directory + '/comparison_best.png'
                    utils.save_image(img_merge, img_filename)

            utils.save_checkpoint(
                {
                    'args': args,
                    'epoch': epoch,
                    'batch_epoch': batch_num,
                    'arch': args.arch,
                    'model': model,
                    'best_result': best_result,
                    'optimizer': optimizer,
                }, is_best, epoch, batch_num, output_directory)
コード例 #14
0
def validate(val_loader, model, write_to_file=True):
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()
    print_freq = 10
    for i, (input, target) in enumerate(val_loader):
        input, target = input.cuda(), target.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            pred = model(input)
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        # save 8 images for visualization
        skip = 10
        rgb = input

        if i == 0:
            import matplotlib.pyplot as plt
            plt.imsave('pred.png', np.squeeze(pred.cpu().numpy()))
            img_merge = utils.merge_into_row(rgb, target, pred)
        elif (i < 8 * skip) and (i % skip == 0):
            row = utils.merge_into_row(rgb, target, pred)
            img_merge = utils.add_row(img_merge, row)

        if (i + 1) % print_freq == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                      i + 1,
                      len(val_loader),
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))

    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })

    return avg, img_merge
コード例 #15
0
def val_rand(epoch):
    avg_loss = 0
    avg_psnr = 0
    frame_count = 0

    epoch_start = time.time()
    end = time.time()

    average_meter = AverageMeter()

    modelME.module.eval()
    modelME.module.netM.eval()
    modelME.module.netE.eval()

    for batch in val_loader:
        image_target, depth_target, depth_mask = Variable(batch[0]), Variable(
            batch[1]), Variable(batch[2])
        batch_size = depth_target.size(0)
        depth_input = depth_target.clone()

        image_height = image_target.size(2)
        image_width = image_target.size(3)
        #   Corrupt the target image
        for i in range(0, batch_size):
            n_depth_mask = depth_mask[i, 0, :, :].sum().item()

            #   Adjust the sampling rate based on the depth_mask
            sample_rate = opt.sample_rate / n_depth_mask * (image_height *
                                                            image_width)

            corrupt_mask = np.random.binomial(1, (1 - sample_rate),
                                              (image_height, image_width))

            corrupt_mask.astype(np.bool)
            corrupt_mask = torch.BoolTensor(corrupt_mask)

            depth_input[i, 0, :, :].masked_fill_(corrupt_mask, (0.0))

        if torch.cuda.is_available():
            image_target = image_target.cuda()
            depth_input = depth_input.cuda()
            depth_target = depth_target.cuda()
            depth_mask = depth_mask.cuda()

        rgb_sparse_d_input = torch.cat((image_target, depth_input), 1)

        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            depth_prediction = modelME.module.netE(rgb_sparse_d_input)

        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(depth_prediction.data, depth_target.data)
        average_meter.update(result, gpu_time, data_time, depth_input.size(0))
        end = time.time()

        for i in range(0, depth_input.shape[0]):

            loss_depth = criterion_depth(depth_prediction[[i]],
                                         depth_target[[i]], depth_mask[[i]])
            loss_mse = criterion_mse(depth_prediction[[i]], depth_target[[i]],
                                     depth_mask[[i]])
            psnr = 10 * log10(1 / loss_mse.data.item())

            avg_loss += loss_depth.data.item()
            avg_psnr += psnr
            frame_count += 1

    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    with open(val_rand_csv, 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow({
            'mse': avg.mse,
            'rmse': avg.rmse,
            'absrel': avg.absrel,
            'lg10': avg.lg10,
            'mae': avg.mae,
            'delta1': avg.delta1,
            'delta2': avg.delta2,
            'delta3': avg.delta3,
            'data_time': avg.data_time,
            'gpu_time': avg.gpu_time
        })

    epoch_end = time.time()
    print(
        "===> Epoch {} Random Validation: Avg. Loss: {:.4f}, Avg.PSNR:  {:.4f} dB, Time: {:.4f}"
        .format(epoch, avg_loss / frame_count, avg_psnr / frame_count,
                (epoch_end - epoch_start)))

    log_value('val_loss_depth_rand', avg_loss / frame_count, epoch)
    log_value('val_psnr_rand', avg_psnr / frame_count, epoch)

    log_images('depth_input_rand',
               reshape_4D_array(depth_input[[0], :, :, :].data.cpu().numpy(),
                                1),
               step=1)
    log_images('depth_prediction_rand',
               reshape_4D_array(
                   depth_prediction[[0], :, :, :].data.cpu().numpy(), 1),
               step=1)
    log_images('depth_target_rand',
               reshape_4D_array(depth_target[[0], :, :, :].data.cpu().numpy(),
                                1),
               step=1)
    log_images('image_target_rand',
               reshape_4D_array(image_target[[0], :, :, :].data.cpu().numpy(),
                                1),
               step=1)
コード例 #16
0
def iterate(mode, args, loader, model, optimizer, logger, epoch):
    block_average_meter = AverageMeter()
    average_meter = AverageMeter()
    meters = [block_average_meter, average_meter]

    # switch to appropriate mode
    assert mode in ["train", "val", "eval", "test_prediction", "test_completion"], \
        "unsupported mode: {}".format(mode)
    if mode == 'train':
        model.train()
        lr = helper.adjust_learning_rate(args.lr, optimizer, epoch)
    else:
        model.eval(
        )  # batchnorm or dropout layers will work in eval mode instead of training mode
        lr = 0

    for i, batch_data in enumerate(
            loader
    ):  # batch_data keys: 'd' (depth), 'gt' (ground truth), 'g' (gray)
        start = time.time()
        batch_data = {
            key: val.to(device)
            for key, val in batch_data.items() if val is not None
        }

        gt = batch_data[
            'gt'] if mode != 'test_prediction' and mode != 'test_completion' else None
        data_time = time.time() - start

        start = time.time()

        pred = model(batch_data)
        if args.save_images:  # save depth predictions
            pred_out_dir = max(glob.glob('../outputs/var_final_NN/var.test*'),
                               key=os.path.getmtime) + '/dense_depth_images'
            pred1 = pred.cpu().detach().numpy()[:, 0, :, :]
            for im_idx, pred_im in enumerate(pred1):
                pred_out_dir1 = os.path.abspath(pred_out_dir)
                cur_path = os.path.abspath((loader.dataset.paths)['d'][i])
                basename = os.path.basename(cur_path)
                cur_dir = os.path.abspath(os.path.dirname(cur_path))
                cur_dir = cur_dir.split('var_final_NN/')[1]
                new_dir = os.path.abspath(pred_out_dir1 + '/' + cur_dir)
                new_path = os.path.abspath(new_dir + '/' + basename)
                if os.path.isdir(new_dir) == False:
                    os.makedirs(new_dir)

                depth_write(new_path, pred_im)

        depth_loss, photometric_loss, smooth_loss, mask = 0, 0, 0, None
        if mode == 'train':
            # Loss 1: the direct depth supervision from ground truth label
            # mask=1 indicates that a pixel does not ground truth labels
            if 'sparse' in args.train_mode:
                depth_loss = depth_criterion(pred, batch_data['d'])
                mask = (batch_data['d'] < 1e-3).float()
            elif 'dense' in args.train_mode:
                depth_loss = depth_criterion(pred, gt)
                mask = (gt < 1e-3).float()

            # Loss 2: the self-supervised photometric loss
            if args.use_pose:
                # create multi-scale pyramids
                pred_array = helper.multiscale(pred)
                rgb_curr_array = helper.multiscale(batch_data['rgb'])
                rgb_near_array = helper.multiscale(batch_data['rgb_near'])
                if mask is not None:
                    mask_array = helper.multiscale(mask)
                num_scales = len(pred_array)

                # compute photometric loss at multiple scales
                for scale in range(len(pred_array)):
                    pred_ = pred_array[scale]
                    rgb_curr_ = rgb_curr_array[scale]
                    rgb_near_ = rgb_near_array[scale]
                    mask_ = None
                    if mask is not None:
                        mask_ = mask_array[scale]

                    # compute the corresponding intrinsic parameters
                    height_, width_ = pred_.size(2), pred_.size(3)
                    intrinsics_ = kitti_intrinsics.scale(height_, width_)

                    # inverse warp from a nearby frame to the current frame
                    warped_ = homography_from(rgb_near_, pred_,
                                              batch_data['r_mat'],
                                              batch_data['t_vec'], intrinsics_)
                    photometric_loss += photometric_criterion(
                        rgb_curr_, warped_, mask_) * (2**(scale - num_scales))

            # Loss 3: the depth smoothness loss
            smooth_loss = smoothness_criterion(pred) if args.w2 > 0 else 0

            # backprop
            loss = depth_loss + args.w1 * photometric_loss + args.w2 * smooth_loss
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        gpu_time = time.time() - start

        # measure accuracy and record loss of each batch
        with torch.no_grad(
        ):  # impacts the autograd engine and deactivate it (will reduce memory usage and speed up computations)
            mini_batch_size = next(iter(batch_data.values())).size(0)
            result = Result()  # metrics
            if mode != 'test_prediction' and mode != 'test_completion':
                result.evaluate(pred.data, gt.data, photometric_loss)
            [
                m.update(result, gpu_time, data_time, mini_batch_size)
                for m in meters
            ]
            logger.conditional_print(mode, i, epoch, args.epochs, lr,
                                     len(loader), block_average_meter,
                                     average_meter)
            logger.conditional_save_img_comparison(mode, i, batch_data, pred,
                                                   epoch)
            logger.conditional_save_pred(mode, i, pred, epoch)
        del pred

    avg = logger.conditional_save_info(
        mode, average_meter,
        epoch)  # take the avg of all the batches, to get the epoch metrics
    is_best = logger.rank_conditional_save_best(mode, avg, epoch, args.epochs)
    if is_best and not (mode == "train"):
        logger.save_img_comparison_as_best(mode, epoch)
    logger.conditional_summarize(mode, avg, is_best)

    return avg, is_best
コード例 #17
0
def validate(val_loader, model, epoch, write_to_file=True):
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()
    for i, (input, target) in enumerate(val_loader):
        input, target = input.cuda(), target.cuda()
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        ##############################################################
        ##             Start of PnP-Depth modification              ##
        ##############################################################
        # Original inference
        with torch.no_grad():
            ori_pred = model.pnp_forward_front(model.pnp_forward_rear(
                input))  # equivalent to `ori_pred = model(input)`

        # Inference with PnP
        sparse_target = input[:, -1:]  # NOTE: written for rgbd input
        criterion = criteria.MaskedL1Loss().cuda(
        )  # NOTE: criterion function defined here only for clarity
        pnp_iters = 5  # number of iterations
        pnp_alpha = 0.01  # update/learning rate
        pnp_z = model.pnp_forward_front(input)
        for pnp_i in range(pnp_iters):
            if pnp_i != 0:
                pnp_z = pnp_z - pnp_alpha * torch.sign(pnp_z_grad)  # iFGM
            pnp_z = Variable(pnp_z, requires_grad=True)
            pred = model.pnp_forward_rear(pnp_z)
            if pnp_i < pnp_iters - 1:
                pnp_loss = criterion(pred, sparse_target)
                pnp_z_grad = Grad([pnp_loss], [pnp_z], create_graph=True)[0]
        ##############################################################
        ##              End of PnP-Depth modification               ##
        ##############################################################
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        # save 8 images for visualization
        skip = 50
        if args.modality == 'd':
            img_merge = None
        else:
            if args.modality == 'rgb':
                rgb = input
            elif args.modality == 'rgbd':
                rgb = input[:, :3, :, :]
                depth = input[:, 3:, :, :]

            if i == 0:
                if args.modality == 'rgbd':
                    img_merge = utils.merge_into_row_with_gt(
                        rgb, depth, target, pred)
                else:
                    img_merge = utils.merge_into_row(rgb, target, pred)
            elif (i < 8 * skip) and (i % skip == 0):
                if args.modality == 'rgbd':
                    row = utils.merge_into_row_with_gt(rgb, depth, target,
                                                       pred)
                else:
                    row = utils.merge_into_row(rgb, target, pred)
                img_merge = utils.add_row(img_merge, row)
            elif i == 8 * skip:
                filename = output_directory + '/comparison_' + str(
                    epoch) + '.png'
                utils.save_image(img_merge, filename)

        if (i + 1) % args.print_freq == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                      i + 1,
                      len(val_loader),
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))

    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })
    return avg, img_merge
コード例 #18
0
def iterate(mode, args, loader, model, optimizer, logger, epoch):
    block_average_meter = AverageMeter()
    average_meter = AverageMeter()
    meters = [block_average_meter, average_meter]

    # switch to appropriate mode
    assert mode in ["train", "val", "eval", "test_prediction", "test_completion"], \
        "unsupported mode: {}".format(mode)
    if mode == 'train':
        model.train()
        lr = helper.adjust_learning_rate(args.lr, optimizer, epoch)
    else:
        model.eval()
        lr = 0

    torch.set_printoptions(profile="full")
    table_is = np.zeros(400)
    for i, batch_data in enumerate(loader):

        sparse_depth_pathname = batch_data['d_path'][0]
        print(sparse_depth_pathname)
        del batch_data['d_path']
        print("i: ", i)
        start = time.time()
        batch_data = {
            key: val.to(device)
            for key, val in batch_data.items() if val is not None
        }
        gt = batch_data[
            'gt'] if mode != 'test_prediction' and mode != 'test_completion' else None

        # adjust depth for features
        depth_adjust = args.depth_adjust
        adjust_features = False

        if depth_adjust and args.use_d:
            if args.type_feature == "sq":
                if args.use_rgb:
                    depth_new, alg_mode, feat_mode, features, shape = depth_adjustment(
                        batch_data['d'], args.test_mode, args.feature_mode,
                        args.feature_num, args.rank_file_global_sq,
                        adjust_features, i, model_orig, args.seed,
                        batch_data['rgb'])
                else:
                    depth_new, alg_mode, feat_mode, features, shape = depth_adjustment(
                        batch_data['d'], args.test_mode, args.feature_mode,
                        args.feature_num, args.rank_file_global_sq,
                        adjust_features, i, model_orig, args.seed)
            elif args.type_feature == "lines":
                depth_new, alg_mode, feat_mode, features = depth_adjustment_lines(
                    batch_data['d'], args.test_mode, args.feature_mode,
                    args.feature_num, args.rank_file_global_sq, i, model_orig,
                    args.seed)

            batch_data['d'] = torch.Tensor(depth_new).unsqueeze(0).unsqueeze(
                1).to(device)
        data_time = time.time() - start
        start = time.time()
        if mode == "train":
            pred = model(batch_data)
        else:
            with torch.no_grad():
                pred = model(batch_data)
        # im = batch_data['d'].detach().cpu().numpy()
        # im_sq = im.squeeze()
        # plt.figure()
        # plt.imshow(im_sq)
        # plt.show()
        # for i in range(im_sq.shape[0]):
        #     print(f"{i} - {np.sum(im_sq[i])}")


#        pred = pred +0.155
#        gt = gt+0.155
# compute loss
        depth_loss, photometric_loss, smooth_loss, mask = 0, 0, 0, None
        if mode == 'train':
            # Loss 1: the direct depth supervision from ground truth label
            # mask=1 indicates that a pixel does not ground truth labels
            if 'sparse' in args.train_mode:
                depth_loss = depth_criterion(pred, batch_data['d'])
                mask = (batch_data['d'] < 1e-3).float()
            elif 'dense' in args.train_mode:
                depth_loss = depth_criterion(pred, gt)
                mask = (gt < 1e-3).float()
            # Loss 2: the self-supervised photometric loss
            if args.use_pose:
                # create multi-scale pyramids
                pred_array = helper.multiscale(pred)
                rgb_curr_array = helper.multiscale(batch_data['rgb'])
                rgb_near_array = helper.multiscale(batch_data['rgb_near'])
                if mask is not None:
                    mask_array = helper.multiscale(mask)
                num_scales = len(pred_array)
                # compute photometric loss at multiple scales
                for scale in range(len(pred_array)):
                    pred_ = pred_array[scale]
                    rgb_curr_ = rgb_curr_array[scale]
                    rgb_near_ = rgb_near_array[scale]
                    mask_ = None
                    if mask is not None:
                        mask_ = mask_array[scale]
                    # compute the corresponding intrinsic parameters
                    height_, width_ = pred_.size(2), pred_.size(3)
                    intrinsics_ = kitti_intrinsics.scale(height_, width_)
                    # inverse warp from a nearby frame to the current frame
                    warped_ = homography_from(rgb_near_, pred_,
                                              batch_data['r_mat'],
                                              batch_data['t_vec'], intrinsics_)
                    photometric_loss += photometric_criterion(
                        rgb_curr_, warped_, mask_) * (2**(scale - num_scales))
            # Loss 3: the depth smoothness loss
            smooth_loss = smoothness_criterion(pred) if args.w2 > 0 else 0

            # backprop
            loss = depth_loss + args.w1 * photometric_loss + args.w2 * smooth_loss
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        gpu_time = time.time() - start

        # measure accuracy and record loss
        with torch.no_grad():
            mini_batch_size = next(iter(batch_data.values())).size(0)
            result = Result()
            if mode != 'test_prediction' and mode != 'test_completion':
                result.evaluate(pred.data, gt.data, photometric_loss)
            [
                m.update(result, gpu_time, data_time, mini_batch_size)
                for m in meters
            ]
            print(f"rmse: {result.rmse:,}")
            if result.rmse < 6000:
                print("good rmse")
            elif result.rmse > 12000:
                print("bad rmse")
            logger.conditional_print(mode, i, epoch, lr, len(loader),
                                     block_average_meter, average_meter)
            logger.conditional_save_img_comparison(mode, i, batch_data, pred,
                                                   epoch)
            logger.conditional_save_pred(mode, i, pred, epoch)

        # save log and checkpoint
        every = 999 if mode == "val" else 200
        if i % every == 0 and i != 0:

            print(
                f"test settings (main_orig eval): {args.type_feature} {args.test_mode} {args.feature_mode} {args.feature_num}"
            )
            avg = logger.conditional_save_info(mode, average_meter, epoch)
            is_best = logger.rank_conditional_save_best(mode, avg, epoch)
            if is_best and not (mode == "train"):
                logger.save_img_comparison_as_best(mode, epoch)
            logger.conditional_summarize(mode, avg, is_best)

            if mode != "val":
                #if 1:
                helper.save_checkpoint({  # save checkpoint
                    'epoch': epoch,
                    'model': model.module.state_dict(),
                    'best_result': logger.best_result,
                    'optimizer': optimizer.state_dict(),
                    'args': args,
                }, is_best, epoch, logger.output_directory, args.type_feature, args.test_mode, args.feature_num, args.feature_mode, args.depth_adjust, i, every, "scratch")

        # draw features
        # run_info = [args.type_feature, alg_mode, feat_mode, model_orig]
        # if batch_data['rgb'] != None and 1 and (i % 1) == 0:
        #     draw("sq", batch_data['rgb'], batch_data['d'], features, shape[1], run_info, i, result)

    return avg, is_best
コード例 #19
0
ファイル: train.py プロジェクト: appliedinnovation/fast-depth
def train(params, train_loader, val_loader, model, criterion, optimizer,
          scheduler, experiment):
    phase_list = ["phase_1"]
    current_epoch = 1
    mean_val_loss = -1

    try:
        train_step = int(
            np.ceil(params["num_training_examples"] / params["batch_size"]) *
            params["start_epoch"])
        val_step = int(
            np.ceil(params["num_validation_examples"] / params["batch_size"] *
                    params["start_epoch"]))

        for epoch in range(params["num_epochs"] - params["start_epoch"]):
            current_epoch = params["start_epoch"] + epoch + 1

            epoch_loss = 0.0
            running_loss = 0.0
            average = AverageMeter()
            img_idxs = np.random.randint(0, len(train_loader), size=5)

            model.train()
            with experiment.train():
                for i, (inputs, target) in enumerate(train_loader):

                    # Send data to GPU
                    inputs, target = inputs.to(params["device"]), target.to(
                        params["device"])

                    # Zero the parameter gradients
                    optimizer.zero_grad()

                    prediction = model(inputs)

                    loss = criterion(prediction, target, phase_list=phase_list)

                    # Compute loss
                    loss.backward()
                    optimizer.step()

                    # Calculate metrics
                    result = Result()
                    result.evaluate(prediction.data, target.data)
                    average.update(result, 0, 0, inputs.size(0))
                    epoch_loss += loss.item()

                    # Log to Comet
                    utils.log_comet_metrics(experiment,
                                            result,
                                            loss.item(),
                                            step=train_step,
                                            epoch=current_epoch)
                    train_step += 1

                    # Log images to Comet
                    if i in img_idxs:
                        utils.log_image_to_comet(inputs[0], target[0],
                                                 prediction[0], current_epoch,
                                                 i, experiment, result,
                                                 "train", train_step)

                    # Print statistics
                    running_loss += loss.item()
                    if (i + 1) % params["stats_frequency"] == 0 and i != 0:
                        print('[%d, %5d] loss: %.3f' %
                              (current_epoch, i + 1,
                               running_loss / params["stats_frequency"]))
                        running_loss = 0.0

                # Log epoch metrics to Comet
                mean_train_loss = epoch_loss / len(train_loader)
                utils.log_comet_metrics(experiment,
                                        average.average(),
                                        mean_train_loss,
                                        prefix="epoch",
                                        step=train_step,
                                        epoch=current_epoch)

            # Validation each epoch
            epoch_loss = 0.0
            average = AverageMeter()
            with experiment.validate() and torch.no_grad():
                img_idxs = np.random.randint(0, len(val_loader), size=5)
                model.eval()
                for i, (inputs, target) in enumerate(val_loader):
                    inputs, target = inputs.to(params["device"]), target.to(
                        params["device"])

                    prediction = model(inputs)

                    loss = criterion(prediction, target, phase_list=phase_list)

                    # Calculate metrics
                    result = Result()
                    result.evaluate(prediction.data, target.data)
                    average.update(result, 0, 0, inputs.size(0))
                    epoch_loss += loss.item()

                    # Log to Comet
                    utils.log_comet_metrics(experiment,
                                            result,
                                            loss.item(),
                                            step=val_step,
                                            epoch=current_epoch)
                    val_step += 1

                    # Log images to Comet
                    if i in img_idxs:
                        utils.log_image_to_comet(inputs[0], target[0],
                                                 prediction[0], current_epoch,
                                                 i, experiment, result, "val",
                                                 val_step)

                # Log epoch metrics to Comet
                mean_val_loss = epoch_loss / len(val_loader)
                utils.log_comet_metrics(experiment,
                                        average.average(),
                                        mean_val_loss,
                                        prefix="epoch",
                                        step=val_step,
                                        epoch=current_epoch)
                print("Validation Loss [%d]: %.3f" %
                      (current_epoch, mean_val_loss))

            # Update training phase
            try:
                if current_epoch + 1 == params["loss"]["phase_2"]["start"]:
                    phase_list.append("phase_2")
                if current_epoch + 1 == params["loss"]["phase_3"]["start"]:
                    phase_list.append("phase_3")
            except KeyError:
                pass

            # Save periodically
            if (current_epoch + 1) % params["save_frequency"] == 0:
                save_path = utils.get_save_path(current_epoch,
                                                params["experiment_dir"])
                utils.save_model(model, optimizer, save_path, current_epoch,
                                 mean_val_loss, params["max_checkpoints"])
                experiment.log_model(save_path.split("/")[-1], save_path)
                print("Saving new checkpoint")

            experiment.log_epoch_end(current_epoch)
            scheduler.step()

        # Save the final model
        save_path = utils.get_save_path(params["num_epochs"],
                                        params["experiment_dir"])
        utils.save_model(model, optimizer, save_path, current_epoch,
                         mean_val_loss, params["max_checkpoints"])
        experiment.log_model(save_path.split("/")[-1], save_path)
        print("Model saved to ", os.path.abspath(save_path))

    except KeyboardInterrupt:
        print("Saving model and quitting...")
        save_path = utils.get_save_path(current_epoch,
                                        params["experiment_dir"])
        utils.save_model(model, optimizer, save_path, current_epoch,
                         mean_val_loss, params["max_checkpoints"])
        experiment.log_model(save_path.split("/")[-1], save_path)
        print("Model saved to ", os.path.abspath(save_path))
コード例 #20
0
ファイル: engine.py プロジェクト: lochenchou/DORN
def validation(device,
               data_loader,
               model,
               ord_loss,
               output_dir,
               epoch,
               logger,
               PRINT_FREQ,
               BETA,
               GAMMA,
               ORD_NUM=80.0):
    avg80 = AverageMeter()
    avg50 = AverageMeter()
    model.eval()

    end = time.time()
    skip = 1
    img_list = []

    evalbar = tqdm(total=len(data_loader))

    for i, (_input, _sparse_depth, _dense_depth) in enumerate(data_loader):
        _input, _sparse_depth, _dense_depth = _input.to(
            device), _sparse_depth.to(device), _dense_depth.to(device)
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            _pred_prob, _pred_label = model(_input)
            loss = ord_loss(_pred_prob, _dense_depth)

        torch.cuda.synchronize()
        gpu_time = time.time() - end

        pred_depth = utils.label2depth_sid(_pred_label,
                                           K=ORD_NUM,
                                           alpha=1.0,
                                           beta=BETA,
                                           gamma=GAMMA)

        abs_rel, sq_rel, rmse, rmse_log, a1, a2, a3 = compute_errors(
            _sparse_depth, pred_depth.to(device))

        # measure accuracy and record loss
        result80 = Result()
        result80.evaluate(pred_depth, _sparse_depth.data, cap=80)
        result50 = Result()
        result50.evaluate(pred_depth, _sparse_depth.data, cap=50)

        avg80.update(result80, gpu_time, data_time, _input.size(0))
        avg50.update(result50, gpu_time, data_time, _input.size(0))
        end = time.time()

        # save images for visualization
        if i == 0:
            img_merge = utils.merge_into_row(_input, _dense_depth, pred_depth)
        elif (i < 8 * skip) and (i % skip == 0):
            row = utils.merge_into_row(_input, _dense_depth, pred_depth)
            img_merge = utils.add_row(img_merge, row)
        elif i == 8 * skip:
            filename = os.path.join(output_dir,
                                    'eval_{}.png'.format(int(epoch)))
            print('save validation figures at {}'.format(filename))
            utils.save_image(img_merge, filename)

        if (i + 1) % PRINT_FREQ == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'AbsRel={result.absrel:.2f}({average.absrel:.2f}) '
                  'SqRel={result.sqrel:.2f}({average.sqrel:.2f}) '
                  'Log10={result.lg10:.3f}({average.lg10:.3f}) '
                  'RMSE_log={result.rmse_log:.3f}({average.rmse_log:.3f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'Delta2={result.delta2:.3f}({average.delta2:.3f}) '
                  'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format(
                      i + 1,
                      len(val_loader),
                      gpu_time=gpu_time,
                      result=result80,
                      average=avg80.average()))

        # update progress bar and show loss
        evalbar.set_postfix(
            ORD_LOSS=
            '{:.2f},RMSE/log= {:.2f}/{:.2f},delta={:.2f}/{:.2f}/{:.2f},AbsRel/SqRe;={:.2f}/{:.2f}'
            .format(loss, rmse, rmse_log, a1, a2, a3, abs_rel, sq_rel))
        evalbar.update(1)
        i = i + 1

    print('\n**** CAP=80 ****\n'
          'RMSE={average.rmse:.3f}\n'
          'RMSE_log={average.rmse_log:.3f}\n'
          'AbsRel={average.absrel:.3f}\n'
          'SqRel={average.sqrel:.3f}\n'
          'Log10={average.lg10:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'Delta2={average.delta2:.3f}\n'
          'Delta3={average.delta3:.3f}\n'
          'iRMSE={average.irmse:.3f}\n'
          'iMAE={average.imae:.3f}\n'
          't_GPU={average.gpu_time:.3f}\n'.format(average=avg80.average()))

    print('\n**** CAP=50 ****\n'
          'RMSE={average.rmse:.3f}\n'
          'RMSE_log={average.rmse_log:.3f}\n'
          'AbsRel={average.absrel:.3f}\n'
          'SqRel={average.sqrel:.3f}\n'
          'Log10={average.lg10:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'Delta2={average.delta2:.3f}\n'
          'Delta3={average.delta3:.3f}\n'
          'iRMSE={average.irmse:.3f}\n'
          'iMAE={average.imae:.3f}\n'
          't_GPU={average.gpu_time:.3f}\n'.format(average=avg50.average()))

    logger.add_scalar('VAL_CAP80/RMSE', avg80.average().rmse, epoch)
    logger.add_scalar('VAL_CAP80/RMSE_log', avg80.average().rmse_log, epoch)
    logger.add_scalar('VAL_CAP80/AbsRel', avg80.average().absrel, epoch)
    logger.add_scalar('VAL_CAP80/SqRel', avg80.average().sqrel, epoch)
    logger.add_scalar('VAL_CAP80/Delta1', avg80.average().delta1, epoch)
    logger.add_scalar('VAL_CAP80/Delta2', avg80.average().delta2, epoch)
    logger.add_scalar('VAL_CAP80/Delta3', avg80.average().delta3, epoch)

    logger.add_scalar('VAL_CAP50/RMSE', avg50.average().rmse, epoch)
    logger.add_scalar('VAL_CAP50/RMSE_log', avg50.average().rmse_log, epoch)
    logger.add_scalar('VAL_CAP50/AbsRel', avg50.average().absrel, epoch)
    logger.add_scalar('VAL_CAP50/SqRel', avg50.average().sqrel, epoch)
    logger.add_scalar('VAL_CAP50/Delta1', avg50.average().delta1, epoch)
    logger.add_scalar('VAL_CAP50/Delta2', avg50.average().delta2, epoch)
    logger.add_scalar('VAL_CAP50/Delta3', avg50.average().delta3, epoch)
コード例 #21
0
ファイル: engine.py プロジェクト: lochenchou/DORN
def train_one_epoch(device,
                    train_loader,
                    model,
                    output_dir,
                    ord_loss,
                    optimizer,
                    epoch,
                    logger,
                    PRINT_FREQ,
                    BETA,
                    GAMMA,
                    ORD_NUM=80.0):

    avg80 = AverageMeter()

    model.train()  # switch to train mode

    iter_per_epoch = len(train_loader)
    trainbar = tqdm(total=iter_per_epoch)
    end = time.time()

    for i, (_input, _sparse_depth, _dense_depth) in enumerate(train_loader):
        _input, _sparse_depth, _dense_depth = _input.to(
            device), _sparse_depth.to(device), _dense_depth.to(device)
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()

        with torch.autograd.detect_anomaly():
            _pred_prob, _pred_label = model(_input)
            loss = ord_loss(
                _pred_prob,
                _dense_depth)  # calculate ord loss with dense_depth
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        torch.cuda.synchronize()
        gpu_time = time.time() - end

        pred_depth = utils.label2depth_sid(_pred_label,
                                           K=ORD_NUM,
                                           alpha=1.0,
                                           beta=BETA,
                                           gamma=GAMMA)
        # calculate metrices with ground truth sparse depth
        abs_rel, sq_rel, rmse, rmse_log, a1, a2, a3 = compute_errors(
            _sparse_depth, pred_depth.to(device))

        result80 = Result()
        result80.evaluate(pred_depth, _sparse_depth.data, cap=80)
        avg80.update(result80, gpu_time, data_time, _input.size(0))
        end = time.time()

        # update progress bar and show loss
        trainbar.set_postfix(
            ORD_LOSS=
            '{:.2f},RMSE/log= {:.2f}/{:.2f},delta={:.2f}/{:.2f}/{:.2f},AbsRel/SqRe;={:.2f}/{:.2f}'
            .format(loss, rmse, rmse_log, a1, a2, a3, abs_rel, sq_rel))
        trainbar.update(1)

        if (i + 1) % PRINT_FREQ == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'AbsRel={result.absrel:.2f}({average.absrel:.2f}) '
                  'SqRel={result.sqrel:.2f}({average.sqrel:.2f}) '
                  'Log10={result.lg10:.3f}({average.lg10:.3f}) '
                  'RMSE_log={result.rmse_log:.3f}({average.rmse_log:.3f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'Delta2={result.delta2:.3f}({average.delta2:.3f}) '
                  'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format(
                      i + 1,
                      len(train_loader),
                      gpu_time=gpu_time,
                      result=result80,
                      average=avg80.average()))

            current_step = int(epoch * iter_per_epoch + i + 1)

            img_merge = utils.batch_merge_into_row(_input, _dense_depth.data,
                                                   pred_depth)
            filename = os.path.join(output_dir,
                                    'step_{}.png'.format(current_step))
            utils.save_image(img_merge, filename)

            logger.add_scalar('TRAIN/RMSE', avg80.average().rmse, current_step)
            logger.add_scalar('TRAIN/RMSE_log',
                              avg80.average().rmse_log, current_step)
            logger.add_scalar('TRAIN/AbsRel',
                              avg80.average().absrel, current_step)
            logger.add_scalar('TRAIN/SqRel',
                              avg80.average().sqrel, current_step)
            logger.add_scalar('TRAIN/Delta1',
                              avg80.average().delta1, current_step)
            logger.add_scalar('TRAIN/Delta2',
                              avg80.average().delta2, current_step)
            logger.add_scalar('TRAIN/Delta3',
                              avg80.average().delta3, current_step)

            # reset average meter
            result80 = Result()
            avg80 = AverageMeter()
コード例 #22
0
def depth_estimate(model, rgb_frame, depth, save=False,
                   switch=False):
    to_tensor = transforms.ToTensor()
    cmap_depth = plt.cm.viridis
    cmap_error = plt.cm.inferno

    rgb_np, depth_np = image_transform(rgb_frame, depth)

    ##creat sparse depth
    mask_keep = sampler(depth_np, args.sample_spacing)
    sample_number = np.count_nonzero(
        mask_keep.astype('int'))
    if args.modality == 'rgb':
        sample_number = 0
    if switch:
        print('Total samples = ' + str(sample_number))
    sparse_depth = np.zeros(depth_np.shape)
    sparse_depth[mask_keep] = depth_np[mask_keep]
    sparse_depth_np = sparse_depth

    ##choose input
    if args.modality == 'rgb':
        input_np = rgb_np
    elif args.modality == 'rgbd':
        rgbd = np.append(rgb_np,
                         np.expand_dims(sparse_depth_np,
                                        axis=2), axis=2)
        input_np = np.asfarray(rgbd, dtype='float')
    elif args.modality == 'd':
        input_np = sparse_depth_np

    input_tensor = to_tensor(input_np)

    while input_tensor.dim() < 4:
        input_tensor = input_tensor.unsqueeze(0)

    input_tensor = input_tensor.cuda()
    torch.cuda.synchronize()

    ##get prediction
    end = time.time()
    with torch.no_grad():
        pred = model(input_tensor)
    torch.cuda.synchronize()
    gpu_time = time.time() - end

    ##get result
    target_tensor = to_tensor(depth_np)
    while target_tensor.dim() < 4:
        target_tensor = target_tensor.unsqueeze(0)
    target_tensor = target_tensor.cuda()
    torch.cuda.synchronize()
    result = Result()
    result.evaluate(pred.data, target_tensor.data)

    pred_depth = np.squeeze(pred.data.cpu().numpy())

    ##convert depth to colour map
    d_min = min(np.min(pred_depth), np.min(depth_np))
    d_max = max(np.max(pred_depth), np.max(depth_np))
    # # d_min = float(0.5)
    # # d_max = float(6)

    pred_depth_rgb_map = color_map(pred_depth, d_min, d_max,
                                   cmap_depth)
    input_depth_color_map = color_map(depth_np, d_min,
                                      d_max, cmap_depth)
    sparse_depth_color_map = color_map(sparse_depth, d_min,
                                       d_max, cmap_depth)

    ##get error map
    mask = depth_np <= 0
    combined_map = depth_np
    combined_map[mask] = pred_depth[mask]
    abs_error_map = np.absolute(combined_map - pred_depth)
    # error_min = min(np.min(combined_map), np.min(
    # pred_depth))
    # error_max = max(np.max(combined_map), np.max(
    # pred_depth))
    error_min = np.min(abs_error_map)
    error_max = np.max(abs_error_map)
    error_map_color = color_map(abs_error_map, error_min,
                                error_max, cmap_error)

    ##show images
    rgb_image = rgb_np * 255
    merged_image = np.hstack([rgb_image, pred_depth_rgb_map,
                              input_depth_color_map,
                              sparse_depth_color_map,
                              error_map_color])

    ##save image
    if args.write and save:
        images_save(sample_number, pred_depth_rgb_map,
                    sparse_depth_color_map, error_map_color,
                    rgb_image, input_depth_color_map,
                    result)

    return merged_image, result.rmse
コード例 #23
0
ファイル: main.py プロジェクト: sunnyyehuda/FastDepth
def validate(val_loader, model, epoch, write_to_file=True):
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()
    eval_file = output_directory + '/evaluation.csv'
    f = open(eval_file, "w+")
    f.write("Max_Error,Depth,RMSE,GPU_TIME,Number_Of_Frame\r\n")
    for i, (input, target) in enumerate(val_loader):
        input, target = input.cuda(), target.cuda()
        # torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            pred = model(input)
        # torch.cuda.synchronize()
        gpu_time = time.time() - end

        abs_err = (target.data - pred.data).abs().cpu()
        max_err_ind = np.unravel_index(np.argmax(abs_err, axis=None),
                                       abs_err.shape)

        max_err_depth = target.data[max_err_ind]
        max_err = abs_err[max_err_ind]

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        f.write(
            f'{max_err},{max_err_depth},{result.rmse:.2f},{gpu_time},{i+1}\r\n'
        )
        # save 8 images for visualization
        skip = 50

        if args.modality == 'rgb':
            rgb = input

        if i == 0:
            img_merge = utils.merge_into_row_with_gt(rgb, target, pred,
                                                     (target - pred).abs())
        elif (i < 8 * skip) and (i % skip == 0):
            row = utils.merge_into_row_with_gt(rgb, target, pred,
                                               (target - pred).abs())
            img_merge = utils.add_row(img_merge, row)
        elif i == 8 * skip:
            filename = output_directory + '/comparison_' + str(epoch) + '.png'
            utils.save_image(img_merge, filename)

        if (i + 1) % args.print_freq == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                      i + 1,
                      len(val_loader),
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))
    f.close()
    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })
    return avg, img_merge
コード例 #24
0
def demo(val_loader, model, epoch, write_to_file=True):
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    end = time.time()

    #viz.line([[0.,0.]],[0],win='demo2',opts=dict(title='resluts2',legend=['RMSE','MAE']))
    viz.line([[0., 0., 0., 0., 0., 0.]], [0],
             win='demo1',
             opts=dict(
                 title='resluts1',
                 legend=['t_GPU', 'Delta1', 'REL', 'lG10', 'RMSE', 'MAE']))

    for i, (input, target) in enumerate(val_loader):
        input, target = input.cuda(), target.cuda()
        # torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            pred = model(input)
        # torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        # step 50 images for visualization
        skip = 10

        if args.modality == 'rgb':
            rgb = input

        img_merge = utils.merge_into_row(rgb, target, pred)
        #row = utils.merge_into_row(rgb, target, pred)
        #img_merge = utils.add_row(img_merge, row)
        #filename = output_directory + '/comparison_' + str(epoch) + '.png'
        #utils.save_image(img_merge, filename)
        #print(img_merge)
        if i % skip == 0:
            img = np.transpose(img_merge, (2, 0, 1))
            img = torch.from_numpy(img)
            viz.images(img, win='depth_estimation')

            t_GPU = float('{gpu_time:.3f}'.format(gpu_time=gpu_time))
            RMSE = float('{result.rmse:.2f}'.format(result=result))
            MAE = float('{result.mae:.2f}'.format(result=result))
            Delta1 = float('{result.delta1:.3f}'.format(result=result))
            REL = float('{result.absrel:.3f}'.format(result=result))
            Lg10 = float('{result.lg10:.3f}'.format(result=result))

            #print(t_GPU)
            #viz.line([[RMSE,MAE]],[i],win='demo2',update='append')
            viz.line([[t_GPU, Delta1, REL, Lg10, RMSE, MAE]], [i],
                     win='demo1',
                     update='append')
            time.sleep(0.2)

    avg = average_meter.average()

    viz.text('\n*\n'
             'RMSE={result.rmse:.2f}({average.rmse:.3f})\n\t'
             'MAE={result.mae:.2f}({average.mae:.3f})\n\t'
             'Delta1={result.delta1:.3f}({average.delta1:.3f})\n\t'
             'REL={result.absrel:.3f}({average.absrel:.3f})\n\t'
             'Lg10={result.lg10:.3f}({average.lg10:.3f})\n\t'
             't_GPU={gpu_time:.3f}{time:.3f}\n'.format(gpu_time=gpu_time,
                                                       average=avg,
                                                       time=avg.gpu_time,
                                                       result=result))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })
    return avg, img_merge
コード例 #25
0
def iterate(mode, args, loader, model, optimizer, logger, epoch):
    block_average_meter = AverageMeter()
    average_meter = AverageMeter()
    meters = [block_average_meter, average_meter]

    # switch to appropriate mode
    assert mode in ["train", "val", "eval", "test_prediction", "test_completion"], \
        "unsupported mode: {}".format(mode)
    if mode == 'train':
        model.train()
        lr = helper.adjust_learning_rate(args.lr, optimizer, epoch)
    else:
        model.eval()
        lr = 0

    for i, batch_data in enumerate(loader):
        print("The batch data keys are {}".format(batch_data.keys()))

        start = time.time()
        batch_data = {
            key: val.to(device)
            for key, val in batch_data.items() if val is not None
        }
        gt = batch_data[
            'gt'] if mode != 'test_prediction' and mode != 'test_completion' else None
        data_time = time.time() - start

        start = time.time()

        temp_d = batch_data['d']
        temp_gt = batch_data['gt']
        temp_g = batch_data['g']

        print("The depth min:{}, max:{}, shape:{}, dtype:{}".format(
            torch.min(temp_d), torch.max(temp_d), temp_d.shape, temp_d.dtype))
        print("The groundtruth min:{}, max:{}, shape:{}, dtype:{}".format(
            torch.min(temp_gt), torch.max(temp_gt), temp_gt.shape,
            temp_gt.dtype))
        print("The greyscale min:{}, max:{}, shape:{}, dtype:{}".format(
            torch.min(temp_g), torch.max(temp_g), temp_g.shape, temp_g.dtype))

        pred = model(batch_data)

        temp_out = pred.detach().cpu()
        print("The output min:{}, max:{}, shape:{}, dtype:{}".format(
            torch.min(temp_out), torch.max(temp_out), temp_out.shape,
            temp_out.dtype))

        depth_loss, photometric_loss, smooth_loss, mask = 0, 0, 0, None
        if mode == 'train':
            # Loss 1: the direct depth supervision from ground truth label
            # mask=1 indicates that a pixel does not ground truth labels
            if 'sparse' in args.train_mode:
                depth_loss = depth_criterion(pred, batch_data['d'])
                mask = (batch_data['d'] < 1e-3).float()
            elif 'dense' in args.train_mode:
                depth_loss = depth_criterion(pred, gt)
                mask = (gt < 1e-3).float()

            # Loss 2: the self-supervised photometric loss
            if args.use_pose:
                # create multi-scale pyramids
                pred_array = helper.multiscale(pred)
                rgb_curr_array = helper.multiscale(batch_data['rgb'])
                rgb_near_array = helper.multiscale(batch_data['rgb_near'])
                if mask is not None:
                    mask_array = helper.multiscale(mask)
                num_scales = len(pred_array)

                # compute photometric loss at multiple scales
                for scale in range(len(pred_array)):
                    pred_ = pred_array[scale]
                    rgb_curr_ = rgb_curr_array[scale]
                    rgb_near_ = rgb_near_array[scale]
                    mask_ = None
                    if mask is not None:
                        mask_ = mask_array[scale]

                    # compute the corresponding intrinsic parameters
                    height_, width_ = pred_.size(2), pred_.size(3)
                    intrinsics_ = kitti_intrinsics.scale(height_, width_)

                    # inverse warp from a nearby frame to the current frame
                    warped_ = homography_from(rgb_near_, pred_,
                                              batch_data['r_mat'],
                                              batch_data['t_vec'], intrinsics_)
                    photometric_loss += photometric_criterion(
                        rgb_curr_, warped_, mask_) * (2**(scale - num_scales))

            # Loss 3: the depth smoothness loss
            smooth_loss = smoothness_criterion(pred) if args.w2 > 0 else 0

            # backprop
            loss = depth_loss + args.w1 * photometric_loss + args.w2 * smooth_loss
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        gpu_time = time.time() - start

        # measure accuracy and record loss
        with torch.no_grad():
            mini_batch_size = next(iter(batch_data.values())).size(0)
            result = Result()
            if mode != 'test_prediction' and mode != 'test_completion':
                result.evaluate(pred.data, gt.data, photometric_loss)
            [
                m.update(result, gpu_time, data_time, mini_batch_size)
                for m in meters
            ]
            logger.conditional_print(mode, i, epoch, lr, len(loader),
                                     block_average_meter, average_meter)
            logger.conditional_save_img_comparison(mode, i, batch_data, pred,
                                                   epoch)
            logger.conditional_save_pred(mode, i, pred, epoch)

    avg = logger.conditional_save_info(mode, average_meter, epoch)
    is_best = logger.rank_conditional_save_best(mode, avg, epoch)
    if is_best and not (mode == "train"):
        logger.save_img_comparison_as_best(mode, epoch)
    logger.conditional_summarize(mode, avg, is_best)

    return avg, is_best
コード例 #26
0
def train(train_loader, model, criterion,smoothloss,photometric_loss,optimizer, epoch):
    average_meter = AverageMeter()
    model.train() # switch to train mode
    end = time.time()
    iheight, iwidth = 480, 640 # raw image size
    fx_rgb = 5.1885790117450188e+02;
    fy_rgb = 5.1946961112127485e+02;
    cx_rgb = 3.2558244941119034e+02;
    cy_rgb = 2.5373616633400465e+02;
    new_intrinsics = Intrinsics(304,228,fx_rgb*(250.0/iheight),fy_rgb*(250.0/iheight),155.1, 121.0).cuda()
    for i, (batch_data, intrinsics) in enumerate(train_loader):
        #input, target = input.cuda(), target.cuda()
        batch_data = {key:val.cuda() for key,val in batch_data.items() if val is not None}
        oheight, owidth = intrinsics["output_size"]
        #new_intrinsics = Intrinsics(owidth,oheight,intrinsics["fx"],intrinsics["fy"],intrinsics["cx"],intrinsics["cy"]).cuda()
        target = batch_data['gt']
        torch.cuda.synchronize()
        data_time = time.time() - end

        # compute pred
        end = time.time()
        #pred = model(input[:,3:,:,:],input[:,:3,:,:]) # (depth,image)
        #candidates = {"rgb":input[:,:3,:,:], "d":input[:,3:,:,:], "gt":input[:,3:,:,:]}
        #batch_data = {key:val.cuda() for key,val in candidates.items() if val is not None}
        pred = model(batch_data) # (depth,image)
        #loss = criterion(pred, input[:,3:,:,:]) + 0.01*smoothloss(pred)
        photoloss = 0.0
        if args.use_pose:
            # warp near frame to current frame
            #hh, ww = pred.size(2), pred.size(3)
            #new_intrinsics = new_intrinsics.scale(hh,ww)
            mask = (batch_data['d'] < 1e-3).float()
            pred_array = multiscale(pred)
            rgb_curr_array = multiscale(batch_data['rgb'])
            rgb_near_array = multiscale(batch_data['rgb_near'])
            mask_array = multiscale(mask)
            num_scales = len(pred_array)
            # compute photometric loss at multiple scales
            for scale in range(len(pred_array)):
                pred_ = pred_array[scale]
                rgb_curr_ = rgb_curr_array[scale]
                rgb_near_ = rgb_near_array[scale]
                mask_ = None
                if mask is not None:
                    mask_ = mask_array[scale]

                # compute the corresponding intrinsic parameters
                height_, width_ = pred_.size(2), pred_.size(3)
                intrinsics_ = new_intrinsics.scale(height_, width_)
                warped_ = homography_from(rgb_near_,pred_,batch_data["r_mat"],batch_data["t_vec"],intrinsics_)
                #warped = homography_from(batch_data["rgb_near"],pred,batch_data["r_mat"],batch_data["t_vec"],new_intrinsics)
                #photoloss = photometric_loss(batch_data["rgb"],warped,mask)
                photoloss += photometric_loss(rgb_curr_,warped_,mask_)*(2**(scale-num_scales))
        loss = criterion(pred, target) + 0.01*smoothloss(pred) + 0.1*photoloss
        optimizer.zero_grad()
        loss.backward() # compute gradient and do SGD step
        optimizer.step()
        torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, batch_data['rgb'].size(0))
        end = time.time()

        if (i + 1) % args.print_freq == 0:
            print('=> output: {}'.format(output_directory))
            print('Train Epoch: {0} [{1}/{2}]\t'
                  'LOSS={loss:.3f} '
                  't_Data={data_time:.3f}({average.data_time:.3f}) '
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f}) '
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                  epoch, i+1, len(train_loader),loss=loss.item(), data_time=data_time,
                  gpu_time=gpu_time, result=result, average=average_meter.average()))

    avg = average_meter.average()
    with open(train_csv, 'a') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow({'mse': avg.mse, 'rmse': avg.rmse, 'absrel': avg.absrel, 'lg10': avg.lg10,
            'mae': avg.mae, 'delta1': avg.delta1, 'delta2': avg.delta2, 'delta3': avg.delta3,
            'gpu_time': avg.gpu_time, 'data_time': avg.data_time})
コード例 #27
0
def iterate(mode, args, loader, model, optimizer, logger, epoch):
    block_average_meter = AverageMeter()
    average_meter = AverageMeter()
    meters = [block_average_meter, average_meter]

    # switch to appropriate mode
    assert mode in ["train", "val", "eval", "test_prediction", "test_completion"], \
        "unsupported mode: {}".format(mode)
    if mode == 'train':
        model.train()
        lr = helper.adjust_learning_rate(args.lr, optimizer, epoch)
    else:
        model.eval()
        lr = 0

    torch.set_printoptions(profile="full")
    for i, batch_data in enumerate(loader):

        name = batch_data['name'][0]
        print(name)
        del batch_data['name']
        print("i: ", i)
        # each batch data is 1 and has three keys d, gt, g and dim [1, 352, 1216]
        start = time.time()
        batch_data = {
            key: val.to(device)
            for key, val in batch_data.items() if val is not None
        }
        gt = batch_data[
            'gt'] if mode != 'test_prediction' and mode != 'test_completion' else None

        # if args.type_feature=="sq":
        #     depth_adjustment(gt, False)

        data_time = time.time() - start

        start = time.time()
        if mode == "train":
            pred = model(batch_data)
        else:
            with torch.no_grad():
                pred = model(batch_data)

        vis=False
        if vis:
            im = batch_data['gt'].detach().cpu().numpy()
            im_sq = im.squeeze()
            plt.figure()
            plt.imshow(im_sq)
            plt.show()
            # for i in range(im_sq.shape[0]):
            #     print(f"{i} - {np.sum(im_sq[i])}")

        depth_loss, photometric_loss, smooth_loss, mask = 0, 0, 0, None
        if mode == 'train':
            # Loss 1: the direct depth supervision from ground truth label
            # mask=1 indicates that a pixel does not ground truth labels
            if 'sparse' in args.train_mode:
                depth_loss = depth_criterion(pred, batch_data['d'])
                print("d pts: ", len(torch.where(batch_data['d']>0)[0]))
                mask = (batch_data['d'] < 1e-3).float()
            elif 'dense' in args.train_mode:
                depth_loss = depth_criterion(pred, gt)
                mask = (gt < 1e-3).float()

            # Loss 2: the self-supervised photometric loss
            if args.use_pose:
                # create multi-scale pyramids
                pred_array = helper.multiscale(pred)
                rgb_curr_array = helper.multiscale(batch_data['rgb'])
                rgb_near_array = helper.multiscale(batch_data['rgb_near'])
                if mask is not None:
                    mask_array = helper.multiscale(mask)
                num_scales = len(pred_array)

                # compute photometric loss at multiple scales
                for scale in range(len(pred_array)):
                    pred_ = pred_array[scale]
                    rgb_curr_ = rgb_curr_array[scale]
                    rgb_near_ = rgb_near_array[scale]
                    mask_ = None
                    if mask is not None:
                        mask_ = mask_array[scale]

                    # compute the corresponding intrinsic parameters
                    height_, width_ = pred_.size(2), pred_.size(3)
                    intrinsics_ = kitti_intrinsics.scale(height_, width_)

                    # inverse warp from a nearby frame to the current frame
                    warped_ = homography_from(rgb_near_, pred_,
                                              batch_data['r_mat'],
                                              batch_data['t_vec'], intrinsics_)
                    photometric_loss += photometric_criterion(
                        rgb_curr_, warped_, mask_) * (2**(scale - num_scales))

            # Loss 3: the depth smoothness loss
            smooth_loss = smoothness_criterion(pred) if args.w2 > 0 else 0

            # backprop



            loss = depth_loss + args.w1 * photometric_loss + args.w2 * smooth_loss
            optimizer.zero_grad()
            loss.backward()
            zero_params(model)
            optimizer.step()



        gpu_time = time.time() - start

        # counting pixels in each bin
        #binned_pixels = np.load("value.npy", allow_pickle=True)
        #print(len(binned_pixels))

        if (i % 1 == 0 and args.evaluate and args.instancewise) or\
                (i % args.every == 0 and not args.evaluate and not args.instancewise): # global training
            #    print(model.module.conv4[5].conv1.weight[0])
            # print(model.conv4.5.bn2.weight)
            # print(model.module.parameter.grad)
            #print("*************swiches:")
            torch.set_printoptions(precision=7, sci_mode=False)

            if model.module.phi is not None:
                mmp = 1000 * model.module.phi
                phi = F.softplus(mmp)

                S = phi / torch.sum(phi)
                #print("S", S[1, -10:])
                S_numpy= S.detach().cpu().numpy()

            if args.instancewise:

                global Ss
                if "Ss" not in globals():
                    Ss = []
                    Ss.append(S_numpy)
                else:
                    Ss.append(S_numpy)

            # GLOBAL
            if (i % args.every ==0  and not args.evaluate and not args.instancewise and model.module.phi is not None):

                np.set_printoptions(precision=4)

                switches_2d_argsort = np.argsort(S_numpy, None) # 2d to 1d sort torch.Size([9, 31])
                switches_2d_sort = np.sort(S_numpy, None)
                print("Switches: ")
                print(switches_2d_argsort[:10])
                print(switches_2d_sort[:10])
                print("and")
                print(switches_2d_argsort[-10:])
                print(switches_2d_sort[-10:])

                ##### saving global ranks
                global_ranks_path = lambda \
                    ii: f"ranks/{args.type_feature}/global/{folder_and_name[0]}/Ss_val_{folder_and_name[1]}_iter_{ii}.npy"
                global old_i
                if ("old_i" in globals()):
                    print("old_i")
                    if os.path.isfile(global_ranks_path(old_i)):
                        os.remove(global_ranks_path(old_i))

                folder_and_name = args.resume.split(os.sep)[-2:]
                os.makedirs(f"ranks/{args.type_feature}/global/{folder_and_name[0]}", exist_ok=True)
                np.save(global_ranks_path(i), S_numpy)
                old_i = i
                print("saving ranks")

                if args.type_feature == "sq":

                    hor = switches_2d_argsort % S_numpy.shape[1]
                    ver = np.floor(switches_2d_argsort // S_numpy.shape[1])
                    print(ver[:10],hor[:10])
                    print("and")
                    print(ver[-10:], hor[-10:])


        # measure accuracy and record loss
        with torch.no_grad():
            mini_batch_size = next(iter(batch_data.values())).size(0)
            result = Result()
            if mode != 'test_prediction' and mode != 'test_completion':
                result.evaluate(pred.data, gt.data, photometric_loss)
            [
                m.update(result, gpu_time, data_time, mini_batch_size)
                for m in meters
            ]
            logger.conditional_print(mode, i, epoch, lr, len(loader),
                                     block_average_meter, average_meter)
            logger.conditional_save_img_comparison(mode, i, batch_data, pred,
                                                   epoch)
            logger.conditional_save_pred(mode, i, pred, epoch)

        draw=False
        if draw:
            ma = batch_data['rgb'].detach().cpu().numpy().squeeze()
            ma  = np.transpose(ma, axes=[1, 2, 0])
           # ma = np.uint8(ma)
            #ma2 = Image.fromarray(ma)
            ma2 = Image.fromarray(np.uint8(ma)).convert('RGB')
            # create rectangle image
            img1 = ImageDraw.Draw(ma2)

            if args.type_feature == "sq":
                size=40
                print_square_num = 20
                for ii in range(print_square_num):
                    s_hor=hor[-ii].detach().cpu().numpy()
                    s_ver=ver[-ii].detach().cpu().numpy()
                    shape = [(s_hor * size, s_ver * size), ((s_hor + 1) * size, (s_ver + 1) * size)]
                    img1.rectangle(shape, outline="red")

                    tim = time.time()
                    lala = ma2.save(f"switches_photos/squares/squares_{tim}.jpg")
                    print("saving")
            elif args.type_feature == "lines":
                print_square_num = 20
                r=1
                parameter_mask = np.load("../kitti_pixels_to_lines.npy", allow_pickle=True)

                # for m in range(10,50):
                #     im = Image.fromarray(parameter_mask[m]*155)
                #     im = im.convert('1')  # convert image to black and white
                #     im.save(f"switches_photos/lala_{m}.jpg")


                for ii in range(print_square_num):
                     points = parameter_mask[ii]
                     y = np.where(points==1)[0]
                     x = np.where(points == 1)[1]

                     for p in range(len(x)):
                         img1.ellipse((x[p] - r, y[p] - r, x[p] + r, y[p] + r), fill=(255, 0, 0, 0))

                tim = time.time()
                lala = ma2.save(f"switches_photos/lines/lines_{tim}.jpg")
                print("saving")

        every = args.every
        if i % every ==0:

            print("saving")
            avg = logger.conditional_save_info(mode, average_meter, epoch)
            is_best = logger.rank_conditional_save_best(mode, avg, epoch)
            #is_best = True #saving all the checkpoints
            if is_best and not (mode == "train"):
                logger.save_img_comparison_as_best(mode, epoch)
            logger.conditional_summarize(mode, avg, is_best)

            if mode != "val":
                helper.save_checkpoint({  # save checkpoint
                    'epoch': epoch,
                    'model': model.module.state_dict(),
                    'best_result': logger.best_result,
                    'optimizer': optimizer.state_dict(),
                    'args': args,
                }, is_best, epoch, logger.output_directory, args.type_feature, i, every, qnet=True)

    if args.evaluate and args.instancewise:
        #filename = os.path.split(args.evaluate)[1]
        Ss_numpy = np.array(Ss)
        folder_and_name = args.evaluate.split(os.sep)[-3:]
        os.makedirs(f"ranks/instance/{folder_and_name[0]}", exist_ok=True)
        os.makedirs(f"ranks/instance/{folder_and_name[0]}/{folder_and_name[1]}", exist_ok=True)
        np.save(f"ranks/instance/{folder_and_name[0]}/{folder_and_name[1]}/Ss_val_{folder_and_name[2]}.npy", Ss)

    return avg, is_best
コード例 #28
0
def evaluate(val_loader, model, epoch, write_to_file=True):
    #print(model)
    average_meter = AverageMeter()
    model.eval()  # switch to evaluate mode
    for i, (input, target, mask, h5name) in enumerate(val_loader):
        input, target = input.cuda(), target.cuda()
        input_var = torch.autograd.Variable(input)
        target_var = torch.autograd.Variable(target)
        depth_pred = model(input_var)
        result = Result()
        output1 = torch.index_select(depth_pred.data, 1,
                                     torch.cuda.LongTensor([0]))
        result.evaluate(output1, target)
        average_meter.update(result, input.size(0))

        if args.modality == 'd':
            img_merge = None
        else:
            if args.modality == 'rgb':
                rgb = input
            elif args.modality == 'rgbd':
                rgb = input[:, :3, :, :]

                sparse_d = input[:, -1, :, :]
                sparse_depth_np = utils.depth_to_np(sparse_d)
                sd_filename = output_directory + '/' + str(
                    epoch) + '_' + '_' + h5name[0] + '_s_depth.png'
                utils.save_image(sparse_depth_np, sd_filename)

            rgb_np, depth_np, pred_np = utils.image_3_row(
                rgb, target, depth_pred)
            rgb_filename = output_directory + '/' + str(
                epoch) + '_' + '_' + h5name[0] + '_rgb.png'
            utils.save_image(rgb_np, rgb_filename)
            depth_filename = output_directory + '/' + str(
                epoch) + '_' + '_' + h5name[0] + '_depth.png'
            utils.save_image(depth_np, depth_filename)
            pred_filename = output_directory + '/' + str(
                epoch) + '_' + '_' + h5name[0] + '_pred.png'
            utils.save_image(pred_np, pred_filename)

    avg = average_meter.average()

    print('\n\nnew prediction with data:\n*\n'
          'RMSE={average.rmse:.5f}\n'
          'MAE={average.mae:.5f}\n'
          'Delta1={average.delta1:.5f}\n'
          'Delta2={average.delta2:.5f}\n'
          'Delta3={average.delta3:.5f}\n'
          'REL={average.absrel:.5f}\n'
          'Lg10={average.lg10:.5f}\n'.format(average=avg))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3
            })
コード例 #29
0
def validate(val_loader, model, epoch, write_to_file=True):
    average_meter = AverageMeter()

    # switch to evaluate mode
    model.eval()

    end = time.time()
    for i, (input, target) in enumerate(val_loader):
        input, target = input.cuda(), target.cuda()
        # torch.cuda.synchronize()
        data_time = time.time() - end

        # compute output
        end = time.time()
        with torch.no_grad():
            pred = model(input)
        # torch.cuda.synchronize()
        gpu_time = time.time() - end

        # measure accuracy and record loss
        result = Result()
        result.evaluate(pred.data, target.data)
        average_meter.update(result, gpu_time, data_time, input.size(0))
        end = time.time()

        # save 8 images for visualization
        skip = 50
        if args.modality == 'd':
            img_merge = None
        else:
            if args.modality == 'rgb':
                rgb = input
            elif args.modality == 'rgbd':
                rgb = input[:, :3, :, :]
                depth = input[:, 3:, :, :]

            if i == 0:
                if args.modality == 'rgbd':
                    img_merge = utils.merge_into_row_with_gt(
                        rgb, depth, target, pred)
                else:
                    img_merge = utils.merge_into_row(rgb, target, pred)
            elif (i < 8 * skip) and (i % skip == 0):
                if args.modality == 'rgbd':
                    row = utils.merge_into_row_with_gt(rgb, depth, target,
                                                       pred)
                else:
                    row = utils.merge_into_row(rgb, target, pred)
                img_merge = utils.add_row(img_merge, row)
            elif i == 8 * skip:
                filename = output_directory + '/comparison_' + str(
                    epoch) + '.png'
                utils.save_image(img_merge, filename)

        if (i + 1) % args.print_freq == 0:
            print('Test: [{0}/{1}]\t'
                  't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                  'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                  'MAE={result.mae:.2f}({average.mae:.2f})\n\t'
                  'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                  'REL={result.absrel:.3f}({average.absrel:.3f}) '
                  'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                      i + 1,
                      len(val_loader),
                      gpu_time=gpu_time,
                      result=result,
                      average=average_meter.average()))

    avg = average_meter.average()

    print('\n*\n'
          'RMSE={average.rmse:.3f}\n'
          'MAE={average.mae:.3f}\n'
          'Delta1={average.delta1:.3f}\n'
          'REL={average.absrel:.3f}\n'
          'Lg10={average.lg10:.3f}\n'
          't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

    if write_to_file:
        with open(test_csv, 'a') as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
            writer.writerow({
                'mse': avg.mse,
                'rmse': avg.rmse,
                'absrel': avg.absrel,
                'lg10': avg.lg10,
                'mae': avg.mae,
                'delta1': avg.delta1,
                'delta2': avg.delta2,
                'delta3': avg.delta3,
                'data_time': avg.data_time,
                'gpu_time': avg.gpu_time
            })

    return avg, img_merge
コード例 #30
0
def evaluate(params, loader, model, experiment):
    print("Testing...")
    with experiment.test():
        with torch.no_grad():
            average = AverageMeter()
            img_idxs = np.random.randint(0,
                                         len(loader),
                                         size=min(len(loader), 50))
            end = time.time()
            for i, (inputs, targets) in enumerate(loader):
                inputs, targets = inputs.to(params["device"]), targets.to(
                    params["device"])

                data_time = time.time() - end

                # Predict
                end = time.time()
                outputs = model(inputs)
                gpu_time = time.time() - end

                result = Result()
                result.evaluate(outputs.data, targets.data)
                average.update(result, gpu_time, data_time, inputs.size(0))
                end = time.time()

                # Log images to comet
                if i in img_idxs:
                    img_merged = utils.log_image_to_comet(
                        inputs[0],
                        targets[0],
                        outputs[0],
                        epoch=0,
                        id=i,
                        experiment=experiment,
                        result=result,
                        prefix="test")
                    if params["save_test_images"]:
                        filename = os.path.join(
                            params["experiment_dir"],
                            "comparison_epoch_{}_{}.png".format(
                                str(params["start_epoch"]),
                                np.where(img_idxs == i)[0][0]))
                        utils.save_image(img_merged, filename)

                if (i + 1) % params["stats_frequency"] == 0 and i != 0:
                    print('Test: [{0}/{1}]\t'
                          't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t'
                          'RMSE={result.rmse:.2f}({average.rmse:.2f}) '
                          'MAE={result.mae:.2f}({average.mae:.2f}) '
                          'Delta1={result.delta1:.3f}({average.delta1:.3f}) '
                          'REL={result.absrel:.3f}({average.absrel:.3f}) '
                          'Lg10={result.lg10:.3f}({average.lg10:.3f}) '.format(
                              i + 1,
                              len(loader),
                              gpu_time=gpu_time,
                              result=result,
                              average=average.average()))

            # Mean validation loss
            avg = average.average()
            utils.log_comet_metrics(experiment, avg, None)
            print('\n*\n'
                  'RMSE={average.rmse:.3f}\n'
                  'MAE={average.mae:.3f}\n'
                  'Delta1={average.delta1:.3f}\n'
                  'REL={average.absrel:.3f}\n'
                  'Lg10={average.lg10:.3f}\n'
                  't_GPU={time:.3f}\n'.format(average=avg, time=avg.gpu_time))

            if params["save_test_metrics"]:
                filename = os.path.join(params["experiment_dir"],
                                        "results.csv")
                with open(filename, 'a') as csvfile:
                    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                    writer.writerow({
                        'mse': avg.mse,
                        'rmse': avg.rmse,
                        'absrel': avg.absrel,
                        'lg10': avg.lg10,
                        'mae': avg.mae,
                        'delta1': avg.delta1,
                        'delta2': avg.delta2,
                        'delta3': avg.delta3,
                        'irmse': avg.irmse,
                        'imae': avg.imae,
                        'data_time': avg.data_time,
                        'gpu_time': avg.gpu_time
                    })