├── README.md ├── datasets ├── __init__.py ├── data_io.py └── kitti_dataset.py ├── filenames ├── kitti_train.txt └── shuffled_kitti12_val.txt ├── kitti.sh ├── loss ├── initialization_loss.py ├── propagation_loss.py └── total_loss.py ├── main.py ├── models ├── FE.py ├── HITNet.py ├── initialization.py ├── submodules.py ├── tile_update.py └── tile_warping.py └── utils ├── __init__.py ├── experiment.py ├── metrics.py ├── saver.py ├── visualization.py └── write_pfm.py /README.md: -------------------------------------------------------------------------------- 1 | # PyTorch-HITNet-Hierarchical-Iterative-Tile-Refinement-Network-for-Real-time-Stereo-Matching 2 | HITNet implementation using PyTorch 3 | 4 | This is a repository including code implementing Google paper ***HITNet: Hierarchical Iterative Tile Refinement Network for Real-time Stereo Matching*** 5 | 6 | This project is an initial version, which can train and test the model but may contain some errors and need further modification and debugging. If you find any issue about my code, please open issues or contact me (*mjitglv@gmail.com*) as soon as possible. 7 | 8 | Currently this project cannot reproduce the accuracy and speed reported in the original paper. In terms of the speed, the official implementation uses their optimized cuda op to accelerate the reference and training.(Please refer to their [official repository](https://github.com/googleresearch/google-research/tree/master/hitnet), which has not inculded the model code yet). 9 | 10 | Thanks for the help of Vladimir Tankovich, who has proposed this great stereo network with his team and provided me with a lot of details and clarifications of the original paper. 11 | 12 | Also, I would thank @xy-guo, who proposed the amazing [GwcNet](https://github.com/xy-guo/GwcNet), since the code was partially borrowed from his repository. 13 | 14 | # Requirements 15 | Pytorch = 1.1 16 | Python = 3.6.8 17 | CUDA10 18 | 19 | # Slant Ground-truth 20 | Slant parameter GT is [here](https://drive.google.com/file/d/1GfjWAI6icnX2aSYBl4dujun0sLacMQli/view?usp=sharing), which is generated using least square fit and RANSAC. The code for slant parameter generation is [here](https://drive.google.com/file/d/1dYekuTIG0QZ4ozfDFXslA-VeV3VZE7LG/view?usp=sharing). 21 | -------------------------------------------------------------------------------- /datasets/__init__.py: -------------------------------------------------------------------------------- 1 | from .kitti_dataset import KITTIDataset 2 | 3 | __datasets__ = { 4 | "kitti": KITTIDataset 5 | } 6 | -------------------------------------------------------------------------------- /datasets/data_io.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import re 3 | import torchvision.transforms as transforms 4 | 5 | 6 | def get_transform(): 7 | mean = [0.485, 0.456, 0.406] 8 | std = [0.229, 0.224, 0.225] 9 | 10 | return transforms.Compose([ 11 | transforms.ToTensor(), 12 | transforms.Normalize(mean=mean, std=std), 13 | ]) 14 | 15 | 16 | # read all lines in a file 17 | def read_all_lines(filename): 18 | with open(filename) as f: 19 | lines = [line.rstrip() for line in f.readlines()] 20 | return lines 21 | 22 | 23 | # read an .pfm file into numpy array, used to load SceneFlow disparity files 24 | def pfm_imread(filename): 25 | file = open(filename, 'rb') 26 | color = None 27 | width = None 28 | height = None 29 | scale = None 30 | endian = None 31 | 32 | header = file.readline().decode('utf-8').rstrip() 33 | if header == 'PF': 34 | color = True 35 | elif header == 'Pf': 36 | color = False 37 | else: 38 | raise Exception('Not a PFM file.') 39 | 40 | dim_match = re.match(r'^(\d+)\s(\d+)\s$', file.readline().decode('utf-8')) 41 | if dim_match: 42 | width, height = map(int, dim_match.groups()) 43 | else: 44 | raise Exception('Malformed PFM header.') 45 | 46 | scale = float(file.readline().rstrip()) 47 | if scale < 0: # little-endian 48 | endian = '<' 49 | scale = -scale 50 | else: 51 | endian = '>' # big-endian 52 | 53 | data = np.fromfile(file, endian + 'f') 54 | shape = (height, width, 3) if color else (height, width) 55 | 56 | data = np.reshape(data, shape) 57 | data = np.flipud(data) 58 | return data, scale 59 | -------------------------------------------------------------------------------- /datasets/kitti_dataset.py: -------------------------------------------------------------------------------- 1 | import os 2 | import random 3 | from torch.utils.data import Dataset 4 | from PIL import Image 5 | import numpy as np 6 | from datasets.data_io import get_transform, read_all_lines, pfm_imread 7 | import torchvision.transforms.functional as photometric 8 | import pdb 9 | 10 | 11 | class KITTIDataset(Dataset): 12 | def __init__(self, datapath, list_filename, training): 13 | self.datapath = datapath 14 | self.left_filenames, self.right_filenames, self.disp_filenames, self.dx_gt_filenames, self.dy_gt_filenames = \ 15 | self.load_path(list_filename) 16 | self.training = training 17 | if self.training: 18 | assert self.disp_filenames is not None 19 | 20 | def load_path(self, list_filename): 21 | lines = read_all_lines(list_filename) 22 | splits = [line.split() for line in lines] 23 | left_images = [x[0] for x in splits] 24 | right_images = [x[1] for x in splits] 25 | if len(splits[0]) == 2: # ground truth not available 26 | return left_images, right_images, None, None, None 27 | else: 28 | disp_images = [x[2] for x in splits] 29 | dx_gt = [x[3] for x in splits] 30 | dy_gt = [x[4] for x in splits] 31 | return left_images, right_images, disp_images, dx_gt, dy_gt 32 | 33 | def load_image(self, filename): 34 | return Image.open(filename).convert('RGB') 35 | 36 | def load_disp(self, filename): 37 | data = Image.open(filename) 38 | data = np.array(data, dtype=np.float32) / 256. 39 | return data 40 | 41 | def load_dx_dy(self, filename): 42 | data, scale = pfm_imread(filename) 43 | data = np.ascontiguousarray(data, dtype=np.float32) 44 | return data 45 | 46 | def __len__(self): 47 | return len(self.left_filenames) 48 | 49 | def __getitem__(self, index): 50 | left_img = self.load_image(os.path.join(self.datapath, self.left_filenames[index])) 51 | right_img = self.load_image(os.path.join(self.datapath, self.right_filenames[index])) 52 | 53 | if self.disp_filenames: # has disparity ground truth 54 | disparity = self.load_disp(os.path.join(self.datapath, self.disp_filenames[index])) 55 | else: 56 | disparity = None 57 | 58 | if self.dx_gt_filenames and self.dy_gt_filenames: # has disparity slant param ground truth 59 | dx_gt = self.load_dx_dy(os.path.join(self.datapath, self.dx_gt_filenames[index])) 60 | dy_gt = self.load_dx_dy(os.path.join(self.datapath, self.dy_gt_filenames[index])) 61 | else: 62 | dx_gt = None 63 | dy_gt = None 64 | 65 | if self.training: 66 | w, h = left_img.size 67 | crop_w, crop_h = 1152, 320 # similar to crops of HITNet paper, but multiple of 64 68 | 69 | x1 = random.randint(0, w - crop_w) 70 | y1 = random.randint(0, h - crop_h) 71 | 72 | # random crop 73 | left_img = left_img.crop((x1, y1, x1 + crop_w, y1 + crop_h)) 74 | right_img = right_img.crop((x1, y1, x1 + crop_w, y1 + crop_h)) 75 | disparity = disparity[y1:y1 + crop_h, x1:x1 + crop_w] 76 | dx_gt = dx_gt[y1:y1 + crop_h, x1:x1 + crop_w] 77 | dy_gt = dy_gt[y1:y1 + crop_h, x1:x1 + crop_w] 78 | 79 | # photometric augmentation: brightness and contrast perturb 80 | sym_random_brt = np.random.uniform(0.8, 1.2) 81 | sym_random_cts = np.random.uniform(0.8, 1.2) 82 | asym_random_brt = np.random.uniform(0.95, 1.05, size=2) 83 | asym_random_cts = np.random.uniform(0.95, 1.05, size=2) 84 | # brightness 85 | left_img = photometric.adjust_brightness(left_img, sym_random_brt) 86 | right_img = photometric.adjust_brightness(right_img, sym_random_brt) 87 | left_img = photometric.adjust_brightness(left_img, asym_random_brt[0]) 88 | right_img = photometric.adjust_brightness(right_img, asym_random_brt[1]) 89 | # contrast 90 | left_img = photometric.adjust_contrast(left_img, sym_random_cts) 91 | right_img = photometric.adjust_contrast(right_img, sym_random_cts) 92 | left_img = photometric.adjust_contrast(left_img, asym_random_cts[0]) 93 | right_img = photometric.adjust_contrast(right_img, asym_random_cts[1]) 94 | 95 | # to tensor, normalize 96 | processed = get_transform() 97 | left_img = processed(left_img) 98 | right_img = processed(right_img) 99 | 100 | # random patch exchange of right image 101 | patch_h = random.randint(50, 180) 102 | patch_w = random.randint(50, 250) 103 | patch1_x = random.randint(0, crop_h-patch_h) 104 | patch1_y = random.randint(0, crop_w-patch_w) 105 | patch2_x = random.randint(0, crop_h-patch_h) 106 | patch2_y = random.randint(0, crop_w-patch_w) 107 | # pdb.set_trace() 108 | # print(right_img.shape) 109 | img_patch = right_img[:, patch2_x:patch2_x+patch_h, patch2_y:patch2_y+patch_w] 110 | right_img[:, patch1_x:patch1_x+patch_h, patch1_y:patch1_y+patch_w] = img_patch 111 | 112 | return {"left": left_img, 113 | "right": right_img, 114 | "disparity": disparity, 115 | "dx_gt": dx_gt, 116 | "dy_gt": dy_gt} 117 | else: 118 | w, h = left_img.size 119 | 120 | # normalize 121 | processed = get_transform() 122 | left_img = processed(left_img).numpy() 123 | right_img = processed(right_img).numpy() 124 | 125 | # pad to size 1280x384 126 | top_pad = 384 - h 127 | right_pad = 1280 - w 128 | assert top_pad > 0 and right_pad > 0 129 | # pad images 130 | left_img = np.lib.pad(left_img, ((0, 0), (top_pad, 0), (0, right_pad)), mode='constant', constant_values=0) 131 | right_img = np.lib.pad(right_img, ((0, 0), (top_pad, 0), (0, right_pad)), mode='constant', 132 | constant_values=0) 133 | # pad disparity gt 134 | if disparity is not None: 135 | assert len(disparity.shape) == 2 136 | disparity = np.lib.pad(disparity, ((top_pad, 0), (0, right_pad)), mode='constant', constant_values=0) 137 | 138 | # pad dx and dy gt 139 | if dx_gt is not None and dy_gt is not None: 140 | assert len(dx_gt.shape) == 2 141 | dx_gt = np.lib.pad(dx_gt, ((top_pad, 0), (0, right_pad)), mode='constant', constant_values=0) 142 | assert len(dy_gt.shape) == 2 143 | dy_gt = np.lib.pad(dy_gt, ((top_pad, 0), (0, right_pad)), mode='constant', constant_values=0) 144 | 145 | if disparity is not None and dx_gt is not None and dy_gt is not None: 146 | return {"left": left_img, 147 | "right": right_img, 148 | "disparity": disparity, 149 | "top_pad": top_pad, 150 | "right_pad": right_pad, 151 | "dx_gt": dx_gt, 152 | "dy_gt": dy_gt} 153 | else: 154 | return {"left": left_img, 155 | "right": right_img, 156 | "top_pad": top_pad, 157 | "right_pad": right_pad, 158 | "left_filename": self.left_filenames[index], 159 | "right_filename": self.right_filenames[index]} 160 | -------------------------------------------------------------------------------- /filenames/kitti_train.txt: -------------------------------------------------------------------------------- 1 | kitti_2015/training/image_2/000000_10.png kitti_2015/training/image_3/000000_10.png kitti_2015/training/disp_occ_0/000000_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000000_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000000_10.pfm 2 | kitti_2015/training/image_2/000001_10.png kitti_2015/training/image_3/000001_10.png kitti_2015/training/disp_occ_0/000001_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000001_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000001_10.pfm 3 | kitti_2015/training/image_2/000002_10.png kitti_2015/training/image_3/000002_10.png kitti_2015/training/disp_occ_0/000002_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000002_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000002_10.pfm 4 | kitti_2015/training/image_2/000003_10.png kitti_2015/training/image_3/000003_10.png kitti_2015/training/disp_occ_0/000003_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000003_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000003_10.pfm 5 | kitti_2015/training/image_2/000006_10.png kitti_2015/training/image_3/000006_10.png kitti_2015/training/disp_occ_0/000006_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000006_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000006_10.pfm 6 | kitti_2015/training/image_2/000008_10.png kitti_2015/training/image_3/000008_10.png kitti_2015/training/disp_occ_0/000008_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000008_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000008_10.pfm 7 | kitti_2015/training/image_2/000009_10.png kitti_2015/training/image_3/000009_10.png kitti_2015/training/disp_occ_0/000009_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000009_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000009_10.pfm 8 | kitti_2015/training/image_2/000010_10.png kitti_2015/training/image_3/000010_10.png kitti_2015/training/disp_occ_0/000010_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000010_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000010_10.pfm 9 | kitti_2015/training/image_2/000011_10.png kitti_2015/training/image_3/000011_10.png kitti_2015/training/disp_occ_0/000011_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000011_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000011_10.pfm 10 | kitti_2015/training/image_2/000013_10.png kitti_2015/training/image_3/000013_10.png kitti_2015/training/disp_occ_0/000013_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000013_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000013_10.pfm 11 | kitti_2015/training/image_2/000014_10.png kitti_2015/training/image_3/000014_10.png kitti_2015/training/disp_occ_0/000014_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000014_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000014_10.pfm 12 | kitti_2015/training/image_2/000015_10.png kitti_2015/training/image_3/000015_10.png kitti_2015/training/disp_occ_0/000015_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000015_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000015_10.pfm 13 | kitti_2015/training/image_2/000017_10.png kitti_2015/training/image_3/000017_10.png kitti_2015/training/disp_occ_0/000017_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000017_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000017_10.pfm 14 | kitti_2015/training/image_2/000019_10.png kitti_2015/training/image_3/000019_10.png kitti_2015/training/disp_occ_0/000019_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000019_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000019_10.pfm 15 | kitti_2015/training/image_2/000020_10.png kitti_2015/training/image_3/000020_10.png kitti_2015/training/disp_occ_0/000020_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000020_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000020_10.pfm 16 | kitti_2015/training/image_2/000021_10.png kitti_2015/training/image_3/000021_10.png kitti_2015/training/disp_occ_0/000021_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000021_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000021_10.pfm 17 | kitti_2015/training/image_2/000023_10.png kitti_2015/training/image_3/000023_10.png kitti_2015/training/disp_occ_0/000023_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000023_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000023_10.pfm 18 | kitti_2015/training/image_2/000024_10.png kitti_2015/training/image_3/000024_10.png kitti_2015/training/disp_occ_0/000024_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000024_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000024_10.pfm 19 | kitti_2015/training/image_2/000025_10.png kitti_2015/training/image_3/000025_10.png kitti_2015/training/disp_occ_0/000025_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000025_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000025_10.pfm 20 | kitti_2015/training/image_2/000026_10.png kitti_2015/training/image_3/000026_10.png kitti_2015/training/disp_occ_0/000026_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000026_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000026_10.pfm 21 | kitti_2015/training/image_2/000027_10.png kitti_2015/training/image_3/000027_10.png kitti_2015/training/disp_occ_0/000027_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000027_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000027_10.pfm 22 | kitti_2015/training/image_2/000028_10.png kitti_2015/training/image_3/000028_10.png kitti_2015/training/disp_occ_0/000028_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000028_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000028_10.pfm 23 | kitti_2015/training/image_2/000029_10.png kitti_2015/training/image_3/000029_10.png kitti_2015/training/disp_occ_0/000029_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000029_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000029_10.pfm 24 | kitti_2015/training/image_2/000030_10.png kitti_2015/training/image_3/000030_10.png kitti_2015/training/disp_occ_0/000030_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000030_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000030_10.pfm 25 | kitti_2015/training/image_2/000031_10.png kitti_2015/training/image_3/000031_10.png kitti_2015/training/disp_occ_0/000031_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000031_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000031_10.pfm 26 | kitti_2015/training/image_2/000032_10.png kitti_2015/training/image_3/000032_10.png kitti_2015/training/disp_occ_0/000032_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000032_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000032_10.pfm 27 | kitti_2015/training/image_2/000034_10.png kitti_2015/training/image_3/000034_10.png kitti_2015/training/disp_occ_0/000034_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000034_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000034_10.pfm 28 | kitti_2015/training/image_2/000035_10.png kitti_2015/training/image_3/000035_10.png kitti_2015/training/disp_occ_0/000035_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000035_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000035_10.pfm 29 | kitti_2015/training/image_2/000036_10.png kitti_2015/training/image_3/000036_10.png kitti_2015/training/disp_occ_0/000036_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000036_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000036_10.pfm 30 | kitti_2015/training/image_2/000038_10.png kitti_2015/training/image_3/000038_10.png kitti_2015/training/disp_occ_0/000038_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000038_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000038_10.pfm 31 | kitti_2015/training/image_2/000039_10.png kitti_2015/training/image_3/000039_10.png kitti_2015/training/disp_occ_0/000039_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000039_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000039_10.pfm 32 | kitti_2015/training/image_2/000040_10.png kitti_2015/training/image_3/000040_10.png kitti_2015/training/disp_occ_0/000040_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000040_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000040_10.pfm 33 | kitti_2015/training/image_2/000041_10.png kitti_2015/training/image_3/000041_10.png kitti_2015/training/disp_occ_0/000041_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000041_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000041_10.pfm 34 | kitti_2015/training/image_2/000042_10.png kitti_2015/training/image_3/000042_10.png kitti_2015/training/disp_occ_0/000042_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000042_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000042_10.pfm 35 | kitti_2015/training/image_2/000043_10.png kitti_2015/training/image_3/000043_10.png kitti_2015/training/disp_occ_0/000043_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000043_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000043_10.pfm 36 | kitti_2015/training/image_2/000046_10.png kitti_2015/training/image_3/000046_10.png kitti_2015/training/disp_occ_0/000046_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000046_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000046_10.pfm 37 | kitti_2015/training/image_2/000047_10.png kitti_2015/training/image_3/000047_10.png kitti_2015/training/disp_occ_0/000047_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000047_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000047_10.pfm 38 | kitti_2015/training/image_2/000048_10.png kitti_2015/training/image_3/000048_10.png kitti_2015/training/disp_occ_0/000048_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000048_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000048_10.pfm 39 | kitti_2015/training/image_2/000049_10.png kitti_2015/training/image_3/000049_10.png kitti_2015/training/disp_occ_0/000049_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000049_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000049_10.pfm 40 | kitti_2015/training/image_2/000050_10.png kitti_2015/training/image_3/000050_10.png kitti_2015/training/disp_occ_0/000050_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000050_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000050_10.pfm 41 | kitti_2015/training/image_2/000051_10.png kitti_2015/training/image_3/000051_10.png kitti_2015/training/disp_occ_0/000051_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000051_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000051_10.pfm 42 | kitti_2015/training/image_2/000052_10.png kitti_2015/training/image_3/000052_10.png kitti_2015/training/disp_occ_0/000052_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000052_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000052_10.pfm 43 | kitti_2015/training/image_2/000053_10.png kitti_2015/training/image_3/000053_10.png kitti_2015/training/disp_occ_0/000053_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000053_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000053_10.pfm 44 | kitti_2015/training/image_2/000054_10.png kitti_2015/training/image_3/000054_10.png kitti_2015/training/disp_occ_0/000054_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000054_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000054_10.pfm 45 | kitti_2015/training/image_2/000056_10.png kitti_2015/training/image_3/000056_10.png kitti_2015/training/disp_occ_0/000056_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000056_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000056_10.pfm 46 | kitti_2015/training/image_2/000057_10.png kitti_2015/training/image_3/000057_10.png kitti_2015/training/disp_occ_0/000057_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000057_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000057_10.pfm 47 | kitti_2015/training/image_2/000058_10.png kitti_2015/training/image_3/000058_10.png kitti_2015/training/disp_occ_0/000058_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000058_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000058_10.pfm 48 | kitti_2015/training/image_2/000059_10.png kitti_2015/training/image_3/000059_10.png kitti_2015/training/disp_occ_0/000059_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000059_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000059_10.pfm 49 | kitti_2015/training/image_2/000062_10.png kitti_2015/training/image_3/000062_10.png kitti_2015/training/disp_occ_0/000062_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000062_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000062_10.pfm 50 | kitti_2015/training/image_2/000063_10.png kitti_2015/training/image_3/000063_10.png kitti_2015/training/disp_occ_0/000063_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000063_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000063_10.pfm 51 | kitti_2015/training/image_2/000064_10.png kitti_2015/training/image_3/000064_10.png kitti_2015/training/disp_occ_0/000064_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000064_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000064_10.pfm 52 | kitti_2015/training/image_2/000065_10.png kitti_2015/training/image_3/000065_10.png kitti_2015/training/disp_occ_0/000065_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000065_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000065_10.pfm 53 | kitti_2015/training/image_2/000066_10.png kitti_2015/training/image_3/000066_10.png kitti_2015/training/disp_occ_0/000066_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000066_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000066_10.pfm 54 | kitti_2015/training/image_2/000067_10.png kitti_2015/training/image_3/000067_10.png kitti_2015/training/disp_occ_0/000067_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000067_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000067_10.pfm 55 | kitti_2015/training/image_2/000068_10.png kitti_2015/training/image_3/000068_10.png kitti_2015/training/disp_occ_0/000068_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000068_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000068_10.pfm 56 | kitti_2015/training/image_2/000069_10.png kitti_2015/training/image_3/000069_10.png kitti_2015/training/disp_occ_0/000069_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000069_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000069_10.pfm 57 | kitti_2015/training/image_2/000070_10.png kitti_2015/training/image_3/000070_10.png kitti_2015/training/disp_occ_0/000070_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000070_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000070_10.pfm 58 | kitti_2015/training/image_2/000071_10.png kitti_2015/training/image_3/000071_10.png kitti_2015/training/disp_occ_0/000071_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000071_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000071_10.pfm 59 | kitti_2015/training/image_2/000072_10.png kitti_2015/training/image_3/000072_10.png kitti_2015/training/disp_occ_0/000072_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000072_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000072_10.pfm 60 | kitti_2015/training/image_2/000073_10.png kitti_2015/training/image_3/000073_10.png kitti_2015/training/disp_occ_0/000073_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000073_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000073_10.pfm 61 | kitti_2015/training/image_2/000075_10.png kitti_2015/training/image_3/000075_10.png kitti_2015/training/disp_occ_0/000075_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000075_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000075_10.pfm 62 | kitti_2015/training/image_2/000076_10.png kitti_2015/training/image_3/000076_10.png kitti_2015/training/disp_occ_0/000076_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000076_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000076_10.pfm 63 | kitti_2015/training/image_2/000077_10.png kitti_2015/training/image_3/000077_10.png kitti_2015/training/disp_occ_0/000077_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000077_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000077_10.pfm 64 | kitti_2015/training/image_2/000078_10.png kitti_2015/training/image_3/000078_10.png kitti_2015/training/disp_occ_0/000078_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000078_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000078_10.pfm 65 | kitti_2015/training/image_2/000079_10.png kitti_2015/training/image_3/000079_10.png kitti_2015/training/disp_occ_0/000079_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000079_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000079_10.pfm 66 | kitti_2015/training/image_2/000081_10.png kitti_2015/training/image_3/000081_10.png kitti_2015/training/disp_occ_0/000081_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000081_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000081_10.pfm 67 | kitti_2015/training/image_2/000082_10.png kitti_2015/training/image_3/000082_10.png kitti_2015/training/disp_occ_0/000082_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000082_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000082_10.pfm 68 | kitti_2015/training/image_2/000084_10.png kitti_2015/training/image_3/000084_10.png kitti_2015/training/disp_occ_0/000084_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000084_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000084_10.pfm 69 | kitti_2015/training/image_2/000085_10.png kitti_2015/training/image_3/000085_10.png kitti_2015/training/disp_occ_0/000085_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000085_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000085_10.pfm 70 | kitti_2015/training/image_2/000086_10.png kitti_2015/training/image_3/000086_10.png kitti_2015/training/disp_occ_0/000086_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000086_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000086_10.pfm 71 | kitti_2015/training/image_2/000087_10.png kitti_2015/training/image_3/000087_10.png kitti_2015/training/disp_occ_0/000087_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000087_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000087_10.pfm 72 | kitti_2015/training/image_2/000088_10.png kitti_2015/training/image_3/000088_10.png kitti_2015/training/disp_occ_0/000088_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000088_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000088_10.pfm 73 | kitti_2015/training/image_2/000089_10.png kitti_2015/training/image_3/000089_10.png kitti_2015/training/disp_occ_0/000089_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000089_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000089_10.pfm 74 | kitti_2015/training/image_2/000090_10.png kitti_2015/training/image_3/000090_10.png kitti_2015/training/disp_occ_0/000090_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000090_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000090_10.pfm 75 | kitti_2015/training/image_2/000091_10.png kitti_2015/training/image_3/000091_10.png kitti_2015/training/disp_occ_0/000091_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000091_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000091_10.pfm 76 | kitti_2015/training/image_2/000092_10.png kitti_2015/training/image_3/000092_10.png kitti_2015/training/disp_occ_0/000092_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000092_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000092_10.pfm 77 | kitti_2015/training/image_2/000093_10.png kitti_2015/training/image_3/000093_10.png kitti_2015/training/disp_occ_0/000093_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000093_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000093_10.pfm 78 | kitti_2015/training/image_2/000094_10.png kitti_2015/training/image_3/000094_10.png kitti_2015/training/disp_occ_0/000094_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000094_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000094_10.pfm 79 | kitti_2015/training/image_2/000095_10.png kitti_2015/training/image_3/000095_10.png kitti_2015/training/disp_occ_0/000095_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000095_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000095_10.pfm 80 | kitti_2015/training/image_2/000096_10.png kitti_2015/training/image_3/000096_10.png kitti_2015/training/disp_occ_0/000096_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000096_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000096_10.pfm 81 | kitti_2015/training/image_2/000097_10.png kitti_2015/training/image_3/000097_10.png kitti_2015/training/disp_occ_0/000097_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000097_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000097_10.pfm 82 | kitti_2015/training/image_2/000099_10.png kitti_2015/training/image_3/000099_10.png kitti_2015/training/disp_occ_0/000099_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000099_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000099_10.pfm 83 | kitti_2015/training/image_2/000100_10.png kitti_2015/training/image_3/000100_10.png kitti_2015/training/disp_occ_0/000100_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000100_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000100_10.pfm 84 | kitti_2015/training/image_2/000101_10.png kitti_2015/training/image_3/000101_10.png kitti_2015/training/disp_occ_0/000101_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000101_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000101_10.pfm 85 | kitti_2015/training/image_2/000102_10.png kitti_2015/training/image_3/000102_10.png kitti_2015/training/disp_occ_0/000102_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000102_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000102_10.pfm 86 | kitti_2015/training/image_2/000103_10.png kitti_2015/training/image_3/000103_10.png kitti_2015/training/disp_occ_0/000103_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000103_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000103_10.pfm 87 | kitti_2015/training/image_2/000104_10.png kitti_2015/training/image_3/000104_10.png kitti_2015/training/disp_occ_0/000104_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000104_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000104_10.pfm 88 | kitti_2015/training/image_2/000105_10.png kitti_2015/training/image_3/000105_10.png kitti_2015/training/disp_occ_0/000105_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000105_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000105_10.pfm 89 | kitti_2015/training/image_2/000108_10.png kitti_2015/training/image_3/000108_10.png kitti_2015/training/disp_occ_0/000108_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000108_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000108_10.pfm 90 | kitti_2015/training/image_2/000109_10.png kitti_2015/training/image_3/000109_10.png kitti_2015/training/disp_occ_0/000109_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000109_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000109_10.pfm 91 | kitti_2015/training/image_2/000110_10.png kitti_2015/training/image_3/000110_10.png kitti_2015/training/disp_occ_0/000110_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000110_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000110_10.pfm 92 | kitti_2015/training/image_2/000112_10.png kitti_2015/training/image_3/000112_10.png kitti_2015/training/disp_occ_0/000112_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000112_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000112_10.pfm 93 | kitti_2015/training/image_2/000113_10.png kitti_2015/training/image_3/000113_10.png kitti_2015/training/disp_occ_0/000113_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000113_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000113_10.pfm 94 | kitti_2015/training/image_2/000114_10.png kitti_2015/training/image_3/000114_10.png kitti_2015/training/disp_occ_0/000114_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000114_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000114_10.pfm 95 | kitti_2015/training/image_2/000115_10.png kitti_2015/training/image_3/000115_10.png kitti_2015/training/disp_occ_0/000115_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000115_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000115_10.pfm 96 | kitti_2015/training/image_2/000116_10.png kitti_2015/training/image_3/000116_10.png kitti_2015/training/disp_occ_0/000116_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000116_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000116_10.pfm 97 | kitti_2015/training/image_2/000117_10.png kitti_2015/training/image_3/000117_10.png kitti_2015/training/disp_occ_0/000117_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000117_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000117_10.pfm 98 | kitti_2015/training/image_2/000118_10.png kitti_2015/training/image_3/000118_10.png kitti_2015/training/disp_occ_0/000118_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000118_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000118_10.pfm 99 | kitti_2015/training/image_2/000119_10.png kitti_2015/training/image_3/000119_10.png kitti_2015/training/disp_occ_0/000119_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000119_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000119_10.pfm 100 | kitti_2015/training/image_2/000120_10.png kitti_2015/training/image_3/000120_10.png kitti_2015/training/disp_occ_0/000120_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000120_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000120_10.pfm 101 | kitti_2015/training/image_2/000121_10.png kitti_2015/training/image_3/000121_10.png kitti_2015/training/disp_occ_0/000121_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000121_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000121_10.pfm 102 | kitti_2015/training/image_2/000124_10.png kitti_2015/training/image_3/000124_10.png kitti_2015/training/disp_occ_0/000124_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000124_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000124_10.pfm 103 | kitti_2015/training/image_2/000126_10.png kitti_2015/training/image_3/000126_10.png kitti_2015/training/disp_occ_0/000126_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000126_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000126_10.pfm 104 | kitti_2015/training/image_2/000127_10.png kitti_2015/training/image_3/000127_10.png kitti_2015/training/disp_occ_0/000127_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000127_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000127_10.pfm 105 | kitti_2015/training/image_2/000128_10.png kitti_2015/training/image_3/000128_10.png kitti_2015/training/disp_occ_0/000128_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000128_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000128_10.pfm 106 | kitti_2015/training/image_2/000131_10.png kitti_2015/training/image_3/000131_10.png kitti_2015/training/disp_occ_0/000131_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000131_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000131_10.pfm 107 | kitti_2015/training/image_2/000132_10.png kitti_2015/training/image_3/000132_10.png kitti_2015/training/disp_occ_0/000132_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000132_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000132_10.pfm 108 | kitti_2015/training/image_2/000133_10.png kitti_2015/training/image_3/000133_10.png kitti_2015/training/disp_occ_0/000133_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000133_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000133_10.pfm 109 | kitti_2015/training/image_2/000134_10.png kitti_2015/training/image_3/000134_10.png kitti_2015/training/disp_occ_0/000134_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000134_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000134_10.pfm 110 | kitti_2015/training/image_2/000135_10.png kitti_2015/training/image_3/000135_10.png kitti_2015/training/disp_occ_0/000135_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000135_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000135_10.pfm 111 | kitti_2015/training/image_2/000136_10.png kitti_2015/training/image_3/000136_10.png kitti_2015/training/disp_occ_0/000136_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000136_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000136_10.pfm 112 | kitti_2015/training/image_2/000137_10.png kitti_2015/training/image_3/000137_10.png kitti_2015/training/disp_occ_0/000137_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000137_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000137_10.pfm 113 | kitti_2015/training/image_2/000138_10.png kitti_2015/training/image_3/000138_10.png kitti_2015/training/disp_occ_0/000138_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000138_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000138_10.pfm 114 | kitti_2015/training/image_2/000139_10.png kitti_2015/training/image_3/000139_10.png kitti_2015/training/disp_occ_0/000139_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000139_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000139_10.pfm 115 | kitti_2015/training/image_2/000140_10.png kitti_2015/training/image_3/000140_10.png kitti_2015/training/disp_occ_0/000140_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000140_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000140_10.pfm 116 | kitti_2015/training/image_2/000141_10.png kitti_2015/training/image_3/000141_10.png kitti_2015/training/disp_occ_0/000141_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000141_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000141_10.pfm 117 | kitti_2015/training/image_2/000142_10.png kitti_2015/training/image_3/000142_10.png kitti_2015/training/disp_occ_0/000142_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000142_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000142_10.pfm 118 | kitti_2015/training/image_2/000143_10.png kitti_2015/training/image_3/000143_10.png kitti_2015/training/disp_occ_0/000143_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000143_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000143_10.pfm 119 | kitti_2015/training/image_2/000144_10.png kitti_2015/training/image_3/000144_10.png kitti_2015/training/disp_occ_0/000144_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000144_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000144_10.pfm 120 | kitti_2015/training/image_2/000147_10.png kitti_2015/training/image_3/000147_10.png kitti_2015/training/disp_occ_0/000147_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000147_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000147_10.pfm 121 | kitti_2015/training/image_2/000148_10.png kitti_2015/training/image_3/000148_10.png kitti_2015/training/disp_occ_0/000148_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000148_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000148_10.pfm 122 | kitti_2015/training/image_2/000149_10.png kitti_2015/training/image_3/000149_10.png kitti_2015/training/disp_occ_0/000149_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000149_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000149_10.pfm 123 | kitti_2015/training/image_2/000151_10.png kitti_2015/training/image_3/000151_10.png kitti_2015/training/disp_occ_0/000151_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000151_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000151_10.pfm 124 | kitti_2015/training/image_2/000153_10.png kitti_2015/training/image_3/000153_10.png kitti_2015/training/disp_occ_0/000153_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000153_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000153_10.pfm 125 | kitti_2015/training/image_2/000155_10.png kitti_2015/training/image_3/000155_10.png kitti_2015/training/disp_occ_0/000155_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000155_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000155_10.pfm 126 | kitti_2015/training/image_2/000156_10.png kitti_2015/training/image_3/000156_10.png kitti_2015/training/disp_occ_0/000156_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000156_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000156_10.pfm 127 | kitti_2015/training/image_2/000157_10.png kitti_2015/training/image_3/000157_10.png kitti_2015/training/disp_occ_0/000157_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000157_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000157_10.pfm 128 | kitti_2015/training/image_2/000158_10.png kitti_2015/training/image_3/000158_10.png kitti_2015/training/disp_occ_0/000158_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000158_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000158_10.pfm 129 | kitti_2015/training/image_2/000160_10.png kitti_2015/training/image_3/000160_10.png kitti_2015/training/disp_occ_0/000160_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000160_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000160_10.pfm 130 | kitti_2015/training/image_2/000161_10.png kitti_2015/training/image_3/000161_10.png kitti_2015/training/disp_occ_0/000161_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000161_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000161_10.pfm 131 | kitti_2015/training/image_2/000162_10.png kitti_2015/training/image_3/000162_10.png kitti_2015/training/disp_occ_0/000162_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000162_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000162_10.pfm 132 | kitti_2015/training/image_2/000163_10.png kitti_2015/training/image_3/000163_10.png kitti_2015/training/disp_occ_0/000163_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000163_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000163_10.pfm 133 | kitti_2015/training/image_2/000164_10.png kitti_2015/training/image_3/000164_10.png kitti_2015/training/disp_occ_0/000164_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000164_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000164_10.pfm 134 | kitti_2015/training/image_2/000165_10.png kitti_2015/training/image_3/000165_10.png kitti_2015/training/disp_occ_0/000165_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000165_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000165_10.pfm 135 | kitti_2015/training/image_2/000166_10.png kitti_2015/training/image_3/000166_10.png kitti_2015/training/disp_occ_0/000166_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000166_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000166_10.pfm 136 | kitti_2015/training/image_2/000167_10.png kitti_2015/training/image_3/000167_10.png kitti_2015/training/disp_occ_0/000167_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000167_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000167_10.pfm 137 | kitti_2015/training/image_2/000168_10.png kitti_2015/training/image_3/000168_10.png kitti_2015/training/disp_occ_0/000168_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000168_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000168_10.pfm 138 | kitti_2015/training/image_2/000169_10.png kitti_2015/training/image_3/000169_10.png kitti_2015/training/disp_occ_0/000169_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000169_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000169_10.pfm 139 | kitti_2015/training/image_2/000171_10.png kitti_2015/training/image_3/000171_10.png kitti_2015/training/disp_occ_0/000171_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000171_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000171_10.pfm 140 | kitti_2015/training/image_2/000172_10.png kitti_2015/training/image_3/000172_10.png kitti_2015/training/disp_occ_0/000172_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000172_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000172_10.pfm 141 | kitti_2015/training/image_2/000173_10.png kitti_2015/training/image_3/000173_10.png kitti_2015/training/disp_occ_0/000173_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000173_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000173_10.pfm 142 | kitti_2015/training/image_2/000174_10.png kitti_2015/training/image_3/000174_10.png kitti_2015/training/disp_occ_0/000174_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000174_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000174_10.pfm 143 | kitti_2015/training/image_2/000175_10.png kitti_2015/training/image_3/000175_10.png kitti_2015/training/disp_occ_0/000175_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000175_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000175_10.pfm 144 | kitti_2015/training/image_2/000176_10.png kitti_2015/training/image_3/000176_10.png kitti_2015/training/disp_occ_0/000176_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000176_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000176_10.pfm 145 | kitti_2015/training/image_2/000178_10.png kitti_2015/training/image_3/000178_10.png kitti_2015/training/disp_occ_0/000178_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000178_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000178_10.pfm 146 | kitti_2015/training/image_2/000181_10.png kitti_2015/training/image_3/000181_10.png kitti_2015/training/disp_occ_0/000181_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000181_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000181_10.pfm 147 | kitti_2015/training/image_2/000184_10.png kitti_2015/training/image_3/000184_10.png kitti_2015/training/disp_occ_0/000184_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000184_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000184_10.pfm 148 | kitti_2015/training/image_2/000186_10.png kitti_2015/training/image_3/000186_10.png kitti_2015/training/disp_occ_0/000186_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000186_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000186_10.pfm 149 | kitti_2015/training/image_2/000187_10.png kitti_2015/training/image_3/000187_10.png kitti_2015/training/disp_occ_0/000187_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000187_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000187_10.pfm 150 | kitti_2015/training/image_2/000188_10.png kitti_2015/training/image_3/000188_10.png kitti_2015/training/disp_occ_0/000188_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000188_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000188_10.pfm 151 | kitti_2015/training/image_2/000190_10.png kitti_2015/training/image_3/000190_10.png kitti_2015/training/disp_occ_0/000190_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000190_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000190_10.pfm 152 | kitti_2015/training/image_2/000191_10.png kitti_2015/training/image_3/000191_10.png kitti_2015/training/disp_occ_0/000191_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000191_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000191_10.pfm 153 | kitti_2015/training/image_2/000192_10.png kitti_2015/training/image_3/000192_10.png kitti_2015/training/disp_occ_0/000192_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000192_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000192_10.pfm 154 | kitti_2015/training/image_2/000193_10.png kitti_2015/training/image_3/000193_10.png kitti_2015/training/disp_occ_0/000193_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000193_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000193_10.pfm 155 | kitti_2015/training/image_2/000194_10.png kitti_2015/training/image_3/000194_10.png kitti_2015/training/disp_occ_0/000194_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000194_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000194_10.pfm 156 | kitti_2015/training/image_2/000195_10.png kitti_2015/training/image_3/000195_10.png kitti_2015/training/disp_occ_0/000195_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000195_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000195_10.pfm 157 | kitti_2015/training/image_2/000196_10.png kitti_2015/training/image_3/000196_10.png kitti_2015/training/disp_occ_0/000196_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000196_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000196_10.pfm 158 | kitti_2015/training/image_2/000197_10.png kitti_2015/training/image_3/000197_10.png kitti_2015/training/disp_occ_0/000197_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000197_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000197_10.pfm 159 | kitti_2015/training/image_2/000198_10.png kitti_2015/training/image_3/000198_10.png kitti_2015/training/disp_occ_0/000198_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000198_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000198_10.pfm 160 | kitti_2015/training/image_2/000199_10.png kitti_2015/training/image_3/000199_10.png kitti_2015/training/disp_occ_0/000199_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000199_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000199_10.pfm 161 | kitti_2015/training/image_2/000004_10.png kitti_2015/training/image_3/000004_10.png kitti_2015/training/disp_occ_0/000004_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000004_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000004_10.pfm 162 | kitti_2015/training/image_2/000005_10.png kitti_2015/training/image_3/000005_10.png kitti_2015/training/disp_occ_0/000005_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000005_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000005_10.pfm 163 | kitti_2015/training/image_2/000007_10.png kitti_2015/training/image_3/000007_10.png kitti_2015/training/disp_occ_0/000007_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000007_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000007_10.pfm 164 | kitti_2015/training/image_2/000012_10.png kitti_2015/training/image_3/000012_10.png kitti_2015/training/disp_occ_0/000012_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000012_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000012_10.pfm 165 | kitti_2015/training/image_2/000016_10.png kitti_2015/training/image_3/000016_10.png kitti_2015/training/disp_occ_0/000016_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000016_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000016_10.pfm 166 | kitti_2015/training/image_2/000018_10.png kitti_2015/training/image_3/000018_10.png kitti_2015/training/disp_occ_0/000018_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000018_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000018_10.pfm 167 | kitti_2015/training/image_2/000022_10.png kitti_2015/training/image_3/000022_10.png kitti_2015/training/disp_occ_0/000022_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000022_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000022_10.pfm 168 | kitti_2015/training/image_2/000033_10.png kitti_2015/training/image_3/000033_10.png kitti_2015/training/disp_occ_0/000033_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000033_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000033_10.pfm 169 | kitti_2015/training/image_2/000037_10.png kitti_2015/training/image_3/000037_10.png kitti_2015/training/disp_occ_0/000037_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000037_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000037_10.pfm 170 | kitti_2015/training/image_2/000044_10.png kitti_2015/training/image_3/000044_10.png kitti_2015/training/disp_occ_0/000044_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000044_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000044_10.pfm 171 | kitti_2015/training/image_2/000045_10.png kitti_2015/training/image_3/000045_10.png kitti_2015/training/disp_occ_0/000045_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000045_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000045_10.pfm 172 | kitti_2015/training/image_2/000055_10.png kitti_2015/training/image_3/000055_10.png kitti_2015/training/disp_occ_0/000055_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000055_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000055_10.pfm 173 | kitti_2015/training/image_2/000060_10.png kitti_2015/training/image_3/000060_10.png kitti_2015/training/disp_occ_0/000060_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000060_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000060_10.pfm 174 | kitti_2015/training/image_2/000061_10.png kitti_2015/training/image_3/000061_10.png kitti_2015/training/disp_occ_0/000061_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000061_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000061_10.pfm 175 | kitti_2015/training/image_2/000074_10.png kitti_2015/training/image_3/000074_10.png kitti_2015/training/disp_occ_0/000074_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000074_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000074_10.pfm 176 | kitti_2015/training/image_2/000080_10.png kitti_2015/training/image_3/000080_10.png kitti_2015/training/disp_occ_0/000080_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000080_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000080_10.pfm 177 | kitti_2015/training/image_2/000083_10.png kitti_2015/training/image_3/000083_10.png kitti_2015/training/disp_occ_0/000083_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000083_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000083_10.pfm 178 | kitti_2015/training/image_2/000098_10.png kitti_2015/training/image_3/000098_10.png kitti_2015/training/disp_occ_0/000098_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000098_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000098_10.pfm 179 | kitti_2015/training/image_2/000106_10.png kitti_2015/training/image_3/000106_10.png kitti_2015/training/disp_occ_0/000106_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000106_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000106_10.pfm 180 | kitti_2015/training/image_2/000107_10.png kitti_2015/training/image_3/000107_10.png kitti_2015/training/disp_occ_0/000107_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000107_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000107_10.pfm 181 | kitti_2015/training/image_2/000111_10.png kitti_2015/training/image_3/000111_10.png kitti_2015/training/disp_occ_0/000111_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000111_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000111_10.pfm 182 | kitti_2015/training/image_2/000122_10.png kitti_2015/training/image_3/000122_10.png kitti_2015/training/disp_occ_0/000122_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000122_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000122_10.pfm 183 | kitti_2015/training/image_2/000123_10.png kitti_2015/training/image_3/000123_10.png kitti_2015/training/disp_occ_0/000123_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000123_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000123_10.pfm 184 | kitti_2015/training/image_2/000125_10.png kitti_2015/training/image_3/000125_10.png kitti_2015/training/disp_occ_0/000125_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000125_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000125_10.pfm 185 | kitti_2015/training/image_2/000129_10.png kitti_2015/training/image_3/000129_10.png kitti_2015/training/disp_occ_0/000129_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000129_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000129_10.pfm 186 | kitti_2015/training/image_2/000130_10.png kitti_2015/training/image_3/000130_10.png kitti_2015/training/disp_occ_0/000130_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000130_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000130_10.pfm 187 | kitti_2015/training/image_2/000145_10.png kitti_2015/training/image_3/000145_10.png kitti_2015/training/disp_occ_0/000145_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000145_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000145_10.pfm 188 | kitti_2015/training/image_2/000146_10.png kitti_2015/training/image_3/000146_10.png kitti_2015/training/disp_occ_0/000146_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000146_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000146_10.pfm 189 | kitti_2015/training/image_2/000150_10.png kitti_2015/training/image_3/000150_10.png kitti_2015/training/disp_occ_0/000150_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000150_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000150_10.pfm 190 | kitti_2015/training/image_2/000152_10.png kitti_2015/training/image_3/000152_10.png kitti_2015/training/disp_occ_0/000152_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000152_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000152_10.pfm 191 | kitti_2015/training/image_2/000154_10.png kitti_2015/training/image_3/000154_10.png kitti_2015/training/disp_occ_0/000154_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000154_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000154_10.pfm 192 | kitti_2015/training/image_2/000159_10.png kitti_2015/training/image_3/000159_10.png kitti_2015/training/disp_occ_0/000159_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000159_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000159_10.pfm 193 | kitti_2015/training/image_2/000170_10.png kitti_2015/training/image_3/000170_10.png kitti_2015/training/disp_occ_0/000170_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000170_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000170_10.pfm 194 | kitti_2015/training/image_2/000177_10.png kitti_2015/training/image_3/000177_10.png kitti_2015/training/disp_occ_0/000177_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000177_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000177_10.pfm 195 | kitti_2015/training/image_2/000179_10.png kitti_2015/training/image_3/000179_10.png kitti_2015/training/disp_occ_0/000179_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000179_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000179_10.pfm 196 | kitti_2015/training/image_2/000180_10.png kitti_2015/training/image_3/000180_10.png kitti_2015/training/disp_occ_0/000180_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000180_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000180_10.pfm 197 | kitti_2015/training/image_2/000182_10.png kitti_2015/training/image_3/000182_10.png kitti_2015/training/disp_occ_0/000182_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000182_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000182_10.pfm 198 | kitti_2015/training/image_2/000183_10.png kitti_2015/training/image_3/000183_10.png kitti_2015/training/disp_occ_0/000183_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000183_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000183_10.pfm 199 | kitti_2015/training/image_2/000185_10.png kitti_2015/training/image_3/000185_10.png kitti_2015/training/disp_occ_0/000185_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000185_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000185_10.pfm 200 | kitti_2015/training/image_2/000189_10.png kitti_2015/training/image_3/000189_10.png kitti_2015/training/disp_occ_0/000189_10.png kt15_full_disparity_plane/disp_occ_0/dense/dx/000189_10.pfm kt15_full_disparity_plane/disp_occ_0/dense/dy/000189_10.pfm 201 | kitti_2012/training/colored_0/000057_10.png kitti_2012/training/colored_1/000057_10.png kitti_2012/training/disp_occ/000057_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000057_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000057_10.pfm 202 | kitti_2012/training/colored_0/000117_10.png kitti_2012/training/colored_1/000117_10.png kitti_2012/training/disp_occ/000117_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000117_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000117_10.pfm 203 | kitti_2012/training/colored_0/000130_10.png kitti_2012/training/colored_1/000130_10.png kitti_2012/training/disp_occ/000130_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000130_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000130_10.pfm 204 | kitti_2012/training/colored_0/000174_10.png kitti_2012/training/colored_1/000174_10.png kitti_2012/training/disp_occ/000174_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000174_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000174_10.pfm 205 | kitti_2012/training/colored_0/000169_10.png kitti_2012/training/colored_1/000169_10.png kitti_2012/training/disp_occ/000169_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000169_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000169_10.pfm 206 | kitti_2012/training/colored_0/000073_10.png kitti_2012/training/colored_1/000073_10.png kitti_2012/training/disp_occ/000073_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000073_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000073_10.pfm 207 | kitti_2012/training/colored_0/000112_10.png kitti_2012/training/colored_1/000112_10.png kitti_2012/training/disp_occ/000112_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000112_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000112_10.pfm 208 | kitti_2012/training/colored_0/000167_10.png kitti_2012/training/colored_1/000167_10.png kitti_2012/training/disp_occ/000167_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000167_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000167_10.pfm 209 | kitti_2012/training/colored_0/000055_10.png kitti_2012/training/colored_1/000055_10.png kitti_2012/training/disp_occ/000055_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000055_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000055_10.pfm 210 | kitti_2012/training/colored_0/000085_10.png kitti_2012/training/colored_1/000085_10.png kitti_2012/training/disp_occ/000085_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000085_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000085_10.pfm 211 | kitti_2012/training/colored_0/000109_10.png kitti_2012/training/colored_1/000109_10.png kitti_2012/training/disp_occ/000109_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000109_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000109_10.pfm 212 | kitti_2012/training/colored_0/000158_10.png kitti_2012/training/colored_1/000158_10.png kitti_2012/training/disp_occ/000158_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000158_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000158_10.pfm 213 | kitti_2012/training/colored_0/000185_10.png kitti_2012/training/colored_1/000185_10.png kitti_2012/training/disp_occ/000185_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000185_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000185_10.pfm 214 | kitti_2012/training/colored_0/000153_10.png kitti_2012/training/colored_1/000153_10.png kitti_2012/training/disp_occ/000153_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000153_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000153_10.pfm 215 | kitti_2012/training/colored_0/000043_10.png kitti_2012/training/colored_1/000043_10.png kitti_2012/training/disp_occ/000043_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000043_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000043_10.pfm 216 | kitti_2012/training/colored_0/000030_10.png kitti_2012/training/colored_1/000030_10.png kitti_2012/training/disp_occ/000030_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000030_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000030_10.pfm 217 | kitti_2012/training/colored_0/000163_10.png kitti_2012/training/colored_1/000163_10.png kitti_2012/training/disp_occ/000163_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000163_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000163_10.pfm 218 | kitti_2012/training/colored_0/000159_10.png kitti_2012/training/colored_1/000159_10.png kitti_2012/training/disp_occ/000159_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000159_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000159_10.pfm 219 | kitti_2012/training/colored_0/000132_10.png kitti_2012/training/colored_1/000132_10.png kitti_2012/training/disp_occ/000132_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000132_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000132_10.pfm 220 | kitti_2012/training/colored_0/000193_10.png kitti_2012/training/colored_1/000193_10.png kitti_2012/training/disp_occ/000193_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000193_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000193_10.pfm 221 | kitti_2012/training/colored_0/000148_10.png kitti_2012/training/colored_1/000148_10.png kitti_2012/training/disp_occ/000148_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000148_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000148_10.pfm 222 | kitti_2012/training/colored_0/000017_10.png kitti_2012/training/colored_1/000017_10.png kitti_2012/training/disp_occ/000017_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000017_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000017_10.pfm 223 | kitti_2012/training/colored_0/000127_10.png kitti_2012/training/colored_1/000127_10.png kitti_2012/training/disp_occ/000127_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000127_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000127_10.pfm 224 | kitti_2012/training/colored_0/000046_10.png kitti_2012/training/colored_1/000046_10.png kitti_2012/training/disp_occ/000046_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000046_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000046_10.pfm 225 | kitti_2012/training/colored_0/000145_10.png kitti_2012/training/colored_1/000145_10.png kitti_2012/training/disp_occ/000145_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000145_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000145_10.pfm 226 | kitti_2012/training/colored_0/000134_10.png kitti_2012/training/colored_1/000134_10.png kitti_2012/training/disp_occ/000134_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000134_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000134_10.pfm 227 | kitti_2012/training/colored_0/000165_10.png kitti_2012/training/colored_1/000165_10.png kitti_2012/training/disp_occ/000165_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000165_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000165_10.pfm 228 | kitti_2012/training/colored_0/000143_10.png kitti_2012/training/colored_1/000143_10.png kitti_2012/training/disp_occ/000143_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000143_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000143_10.pfm 229 | kitti_2012/training/colored_0/000125_10.png kitti_2012/training/colored_1/000125_10.png kitti_2012/training/disp_occ/000125_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000125_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000125_10.pfm 230 | kitti_2012/training/colored_0/000101_10.png kitti_2012/training/colored_1/000101_10.png kitti_2012/training/disp_occ/000101_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000101_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000101_10.pfm 231 | kitti_2012/training/colored_0/000136_10.png kitti_2012/training/colored_1/000136_10.png kitti_2012/training/disp_occ/000136_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000136_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000136_10.pfm 232 | kitti_2012/training/colored_0/000146_10.png kitti_2012/training/colored_1/000146_10.png kitti_2012/training/disp_occ/000146_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000146_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000146_10.pfm 233 | kitti_2012/training/colored_0/000038_10.png kitti_2012/training/colored_1/000038_10.png kitti_2012/training/disp_occ/000038_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000038_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000038_10.pfm 234 | kitti_2012/training/colored_0/000180_10.png kitti_2012/training/colored_1/000180_10.png kitti_2012/training/disp_occ/000180_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000180_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000180_10.pfm 235 | kitti_2012/training/colored_0/000124_10.png kitti_2012/training/colored_1/000124_10.png kitti_2012/training/disp_occ/000124_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000124_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000124_10.pfm 236 | kitti_2012/training/colored_0/000104_10.png kitti_2012/training/colored_1/000104_10.png kitti_2012/training/disp_occ/000104_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000104_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000104_10.pfm 237 | kitti_2012/training/colored_0/000035_10.png kitti_2012/training/colored_1/000035_10.png kitti_2012/training/disp_occ/000035_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000035_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000035_10.pfm 238 | kitti_2012/training/colored_0/000037_10.png kitti_2012/training/colored_1/000037_10.png kitti_2012/training/disp_occ/000037_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000037_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000037_10.pfm 239 | kitti_2012/training/colored_0/000093_10.png kitti_2012/training/colored_1/000093_10.png kitti_2012/training/disp_occ/000093_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000093_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000093_10.pfm 240 | kitti_2012/training/colored_0/000094_10.png kitti_2012/training/colored_1/000094_10.png kitti_2012/training/disp_occ/000094_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000094_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000094_10.pfm 241 | kitti_2012/training/colored_0/000161_10.png kitti_2012/training/colored_1/000161_10.png kitti_2012/training/disp_occ/000161_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000161_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000161_10.pfm 242 | kitti_2012/training/colored_0/000047_10.png kitti_2012/training/colored_1/000047_10.png kitti_2012/training/disp_occ/000047_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000047_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000047_10.pfm 243 | kitti_2012/training/colored_0/000110_10.png kitti_2012/training/colored_1/000110_10.png kitti_2012/training/disp_occ/000110_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000110_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000110_10.pfm 244 | kitti_2012/training/colored_0/000160_10.png kitti_2012/training/colored_1/000160_10.png kitti_2012/training/disp_occ/000160_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000160_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000160_10.pfm 245 | kitti_2012/training/colored_0/000079_10.png kitti_2012/training/colored_1/000079_10.png kitti_2012/training/disp_occ/000079_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000079_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000079_10.pfm 246 | kitti_2012/training/colored_0/000013_10.png kitti_2012/training/colored_1/000013_10.png kitti_2012/training/disp_occ/000013_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000013_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000013_10.pfm 247 | kitti_2012/training/colored_0/000126_10.png kitti_2012/training/colored_1/000126_10.png kitti_2012/training/disp_occ/000126_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000126_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000126_10.pfm 248 | kitti_2012/training/colored_0/000067_10.png kitti_2012/training/colored_1/000067_10.png kitti_2012/training/disp_occ/000067_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000067_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000067_10.pfm 249 | kitti_2012/training/colored_0/000050_10.png kitti_2012/training/colored_1/000050_10.png kitti_2012/training/disp_occ/000050_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000050_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000050_10.pfm 250 | kitti_2012/training/colored_0/000187_10.png kitti_2012/training/colored_1/000187_10.png kitti_2012/training/disp_occ/000187_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000187_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000187_10.pfm 251 | kitti_2012/training/colored_0/000033_10.png kitti_2012/training/colored_1/000033_10.png kitti_2012/training/disp_occ/000033_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000033_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000033_10.pfm 252 | kitti_2012/training/colored_0/000090_10.png kitti_2012/training/colored_1/000090_10.png kitti_2012/training/disp_occ/000090_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000090_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000090_10.pfm 253 | kitti_2012/training/colored_0/000128_10.png kitti_2012/training/colored_1/000128_10.png kitti_2012/training/disp_occ/000128_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000128_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000128_10.pfm 254 | kitti_2012/training/colored_0/000008_10.png kitti_2012/training/colored_1/000008_10.png kitti_2012/training/disp_occ/000008_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000008_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000008_10.pfm 255 | kitti_2012/training/colored_0/000062_10.png kitti_2012/training/colored_1/000062_10.png kitti_2012/training/disp_occ/000062_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000062_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000062_10.pfm 256 | kitti_2012/training/colored_0/000121_10.png kitti_2012/training/colored_1/000121_10.png kitti_2012/training/disp_occ/000121_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000121_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000121_10.pfm 257 | kitti_2012/training/colored_0/000080_10.png kitti_2012/training/colored_1/000080_10.png kitti_2012/training/disp_occ/000080_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000080_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000080_10.pfm 258 | kitti_2012/training/colored_0/000042_10.png kitti_2012/training/colored_1/000042_10.png kitti_2012/training/disp_occ/000042_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000042_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000042_10.pfm 259 | kitti_2012/training/colored_0/000011_10.png kitti_2012/training/colored_1/000011_10.png kitti_2012/training/disp_occ/000011_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000011_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000011_10.pfm 260 | kitti_2012/training/colored_0/000078_10.png kitti_2012/training/colored_1/000078_10.png kitti_2012/training/disp_occ/000078_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000078_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000078_10.pfm 261 | kitti_2012/training/colored_0/000041_10.png kitti_2012/training/colored_1/000041_10.png kitti_2012/training/disp_occ/000041_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000041_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000041_10.pfm 262 | kitti_2012/training/colored_0/000173_10.png kitti_2012/training/colored_1/000173_10.png kitti_2012/training/disp_occ/000173_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000173_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000173_10.pfm 263 | kitti_2012/training/colored_0/000119_10.png kitti_2012/training/colored_1/000119_10.png kitti_2012/training/disp_occ/000119_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000119_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000119_10.pfm 264 | kitti_2012/training/colored_0/000000_10.png kitti_2012/training/colored_1/000000_10.png kitti_2012/training/disp_occ/000000_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000000_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000000_10.pfm 265 | kitti_2012/training/colored_0/000014_10.png kitti_2012/training/colored_1/000014_10.png kitti_2012/training/disp_occ/000014_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000014_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000014_10.pfm 266 | kitti_2012/training/colored_0/000190_10.png kitti_2012/training/colored_1/000190_10.png kitti_2012/training/disp_occ/000190_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000190_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000190_10.pfm 267 | kitti_2012/training/colored_0/000154_10.png kitti_2012/training/colored_1/000154_10.png kitti_2012/training/disp_occ/000154_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000154_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000154_10.pfm 268 | kitti_2012/training/colored_0/000177_10.png kitti_2012/training/colored_1/000177_10.png kitti_2012/training/disp_occ/000177_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000177_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000177_10.pfm 269 | kitti_2012/training/colored_0/000001_10.png kitti_2012/training/colored_1/000001_10.png kitti_2012/training/disp_occ/000001_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000001_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000001_10.pfm 270 | kitti_2012/training/colored_0/000065_10.png kitti_2012/training/colored_1/000065_10.png kitti_2012/training/disp_occ/000065_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000065_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000065_10.pfm 271 | kitti_2012/training/colored_0/000028_10.png kitti_2012/training/colored_1/000028_10.png kitti_2012/training/disp_occ/000028_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000028_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000028_10.pfm 272 | kitti_2012/training/colored_0/000186_10.png kitti_2012/training/colored_1/000186_10.png kitti_2012/training/disp_occ/000186_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000186_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000186_10.pfm 273 | kitti_2012/training/colored_0/000034_10.png kitti_2012/training/colored_1/000034_10.png kitti_2012/training/disp_occ/000034_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000034_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000034_10.pfm 274 | kitti_2012/training/colored_0/000164_10.png kitti_2012/training/colored_1/000164_10.png kitti_2012/training/disp_occ/000164_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000164_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000164_10.pfm 275 | kitti_2012/training/colored_0/000141_10.png kitti_2012/training/colored_1/000141_10.png kitti_2012/training/disp_occ/000141_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000141_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000141_10.pfm 276 | kitti_2012/training/colored_0/000056_10.png kitti_2012/training/colored_1/000056_10.png kitti_2012/training/disp_occ/000056_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000056_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000056_10.pfm 277 | kitti_2012/training/colored_0/000025_10.png kitti_2012/training/colored_1/000025_10.png kitti_2012/training/disp_occ/000025_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000025_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000025_10.pfm 278 | kitti_2012/training/colored_0/000147_10.png kitti_2012/training/colored_1/000147_10.png kitti_2012/training/disp_occ/000147_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000147_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000147_10.pfm 279 | kitti_2012/training/colored_0/000091_10.png kitti_2012/training/colored_1/000091_10.png kitti_2012/training/disp_occ/000091_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000091_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000091_10.pfm 280 | kitti_2012/training/colored_0/000070_10.png kitti_2012/training/colored_1/000070_10.png kitti_2012/training/disp_occ/000070_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000070_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000070_10.pfm 281 | kitti_2012/training/colored_0/000040_10.png kitti_2012/training/colored_1/000040_10.png kitti_2012/training/disp_occ/000040_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000040_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000040_10.pfm 282 | kitti_2012/training/colored_0/000129_10.png kitti_2012/training/colored_1/000129_10.png kitti_2012/training/disp_occ/000129_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000129_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000129_10.pfm 283 | kitti_2012/training/colored_0/000020_10.png kitti_2012/training/colored_1/000020_10.png kitti_2012/training/disp_occ/000020_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000020_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000020_10.pfm 284 | kitti_2012/training/colored_0/000162_10.png kitti_2012/training/colored_1/000162_10.png kitti_2012/training/disp_occ/000162_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000162_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000162_10.pfm 285 | kitti_2012/training/colored_0/000099_10.png kitti_2012/training/colored_1/000099_10.png kitti_2012/training/disp_occ/000099_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000099_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000099_10.pfm 286 | kitti_2012/training/colored_0/000075_10.png kitti_2012/training/colored_1/000075_10.png kitti_2012/training/disp_occ/000075_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000075_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000075_10.pfm 287 | kitti_2012/training/colored_0/000061_10.png kitti_2012/training/colored_1/000061_10.png kitti_2012/training/disp_occ/000061_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000061_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000061_10.pfm 288 | kitti_2012/training/colored_0/000022_10.png kitti_2012/training/colored_1/000022_10.png kitti_2012/training/disp_occ/000022_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000022_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000022_10.pfm 289 | kitti_2012/training/colored_0/000183_10.png kitti_2012/training/colored_1/000183_10.png kitti_2012/training/disp_occ/000183_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000183_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000183_10.pfm 290 | kitti_2012/training/colored_0/000087_10.png kitti_2012/training/colored_1/000087_10.png kitti_2012/training/disp_occ/000087_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000087_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000087_10.pfm 291 | kitti_2012/training/colored_0/000131_10.png kitti_2012/training/colored_1/000131_10.png kitti_2012/training/disp_occ/000131_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000131_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000131_10.pfm 292 | kitti_2012/training/colored_0/000106_10.png kitti_2012/training/colored_1/000106_10.png kitti_2012/training/disp_occ/000106_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000106_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000106_10.pfm 293 | kitti_2012/training/colored_0/000066_10.png kitti_2012/training/colored_1/000066_10.png kitti_2012/training/disp_occ/000066_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000066_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000066_10.pfm 294 | kitti_2012/training/colored_0/000021_10.png kitti_2012/training/colored_1/000021_10.png kitti_2012/training/disp_occ/000021_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000021_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000021_10.pfm 295 | kitti_2012/training/colored_0/000144_10.png kitti_2012/training/colored_1/000144_10.png kitti_2012/training/disp_occ/000144_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000144_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000144_10.pfm 296 | kitti_2012/training/colored_0/000009_10.png kitti_2012/training/colored_1/000009_10.png kitti_2012/training/disp_occ/000009_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000009_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000009_10.pfm 297 | kitti_2012/training/colored_0/000081_10.png kitti_2012/training/colored_1/000081_10.png kitti_2012/training/disp_occ/000081_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000081_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000081_10.pfm 298 | kitti_2012/training/colored_0/000095_10.png kitti_2012/training/colored_1/000095_10.png kitti_2012/training/disp_occ/000095_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000095_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000095_10.pfm 299 | kitti_2012/training/colored_0/000049_10.png kitti_2012/training/colored_1/000049_10.png kitti_2012/training/disp_occ/000049_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000049_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000049_10.pfm 300 | kitti_2012/training/colored_0/000068_10.png kitti_2012/training/colored_1/000068_10.png kitti_2012/training/disp_occ/000068_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000068_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000068_10.pfm 301 | kitti_2012/training/colored_0/000138_10.png kitti_2012/training/colored_1/000138_10.png kitti_2012/training/disp_occ/000138_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000138_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000138_10.pfm 302 | kitti_2012/training/colored_0/000116_10.png kitti_2012/training/colored_1/000116_10.png kitti_2012/training/disp_occ/000116_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000116_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000116_10.pfm 303 | kitti_2012/training/colored_0/000089_10.png kitti_2012/training/colored_1/000089_10.png kitti_2012/training/disp_occ/000089_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000089_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000089_10.pfm 304 | kitti_2012/training/colored_0/000168_10.png kitti_2012/training/colored_1/000168_10.png kitti_2012/training/disp_occ/000168_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000168_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000168_10.pfm 305 | kitti_2012/training/colored_0/000071_10.png kitti_2012/training/colored_1/000071_10.png kitti_2012/training/disp_occ/000071_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000071_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000071_10.pfm 306 | kitti_2012/training/colored_0/000176_10.png kitti_2012/training/colored_1/000176_10.png kitti_2012/training/disp_occ/000176_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000176_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000176_10.pfm 307 | kitti_2012/training/colored_0/000072_10.png kitti_2012/training/colored_1/000072_10.png kitti_2012/training/disp_occ/000072_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000072_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000072_10.pfm 308 | kitti_2012/training/colored_0/000150_10.png kitti_2012/training/colored_1/000150_10.png kitti_2012/training/disp_occ/000150_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000150_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000150_10.pfm 309 | kitti_2012/training/colored_0/000114_10.png kitti_2012/training/colored_1/000114_10.png kitti_2012/training/disp_occ/000114_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000114_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000114_10.pfm 310 | kitti_2012/training/colored_0/000103_10.png kitti_2012/training/colored_1/000103_10.png kitti_2012/training/disp_occ/000103_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000103_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000103_10.pfm 311 | kitti_2012/training/colored_0/000188_10.png kitti_2012/training/colored_1/000188_10.png kitti_2012/training/disp_occ/000188_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000188_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000188_10.pfm 312 | kitti_2012/training/colored_0/000026_10.png kitti_2012/training/colored_1/000026_10.png kitti_2012/training/disp_occ/000026_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000026_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000026_10.pfm 313 | kitti_2012/training/colored_0/000155_10.png kitti_2012/training/colored_1/000155_10.png kitti_2012/training/disp_occ/000155_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000155_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000155_10.pfm 314 | kitti_2012/training/colored_0/000120_10.png kitti_2012/training/colored_1/000120_10.png kitti_2012/training/disp_occ/000120_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000120_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000120_10.pfm 315 | kitti_2012/training/colored_0/000111_10.png kitti_2012/training/colored_1/000111_10.png kitti_2012/training/disp_occ/000111_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000111_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000111_10.pfm 316 | kitti_2012/training/colored_0/000036_10.png kitti_2012/training/colored_1/000036_10.png kitti_2012/training/disp_occ/000036_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000036_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000036_10.pfm 317 | kitti_2012/training/colored_0/000100_10.png kitti_2012/training/colored_1/000100_10.png kitti_2012/training/disp_occ/000100_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000100_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000100_10.pfm 318 | kitti_2012/training/colored_0/000016_10.png kitti_2012/training/colored_1/000016_10.png kitti_2012/training/disp_occ/000016_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000016_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000016_10.pfm 319 | kitti_2012/training/colored_0/000113_10.png kitti_2012/training/colored_1/000113_10.png kitti_2012/training/disp_occ/000113_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000113_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000113_10.pfm 320 | kitti_2012/training/colored_0/000107_10.png kitti_2012/training/colored_1/000107_10.png kitti_2012/training/disp_occ/000107_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000107_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000107_10.pfm 321 | kitti_2012/training/colored_0/000097_10.png kitti_2012/training/colored_1/000097_10.png kitti_2012/training/disp_occ/000097_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000097_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000097_10.pfm 322 | kitti_2012/training/colored_0/000006_10.png kitti_2012/training/colored_1/000006_10.png kitti_2012/training/disp_occ/000006_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000006_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000006_10.pfm 323 | kitti_2012/training/colored_0/000002_10.png kitti_2012/training/colored_1/000002_10.png kitti_2012/training/disp_occ/000002_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000002_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000002_10.pfm 324 | kitti_2012/training/colored_0/000178_10.png kitti_2012/training/colored_1/000178_10.png kitti_2012/training/disp_occ/000178_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000178_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000178_10.pfm 325 | kitti_2012/training/colored_0/000063_10.png kitti_2012/training/colored_1/000063_10.png kitti_2012/training/disp_occ/000063_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000063_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000063_10.pfm 326 | kitti_2012/training/colored_0/000171_10.png kitti_2012/training/colored_1/000171_10.png kitti_2012/training/disp_occ/000171_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000171_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000171_10.pfm 327 | kitti_2012/training/colored_0/000031_10.png kitti_2012/training/colored_1/000031_10.png kitti_2012/training/disp_occ/000031_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000031_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000031_10.pfm 328 | kitti_2012/training/colored_0/000088_10.png kitti_2012/training/colored_1/000088_10.png kitti_2012/training/disp_occ/000088_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000088_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000088_10.pfm 329 | kitti_2012/training/colored_0/000069_10.png kitti_2012/training/colored_1/000069_10.png kitti_2012/training/disp_occ/000069_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000069_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000069_10.pfm 330 | kitti_2012/training/colored_0/000192_10.png kitti_2012/training/colored_1/000192_10.png kitti_2012/training/disp_occ/000192_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000192_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000192_10.pfm 331 | kitti_2012/training/colored_0/000015_10.png kitti_2012/training/colored_1/000015_10.png kitti_2012/training/disp_occ/000015_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000015_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000015_10.pfm 332 | kitti_2012/training/colored_0/000156_10.png kitti_2012/training/colored_1/000156_10.png kitti_2012/training/disp_occ/000156_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000156_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000156_10.pfm 333 | kitti_2012/training/colored_0/000023_10.png kitti_2012/training/colored_1/000023_10.png kitti_2012/training/disp_occ/000023_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000023_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000023_10.pfm 334 | kitti_2012/training/colored_0/000052_10.png kitti_2012/training/colored_1/000052_10.png kitti_2012/training/disp_occ/000052_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000052_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000052_10.pfm 335 | kitti_2012/training/colored_0/000105_10.png kitti_2012/training/colored_1/000105_10.png kitti_2012/training/disp_occ/000105_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000105_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000105_10.pfm 336 | kitti_2012/training/colored_0/000152_10.png kitti_2012/training/colored_1/000152_10.png kitti_2012/training/disp_occ/000152_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000152_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000152_10.pfm 337 | kitti_2012/training/colored_0/000024_10.png kitti_2012/training/colored_1/000024_10.png kitti_2012/training/disp_occ/000024_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000024_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000024_10.pfm 338 | kitti_2012/training/colored_0/000157_10.png kitti_2012/training/colored_1/000157_10.png kitti_2012/training/disp_occ/000157_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000157_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000157_10.pfm 339 | kitti_2012/training/colored_0/000118_10.png kitti_2012/training/colored_1/000118_10.png kitti_2012/training/disp_occ/000118_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000118_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000118_10.pfm 340 | kitti_2012/training/colored_0/000179_10.png kitti_2012/training/colored_1/000179_10.png kitti_2012/training/disp_occ/000179_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000179_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000179_10.pfm 341 | kitti_2012/training/colored_0/000166_10.png kitti_2012/training/colored_1/000166_10.png kitti_2012/training/disp_occ/000166_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000166_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000166_10.pfm 342 | kitti_2012/training/colored_0/000151_10.png kitti_2012/training/colored_1/000151_10.png kitti_2012/training/disp_occ/000151_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000151_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000151_10.pfm 343 | kitti_2012/training/colored_0/000123_10.png kitti_2012/training/colored_1/000123_10.png kitti_2012/training/disp_occ/000123_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000123_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000123_10.pfm 344 | kitti_2012/training/colored_0/000098_10.png kitti_2012/training/colored_1/000098_10.png kitti_2012/training/disp_occ/000098_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000098_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000098_10.pfm 345 | kitti_2012/training/colored_0/000032_10.png kitti_2012/training/colored_1/000032_10.png kitti_2012/training/disp_occ/000032_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000032_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000032_10.pfm 346 | kitti_2012/training/colored_0/000053_10.png kitti_2012/training/colored_1/000053_10.png kitti_2012/training/disp_occ/000053_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000053_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000053_10.pfm 347 | -------------------------------------------------------------------------------- /filenames/shuffled_kitti12_val.txt: -------------------------------------------------------------------------------- 1 | kitti_2012/training/colored_0/000003_10.png kitti_2012/training/colored_1/000003_10.png kitti_2012/training/disp_occ/000003_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000003_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000003_10.pfm 2 | kitti_2012/training/colored_0/000096_10.png kitti_2012/training/colored_1/000096_10.png kitti_2012/training/disp_occ/000096_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000096_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000096_10.pfm 3 | kitti_2012/training/colored_0/000092_10.png kitti_2012/training/colored_1/000092_10.png kitti_2012/training/disp_occ/000092_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000092_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000092_10.pfm 4 | kitti_2012/training/colored_0/000018_10.png kitti_2012/training/colored_1/000018_10.png kitti_2012/training/disp_occ/000018_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000018_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000018_10.pfm 5 | kitti_2012/training/colored_0/000074_10.png kitti_2012/training/colored_1/000074_10.png kitti_2012/training/disp_occ/000074_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000074_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000074_10.pfm 6 | kitti_2012/training/colored_0/000137_10.png kitti_2012/training/colored_1/000137_10.png kitti_2012/training/disp_occ/000137_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000137_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000137_10.pfm 7 | kitti_2012/training/colored_0/000051_10.png kitti_2012/training/colored_1/000051_10.png kitti_2012/training/disp_occ/000051_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000051_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000051_10.pfm 8 | kitti_2012/training/colored_0/000029_10.png kitti_2012/training/colored_1/000029_10.png kitti_2012/training/disp_occ/000029_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000029_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000029_10.pfm 9 | kitti_2012/training/colored_0/000175_10.png kitti_2012/training/colored_1/000175_10.png kitti_2012/training/disp_occ/000175_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000175_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000175_10.pfm 10 | kitti_2012/training/colored_0/000135_10.png kitti_2012/training/colored_1/000135_10.png kitti_2012/training/disp_occ/000135_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000135_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000135_10.pfm 11 | kitti_2012/training/colored_0/000007_10.png kitti_2012/training/colored_1/000007_10.png kitti_2012/training/disp_occ/000007_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000007_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000007_10.pfm 12 | kitti_2012/training/colored_0/000172_10.png kitti_2012/training/colored_1/000172_10.png kitti_2012/training/disp_occ/000172_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000172_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000172_10.pfm 13 | kitti_2012/training/colored_0/000102_10.png kitti_2012/training/colored_1/000102_10.png kitti_2012/training/disp_occ/000102_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000102_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000102_10.pfm 14 | kitti_2012/training/colored_0/000039_10.png kitti_2012/training/colored_1/000039_10.png kitti_2012/training/disp_occ/000039_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000039_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000039_10.pfm 15 | kitti_2012/training/colored_0/000140_10.png kitti_2012/training/colored_1/000140_10.png kitti_2012/training/disp_occ/000140_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000140_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000140_10.pfm 16 | kitti_2012/training/colored_0/000064_10.png kitti_2012/training/colored_1/000064_10.png kitti_2012/training/disp_occ/000064_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000064_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000064_10.pfm 17 | kitti_2012/training/colored_0/000189_10.png kitti_2012/training/colored_1/000189_10.png kitti_2012/training/disp_occ/000189_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000189_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000189_10.pfm 18 | kitti_2012/training/colored_0/000019_10.png kitti_2012/training/colored_1/000019_10.png kitti_2012/training/disp_occ/000019_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000019_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000019_10.pfm 19 | kitti_2012/training/colored_0/000139_10.png kitti_2012/training/colored_1/000139_10.png kitti_2012/training/disp_occ/000139_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000139_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000139_10.pfm 20 | kitti_2012/training/colored_0/000076_10.png kitti_2012/training/colored_1/000076_10.png kitti_2012/training/disp_occ/000076_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000076_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000076_10.pfm 21 | kitti_2012/training/colored_0/000122_10.png kitti_2012/training/colored_1/000122_10.png kitti_2012/training/disp_occ/000122_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000122_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000122_10.pfm 22 | kitti_2012/training/colored_0/000054_10.png kitti_2012/training/colored_1/000054_10.png kitti_2012/training/disp_occ/000054_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000054_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000054_10.pfm 23 | kitti_2012/training/colored_0/000077_10.png kitti_2012/training/colored_1/000077_10.png kitti_2012/training/disp_occ/000077_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000077_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000077_10.pfm 24 | kitti_2012/training/colored_0/000027_10.png kitti_2012/training/colored_1/000027_10.png kitti_2012/training/disp_occ/000027_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000027_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000027_10.pfm 25 | kitti_2012/training/colored_0/000142_10.png kitti_2012/training/colored_1/000142_10.png kitti_2012/training/disp_occ/000142_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000142_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000142_10.pfm 26 | kitti_2012/training/colored_0/000184_10.png kitti_2012/training/colored_1/000184_10.png kitti_2012/training/disp_occ/000184_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000184_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000184_10.pfm 27 | kitti_2012/training/colored_0/000191_10.png kitti_2012/training/colored_1/000191_10.png kitti_2012/training/disp_occ/000191_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000191_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000191_10.pfm 28 | kitti_2012/training/colored_0/000005_10.png kitti_2012/training/colored_1/000005_10.png kitti_2012/training/disp_occ/000005_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000005_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000005_10.pfm 29 | kitti_2012/training/colored_0/000044_10.png kitti_2012/training/colored_1/000044_10.png kitti_2012/training/disp_occ/000044_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000044_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000044_10.pfm 30 | kitti_2012/training/colored_0/000181_10.png kitti_2012/training/colored_1/000181_10.png kitti_2012/training/disp_occ/000181_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000181_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000181_10.pfm 31 | kitti_2012/training/colored_0/000084_10.png kitti_2012/training/colored_1/000084_10.png kitti_2012/training/disp_occ/000084_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000084_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000084_10.pfm 32 | kitti_2012/training/colored_0/000012_10.png kitti_2012/training/colored_1/000012_10.png kitti_2012/training/disp_occ/000012_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000012_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000012_10.pfm 33 | kitti_2012/training/colored_0/000170_10.png kitti_2012/training/colored_1/000170_10.png kitti_2012/training/disp_occ/000170_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000170_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000170_10.pfm 34 | kitti_2012/training/colored_0/000115_10.png kitti_2012/training/colored_1/000115_10.png kitti_2012/training/disp_occ/000115_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000115_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000115_10.pfm 35 | kitti_2012/training/colored_0/000182_10.png kitti_2012/training/colored_1/000182_10.png kitti_2012/training/disp_occ/000182_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000182_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000182_10.pfm 36 | kitti_2012/training/colored_0/000004_10.png kitti_2012/training/colored_1/000004_10.png kitti_2012/training/disp_occ/000004_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000004_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000004_10.pfm 37 | kitti_2012/training/colored_0/000010_10.png kitti_2012/training/colored_1/000010_10.png kitti_2012/training/disp_occ/000010_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000010_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000010_10.pfm 38 | kitti_2012/training/colored_0/000058_10.png kitti_2012/training/colored_1/000058_10.png kitti_2012/training/disp_occ/000058_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000058_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000058_10.pfm 39 | kitti_2012/training/colored_0/000048_10.png kitti_2012/training/colored_1/000048_10.png kitti_2012/training/disp_occ/000048_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000048_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000048_10.pfm 40 | kitti_2012/training/colored_0/000060_10.png kitti_2012/training/colored_1/000060_10.png kitti_2012/training/disp_occ/000060_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000060_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000060_10.pfm 41 | kitti_2012/training/colored_0/000108_10.png kitti_2012/training/colored_1/000108_10.png kitti_2012/training/disp_occ/000108_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000108_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000108_10.pfm 42 | kitti_2012/training/colored_0/000133_10.png kitti_2012/training/colored_1/000133_10.png kitti_2012/training/disp_occ/000133_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000133_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000133_10.pfm 43 | kitti_2012/training/colored_0/000149_10.png kitti_2012/training/colored_1/000149_10.png kitti_2012/training/disp_occ/000149_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000149_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000149_10.pfm 44 | kitti_2012/training/colored_0/000082_10.png kitti_2012/training/colored_1/000082_10.png kitti_2012/training/disp_occ/000082_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000082_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000082_10.pfm 45 | kitti_2012/training/colored_0/000059_10.png kitti_2012/training/colored_1/000059_10.png kitti_2012/training/disp_occ/000059_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000059_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000059_10.pfm 46 | kitti_2012/training/colored_0/000086_10.png kitti_2012/training/colored_1/000086_10.png kitti_2012/training/disp_occ/000086_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000086_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000086_10.pfm 47 | kitti_2012/training/colored_0/000083_10.png kitti_2012/training/colored_1/000083_10.png kitti_2012/training/disp_occ/000083_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000083_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000083_10.pfm 48 | kitti_2012/training/colored_0/000045_10.png kitti_2012/training/colored_1/000045_10.png kitti_2012/training/disp_occ/000045_10.png kt12_full_disparity_plane/disp_occ/dense/dx/000045_10.pfm kt12_full_disparity_plane/disp_occ/dense/dy/000045_10.pfm 49 | -------------------------------------------------------------------------------- /kitti.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -x 3 | DATAPATH=YOUR_DATAPATH 4 | LOGDIR=DIR_TO_SAVE_TRAINING_LOG 5 | CUDA_VISIBLE_DEVICES=0 python main.py --dataset kitti \ 6 | --datapath $DATAPATH --trainlist ./filenames/kitti_train.txt --testlist ./filenames/shuffled_kitti12_val.txt \ 7 | --logdir $LOGDIR \ 8 | --ckpt_start_epoch 4713 --summary_freq 1000 \ 9 | --epochs 4713 --lrepochs "4598,4690:4,2.5" \ 10 | --batch_size 4 --test_batch_size 8 \ 11 | --lr 0.0004 \ 12 | --maxdisp 256 13 | -------------------------------------------------------------------------------- /loss/initialization_loss.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn.functional as F 3 | import pdb 4 | 5 | 6 | def init_loss(pred_init_cost: torch.Tensor, d_gt: torch.Tensor, maxdisp, beta=1): 7 | """ 8 | Initialization loss, HITNet paper eqt(10 9 | :param pred_init_cost: 10 | :param d_gt: 11 | :param beta: 12 | :return: init loss [B*1*H*W] 13 | """ 14 | cost_gt = subpix_cost(pred_init_cost, d_gt, maxdisp) 15 | cost_nm = torch.gather(pred_init_cost, 1, get_non_match_disp(pred_init_cost, d_gt)) 16 | loss = cost_gt + F.relu(beta - cost_nm) 17 | # pdb.set_trace() 18 | return loss 19 | 20 | 21 | def subpix_cost(cost: torch.Tensor, disp: torch.Tensor, maxdisp: int): 22 | """ 23 | phi, e.g. eqt(9) in HITNet paper 24 | :param cost: 25 | :param disp: 26 | :return: 27 | """ 28 | # pdb.set_trace() 29 | disp[disp >= maxdisp - 1] = maxdisp - 2 30 | disp[disp < 0] = 0 31 | disp_floor = disp.floor() 32 | sub_cost = (disp - disp_floor) * torch.gather(cost, 1, disp_floor.long()+1) + (disp_floor + 1 - disp) * torch.gather(cost, 1, disp_floor.long()) 33 | # pdb.set_trace() 34 | return sub_cost 35 | 36 | 37 | def get_non_match_disp(pred_init_cost: torch.Tensor, d_gt: torch.Tensor): 38 | """ 39 | HITNet paper, eqt (11) 40 | :param pred_init_cost: B, D, H, W 41 | :param d_gt: B, 1, H, W 42 | :return: LongTensor: min_non_match_disp: B, 1, H, W 43 | """ 44 | B, D, H, W = pred_init_cost.size() 45 | disp_cand = torch.arange(0, D, step=1, device=d_gt.device).view(1, -1, 1, 1).repeat(B, 1, H, W).float() 46 | match_disp_lower_bound = d_gt - 1.5 47 | match_disp_upper_bound = d_gt + 1.5 48 | INF = torch.Tensor([float("Inf")]).view(1, 1, 1, 1).repeat(B, D, H, W).to(d_gt.device) 49 | tmp_cost = torch.where((disp_cand < match_disp_lower_bound) | (disp_cand > match_disp_upper_bound), pred_init_cost, INF) 50 | # pdb.set_trace() 51 | __, min_non_match_disp = torch.min(tmp_cost, dim=1, keepdim=True) 52 | # pdb.set_trace() 53 | return min_non_match_disp 54 | 55 | # 56 | # if __name__ == '__main__': 57 | # cost = torch.rand(1, 12, 2, 2) 58 | # d_gt = torch.rand(1, 1, 2, 2)*4 59 | # output_cost = init_loss(cost, d_gt) 60 | # pdb.set_trace() 61 | 62 | 63 | -------------------------------------------------------------------------------- /loss/propagation_loss.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn.functional as F 3 | import pdb 4 | import math 5 | 6 | 7 | def prop_loss(d_diff, A=1, alpha=1, c=0.1): 8 | """ 9 | Loss from HITNet eqt(12 10 | :param d_diff: d^gt - d^ 11 | :param A: The truncation value 12 | :param alpha: shape param 13 | :param c > 0: scale param 14 | :return: torch.Tensor: L^prop [B*1*H*W] 15 | """ 16 | rho = echo_loss(d_diff, alpha, c) 17 | A = torch.ones_like(rho) * A 18 | loss = torch.where(rho < A, rho, A) 19 | # pdb.set_trace() 20 | return loss 21 | 22 | 23 | def echo_loss(x, alpha, c): 24 | """ 25 | An amazing loss function presented in paper: A General and Adaptive Robust Loss Function (CVPR 2019). 26 | The name prefix 'echo' is the name of a hero in Overwatch who can become any other hero during her ultimate 27 | :param x: torch.Tensor 28 | :param alpha: shape param 29 | :param c > 0: scale param 30 | :return: torch.Tensor: loss 31 | """ 32 | loss = (abs(alpha - 2) / alpha) * ((((x / c)**2) / abs(alpha - 2) + 1)**(alpha / 2) - 1) 33 | return loss 34 | 35 | 36 | def slant_loss(dx, dy, dx_gt, dy_gt, d_diff, mask, B=1): 37 | closer_mask = d_diff < B 38 | mask = mask * closer_mask # mask and 39 | slant_diff = torch.cat([dx_gt-dx, dy_gt-dy], dim=1) 40 | loss = torch.norm(slant_diff, p=1, dim=1, keepdim=True)[mask] 41 | # print('slant_loss: {:.3f}'.format(loss.mean())) 42 | # print('dx_gt mean: {:.3f}, dy_gt mean: {:.3f}'.format(dx_gt.mean(), dy_gt.mean())) 43 | return loss # 1-dim vector 44 | 45 | 46 | def w_loss(conf, diff, mask, C1=1, C2=1.5): 47 | """ 48 | 49 | :param conf: aka omega 50 | :param diff: d^gt - d^ 51 | :param C1: 52 | :param C2: 53 | :return: torch.Tensor: loss 54 | """ 55 | closer_mask = diff < C1 56 | further_mask = diff > C2 57 | mask = mask * (closer_mask + further_mask) # mask and 58 | closer_item = F.relu(1 - conf) 59 | further_item = F.relu(conf) 60 | # pdb.set_trace() 61 | loss = closer_item * closer_mask.float() + further_item * further_mask.float() 62 | return loss[mask] # 1-dim vector 63 | 64 | 65 | # if __name__ == '__main__': 66 | # cost = torch.rand(1, 12, 2, 2) 67 | # conf = (torch.rand(1, 1, 2, 2).cuda() - 1) * 4 68 | # d_gt = torch.rand(1, 1, 2, 2) * 4 69 | # d_pred = torch.rand(1, 1, 2, 2) * 4 70 | # d_diff = d_gt.cuda() - d_pred.cuda() 71 | # prop_loss = w_loss(conf, d_diff, 1, 1) 72 | # pdb.set_trace() 73 | -------------------------------------------------------------------------------- /loss/total_loss.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn.functional as F 3 | from loss.initialization_loss import init_loss 4 | from loss.propagation_loss import prop_loss, slant_loss, w_loss 5 | 6 | 7 | def global_loss(init_cv_cost_pyramid, prop_disp_pyramid, dx_pyramid, dy_pyramid, w_pyramid, 8 | d_gt, dx_gt, dy_gt, maxdisp, 9 | lambda_init=1, lambda_prop=1, lambda_slant=1, lambda_w=1): 10 | """ 11 | 12 | :param init_cv_cost_pyramid: 13 | :param prop_disp_pyramid: 14 | :param slant_pyramid: 15 | :param w_pyramid: 16 | :param d_gt: 17 | :param maxdisp: 18 | :param loss_init: 19 | :param loss_prop: 20 | :param loss_slant: 21 | :param loss_w: 22 | :param lambda_init: 23 | :param lambda_prop: 24 | :param lambda_slant: 25 | :param lambda_w: 26 | :return: 27 | """ 28 | # if len(d_gt.shape) == 3: 29 | # d_gt = d_gt.unsqueeze(1) 30 | # if len(dx_gt.shape) == 3: 31 | # dx_gt = dx_gt.unsqueeze(1) 32 | # if len(dy_gt.shape) == 3: 33 | # dy_gt = dy_gt.unsqueeze(1) 34 | 35 | d_gt_pyramid = [] 36 | for i in range(len(init_cv_cost_pyramid)): 37 | scale = 4 * (2 ** i) # 4,8,16,32,64 38 | d_gt_pyramid.append(torch.nn.MaxPool2d(scale, scale)(d_gt)/(scale/4)) 39 | d_gt_pyramid.reverse() # disp ground truth generation. From small to large. 40 | 41 | init_loss_pyramid = [] 42 | for i, cv in enumerate(init_cv_cost_pyramid): 43 | # pdb.set_trace() 44 | mask = (d_gt_pyramid[i] > 0) & (d_gt_pyramid[i] < maxdisp/(2**(len(init_cv_cost_pyramid)-1-i))) 45 | init_loss_pyramid.append( 46 | lambda_init * init_loss(cv, d_gt_pyramid[i], maxdisp/(2**(len(init_cv_cost_pyramid)-1-i)))[mask] 47 | ) 48 | # pdb.set_trace() 49 | init_loss_vec = torch.cat(init_loss_pyramid, dim=0) # 1-dim vector 50 | # pdb.set_trace() 51 | 52 | prop_loss_pyramid = [] # masked 53 | prop_diff_pyramid = [] # not masked 54 | mask = (d_gt > 0) & (d_gt < maxdisp) 55 | prop_loss_weights = [1/64, 1/32, 1/32, 1/16, 1/16, 1/8, 1/8, 1/4, 1/4, 1/4, 1/2, 1] 56 | for i, disp in enumerate(prop_disp_pyramid): 57 | prop_diff_pyramid.append( 58 | torch.abs(d_gt - disp) 59 | ) 60 | prop_loss_pyramid.append( 61 | lambda_prop * prop_loss_weights[i] * prop_loss(prop_diff_pyramid[-1], 10000)[mask] 62 | ) 63 | # pdb.set_trace() 64 | prop_loss_vec = torch.cat(prop_loss_pyramid, dim=0) 65 | # pdb.set_trace() 66 | 67 | slant_loss_pyramid = [] 68 | slant_loss_weights = [1/64, 1/32, 1/32, 1/16, 1/16, 1/8, 1/8, 1/4, 1/4, 1/4, 1/2] 69 | for i in range(len(dx_pyramid)): 70 | # print(i) 71 | slant_loss_pyramid.append( 72 | lambda_slant * slant_loss_weights[i] * slant_loss(dx_pyramid[i], dy_pyramid[i], dx_gt, dy_gt, prop_diff_pyramid[i], mask) 73 | ) 74 | slant_loss_vec = torch.cat(slant_loss_pyramid, dim=0) 75 | # pdb.set_trace() 76 | 77 | w_loss_pyramid = [] 78 | w_loss_weights = [1/32, 1/32, 1/16, 1/16, 1/8, 1/8, 1/4, 1/4] 79 | for i, w in enumerate(w_pyramid): 80 | w_loss_pyramid.append( 81 | lambda_w * w_loss_weights[i] * w_loss(w, prop_diff_pyramid[i+1], mask) # index for prop_diff_pyramid plus 1 since there is no confidence at 1st level 82 | ) 83 | w_loss_vec = torch.cat(w_loss_pyramid, dim=0) 84 | # pdb.set_trace() 85 | 86 | total_loss_vec = torch.cat([init_loss_vec, prop_loss_vec, slant_loss_vec, w_loss_vec], dim=0) 87 | # pdb.set_trace() 88 | 89 | return torch.mean(total_loss_vec) 90 | 91 | 92 | # def total_loss(init_cv_pyramid, prop_disp_pyramid, slant_pyramid, w_pyramid, d_gt_pyramid): 93 | # """ 94 | # calculate final loss 95 | # 96 | # :param init_cv_pyramid: output of init module of network. None in the post-prop (16x, 8x, 4x, 2x, 1x) 97 | # :param prop_disp_pyramid: output hypothesis disparity of prop module(64x, 32x, 16x, 8x, 4x, 2x, 1x) 98 | # :param slant_pyramid: dx and dy of slants(64x, 32x, 16x, 8x, 4x, 2x, 1x) 99 | # :param w_pyramid: confidence. none in the first and post-prop(32x, 16x, 8x, 4x) 100 | # :param d_gt_pyramid: disparity groundtruth pyramid (from small to large)(64x, 32x, 16x, 8x, 4x, 2x, 1x) 101 | # :return: scalar, weighted sum of all loss 102 | # """ 103 | # for i, hyp in enumerate(d_gt_pyramid): 104 | # if i == 0: 105 | # loss_init = ini 106 | # loss_vec = loss.reshape(-1) 107 | # if i == 0: 108 | # all_loss_vec = loss_vec 109 | # else: 110 | # all_loss_vec = torch.cat([all_loss_vec, loss_vec], 0) 111 | # 112 | # return torch.mean(all_loss_vec) 113 | 114 | 115 | if __name__ == '__main__': 116 | import pdb 117 | import os 118 | import time 119 | 120 | os.environ["CUDA_VISIBLE_DEVICES"] = "9" 121 | maxdisp = 256 122 | img_h = 256 123 | img_w = 512 124 | bs = 4 125 | M = 5 # corresponding to M=4 in paper 126 | init_cv_cost_pyramid = [] 127 | for i in range(M): 128 | scale = 2**(M-i-1) 129 | init_cv_cost_pyramid.append( 130 | torch.rand(bs, maxdisp//scale, img_h//(scale*4), img_w//(scale*4)).cuda() * 5. 131 | ) 132 | 133 | prop_disp_pyramid = [] 134 | dx_pyramid = [] 135 | dy_pyramid = [] 136 | for i in range(M+2): 137 | prop_disp_pyramid.append( 138 | (torch.rand(bs, 1, img_h, img_w).cuda() - 0.5) * 10. 139 | ) 140 | dx_pyramid.append( 141 | torch.rand(bs, 1, img_h, img_w).cuda() - 0.5 142 | ) 143 | dy_pyramid.append( 144 | torch.rand(bs, 1, img_h, img_w).cuda() - 0.5 145 | ) 146 | 147 | w_pyramid = [] 148 | for i in range(M-1): 149 | w_pyramid.append( 150 | torch.rand(bs, 1, img_h, img_w).cuda() 151 | ) 152 | 153 | d_gt = (torch.rand(bs, 1, img_h, img_w).cuda() - 0.5) * 10. 154 | dx_gt = torch.rand(bs, 1, img_h, img_w).cuda() - 0.5 155 | dy_gt = torch.rand(bs, 1, img_h, img_w).cuda() - 0.5 156 | for _ in range(1): 157 | st_time = time.time() 158 | loss = global_loss(init_cv_cost_pyramid, prop_disp_pyramid, dx_pyramid, dy_pyramid, w_pyramid, 159 | d_gt, dx_gt, dy_gt, maxdisp) 160 | print('Time: {:.3f}'.format(time.time() - st_time)) 161 | pdb.set_trace() 162 | 163 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function, division 2 | import argparse 3 | import os 4 | import torch 5 | import torch.nn as nn 6 | import torch.nn.parallel 7 | import torch.backends.cudnn as cudnn 8 | import torch.optim as optim 9 | import torch.utils.data 10 | from torch.autograd import Variable 11 | import torchvision.utils as vutils 12 | import torch.nn.functional as F 13 | import numpy as np 14 | import time 15 | from tensorboardX import SummaryWriter 16 | from datasets import __datasets__ 17 | from models.HITNet import HITNet 18 | from loss.total_loss import global_loss 19 | from loss.propagation_loss import prop_loss 20 | from utils import * 21 | from torch.utils.data import DataLoader 22 | import gc 23 | import json 24 | from datetime import datetime 25 | from utils.saver import Saver 26 | import pdb 27 | 28 | cudnn.benchmark = True 29 | 30 | parser = argparse.ArgumentParser(description='HITNet') 31 | parser.add_argument('--maxdisp', type=int, default=192, help='maximum disparity') 32 | parser.add_argument('--fea_c', type=list, default=[32, 24, 24, 16, 16], help='feature extraction channels') 33 | 34 | parser.add_argument('--dataset', required=True, help='dataset name', choices=__datasets__.keys()) 35 | parser.add_argument('--datapath', required=True, help='data path') 36 | parser.add_argument('--trainlist', required=True, help='training list') 37 | parser.add_argument('--testlist', required=True, help='testing list') 38 | 39 | parser.add_argument('--lr', type=float, default=0.001, help='base learning rate') 40 | parser.add_argument('--batch_size', type=int, default=16, help='training batch size') 41 | parser.add_argument('--test_batch_size', type=int, default=8, help='testing batch size') 42 | parser.add_argument('--epochs', type=int, required=True, help='number of epochs to train') 43 | parser.add_argument('--lrepochs', type=str, required=True, help='the epochs to decay lr: the downscale rate') 44 | parser.add_argument('--ckpt_start_epoch', type=int, default=0, help='the epochs at which the program start saving ckpt') 45 | 46 | parser.add_argument('--logdir', required=True, help='the directory to save logs and checkpoints') 47 | parser.add_argument('--loadckpt', help='load the weights from a specific checkpoint') 48 | parser.add_argument('--resume', type=str, help='continue training the model') 49 | parser.add_argument('--seed', type=int, default=1, metavar='S', help='random seed (default: 1)') 50 | 51 | parser.add_argument('--summary_freq', type=int, default=20, help='the frequency of saving summary') 52 | parser.add_argument('--save_freq', type=int, default=1, help='the frequency of saving checkpoint') 53 | 54 | # parse arguments, set seeds 55 | args = parser.parse_args() 56 | torch.manual_seed(args.seed) 57 | torch.cuda.manual_seed(args.seed) 58 | os.makedirs(args.logdir, exist_ok=True) 59 | 60 | # create summary logger 61 | saver = Saver(args) 62 | print("creating new summary file") 63 | logger = SummaryWriter(saver.experiment_dir) 64 | 65 | logfilename = saver.experiment_dir + '/log.txt' 66 | 67 | with open(logfilename, 'a') as log: # wrt running information to log 68 | log.write('\n\n\n\n') 69 | log.write('-------------------NEW RUN-------------------\n') 70 | log.write(datetime.now().strftime('%Y-%m-%d %H:%M:%S')) 71 | log.write('\n') 72 | json.dump(args.__dict__, log, indent=2) 73 | log.write('\n') 74 | 75 | # dataset, dataloader 76 | StereoDataset = __datasets__[args.dataset] 77 | train_dataset = StereoDataset(args.datapath, args.trainlist, True) 78 | test_dataset = StereoDataset(args.datapath, args.testlist, False) 79 | TrainImgLoader = DataLoader(train_dataset, args.batch_size, shuffle=True, num_workers=8, drop_last=False) 80 | TestImgLoader = DataLoader(test_dataset, args.test_batch_size, shuffle=False, num_workers=4, drop_last=False) 81 | 82 | # model, optimizer 83 | model = HITNet(args) 84 | model = nn.DataParallel(model) 85 | model.cuda() 86 | optimizer = optim.Adam(model.parameters(), lr=args.lr, betas=(0.9, 0.999)) 87 | 88 | # load parameters 89 | start_epoch = 0 90 | if args.resume: 91 | print("loading the lastest model in logdir: {}".format(args.resume)) 92 | state_dict = torch.load(args.resume) 93 | model.load_state_dict(state_dict['model']) 94 | optimizer.load_state_dict(state_dict['optimizer']) 95 | start_epoch = state_dict['epoch'] + 1 96 | elif args.loadckpt: 97 | # load the checkpoint file specified by args.loadckpt 98 | print("loading model {}".format(args.loadckpt)) 99 | state_dict = torch.load(args.loadckpt) 100 | model.load_state_dict(state_dict['model']) 101 | print("start at epoch {}".format(start_epoch)) 102 | 103 | 104 | def train(): 105 | min_EPE = args.maxdisp 106 | min_D1 = 1 107 | min_Thres3 = 1 108 | for epoch_idx in range(start_epoch, args.epochs): 109 | adjust_learning_rate(optimizer, epoch_idx, args.lr, args.lrepochs) 110 | 111 | # training 112 | for batch_idx, sample in enumerate(TrainImgLoader): 113 | # if batch_idx == 2: 114 | # break 115 | global_step = len(TrainImgLoader) * epoch_idx + batch_idx 116 | start_time = time.time() 117 | do_summary = global_step % args.summary_freq == 0 118 | loss, scalar_outputs, image_outputs = train_sample(sample, compute_metrics=do_summary) 119 | if do_summary: 120 | save_scalars(logger, 'train', scalar_outputs, global_step) 121 | save_images(logger, 'train', image_outputs, global_step) 122 | del scalar_outputs, image_outputs 123 | print('Epoch {}/{}, Iter {}/{}, train loss = {}, time = {:.3f}'.format(epoch_idx, args.epochs, 124 | batch_idx, 125 | len(TrainImgLoader), loss, 126 | time.time() - start_time)) 127 | with open(logfilename, 'a') as log: 128 | log.write('Epoch {}/{}, Iter {}/{}, train loss = {}, time = {:.3f}\n'.format(epoch_idx, args.epochs, 129 | batch_idx, 130 | len(TrainImgLoader), 131 | loss, 132 | time.time() - start_time)) 133 | 134 | # saving checkpoints 135 | if (epoch_idx + 1) % args.save_freq == 0 and epoch_idx >= args.ckpt_start_epoch: 136 | checkpoint_data = {'epoch': epoch_idx, 'model': model.state_dict(), 'optimizer': optimizer.state_dict()} 137 | torch.save(checkpoint_data, "{}/checkpoint_{:0>6}.ckpt".format(saver.experiment_dir, epoch_idx)) 138 | gc.collect() 139 | 140 | # testing 141 | avg_test_scalars = AverageMeterDict() 142 | for batch_idx, sample in enumerate(TestImgLoader): 143 | # if batch_idx == 2: 144 | # break 145 | global_step = len(TestImgLoader) * epoch_idx + batch_idx 146 | start_time = time.time() 147 | do_summary = global_step % args.summary_freq == 0 148 | loss, scalar_outputs, image_outputs = test_sample(sample, compute_metrics=do_summary) 149 | if do_summary: 150 | save_scalars(logger, 'test', scalar_outputs, global_step) 151 | save_images(logger, 'test', image_outputs, global_step) 152 | avg_test_scalars.update(scalar_outputs) 153 | del scalar_outputs, image_outputs 154 | print('Epoch {}/{}, Iter {}/{}, test loss = {}, time = {:3f}'.format(epoch_idx, args.epochs, 155 | batch_idx, 156 | len(TestImgLoader), loss, 157 | time.time() - start_time)) 158 | with open(logfilename, 'a') as log: 159 | log.write('Epoch {}/{}, Iter {}/{}, test loss = {}, time = {:.3f}\n'.format(epoch_idx, args.epochs, 160 | batch_idx, 161 | len(TestImgLoader), 162 | loss, 163 | time.time() - start_time)) 164 | avg_test_scalars = avg_test_scalars.mean() 165 | if avg_test_scalars['EPE'][-1] < min_EPE: 166 | min_EPE = avg_test_scalars['EPE'][-1] 167 | minEPE_epoch = epoch_idx 168 | checkpoint_data = {'epoch': epoch_idx, 'model': model.state_dict(), 'optimizer': optimizer.state_dict()} 169 | torch.save(checkpoint_data, "{}/bestEPE_checkpoint.ckpt".format(saver.experiment_dir)) 170 | if avg_test_scalars['D1'][-1] < min_D1: 171 | min_D1 = avg_test_scalars['D1'][-1] 172 | minD1_epoch = epoch_idx 173 | checkpoint_data = {'epoch': epoch_idx, 'model': model.state_dict(), 'optimizer': optimizer.state_dict()} 174 | torch.save(checkpoint_data, "{}/bestD1_checkpoint.ckpt".format(saver.experiment_dir)) 175 | if avg_test_scalars['Thres3'][-1] < min_Thres3: 176 | min_Thres3 = avg_test_scalars['Thres3'][-1] 177 | minThres3_epoch = epoch_idx 178 | checkpoint_data = {'epoch': epoch_idx, 'model': model.state_dict(), 'optimizer': optimizer.state_dict()} 179 | torch.save(checkpoint_data, "{}/bestThres3_checkpoint.ckpt".format(saver.experiment_dir)) 180 | save_scalars(logger, 'fulltest', avg_test_scalars, len(TrainImgLoader) * (epoch_idx + 1)) 181 | print("avg_test_scalars", avg_test_scalars) 182 | with open(logfilename, 'a') as log: 183 | js = json.dumps(avg_test_scalars) 184 | log.write(js) 185 | log.write('\n') 186 | gc.collect() 187 | with open(logfilename, 'a') as log: 188 | log.write('min_EPE: {}/{}; min_D1: {}/{}'.format(min_EPE, minEPE_epoch, min_D1, minD1_epoch)) 189 | 190 | 191 | # train one sample 192 | def train_sample(sample, compute_metrics=False): 193 | model.train() 194 | 195 | imgL, imgR, disp_gt, dx_gt, dy_gt = sample['left'], sample['right'], sample['disparity'], sample['dx_gt'], sample['dy_gt'] 196 | imgL = imgL.cuda() 197 | imgR = imgR.cuda() 198 | disp_gt = disp_gt.cuda().unsqueeze(1) 199 | dx_gt = dx_gt.cuda().unsqueeze(1) 200 | dy_gt = dy_gt.cuda().unsqueeze(1) 201 | mask = (disp_gt < args.maxdisp) & (disp_gt > 0) 202 | 203 | optimizer.zero_grad() 204 | 205 | outputs = model(imgL, imgR) 206 | init_cv_pyramid = outputs["init_cv_pyramid"] 207 | prop_disp_pyramid = outputs["prop_disp_pyramid"] 208 | dx_pyramid = outputs["dx_pyramid"] 209 | dy_pyramid = outputs["dy_pyramid"] 210 | w_pyramid = outputs["w_pyramid"] 211 | loss = global_loss(init_cv_pyramid, prop_disp_pyramid, dx_pyramid, dy_pyramid, w_pyramid, 212 | disp_gt, dx_gt, dy_gt, args.maxdisp) 213 | scalar_outputs = {"weighted_loss_sum": loss} 214 | image_outputs = {"disp_est": prop_disp_pyramid, "disp_gt": disp_gt, "imgL": imgL, "imgR": imgR, "dx_gt": dx_gt, "dy_gt": dy_gt, 215 | "dx_pyramid": dx_pyramid, "dy_pyramid": dy_pyramid, "w_pyramid": w_pyramid, 216 | } 217 | # pdb.set_trace() 218 | 219 | if compute_metrics: 220 | with torch.no_grad(): 221 | image_outputs["errormap"] = [disp_error_image_func()(disp_est.squeeze(1), disp_gt.squeeze(1)) for disp_est in prop_disp_pyramid] 222 | scalar_outputs["EPE"] = [EPE_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1)) for disp_est in prop_disp_pyramid] 223 | scalar_outputs["D1"] = [D1_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1)) for disp_est in prop_disp_pyramid] 224 | scalar_outputs["Thres1"] = [Thres_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1), 1.0) for disp_est in prop_disp_pyramid] 225 | scalar_outputs["Thres2"] = [Thres_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1), 2.0) for disp_est in prop_disp_pyramid] 226 | scalar_outputs["Thres3"] = [Thres_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1), 3.0) for disp_est in prop_disp_pyramid] 227 | loss.backward() 228 | optimizer.step() 229 | 230 | return tensor2float(loss), tensor2float(scalar_outputs), image_outputs 231 | 232 | 233 | # test one sample 234 | @make_nograd_func 235 | def test_sample(sample, compute_metrics=True): 236 | model.eval() 237 | 238 | imgL, imgR, disp_gt = sample['left'], sample['right'], sample['disparity'] 239 | imgL = imgL.cuda() 240 | imgR = imgR.cuda() 241 | disp_gt = disp_gt.cuda().unsqueeze(1) 242 | 243 | outputs = model(imgL, imgR) 244 | prop_disp_pyramid = outputs['prop_disp_pyramid'] 245 | mask = (disp_gt < args.maxdisp) & (disp_gt > 0) 246 | loss = torch.mean((prop_loss(torch.abs(prop_disp_pyramid[0] - disp_gt)))[mask]) 247 | scalar_outputs = {"loss": loss} 248 | image_outputs = {"disp_est": prop_disp_pyramid, "disp_gt": disp_gt, "imgL": imgL, "imgR": imgR} 249 | 250 | scalar_outputs["D1"] = [D1_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1)) for disp_est in prop_disp_pyramid] 251 | scalar_outputs["EPE"] = [EPE_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1)) for disp_est in prop_disp_pyramid] 252 | scalar_outputs["Thres1"] = [Thres_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1), 1.0) for disp_est in prop_disp_pyramid] 253 | scalar_outputs["Thres2"] = [Thres_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1), 2.0) for disp_est in prop_disp_pyramid] 254 | scalar_outputs["Thres3"] = [Thres_metric(disp_est.squeeze(1), disp_gt.squeeze(1), mask.squeeze(1), 3.0) for disp_est in prop_disp_pyramid] 255 | 256 | if compute_metrics: 257 | image_outputs["errormap"] = [disp_error_image_func()(disp_est.squeeze(1), disp_gt.squeeze(1)) for disp_est in prop_disp_pyramid] 258 | 259 | return tensor2float(loss), tensor2float(scalar_outputs), image_outputs 260 | 261 | 262 | if __name__ == '__main__': 263 | train() 264 | -------------------------------------------------------------------------------- /models/FE.py: -------------------------------------------------------------------------------- 1 | import torch.nn.functional as F 2 | import torch 3 | import torch.nn as nn 4 | 5 | 6 | class feature_extraction_conv(nn.Module): 7 | """ 8 | UNet for HITNet 9 | """ 10 | 11 | def __init__(self, args): 12 | super(feature_extraction_conv, self).__init__() 13 | self.conv1x_0 = nn.Sequential( 14 | BasicConv2d(3, 16, 3, 1, 1, 1), 15 | BasicConv2d(16, 16, 3, 1, 1, 1), 16 | ) 17 | self.conv2x_0 = nn.Sequential( 18 | BasicConv2d(16, 16, 2, 2, 0, 1), 19 | BasicConv2d(16, 16, 3, 1, 1, 1), 20 | BasicConv2d(16, 16, 3, 1, 1, 1) 21 | ) 22 | self.conv4x_0 = nn.Sequential( 23 | BasicConv2d(16, 24, 2, 2, 0, 1), 24 | BasicConv2d(24, 24, 3, 1, 1, 1), 25 | BasicConv2d(24, 24, 3, 1, 1, 1) 26 | ) 27 | self.conv8x_0 = nn.Sequential( 28 | BasicConv2d(24, 24, 2, 2, 0, 1), 29 | BasicConv2d(24, 24, 3, 1, 1, 1), 30 | BasicConv2d(24, 24, 3, 1, 1, 1) 31 | ) 32 | self.conv16x_0 = nn.Sequential( 33 | BasicConv2d(24, 32, 2, 2, 0, 1), 34 | BasicConv2d(32, 32, 3, 1, 1, 1), 35 | BasicConv2d(32, 32, 3, 1, 1, 1) 36 | ) 37 | 38 | self.conv16_8x_0 = unetUp(32, 24, 24) 39 | self.conv8_4x_0 = unetUp(24, 24, 24) 40 | self.conv4_2x_0 = unetUp(24, 16, 16) 41 | self.conv2_1x_0 = unetUp(16, 16, 16) 42 | 43 | self.last_conv_1x = nn.Conv2d(16, 16, 1, 1, 0, 1, bias=False) 44 | self.last_conv_2x = nn.Conv2d(16, 16, 1, 1, 0, 1, bias=False) 45 | self.last_conv_4x = nn.Conv2d(24, 24, 1, 1, 0, 1, bias=False) 46 | self.last_conv_8x = nn.Conv2d(24, 24, 1, 1, 0, 1, bias=False) 47 | self.last_conv_16x = nn.Conv2d(32, 32, 1, 1, 0, 1, bias=False) 48 | 49 | def forward(self, x): 50 | layer1x_0 = self.conv1x_0(x) 51 | layer2x_0 = self.conv2x_0(layer1x_0) 52 | layer4x_0 = self.conv4x_0(layer2x_0) 53 | layer8x_0 = self.conv8x_0(layer4x_0) 54 | layer16x_0 = self.conv16x_0(layer8x_0) 55 | 56 | layer8x_1 = self.conv16_8x_0(layer16x_0, layer8x_0) 57 | layer4x_1 = self.conv8_4x_0(layer8x_1, layer4x_0) 58 | layer2x_1 = self.conv4_2x_0(layer4x_1, layer2x_0) 59 | layer1x_1 = self.conv2_1x_0(layer2x_1, layer1x_0) 60 | 61 | layer16x_1 = self.last_conv_16x(layer16x_0) 62 | layer8x_2 = self.last_conv_8x(layer8x_1) 63 | layer4x_2 = self.last_conv_4x(layer4x_1) 64 | layer2x_2 = self.last_conv_2x(layer2x_1) 65 | layer1x_2 = self.last_conv_1x(layer1x_1) 66 | 67 | return [layer16x_1, layer8x_2, layer4x_2, layer2x_2, layer1x_2] # 1/16, 1/8, 1/4, 1/2, 1/1 68 | 69 | 70 | def BasicConv2d(in_channels, out_channels, kernel_size, stride, pad, dilation): 71 | return nn.Sequential( 72 | nn.Conv2d(in_channels, out_channels, kernel_size=kernel_size, stride=stride, 73 | padding=dilation if dilation > 1 else pad, dilation=dilation, bias=False), 74 | nn.BatchNorm2d(out_channels), 75 | nn.LeakyReLU(inplace=True, negative_slope=0.2), 76 | ) 77 | 78 | 79 | def BasicTransposeConv2d(in_channels, out_channels, kernel_size, stride, pad, dilation): 80 | output_pad = stride + 2 * pad - kernel_size * dilation + dilation - 1 81 | return nn.Sequential( 82 | nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride, pad, output_pad, dilation, bias=False), 83 | nn.BatchNorm2d(out_channels), 84 | nn.LeakyReLU(inplace=True, negative_slope=0.2), 85 | ) 86 | 87 | 88 | class unetUp(nn.Module): 89 | def __init__(self, in_c1, in_c2, out_c): 90 | super(unetUp, self).__init__() 91 | self.up_conv1 = BasicTransposeConv2d(in_c1, in_c1//2, 2, 2, 0, 1) 92 | self.reduce_conv2 = BasicConv2d(in_c1//2+in_c2, out_c, 1, 1, 0, 1) 93 | self.conv = nn.Sequential( 94 | BasicConv2d(out_c, out_c, 3, 1, 1, 1), 95 | ) 96 | 97 | def forward(self, inputs1, inputs2): # small scale, large scale 98 | layer1 = self.up_conv1(inputs1) 99 | layer2 = self.reduce_conv2(torch.cat([layer1, inputs2], 1)) 100 | output = self.conv(layer2) 101 | return output 102 | -------------------------------------------------------------------------------- /models/HITNet.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | from .FE import feature_extraction_conv 5 | from .initialization import INIT 6 | from .tile_warping import TileWarping 7 | from .tile_update import TileUpdate, PostTileUpdate, FinalTileUpdate, PostTileUpdateNoUp 8 | from models.submodules import DispUpsampleBySlantedPlane, SlantDUpsampleBySlantedPlaneT4T4, SlantD2xUpsampleBySlantedPlaneT4T2 9 | import pdb 10 | from utils.write_pfm import write_pfm_tensor 11 | 12 | 13 | class HITNet(nn.Module): 14 | def __init__(self, args): 15 | super().__init__() 16 | self.feature_extractor = feature_extraction_conv(args) 17 | self.tile_init = INIT(args) 18 | self.tile_warp = TileWarping(args) 19 | self.tile_update0 = TileUpdate(32, 16, 32, 2, args) # 1/16 tile refine 20 | self.tile_update1 = TileUpdate(64, 34, 32, 2, args) # 1/8 tile refine 21 | self.tile_update2 = TileUpdate(64, 34, 32, 2, args) # 1/4 tile refine 22 | self.tile_update3 = TileUpdate(64, 34, 32, 2, args) # 1/2 tile refine 23 | self.tile_update4 = TileUpdate(64, 34, 32, 2, args) # 1/1 tile refine 24 | self.tile_update4_1 = PostTileUpdateNoUp(40, 16, 32, 4, args) # 1/1 tile refine 25 | self.tile_update5 = PostTileUpdate(32, 16, 32, 4, SlantD2xUpsampleBySlantedPlaneT4T2(), args) # 2/1 tile refine tile_size=2 26 | self.tile_update6 = FinalTileUpdate(32, 1, 16, 2, DispUpsampleBySlantedPlane(2, 2), args) # 2/1 tile refine tile_size=1 27 | 28 | # For training phase, we need to upsample disps using slant equation 29 | self.prop_disp_upsample64x = DispUpsampleBySlantedPlane(64) 30 | self.prop_disp_upsample32x = DispUpsampleBySlantedPlane(32) 31 | self.prop_disp_upsample16x = DispUpsampleBySlantedPlane(16) 32 | self.prop_disp_upsample8x = DispUpsampleBySlantedPlane(8) 33 | self.prop_disp_upsample4x = DispUpsampleBySlantedPlane(4) 34 | self.prop_disp_upsample2x = DispUpsampleBySlantedPlane(2, 2) 35 | # For training phase, we need to upsample dx and dy using nearest interpolation 36 | self.dxdy_upsample64x = nn.UpsamplingNearest2d(scale_factor=64) 37 | self.dxdy_upsample32x = nn.UpsamplingNearest2d(scale_factor=32) 38 | self.dxdy_upsample16x = nn.UpsamplingNearest2d(scale_factor=16) 39 | self.dxdy_upsample8x = nn.UpsamplingNearest2d(scale_factor=8) 40 | self.dxdy_upsample4x = nn.UpsamplingNearest2d(scale_factor=4) 41 | self.dxdy_upsample2x = nn.UpsamplingNearest2d(scale_factor=2) 42 | # For final disparity and each supervision signal to be positive 43 | # self.relu = nn.ReLU(inplace=True) 44 | 45 | def forward(self, left_img, right_img): 46 | left_fea_pyramid = self.feature_extractor(left_img) 47 | right_fea_pyramid = self.feature_extractor(right_img) 48 | init_cv_pyramid, init_tile_pyramid = self.tile_init(left_fea_pyramid, right_fea_pyramid) 49 | refined_tile16x = self.tile_update0(left_fea_pyramid[0], right_fea_pyramid[0], init_tile_pyramid[0])[0] 50 | tile_update8x = self.tile_update1(left_fea_pyramid[1], right_fea_pyramid[1], init_tile_pyramid[1], refined_tile16x) 51 | tile_update4x = self.tile_update2(left_fea_pyramid[2], right_fea_pyramid[2], init_tile_pyramid[2], tile_update8x[0]) 52 | tile_update2x = self.tile_update3(left_fea_pyramid[3], right_fea_pyramid[3], init_tile_pyramid[3], tile_update4x[0]) 53 | tile_update1x = self.tile_update4(left_fea_pyramid[4], right_fea_pyramid[4], init_tile_pyramid[4], tile_update2x[0]) 54 | refined_tile1x = self.tile_update4_1(left_fea_pyramid[2], tile_update1x[0]) 55 | refined_tile05x = self.tile_update5(left_fea_pyramid[3], refined_tile1x) 56 | refined_tile025x = self.tile_update6(left_fea_pyramid[4], refined_tile05x) 57 | final_disp = refined_tile025x 58 | # pdb.set_trace() 59 | 60 | if self.training: 61 | prop_disp16_fx = self.prop_disp_upsample64x(refined_tile16x[:, :1, :, :], refined_tile16x[:, 1:2, :, :], refined_tile16x[:, 2:3, :, :]) 62 | prop_disp8_fx_cur = self.prop_disp_upsample32x(tile_update8x[1], tile_update8x[3], tile_update8x[5]) 63 | prop_disp8_fx_pre = self.prop_disp_upsample32x(tile_update8x[2], tile_update8x[4], tile_update8x[6]) 64 | prop_disp4_fx_cur = self.prop_disp_upsample16x(tile_update4x[1], tile_update4x[3], tile_update4x[5]) 65 | prop_disp4_fx_pre = self.prop_disp_upsample16x(tile_update4x[2], tile_update4x[4], tile_update4x[6]) 66 | prop_disp2_fx_cur = self.prop_disp_upsample8x(tile_update2x[1], tile_update2x[3], tile_update2x[5]) 67 | prop_disp2_fx_pre = self.prop_disp_upsample8x(tile_update2x[2], tile_update2x[4], tile_update2x[6]) 68 | prop_disp1_fx_cur = self.prop_disp_upsample4x(tile_update1x[1], tile_update1x[3], tile_update1x[5]) 69 | prop_disp1_fx_pre = self.prop_disp_upsample4x(tile_update1x[2], tile_update1x[4], tile_update1x[6]) 70 | prop_disp1_fx = self.prop_disp_upsample4x(refined_tile1x[:, :1, :, :], refined_tile1x[:, 1:2, :, :], refined_tile1x[:, 2:3, :, :]) 71 | prop_disp05_fx = self.prop_disp_upsample2x(refined_tile05x[:, :1, :, :], refined_tile05x[:, 1:2, :, :], refined_tile05x[:, 2:3, :, :]) 72 | prop_disp_pyramid = [ 73 | prop_disp16_fx, 74 | prop_disp8_fx_cur, 75 | prop_disp8_fx_pre, 76 | prop_disp4_fx_cur, 77 | prop_disp4_fx_pre, 78 | prop_disp2_fx_cur, 79 | prop_disp2_fx_pre, 80 | prop_disp1_fx_cur, 81 | prop_disp1_fx_pre, 82 | prop_disp1_fx, 83 | prop_disp05_fx, 84 | final_disp 85 | ] 86 | # WARNING: EACH PYRAMID MUST ALIGN ACCORDING TO PRE-CUR ORDER AND RESOLUTION ORDER SINCE SUPERVISION WOULDN'T SEE THE ORDER 87 | 88 | dx16_fx = self.dxdy_upsample64x(refined_tile16x[:, 1:2, :, :]) 89 | dx8_fx_cur = self.dxdy_upsample32x(tile_update8x[3]) 90 | dx8_fx_pre = self.dxdy_upsample32x(tile_update8x[4]) 91 | dx4_fx_cur = self.dxdy_upsample16x(tile_update4x[3]) 92 | dx4_fx_pre = self.dxdy_upsample16x(tile_update4x[4]) 93 | dx2_fx_cur = self.dxdy_upsample8x(tile_update2x[3]) 94 | dx2_fx_pre = self.dxdy_upsample8x(tile_update2x[4]) 95 | dx1_fx_cur = self.dxdy_upsample4x(tile_update1x[3]) 96 | dx1_fx_pre = self.dxdy_upsample4x(tile_update1x[4]) 97 | dx1_fx = self.dxdy_upsample4x(refined_tile1x[:, 1:2, :, :]) 98 | dx05_fx = self.dxdy_upsample2x(refined_tile05x[:, 1:2, :, :]) 99 | dx_pyramid = [ 100 | dx16_fx, 101 | dx8_fx_cur, 102 | dx8_fx_pre, 103 | dx4_fx_cur, 104 | dx4_fx_pre, 105 | dx2_fx_cur, 106 | dx2_fx_pre, 107 | dx1_fx_cur, 108 | dx1_fx_pre, 109 | dx1_fx, 110 | dx05_fx, 111 | ] 112 | 113 | dy16_fx = self.dxdy_upsample64x(refined_tile16x[:, 2:3, :, :]) 114 | dy8_fx_cur = self.dxdy_upsample32x(tile_update8x[5]) 115 | dy8_fx_pre = self.dxdy_upsample32x(tile_update8x[6]) 116 | dy4_fx_cur = self.dxdy_upsample16x(tile_update4x[5]) 117 | dy4_fx_pre = self.dxdy_upsample16x(tile_update4x[6]) 118 | dy2_fx_cur = self.dxdy_upsample8x(tile_update2x[5]) 119 | dy2_fx_pre = self.dxdy_upsample8x(tile_update2x[6]) 120 | dy1_fx_cur = self.dxdy_upsample4x(tile_update1x[5]) 121 | dy1_fx_pre = self.dxdy_upsample4x(tile_update1x[6]) 122 | dy1_fx = self.dxdy_upsample4x(refined_tile1x[:, 2:3, :, :]) 123 | dy05_fx = self.dxdy_upsample2x(refined_tile05x[:, 2:3, :, :]) 124 | dy_pyramid = [ 125 | dy16_fx, 126 | dy8_fx_cur, 127 | dy8_fx_pre, 128 | dy4_fx_cur, 129 | dy4_fx_pre, 130 | dy2_fx_cur, 131 | dy2_fx_pre, 132 | dy1_fx_cur, 133 | dy1_fx_pre, 134 | dy1_fx, 135 | dy05_fx, 136 | ] 137 | 138 | conf8_fx_cur = self.dxdy_upsample32x(tile_update8x[7]) 139 | conf8_fx_pre = self.dxdy_upsample32x(tile_update8x[8]) 140 | conf4_fx_cur = self.dxdy_upsample16x(tile_update4x[7]) 141 | conf4_fx_pre = self.dxdy_upsample16x(tile_update4x[8]) 142 | conf2_fx_cur = self.dxdy_upsample8x(tile_update2x[7]) 143 | conf2_fx_pre = self.dxdy_upsample8x(tile_update2x[8]) 144 | conf1_fx_cur = self.dxdy_upsample4x(tile_update1x[7]) 145 | conf1_fx_pre = self.dxdy_upsample4x(tile_update1x[8]) 146 | w_pyramid = [ 147 | conf8_fx_cur, 148 | conf8_fx_pre, 149 | conf4_fx_cur, 150 | conf4_fx_pre, 151 | conf2_fx_cur, 152 | conf2_fx_pre, 153 | conf1_fx_cur, 154 | conf1_fx_pre, 155 | ] 156 | 157 | outputs = { 158 | "init_cv_pyramid": init_cv_pyramid, 159 | "prop_disp_pyramid": prop_disp_pyramid, 160 | "dx_pyramid": dx_pyramid, 161 | "dy_pyramid": dy_pyramid, 162 | "w_pyramid": w_pyramid, 163 | } 164 | # pdb.set_trace() 165 | 166 | return outputs 167 | 168 | else: 169 | prop_disp_pyramid = [final_disp] 170 | return { 171 | "prop_disp_pyramid": prop_disp_pyramid, 172 | } 173 | # pdb.set_trace() 174 | 175 | -------------------------------------------------------------------------------- /models/initialization.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | from .FE import BasicConv2d 5 | import pdb 6 | from .submodules import BuildVolume2d 7 | 8 | 9 | class INIT(nn.Module): 10 | """ 11 | Tile hypothesis initialization 12 | input: dual feature pyramid 13 | output: initial tile hypothesis pyramid 14 | """ 15 | def __init__(self, args): 16 | super().__init__() 17 | self.maxdisp = args.maxdisp 18 | fea_c1x = args.fea_c[4] 19 | fea_c2x = args.fea_c[3] 20 | fea_c4x = args.fea_c[2] 21 | fea_c8x = args.fea_c[1] 22 | fea_c16x = args.fea_c[0] 23 | self.tile_conv1x = nn.Sequential( 24 | BasicConv2d(fea_c1x, fea_c1x, 4, 4, 0, 1), 25 | nn.Conv2d(fea_c1x, fea_c1x, 1, 1, 0, bias=False) 26 | ) 27 | 28 | self.tile_conv2x = nn.Sequential( 29 | BasicConv2d(fea_c2x, fea_c2x, 4, 4, 0, 1), 30 | nn.Conv2d(fea_c2x, fea_c2x, 1, 1, 0, bias=False) 31 | ) 32 | 33 | self.tile_conv4x = nn.Sequential( 34 | BasicConv2d(fea_c4x, fea_c4x, 4, 4, 0, 1), 35 | nn.Conv2d(fea_c4x, fea_c4x, 1, 1, 0, bias=False) 36 | ) 37 | 38 | self.tile_conv8x = nn.Sequential( 39 | BasicConv2d(fea_c8x, fea_c8x, 4, 4, 0, 1), 40 | nn.Conv2d(fea_c8x, fea_c8x, 1, 1, 0, bias=False) 41 | ) 42 | 43 | self.tile_conv16x = nn.Sequential( 44 | BasicConv2d(fea_c16x, fea_c16x, 4, 4, 0, 1), 45 | nn.Conv2d(fea_c16x, fea_c16x, 1, 1, 0, bias=False) 46 | ) 47 | 48 | self.tile_fea_dscrpt16x = BasicConv2d(fea_c16x+1, 13, 1, 1, 0, 1) 49 | self.tile_fea_dscrpt8x = BasicConv2d(fea_c8x+1, 13, 1, 1, 0, 1) 50 | self.tile_fea_dscrpt4x = BasicConv2d(fea_c4x+1, 13, 1, 1, 0, 1) 51 | self.tile_fea_dscrpt2x = BasicConv2d(fea_c2x+1, 13, 1, 1, 0, 1) 52 | self.tile_fea_dscrpt1x = BasicConv2d(fea_c1x+1, 13, 1, 1, 0, 1) 53 | 54 | self._build_volume_2d16x = BuildVolume2d(self.maxdisp//16) 55 | self._build_volume_2d8x = BuildVolume2d(self.maxdisp//8) 56 | self._build_volume_2d4x = BuildVolume2d(self.maxdisp//4) 57 | self._build_volume_2d2x = BuildVolume2d(self.maxdisp//2) 58 | self._build_volume_2d1x = BuildVolume2d(self.maxdisp) 59 | 60 | def tile_features(self, fea_l, fea_r): 61 | 62 | right_fea_pad = [0, 3, 0, 0] 63 | # pdb.set_trace() 64 | 65 | tile_fea_l1x = self.tile_conv1x(fea_l[-1]) 66 | padded_fea_r1x = F.pad(fea_r[-1], right_fea_pad) 67 | self.tile_conv1x[0][0].stride = (4, 1) 68 | tile_fea_r1x = self.tile_conv1x(padded_fea_r1x) 69 | self.tile_conv1x[0][0].stride = (4, 4) 70 | 71 | tile_fea_l2x = self.tile_conv2x(fea_l[-2]) 72 | padded_fea_r2x = F.pad(fea_r[-2], right_fea_pad) 73 | self.tile_conv2x[0][0].stride = (4, 1) 74 | tile_fea_r2x = self.tile_conv2x(padded_fea_r2x) 75 | self.tile_conv2x[0][0].stride = (4, 4) 76 | 77 | tile_fea_l4x = self.tile_conv4x(fea_l[-3]) 78 | padded_fea_r4x = F.pad(fea_r[-3], right_fea_pad) 79 | self.tile_conv4x[0][0].stride = (4, 1) 80 | tile_fea_r4x = self.tile_conv4x(padded_fea_r4x) 81 | self.tile_conv4x[0][0].stride = (4, 4) 82 | 83 | tile_fea_l8x = self.tile_conv8x(fea_l[-4]) 84 | padded_fea_r8x = F.pad(fea_r[-4], right_fea_pad) 85 | self.tile_conv8x[0][0].stride = (4, 1) 86 | tile_fea_r8x = self.tile_conv8x(padded_fea_r8x) 87 | self.tile_conv8x[0][0].stride = (4, 4) 88 | 89 | tile_fea_l16x = self.tile_conv16x(fea_l[-5]) 90 | padded_fea_r16x = F.pad(fea_r[-5], right_fea_pad) 91 | self.tile_conv16x[0][0].stride = (4, 1) 92 | tile_fea_r16x = self.tile_conv16x(padded_fea_r16x) 93 | self.tile_conv16x[0][0].stride = (4, 4) 94 | 95 | return [ 96 | [tile_fea_l16x, tile_fea_r16x], 97 | [tile_fea_l8x, tile_fea_r8x], 98 | [tile_fea_l4x, tile_fea_r4x], 99 | [tile_fea_l2x, tile_fea_r2x], 100 | [tile_fea_l1x, tile_fea_r1x], 101 | ] 102 | 103 | def tile_hypothesis_pyramid(self, tile_feature_pyramid): 104 | init_tile_cost16x = self._build_volume_2d16x(tile_feature_pyramid[0][0], tile_feature_pyramid[0][1]) 105 | init_tile_cost8x = self._build_volume_2d8x(tile_feature_pyramid[1][0], tile_feature_pyramid[1][1]) 106 | init_tile_cost4x = self._build_volume_2d4x(tile_feature_pyramid[2][0], tile_feature_pyramid[2][1]) 107 | init_tile_cost2x = self._build_volume_2d2x(tile_feature_pyramid[3][0], tile_feature_pyramid[3][1]) 108 | init_tile_cost1x = self._build_volume_2d1x(tile_feature_pyramid[4][0], tile_feature_pyramid[4][1]) 109 | 110 | min_tile_cost16x, min_tile_disp16x = torch.min(init_tile_cost16x, 1) 111 | min_tile_cost8x, min_tile_disp8x = torch.min(init_tile_cost8x, 1) 112 | min_tile_cost4x, min_tile_disp4x = torch.min(init_tile_cost4x, 1) 113 | min_tile_cost2x, min_tile_disp2x = torch.min(init_tile_cost2x, 1) 114 | min_tile_cost1x, min_tile_disp1x = torch.min(init_tile_cost1x, 1) 115 | 116 | min_tile_cost16x = torch.unsqueeze(min_tile_cost16x, 1) 117 | min_tile_cost8x = torch.unsqueeze(min_tile_cost8x, 1) 118 | min_tile_cost4x = torch.unsqueeze(min_tile_cost4x, 1) 119 | min_tile_cost2x = torch.unsqueeze(min_tile_cost2x, 1) 120 | min_tile_cost1x = torch.unsqueeze(min_tile_cost1x, 1) 121 | 122 | min_tile_disp16x = min_tile_disp16x.float().unsqueeze(1) 123 | min_tile_disp8x = min_tile_disp8x.float().unsqueeze(1) 124 | min_tile_disp4x = min_tile_disp4x.float().unsqueeze(1) 125 | min_tile_disp2x = min_tile_disp2x.float().unsqueeze(1) 126 | min_tile_disp1x = min_tile_disp1x.float().unsqueeze(1) 127 | 128 | tile_dscrpt16x = self.tile_fea_dscrpt16x(torch.cat([min_tile_cost16x, tile_feature_pyramid[0][0]], 1)) 129 | tile_dscrpt8x = self.tile_fea_dscrpt8x(torch.cat([min_tile_cost8x, tile_feature_pyramid[1][0]], 1)) 130 | tile_dscrpt4x = self.tile_fea_dscrpt4x(torch.cat([min_tile_cost4x, tile_feature_pyramid[2][0]], 1)) 131 | tile_dscrpt2x = self.tile_fea_dscrpt2x(torch.cat([min_tile_cost2x, tile_feature_pyramid[3][0]], 1)) 132 | tile_dscrpt1x = self.tile_fea_dscrpt1x(torch.cat([min_tile_cost1x, tile_feature_pyramid[4][0]], 1)) 133 | 134 | tile_dx16x = torch.zeros_like(min_tile_disp16x) 135 | tile_dx8x = torch.zeros_like(min_tile_disp8x) 136 | tile_dx4x = torch.zeros_like(min_tile_disp4x) 137 | tile_dx2x = torch.zeros_like(min_tile_disp2x) 138 | tile_dx1x = torch.zeros_like(min_tile_disp1x) 139 | 140 | tile_dy16x = torch.zeros_like(min_tile_disp16x) 141 | tile_dy8x = torch.zeros_like(min_tile_disp8x) 142 | tile_dy4x = torch.zeros_like(min_tile_disp4x) 143 | tile_dy2x = torch.zeros_like(min_tile_disp2x) 144 | tile_dy1x = torch.zeros_like(min_tile_disp1x) 145 | # pdb.set_trace() 146 | 147 | tile_hyp16x = torch.cat([min_tile_disp16x, tile_dx16x, tile_dy16x, tile_dscrpt16x], 1) 148 | tile_hyp8x = torch.cat([min_tile_disp8x, tile_dx8x, tile_dy8x, tile_dscrpt8x], 1) 149 | tile_hyp4x = torch.cat([min_tile_disp4x, tile_dx4x, tile_dy4x, tile_dscrpt4x], 1) 150 | tile_hyp2x = torch.cat([min_tile_disp2x, tile_dx2x, tile_dy2x, tile_dscrpt2x], 1) 151 | tile_hyp1x = torch.cat([min_tile_disp1x, tile_dx1x, tile_dy1x, tile_dscrpt1x], 1) 152 | 153 | return [ 154 | [ 155 | init_tile_cost16x, 156 | init_tile_cost8x, 157 | init_tile_cost4x, 158 | init_tile_cost2x, 159 | init_tile_cost1x, 160 | ], 161 | [ 162 | tile_hyp16x, 163 | tile_hyp8x, 164 | tile_hyp4x, 165 | tile_hyp2x, 166 | tile_hyp1x, 167 | ] 168 | ] 169 | 170 | def forward(self, fea_l_pyramid, fea_r_pyramid): 171 | tile_feature_duo_pyramid = self.tile_features(fea_l_pyramid, fea_r_pyramid) 172 | init_cv_pyramid, init_hypo_pyramid = self.tile_hypothesis_pyramid(tile_feature_duo_pyramid) 173 | return [init_cv_pyramid, init_hypo_pyramid] 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | -------------------------------------------------------------------------------- /models/submodules.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | 6 | class DispUpsampleBySlantedPlane(nn.Module): 7 | def __init__(self, upscale, ts=4): 8 | super(DispUpsampleBySlantedPlane, self).__init__() 9 | self.upscale = upscale 10 | self.center = (upscale - 1) / 2 11 | self.DUC = nn.PixelShuffle(upscale) 12 | self.ts = ts 13 | 14 | def forward(self, tile_disp, tile_dx, tile_dy): 15 | tile_disp = tile_disp * (self.upscale / self.ts) 16 | disp0 = [] # for each pixel, upsampled disps are stored in channel dimension 17 | for i in range(self.upscale): 18 | for j in range(self.upscale): 19 | disp0.append(tile_disp + (i - self.center) * tile_dx + (j - self.center) * tile_dy) 20 | disp0 = torch.cat(disp0, 1) # [B, upscale**2, H/upscale, W/upscale] 21 | disp1 = self.DUC(disp0) # [B, 1, H/1, W/1] 22 | return disp1 23 | 24 | 25 | class SlantDUpsampleBySlantedPlaneT4T4(nn.Module): 26 | """ 27 | Slant map upsampling, input tile size = 4x4, output tile size = 4x4 28 | """ 29 | def __init__(self, upscale): 30 | super(SlantDUpsampleBySlantedPlaneT4T4, self).__init__() 31 | self.upscale = upscale 32 | self.center = 4 * (upscale - 1) / 2 33 | self.DUC = nn.PixelShuffle(upscale) 34 | 35 | def forward(self, tile_disp, tile_dx, tile_dy): 36 | tile_disp = tile_disp * self.upscale 37 | disp0 = [] # for each pixel, upsampled disps are stored in channel dimension 38 | for i in range(self.upscale): 39 | for j in range(self.upscale): 40 | disp0.append(tile_disp + (i * 4 - self.center) * tile_dx + (j * 4 - self.center) * tile_dy) 41 | disp0 = torch.cat(disp0, 1) # [B, upscale**2, H/upscale, W/upscale] 42 | disp1 = self.DUC(disp0) # [B, 1, H/1, W/1] 43 | return disp1 44 | 45 | 46 | class SlantD2xUpsampleBySlantedPlaneT4T2(nn.Module): 47 | """ 48 | Slant map upsampling 2x, input tile size = 4x4, output tile size = 2x2 49 | """ 50 | def __init__(self): 51 | super(SlantD2xUpsampleBySlantedPlaneT4T2, self).__init__() 52 | self.DUC = nn.PixelShuffle(2) 53 | 54 | def forward(self, tile_disp, tile_dx, tile_dy): 55 | disp0 = [] # for each pixel, upsampled disps are stored in channel dimension 56 | for i in range(2): 57 | for j in range(2): 58 | disp0.append(tile_disp + (i * 2 - 1) * tile_dx + (j * 2 - 1) * tile_dy) 59 | disp0 = torch.cat(disp0, 1) # [B, upscale**2, H/upscale, W/upscale] 60 | disp1 = self.DUC(disp0) # [B, 1, H/1, W/1] 61 | return disp1 62 | 63 | 64 | class BuildVolume2d(nn.Module): 65 | def __init__(self, maxdisp): 66 | super(BuildVolume2d, self).__init__() 67 | self.maxdisp = maxdisp 68 | 69 | def forward(self, feat_l, feat_r): 70 | padded_feat_r = F.pad(feat_r, [self.maxdisp-1, 0, 0, 0]) 71 | cost = torch.zeros((feat_l.size()[0], self.maxdisp, feat_l.size()[2], feat_l.size()[3]), device='cuda') 72 | for i in range(0, self.maxdisp): 73 | if i > 0: 74 | # pdb.set_trace() 75 | cost[:, i, :, :] = torch.norm(feat_l[:, :, :, :] - padded_feat_r[:, :, :, self.maxdisp-1-i:-i:4], 1, 1) 76 | else: 77 | # pdb.set_trace() 78 | cost[:, i, :, :] = torch.norm(feat_l[:, :, :, :] - padded_feat_r[:, :, :, self.maxdisp-1::4], 1, 1) 79 | 80 | return cost.contiguous() # B*D*H*W 81 | 82 | 83 | class BuildVolume2dChaos(nn.Module): 84 | def __init__(self): 85 | super(BuildVolume2dChaos, self).__init__() 86 | 87 | def forward(self, refimg_fea, targetimg_fea, disps): 88 | B, C, H, W = refimg_fea.shape 89 | batch_disp = torch.unsqueeze(disps, dim=2).view(-1, 1, H, W) 90 | batch_feat_l = refimg_fea[:, None, :, :, :].repeat(1, disps.shape[1], 1, 1, 1).view(-1, C, H, W) 91 | batch_feat_r = targetimg_fea[:, None, :, :, :].repeat(1, disps.shape[1], 1, 1, 1).view(-1, C, H, W) 92 | warped_batch_feat_r = warp(batch_feat_r, batch_disp) 93 | volume = torch.norm(batch_feat_l - warped_batch_feat_r, 1, 1).view(B, disps.shape[1], H, W) 94 | volume = volume.contiguous() 95 | return volume 96 | 97 | 98 | def warp(x, disp): 99 | """ 100 | warp an image/tensor (im2) back to im1, according to the optical flow 101 | x: [B, C, H, W] (im2) 102 | flo: [B, 2, H, W] flow 103 | """ 104 | B, C, H, W = x.size() 105 | # mesh grid 106 | xx = torch.arange(0, W, device=x.device).view(1, -1).repeat(H, 1) 107 | yy = torch.arange(0, H, device=x.device).view(-1, 1).repeat(1, W) 108 | xx = xx.view(1, 1, H, W).repeat(B, 1, 1, 1) 109 | yy = yy.view(1, 1, H, W).repeat(B, 1, 1, 1) 110 | vgrid = torch.cat((xx, yy), 1).float() 111 | 112 | # vgrid = Variable(grid) 113 | vgrid[:,:1,:,:] = vgrid[:,:1,:,:] - disp 114 | 115 | # scale grid to [-1,1] 116 | vgrid[:, 0, :, :] = 2.0 * vgrid[:, 0, :, :].clone() / max(W - 1, 1) - 1.0 117 | vgrid[:, 1, :, :] = 2.0 * vgrid[:, 1, :, :].clone() / max(H - 1, 1) - 1.0 118 | 119 | vgrid = vgrid.permute(0, 2, 3, 1) 120 | output = F.grid_sample(x, vgrid) 121 | return output 122 | -------------------------------------------------------------------------------- /models/tile_update.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | from .FE import BasicConv2d 5 | from .tile_warping import TileWarping, TileWarping1 6 | from .submodules import DispUpsampleBySlantedPlane, SlantDUpsampleBySlantedPlaneT4T4, SlantD2xUpsampleBySlantedPlaneT4T2 7 | import pdb 8 | from utils.write_pfm import write_pfm_tensor 9 | 10 | 11 | class ResBlock(nn.Module): 12 | """ 13 | Residual Block without BN but with dilation 14 | """ 15 | 16 | def __init__(self, inplanes, out_planes, hid_planes, add_relu=True): 17 | super(ResBlock, self).__init__() 18 | self.add_relu = add_relu 19 | self.conv1 = nn.Sequential(nn.Conv2d(inplanes, hid_planes, 3, 1, 1, 1), 20 | nn.LeakyReLU(inplace=True, negative_slope=0.2)) 21 | 22 | self.conv2 = nn.Conv2d(hid_planes, out_planes, 3, 1, 1, 1) 23 | if add_relu: 24 | self.relu = nn.LeakyReLU(inplace=True, negative_slope=0.2) 25 | 26 | def forward(self, x): 27 | out = self.conv1(x) 28 | out = self.conv2(out) 29 | out += x 30 | if self.add_relu: 31 | out = self.relu(out) 32 | return out 33 | 34 | 35 | class TileUpdate(nn.Module): 36 | """ 37 | Tile Update for a single resolution 38 | forward input: fea duo from current resolution, tile hypothesis from current and previous resolution 39 | forward output: refined tile hypothesis and confidence (if available) 40 | """ 41 | def __init__(self, in_c, out_c, hid_c, resblk_num, args): 42 | super(TileUpdate, self).__init__() 43 | self.disp_upsample = SlantDUpsampleBySlantedPlaneT4T4(2) 44 | self.tile_warping = TileWarping(args) 45 | self.prop_warp0 = BasicConv2d(48, 16, 1, 1, 0, 1) 46 | self.prop_warp1 = BasicConv2d(48, 16, 1, 1, 0, 1) 47 | self.conv0 = BasicConv2d(in_c, hid_c, 1, 1, 0, 1) 48 | resblks = nn.ModuleList() 49 | for i in range(resblk_num): 50 | resblks.append(ResBlock(hid_c, hid_c, hid_c)) 51 | self.resblocks = nn.Sequential(*resblks) 52 | self.lastconv = nn.Conv2d(hid_c, out_c, 1, 1, 0, 1, bias=False) 53 | self.upsample = nn.UpsamplingNearest2d(scale_factor=2) 54 | # For final disparity and each supervision signal to be positive 55 | self.relu = nn.ReLU() 56 | 57 | def forward(self, fea_l, fea_r, current_hypothesis, previous_hypothesis=None): 58 | current_tile_local_cv = self.tile_warping(current_hypothesis[:, :3, :, :], fea_l, fea_r) 59 | current_tile_local_cv = self.prop_warp0(current_tile_local_cv) 60 | aug_current_tile_hypothesis = torch.cat([current_hypothesis, current_tile_local_cv], 1) 61 | if previous_hypothesis is None: 62 | aug_hypothesis_set = aug_current_tile_hypothesis 63 | else: 64 | previous_tile_d = previous_hypothesis[:, 0, :, :].unsqueeze(1) # multiply 2 when passing to slant upsampling 65 | previous_tile_dx = previous_hypothesis[:, 1, :, :].unsqueeze(1) # h direction 66 | previous_tile_dy = previous_hypothesis[:, 2, :, :].unsqueeze(1) # w direction 67 | up_previous_tile_d = self.disp_upsample(previous_tile_d, previous_tile_dx, previous_tile_dy) 68 | # pdb.set_trace() 69 | up_previous_tile_dx_dy = self.upsample(previous_hypothesis[:, 1:3, :, :]) 70 | up_previous_tile_dscrpt = self.upsample(previous_hypothesis[:, 3:, :, :]) 71 | up_previous_tile_dx_dy_dscrpt = torch.cat([up_previous_tile_dx_dy, up_previous_tile_dscrpt], dim=1) 72 | up_previous_tile_plane = torch.cat([up_previous_tile_d, up_previous_tile_dx_dy_dscrpt[:, :2, :, :]], 1) 73 | up_previous_tile_local_cv = self.tile_warping(up_previous_tile_plane, fea_l, fea_r) 74 | up_previous_tile_local_cv = self.prop_warp1(up_previous_tile_local_cv) 75 | aug_up_previous_tile_hypothesis = torch.cat([up_previous_tile_d, up_previous_tile_dx_dy_dscrpt, up_previous_tile_local_cv], 1) 76 | aug_hypothesis_set = torch.cat([aug_current_tile_hypothesis, aug_up_previous_tile_hypothesis], 1) 77 | tile_hypothesis_update = self.conv0(aug_hypothesis_set) 78 | tile_hypothesis_update = self.resblocks(tile_hypothesis_update) 79 | tile_hypothesis_update = self.lastconv(tile_hypothesis_update) 80 | if previous_hypothesis is None: 81 | refined_hypothesis = current_hypothesis + tile_hypothesis_update 82 | # pdb.set_trace() 83 | refined_hypothesis[:, :1, :, :] = F.relu(refined_hypothesis[:, :1, :, :].clone()) 84 | # pdb.set_trace() 85 | return [refined_hypothesis] 86 | else: 87 | conf = tile_hypothesis_update[:, :2, :, :] # [:, 0, :, :] is for pre 88 | previous_delta_hypothesis = tile_hypothesis_update[:, 2:18, :, :] 89 | current_delta_hypothesis = tile_hypothesis_update[:, 18:34, :, :] 90 | _, hypothesis_select_mask = torch.max(conf, dim=1, keepdim=True) 91 | hypothesis_select_mask = hypothesis_select_mask.float() 92 | # 1: current is larger, this mask is used to select current 93 | inverse_hypothesis_select_mask = 1 - hypothesis_select_mask 94 | # 1: previous is larger, this mask is used to select previous 95 | update_current_hypothesis = current_hypothesis + current_delta_hypothesis 96 | # tmp = F.relu(update_current_hypothesis[:, :1, :, :]) 97 | update_current_hypothesis[:, :1, :, :] = F.relu(update_current_hypothesis[:, :1, :, :].clone()) # Force disp to be positive 98 | update_previous_hypothesis = torch.cat([up_previous_tile_d, up_previous_tile_dx_dy_dscrpt], 1) + previous_delta_hypothesis 99 | # tmp = F.relu(update_previous_hypothesis[:, :1, :, :]) 100 | update_previous_hypothesis[:, :1, :, :] = F.relu(update_previous_hypothesis[:, :1, :, :].clone()) # Force disp to be positive 101 | refined_hypothesis = hypothesis_select_mask * update_current_hypothesis + inverse_hypothesis_select_mask * update_previous_hypothesis 102 | 103 | pre_conf = conf[:, :1, :, :] 104 | cur_conf = conf[:, 1:2, :, :] 105 | update_current_disp = update_current_hypothesis[:, :1, :, :] 106 | update_previous_disp = update_previous_hypothesis[:, :1, :, :] 107 | update_current_dx = update_current_hypothesis[:, 1:2, :, :] 108 | update_previous_dx = update_previous_hypothesis[:, 1:2, :, :] 109 | update_current_dy = update_current_hypothesis[:, 2:3, :, :] 110 | update_previous_dy = update_previous_hypothesis[:, 2:3, :, :] 111 | # pdb.set_trace() 112 | return [ 113 | refined_hypothesis, 114 | update_current_disp, update_previous_disp, 115 | update_current_dx, update_previous_dx, 116 | update_current_dy, update_previous_dy, 117 | cur_conf, pre_conf, 118 | ] 119 | 120 | 121 | class PostTileUpdateNoUp(nn.Module): 122 | """ 123 | No hyp upsampling, equal to pure refinement, for 1/4 res 124 | """ 125 | def __init__(self, in_c, out_c, hid_c, resblk_num, args): 126 | super(PostTileUpdateNoUp, self).__init__() 127 | self.conv0 = BasicConv2d(in_c, hid_c, 1, 1, 0, 1) 128 | self.conv1 = BasicConv2d(hid_c, hid_c, 3, 1, 1, 1) 129 | resblks = nn.ModuleList() 130 | for i in range(resblk_num): 131 | resblks.append(ResBlock(hid_c, hid_c, hid_c)) 132 | self.resblocks = nn.Sequential(*resblks) 133 | self.lastconv = nn.Conv2d(hid_c, out_c, 3, 1, 1, 1, bias=False) 134 | self.upsample = nn.UpsamplingNearest2d(scale_factor=2) 135 | # For final disparity and each supervision signal to be positive 136 | self.relu = nn.ReLU() 137 | 138 | def forward(self, fea_l, previous_hypothesis): 139 | # pdb.set_trace() 140 | guided_up_previous_tile_hypothesis = torch.cat([previous_hypothesis, fea_l], 1) 141 | tile_hypothesis_update = self.conv0(guided_up_previous_tile_hypothesis) 142 | tile_hypothesis_update = self.conv1(tile_hypothesis_update) 143 | tile_hypothesis_update = self.resblocks(tile_hypothesis_update) 144 | tile_hypothesis_update = self.lastconv(tile_hypothesis_update) 145 | refined_hypothesis = previous_hypothesis + tile_hypothesis_update 146 | refined_hypothesis[:, :1, :, :] = F.relu(refined_hypothesis[:, :1, :, :].clone()) 147 | 148 | # pdb.set_trace() 149 | return refined_hypothesis 150 | 151 | 152 | class PostTileUpdate(nn.Module): 153 | """ 154 | Post Tile Update for a single resolution: decrease tile size, e.g. upsampling tile hypothesis, and do tile warping 155 | forward input: fea duo from the largest resolution, tile hypothesis from previous resolution 156 | forward output: refined tile hypothesis 157 | """ 158 | def __init__(self, in_c, out_c, hid_c, resblk_num, slant_disp_up, args): 159 | super(PostTileUpdate, self).__init__() 160 | self.disp_upsample = slant_disp_up 161 | self.conv0 = BasicConv2d(in_c, hid_c, 1, 1, 0, 1) 162 | self.conv1 = BasicConv2d(hid_c, hid_c, 3, 1, 1, 1) 163 | resblks = nn.ModuleList() 164 | for i in range(resblk_num): 165 | resblks.append(ResBlock(hid_c, hid_c, hid_c)) 166 | self.resblocks = nn.Sequential(*resblks) 167 | self.lastconv = nn.Conv2d(hid_c, out_c, 3, 1, 1, 1, bias=False) 168 | self.upsample = nn.UpsamplingNearest2d(scale_factor=2) 169 | # For final disparity and each supervision signal to be positive 170 | self.relu = nn.ReLU() 171 | 172 | def forward(self, fea_l, previous_hypothesis): 173 | previous_tile_d = previous_hypothesis[:, 0, :, :].unsqueeze(1) 174 | previous_tile_dx = previous_hypothesis[:, 1, :, :].unsqueeze(1) # h direction 175 | previous_tile_dy = previous_hypothesis[:, 2, :, :].unsqueeze(1) # w direction 176 | up_previous_tile_d = self.disp_upsample(previous_tile_d, previous_tile_dx, previous_tile_dy) 177 | up_previous_tile_dx_dy = self.upsample(previous_hypothesis[:, 1:3, :, :]) 178 | up_previous_tile_dscrpt = self.upsample(previous_hypothesis[:, 3:, :, :]) 179 | up_previous_tile_hypothesis = torch.cat([up_previous_tile_d, up_previous_tile_dx_dy, up_previous_tile_dscrpt], 1) 180 | # pdb.set_trace() 181 | guided_up_previous_tile_hypothesis = torch.cat([up_previous_tile_hypothesis, fea_l], 1) 182 | tile_hypothesis_update = self.conv0(guided_up_previous_tile_hypothesis) 183 | tile_hypothesis_update = self.conv1(tile_hypothesis_update) 184 | tile_hypothesis_update = self.resblocks(tile_hypothesis_update) 185 | tile_hypothesis_update = self.lastconv(tile_hypothesis_update) 186 | refined_hypothesis = up_previous_tile_hypothesis + tile_hypothesis_update 187 | # tmp = F.relu(refined_hypothesis[:, :1, :, :]) 188 | refined_hypothesis[:, :1, :, :] = F.relu(refined_hypothesis[:, :1, :, :].clone()) # Force disp to be positive 189 | 190 | # pdb.set_trace() 191 | return refined_hypothesis 192 | 193 | 194 | class FinalTileUpdate(nn.Module): 195 | """ 196 | Final Tile Update: only predicts disp 197 | forward input: fea duo from the largest resolution, tile hypothesis from previous resolution 198 | forward output: refined tile hypothesis 199 | """ 200 | def __init__(self, in_c, out_c, hid_c, resblk_num, slant_disp_up, args): 201 | super(FinalTileUpdate, self).__init__() 202 | self.disp_upsample = slant_disp_up 203 | self.conv0 = BasicConv2d(in_c, hid_c, 1, 1, 0, 1) 204 | self.conv1 = BasicConv2d(hid_c, hid_c, 3, 1, 1, 1) 205 | resblks = nn.ModuleList() 206 | for i in range(resblk_num): 207 | resblks.append(ResBlock(hid_c, hid_c, hid_c)) 208 | self.resblocks = nn.Sequential(*resblks) 209 | self.lastconv = nn.Conv2d(hid_c, out_c, 3, 1, 1, 1, bias=False) 210 | self.upsample = nn.UpsamplingNearest2d(scale_factor=2) 211 | # For final disparity and each supervision signal to be positive 212 | self.relu = nn.ReLU() 213 | 214 | def forward(self, fea_l, previous_hypothesis): 215 | previous_tile_d = previous_hypothesis[:, 0, :, :].unsqueeze(1) 216 | previous_tile_dx = previous_hypothesis[:, 1, :, :].unsqueeze(1) # h direction 217 | previous_tile_dy = previous_hypothesis[:, 2, :, :].unsqueeze(1) # w direction 218 | up_previous_tile_d = self.disp_upsample(previous_tile_d, previous_tile_dx, previous_tile_dy) 219 | up_previous_tile_dx_dy = self.upsample(previous_hypothesis[:, 1:3, :, :]) 220 | up_previous_tile_dscrpt = self.upsample(previous_hypothesis[:, 3:, :, :]) 221 | up_previous_tile_hypothesis = torch.cat([up_previous_tile_d, up_previous_tile_dx_dy, up_previous_tile_dscrpt], 1) 222 | # pdb.set_trace() 223 | guided_up_previous_tile_hypothesis = torch.cat([up_previous_tile_hypothesis, fea_l], 1) 224 | tile_hypothesis_update = self.conv0(guided_up_previous_tile_hypothesis) 225 | tile_hypothesis_update = self.conv1(tile_hypothesis_update) 226 | tile_hypothesis_update = self.resblocks(tile_hypothesis_update) 227 | tile_hypothesis_update = self.lastconv(tile_hypothesis_update) 228 | refined_hypothesis = up_previous_tile_d+ tile_hypothesis_update 229 | refined_hypothesis = F.relu(refined_hypothesis.clone()) # Force disp to be positive 230 | 231 | # pdb.set_trace() 232 | return refined_hypothesis 233 | -------------------------------------------------------------------------------- /models/tile_warping.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | import pdb 5 | from .submodules import DispUpsampleBySlantedPlane, BuildVolume2dChaos 6 | 7 | 8 | class TileWarping(nn.Module): 9 | def __init__(self, args): 10 | super(TileWarping, self).__init__() 11 | self.disp_up = DispUpsampleBySlantedPlane(4) 12 | self.build_l1_volume_chaos = BuildVolume2dChaos() 13 | 14 | def forward(self, tile_plane: torch.Tensor, fea_l: torch.Tensor, fea_r: torch.Tensor): 15 | """ 16 | local cost volume 17 | :param tile_plane: d, dx, dy 18 | :param fea_l: 19 | :param fea_r: 20 | :return: local cost volume 21 | """ 22 | tile_d = tile_plane[:, 0, :, :].unsqueeze(1) 23 | tile_dx = tile_plane[:, 1, :, :].unsqueeze(1) # h direction 24 | tile_dy = tile_plane[:, 2, :, :].unsqueeze(1) # w direction 25 | local_cv = [] 26 | for disp_d in range(-1, 2): 27 | flatten_local_disp_ws_disp_d = self.disp_up(tile_d + disp_d, tile_dx, tile_dy) 28 | cv_ws_disp_d = self.build_l1_volume_chaos(fea_l, fea_r, flatten_local_disp_ws_disp_d) 29 | local_cv_ws_disp_d = [] # local cost volume in one disp hypothesis [B, 16, H/4, W/4] 30 | for i in range(4): 31 | for j in range(4): 32 | local_cv_ws_disp_d.append(cv_ws_disp_d[:, :, i::4, j::4]) 33 | local_cv_ws_disp_d = torch.cat(local_cv_ws_disp_d, 1) 34 | local_cv.append(local_cv_ws_disp_d) # local cost volume containing all the disp hypothesis[B, 48, H/4, W/4] 35 | # pdb.set_trace() 36 | local_cv = torch.cat(local_cv, 1) 37 | return local_cv 38 | 39 | 40 | class TileWarping1(nn.Module): 41 | """ 42 | Functionality same as TileWarping but with variable tile size 43 | """ 44 | def __init__(self, tile_size, args): 45 | super(TileWarping1, self).__init__() 46 | self.tile_size = tile_size 47 | self.center = (tile_size - 1) / 2 48 | self.disp_up = DispUpsampleBySlantedPlane(tile_size) 49 | self.build_l1_volume_chaos = BuildVolume2dChaos() 50 | 51 | def forward(self, tile_plane: torch.Tensor, fea_l: torch.Tensor, fea_r: torch.Tensor): 52 | """ 53 | local cost volume 54 | :param tile_plane: d, dx, dy 55 | :param fea_l: 56 | :param fea_r: 57 | :return: local cost volume 58 | """ 59 | tile_d = tile_plane[:, 0, :, :].unsqueeze(1) 60 | tile_dx = tile_plane[:, 1, :, :].unsqueeze(1) # h direction 61 | tile_dy = tile_plane[:, 2, :, :].unsqueeze(1) # w direction 62 | local_cv = [] 63 | for disp_d in range(-1, 2): 64 | flatten_local_disp_ws_disp_d = self.disp_up(tile_d + disp_d, tile_dx, tile_dy) 65 | cv_ws_disp_d = self.build_l1_volume_chaos(fea_l, fea_r, flatten_local_disp_ws_disp_d) 66 | local_cv_ws_disp_d = [] # local cost volume in one disp hypothesis [B, 16, H/4, W/4] 67 | for i in range(self.tile_size): 68 | for j in range(self.tile_size): 69 | local_cv_ws_disp_d.append(cv_ws_disp_d[:, :, i::self.tile_size, j::self.tile_size]) 70 | local_cv_ws_disp_d = torch.cat(local_cv_ws_disp_d, 1) 71 | local_cv.append(local_cv_ws_disp_d) # local cost volume containing all the disp hypothesis[B, 48, H/4, W/4] 72 | # pdb.set_trace() 73 | local_cv = torch.cat(local_cv, 1) 74 | return local_cv 75 | -------------------------------------------------------------------------------- /utils/__init__.py: -------------------------------------------------------------------------------- 1 | from utils.experiment import * 2 | from utils.visualization import * 3 | from utils.metrics import D1_metric, Thres_metric, EPE_metric 4 | -------------------------------------------------------------------------------- /utils/experiment.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function, division 2 | import torch 3 | import torch.nn as nn 4 | import torch.nn.parallel 5 | import torch.utils.data 6 | from torch.autograd import Variable 7 | import torchvision.utils as vutils 8 | import torch.nn.functional as F 9 | import numpy as np 10 | import copy 11 | 12 | 13 | def make_iterative_func(func): 14 | def wrapper(vars): 15 | if isinstance(vars, list): 16 | return [wrapper(x) for x in vars] 17 | elif isinstance(vars, tuple): 18 | return tuple([wrapper(x) for x in vars]) 19 | elif isinstance(vars, dict): 20 | return {k: wrapper(v) for k, v in vars.items()} 21 | else: 22 | return func(vars) 23 | 24 | return wrapper 25 | 26 | 27 | def make_nograd_func(func): 28 | def wrapper(*f_args, **f_kwargs): 29 | with torch.no_grad(): 30 | ret = func(*f_args, **f_kwargs) 31 | return ret 32 | 33 | return wrapper 34 | 35 | 36 | @make_iterative_func 37 | def tensor2float(vars): 38 | if isinstance(vars, float): 39 | return vars 40 | elif isinstance(vars, torch.Tensor): 41 | return vars.data.item() 42 | else: 43 | raise NotImplementedError("invalid input type for tensor2float") 44 | 45 | 46 | @make_iterative_func 47 | def tensor2numpy(vars): 48 | if isinstance(vars, np.ndarray): 49 | return vars 50 | elif isinstance(vars, torch.Tensor): 51 | return vars.data.cpu().numpy() 52 | else: 53 | raise NotImplementedError("invalid input type for tensor2numpy") 54 | 55 | 56 | @make_iterative_func 57 | def check_allfloat(vars): 58 | assert isinstance(vars, float) 59 | 60 | 61 | def save_scalars(logger, mode_tag, scalar_dict, global_step): 62 | scalar_dict = tensor2float(scalar_dict) 63 | for tag, values in scalar_dict.items(): 64 | if not isinstance(values, list) and not isinstance(values, tuple): 65 | values = [values] 66 | for idx, value in enumerate(values): 67 | scalar_name = '{}/{}'.format(mode_tag, tag) 68 | # if len(values) > 1: 69 | scalar_name = scalar_name + "_" + str(idx) 70 | logger.add_scalar(scalar_name, value, global_step) 71 | 72 | 73 | def save_images(logger, mode_tag, images_dict, global_step): 74 | images_dict = tensor2numpy(images_dict) 75 | # print('images_dict shape: {}'.format(images_dict.shape)) 76 | for tag, values in images_dict.items(): 77 | if not isinstance(values, list) and not isinstance(values, tuple): 78 | values = [values] 79 | # print('values len: {}'.format(len(values))) 80 | for idx, value in enumerate(values): 81 | # print('value shape: {}'.format(value.shape)) 82 | if len(value.shape) == 3: 83 | value = value[:, np.newaxis, :, :] 84 | value = value[:1] 85 | value = torch.from_numpy(value) 86 | 87 | image_name = '{}/{}'.format(mode_tag, tag) 88 | if len(values) > 1: 89 | image_name = image_name + "_" + str(idx) 90 | logger.add_image('img_' + image_name, vutils.make_grid(value, padding=0, nrow=1, normalize=True, scale_each=True), 91 | global_step) 92 | 93 | 94 | def save_hist(logger, mode_tag, in_tensor, global_step): 95 | images_dict = tensor2numpy(in_tensor) 96 | # print('images_dict shape: {}'.format(images_dict.shape)) 97 | for tag, values in images_dict.items(): 98 | if not isinstance(values, list) and not isinstance(values, tuple): 99 | values = [values] 100 | print('values len: {}'.format(len(values))) 101 | for idx, value in enumerate(values): 102 | print('value shape: {}'.format(value.shape)) 103 | if len(value.shape) == 3: 104 | value = value[:, np.newaxis, :, :] 105 | value = value[:1] 106 | value = torch.from_numpy(value) 107 | value = value.view(-1) 108 | 109 | image_name = '{}/{}'.format(mode_tag, tag) 110 | if len(values) > 1: 111 | image_name = image_name + "_" + str(idx) 112 | logger.add_histogram(image_name, value, global_step) 113 | 114 | 115 | def adjust_learning_rate(optimizer, epoch, base_lr, lrepochs): 116 | splits = lrepochs.split(':') 117 | assert len(splits) == 2 118 | 119 | # parse the epochs to downscale the learning rate (before :) 120 | downscale_epochs = [int(eid_str) for eid_str in splits[0].split(',')] 121 | # parse downscale rate (after :) 122 | downscale_rate = [float(eid_str) for eid_str in splits[1].split(',')] 123 | print("downscale epochs: {}, downscale rate: {}".format(downscale_epochs, downscale_rate)) 124 | 125 | lr = base_lr 126 | for eid, downscale_rate in zip(downscale_epochs, downscale_rate): 127 | if epoch >= eid: 128 | lr /= downscale_rate 129 | else: 130 | break 131 | print("setting learning rate to {}".format(lr)) 132 | for param_group in optimizer.param_groups: 133 | param_group['lr'] = lr 134 | 135 | 136 | class AverageMeter(object): 137 | def __init__(self): 138 | self.sum_value = 0. 139 | self.count = 0 140 | 141 | def update(self, x): 142 | check_allfloat(x) 143 | self.sum_value += x 144 | self.count += 1 145 | 146 | def mean(self): 147 | return self.sum_value / self.count 148 | 149 | 150 | class AverageMeterDict(object): 151 | def __init__(self): 152 | self.data = None 153 | self.count = 0 154 | 155 | def update(self, x): 156 | check_allfloat(x) 157 | self.count += 1 158 | if self.data is None: 159 | self.data = copy.deepcopy(x) 160 | else: 161 | for k1, v1 in x.items(): 162 | if isinstance(v1, float): 163 | self.data[k1] += v1 164 | elif isinstance(v1, tuple) or isinstance(v1, list): 165 | for idx, v2 in enumerate(v1): 166 | self.data[k1][idx] += v2 167 | else: 168 | assert NotImplementedError("error input type for update AvgMeterDict") 169 | 170 | def mean(self): 171 | @make_iterative_func 172 | def get_mean(v): 173 | return v / float(self.count) 174 | 175 | return get_mean(self.data) 176 | -------------------------------------------------------------------------------- /utils/metrics.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn.functional as F 3 | from utils.experiment import make_nograd_func 4 | from torch.autograd import Variable 5 | from torch import Tensor 6 | 7 | 8 | # Update D1 from >3px to >=3px & >5% 9 | # matlab code: 10 | # E = abs(D_gt - D_est); 11 | # n_err = length(find(D_gt > 0 & E > tau(1) & E. / abs(D_gt) > tau(2))); 12 | # n_total = length(find(D_gt > 0)); 13 | # d_err = n_err / n_total; 14 | 15 | def check_shape_for_metric_computation(*vars): 16 | assert isinstance(vars, tuple) 17 | for var in vars: 18 | assert len(var.size()) == 3 19 | assert var.size() == vars[0].size() 20 | 21 | # a wrapper to compute metrics for each image individually 22 | def compute_metric_for_each_image(metric_func): 23 | def wrapper(D_ests, D_gts, masks, *nargs): 24 | check_shape_for_metric_computation(D_ests, D_gts, masks) 25 | bn = D_gts.shape[0] # batch size 26 | results = [] # a list to store results for each image 27 | # compute result one by one 28 | for idx in range(bn): 29 | # if tensor, then pick idx, else pass the same value 30 | cur_nargs = [x[idx] if isinstance(x, (Tensor, Variable)) else x for x in nargs] 31 | if masks[idx].float().mean() / (D_gts[idx] > 0).float().mean() < 0.1: 32 | print("masks[idx].float().mean() too small, skip") 33 | else: 34 | ret = metric_func(D_ests[idx], D_gts[idx], masks[idx], *cur_nargs) 35 | results.append(ret) 36 | if len(results) == 0: 37 | print("masks[idx].float().mean() too small for all images in this batch, return 0") 38 | return torch.tensor(0, dtype=torch.float32, device=D_gts.device) 39 | else: 40 | return torch.stack(results).mean() 41 | return wrapper 42 | 43 | @make_nograd_func 44 | @compute_metric_for_each_image 45 | def D1_metric(D_est, D_gt, mask): 46 | D_est, D_gt = D_est[mask], D_gt[mask] 47 | E = torch.abs(D_gt - D_est) 48 | err_mask = (E > 3) & (E / D_gt.abs() > 0.05) 49 | return torch.mean(err_mask.float()) 50 | 51 | @make_nograd_func 52 | @compute_metric_for_each_image 53 | def Thres_metric(D_est, D_gt, mask, thres): 54 | assert isinstance(thres, (int, float)) 55 | D_est, D_gt = D_est[mask], D_gt[mask] 56 | E = torch.abs(D_gt - D_est) 57 | err_mask = E > thres 58 | return torch.mean(err_mask.float()) 59 | 60 | # NOTE: please do not use this to build up training loss 61 | @make_nograd_func 62 | @compute_metric_for_each_image 63 | def EPE_metric(D_est, D_gt, mask): 64 | D_est, D_gt = D_est[mask], D_gt[mask] 65 | return F.l1_loss(D_est, D_gt, size_average=True) 66 | -------------------------------------------------------------------------------- /utils/saver.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import torch 4 | from collections import OrderedDict 5 | import glob 6 | import torch.distributed as dist 7 | import json 8 | 9 | 10 | class Saver(object): 11 | 12 | def __init__(self, args, use_dist=False): 13 | self.args = args 14 | self.use_dist = use_dist 15 | # self.directory = os.path.join('run', args.dataset, args.checkname) 16 | self.directory = args.logdir 17 | self.runs = sorted(glob.glob(os.path.join(self.directory, 'experiment_*'))) # Sort saved results folders 18 | self.run_id = max([int(x.split('_')[-1]) for x in self.runs]) + 1 if self.runs else 0 # Create a new folder id 19 | self.experiment_dir = os.path.join(self.directory, 'experiment_{}'.format(str(self.run_id))) 20 | if not os.path.exists(self.experiment_dir): 21 | os.makedirs(self.experiment_dir) 22 | print('Saver currently runs in {}'.format(self.experiment_dir)) 23 | 24 | def save_experiment_config(self): 25 | """Write experiment config to file""" 26 | 27 | if (self.use_dist and dist.get_rank() == 0) or not self.use_dist: 28 | logfile = os.path.join(self.experiment_dir, 'parameters.txt') 29 | log_file = open(logfile, 'w') 30 | log_file.write('\n') 31 | json.dump(self.args.__dict__, log_file, indent=2) 32 | log_file.write('\n') 33 | log_file.close() 34 | -------------------------------------------------------------------------------- /utils/visualization.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | import torch 3 | import torch.nn as nn 4 | import torch.utils.data 5 | from torch.autograd import Variable, Function 6 | import torch.nn.functional as F 7 | import math 8 | import numpy as np 9 | 10 | 11 | def gen_error_colormap(): 12 | cols = np.array( 13 | [[0 / 3.0, 0.1875 / 3.0, 49, 54, 149], 14 | [0.1875 / 3.0, 0.375 / 3.0, 69, 117, 180], 15 | [0.375 / 3.0, 0.75 / 3.0, 116, 173, 209], 16 | [0.75 / 3.0, 1.5 / 3.0, 171, 217, 233], 17 | [1.5 / 3.0, 3 / 3.0, 224, 243, 248], 18 | [3 / 3.0, 6 / 3.0, 254, 224, 144], 19 | [6 / 3.0, 12 / 3.0, 253, 174, 97], 20 | [12 / 3.0, 24 / 3.0, 244, 109, 67], 21 | [24 / 3.0, 48 / 3.0, 215, 48, 39], 22 | [48 / 3.0, np.inf, 165, 0, 38]], dtype=np.float32) 23 | cols[:, 2: 5] /= 255. 24 | return cols 25 | 26 | 27 | error_colormap = gen_error_colormap() 28 | 29 | 30 | class disp_error_image_func(Function): 31 | def forward(self, D_est_tensor, D_gt_tensor, abs_thres=3., rel_thres=0.05, dilate_radius=1): 32 | D_gt_np = D_gt_tensor.detach().cpu().numpy() 33 | D_est_np = D_est_tensor.detach().cpu().numpy() 34 | B, H, W = D_gt_np.shape 35 | # valid mask 36 | mask = D_gt_np > 0 37 | # error in percentage. When error <= 1, the pixel is valid since <= 3px & 5% 38 | error = np.abs(D_gt_np - D_est_np) 39 | error[np.logical_not(mask)] = 0 40 | error[mask] = np.minimum(error[mask] / abs_thres, (error[mask] / D_gt_np[mask]) / rel_thres) 41 | # get colormap 42 | cols = error_colormap 43 | # create error image 44 | error_image = np.zeros([B, H, W, 3], dtype=np.float32) 45 | for i in range(cols.shape[0]): 46 | error_image[np.logical_and(error >= cols[i][0], error < cols[i][1])] = cols[i, 2:] 47 | # TODO: imdilate 48 | # error_image = cv2.imdilate(D_err, strel('disk', dilate_radius)); 49 | error_image[np.logical_not(mask)] = 0. 50 | # show color tag in the top-left cornor of the image 51 | for i in range(cols.shape[0]): 52 | distance = 20 53 | error_image[:, :10, i * distance:(i + 1) * distance, :] = cols[i, 2:] 54 | 55 | return torch.from_numpy(np.ascontiguousarray(error_image.transpose([0, 3, 1, 2]))) 56 | 57 | def backward(self, grad_output): 58 | return None 59 | -------------------------------------------------------------------------------- /utils/write_pfm.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import re 3 | import sys 4 | from utils.experiment import tensor2numpy 5 | 6 | 7 | def write_pfm_tensor(file, image, scale = 1): 8 | image = tensor2numpy(image) 9 | image = np.array(image, dtype='float32') 10 | file = open(file, 'wb') 11 | 12 | color = None 13 | 14 | if image.dtype.name != 'float32': 15 | raise Exception('Image dtype must be float32.') 16 | 17 | if len(image.shape) == 3 and image.shape[2] == 3: # color image 18 | color = True 19 | elif len(image.shape) == 2 or len(image.shape) == 3 and image.shape[2] == 1: # greyscale 20 | color = False 21 | else: 22 | raise Exception('Image must have H x W x 3, H x W x 1 or H x W dimensions.') 23 | 24 | file.write(b'PF\n' if color else b'Pf\n') 25 | file.write(b'%d %d\n' % (image.shape[1], image.shape[0])) 26 | 27 | endian = image.dtype.byteorder 28 | 29 | if endian == '<' or endian == '=' and sys.byteorder == 'little': 30 | scale = -scale 31 | 32 | file.write(b'%f\n' % scale) 33 | 34 | image = np.flipud(image) 35 | 36 | image.tofile(file) --------------------------------------------------------------------------------