├── images └── filled_disparity_comparison.png ├── utils ├── get_model.sh ├── evaluate_kitti.py ├── kitti_archives_to_download.txt ├── evaluation_utils.py └── filenames │ ├── kitti_stereo_2015_test_files.txt │ └── cityscapes_val_files.txt ├── average_gradients.py ├── bilinear_sampler.py ├── monodepth_simple.py ├── monodepth_dataloader.py ├── LICENSE ├── readme.md ├── monodepth_main.py ├── disparity_filler_function.py └── monodepth_model.py /images/filled_disparity_comparison.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tudelft/filled-disparity-monodepth/HEAD/images/filled_disparity_comparison.png -------------------------------------------------------------------------------- /utils/get_model.sh: -------------------------------------------------------------------------------- 1 | model_name=$1 2 | output_location=$2 3 | 4 | filename=$model_name.zip 5 | 6 | url=http://visual.cs.ucl.ac.uk/pubs/monoDepth/models/$filename 7 | 8 | output_file=$output_location/$filename 9 | 10 | echo "Downloading $model_name" 11 | wget -nc $url -O $output_file 12 | unzip $output_file -d $output_location 13 | rm $output_file -------------------------------------------------------------------------------- /average_gradients.py: -------------------------------------------------------------------------------- 1 | # Copyright 2015 The TensorFlow Authors. All Rights Reserved. 2 | # 3 | # Licensed under the Apache License, Version 2.0 (the "License"); 4 | # you may not use this file except in compliance with the License. 5 | # You may obtain a copy of the License at 6 | # 7 | # http://www.apache.org/licenses/LICENSE-2.0 8 | # 9 | # Unless required by applicable law or agreed to in writing, software 10 | # distributed under the License is distributed on an "AS IS" BASIS, 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | # See the License for the specific language governing permissions and 13 | # limitations under the License. 14 | 15 | from __future__ import absolute_import, division, print_function 16 | import tensorflow as tf 17 | 18 | def average_gradients(tower_grads): 19 | 20 | average_grads = [] 21 | for grad_and_vars in zip(*tower_grads): 22 | # Note that each grad_and_vars looks like the following: 23 | # ((grad0_gpu0, var0_gpu0), ... , (grad0_gpuN, var0_gpuN)) 24 | grads = [] 25 | for g, _ in grad_and_vars: 26 | # Add 0 dimension to the gradients to represent the tower. 27 | expanded_g = tf.expand_dims(g, 0) 28 | 29 | # Append on a 'tower' dimension which we will average over below. 30 | grads.append(expanded_g) 31 | 32 | # Average over the 'tower' dimension. 33 | grad = tf.concat(axis=0, values=grads) 34 | grad = tf.reduce_mean(grad, 0) 35 | 36 | # Keep in mind that the Variables are redundant because they are shared 37 | # across towers. So .. we will just return the first tower's pointer to 38 | # the Variable. 39 | v = grad_and_vars[0][1] 40 | grad_and_var = (grad, v) 41 | average_grads.append(grad_and_var) 42 | return average_grads 43 | -------------------------------------------------------------------------------- /bilinear_sampler.py: -------------------------------------------------------------------------------- 1 | # Copyright 2016 The TensorFlow Authors. All Rights Reserved. 2 | # Copyright 2017 Modifications Clement Godard. 3 | # 4 | # Licensed under the Apache License, Version 2.0 (the "License"); 5 | # you may not use this file except in compliance with the License. 6 | # You may obtain a copy of the License at 7 | # 8 | # http://www.apache.org/licenses/LICENSE-2.0 9 | # 10 | # Unless required by applicable law or agreed to in writing, software 11 | # distributed under the License is distributed on an "AS IS" BASIS, 12 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | # See the License for the specific language governing permissions and 14 | # limitations under the License. 15 | # ============================================================================== 16 | 17 | from __future__ import absolute_import, division, print_function 18 | import tensorflow as tf 19 | 20 | def bilinear_sampler_1d_h(input_images, x_offset, wrap_mode='border', name='bilinear_sampler', **kwargs): 21 | def _repeat(x, n_repeats): 22 | with tf.variable_scope('_repeat'): 23 | rep = tf.tile(tf.expand_dims(x, 1), [1, n_repeats]) 24 | return tf.reshape(rep, [-1]) 25 | 26 | def _interpolate(im, x, y): 27 | with tf.variable_scope('_interpolate'): 28 | 29 | # handle both texture border types 30 | _edge_size = 0 31 | if _wrap_mode == 'border': 32 | _edge_size = 1 33 | im = tf.pad(im, [[0, 0], [1, 1], [1, 1], [0, 0]], mode='CONSTANT') 34 | x = x + _edge_size 35 | y = y + _edge_size 36 | elif _wrap_mode == 'edge': 37 | _edge_size = 0 38 | else: 39 | return None 40 | 41 | x = tf.clip_by_value(x, 0.0, _width_f - 1 + 2 * _edge_size) 42 | 43 | x0_f = tf.floor(x) 44 | y0_f = tf.floor(y) 45 | x1_f = x0_f + 1 46 | 47 | x0 = tf.cast(x0_f, tf.int32) 48 | y0 = tf.cast(y0_f, tf.int32) 49 | x1 = tf.cast(tf.minimum(x1_f, _width_f - 1 + 2 * _edge_size), tf.int32) 50 | 51 | dim2 = (_width + 2 * _edge_size) 52 | dim1 = (_width + 2 * _edge_size) * (_height + 2 * _edge_size) 53 | base = _repeat(tf.range(_num_batch) * dim1, _height * _width) 54 | base_y0 = base + y0 * dim2 55 | idx_l = base_y0 + x0 56 | idx_r = base_y0 + x1 57 | 58 | im_flat = tf.reshape(im, tf.stack([-1, _num_channels])) 59 | 60 | pix_l = tf.gather(im_flat, idx_l) 61 | pix_r = tf.gather(im_flat, idx_r) 62 | 63 | weight_l = tf.expand_dims(x1_f - x, 1) 64 | weight_r = tf.expand_dims(x - x0_f, 1) 65 | 66 | return weight_l * pix_l + weight_r * pix_r 67 | 68 | def _transform(input_images, x_offset): 69 | with tf.variable_scope('transform'): 70 | # grid of (x_t, y_t, 1), eq (1) in ref [1] 71 | x_t, y_t = tf.meshgrid(tf.linspace(0.0, _width_f - 1.0, _width), 72 | tf.linspace(0.0 , _height_f - 1.0 , _height)) 73 | 74 | x_t_flat = tf.reshape(x_t, (1, -1)) 75 | y_t_flat = tf.reshape(y_t, (1, -1)) 76 | 77 | x_t_flat = tf.tile(x_t_flat, tf.stack([_num_batch, 1])) 78 | y_t_flat = tf.tile(y_t_flat, tf.stack([_num_batch, 1])) 79 | 80 | x_t_flat = tf.reshape(x_t_flat, [-1]) 81 | y_t_flat = tf.reshape(y_t_flat, [-1]) 82 | 83 | x_t_flat = x_t_flat + tf.reshape(x_offset, [-1]) * _width_f 84 | 85 | input_transformed = _interpolate(input_images, x_t_flat, y_t_flat) 86 | 87 | output = tf.reshape( 88 | input_transformed, tf.stack([_num_batch, _height, _width, _num_channels])) 89 | return output 90 | 91 | with tf.variable_scope(name): 92 | _num_batch = tf.shape(input_images)[0] 93 | _height = tf.shape(input_images)[1] 94 | _width = tf.shape(input_images)[2] 95 | _num_channels = tf.shape(input_images)[3] 96 | 97 | _height_f = tf.cast(_height, tf.float32) 98 | _width_f = tf.cast(_width, tf.float32) 99 | 100 | _wrap_mode = wrap_mode 101 | 102 | output = _transform(input_images, x_offset) 103 | return output 104 | -------------------------------------------------------------------------------- /monodepth_simple.py: -------------------------------------------------------------------------------- 1 | # Copyright UCL Business plc 2017. Patent Pending. All rights reserved. 2 | # 3 | # The MonoDepth Software is licensed under the terms of the UCLB ACP-A licence 4 | # which allows for non-commercial use only, the full terms of which are made 5 | # available in the LICENSE file. 6 | # 7 | # For any other use of the software not covered by the UCLB ACP-A Licence, 8 | # please contact info@uclb.com 9 | 10 | from __future__ import absolute_import, division, print_function 11 | 12 | # only keep warnings and errors 13 | import os 14 | os.environ['TF_CPP_MIN_LOG_LEVEL']='0' 15 | 16 | import numpy as np 17 | import argparse 18 | import re 19 | import time 20 | import tensorflow as tf 21 | import tensorflow.contrib.slim as slim 22 | import scipy.misc 23 | import matplotlib.pyplot as plt 24 | 25 | from monodepth_model import * 26 | from monodepth_dataloader import * 27 | from average_gradients import * 28 | 29 | parser = argparse.ArgumentParser(description='Monodepth TensorFlow implementation.') 30 | 31 | parser.add_argument('--encoder', type=str, help='type of encoder, vgg or resnet50', default='vgg') 32 | parser.add_argument('--image_path', type=str, help='path to the image', required=True) 33 | parser.add_argument('--checkpoint_path', type=str, help='path to a specific checkpoint to load', required=True) 34 | parser.add_argument('--input_height', type=int, help='input height', default=256) 35 | parser.add_argument('--input_width', type=int, help='input width', default=512) 36 | 37 | args = parser.parse_args() 38 | 39 | def post_process_disparity(disp): 40 | _, h, w = disp.shape 41 | l_disp = disp[0,:,:] 42 | r_disp = np.fliplr(disp[1,:,:]) 43 | m_disp = 0.5 * (l_disp + r_disp) 44 | l, _ = np.meshgrid(np.linspace(0, 1, w), np.linspace(0, 1, h)) 45 | l_mask = 1.0 - np.clip(20 * (l - 0.05), 0, 1) 46 | r_mask = np.fliplr(l_mask) 47 | return r_mask * l_disp + l_mask * r_disp + (1.0 - l_mask - r_mask) * m_disp 48 | 49 | def test_simple(params): 50 | """Test function.""" 51 | 52 | left = tf.placeholder(tf.float32, [2, args.input_height, args.input_width, 3]) 53 | model = MonodepthModel(params, "test", left, None) 54 | 55 | input_image = scipy.misc.imread(args.image_path, mode="RGB") 56 | original_height, original_width, num_channels = input_image.shape 57 | input_image = scipy.misc.imresize(input_image, [args.input_height, args.input_width], interp='lanczos') 58 | input_image = input_image.astype(np.float32) / 255 59 | input_images = np.stack((input_image, np.fliplr(input_image)), 0) 60 | 61 | # SESSION 62 | config = tf.ConfigProto(allow_soft_placement=True) 63 | sess = tf.Session(config=config) 64 | 65 | # SAVER 66 | train_saver = tf.train.Saver() 67 | 68 | # INIT 69 | sess.run(tf.global_variables_initializer()) 70 | sess.run(tf.local_variables_initializer()) 71 | coordinator = tf.train.Coordinator() 72 | threads = tf.train.start_queue_runners(sess=sess, coord=coordinator) 73 | 74 | # RESTORE 75 | restore_path = args.checkpoint_path.split(".")[0] 76 | train_saver.restore(sess, restore_path) 77 | 78 | disp = sess.run(model.disp_left_est[0], feed_dict={left: input_images}) 79 | disp_pp = post_process_disparity(disp.squeeze()).astype(np.float32) 80 | 81 | output_directory = os.path.dirname(args.image_path) 82 | output_name = os.path.splitext(os.path.basename(args.image_path))[0] 83 | 84 | np.save(os.path.join(output_directory, "{}_disp.npy".format(output_name)), disp_pp) 85 | disp_to_img = scipy.misc.imresize(disp_pp.squeeze(), [original_height, original_width]) 86 | plt.imsave(os.path.join(output_directory, "{}_disp.png".format(output_name)), disp_to_img, cmap='plasma') 87 | 88 | print('done!') 89 | 90 | def main(_): 91 | 92 | params = monodepth_parameters( 93 | encoder=args.encoder, 94 | height=args.input_height, 95 | width=args.input_width, 96 | batch_size=2, 97 | num_threads=1, 98 | num_epochs=1, 99 | do_stereo=False, 100 | wrap_mode="border", 101 | use_deconv=False, 102 | alpha_image_loss=0, 103 | disp_gradient_loss_weight=0, 104 | lr_loss_weight=0, 105 | full_summary=False) 106 | 107 | test_simple(params) 108 | 109 | if __name__ == '__main__': 110 | tf.app.run() 111 | -------------------------------------------------------------------------------- /utils/evaluate_kitti.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv, cv2 3 | import argparse 4 | from evaluation_utils import * 5 | 6 | parser = argparse.ArgumentParser(description='Evaluation on the KITTI dataset') 7 | parser.add_argument('--split', type=str, help='data split, kitti or eigen', required=True) 8 | parser.add_argument('--predicted_disp_path', type=str, help='path to estimated disparities', required=True) 9 | parser.add_argument('--gt_path', type=str, help='path to ground truth disparities', required=True) 10 | parser.add_argument('--min_depth', type=float, help='minimum depth for evaluation', default=1e-3) 11 | parser.add_argument('--max_depth', type=float, help='maximum depth for evaluation', default=80) 12 | parser.add_argument('--eigen_crop', help='if set, crops according to Eigen NIPS14', action='store_true') 13 | parser.add_argument('--garg_crop', help='if set, crops according to Garg ECCV16', action='store_true') 14 | 15 | args = parser.parse_args() 16 | 17 | if __name__ == '__main__': 18 | 19 | pred_disparities = np.load(args.predicted_disp_path) 20 | 21 | if args.split == 'kitti': 22 | num_samples = 200 23 | 24 | gt_disparities = load_gt_disp_kitti(args.gt_path) 25 | gt_depths, pred_depths, pred_disparities_resized = convert_disps_to_depths_kitti(gt_disparities, pred_disparities) 26 | 27 | elif args.split == 'eigen': 28 | num_samples = 697 29 | test_files = read_text_lines(args.gt_path + 'eigen_test_files.txt') 30 | gt_files, gt_calib, im_sizes, im_files, cams = read_file_data(test_files, args.gt_path) 31 | 32 | num_test = len(im_files) 33 | gt_depths = [] 34 | pred_depths = [] 35 | for t_id in range(num_samples): 36 | camera_id = cams[t_id] # 2 is left, 3 is right 37 | depth = generate_depth_map(gt_calib[t_id], gt_files[t_id], im_sizes[t_id], camera_id, False, True) 38 | gt_depths.append(depth.astype(np.float32)) 39 | 40 | disp_pred = cv2.resize(pred_disparities[t_id], (im_sizes[t_id][1], im_sizes[t_id][0]), interpolation=cv2.INTER_LINEAR) 41 | disp_pred = disp_pred * disp_pred.shape[1] 42 | 43 | # need to convert from disparity to depth 44 | focal_length, baseline = get_focal_length_baseline(gt_calib[t_id], camera_id) 45 | depth_pred = (baseline * focal_length) / disp_pred 46 | depth_pred[np.isinf(depth_pred)] = 0 47 | 48 | pred_depths.append(depth_pred) 49 | 50 | rms = np.zeros(num_samples, np.float32) 51 | log_rms = np.zeros(num_samples, np.float32) 52 | abs_rel = np.zeros(num_samples, np.float32) 53 | sq_rel = np.zeros(num_samples, np.float32) 54 | d1_all = np.zeros(num_samples, np.float32) 55 | a1 = np.zeros(num_samples, np.float32) 56 | a2 = np.zeros(num_samples, np.float32) 57 | a3 = np.zeros(num_samples, np.float32) 58 | 59 | for i in range(num_samples): 60 | 61 | gt_depth = gt_depths[i] 62 | pred_depth = pred_depths[i] 63 | 64 | pred_depth[pred_depth < args.min_depth] = args.min_depth 65 | pred_depth[pred_depth > args.max_depth] = args.max_depth 66 | 67 | if args.split == 'eigen': 68 | mask = np.logical_and(gt_depth > args.min_depth, gt_depth < args.max_depth) 69 | 70 | 71 | if args.garg_crop or args.eigen_crop: 72 | gt_height, gt_width = gt_depth.shape 73 | 74 | # crop used by Garg ECCV16 75 | # if used on gt_size 370x1224 produces a crop of [-218, -3, 44, 1180] 76 | if args.garg_crop: 77 | crop = np.array([0.40810811 * gt_height, 0.99189189 * gt_height, 78 | 0.03594771 * gt_width, 0.96405229 * gt_width]).astype(np.int32) 79 | # crop we found by trial and error to reproduce Eigen NIPS14 results 80 | elif args.eigen_crop: 81 | crop = np.array([0.3324324 * gt_height, 0.91351351 * gt_height, 82 | 0.0359477 * gt_width, 0.96405229 * gt_width]).astype(np.int32) 83 | 84 | crop_mask = np.zeros(mask.shape) 85 | crop_mask[crop[0]:crop[1],crop[2]:crop[3]] = 1 86 | mask = np.logical_and(mask, crop_mask) 87 | 88 | if args.split == 'kitti': 89 | gt_disp = gt_disparities[i] 90 | mask = gt_disp > 0 91 | pred_disp = pred_disparities_resized[i] 92 | 93 | disp_diff = np.abs(gt_disp[mask] - pred_disp[mask]) 94 | bad_pixels = np.logical_and(disp_diff >= 3, (disp_diff / gt_disp[mask]) >= 0.05) 95 | d1_all[i] = 100.0 * bad_pixels.sum() / mask.sum() 96 | 97 | abs_rel[i], sq_rel[i], rms[i], log_rms[i], a1[i], a2[i], a3[i] = compute_errors(gt_depth[mask], pred_depth[mask]) 98 | 99 | print("{:>10}, {:>10}, {:>10}, {:>10}, {:>10}, {:>10}, {:>10}, {:>10}".format('abs_rel', 'sq_rel', 'rms', 'log_rms', 'd1_all', 'a1', 'a2', 'a3')) 100 | print("{:10.4f}, {:10.4f}, {:10.3f}, {:10.3f}, {:10.3f}, {:10.3f}, {:10.3f}, {:10.3f}".format(abs_rel.mean(), sq_rel.mean(), rms.mean(), log_rms.mean(), d1_all.mean(), a1.mean(), a2.mean(), a3.mean())) 101 | -------------------------------------------------------------------------------- /monodepth_dataloader.py: -------------------------------------------------------------------------------- 1 | # Copyright UCL Business plc 2017. Patent Pending. All rights reserved. 2 | # 3 | # The MonoDepth Software is licensed under the terms of the UCLB ACP-A licence 4 | # which allows for non-commercial use only, the full terms of which are made 5 | # available in the LICENSE file. 6 | # 7 | # For any other use of the software not covered by the UCLB ACP-A Licence, 8 | # please contact info@uclb.com 9 | 10 | """Monodepth data loader. 11 | """ 12 | 13 | from __future__ import absolute_import, division, print_function 14 | import tensorflow as tf 15 | 16 | def string_length_tf(t): 17 | return tf.py_func(len, [t], [tf.int64]) 18 | 19 | class MonodepthDataloader(object): 20 | """monodepth dataloader""" 21 | 22 | def __init__(self, data_path, filenames_file, params, dataset, mode): 23 | self.data_path = data_path 24 | self.params = params 25 | self.dataset = dataset 26 | self.mode = mode 27 | 28 | self.left_image_batch = None 29 | self.right_image_batch = None 30 | 31 | input_queue = tf.train.string_input_producer([filenames_file], shuffle=False) 32 | line_reader = tf.TextLineReader() 33 | _, line = line_reader.read(input_queue) 34 | 35 | split_line = tf.string_split([line]).values 36 | 37 | # we load only one image for test, except if we trained a stereo model 38 | if mode == 'test' and not self.params.do_stereo: 39 | left_image_path = tf.string_join([self.data_path, split_line[0]]) 40 | left_image_o = self.read_image(left_image_path) 41 | else: 42 | left_image_path = tf.string_join([self.data_path, split_line[0]]) 43 | right_image_path = tf.string_join([self.data_path, split_line[1]]) 44 | left_image_o = self.read_image(left_image_path) 45 | right_image_o = self.read_image(right_image_path) 46 | 47 | if mode == 'train': 48 | # randomly flip images 49 | do_flip = tf.random_uniform([], 0, 1) 50 | left_image = tf.cond(do_flip > 0.5, lambda: tf.image.flip_left_right(right_image_o), lambda: left_image_o) 51 | right_image = tf.cond(do_flip > 0.5, lambda: tf.image.flip_left_right(left_image_o), lambda: right_image_o) 52 | 53 | # randomly augment images 54 | do_augment = tf.random_uniform([], 0, 1) 55 | left_image, right_image = tf.cond(do_augment > 0.5, lambda: self.augment_image_pair(left_image, right_image), lambda: (left_image, right_image)) 56 | 57 | left_image.set_shape( [None, None, 3]) 58 | right_image.set_shape([None, None, 3]) 59 | 60 | # capacity = min_after_dequeue + (num_threads + a small safety margin) * batch_size 61 | min_after_dequeue = 2048 62 | capacity = min_after_dequeue + 4 * params.batch_size 63 | self.left_image_batch, self.right_image_batch = tf.train.shuffle_batch([left_image, right_image], 64 | params.batch_size, capacity, min_after_dequeue, params.num_threads) 65 | 66 | elif mode == 'test': 67 | self.left_image_batch = tf.stack([left_image_o, tf.image.flip_left_right(left_image_o)], 0) 68 | self.left_image_batch.set_shape( [2, None, None, 3]) 69 | 70 | if self.params.do_stereo: 71 | self.right_image_batch = tf.stack([right_image_o, tf.image.flip_left_right(right_image_o)], 0) 72 | self.right_image_batch.set_shape( [2, None, None, 3]) 73 | 74 | def augment_image_pair(self, left_image, right_image): 75 | # randomly shift gamma 76 | random_gamma = tf.random_uniform([], 0.8, 1.2) 77 | left_image_aug = left_image ** random_gamma 78 | right_image_aug = right_image ** random_gamma 79 | 80 | # randomly shift brightness 81 | random_brightness = tf.random_uniform([], 0.5, 2.0) 82 | left_image_aug = left_image_aug * random_brightness 83 | right_image_aug = right_image_aug * random_brightness 84 | 85 | # randomly shift color 86 | random_colors = tf.random_uniform([3], 0.8, 1.2) 87 | white = tf.ones([tf.shape(left_image)[0], tf.shape(left_image)[1]]) 88 | color_image = tf.stack([white * random_colors[i] for i in range(3)], axis=2) 89 | left_image_aug *= color_image 90 | right_image_aug *= color_image 91 | 92 | # saturate 93 | left_image_aug = tf.clip_by_value(left_image_aug, 0, 1) 94 | right_image_aug = tf.clip_by_value(right_image_aug, 0, 1) 95 | 96 | return left_image_aug, right_image_aug 97 | 98 | def read_image(self, image_path): 99 | # tf.decode_image does not return the image size, this is an ugly workaround to handle both jpeg and png 100 | path_length = tf.size(tf.string_split([image_path],"")) 101 | file_extension = tf.substr(image_path, path_length - 3, 3) 102 | file_cond = tf.equal(file_extension, 'jpg') 103 | 104 | image = tf.cond(file_cond, lambda: tf.image.decode_jpeg(tf.read_file(image_path)), lambda: tf.image.decode_png(tf.read_file(image_path))) 105 | 106 | # if the dataset is cityscapes, we crop the last fifth to remove the car hood 107 | if self.dataset == 'cityscapes': 108 | o_height = tf.shape(image)[0] 109 | crop_height = (o_height * 4) // 5 110 | image = image[:crop_height,:,:] 111 | 112 | image = tf.image.convert_image_dtype(image, tf.float32) 113 | image = tf.image.resize_images(image, [self.params.height, self.params.width], tf.image.ResizeMethod.AREA) 114 | 115 | return image 116 | -------------------------------------------------------------------------------- /utils/kitti_archives_to_download.txt: -------------------------------------------------------------------------------- 1 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_calib.zip 2 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0001/2011_09_26_drive_0001_sync.zip 3 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0002/2011_09_26_drive_0002_sync.zip 4 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0005/2011_09_26_drive_0005_sync.zip 5 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0009/2011_09_26_drive_0009_sync.zip 6 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0011/2011_09_26_drive_0011_sync.zip 7 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0013/2011_09_26_drive_0013_sync.zip 8 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0014/2011_09_26_drive_0014_sync.zip 9 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0015/2011_09_26_drive_0015_sync.zip 10 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0017/2011_09_26_drive_0017_sync.zip 11 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0018/2011_09_26_drive_0018_sync.zip 12 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0019/2011_09_26_drive_0019_sync.zip 13 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0020/2011_09_26_drive_0020_sync.zip 14 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0022/2011_09_26_drive_0022_sync.zip 15 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0023/2011_09_26_drive_0023_sync.zip 16 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0027/2011_09_26_drive_0027_sync.zip 17 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0028/2011_09_26_drive_0028_sync.zip 18 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0029/2011_09_26_drive_0029_sync.zip 19 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0032/2011_09_26_drive_0032_sync.zip 20 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0035/2011_09_26_drive_0035_sync.zip 21 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0036/2011_09_26_drive_0036_sync.zip 22 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0039/2011_09_26_drive_0039_sync.zip 23 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0046/2011_09_26_drive_0046_sync.zip 24 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0048/2011_09_26_drive_0048_sync.zip 25 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0051/2011_09_26_drive_0051_sync.zip 26 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0052/2011_09_26_drive_0052_sync.zip 27 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0056/2011_09_26_drive_0056_sync.zip 28 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0057/2011_09_26_drive_0057_sync.zip 29 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0059/2011_09_26_drive_0059_sync.zip 30 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0060/2011_09_26_drive_0060_sync.zip 31 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0061/2011_09_26_drive_0061_sync.zip 32 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0064/2011_09_26_drive_0064_sync.zip 33 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0070/2011_09_26_drive_0070_sync.zip 34 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0079/2011_09_26_drive_0079_sync.zip 35 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0084/2011_09_26_drive_0084_sync.zip 36 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0086/2011_09_26_drive_0086_sync.zip 37 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0087/2011_09_26_drive_0087_sync.zip 38 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0091/2011_09_26_drive_0091_sync.zip 39 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0093/2011_09_26_drive_0093_sync.zip 40 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0095/2011_09_26_drive_0095_sync.zip 41 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0096/2011_09_26_drive_0096_sync.zip 42 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0101/2011_09_26_drive_0101_sync.zip 43 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0104/2011_09_26_drive_0104_sync.zip 44 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0106/2011_09_26_drive_0106_sync.zip 45 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0113/2011_09_26_drive_0113_sync.zip 46 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_26_drive_0117/2011_09_26_drive_0117_sync.zip 47 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_28_calib.zip 48 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_28_drive_0001/2011_09_28_drive_0001_sync.zip 49 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_28_drive_0002/2011_09_28_drive_0002_sync.zip 50 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_29_calib.zip 51 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_29_drive_0004/2011_09_29_drive_0004_sync.zip 52 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_29_drive_0026/2011_09_29_drive_0026_sync.zip 53 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_29_drive_0071/2011_09_29_drive_0071_sync.zip 54 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_calib.zip 55 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0016/2011_09_30_drive_0016_sync.zip 56 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0018/2011_09_30_drive_0018_sync.zip 57 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0020/2011_09_30_drive_0020_sync.zip 58 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0027/2011_09_30_drive_0027_sync.zip 59 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0028/2011_09_30_drive_0028_sync.zip 60 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0033/2011_09_30_drive_0033_sync.zip 61 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_09_30_drive_0034/2011_09_30_drive_0034_sync.zip 62 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_calib.zip 63 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0027/2011_10_03_drive_0027_sync.zip 64 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0034/2011_10_03_drive_0034_sync.zip 65 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0042/2011_10_03_drive_0042_sync.zip 66 | https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/2011_10_03_drive_0047/2011_10_03_drive_0047_sync.zip 67 | -------------------------------------------------------------------------------- /utils/evaluation_utils.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import pandas as pd 3 | import os 4 | import cv, cv2 5 | from collections import Counter 6 | import pickle 7 | 8 | def compute_errors(gt, pred): 9 | thresh = np.maximum((gt / pred), (pred / gt)) 10 | a1 = (thresh < 1.25 ).mean() 11 | a2 = (thresh < 1.25 ** 2).mean() 12 | a3 = (thresh < 1.25 ** 3).mean() 13 | 14 | rmse = (gt - pred) ** 2 15 | rmse = np.sqrt(rmse.mean()) 16 | 17 | rmse_log = (np.log(gt) - np.log(pred)) ** 2 18 | rmse_log = np.sqrt(rmse_log.mean()) 19 | 20 | abs_rel = np.mean(np.abs(gt - pred) / gt) 21 | 22 | sq_rel = np.mean(((gt - pred)**2) / gt) 23 | 24 | return abs_rel, sq_rel, rmse, rmse_log, a1, a2, a3 25 | 26 | ############################################################################### 27 | ####################### KITTI 28 | 29 | width_to_focal = dict() 30 | width_to_focal[1242] = 721.5377 31 | width_to_focal[1241] = 718.856 32 | width_to_focal[1224] = 707.0493 33 | width_to_focal[1238] = 718.3351 34 | 35 | def load_gt_disp_kitti(path): 36 | gt_disparities = [] 37 | for i in range(200): 38 | disp = cv2.imread(path + "/training/disp_noc_0/" + str(i).zfill(6) + "_10.png", -1) 39 | disp = disp.astype(np.float32) / 256 40 | gt_disparities.append(disp) 41 | return gt_disparities 42 | 43 | def convert_disps_to_depths_kitti(gt_disparities, pred_disparities): 44 | gt_depths = [] 45 | pred_depths = [] 46 | pred_disparities_resized = [] 47 | 48 | for i in range(len(gt_disparities)): 49 | gt_disp = gt_disparities[i] 50 | height, width = gt_disp.shape 51 | 52 | pred_disp = pred_disparities[i] 53 | pred_disp = width * cv2.resize(pred_disp, (width, height), interpolation=cv2.INTER_LINEAR) 54 | 55 | pred_disparities_resized.append(pred_disp) 56 | 57 | mask = gt_disp > 0 58 | 59 | gt_depth = width_to_focal[width] * 0.54 / (gt_disp + (1.0 - mask)) 60 | pred_depth = width_to_focal[width] * 0.54 / pred_disp 61 | 62 | gt_depths.append(gt_depth) 63 | pred_depths.append(pred_depth) 64 | return gt_depths, pred_depths, pred_disparities_resized 65 | 66 | 67 | ############################################################################### 68 | ####################### EIGEN 69 | 70 | def read_text_lines(file_path): 71 | f = open(file_path, 'r') 72 | lines = f.readlines() 73 | f.close() 74 | lines = [l.rstrip() for l in lines] 75 | return lines 76 | 77 | def read_file_data(files, data_root): 78 | gt_files = [] 79 | gt_calib = [] 80 | im_sizes = [] 81 | im_files = [] 82 | cams = [] 83 | num_probs = 0 84 | for filename in files: 85 | filename = filename.split()[0] 86 | splits = filename.split('/') 87 | camera_id = np.int32(splits[2][-1:]) # 2 is left, 3 is right 88 | date = splits[0] 89 | im_id = splits[4][:10] 90 | file_root = '{}/{}' 91 | 92 | im = filename 93 | vel = '{}/{}/velodyne_points/data/{}.bin'.format(splits[0], splits[1], im_id) 94 | 95 | if os.path.isfile(data_root + im): 96 | gt_files.append(data_root + vel) 97 | gt_calib.append(data_root + date + '/') 98 | im_sizes.append(cv2.imread(data_root + im).shape[:2]) 99 | im_files.append(data_root + im) 100 | cams.append(2) 101 | else: 102 | num_probs += 1 103 | print('{} missing'.format(data_root + im)) 104 | print num_probs, 'files missing' 105 | 106 | return gt_files, gt_calib, im_sizes, im_files, cams 107 | 108 | def load_velodyne_points(file_name): 109 | # adapted from https://github.com/hunse/kitti 110 | points = np.fromfile(file_name, dtype=np.float32).reshape(-1, 4) 111 | points[:, 3] = 1.0 # homogeneous 112 | return points 113 | 114 | 115 | def lin_interp(shape, xyd): 116 | # taken from https://github.com/hunse/kitti 117 | m, n = shape 118 | ij, d = xyd[:, 1::-1], xyd[:, 2] 119 | f = LinearNDInterpolator(ij, d, fill_value=0) 120 | J, I = np.meshgrid(np.arange(n), np.arange(m)) 121 | IJ = np.vstack([I.flatten(), J.flatten()]).T 122 | disparity = f(IJ).reshape(shape) 123 | return disparity 124 | 125 | 126 | def read_calib_file(path): 127 | # taken from https://github.com/hunse/kitti 128 | float_chars = set("0123456789.e+- ") 129 | data = {} 130 | with open(path, 'r') as f: 131 | for line in f.readlines(): 132 | key, value = line.split(':', 1) 133 | value = value.strip() 134 | data[key] = value 135 | if float_chars.issuperset(value): 136 | # try to cast to float array 137 | try: 138 | data[key] = np.array(map(float, value.split(' '))) 139 | except ValueError: 140 | # casting error: data[key] already eq. value, so pass 141 | pass 142 | 143 | return data 144 | 145 | 146 | def get_focal_length_baseline(calib_dir, cam): 147 | cam2cam = read_calib_file(calib_dir + 'calib_cam_to_cam.txt') 148 | P2_rect = cam2cam['P_rect_02'].reshape(3,4) 149 | P3_rect = cam2cam['P_rect_03'].reshape(3,4) 150 | 151 | # cam 2 is left of camera 0 -6cm 152 | # cam 3 is to the right +54cm 153 | b2 = P2_rect[0,3] / -P2_rect[0,0] 154 | b3 = P3_rect[0,3] / -P3_rect[0,0] 155 | baseline = b3-b2 156 | 157 | if cam==2: 158 | focal_length = P2_rect[0,0] 159 | elif cam==3: 160 | focal_length = P3_rect[0,0] 161 | 162 | return focal_length, baseline 163 | 164 | 165 | def sub2ind(matrixSize, rowSub, colSub): 166 | m, n = matrixSize 167 | return rowSub * (n-1) + colSub - 1 168 | 169 | def generate_depth_map(calib_dir, velo_file_name, im_shape, cam=2, interp=False, vel_depth=False): 170 | # load calibration files 171 | cam2cam = read_calib_file(calib_dir + 'calib_cam_to_cam.txt') 172 | velo2cam = read_calib_file(calib_dir + 'calib_velo_to_cam.txt') 173 | velo2cam = np.hstack((velo2cam['R'].reshape(3,3), velo2cam['T'][..., np.newaxis])) 174 | velo2cam = np.vstack((velo2cam, np.array([0, 0, 0, 1.0]))) 175 | 176 | # compute projection matrix velodyne->image plane 177 | R_cam2rect = np.eye(4) 178 | R_cam2rect[:3,:3] = cam2cam['R_rect_00'].reshape(3,3) 179 | P_rect = cam2cam['P_rect_0'+str(cam)].reshape(3,4) 180 | P_velo2im = np.dot(np.dot(P_rect, R_cam2rect), velo2cam) 181 | 182 | # load velodyne points and remove all behind image plane (approximation) 183 | # each row of the velodyne data is forward, left, up, reflectance 184 | velo = load_velodyne_points(velo_file_name) 185 | velo = velo[velo[:, 0] >= 0, :] 186 | 187 | # project the points to the camera 188 | velo_pts_im = np.dot(P_velo2im, velo.T).T 189 | velo_pts_im[:, :2] = velo_pts_im[:,:2] / velo_pts_im[:,2][..., np.newaxis] 190 | 191 | if vel_depth: 192 | velo_pts_im[:, 2] = velo[:, 0] 193 | 194 | # check if in bounds 195 | # use minus 1 to get the exact same value as KITTI matlab code 196 | velo_pts_im[:, 0] = np.round(velo_pts_im[:,0]) - 1 197 | velo_pts_im[:, 1] = np.round(velo_pts_im[:,1]) - 1 198 | val_inds = (velo_pts_im[:, 0] >= 0) & (velo_pts_im[:, 1] >= 0) 199 | val_inds = val_inds & (velo_pts_im[:,0] < im_shape[1]) & (velo_pts_im[:,1] < im_shape[0]) 200 | velo_pts_im = velo_pts_im[val_inds, :] 201 | 202 | # project to image 203 | depth = np.zeros((im_shape)) 204 | depth[velo_pts_im[:, 1].astype(np.int), velo_pts_im[:, 0].astype(np.int)] = velo_pts_im[:, 2] 205 | 206 | # find the duplicate points and choose the closest depth 207 | inds = sub2ind(depth.shape, velo_pts_im[:, 1], velo_pts_im[:, 0]) 208 | dupe_inds = [item for item, count in Counter(inds).iteritems() if count > 1] 209 | for dd in dupe_inds: 210 | pts = np.where(inds==dd)[0] 211 | x_loc = int(velo_pts_im[pts[0], 0]) 212 | y_loc = int(velo_pts_im[pts[0], 1]) 213 | depth[y_loc, x_loc] = velo_pts_im[pts, 2].min() 214 | depth[depth<0] = 0 215 | 216 | if interp: 217 | # interpolate the depth map to fill in holes 218 | depth_interp = lin_interp(im_shape, velo_pts_im) 219 | return depth, depth_interp 220 | else: 221 | return depth 222 | 223 | 224 | 225 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright © Niantic, Inc. 2018. Patent Pending. 2 | All rights reserved. 3 | 4 | ================================================================================ 5 | 6 | This Software is licensed under the terms of the UCLB ACP-A Licence which allows 7 | for non-commercial use only. For any other use of the software not covered by 8 | the terms of this licence, please contact info@uclb.com 9 | 10 | ================================================================================ 11 | 12 | UCLB ACP-A Licence 13 | 14 | This Agreement is made by and between the Licensor and the Licensee as defined 15 | and identified below. 16 | 17 | 1. Definitions. 18 | In this Agreement (“the Agreement”) the following words shall have the 19 | following meanings: 20 | 21 | "Authors" shall mean C. Godard, O. Mac Aodha, G. Brostow 22 | "Licensee" Shall mean the person or organisation agreeing to use the 23 | Software in accordance with these terms and conditions. 24 | "Licensor" shall mean UCL Business PLC whose registered office is at The 25 | Network Building, 97 Tottenham Court Road, London W1T 4TP. UCL Business is a 26 | the technology transfer arm of University College London (UCL). 27 | "Owner" shall mean Niantic Inc., a company organised and existing under the 28 | laws of Delaware, whose principal place of business is at 2 Bryant Street, 29 | #220, San Francisco, 94105. Owner is a third party beneficiary of this 30 | Agreement and may enforce its terms as if it were a party to this Agreement. 31 | "Software" shall mean the MonoDepth Software in source code or object code 32 | form and any accompanying documentation. 33 | 34 | 2. License. 35 | 2.1 The Licensor has all necessary rights to grant a licence under: (i) 36 | copyright and rights in the nature of copyright subsisting in the Software; 37 | and (ii) patent rights resulting from a patent application filed by the 38 | Licensor in the United Kingdom in connection with the Software. The Licensor 39 | grants the Licensee for the duration of this Agreement, a free of charge, 40 | non-sublicenseable, non-exclusive, non-transferable copyright and patent 41 | licence (in consequence of said patent application) to use the Software for 42 | non-commercial purpose only, including teaching and research at educational 43 | institutions and research at not-for-profit research institutions in 44 | accordance with the provisions of this Agreement. Non-commercial use 45 | expressly excludes any profit-making or commercial activities, including 46 | without limitation sale, licence, manufacture or development of commercial 47 | products, use in commercially-sponsored research, provision of consulting 48 | service, use for or on behalf of any commercial entity, and use in research 49 | where a commercial party obtains rights to research results or any other 50 | benefit. Any use of the Software for any purpose other than non-commercial 51 | research shall automatically terminate this Licence. 52 | 53 | 2.2 The Licensee is permitted to make modifications to the Software provided 54 | that distribution of such modifications is in accordance with Clause 3. 55 | 56 | 2.3 Except as expressly permitted by this Agreement and save to the extent 57 | and in the circumstances expressly required to be permitted by law, the 58 | Licensee is not permitted to rent, lease, sell, offer to sell or loan the 59 | Software or its associated documentation. 60 | 61 | 3. Redistribution and modifications 62 | 3.1 The Licensee may reproduce and distribute copies of the Software only to 63 | this same GitHub repository with or without modifications, in source format 64 | only and provided that any and every distribution is accompanied by an 65 | unmodified copy of this Licence and that the following copyright notice is 66 | always displayed in an obvious manner: Copyright © Niantic, Inc. 2018. All 67 | rights reserved. 68 | 69 | 3.2 In the case where the Software has been modified, any distribution must 70 | include prominent notices indicating which files have been changed. 71 | 72 | 3.3 The Licensee shall cause any work that it distributes or publishes, that 73 | in whole or in part contains or is derived from the Software or any part 74 | thereof (“Work based on the Software”), to be licensed as a whole at no 75 | charge to all third parties under the terms of this Licence. 76 | 77 | 4. Duration. 78 | This Agreement is effective until the Licensee terminates it by destroying 79 | the Software and its documentation together with all copies. It will also 80 | terminate automatically if the Licensee fails to abide by its terms. Upon 81 | automatic termination the Licensee agrees to destroy all copies of the 82 | Software and its documentation. 83 | 84 | 5. Disclaimer of Warranties. 85 | The Software is provided as is. To the maximum extent permitted by law, 86 | Licensor provides no warranties or conditions of any kind, either express or 87 | implied, including without limitation, any warranties or condition of title, 88 | non-infringement or fitness for a particular purpose. 89 | 90 | 6. Limitation of Liability. 91 | In no event shall the Licensor and/or Authors be liable for any direct, 92 | indirect, incidental, special, exemplary or consequential damages (including 93 | but not limited to, procurement of substitute goods or services; loss of 94 | use, data or profits; or business interruption) however caused and on any 95 | theory of liability, whether in contract, strict liability, or tort 96 | (including negligence or otherwise) arising in any way out of the use of 97 | this Software, even if advised of the possibility of such damage. 98 | 99 | 7. Indemnity. 100 | The Licensee shall indemnify the Licensor and/or Authors against all third 101 | party claims that may be asserted against or suffered by the Licensor and/or 102 | Authors and which relate to use of the Software by the Licensee or the 103 | Recipient. 104 | 105 | 8. Intellectual Property. 106 | 8.1 As between the Licensee and Licensor,copyright and all other 107 | intellectual property rights subsisting in or in connection with the 108 | Software and supporting information shall remain at all times the property 109 | of the Licensor but Licensee acknowledges and agrees that Owner is the owner 110 | of all right, title and interest in and to the Software. The Licensee shall 111 | acquire no rights in any such material except as expressly provided in this 112 | Agreement. 113 | 114 | 8.2 No permission is granted to use the trademarks or product names of the 115 | Licensor or Owner except as required for reasonable and customary use in 116 | describing the origin of the Software and for the purposes of abiding by the 117 | terms of Clause 3.1. 118 | 119 | 8.3 The Licensee shall promptly notify the Licensor, in sufficient detail, 120 | all improvements and new uses of the Software (“Improvements”). The Licensor 121 | and its affiliates shall have a non-exclusive, fully paid-up, royalty-free, 122 | irrevocable and perpetual licence under the Improvements for non-commercial 123 | academic research and teaching purposes. 124 | 125 | 8.4 The Licensee grants an exclusive first option to the Owner to be 126 | exercised by the Owner within three (3) years of the date of notification of 127 | the Improvements under Clause 8.3 to use any Improvements for commercial 128 | purposes on terms to be negotiated and agreed by Licensee and Owner in good 129 | faith within a period of six (6) months from the date of exercise of the 130 | said option (including without limitation any royalty share in net income 131 | from such commercialization payable to the Licensee, as the case may be). 132 | 133 | 9. Acknowledgements. 134 | The Licensee shall acknowledge the Authors and use of the Software in the 135 | publication of any work that uses, or results that are achieved through, the 136 | use of the Software. The following citation shall be included in the 137 | acknowledgement: “Unsupervised Monocular Depth Estimation with Left-Right 138 | Consistency, by C. Godard, O Mac Aodha, G. Brostow, CVPR 2017.” 139 | 140 | 10. Governing Law. 141 | This Agreement shall be governed by, construed and interpreted in accordance 142 | with English law and the parties submit to the exclusive jurisdiction of the 143 | English courts. 144 | 145 | 11. Termination. 146 | Upon termination of this Agreement, the licenses granted hereunder will 147 | terminate and Sections 5, 6, 7, 8, 9, 10 and 11 shall survive any 148 | termination of this Agreement. 149 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Filled Disparity monodepth 2 | 3 | **Self-Supervised Monocular Depth Estimation of Untextured Indoor Rotated Scenes** 4 | Benjamin Keltjens, Tom van Dijk and Guido de Croon 5 | 6 | For more details: 7 | 8 | [arXiv](https://arxiv.org/abs/2106.12958) | 9 | [Dataset](https://dataverse.nl/dataset.xhtml?persistentId=doi%3A10.34894%2FKIBWFC) | 10 | [MAVlab](https://mavlab.tudelft.nl/) 11 | 12 | An adapted network based on monodepth that improves perfromance in indoor untextured scenes. 13 | 14 |

15 | filled_disparity loss 16 |

17 | 18 | A description of monodepth can be see in their readme below. The method for testing and training is the same as described there. We recommend using indoor datasets, such as ours listed above, to train and test this network. 19 | 20 | ## Reference 21 | If you find our work useful in your research please consider citing our paper: 22 | ``` 23 | @misc{keltjens2021selfsupervised, 24 | title={Self-Supervised Monocular Depth Estimation of Untextured Indoor Rotated Scenes}, 25 | author={Benjamin Keltjens and Tom van Dijk and Guido de Croon}, 26 | year={2021}, 27 | eprint={2106.12958}, 28 | archivePrefix={arXiv}, 29 | primaryClass={cs.CV} 30 | } 31 | ``` 32 | 33 |   34 | 35 | # monodepth 36 | Tensorflow implementation of unsupervised single image depth prediction using a convolutional neural network. 37 | 38 |

39 | monodepth 40 |

41 | 42 | **Unsupervised Monocular Depth Estimation with Left-Right Consistency** 43 | [Clément Godard](http://www0.cs.ucl.ac.uk/staff/C.Godard/), [Oisin Mac Aodha](http://vision.caltech.edu/~macaodha/) and [Gabriel J. Brostow](http://www0.cs.ucl.ac.uk/staff/g.brostow/) 44 | CVPR 2017 45 | 46 | For more details: 47 | [project page](http://visual.cs.ucl.ac.uk/pubs/monoDepth/) 48 | [arXiv](https://arxiv.org/abs/1609.03677) 49 | 50 | ## 🆕 Are you looking for monodepth2? 51 | > **Digging Into Self-Supervised Monocular Depth Estimation 52 | > Clément Godard, Oisin Mac Aodha, Michael Firman and Gabriel J. Brostow** 53 | > 54 | > Improved accuracy, monocular training, and shorter training times! 55 | > 56 | > [arXiv](https://arxiv.org/abs/1806.01260) | [code](https://github.com/nianticlabs/monodepth2) 57 | 58 | ## Requirements 59 | This code was tested with Tensorflow 1.0, CUDA 8.0 and Ubuntu 16.04. 60 | Training takes about 30 hours with the default parameters on the **kitti** split on a single Titan X machine. 61 | You can train on multiple GPUs by setting them with the `--num_gpus` flag, make sure your `batch_size` is divisible by `num_gpus`. 62 | 63 | ## I just want to try it on an image! 64 | There is a simple mode `monodepth_simple.py` which allows you to quickly run our model on a test image. 65 | Make sure your first [download one of the pretrained models](#models) in this example we will use `model_cityscapes`. 66 | ```shell 67 | python monodepth_simple.py --image_path ~/my_image.jpg --checkpoint_path ~/models/model_cityscapes 68 | ``` 69 | **Please note that there is NO extension after the checkpoint name** 70 | 71 | ## Data 72 | This model requires rectified stereo pairs for training. 73 | There are two main datasets available: 74 | ### [KITTI](http://www.cvlibs.net/datasets/kitti/raw_data.php) 75 | We used two different split of the data, **kitti** and **eigen**, amounting for respectively 29000 and 22600 training samples, you can find them in the [filenames](utils/filenames) folder. 76 | You can download the entire raw dataset by running: 77 | ```shell 78 | wget -i utils/kitti_archives_to_download.txt -P ~/my/output/folder/ 79 | ``` 80 | **Warning:** it weights about **175GB**, make sure you have enough space to unzip too! 81 | To save space you can convert the png images to jpeg. 82 | ```shell 83 | find ~/my/output/folder/ -name '*.png' | parallel 'convert {.}.png {.}.jpg && rm {}' 84 | ``` 85 | 86 | ### [Cityscapes](https://www.cityscapes-dataset.com) 87 | You will need to register in order to download the data, which already has a train/val/test set with 22973 training images. 88 | We used `leftImg8bit_trainvaltest.zip`, `rightImg8bit_trainvaltest.zip`, `leftImg8bit_trainextra.zip` and `rightImg8bit_trainextra.zip` which weights **110GB**. 89 | 90 | ## Training 91 | 92 | **Warning:** The input sizes need to be mutiples of 128 for `vgg` or 64 for `resnet50` . 93 | 94 | The model's dataloader expects a data folder path as well as a list of filenames (relative to the root data folder): 95 | ```shell 96 | python monodepth_main.py --mode train --model_name my_model --data_path ~/data/KITTI/ \ 97 | --filenames_file ~/code/monodepth/utils/filenames/kitti_train_files.txt --log_directory ~/tmp/ 98 | ``` 99 | You can continue training by loading the last saved checkpoint using `--checkpoint_path` and pointing to it: 100 | ```shell 101 | python monodepth_main.py --mode train --model_name my_model --data_path ~/data/KITTI/ \ 102 | --filenames_file ~/code/monodepth/utils/filenames/kitti_train_files.txt --log_directory ~/tmp/ \ 103 | --checkpoint_path ~/tmp/my_model/model-50000 104 | ``` 105 | You can also fine-tune from a checkpoint using `--retrain`. 106 | You can monitor the learning process using `tensorboard` and pointing it to your chosen `log_directory`. 107 | By default the model only saves a reduced summary to save disk space, you can disable this using `--full_summary`. 108 | Please look at the [main file](monodepth_main.py) for all the available options. 109 | 110 | ## Testing 111 | To test change the `--mode` flag to `test`, the network will output the disparities in the model folder or in any other folder you specify wiht `--output_directory`. 112 | You will also need to load the checkpoint you want to test on, this can be done with `--checkpoint_path`: 113 | ```shell 114 | python monodepth_main.py --mode test --data_path ~/data/KITTI/ \ 115 | --filenames_file ~/code/monodepth/utils/filenames/kitti_stereo_2015_test_files.txt --log_directory ~/tmp/ \ 116 | --checkpoint_path ~/tmp/my_model/model-181250 117 | ``` 118 | **Please note that there is NO extension after the checkpoint name** 119 | If your test filenames contain two files per line the model will ignore the second one, unless you use the `--do_stereo` flag. 120 | The network will output two files `disparities.npy` and `disparities_pp.npy`, respecively for raw and post-processed disparities. 121 | 122 | ## Evaluation on KITTI 123 | To evaluate run: 124 | ```shell 125 | python utils/evaluate_kitti.py --split kitti --predicted_disp_path ~/tmp/my_model/disparities.npy \ 126 | --gt_path ~/data/KITTI/ 127 | ``` 128 | The `--split` flag allows you to choose which dataset you want to test on. 129 | * `kitti` corresponds to the 200 official training set pairs from [KITTI stereo 2015](http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=stereo). 130 | * `eigen` corresponds to the 697 test images used by [Eigen NIPS14](http://www.cs.nyu.edu/~deigen/depth/) and uses the raw LIDAR points. 131 | 132 | **Warning**: The results on the Eigen split are usually cropped, which you can do by passing the `--garg_crop` flag. 133 | 134 | ## Models 135 | You can download our pre-trained models to an existing directory by running: 136 | ```shell 137 | sh ./utils/get_model.sh model_name output_directory 138 | ``` 139 | All our models were trained for 50 epochs, 512x256 resolution and a batch size of 8, please see our paper for more details. 140 | We converted KITTI and Cityscapes to jpeg before training. 141 | Here are all the models available: 142 | * `model_kitti`: Our main model trained on the **kitti** split 143 | * `model_eigen`: Our main model trained on the **eigen** split 144 | * `model_cityscapes`: Our main model trained on **cityscapes** 145 | * `model_city2kitti`: `model_cityscapes` fine-tuned on **kitti** 146 | * `model_city2eigen`: `model_cityscapes` fine-tuned on **eigen** 147 | * `model_kitti_stereo`: Our stereo model trained on the **kitti** split for 12 epochs, make sure to use `--do_stereo` when using it 148 | 149 | All our models, except for stereo, have a Resnet50 variant which you can get by adding `_resnet` to the model name. 150 | To test or train using these variants, you need to use the flag `--encoder resnet50`. 151 | 152 | ## Results 153 | You can download our results (unscaled disparities at 512x256) on both KITTI splits (**kitti** and **eigen**) [here](http://visual.cs.ucl.ac.uk/pubs/monoDepth/results/). 154 | The naming convention is the same as with the models. 155 | 156 | ## Reference 157 | If you find our work useful in your research please consider citing our paper: 158 | ``` 159 | @inproceedings{monodepth17, 160 | title = {Unsupervised Monocular Depth Estimation with Left-Right Consistency}, 161 | author = {Cl{\'{e}}ment Godard and 162 | Oisin {Mac Aodha} and 163 | Gabriel J. Brostow}, 164 | booktitle = {CVPR}, 165 | year = {2017} 166 | } 167 | ``` 168 | 169 | ## Video 170 | [![Screenshot](https://img.youtube.com/vi/go3H2gU-Zck/0.jpg)](https://www.youtube.com/watch?v=go3H2gU-Zck) 171 | 172 | ## License 173 | Copyright © Niantic, Inc. 2018. Patent Pending. 174 | All rights reserved. 175 | 176 | This Software is licensed under the terms of the UCLB ACP-A Licence which allows for non-commercial use only, the full terms of which are made available in the [LICENSE](LICENSE) file. For any other use of the software not covered by the terms of this licence, please contact info@uclb.com 177 | -------------------------------------------------------------------------------- /monodepth_main.py: -------------------------------------------------------------------------------- 1 | # Copyright UCL Business plc 2017. Patent Pending. All rights reserved. 2 | # 3 | # The MonoDepth Software is licensed under the terms of the UCLB ACP-A licence 4 | # which allows for non-commercial use only, the full terms of which are made 5 | # available in the LICENSE file. 6 | # 7 | # For any other use of the software not covered by the UCLB ACP-A Licence, 8 | # please contact info@uclb.com 9 | 10 | from __future__ import absolute_import, division, print_function 11 | 12 | # only keep warnings and errors 13 | import os 14 | os.environ['TF_CPP_MIN_LOG_LEVEL']='1' 15 | 16 | import numpy as np 17 | import argparse 18 | import re 19 | import time 20 | import tensorflow as tf 21 | import tensorflow.contrib.slim as slim 22 | 23 | from monodepth_model import * 24 | from monodepth_dataloader import * 25 | from average_gradients import * 26 | 27 | parser = argparse.ArgumentParser(description='Monodepth TensorFlow implementation.') 28 | 29 | parser.add_argument('--mode', type=str, help='train or test', default='train') 30 | parser.add_argument('--model_name', type=str, help='model name', default='monodepth') 31 | parser.add_argument('--encoder', type=str, help='type of encoder, vgg or resnet50', default='vgg') 32 | parser.add_argument('--dataset', type=str, help='dataset to train on, kitti, or cityscapes', default='kitti') 33 | parser.add_argument('--data_path', type=str, help='path to the data', required=True) 34 | parser.add_argument('--filenames_file', type=str, help='path to the filenames text file', required=True) 35 | parser.add_argument('--input_height', type=int, help='input height', default=256) 36 | parser.add_argument('--input_width', type=int, help='input width', default=512) 37 | parser.add_argument('--batch_size', type=int, help='batch size', default=8) 38 | parser.add_argument('--num_epochs', type=int, help='number of epochs', default=50) 39 | parser.add_argument('--learning_rate', type=float, help='initial learning rate', default=1e-4) 40 | parser.add_argument('--lr_loss_weight', type=float, help='left-right consistency weight', default=1.0) 41 | parser.add_argument('--alpha_image_loss', type=float, help='weight between SSIM and L1 in the image loss', default=0.85) 42 | parser.add_argument('--disp_gradient_loss_weight', type=float, help='disparity smoothness weigth', default=0.1) 43 | parser.add_argument('--filled_disparity_loss_weight', type=float, help='filled disparity weight', default=0.1) 44 | parser.add_argument('--do_stereo', help='if set, will train the stereo model', action='store_true') 45 | parser.add_argument('--wrap_mode', type=str, help='bilinear sampler wrap mode, edge or border', default='border') 46 | parser.add_argument('--use_deconv', help='if set, will use transposed convolutions', action='store_true') 47 | parser.add_argument('--num_gpus', type=int, help='number of GPUs to use for training', default=1) 48 | parser.add_argument('--num_threads', type=int, help='number of threads to use for data loading', default=8) 49 | parser.add_argument('--output_directory', type=str, help='output directory for test disparities, if empty outputs to checkpoint folder', default='') 50 | parser.add_argument('--log_directory', type=str, help='directory to save checkpoints and summaries', default='') 51 | parser.add_argument('--checkpoint_path', type=str, help='path to a specific checkpoint to load', default='') 52 | parser.add_argument('--retrain', help='if used with checkpoint_path, will restart training from step zero', action='store_true') 53 | parser.add_argument('--full_summary', help='if set, will keep more data for each summary. Warning: the file can become very large', action='store_true') 54 | 55 | args = parser.parse_args() 56 | 57 | def post_process_disparity(disp): 58 | _, h, w = disp.shape 59 | l_disp = disp[0,:,:] 60 | r_disp = np.fliplr(disp[1,:,:]) 61 | m_disp = 0.5 * (l_disp + r_disp) 62 | l, _ = np.meshgrid(np.linspace(0, 1, w), np.linspace(0, 1, h)) 63 | l_mask = 1.0 - np.clip(20 * (l - 0.05), 0, 1) 64 | r_mask = np.fliplr(l_mask) 65 | return r_mask * l_disp + l_mask * r_disp + (1.0 - l_mask - r_mask) * m_disp 66 | 67 | def count_text_lines(file_path): 68 | f = open(file_path, 'r') 69 | lines = f.readlines() 70 | f.close() 71 | return len(lines) 72 | 73 | def train(params): 74 | """Training loop.""" 75 | 76 | with tf.Graph().as_default(), tf.device('/cpu:0'): 77 | 78 | global_step = tf.Variable(0, trainable=False) 79 | 80 | # OPTIMIZER 81 | num_training_samples = count_text_lines(args.filenames_file) 82 | 83 | steps_per_epoch = np.ceil(num_training_samples / params.batch_size).astype(np.int32) 84 | num_total_steps = params.num_epochs * steps_per_epoch 85 | start_learning_rate = args.learning_rate 86 | 87 | boundaries = [np.int32((3/5) * num_total_steps), np.int32((4/5) * num_total_steps)] 88 | values = [args.learning_rate, args.learning_rate / 2, args.learning_rate / 4] 89 | learning_rate = tf.train.piecewise_constant(global_step, boundaries, values) 90 | 91 | opt_step = tf.train.AdamOptimizer(learning_rate) 92 | 93 | print("total number of samples: {}".format(num_training_samples)) 94 | print("total number of steps: {}".format(num_total_steps)) 95 | 96 | dataloader = MonodepthDataloader(args.data_path, args.filenames_file, params, args.dataset, args.mode) 97 | left = dataloader.left_image_batch 98 | right = dataloader.right_image_batch 99 | 100 | # split for each gpu 101 | left_splits = tf.split(left, args.num_gpus, 0) 102 | right_splits = tf.split(right, args.num_gpus, 0) 103 | 104 | tower_grads = [] 105 | tower_losses = [] 106 | reuse_variables = None 107 | with tf.variable_scope(tf.get_variable_scope()): 108 | for i in range(args.num_gpus): 109 | with tf.device('/gpu:%d' % i): 110 | 111 | model = MonodepthModel(params, args.mode, left_splits[i], right_splits[i], reuse_variables, i) 112 | 113 | loss = model.total_loss 114 | tower_losses.append(loss) 115 | 116 | reuse_variables = True 117 | 118 | grads = opt_step.compute_gradients(loss) 119 | 120 | tower_grads.append(grads) 121 | 122 | grads = average_gradients(tower_grads) 123 | 124 | apply_gradient_op = opt_step.apply_gradients(grads, global_step=global_step) 125 | 126 | total_loss = tf.reduce_mean(tower_losses) 127 | 128 | tf.summary.scalar('learning_rate', learning_rate, ['model_0']) 129 | tf.summary.scalar('total_loss', total_loss, ['model_0']) 130 | summary_op = tf.summary.merge_all('model_0') 131 | 132 | # SESSION 133 | gpu_options = tf.GPUOptions(allow_growth = True, visible_device_list=str(1)) 134 | config = tf.ConfigProto(allow_soft_placement=True, gpu_options=gpu_options) 135 | sess = tf.Session(config=config) 136 | 137 | # SAVER 138 | summary_writer = tf.summary.FileWriter(args.log_directory + '/' + args.model_name, sess.graph) 139 | train_saver = tf.train.Saver() 140 | 141 | # COUNT PARAMS 142 | total_num_parameters = 0 143 | for variable in tf.trainable_variables(): 144 | total_num_parameters += np.array(variable.get_shape().as_list()).prod() 145 | print("number of trainable parameters: {}".format(total_num_parameters)) 146 | 147 | # INIT 148 | sess.run(tf.global_variables_initializer()) 149 | sess.run(tf.local_variables_initializer()) 150 | coordinator = tf.train.Coordinator() 151 | threads = tf.train.start_queue_runners(sess=sess, coord=coordinator) 152 | 153 | # LOAD CHECKPOINT IF SET 154 | if args.checkpoint_path != '': 155 | train_saver.restore(sess, args.checkpoint_path.split(".")[0]) 156 | 157 | if args.retrain: 158 | sess.run(global_step.assign(0)) 159 | 160 | # GO! 161 | start_step = global_step.eval(session=sess) 162 | start_time = time.time() 163 | for step in range(start_step, num_total_steps): 164 | before_op_time = time.time() 165 | _, loss_value = sess.run([apply_gradient_op, total_loss]) 166 | duration = time.time() - before_op_time 167 | if step and step % 100 == 0: 168 | examples_per_sec = params.batch_size / duration 169 | time_sofar = (time.time() - start_time) / 3600 170 | training_time_left = (num_total_steps / step - 1.0) * time_sofar 171 | print_string = 'batch {:>6} | examples/s: {:4.2f} | loss: {:.5f} | time elapsed: {:.2f}h | time left: {:.2f}h' 172 | print(print_string.format(step, examples_per_sec, loss_value, time_sofar, training_time_left)) 173 | summary_str = sess.run(summary_op) 174 | summary_writer.add_summary(summary_str, global_step=step) 175 | if step and step % 10000 == 0: 176 | train_saver.save(sess, args.log_directory + '/' + args.model_name + '/model', global_step=step) 177 | 178 | train_saver.save(sess, args.log_directory + '/' + args.model_name + '/model', global_step=num_total_steps) 179 | 180 | def test(params): 181 | """Test function.""" 182 | 183 | dataloader = MonodepthDataloader(args.data_path, args.filenames_file, params, args.dataset, args.mode) 184 | left = dataloader.left_image_batch 185 | right = dataloader.right_image_batch 186 | 187 | model = MonodepthModel(params, args.mode, left, right) 188 | 189 | # SESSION 190 | config = tf.ConfigProto(allow_soft_placement=True) 191 | sess = tf.Session(config=config) 192 | 193 | # SAVER 194 | train_saver = tf.train.Saver() 195 | 196 | # INIT 197 | sess.run(tf.global_variables_initializer()) 198 | sess.run(tf.local_variables_initializer()) 199 | coordinator = tf.train.Coordinator() 200 | threads = tf.train.start_queue_runners(sess=sess, coord=coordinator) 201 | 202 | # RESTORE 203 | if args.checkpoint_path == '': 204 | restore_path = tf.train.latest_checkpoint(args.log_directory + '/' + args.model_name) 205 | else: 206 | restore_path = args.checkpoint_path.split(".")[0] 207 | train_saver.restore(sess, restore_path) 208 | 209 | num_test_samples = count_text_lines(args.filenames_file) 210 | 211 | print('now testing {} files'.format(num_test_samples)) 212 | disparities = np.zeros((num_test_samples, params.height, params.width), dtype=np.float32) 213 | disparities_pp = np.zeros((num_test_samples, params.height, params.width), dtype=np.float32) 214 | for step in range(num_test_samples): 215 | disp = sess.run(model.disp_left_est[0]) 216 | disparities[step] = disp[0].squeeze() 217 | disparities_pp[step] = post_process_disparity(disp.squeeze()) 218 | 219 | print('done.') 220 | 221 | print('writing disparities.') 222 | if args.output_directory == '': 223 | output_directory = os.path.dirname(args.checkpoint_path) 224 | else: 225 | output_directory = args.output_directory 226 | np.save(output_directory + '/disparities.npy', disparities) 227 | np.save(output_directory + '/disparities_pp.npy', disparities_pp) 228 | 229 | print('done.') 230 | 231 | def main(_): 232 | 233 | params = monodepth_parameters( 234 | encoder=args.encoder, 235 | height=args.input_height, 236 | width=args.input_width, 237 | batch_size=args.batch_size, 238 | num_threads=args.num_threads, 239 | num_epochs=args.num_epochs, 240 | do_stereo=args.do_stereo, 241 | wrap_mode=args.wrap_mode, 242 | use_deconv=args.use_deconv, 243 | alpha_image_loss=args.alpha_image_loss, 244 | disp_gradient_loss_weight=args.disp_gradient_loss_weight, 245 | lr_loss_weight=args.lr_loss_weight, 246 | filled_disparity_loss_weight=args.filled_disparity_loss_weight, 247 | full_summary=args.full_summary) 248 | 249 | if args.mode == 'train': 250 | train(params) 251 | elif args.mode == 'test': 252 | test(params) 253 | 254 | if __name__ == '__main__': 255 | tf.app.run() 256 | -------------------------------------------------------------------------------- /utils/filenames/kitti_stereo_2015_test_files.txt: -------------------------------------------------------------------------------- 1 | training/image_2/000000_10.jpg training/image_3/000000_10.jpg 2 | training/image_2/000001_10.jpg training/image_3/000001_10.jpg 3 | training/image_2/000002_10.jpg training/image_3/000002_10.jpg 4 | training/image_2/000003_10.jpg training/image_3/000003_10.jpg 5 | training/image_2/000004_10.jpg training/image_3/000004_10.jpg 6 | training/image_2/000005_10.jpg training/image_3/000005_10.jpg 7 | training/image_2/000006_10.jpg training/image_3/000006_10.jpg 8 | training/image_2/000007_10.jpg training/image_3/000007_10.jpg 9 | training/image_2/000008_10.jpg training/image_3/000008_10.jpg 10 | training/image_2/000009_10.jpg training/image_3/000009_10.jpg 11 | training/image_2/000010_10.jpg training/image_3/000010_10.jpg 12 | training/image_2/000011_10.jpg training/image_3/000011_10.jpg 13 | training/image_2/000012_10.jpg training/image_3/000012_10.jpg 14 | training/image_2/000013_10.jpg training/image_3/000013_10.jpg 15 | training/image_2/000014_10.jpg training/image_3/000014_10.jpg 16 | training/image_2/000015_10.jpg training/image_3/000015_10.jpg 17 | training/image_2/000016_10.jpg training/image_3/000016_10.jpg 18 | training/image_2/000017_10.jpg training/image_3/000017_10.jpg 19 | training/image_2/000018_10.jpg training/image_3/000018_10.jpg 20 | training/image_2/000019_10.jpg training/image_3/000019_10.jpg 21 | training/image_2/000020_10.jpg training/image_3/000020_10.jpg 22 | training/image_2/000021_10.jpg training/image_3/000021_10.jpg 23 | training/image_2/000022_10.jpg training/image_3/000022_10.jpg 24 | training/image_2/000023_10.jpg training/image_3/000023_10.jpg 25 | training/image_2/000024_10.jpg training/image_3/000024_10.jpg 26 | training/image_2/000025_10.jpg training/image_3/000025_10.jpg 27 | training/image_2/000026_10.jpg training/image_3/000026_10.jpg 28 | training/image_2/000027_10.jpg training/image_3/000027_10.jpg 29 | training/image_2/000028_10.jpg training/image_3/000028_10.jpg 30 | training/image_2/000029_10.jpg training/image_3/000029_10.jpg 31 | training/image_2/000030_10.jpg training/image_3/000030_10.jpg 32 | training/image_2/000031_10.jpg training/image_3/000031_10.jpg 33 | training/image_2/000032_10.jpg training/image_3/000032_10.jpg 34 | training/image_2/000033_10.jpg training/image_3/000033_10.jpg 35 | training/image_2/000034_10.jpg training/image_3/000034_10.jpg 36 | training/image_2/000035_10.jpg training/image_3/000035_10.jpg 37 | training/image_2/000036_10.jpg training/image_3/000036_10.jpg 38 | training/image_2/000037_10.jpg training/image_3/000037_10.jpg 39 | training/image_2/000038_10.jpg training/image_3/000038_10.jpg 40 | training/image_2/000039_10.jpg training/image_3/000039_10.jpg 41 | training/image_2/000040_10.jpg training/image_3/000040_10.jpg 42 | training/image_2/000041_10.jpg training/image_3/000041_10.jpg 43 | training/image_2/000042_10.jpg training/image_3/000042_10.jpg 44 | training/image_2/000043_10.jpg training/image_3/000043_10.jpg 45 | training/image_2/000044_10.jpg training/image_3/000044_10.jpg 46 | training/image_2/000045_10.jpg training/image_3/000045_10.jpg 47 | training/image_2/000046_10.jpg training/image_3/000046_10.jpg 48 | training/image_2/000047_10.jpg training/image_3/000047_10.jpg 49 | training/image_2/000048_10.jpg training/image_3/000048_10.jpg 50 | training/image_2/000049_10.jpg training/image_3/000049_10.jpg 51 | training/image_2/000050_10.jpg training/image_3/000050_10.jpg 52 | training/image_2/000051_10.jpg training/image_3/000051_10.jpg 53 | training/image_2/000052_10.jpg training/image_3/000052_10.jpg 54 | training/image_2/000053_10.jpg training/image_3/000053_10.jpg 55 | training/image_2/000054_10.jpg training/image_3/000054_10.jpg 56 | training/image_2/000055_10.jpg training/image_3/000055_10.jpg 57 | training/image_2/000056_10.jpg training/image_3/000056_10.jpg 58 | training/image_2/000057_10.jpg training/image_3/000057_10.jpg 59 | training/image_2/000058_10.jpg training/image_3/000058_10.jpg 60 | training/image_2/000059_10.jpg training/image_3/000059_10.jpg 61 | training/image_2/000060_10.jpg training/image_3/000060_10.jpg 62 | training/image_2/000061_10.jpg training/image_3/000061_10.jpg 63 | training/image_2/000062_10.jpg training/image_3/000062_10.jpg 64 | training/image_2/000063_10.jpg training/image_3/000063_10.jpg 65 | training/image_2/000064_10.jpg training/image_3/000064_10.jpg 66 | training/image_2/000065_10.jpg training/image_3/000065_10.jpg 67 | training/image_2/000066_10.jpg training/image_3/000066_10.jpg 68 | training/image_2/000067_10.jpg training/image_3/000067_10.jpg 69 | training/image_2/000068_10.jpg training/image_3/000068_10.jpg 70 | training/image_2/000069_10.jpg training/image_3/000069_10.jpg 71 | training/image_2/000070_10.jpg training/image_3/000070_10.jpg 72 | training/image_2/000071_10.jpg training/image_3/000071_10.jpg 73 | training/image_2/000072_10.jpg training/image_3/000072_10.jpg 74 | training/image_2/000073_10.jpg training/image_3/000073_10.jpg 75 | training/image_2/000074_10.jpg training/image_3/000074_10.jpg 76 | training/image_2/000075_10.jpg training/image_3/000075_10.jpg 77 | training/image_2/000076_10.jpg training/image_3/000076_10.jpg 78 | training/image_2/000077_10.jpg training/image_3/000077_10.jpg 79 | training/image_2/000078_10.jpg training/image_3/000078_10.jpg 80 | training/image_2/000079_10.jpg training/image_3/000079_10.jpg 81 | training/image_2/000080_10.jpg training/image_3/000080_10.jpg 82 | training/image_2/000081_10.jpg training/image_3/000081_10.jpg 83 | training/image_2/000082_10.jpg training/image_3/000082_10.jpg 84 | training/image_2/000083_10.jpg training/image_3/000083_10.jpg 85 | training/image_2/000084_10.jpg training/image_3/000084_10.jpg 86 | training/image_2/000085_10.jpg training/image_3/000085_10.jpg 87 | training/image_2/000086_10.jpg training/image_3/000086_10.jpg 88 | training/image_2/000087_10.jpg training/image_3/000087_10.jpg 89 | training/image_2/000088_10.jpg training/image_3/000088_10.jpg 90 | training/image_2/000089_10.jpg training/image_3/000089_10.jpg 91 | training/image_2/000090_10.jpg training/image_3/000090_10.jpg 92 | training/image_2/000091_10.jpg training/image_3/000091_10.jpg 93 | training/image_2/000092_10.jpg training/image_3/000092_10.jpg 94 | training/image_2/000093_10.jpg training/image_3/000093_10.jpg 95 | training/image_2/000094_10.jpg training/image_3/000094_10.jpg 96 | training/image_2/000095_10.jpg training/image_3/000095_10.jpg 97 | training/image_2/000096_10.jpg training/image_3/000096_10.jpg 98 | training/image_2/000097_10.jpg training/image_3/000097_10.jpg 99 | training/image_2/000098_10.jpg training/image_3/000098_10.jpg 100 | training/image_2/000099_10.jpg training/image_3/000099_10.jpg 101 | training/image_2/000100_10.jpg training/image_3/000100_10.jpg 102 | training/image_2/000101_10.jpg training/image_3/000101_10.jpg 103 | training/image_2/000102_10.jpg training/image_3/000102_10.jpg 104 | training/image_2/000103_10.jpg training/image_3/000103_10.jpg 105 | training/image_2/000104_10.jpg training/image_3/000104_10.jpg 106 | training/image_2/000105_10.jpg training/image_3/000105_10.jpg 107 | training/image_2/000106_10.jpg training/image_3/000106_10.jpg 108 | training/image_2/000107_10.jpg training/image_3/000107_10.jpg 109 | training/image_2/000108_10.jpg training/image_3/000108_10.jpg 110 | training/image_2/000109_10.jpg training/image_3/000109_10.jpg 111 | training/image_2/000110_10.jpg training/image_3/000110_10.jpg 112 | training/image_2/000111_10.jpg training/image_3/000111_10.jpg 113 | training/image_2/000112_10.jpg training/image_3/000112_10.jpg 114 | training/image_2/000113_10.jpg training/image_3/000113_10.jpg 115 | training/image_2/000114_10.jpg training/image_3/000114_10.jpg 116 | training/image_2/000115_10.jpg training/image_3/000115_10.jpg 117 | training/image_2/000116_10.jpg training/image_3/000116_10.jpg 118 | training/image_2/000117_10.jpg training/image_3/000117_10.jpg 119 | training/image_2/000118_10.jpg training/image_3/000118_10.jpg 120 | training/image_2/000119_10.jpg training/image_3/000119_10.jpg 121 | training/image_2/000120_10.jpg training/image_3/000120_10.jpg 122 | training/image_2/000121_10.jpg training/image_3/000121_10.jpg 123 | training/image_2/000122_10.jpg training/image_3/000122_10.jpg 124 | training/image_2/000123_10.jpg training/image_3/000123_10.jpg 125 | training/image_2/000124_10.jpg training/image_3/000124_10.jpg 126 | training/image_2/000125_10.jpg training/image_3/000125_10.jpg 127 | training/image_2/000126_10.jpg training/image_3/000126_10.jpg 128 | training/image_2/000127_10.jpg training/image_3/000127_10.jpg 129 | training/image_2/000128_10.jpg training/image_3/000128_10.jpg 130 | training/image_2/000129_10.jpg training/image_3/000129_10.jpg 131 | training/image_2/000130_10.jpg training/image_3/000130_10.jpg 132 | training/image_2/000131_10.jpg training/image_3/000131_10.jpg 133 | training/image_2/000132_10.jpg training/image_3/000132_10.jpg 134 | training/image_2/000133_10.jpg training/image_3/000133_10.jpg 135 | training/image_2/000134_10.jpg training/image_3/000134_10.jpg 136 | training/image_2/000135_10.jpg training/image_3/000135_10.jpg 137 | training/image_2/000136_10.jpg training/image_3/000136_10.jpg 138 | training/image_2/000137_10.jpg training/image_3/000137_10.jpg 139 | training/image_2/000138_10.jpg training/image_3/000138_10.jpg 140 | training/image_2/000139_10.jpg training/image_3/000139_10.jpg 141 | training/image_2/000140_10.jpg training/image_3/000140_10.jpg 142 | training/image_2/000141_10.jpg training/image_3/000141_10.jpg 143 | training/image_2/000142_10.jpg training/image_3/000142_10.jpg 144 | training/image_2/000143_10.jpg training/image_3/000143_10.jpg 145 | training/image_2/000144_10.jpg training/image_3/000144_10.jpg 146 | training/image_2/000145_10.jpg training/image_3/000145_10.jpg 147 | training/image_2/000146_10.jpg training/image_3/000146_10.jpg 148 | training/image_2/000147_10.jpg training/image_3/000147_10.jpg 149 | training/image_2/000148_10.jpg training/image_3/000148_10.jpg 150 | training/image_2/000149_10.jpg training/image_3/000149_10.jpg 151 | training/image_2/000150_10.jpg training/image_3/000150_10.jpg 152 | training/image_2/000151_10.jpg training/image_3/000151_10.jpg 153 | training/image_2/000152_10.jpg training/image_3/000152_10.jpg 154 | training/image_2/000153_10.jpg training/image_3/000153_10.jpg 155 | training/image_2/000154_10.jpg training/image_3/000154_10.jpg 156 | training/image_2/000155_10.jpg training/image_3/000155_10.jpg 157 | training/image_2/000156_10.jpg training/image_3/000156_10.jpg 158 | training/image_2/000157_10.jpg training/image_3/000157_10.jpg 159 | training/image_2/000158_10.jpg training/image_3/000158_10.jpg 160 | training/image_2/000159_10.jpg training/image_3/000159_10.jpg 161 | training/image_2/000160_10.jpg training/image_3/000160_10.jpg 162 | training/image_2/000161_10.jpg training/image_3/000161_10.jpg 163 | training/image_2/000162_10.jpg training/image_3/000162_10.jpg 164 | training/image_2/000163_10.jpg training/image_3/000163_10.jpg 165 | training/image_2/000164_10.jpg training/image_3/000164_10.jpg 166 | training/image_2/000165_10.jpg training/image_3/000165_10.jpg 167 | training/image_2/000166_10.jpg training/image_3/000166_10.jpg 168 | training/image_2/000167_10.jpg training/image_3/000167_10.jpg 169 | training/image_2/000168_10.jpg training/image_3/000168_10.jpg 170 | training/image_2/000169_10.jpg training/image_3/000169_10.jpg 171 | training/image_2/000170_10.jpg training/image_3/000170_10.jpg 172 | training/image_2/000171_10.jpg training/image_3/000171_10.jpg 173 | training/image_2/000172_10.jpg training/image_3/000172_10.jpg 174 | training/image_2/000173_10.jpg training/image_3/000173_10.jpg 175 | training/image_2/000174_10.jpg training/image_3/000174_10.jpg 176 | training/image_2/000175_10.jpg training/image_3/000175_10.jpg 177 | training/image_2/000176_10.jpg training/image_3/000176_10.jpg 178 | training/image_2/000177_10.jpg training/image_3/000177_10.jpg 179 | training/image_2/000178_10.jpg training/image_3/000178_10.jpg 180 | training/image_2/000179_10.jpg training/image_3/000179_10.jpg 181 | training/image_2/000180_10.jpg training/image_3/000180_10.jpg 182 | training/image_2/000181_10.jpg training/image_3/000181_10.jpg 183 | training/image_2/000182_10.jpg training/image_3/000182_10.jpg 184 | training/image_2/000183_10.jpg training/image_3/000183_10.jpg 185 | training/image_2/000184_10.jpg training/image_3/000184_10.jpg 186 | training/image_2/000185_10.jpg training/image_3/000185_10.jpg 187 | training/image_2/000186_10.jpg training/image_3/000186_10.jpg 188 | training/image_2/000187_10.jpg training/image_3/000187_10.jpg 189 | training/image_2/000188_10.jpg training/image_3/000188_10.jpg 190 | training/image_2/000189_10.jpg training/image_3/000189_10.jpg 191 | training/image_2/000190_10.jpg training/image_3/000190_10.jpg 192 | training/image_2/000191_10.jpg training/image_3/000191_10.jpg 193 | training/image_2/000192_10.jpg training/image_3/000192_10.jpg 194 | training/image_2/000193_10.jpg training/image_3/000193_10.jpg 195 | training/image_2/000194_10.jpg training/image_3/000194_10.jpg 196 | training/image_2/000195_10.jpg training/image_3/000195_10.jpg 197 | training/image_2/000196_10.jpg training/image_3/000196_10.jpg 198 | training/image_2/000197_10.jpg training/image_3/000197_10.jpg 199 | training/image_2/000198_10.jpg training/image_3/000198_10.jpg 200 | training/image_2/000199_10.jpg training/image_3/000199_10.jpg 201 | -------------------------------------------------------------------------------- /disparity_filler_function.py: -------------------------------------------------------------------------------- 1 | # Liscence Information 2 | 3 | """ Disparity Filler Function model for filling disparity maps from edges 4 | by Benjamin Keltjens, Tom van Dijk and Guido de Croon 5 | """ 6 | 7 | import tensorflow as tf 8 | import numpy as np 9 | 10 | 11 | def disparityFillerFunction(images, disparities, name='untextured_filler', **kwargs): 12 | # Generate filled disparity map with signifcant edges 13 | # Input: images (tensor) - tensor of image 14 | # disparities (tensor) - tensor of sparse disparities (batch, height, width, channels(1)) 15 | # Return: averaged_disps (tensor) - tensor of interpolated disparities filled up in the same shape as disparities 16 | 17 | def _getEuclideanNorm(x, y): 18 | # Return euclidian norm of two tensors 19 | # Input: x (tensor) 20 | # y (tensor) 21 | # Return: Euclidian norm (tensor) 22 | return tf.sqrt(x*x + y*y) 23 | 24 | 25 | def _getSobelEdgesN(image, N): 26 | # Given batch of images return tuple of sobel gradients in x and y for the batch for size N sobel filter 27 | # Input: image (tensor) - tensor of image 28 | # N (int) - Size of sobel filter 29 | # Return: filtered_x (tensor) - sobel gradient in the x direction 30 | # filtered_y (tensor) - sobel gradient in the y direction 31 | 32 | def createNumpySobel(N, axis): 33 | # Create sobel gradient filter in numpy 34 | # Based on: https://stackoverflow.com/questions/9567882/sobel-filter-kernel-of-large-size#10032882 35 | # Input: N (int) - Size of sobel filter. Must be odd 36 | # axis (int) - direction of gradient 0 - positive x and 1 - positive y 37 | # Return: Kernel (numpy array) - Kernel for sobel gradient 38 | 39 | Kernel = np.zeros((N,N)) 40 | p = [(j,i) for j in range(N) 41 | for i in range(N) 42 | if not (i == (N -1)/2. and j == (N -1)/2.)] 43 | 44 | for j, i in p: 45 | j_ = int(j - (N -1)/2.) 46 | i_ = int(i - (N -1)/2.) 47 | Kernel[j,i] = (i_ if axis==0 else j_)/float(i_*i_ + j_*j_) 48 | 49 | return Kernel 50 | 51 | Kernelx = tf.convert_to_tensor(createNumpySobel(N, 0), np.float32) 52 | Kernely = tf.convert_to_tensor(createNumpySobel(N, 1), np.float32) 53 | 54 | Kernelx = tf.reshape(Kernelx, [N, N, 1, 1]) 55 | Kernely = tf.reshape(Kernely, [N, N, 1, 1]) 56 | 57 | P = int(N/2) 58 | 59 | paddings = tf.constant([[0,0],[P, P], [P, P], [0, 0]]) # Create tensor describing padding 60 | padded_image = tf.pad(image, paddings, "SYMMETRIC") # Pad tensor with symmetric boundaries for better averaging 61 | 62 | filtered_x = tf.nn.conv2d(padded_image, Kernelx, strides=[1, 1, 1, 1], padding='VALID') 63 | filtered_y = tf.nn.conv2d(padded_image, Kernely, strides=[1, 1, 1, 1], padding='VALID') 64 | 65 | return filtered_x, filtered_y 66 | 67 | 68 | def _createSumKernel(N): 69 | # Create kernel to sum surrounding pixels 70 | # Input: N (int) - Size of sum kernel 71 | # Return: Kernel (tensor) - Sum kernel of 1's shaped for input tensor 72 | 73 | np_array = np.ones((N,N)) # Create array of ones 74 | sumKernel = tf.convert_to_tensor(np_array, np.float32) # conver to numpy array 75 | 76 | return tf.reshape(sumKernel, [N, N, 1, 1]) # reshape array to apply on batches 77 | 78 | def _createAveragingKernel(N): 79 | # Create kernel to average surrounding pixels 80 | # Input: N (int) - Size of averaging kernel 81 | # Return: Kernel (tensor) - averaging kernel 82 | kernel = np.ones((N,N)) 83 | 84 | # Find distances of each pixel from centre and sum 85 | for i in range(N): 86 | for j in range(N): 87 | f_x = abs(i- int(N/2)) # Round Down 88 | f_y = abs(j - int(N/2)) 89 | distance = np.sqrt(f_x**2 + f_y**2) 90 | if distance != 0: # If not centre pixel 91 | kernel[i,j] = 1/distance 92 | kernel_sum = kernel.sum() # find sum 93 | kernel /= kernel_sum # Divide each distance by sum of distances 94 | 95 | avgKernel = tf.convert_to_tensor(kernel, np.float32) # Convert kernel to tensor 96 | 97 | return tf.reshape(avgKernel, [N, N, 1, 1]) # reshape tensor to apply on batches 98 | 99 | def _convertBooltoFloat(_input): 100 | # Convert Boolean tensor to Float tensor 101 | # Input: _input (tensor) Input boolean tensor of arbitrary size 102 | # Return: (tensor) tensor of 1 and 0 floats from bools (tf.case works as well) 103 | 104 | shape = tf.shape(_input) # Get tensor shape 105 | ones = tf.ones(shape, dtype=tf.float32) # Create tensor of ones 106 | zeros = tf.zeros(shape, dtype=tf.float32) # Create tensor of zeros 107 | 108 | return tf.where(_input, ones, zeros) # Gather 1 and 0s based on bools 109 | 110 | def _getMask(_input): 111 | # Get boolean mask of active pixels (> 0.0) 112 | # Input: _input (tensor) Tensor of floats of arbitrary size 113 | # Return: (tensor) tensor of 1 and 0s in float 114 | 115 | # return _convertBooltoFloat(tf.greater(_input, tf.constant(0.0, dtype=tf.float32)) 116 | return tf.cast(tf.greater(_input, 0.0), dtype=tf.float32) 117 | 118 | def _getInvMask(_mask): 119 | # Get inverse of Mask 120 | # Input: _mask (tensor) Tensor of floats (1.0 and 0.0) 121 | # Return: (tensor) Tensor of floats (1.0 and 0.0) 122 | 123 | return _convertBooltoFloat(tf.less(_mask, tf.constant(1.0, dtype=tf.float32))) 124 | 125 | def _getSparseDisparities(image, disparities): 126 | # Given image and disparity produce sparse map of disparities 127 | # Input: image (tensor) - tensor of input image 128 | # disparities (tensor) - map of disparity output from network 129 | # Return: sparse_disparity (tensor) - map of sparse disparity 130 | 131 | N = 7 # Size of Sobel filter 132 | grey = tf.image.rgb_to_grayscale(image) # Convert to black and white 133 | sobel = _getSobelEdgesN(grey, N) # Calculate sobel edge tuples 134 | sobel_sqrt = _getEuclideanNorm(sobel[0],sobel[1]) # Calculate the euclidian norm for x and y sobel edges 135 | maxs = tf.reduce_max(sobel_sqrt, axis = [1,2,3]) # Find the max value of the edge gradients for each image in batch 136 | maxs_expanded = tf.expand_dims(tf.expand_dims(tf.expand_dims(maxs, axis = 1),2),3) # Expand max value dimensions for division 137 | sobel_normalised = tf.divide(sobel_sqrt, maxs_expanded) # Divide all normalised edge gradients by maximum to map to [0,1] 138 | sobel_filtered = tf.cast(tf.greater(sobel_normalised, 0.1), tf.float32) # Get mask of normalised sobel above threshold as float 139 | sparse_disparities = sobel_filtered*disparities # Multiply disparities by float mask to get anchor points (sparse disparities) 140 | 141 | return sparse_disparities 142 | 143 | def _propagation(sparse_disps, batch, channels, height, width): 144 | # Run propagation step of function to pull out sparse disparities to unfilled parts of input tensor 145 | # Inputs: sparse_disps (tensor) - tensor of sparse disparities (batch, height, width, channels(1)) 146 | # batch (int) - batch size 147 | # channels (int) - number of channels 148 | # height (int) - height of input tensor 149 | # width (int) - width of input tensor 150 | # Return: filled_disps (tensor) - tensor of filled disparities (batch, height, width, channels(1)) 151 | # mask (tensor) - mask of active pixels in float values of 1 and 0s [not important, byproduct of using while function] 152 | # inv_mask_initial (tensor) - initial bool tensor of inactive pixles float values of 1 and 0 153 | # count (tensor) - int tensor of count variable 154 | 155 | 156 | sumKernel = _createSumKernel(3) # Create sum kernel 157 | mask = _getMask(sparse_disps) # Find mask of active pixels 158 | inv_mask_initial = _getInvMask(mask) # Get intial mask of inactive pixels 159 | 160 | count = tf.convert_to_tensor(0) # create counter as tensor 161 | 162 | def condition(sparse_disps, mask, count): 163 | # Condition function for while loop. Simply counts to iterations 164 | # Input: sparse_disps (tensor) - tensor of sparse disparities (batch, height, width, channels(1)) 165 | # mask (tensor) - mask of active pixels in float values of 1 and 0s 166 | # count (tensor) - int tensor of count variable 167 | # Return: cond (tensor) - conditional tesnor for while function 168 | 169 | return tf.less(tf.reduce_sum(mask), batch*channels*height*width) 170 | # cond = tf.less(count, iters) # Continue if less count less than specified iterations 171 | # return cond 172 | 173 | def body(sparse_disps, mask, count): 174 | # Body function of the while loop. Fills in adjacent inactive pixels of active pixels on each iteration 175 | # Input: sparse_disps (tensor) - tensor of sparse disparities (batch, height, width, channels(1)) 176 | # mask (tensor) - mask of active pixels in float values of 1 and 0s 177 | # count (tensor) - int tensor of count variable 178 | # Return: Same as input except updated 179 | 180 | mask = _getMask(sparse_disps) # Find current pixel mask 181 | inv_mask = _getInvMask(mask) # Get inverse of active mask -> inactive pixels 182 | sum_mask = tf.nn.conv2d(mask, sumKernel, strides = [1,1,1,1], padding="SAME") # Run sum over mask to find sum of active neighbouring pixels 183 | sum_img = tf.nn.conv2d(sparse_disps, sumKernel, strides = [1,1,1,1], padding="SAME") # Run sum over disparities to find sum of values of neightbouring pixels 184 | averaged = tf.divide(sum_img,sum_mask+0.00001) # Take average of surrounding pixels. Add 'epsilon' to avoid divide by zero 185 | masked_average = tf.multiply(averaged,inv_mask) # Multiply averaged by inv_mask to only keep average of previous inactive pixels 186 | sparse_disps = tf.add(sparse_disps, masked_average) # Add new active pixels to previous disparity map 187 | 188 | 189 | return sparse_disps, mask, count+1 190 | 191 | # Call while loop function 192 | filled_disps, mask, count = tf.while_loop(condition, body, [sparse_disps, mask, count]) 193 | 194 | return filled_disps, inv_mask_initial, count#iters 195 | 196 | def _smoothing(filled_disps, inv_mask_initial, iters): 197 | # Run second pass of function to average values from propagation 198 | # Inputs: filled_disps (tensor) - tensor of filled disparities (batch, height, width, channels(1)) 199 | # inv_mask_initial (tensor) - first mask tensor of inactive pixels from first pass 200 | # iters (int) - Number of iterations which average filter is passed 201 | # Return: averaged_disps (tensor) - tensor of averaged disparities (batch, height, width, channels(1)) 202 | N = 5 # Kernel Size 203 | P = int(N/2) # Padding Size 204 | avgKernel = _createAveragingKernel(N) # Create averaging kernel 205 | mask = _getInvMask(inv_mask_initial) # Get inverse mask of this, activated pixels, at the same step from first pass 206 | 207 | count = 0 # create count variable counting backwards from 208 | 209 | def condition(filled_disps, count): 210 | # Condition function for while loop. Simply returns false, to terminate loop, when reached number of iterations 211 | # Input: filled_disps (tensor) - tensor of filled disparities (batch, height, width, channels(1)) 212 | # count (tensor) - int tensor of count variable counting down to 0 213 | # Return: cond (tensor) - conditional tensor for while function 214 | 215 | cond = tf.less(count, iters) # Check if count has reached iterations 216 | return cond 217 | 218 | def body(filled_disps, count): 219 | # Body function for while loop. Average over filled pixels 220 | # Input: filled_disps (tensor) - tensor of filled disparities (batch, height, width, channels(1)) 221 | # count (tensor) - int tensor of count variable counting down to 0 222 | # Return: filled_disps (tensor) - tensor of averaged disparities (batch, height, width, channels(1)) 223 | # count (tensor) - int tensor of count variable counting down to 0 [not useful] 224 | 225 | paddings = tf.constant([[0,0],[P, P], [P, P], [0, 0]]) # Create tensor describing padding 226 | padded_disps = tf.pad(filled_disps, paddings, "SYMMETRIC") # Pad tensor with symmetric boundaries for better averaging 227 | averaged = tf.nn.conv2d(padded_disps, avgKernel, strides = [1,1,1,1], padding="VALID") # Pass averaging filter over filled_disparity map 228 | filled_disps = tf.add(tf.multiply(filled_disps, mask), tf.multiply(averaged, inv_mask_initial)) # Add unmodified active pixels to modified deactivated pixels 229 | return filled_disps, count+1 # Return updated values 230 | 231 | averaged_disps, count = tf.while_loop(condition, body, [filled_disps, count]) 232 | return averaged_disps 233 | 234 | 235 | 236 | with tf.variable_scope(name): 237 | # Get shape of input tensor 238 | 239 | # Get sparse disparity map 240 | sparse_disparities = _getSparseDisparities(images, disparities) 241 | 242 | # Find shape of disparity map 243 | tensor_shape = sparse_disparities.get_shape().as_list() 244 | _num_batch = tensor_shape[0] 245 | _height = tensor_shape[1] 246 | _width = tensor_shape[2] 247 | _num_channels = tensor_shape[3] 248 | 249 | # Run propagation step on sparse disparities 250 | filled_disps, inv_mask_initial, iters = _propagation(sparse_disparities, _num_batch, _num_channels, _height, _width) 251 | 252 | # Run second pass to average out disparities 253 | averaged_disps = _smoothing(filled_disps, inv_mask_initial, iters) 254 | 255 | # Return averaged filled disparity 256 | return averaged_disps 257 | -------------------------------------------------------------------------------- /monodepth_model.py: -------------------------------------------------------------------------------- 1 | # Copyright UCL Business plc 2017. Patent Pending. All rights reserved. 2 | # 3 | # The MonoDepth Software is licensed under the terms of the UCLB ACP-A licence 4 | # which allows for non-commercial use only, the full terms of which are made 5 | # available in the LICENSE file. 6 | # 7 | # For any other use of the software not covered by the UCLB ACP-A Licence, 8 | # please contact info@uclb.com 9 | 10 | """Fully convolutional model for monocular depth estimation 11 | by Clement Godard, Oisin Mac Aodha and Gabriel J. Brostow 12 | http://visual.cs.ucl.ac.uk/pubs/monoDepth/ 13 | """ 14 | 15 | from __future__ import absolute_import, division, print_function 16 | from collections import namedtuple 17 | 18 | import numpy as np 19 | import tensorflow as tf 20 | import tensorflow.contrib.slim as slim 21 | 22 | from bilinear_sampler import * 23 | from disparity_filler_function import disparityFillerFunction 24 | 25 | monodepth_parameters = namedtuple('parameters', 26 | 'encoder, ' 27 | 'height, width, ' 28 | 'batch_size, ' 29 | 'num_threads, ' 30 | 'num_epochs, ' 31 | 'do_stereo, ' 32 | 'wrap_mode, ' 33 | 'use_deconv, ' 34 | 'alpha_image_loss, ' 35 | 'disp_gradient_loss_weight, ' 36 | 'lr_loss_weight, ' 37 | 'filled_disparity_loss_weight, ' 38 | 'full_summary') 39 | 40 | class MonodepthModel(object): 41 | """monodepth model""" 42 | 43 | def __init__(self, params, mode, left, right, reuse_variables=None, model_index=0): 44 | self.params = params 45 | self.mode = mode 46 | self.left = left 47 | self.right = right 48 | self.model_collection = ['model_' + str(model_index)] 49 | 50 | self.reuse_variables = reuse_variables 51 | 52 | self.build_model() 53 | self.build_outputs() 54 | 55 | if self.mode == 'test': 56 | return 57 | 58 | self.build_losses() 59 | self.build_summaries() 60 | 61 | def gradient_x(self, img): 62 | gx = img[:,:,:-1,:] - img[:,:,1:,:] 63 | return gx 64 | 65 | def gradient_y(self, img): 66 | gy = img[:,:-1,:,:] - img[:,1:,:,:] 67 | return gy 68 | 69 | def upsample_nn(self, x, ratio): 70 | s = tf.shape(x) 71 | h = s[1] 72 | w = s[2] 73 | return tf.image.resize_nearest_neighbor(x, [h * ratio, w * ratio]) 74 | 75 | def scale_pyramid(self, img, num_scales): 76 | scaled_imgs = [img] 77 | s = tf.shape(img) 78 | h = s[1] 79 | w = s[2] 80 | for i in range(num_scales - 1): 81 | ratio = 2 ** (i + 1) 82 | nh = h // ratio 83 | nw = w // ratio 84 | scaled_imgs.append(tf.image.resize_area(img, [nh, nw])) 85 | return scaled_imgs 86 | 87 | def generate_image_left(self, img, disp): 88 | return bilinear_sampler_1d_h(img, -disp) 89 | 90 | def generate_image_right(self, img, disp): 91 | return bilinear_sampler_1d_h(img, disp) 92 | 93 | def SSIM(self, x, y): 94 | C1 = 0.01 ** 2 95 | C2 = 0.03 ** 2 96 | 97 | mu_x = slim.avg_pool2d(x, 3, 1, 'VALID') 98 | mu_y = slim.avg_pool2d(y, 3, 1, 'VALID') 99 | 100 | sigma_x = slim.avg_pool2d(x ** 2, 3, 1, 'VALID') - mu_x ** 2 101 | sigma_y = slim.avg_pool2d(y ** 2, 3, 1, 'VALID') - mu_y ** 2 102 | sigma_xy = slim.avg_pool2d(x * y , 3, 1, 'VALID') - mu_x * mu_y 103 | 104 | SSIM_n = (2 * mu_x * mu_y + C1) * (2 * sigma_xy + C2) 105 | SSIM_d = (mu_x ** 2 + mu_y ** 2 + C1) * (sigma_x + sigma_y + C2) 106 | 107 | SSIM = SSIM_n / SSIM_d 108 | 109 | return tf.clip_by_value((1 - SSIM) / 2, 0, 1) 110 | 111 | def get_disparity_smoothness(self, disp, pyramid): 112 | disp_gradients_x = [self.gradient_x(d) for d in disp] 113 | disp_gradients_y = [self.gradient_y(d) for d in disp] 114 | 115 | image_gradients_x = [self.gradient_x(img) for img in pyramid] 116 | image_gradients_y = [self.gradient_y(img) for img in pyramid] 117 | 118 | weights_x = [tf.exp(-tf.reduce_mean(tf.abs(g), 3, keep_dims=True)) for g in image_gradients_x] 119 | weights_y = [tf.exp(-tf.reduce_mean(tf.abs(g), 3, keep_dims=True)) for g in image_gradients_y] 120 | 121 | smoothness_x = [disp_gradients_x[i] * weights_x[i] for i in range(4)] 122 | smoothness_y = [disp_gradients_y[i] * weights_y[i] for i in range(4)] 123 | return smoothness_x + smoothness_y 124 | 125 | def get_disp(self, x): 126 | disp = 0.3 * self.conv(x, 2, 3, 1, tf.nn.sigmoid) 127 | return disp 128 | 129 | def conv(self, x, num_out_layers, kernel_size, stride, activation_fn=tf.nn.elu): 130 | p = np.floor((kernel_size - 1) / 2).astype(np.int32) 131 | p_x = tf.pad(x, [[0, 0], [p, p], [p, p], [0, 0]]) 132 | return slim.conv2d(p_x, num_out_layers, kernel_size, stride, 'VALID', activation_fn=activation_fn) 133 | 134 | def conv_block(self, x, num_out_layers, kernel_size): 135 | conv1 = self.conv(x, num_out_layers, kernel_size, 1) 136 | conv2 = self.conv(conv1, num_out_layers, kernel_size, 2) 137 | return conv2 138 | 139 | def maxpool(self, x, kernel_size): 140 | p = np.floor((kernel_size - 1) / 2).astype(np.int32) 141 | p_x = tf.pad(x, [[0, 0], [p, p], [p, p], [0, 0]]) 142 | return slim.max_pool2d(p_x, kernel_size) 143 | 144 | def resconv(self, x, num_layers, stride): 145 | do_proj = tf.shape(x)[3] != num_layers or stride == 2 146 | shortcut = [] 147 | conv1 = self.conv(x, num_layers, 1, 1) 148 | conv2 = self.conv(conv1, num_layers, 3, stride) 149 | conv3 = self.conv(conv2, 4 * num_layers, 1, 1, None) 150 | if do_proj: 151 | shortcut = self.conv(x, 4 * num_layers, 1, stride, None) 152 | else: 153 | shortcut = x 154 | return tf.nn.elu(conv3 + shortcut) 155 | 156 | def resblock(self, x, num_layers, num_blocks): 157 | out = x 158 | for i in range(num_blocks - 1): 159 | out = self.resconv(out, num_layers, 1) 160 | out = self.resconv(out, num_layers, 2) 161 | return out 162 | 163 | def upconv(self, x, num_out_layers, kernel_size, scale): 164 | upsample = self.upsample_nn(x, scale) 165 | conv = self.conv(upsample, num_out_layers, kernel_size, 1) 166 | return conv 167 | 168 | def deconv(self, x, num_out_layers, kernel_size, scale): 169 | p_x = tf.pad(x, [[0, 0], [1, 1], [1, 1], [0, 0]]) 170 | conv = slim.conv2d_transpose(p_x, num_out_layers, kernel_size, scale, 'SAME') 171 | return conv[:,3:-1,3:-1,:] 172 | 173 | def build_vgg(self): 174 | #set convenience functions 175 | conv = self.conv 176 | if self.params.use_deconv: 177 | upconv = self.deconv 178 | else: 179 | upconv = self.upconv 180 | 181 | with tf.variable_scope('encoder'): 182 | conv1 = self.conv_block(self.model_input, 32, 7) # H/2 183 | conv2 = self.conv_block(conv1, 64, 5) # H/4 184 | conv3 = self.conv_block(conv2, 128, 3) # H/8 185 | conv4 = self.conv_block(conv3, 256, 3) # H/16 186 | conv5 = self.conv_block(conv4, 512, 3) # H/32 187 | conv6 = self.conv_block(conv5, 512, 3) # H/64 188 | conv7 = self.conv_block(conv6, 512, 3) # H/128 189 | 190 | with tf.variable_scope('skips'): 191 | skip1 = conv1 192 | skip2 = conv2 193 | skip3 = conv3 194 | skip4 = conv4 195 | skip5 = conv5 196 | skip6 = conv6 197 | 198 | with tf.variable_scope('decoder'): 199 | upconv7 = upconv(conv7, 512, 3, 2) #H/64 200 | concat7 = tf.concat([upconv7, skip6], 3) 201 | iconv7 = conv(concat7, 512, 3, 1) 202 | 203 | upconv6 = upconv(iconv7, 512, 3, 2) #H/32 204 | concat6 = tf.concat([upconv6, skip5], 3) 205 | iconv6 = conv(concat6, 512, 3, 1) 206 | 207 | upconv5 = upconv(iconv6, 256, 3, 2) #H/16 208 | concat5 = tf.concat([upconv5, skip4], 3) 209 | iconv5 = conv(concat5, 256, 3, 1) 210 | 211 | upconv4 = upconv(iconv5, 128, 3, 2) #H/8 212 | concat4 = tf.concat([upconv4, skip3], 3) 213 | iconv4 = conv(concat4, 128, 3, 1) 214 | self.disp4 = self.get_disp(iconv4) 215 | udisp4 = self.upsample_nn(self.disp4, 2) 216 | 217 | upconv3 = upconv(iconv4, 64, 3, 2) #H/4 218 | concat3 = tf.concat([upconv3, skip2, udisp4], 3) 219 | iconv3 = conv(concat3, 64, 3, 1) 220 | self.disp3 = self.get_disp(iconv3) 221 | udisp3 = self.upsample_nn(self.disp3, 2) 222 | 223 | upconv2 = upconv(iconv3, 32, 3, 2) #H/2 224 | concat2 = tf.concat([upconv2, skip1, udisp3], 3) 225 | iconv2 = conv(concat2, 32, 3, 1) 226 | self.disp2 = self.get_disp(iconv2) 227 | udisp2 = self.upsample_nn(self.disp2, 2) 228 | 229 | upconv1 = upconv(iconv2, 16, 3, 2) #H 230 | concat1 = tf.concat([upconv1, udisp2], 3) 231 | iconv1 = conv(concat1, 16, 3, 1) 232 | self.disp1 = self.get_disp(iconv1) 233 | 234 | def build_resnet50(self): 235 | #set convenience functions 236 | conv = self.conv 237 | if self.params.use_deconv: 238 | upconv = self.deconv 239 | else: 240 | upconv = self.upconv 241 | 242 | with tf.variable_scope('encoder'): 243 | conv1 = conv(self.model_input, 64, 7, 2) # H/2 - 64D 244 | pool1 = self.maxpool(conv1, 3) # H/4 - 64D 245 | conv2 = self.resblock(pool1, 64, 3) # H/8 - 256D 246 | conv3 = self.resblock(conv2, 128, 4) # H/16 - 512D 247 | conv4 = self.resblock(conv3, 256, 6) # H/32 - 1024D 248 | conv5 = self.resblock(conv4, 512, 3) # H/64 - 2048D 249 | 250 | with tf.variable_scope('skips'): 251 | skip1 = conv1 252 | skip2 = pool1 253 | skip3 = conv2 254 | skip4 = conv3 255 | skip5 = conv4 256 | 257 | # DECODING 258 | with tf.variable_scope('decoder'): 259 | upconv6 = upconv(conv5, 512, 3, 2) #H/32 260 | concat6 = tf.concat([upconv6, skip5], 3) 261 | iconv6 = conv(concat6, 512, 3, 1) 262 | 263 | upconv5 = upconv(iconv6, 256, 3, 2) #H/16 264 | concat5 = tf.concat([upconv5, skip4], 3) 265 | iconv5 = conv(concat5, 256, 3, 1) 266 | 267 | upconv4 = upconv(iconv5, 128, 3, 2) #H/8 268 | concat4 = tf.concat([upconv4, skip3], 3) 269 | iconv4 = conv(concat4, 128, 3, 1) 270 | self.disp4 = self.get_disp(iconv4) 271 | udisp4 = self.upsample_nn(self.disp4, 2) 272 | 273 | upconv3 = upconv(iconv4, 64, 3, 2) #H/4 274 | concat3 = tf.concat([upconv3, skip2, udisp4], 3) 275 | iconv3 = conv(concat3, 64, 3, 1) 276 | self.disp3 = self.get_disp(iconv3) 277 | udisp3 = self.upsample_nn(self.disp3, 2) 278 | 279 | upconv2 = upconv(iconv3, 32, 3, 2) #H/2 280 | concat2 = tf.concat([upconv2, skip1, udisp3], 3) 281 | iconv2 = conv(concat2, 32, 3, 1) 282 | self.disp2 = self.get_disp(iconv2) 283 | udisp2 = self.upsample_nn(self.disp2, 2) 284 | 285 | upconv1 = upconv(iconv2, 16, 3, 2) #H 286 | concat1 = tf.concat([upconv1, udisp2], 3) 287 | iconv1 = conv(concat1, 16, 3, 1) 288 | self.disp1 = self.get_disp(iconv1) 289 | 290 | def build_model(self): 291 | with slim.arg_scope([slim.conv2d, slim.conv2d_transpose], activation_fn=tf.nn.elu): 292 | with tf.variable_scope('model', reuse=self.reuse_variables): 293 | 294 | self.left_pyramid = self.scale_pyramid(self.left, 4) 295 | if self.mode == 'train': 296 | self.right_pyramid = self.scale_pyramid(self.right, 4) 297 | 298 | if self.params.do_stereo: 299 | self.model_input = tf.concat([self.left, self.right], 3) 300 | else: 301 | self.model_input = self.left 302 | 303 | #build model 304 | if self.params.encoder == 'vgg': 305 | self.build_vgg() 306 | elif self.params.encoder == 'resnet50': 307 | self.build_resnet50() 308 | else: 309 | return None 310 | 311 | def build_outputs(self): 312 | # STORE DISPARITIES 313 | with tf.variable_scope('disparities'): 314 | self.disp_est = [self.disp1, self.disp2, self.disp3, self.disp4] 315 | self.disp_left_est = [tf.expand_dims(d[:,:,:,0], 3) for d in self.disp_est] 316 | self.disp_right_est = [tf.expand_dims(d[:,:,:,1], 3) for d in self.disp_est] 317 | 318 | # Generate Filled Disparity Maps 319 | # Addition for Filled Disparity Loss 320 | with tf.variable_scope('filled_disparities'): 321 | self.filled_disparities_left = [tf.stop_gradient(disparityFillerFunction(self.left_pyramid[i], self.disp_left_est[i])) for i in range(4)] 322 | self.filled_disparities_right = [tf.stop_gradient(disparityFillerFunction(self.right_pyramid[i], self.disp_right_est[i])) for i in range(4)] 323 | 324 | if self.mode == 'test': 325 | return 326 | 327 | # GENERATE IMAGES 328 | with tf.variable_scope('images'): 329 | self.left_est = [self.generate_image_left(self.right_pyramid[i], self.disp_left_est[i]) for i in range(4)] 330 | self.right_est = [self.generate_image_right(self.left_pyramid[i], self.disp_right_est[i]) for i in range(4)] 331 | 332 | # LR CONSISTENCY 333 | with tf.variable_scope('left-right'): 334 | self.right_to_left_disp = [self.generate_image_left(self.disp_right_est[i], self.disp_left_est[i]) for i in range(4)] 335 | self.left_to_right_disp = [self.generate_image_right(self.disp_left_est[i], self.disp_right_est[i]) for i in range(4)] 336 | 337 | # DISPARITY SMOOTHNESS 338 | with tf.variable_scope('smoothness'): 339 | self.disp_left_smoothness = self.get_disparity_smoothness(self.disp_left_est, self.left_pyramid) 340 | self.disp_right_smoothness = self.get_disparity_smoothness(self.disp_right_est, self.right_pyramid) 341 | 342 | def build_losses(self): 343 | with tf.variable_scope('losses', reuse=self.reuse_variables): 344 | # IMAGE RECONSTRUCTION 345 | # L1 346 | self.l1_left = [tf.abs( self.left_est[i] - self.left_pyramid[i]) for i in range(4)] 347 | self.l1_reconstruction_loss_left = [tf.reduce_mean(l) for l in self.l1_left] 348 | self.l1_right = [tf.abs(self.right_est[i] - self.right_pyramid[i]) for i in range(4)] 349 | self.l1_reconstruction_loss_right = [tf.reduce_mean(l) for l in self.l1_right] 350 | 351 | # SSIM 352 | self.ssim_left = [self.SSIM( self.left_est[i], self.left_pyramid[i]) for i in range(4)] 353 | self.ssim_loss_left = [tf.reduce_mean(s) for s in self.ssim_left] 354 | self.ssim_right = [self.SSIM(self.right_est[i], self.right_pyramid[i]) for i in range(4)] 355 | self.ssim_loss_right = [tf.reduce_mean(s) for s in self.ssim_right] 356 | 357 | # WEIGTHED SUM 358 | self.image_loss_right = [self.params.alpha_image_loss * self.ssim_loss_right[i] + (1 - self.params.alpha_image_loss) * self.l1_reconstruction_loss_right[i] for i in range(4)] 359 | self.image_loss_left = [self.params.alpha_image_loss * self.ssim_loss_left[i] + (1 - self.params.alpha_image_loss) * self.l1_reconstruction_loss_left[i] for i in range(4)] 360 | self.image_loss = tf.add_n(self.image_loss_left + self.image_loss_right) 361 | 362 | # DISPARITY SMOOTHNESS 363 | self.disp_left_loss = [tf.reduce_mean(tf.abs(self.disp_left_smoothness[i])) / 2 ** i for i in range(4)] 364 | self.disp_right_loss = [tf.reduce_mean(tf.abs(self.disp_right_smoothness[i])) / 2 ** i for i in range(4)] 365 | self.disp_gradient_loss = tf.add_n(self.disp_left_loss + self.disp_right_loss) 366 | 367 | # LR CONSISTENCY 368 | self.lr_left_loss = [tf.reduce_mean(tf.abs(self.right_to_left_disp[i] - self.disp_left_est[i])) for i in range(4)] 369 | self.lr_right_loss = [tf.reduce_mean(tf.abs(self.left_to_right_disp[i] - self.disp_right_est[i])) for i in range(4)] 370 | self.lr_loss = tf.add_n(self.lr_left_loss + self.lr_right_loss) 371 | 372 | # FILLED DISPARITY 373 | # Addition for Filled Disparity Loss 374 | self.l1_left_disp = [tf.abs(self.disp_left_est[i] - self.filled_disparities_left[i]) for i in range(4)] 375 | self.l1_left_disp_loss = [tf.reduce_mean(self.l1_left_disp[i]) for i in range(4)] 376 | self.l1_right_disp = [tf.abs(self.disp_right_est[i] - self.filled_disparities_right[i]) for i in range(4)] 377 | self.l1_right_disp_loss = [tf.reduce_mean(self.l1_right_disp[i]) for i in range(4)] 378 | self.l1_disp_fill_loss = tf.add_n(self.l1_left_disp_loss + self.l1_right_disp_loss) 379 | 380 | # TOTAL LOSS 381 | # Addition for Filed Disparity Loss 382 | self.total_loss = self.image_loss + self.params.disp_gradient_loss_weight * self.disp_gradient_loss + self.params.lr_loss_weight * self.lr_loss \ 383 | + self.params.filled_disparity_loss_weight*self.l1_disp_fill_loss 384 | 385 | def build_summaries(self): 386 | # SUMMARIES 387 | with tf.device('/cpu:0'): 388 | for i in range(4): 389 | tf.summary.scalar('ssim_loss_' + str(i), self.ssim_loss_left[i] + self.ssim_loss_right[i], collections=self.model_collection) 390 | tf.summary.scalar('l1_loss_' + str(i), self.l1_reconstruction_loss_left[i] + self.l1_reconstruction_loss_right[i], collections=self.model_collection) 391 | tf.summary.scalar('image_loss_' + str(i), self.image_loss_left[i] + self.image_loss_right[i], collections=self.model_collection) 392 | tf.summary.scalar('disp_gradient_loss_' + str(i), self.disp_left_loss[i] + self.disp_right_loss[i], collections=self.model_collection) 393 | tf.summary.scalar('lr_loss_' + str(i), self.lr_left_loss[i] + self.lr_right_loss[i], collections=self.model_collection) 394 | tf.summary.image('disp_left_est_' + str(i), self.disp_left_est[i], max_outputs=4, collections=self.model_collection) 395 | tf.summary.image('disp_right_est_' + str(i), self.disp_right_est[i], max_outputs=4, collections=self.model_collection) 396 | 397 | if self.params.full_summary: 398 | tf.summary.image('left_est_' + str(i), self.left_est[i], max_outputs=4, collections=self.model_collection) 399 | tf.summary.image('right_est_' + str(i), self.right_est[i], max_outputs=4, collections=self.model_collection) 400 | tf.summary.image('ssim_left_' + str(i), self.ssim_left[i], max_outputs=4, collections=self.model_collection) 401 | tf.summary.image('ssim_right_' + str(i), self.ssim_right[i], max_outputs=4, collections=self.model_collection) 402 | tf.summary.image('l1_left_' + str(i), self.l1_left[i], max_outputs=4, collections=self.model_collection) 403 | tf.summary.image('l1_right_' + str(i), self.l1_right[i], max_outputs=4, collections=self.model_collection) 404 | 405 | if self.params.full_summary: 406 | tf.summary.image('left', self.left, max_outputs=4, collections=self.model_collection) 407 | tf.summary.image('right', self.right, max_outputs=4, collections=self.model_collection) 408 | 409 | -------------------------------------------------------------------------------- /utils/filenames/cityscapes_val_files.txt: -------------------------------------------------------------------------------- 1 | frankfurt/frankfurt_000000_000294_leftImg8bit.jpg frankfurt/frankfurt_000000_000294_rightImg8bit.jpg 2 | frankfurt/frankfurt_000000_000576_leftImg8bit.jpg frankfurt/frankfurt_000000_000576_rightImg8bit.jpg 3 | frankfurt/frankfurt_000000_001016_leftImg8bit.jpg frankfurt/frankfurt_000000_001016_rightImg8bit.jpg 4 | frankfurt/frankfurt_000000_001236_leftImg8bit.jpg frankfurt/frankfurt_000000_001236_rightImg8bit.jpg 5 | frankfurt/frankfurt_000000_001751_leftImg8bit.jpg frankfurt/frankfurt_000000_001751_rightImg8bit.jpg 6 | frankfurt/frankfurt_000000_002196_leftImg8bit.jpg frankfurt/frankfurt_000000_002196_rightImg8bit.jpg 7 | frankfurt/frankfurt_000000_002963_leftImg8bit.jpg frankfurt/frankfurt_000000_002963_rightImg8bit.jpg 8 | frankfurt/frankfurt_000000_003025_leftImg8bit.jpg frankfurt/frankfurt_000000_003025_rightImg8bit.jpg 9 | frankfurt/frankfurt_000000_003357_leftImg8bit.jpg frankfurt/frankfurt_000000_003357_rightImg8bit.jpg 10 | frankfurt/frankfurt_000000_003920_leftImg8bit.jpg frankfurt/frankfurt_000000_003920_rightImg8bit.jpg 11 | frankfurt/frankfurt_000000_004617_leftImg8bit.jpg frankfurt/frankfurt_000000_004617_rightImg8bit.jpg 12 | frankfurt/frankfurt_000000_005543_leftImg8bit.jpg frankfurt/frankfurt_000000_005543_rightImg8bit.jpg 13 | frankfurt/frankfurt_000000_005898_leftImg8bit.jpg frankfurt/frankfurt_000000_005898_rightImg8bit.jpg 14 | frankfurt/frankfurt_000000_006589_leftImg8bit.jpg frankfurt/frankfurt_000000_006589_rightImg8bit.jpg 15 | frankfurt/frankfurt_000000_007365_leftImg8bit.jpg frankfurt/frankfurt_000000_007365_rightImg8bit.jpg 16 | frankfurt/frankfurt_000000_008206_leftImg8bit.jpg frankfurt/frankfurt_000000_008206_rightImg8bit.jpg 17 | frankfurt/frankfurt_000000_008451_leftImg8bit.jpg frankfurt/frankfurt_000000_008451_rightImg8bit.jpg 18 | frankfurt/frankfurt_000000_009291_leftImg8bit.jpg frankfurt/frankfurt_000000_009291_rightImg8bit.jpg 19 | frankfurt/frankfurt_000000_009561_leftImg8bit.jpg frankfurt/frankfurt_000000_009561_rightImg8bit.jpg 20 | frankfurt/frankfurt_000000_009688_leftImg8bit.jpg frankfurt/frankfurt_000000_009688_rightImg8bit.jpg 21 | frankfurt/frankfurt_000000_009969_leftImg8bit.jpg frankfurt/frankfurt_000000_009969_rightImg8bit.jpg 22 | frankfurt/frankfurt_000000_010351_leftImg8bit.jpg frankfurt/frankfurt_000000_010351_rightImg8bit.jpg 23 | frankfurt/frankfurt_000000_010763_leftImg8bit.jpg frankfurt/frankfurt_000000_010763_rightImg8bit.jpg 24 | frankfurt/frankfurt_000000_011007_leftImg8bit.jpg frankfurt/frankfurt_000000_011007_rightImg8bit.jpg 25 | frankfurt/frankfurt_000000_011074_leftImg8bit.jpg frankfurt/frankfurt_000000_011074_rightImg8bit.jpg 26 | frankfurt/frankfurt_000000_011461_leftImg8bit.jpg frankfurt/frankfurt_000000_011461_rightImg8bit.jpg 27 | frankfurt/frankfurt_000000_011810_leftImg8bit.jpg frankfurt/frankfurt_000000_011810_rightImg8bit.jpg 28 | frankfurt/frankfurt_000000_012009_leftImg8bit.jpg frankfurt/frankfurt_000000_012009_rightImg8bit.jpg 29 | frankfurt/frankfurt_000000_012121_leftImg8bit.jpg frankfurt/frankfurt_000000_012121_rightImg8bit.jpg 30 | frankfurt/frankfurt_000000_012868_leftImg8bit.jpg frankfurt/frankfurt_000000_012868_rightImg8bit.jpg 31 | frankfurt/frankfurt_000000_013067_leftImg8bit.jpg frankfurt/frankfurt_000000_013067_rightImg8bit.jpg 32 | frankfurt/frankfurt_000000_013240_leftImg8bit.jpg frankfurt/frankfurt_000000_013240_rightImg8bit.jpg 33 | frankfurt/frankfurt_000000_013382_leftImg8bit.jpg frankfurt/frankfurt_000000_013382_rightImg8bit.jpg 34 | frankfurt/frankfurt_000000_013942_leftImg8bit.jpg frankfurt/frankfurt_000000_013942_rightImg8bit.jpg 35 | frankfurt/frankfurt_000000_014480_leftImg8bit.jpg frankfurt/frankfurt_000000_014480_rightImg8bit.jpg 36 | frankfurt/frankfurt_000000_015389_leftImg8bit.jpg frankfurt/frankfurt_000000_015389_rightImg8bit.jpg 37 | frankfurt/frankfurt_000000_015676_leftImg8bit.jpg frankfurt/frankfurt_000000_015676_rightImg8bit.jpg 38 | frankfurt/frankfurt_000000_016005_leftImg8bit.jpg frankfurt/frankfurt_000000_016005_rightImg8bit.jpg 39 | frankfurt/frankfurt_000000_016286_leftImg8bit.jpg frankfurt/frankfurt_000000_016286_rightImg8bit.jpg 40 | frankfurt/frankfurt_000000_017228_leftImg8bit.jpg frankfurt/frankfurt_000000_017228_rightImg8bit.jpg 41 | frankfurt/frankfurt_000000_017476_leftImg8bit.jpg frankfurt/frankfurt_000000_017476_rightImg8bit.jpg 42 | frankfurt/frankfurt_000000_018797_leftImg8bit.jpg frankfurt/frankfurt_000000_018797_rightImg8bit.jpg 43 | frankfurt/frankfurt_000000_019607_leftImg8bit.jpg frankfurt/frankfurt_000000_019607_rightImg8bit.jpg 44 | frankfurt/frankfurt_000000_020215_leftImg8bit.jpg frankfurt/frankfurt_000000_020215_rightImg8bit.jpg 45 | frankfurt/frankfurt_000000_020321_leftImg8bit.jpg frankfurt/frankfurt_000000_020321_rightImg8bit.jpg 46 | frankfurt/frankfurt_000000_020880_leftImg8bit.jpg frankfurt/frankfurt_000000_020880_rightImg8bit.jpg 47 | frankfurt/frankfurt_000000_021667_leftImg8bit.jpg frankfurt/frankfurt_000000_021667_rightImg8bit.jpg 48 | frankfurt/frankfurt_000000_021879_leftImg8bit.jpg frankfurt/frankfurt_000000_021879_rightImg8bit.jpg 49 | frankfurt/frankfurt_000000_022254_leftImg8bit.jpg frankfurt/frankfurt_000000_022254_rightImg8bit.jpg 50 | frankfurt/frankfurt_000000_022797_leftImg8bit.jpg frankfurt/frankfurt_000000_022797_rightImg8bit.jpg 51 | frankfurt/frankfurt_000001_000538_leftImg8bit.jpg frankfurt/frankfurt_000001_000538_rightImg8bit.jpg 52 | frankfurt/frankfurt_000001_001464_leftImg8bit.jpg frankfurt/frankfurt_000001_001464_rightImg8bit.jpg 53 | frankfurt/frankfurt_000001_002512_leftImg8bit.jpg frankfurt/frankfurt_000001_002512_rightImg8bit.jpg 54 | frankfurt/frankfurt_000001_002646_leftImg8bit.jpg frankfurt/frankfurt_000001_002646_rightImg8bit.jpg 55 | frankfurt/frankfurt_000001_002759_leftImg8bit.jpg frankfurt/frankfurt_000001_002759_rightImg8bit.jpg 56 | frankfurt/frankfurt_000001_003056_leftImg8bit.jpg frankfurt/frankfurt_000001_003056_rightImg8bit.jpg 57 | frankfurt/frankfurt_000001_003588_leftImg8bit.jpg frankfurt/frankfurt_000001_003588_rightImg8bit.jpg 58 | frankfurt/frankfurt_000001_004327_leftImg8bit.jpg frankfurt/frankfurt_000001_004327_rightImg8bit.jpg 59 | frankfurt/frankfurt_000001_004736_leftImg8bit.jpg frankfurt/frankfurt_000001_004736_rightImg8bit.jpg 60 | frankfurt/frankfurt_000001_004859_leftImg8bit.jpg frankfurt/frankfurt_000001_004859_rightImg8bit.jpg 61 | frankfurt/frankfurt_000001_005184_leftImg8bit.jpg frankfurt/frankfurt_000001_005184_rightImg8bit.jpg 62 | frankfurt/frankfurt_000001_005410_leftImg8bit.jpg frankfurt/frankfurt_000001_005410_rightImg8bit.jpg 63 | frankfurt/frankfurt_000001_005703_leftImg8bit.jpg frankfurt/frankfurt_000001_005703_rightImg8bit.jpg 64 | frankfurt/frankfurt_000001_005898_leftImg8bit.jpg frankfurt/frankfurt_000001_005898_rightImg8bit.jpg 65 | frankfurt/frankfurt_000001_007285_leftImg8bit.jpg frankfurt/frankfurt_000001_007285_rightImg8bit.jpg 66 | frankfurt/frankfurt_000001_007407_leftImg8bit.jpg frankfurt/frankfurt_000001_007407_rightImg8bit.jpg 67 | frankfurt/frankfurt_000001_007622_leftImg8bit.jpg frankfurt/frankfurt_000001_007622_rightImg8bit.jpg 68 | frankfurt/frankfurt_000001_007857_leftImg8bit.jpg frankfurt/frankfurt_000001_007857_rightImg8bit.jpg 69 | frankfurt/frankfurt_000001_007973_leftImg8bit.jpg frankfurt/frankfurt_000001_007973_rightImg8bit.jpg 70 | frankfurt/frankfurt_000001_008200_leftImg8bit.jpg frankfurt/frankfurt_000001_008200_rightImg8bit.jpg 71 | frankfurt/frankfurt_000001_008688_leftImg8bit.jpg frankfurt/frankfurt_000001_008688_rightImg8bit.jpg 72 | frankfurt/frankfurt_000001_009058_leftImg8bit.jpg frankfurt/frankfurt_000001_009058_rightImg8bit.jpg 73 | frankfurt/frankfurt_000001_009504_leftImg8bit.jpg frankfurt/frankfurt_000001_009504_rightImg8bit.jpg 74 | frankfurt/frankfurt_000001_009854_leftImg8bit.jpg frankfurt/frankfurt_000001_009854_rightImg8bit.jpg 75 | frankfurt/frankfurt_000001_010156_leftImg8bit.jpg frankfurt/frankfurt_000001_010156_rightImg8bit.jpg 76 | frankfurt/frankfurt_000001_010444_leftImg8bit.jpg frankfurt/frankfurt_000001_010444_rightImg8bit.jpg 77 | frankfurt/frankfurt_000001_010600_leftImg8bit.jpg frankfurt/frankfurt_000001_010600_rightImg8bit.jpg 78 | frankfurt/frankfurt_000001_010830_leftImg8bit.jpg frankfurt/frankfurt_000001_010830_rightImg8bit.jpg 79 | frankfurt/frankfurt_000001_011162_leftImg8bit.jpg frankfurt/frankfurt_000001_011162_rightImg8bit.jpg 80 | frankfurt/frankfurt_000001_011715_leftImg8bit.jpg frankfurt/frankfurt_000001_011715_rightImg8bit.jpg 81 | frankfurt/frankfurt_000001_011835_leftImg8bit.jpg frankfurt/frankfurt_000001_011835_rightImg8bit.jpg 82 | frankfurt/frankfurt_000001_012038_leftImg8bit.jpg frankfurt/frankfurt_000001_012038_rightImg8bit.jpg 83 | frankfurt/frankfurt_000001_012519_leftImg8bit.jpg frankfurt/frankfurt_000001_012519_rightImg8bit.jpg 84 | frankfurt/frankfurt_000001_012699_leftImg8bit.jpg frankfurt/frankfurt_000001_012699_rightImg8bit.jpg 85 | frankfurt/frankfurt_000001_012738_leftImg8bit.jpg frankfurt/frankfurt_000001_012738_rightImg8bit.jpg 86 | frankfurt/frankfurt_000001_012870_leftImg8bit.jpg frankfurt/frankfurt_000001_012870_rightImg8bit.jpg 87 | frankfurt/frankfurt_000001_013016_leftImg8bit.jpg frankfurt/frankfurt_000001_013016_rightImg8bit.jpg 88 | frankfurt/frankfurt_000001_013496_leftImg8bit.jpg frankfurt/frankfurt_000001_013496_rightImg8bit.jpg 89 | frankfurt/frankfurt_000001_013710_leftImg8bit.jpg frankfurt/frankfurt_000001_013710_rightImg8bit.jpg 90 | frankfurt/frankfurt_000001_014221_leftImg8bit.jpg frankfurt/frankfurt_000001_014221_rightImg8bit.jpg 91 | frankfurt/frankfurt_000001_014406_leftImg8bit.jpg frankfurt/frankfurt_000001_014406_rightImg8bit.jpg 92 | frankfurt/frankfurt_000001_014565_leftImg8bit.jpg frankfurt/frankfurt_000001_014565_rightImg8bit.jpg 93 | frankfurt/frankfurt_000001_014741_leftImg8bit.jpg frankfurt/frankfurt_000001_014741_rightImg8bit.jpg 94 | frankfurt/frankfurt_000001_015091_leftImg8bit.jpg frankfurt/frankfurt_000001_015091_rightImg8bit.jpg 95 | frankfurt/frankfurt_000001_015328_leftImg8bit.jpg frankfurt/frankfurt_000001_015328_rightImg8bit.jpg 96 | frankfurt/frankfurt_000001_015768_leftImg8bit.jpg frankfurt/frankfurt_000001_015768_rightImg8bit.jpg 97 | frankfurt/frankfurt_000001_016029_leftImg8bit.jpg frankfurt/frankfurt_000001_016029_rightImg8bit.jpg 98 | frankfurt/frankfurt_000001_016273_leftImg8bit.jpg frankfurt/frankfurt_000001_016273_rightImg8bit.jpg 99 | frankfurt/frankfurt_000001_016462_leftImg8bit.jpg frankfurt/frankfurt_000001_016462_rightImg8bit.jpg 100 | frankfurt/frankfurt_000001_017101_leftImg8bit.jpg frankfurt/frankfurt_000001_017101_rightImg8bit.jpg 101 | frankfurt/frankfurt_000001_017459_leftImg8bit.jpg frankfurt/frankfurt_000001_017459_rightImg8bit.jpg 102 | frankfurt/frankfurt_000001_017842_leftImg8bit.jpg frankfurt/frankfurt_000001_017842_rightImg8bit.jpg 103 | frankfurt/frankfurt_000001_018113_leftImg8bit.jpg frankfurt/frankfurt_000001_018113_rightImg8bit.jpg 104 | frankfurt/frankfurt_000001_019698_leftImg8bit.jpg frankfurt/frankfurt_000001_019698_rightImg8bit.jpg 105 | frankfurt/frankfurt_000001_019854_leftImg8bit.jpg frankfurt/frankfurt_000001_019854_rightImg8bit.jpg 106 | frankfurt/frankfurt_000001_019969_leftImg8bit.jpg frankfurt/frankfurt_000001_019969_rightImg8bit.jpg 107 | frankfurt/frankfurt_000001_020046_leftImg8bit.jpg frankfurt/frankfurt_000001_020046_rightImg8bit.jpg 108 | frankfurt/frankfurt_000001_020287_leftImg8bit.jpg frankfurt/frankfurt_000001_020287_rightImg8bit.jpg 109 | frankfurt/frankfurt_000001_020693_leftImg8bit.jpg frankfurt/frankfurt_000001_020693_rightImg8bit.jpg 110 | frankfurt/frankfurt_000001_021406_leftImg8bit.jpg frankfurt/frankfurt_000001_021406_rightImg8bit.jpg 111 | frankfurt/frankfurt_000001_021825_leftImg8bit.jpg frankfurt/frankfurt_000001_021825_rightImg8bit.jpg 112 | frankfurt/frankfurt_000001_023235_leftImg8bit.jpg frankfurt/frankfurt_000001_023235_rightImg8bit.jpg 113 | frankfurt/frankfurt_000001_023369_leftImg8bit.jpg frankfurt/frankfurt_000001_023369_rightImg8bit.jpg 114 | frankfurt/frankfurt_000001_023769_leftImg8bit.jpg frankfurt/frankfurt_000001_023769_rightImg8bit.jpg 115 | frankfurt/frankfurt_000001_024927_leftImg8bit.jpg frankfurt/frankfurt_000001_024927_rightImg8bit.jpg 116 | frankfurt/frankfurt_000001_025512_leftImg8bit.jpg frankfurt/frankfurt_000001_025512_rightImg8bit.jpg 117 | frankfurt/frankfurt_000001_025713_leftImg8bit.jpg frankfurt/frankfurt_000001_025713_rightImg8bit.jpg 118 | frankfurt/frankfurt_000001_025921_leftImg8bit.jpg frankfurt/frankfurt_000001_025921_rightImg8bit.jpg 119 | frankfurt/frankfurt_000001_027325_leftImg8bit.jpg frankfurt/frankfurt_000001_027325_rightImg8bit.jpg 120 | frankfurt/frankfurt_000001_028232_leftImg8bit.jpg frankfurt/frankfurt_000001_028232_rightImg8bit.jpg 121 | frankfurt/frankfurt_000001_028335_leftImg8bit.jpg frankfurt/frankfurt_000001_028335_rightImg8bit.jpg 122 | frankfurt/frankfurt_000001_028590_leftImg8bit.jpg frankfurt/frankfurt_000001_028590_rightImg8bit.jpg 123 | frankfurt/frankfurt_000001_028854_leftImg8bit.jpg frankfurt/frankfurt_000001_028854_rightImg8bit.jpg 124 | frankfurt/frankfurt_000001_029086_leftImg8bit.jpg frankfurt/frankfurt_000001_029086_rightImg8bit.jpg 125 | frankfurt/frankfurt_000001_029236_leftImg8bit.jpg frankfurt/frankfurt_000001_029236_rightImg8bit.jpg 126 | frankfurt/frankfurt_000001_029600_leftImg8bit.jpg frankfurt/frankfurt_000001_029600_rightImg8bit.jpg 127 | frankfurt/frankfurt_000001_030067_leftImg8bit.jpg frankfurt/frankfurt_000001_030067_rightImg8bit.jpg 128 | frankfurt/frankfurt_000001_030310_leftImg8bit.jpg frankfurt/frankfurt_000001_030310_rightImg8bit.jpg 129 | frankfurt/frankfurt_000001_030669_leftImg8bit.jpg frankfurt/frankfurt_000001_030669_rightImg8bit.jpg 130 | frankfurt/frankfurt_000001_031266_leftImg8bit.jpg frankfurt/frankfurt_000001_031266_rightImg8bit.jpg 131 | frankfurt/frankfurt_000001_031416_leftImg8bit.jpg frankfurt/frankfurt_000001_031416_rightImg8bit.jpg 132 | frankfurt/frankfurt_000001_032018_leftImg8bit.jpg frankfurt/frankfurt_000001_032018_rightImg8bit.jpg 133 | frankfurt/frankfurt_000001_032556_leftImg8bit.jpg frankfurt/frankfurt_000001_032556_rightImg8bit.jpg 134 | frankfurt/frankfurt_000001_032711_leftImg8bit.jpg frankfurt/frankfurt_000001_032711_rightImg8bit.jpg 135 | frankfurt/frankfurt_000001_032942_leftImg8bit.jpg frankfurt/frankfurt_000001_032942_rightImg8bit.jpg 136 | frankfurt/frankfurt_000001_033655_leftImg8bit.jpg frankfurt/frankfurt_000001_033655_rightImg8bit.jpg 137 | frankfurt/frankfurt_000001_034047_leftImg8bit.jpg frankfurt/frankfurt_000001_034047_rightImg8bit.jpg 138 | frankfurt/frankfurt_000001_034816_leftImg8bit.jpg frankfurt/frankfurt_000001_034816_rightImg8bit.jpg 139 | frankfurt/frankfurt_000001_035144_leftImg8bit.jpg frankfurt/frankfurt_000001_035144_rightImg8bit.jpg 140 | frankfurt/frankfurt_000001_035864_leftImg8bit.jpg frankfurt/frankfurt_000001_035864_rightImg8bit.jpg 141 | frankfurt/frankfurt_000001_037705_leftImg8bit.jpg frankfurt/frankfurt_000001_037705_rightImg8bit.jpg 142 | frankfurt/frankfurt_000001_038245_leftImg8bit.jpg frankfurt/frankfurt_000001_038245_rightImg8bit.jpg 143 | frankfurt/frankfurt_000001_038418_leftImg8bit.jpg frankfurt/frankfurt_000001_038418_rightImg8bit.jpg 144 | frankfurt/frankfurt_000001_038645_leftImg8bit.jpg frankfurt/frankfurt_000001_038645_rightImg8bit.jpg 145 | frankfurt/frankfurt_000001_038844_leftImg8bit.jpg frankfurt/frankfurt_000001_038844_rightImg8bit.jpg 146 | frankfurt/frankfurt_000001_039895_leftImg8bit.jpg frankfurt/frankfurt_000001_039895_rightImg8bit.jpg 147 | frankfurt/frankfurt_000001_040575_leftImg8bit.jpg frankfurt/frankfurt_000001_040575_rightImg8bit.jpg 148 | frankfurt/frankfurt_000001_040732_leftImg8bit.jpg frankfurt/frankfurt_000001_040732_rightImg8bit.jpg 149 | frankfurt/frankfurt_000001_041074_leftImg8bit.jpg frankfurt/frankfurt_000001_041074_rightImg8bit.jpg 150 | frankfurt/frankfurt_000001_041354_leftImg8bit.jpg frankfurt/frankfurt_000001_041354_rightImg8bit.jpg 151 | frankfurt/frankfurt_000001_041517_leftImg8bit.jpg frankfurt/frankfurt_000001_041517_rightImg8bit.jpg 152 | frankfurt/frankfurt_000001_041664_leftImg8bit.jpg frankfurt/frankfurt_000001_041664_rightImg8bit.jpg 153 | frankfurt/frankfurt_000001_042098_leftImg8bit.jpg frankfurt/frankfurt_000001_042098_rightImg8bit.jpg 154 | frankfurt/frankfurt_000001_042384_leftImg8bit.jpg frankfurt/frankfurt_000001_042384_rightImg8bit.jpg 155 | frankfurt/frankfurt_000001_042733_leftImg8bit.jpg frankfurt/frankfurt_000001_042733_rightImg8bit.jpg 156 | frankfurt/frankfurt_000001_043395_leftImg8bit.jpg frankfurt/frankfurt_000001_043395_rightImg8bit.jpg 157 | frankfurt/frankfurt_000001_043564_leftImg8bit.jpg frankfurt/frankfurt_000001_043564_rightImg8bit.jpg 158 | frankfurt/frankfurt_000001_044227_leftImg8bit.jpg frankfurt/frankfurt_000001_044227_rightImg8bit.jpg 159 | frankfurt/frankfurt_000001_044413_leftImg8bit.jpg frankfurt/frankfurt_000001_044413_rightImg8bit.jpg 160 | frankfurt/frankfurt_000001_044525_leftImg8bit.jpg frankfurt/frankfurt_000001_044525_rightImg8bit.jpg 161 | frankfurt/frankfurt_000001_044658_leftImg8bit.jpg frankfurt/frankfurt_000001_044658_rightImg8bit.jpg 162 | frankfurt/frankfurt_000001_044787_leftImg8bit.jpg frankfurt/frankfurt_000001_044787_rightImg8bit.jpg 163 | frankfurt/frankfurt_000001_046126_leftImg8bit.jpg frankfurt/frankfurt_000001_046126_rightImg8bit.jpg 164 | frankfurt/frankfurt_000001_046272_leftImg8bit.jpg frankfurt/frankfurt_000001_046272_rightImg8bit.jpg 165 | frankfurt/frankfurt_000001_046504_leftImg8bit.jpg frankfurt/frankfurt_000001_046504_rightImg8bit.jpg 166 | frankfurt/frankfurt_000001_046779_leftImg8bit.jpg frankfurt/frankfurt_000001_046779_rightImg8bit.jpg 167 | frankfurt/frankfurt_000001_047178_leftImg8bit.jpg frankfurt/frankfurt_000001_047178_rightImg8bit.jpg 168 | frankfurt/frankfurt_000001_047552_leftImg8bit.jpg frankfurt/frankfurt_000001_047552_rightImg8bit.jpg 169 | frankfurt/frankfurt_000001_048196_leftImg8bit.jpg frankfurt/frankfurt_000001_048196_rightImg8bit.jpg 170 | frankfurt/frankfurt_000001_048355_leftImg8bit.jpg frankfurt/frankfurt_000001_048355_rightImg8bit.jpg 171 | frankfurt/frankfurt_000001_048654_leftImg8bit.jpg frankfurt/frankfurt_000001_048654_rightImg8bit.jpg 172 | frankfurt/frankfurt_000001_049078_leftImg8bit.jpg frankfurt/frankfurt_000001_049078_rightImg8bit.jpg 173 | frankfurt/frankfurt_000001_049209_leftImg8bit.jpg frankfurt/frankfurt_000001_049209_rightImg8bit.jpg 174 | frankfurt/frankfurt_000001_049298_leftImg8bit.jpg frankfurt/frankfurt_000001_049298_rightImg8bit.jpg 175 | frankfurt/frankfurt_000001_049698_leftImg8bit.jpg frankfurt/frankfurt_000001_049698_rightImg8bit.jpg 176 | frankfurt/frankfurt_000001_049770_leftImg8bit.jpg frankfurt/frankfurt_000001_049770_rightImg8bit.jpg 177 | frankfurt/frankfurt_000001_050149_leftImg8bit.jpg frankfurt/frankfurt_000001_050149_rightImg8bit.jpg 178 | frankfurt/frankfurt_000001_050686_leftImg8bit.jpg frankfurt/frankfurt_000001_050686_rightImg8bit.jpg 179 | frankfurt/frankfurt_000001_051516_leftImg8bit.jpg frankfurt/frankfurt_000001_051516_rightImg8bit.jpg 180 | frankfurt/frankfurt_000001_051737_leftImg8bit.jpg frankfurt/frankfurt_000001_051737_rightImg8bit.jpg 181 | frankfurt/frankfurt_000001_051807_leftImg8bit.jpg frankfurt/frankfurt_000001_051807_rightImg8bit.jpg 182 | frankfurt/frankfurt_000001_052120_leftImg8bit.jpg frankfurt/frankfurt_000001_052120_rightImg8bit.jpg 183 | frankfurt/frankfurt_000001_052594_leftImg8bit.jpg frankfurt/frankfurt_000001_052594_rightImg8bit.jpg 184 | frankfurt/frankfurt_000001_053102_leftImg8bit.jpg frankfurt/frankfurt_000001_053102_rightImg8bit.jpg 185 | frankfurt/frankfurt_000001_054077_leftImg8bit.jpg frankfurt/frankfurt_000001_054077_rightImg8bit.jpg 186 | frankfurt/frankfurt_000001_054219_leftImg8bit.jpg frankfurt/frankfurt_000001_054219_rightImg8bit.jpg 187 | frankfurt/frankfurt_000001_054415_leftImg8bit.jpg frankfurt/frankfurt_000001_054415_rightImg8bit.jpg 188 | frankfurt/frankfurt_000001_054640_leftImg8bit.jpg frankfurt/frankfurt_000001_054640_rightImg8bit.jpg 189 | frankfurt/frankfurt_000001_054884_leftImg8bit.jpg frankfurt/frankfurt_000001_054884_rightImg8bit.jpg 190 | frankfurt/frankfurt_000001_055062_leftImg8bit.jpg frankfurt/frankfurt_000001_055062_rightImg8bit.jpg 191 | frankfurt/frankfurt_000001_055172_leftImg8bit.jpg frankfurt/frankfurt_000001_055172_rightImg8bit.jpg 192 | frankfurt/frankfurt_000001_055306_leftImg8bit.jpg frankfurt/frankfurt_000001_055306_rightImg8bit.jpg 193 | frankfurt/frankfurt_000001_055387_leftImg8bit.jpg frankfurt/frankfurt_000001_055387_rightImg8bit.jpg 194 | frankfurt/frankfurt_000001_055538_leftImg8bit.jpg frankfurt/frankfurt_000001_055538_rightImg8bit.jpg 195 | frankfurt/frankfurt_000001_055603_leftImg8bit.jpg frankfurt/frankfurt_000001_055603_rightImg8bit.jpg 196 | frankfurt/frankfurt_000001_055709_leftImg8bit.jpg frankfurt/frankfurt_000001_055709_rightImg8bit.jpg 197 | frankfurt/frankfurt_000001_056580_leftImg8bit.jpg frankfurt/frankfurt_000001_056580_rightImg8bit.jpg 198 | frankfurt/frankfurt_000001_057181_leftImg8bit.jpg frankfurt/frankfurt_000001_057181_rightImg8bit.jpg 199 | frankfurt/frankfurt_000001_057478_leftImg8bit.jpg frankfurt/frankfurt_000001_057478_rightImg8bit.jpg 200 | frankfurt/frankfurt_000001_057954_leftImg8bit.jpg frankfurt/frankfurt_000001_057954_rightImg8bit.jpg 201 | frankfurt/frankfurt_000001_058057_leftImg8bit.jpg frankfurt/frankfurt_000001_058057_rightImg8bit.jpg 202 | frankfurt/frankfurt_000001_058176_leftImg8bit.jpg frankfurt/frankfurt_000001_058176_rightImg8bit.jpg 203 | frankfurt/frankfurt_000001_058504_leftImg8bit.jpg frankfurt/frankfurt_000001_058504_rightImg8bit.jpg 204 | frankfurt/frankfurt_000001_058914_leftImg8bit.jpg frankfurt/frankfurt_000001_058914_rightImg8bit.jpg 205 | frankfurt/frankfurt_000001_059119_leftImg8bit.jpg frankfurt/frankfurt_000001_059119_rightImg8bit.jpg 206 | frankfurt/frankfurt_000001_059642_leftImg8bit.jpg frankfurt/frankfurt_000001_059642_rightImg8bit.jpg 207 | frankfurt/frankfurt_000001_059789_leftImg8bit.jpg frankfurt/frankfurt_000001_059789_rightImg8bit.jpg 208 | frankfurt/frankfurt_000001_060135_leftImg8bit.jpg frankfurt/frankfurt_000001_060135_rightImg8bit.jpg 209 | frankfurt/frankfurt_000001_060422_leftImg8bit.jpg frankfurt/frankfurt_000001_060422_rightImg8bit.jpg 210 | frankfurt/frankfurt_000001_060545_leftImg8bit.jpg frankfurt/frankfurt_000001_060545_rightImg8bit.jpg 211 | frankfurt/frankfurt_000001_060906_leftImg8bit.jpg frankfurt/frankfurt_000001_060906_rightImg8bit.jpg 212 | frankfurt/frankfurt_000001_061682_leftImg8bit.jpg frankfurt/frankfurt_000001_061682_rightImg8bit.jpg 213 | frankfurt/frankfurt_000001_061763_leftImg8bit.jpg frankfurt/frankfurt_000001_061763_rightImg8bit.jpg 214 | frankfurt/frankfurt_000001_062016_leftImg8bit.jpg frankfurt/frankfurt_000001_062016_rightImg8bit.jpg 215 | frankfurt/frankfurt_000001_062250_leftImg8bit.jpg frankfurt/frankfurt_000001_062250_rightImg8bit.jpg 216 | frankfurt/frankfurt_000001_062396_leftImg8bit.jpg frankfurt/frankfurt_000001_062396_rightImg8bit.jpg 217 | frankfurt/frankfurt_000001_062509_leftImg8bit.jpg frankfurt/frankfurt_000001_062509_rightImg8bit.jpg 218 | frankfurt/frankfurt_000001_062653_leftImg8bit.jpg frankfurt/frankfurt_000001_062653_rightImg8bit.jpg 219 | frankfurt/frankfurt_000001_062793_leftImg8bit.jpg frankfurt/frankfurt_000001_062793_rightImg8bit.jpg 220 | frankfurt/frankfurt_000001_063045_leftImg8bit.jpg frankfurt/frankfurt_000001_063045_rightImg8bit.jpg 221 | frankfurt/frankfurt_000001_064130_leftImg8bit.jpg frankfurt/frankfurt_000001_064130_rightImg8bit.jpg 222 | frankfurt/frankfurt_000001_064305_leftImg8bit.jpg frankfurt/frankfurt_000001_064305_rightImg8bit.jpg 223 | frankfurt/frankfurt_000001_064651_leftImg8bit.jpg frankfurt/frankfurt_000001_064651_rightImg8bit.jpg 224 | frankfurt/frankfurt_000001_064798_leftImg8bit.jpg frankfurt/frankfurt_000001_064798_rightImg8bit.jpg 225 | frankfurt/frankfurt_000001_064925_leftImg8bit.jpg frankfurt/frankfurt_000001_064925_rightImg8bit.jpg 226 | frankfurt/frankfurt_000001_065160_leftImg8bit.jpg frankfurt/frankfurt_000001_065160_rightImg8bit.jpg 227 | frankfurt/frankfurt_000001_065617_leftImg8bit.jpg frankfurt/frankfurt_000001_065617_rightImg8bit.jpg 228 | frankfurt/frankfurt_000001_065850_leftImg8bit.jpg frankfurt/frankfurt_000001_065850_rightImg8bit.jpg 229 | frankfurt/frankfurt_000001_066092_leftImg8bit.jpg frankfurt/frankfurt_000001_066092_rightImg8bit.jpg 230 | frankfurt/frankfurt_000001_066438_leftImg8bit.jpg frankfurt/frankfurt_000001_066438_rightImg8bit.jpg 231 | frankfurt/frankfurt_000001_066574_leftImg8bit.jpg frankfurt/frankfurt_000001_066574_rightImg8bit.jpg 232 | frankfurt/frankfurt_000001_066832_leftImg8bit.jpg frankfurt/frankfurt_000001_066832_rightImg8bit.jpg 233 | frankfurt/frankfurt_000001_067092_leftImg8bit.jpg frankfurt/frankfurt_000001_067092_rightImg8bit.jpg 234 | frankfurt/frankfurt_000001_067178_leftImg8bit.jpg frankfurt/frankfurt_000001_067178_rightImg8bit.jpg 235 | frankfurt/frankfurt_000001_067295_leftImg8bit.jpg frankfurt/frankfurt_000001_067295_rightImg8bit.jpg 236 | frankfurt/frankfurt_000001_067474_leftImg8bit.jpg frankfurt/frankfurt_000001_067474_rightImg8bit.jpg 237 | frankfurt/frankfurt_000001_067735_leftImg8bit.jpg frankfurt/frankfurt_000001_067735_rightImg8bit.jpg 238 | frankfurt/frankfurt_000001_068063_leftImg8bit.jpg frankfurt/frankfurt_000001_068063_rightImg8bit.jpg 239 | frankfurt/frankfurt_000001_068208_leftImg8bit.jpg frankfurt/frankfurt_000001_068208_rightImg8bit.jpg 240 | frankfurt/frankfurt_000001_068682_leftImg8bit.jpg frankfurt/frankfurt_000001_068682_rightImg8bit.jpg 241 | frankfurt/frankfurt_000001_068772_leftImg8bit.jpg frankfurt/frankfurt_000001_068772_rightImg8bit.jpg 242 | frankfurt/frankfurt_000001_069633_leftImg8bit.jpg frankfurt/frankfurt_000001_069633_rightImg8bit.jpg 243 | frankfurt/frankfurt_000001_070099_leftImg8bit.jpg frankfurt/frankfurt_000001_070099_rightImg8bit.jpg 244 | frankfurt/frankfurt_000001_071288_leftImg8bit.jpg frankfurt/frankfurt_000001_071288_rightImg8bit.jpg 245 | frankfurt/frankfurt_000001_071781_leftImg8bit.jpg frankfurt/frankfurt_000001_071781_rightImg8bit.jpg 246 | frankfurt/frankfurt_000001_072155_leftImg8bit.jpg frankfurt/frankfurt_000001_072155_rightImg8bit.jpg 247 | frankfurt/frankfurt_000001_072295_leftImg8bit.jpg frankfurt/frankfurt_000001_072295_rightImg8bit.jpg 248 | frankfurt/frankfurt_000001_073088_leftImg8bit.jpg frankfurt/frankfurt_000001_073088_rightImg8bit.jpg 249 | frankfurt/frankfurt_000001_073243_leftImg8bit.jpg frankfurt/frankfurt_000001_073243_rightImg8bit.jpg 250 | frankfurt/frankfurt_000001_073464_leftImg8bit.jpg frankfurt/frankfurt_000001_073464_rightImg8bit.jpg 251 | frankfurt/frankfurt_000001_073911_leftImg8bit.jpg frankfurt/frankfurt_000001_073911_rightImg8bit.jpg 252 | frankfurt/frankfurt_000001_075296_leftImg8bit.jpg frankfurt/frankfurt_000001_075296_rightImg8bit.jpg 253 | frankfurt/frankfurt_000001_075984_leftImg8bit.jpg frankfurt/frankfurt_000001_075984_rightImg8bit.jpg 254 | frankfurt/frankfurt_000001_076502_leftImg8bit.jpg frankfurt/frankfurt_000001_076502_rightImg8bit.jpg 255 | frankfurt/frankfurt_000001_077092_leftImg8bit.jpg frankfurt/frankfurt_000001_077092_rightImg8bit.jpg 256 | frankfurt/frankfurt_000001_077233_leftImg8bit.jpg frankfurt/frankfurt_000001_077233_rightImg8bit.jpg 257 | frankfurt/frankfurt_000001_077434_leftImg8bit.jpg frankfurt/frankfurt_000001_077434_rightImg8bit.jpg 258 | frankfurt/frankfurt_000001_078803_leftImg8bit.jpg frankfurt/frankfurt_000001_078803_rightImg8bit.jpg 259 | frankfurt/frankfurt_000001_079206_leftImg8bit.jpg frankfurt/frankfurt_000001_079206_rightImg8bit.jpg 260 | frankfurt/frankfurt_000001_080091_leftImg8bit.jpg frankfurt/frankfurt_000001_080091_rightImg8bit.jpg 261 | frankfurt/frankfurt_000001_080391_leftImg8bit.jpg frankfurt/frankfurt_000001_080391_rightImg8bit.jpg 262 | frankfurt/frankfurt_000001_080830_leftImg8bit.jpg frankfurt/frankfurt_000001_080830_rightImg8bit.jpg 263 | frankfurt/frankfurt_000001_082087_leftImg8bit.jpg frankfurt/frankfurt_000001_082087_rightImg8bit.jpg 264 | frankfurt/frankfurt_000001_082466_leftImg8bit.jpg frankfurt/frankfurt_000001_082466_rightImg8bit.jpg 265 | frankfurt/frankfurt_000001_083029_leftImg8bit.jpg frankfurt/frankfurt_000001_083029_rightImg8bit.jpg 266 | frankfurt/frankfurt_000001_083199_leftImg8bit.jpg frankfurt/frankfurt_000001_083199_rightImg8bit.jpg 267 | frankfurt/frankfurt_000001_083852_leftImg8bit.jpg frankfurt/frankfurt_000001_083852_rightImg8bit.jpg 268 | lindau/lindau_000000_000019_leftImg8bit.jpg lindau/lindau_000000_000019_rightImg8bit.jpg 269 | lindau/lindau_000001_000019_leftImg8bit.jpg lindau/lindau_000001_000019_rightImg8bit.jpg 270 | lindau/lindau_000002_000019_leftImg8bit.jpg lindau/lindau_000002_000019_rightImg8bit.jpg 271 | lindau/lindau_000003_000019_leftImg8bit.jpg lindau/lindau_000003_000019_rightImg8bit.jpg 272 | lindau/lindau_000004_000019_leftImg8bit.jpg lindau/lindau_000004_000019_rightImg8bit.jpg 273 | lindau/lindau_000005_000019_leftImg8bit.jpg lindau/lindau_000005_000019_rightImg8bit.jpg 274 | lindau/lindau_000006_000019_leftImg8bit.jpg lindau/lindau_000006_000019_rightImg8bit.jpg 275 | lindau/lindau_000007_000019_leftImg8bit.jpg lindau/lindau_000007_000019_rightImg8bit.jpg 276 | lindau/lindau_000008_000019_leftImg8bit.jpg lindau/lindau_000008_000019_rightImg8bit.jpg 277 | lindau/lindau_000009_000019_leftImg8bit.jpg lindau/lindau_000009_000019_rightImg8bit.jpg 278 | lindau/lindau_000010_000019_leftImg8bit.jpg lindau/lindau_000010_000019_rightImg8bit.jpg 279 | lindau/lindau_000011_000019_leftImg8bit.jpg lindau/lindau_000011_000019_rightImg8bit.jpg 280 | lindau/lindau_000012_000019_leftImg8bit.jpg lindau/lindau_000012_000019_rightImg8bit.jpg 281 | lindau/lindau_000013_000019_leftImg8bit.jpg lindau/lindau_000013_000019_rightImg8bit.jpg 282 | lindau/lindau_000014_000019_leftImg8bit.jpg lindau/lindau_000014_000019_rightImg8bit.jpg 283 | lindau/lindau_000015_000019_leftImg8bit.jpg lindau/lindau_000015_000019_rightImg8bit.jpg 284 | lindau/lindau_000016_000019_leftImg8bit.jpg lindau/lindau_000016_000019_rightImg8bit.jpg 285 | lindau/lindau_000017_000019_leftImg8bit.jpg lindau/lindau_000017_000019_rightImg8bit.jpg 286 | lindau/lindau_000018_000019_leftImg8bit.jpg lindau/lindau_000018_000019_rightImg8bit.jpg 287 | lindau/lindau_000019_000019_leftImg8bit.jpg lindau/lindau_000019_000019_rightImg8bit.jpg 288 | lindau/lindau_000020_000019_leftImg8bit.jpg lindau/lindau_000020_000019_rightImg8bit.jpg 289 | lindau/lindau_000021_000019_leftImg8bit.jpg lindau/lindau_000021_000019_rightImg8bit.jpg 290 | lindau/lindau_000022_000019_leftImg8bit.jpg lindau/lindau_000022_000019_rightImg8bit.jpg 291 | lindau/lindau_000023_000019_leftImg8bit.jpg lindau/lindau_000023_000019_rightImg8bit.jpg 292 | lindau/lindau_000024_000019_leftImg8bit.jpg lindau/lindau_000024_000019_rightImg8bit.jpg 293 | lindau/lindau_000025_000019_leftImg8bit.jpg lindau/lindau_000025_000019_rightImg8bit.jpg 294 | lindau/lindau_000026_000019_leftImg8bit.jpg lindau/lindau_000026_000019_rightImg8bit.jpg 295 | lindau/lindau_000027_000019_leftImg8bit.jpg lindau/lindau_000027_000019_rightImg8bit.jpg 296 | lindau/lindau_000028_000019_leftImg8bit.jpg lindau/lindau_000028_000019_rightImg8bit.jpg 297 | lindau/lindau_000029_000019_leftImg8bit.jpg lindau/lindau_000029_000019_rightImg8bit.jpg 298 | lindau/lindau_000030_000019_leftImg8bit.jpg lindau/lindau_000030_000019_rightImg8bit.jpg 299 | lindau/lindau_000031_000019_leftImg8bit.jpg lindau/lindau_000031_000019_rightImg8bit.jpg 300 | lindau/lindau_000032_000019_leftImg8bit.jpg lindau/lindau_000032_000019_rightImg8bit.jpg 301 | lindau/lindau_000033_000019_leftImg8bit.jpg lindau/lindau_000033_000019_rightImg8bit.jpg 302 | lindau/lindau_000034_000019_leftImg8bit.jpg lindau/lindau_000034_000019_rightImg8bit.jpg 303 | lindau/lindau_000035_000019_leftImg8bit.jpg lindau/lindau_000035_000019_rightImg8bit.jpg 304 | lindau/lindau_000036_000019_leftImg8bit.jpg lindau/lindau_000036_000019_rightImg8bit.jpg 305 | lindau/lindau_000037_000019_leftImg8bit.jpg lindau/lindau_000037_000019_rightImg8bit.jpg 306 | lindau/lindau_000038_000019_leftImg8bit.jpg lindau/lindau_000038_000019_rightImg8bit.jpg 307 | lindau/lindau_000039_000019_leftImg8bit.jpg lindau/lindau_000039_000019_rightImg8bit.jpg 308 | lindau/lindau_000040_000019_leftImg8bit.jpg lindau/lindau_000040_000019_rightImg8bit.jpg 309 | lindau/lindau_000041_000019_leftImg8bit.jpg lindau/lindau_000041_000019_rightImg8bit.jpg 310 | lindau/lindau_000042_000019_leftImg8bit.jpg lindau/lindau_000042_000019_rightImg8bit.jpg 311 | lindau/lindau_000043_000019_leftImg8bit.jpg lindau/lindau_000043_000019_rightImg8bit.jpg 312 | lindau/lindau_000044_000019_leftImg8bit.jpg lindau/lindau_000044_000019_rightImg8bit.jpg 313 | lindau/lindau_000045_000019_leftImg8bit.jpg lindau/lindau_000045_000019_rightImg8bit.jpg 314 | lindau/lindau_000046_000019_leftImg8bit.jpg lindau/lindau_000046_000019_rightImg8bit.jpg 315 | lindau/lindau_000047_000019_leftImg8bit.jpg lindau/lindau_000047_000019_rightImg8bit.jpg 316 | lindau/lindau_000048_000019_leftImg8bit.jpg lindau/lindau_000048_000019_rightImg8bit.jpg 317 | lindau/lindau_000049_000019_leftImg8bit.jpg lindau/lindau_000049_000019_rightImg8bit.jpg 318 | lindau/lindau_000050_000019_leftImg8bit.jpg lindau/lindau_000050_000019_rightImg8bit.jpg 319 | lindau/lindau_000051_000019_leftImg8bit.jpg lindau/lindau_000051_000019_rightImg8bit.jpg 320 | lindau/lindau_000052_000019_leftImg8bit.jpg lindau/lindau_000052_000019_rightImg8bit.jpg 321 | lindau/lindau_000053_000019_leftImg8bit.jpg lindau/lindau_000053_000019_rightImg8bit.jpg 322 | lindau/lindau_000054_000019_leftImg8bit.jpg lindau/lindau_000054_000019_rightImg8bit.jpg 323 | lindau/lindau_000055_000019_leftImg8bit.jpg lindau/lindau_000055_000019_rightImg8bit.jpg 324 | lindau/lindau_000056_000019_leftImg8bit.jpg lindau/lindau_000056_000019_rightImg8bit.jpg 325 | lindau/lindau_000057_000019_leftImg8bit.jpg lindau/lindau_000057_000019_rightImg8bit.jpg 326 | lindau/lindau_000058_000019_leftImg8bit.jpg lindau/lindau_000058_000019_rightImg8bit.jpg 327 | munster/munster_000000_000019_leftImg8bit.jpg munster/munster_000000_000019_rightImg8bit.jpg 328 | munster/munster_000001_000019_leftImg8bit.jpg munster/munster_000001_000019_rightImg8bit.jpg 329 | munster/munster_000002_000019_leftImg8bit.jpg munster/munster_000002_000019_rightImg8bit.jpg 330 | munster/munster_000003_000019_leftImg8bit.jpg munster/munster_000003_000019_rightImg8bit.jpg 331 | munster/munster_000004_000019_leftImg8bit.jpg munster/munster_000004_000019_rightImg8bit.jpg 332 | munster/munster_000005_000019_leftImg8bit.jpg munster/munster_000005_000019_rightImg8bit.jpg 333 | munster/munster_000006_000019_leftImg8bit.jpg munster/munster_000006_000019_rightImg8bit.jpg 334 | munster/munster_000007_000019_leftImg8bit.jpg munster/munster_000007_000019_rightImg8bit.jpg 335 | munster/munster_000008_000019_leftImg8bit.jpg munster/munster_000008_000019_rightImg8bit.jpg 336 | munster/munster_000009_000019_leftImg8bit.jpg munster/munster_000009_000019_rightImg8bit.jpg 337 | munster/munster_000010_000019_leftImg8bit.jpg munster/munster_000010_000019_rightImg8bit.jpg 338 | munster/munster_000011_000019_leftImg8bit.jpg munster/munster_000011_000019_rightImg8bit.jpg 339 | munster/munster_000012_000019_leftImg8bit.jpg munster/munster_000012_000019_rightImg8bit.jpg 340 | munster/munster_000013_000019_leftImg8bit.jpg munster/munster_000013_000019_rightImg8bit.jpg 341 | munster/munster_000014_000019_leftImg8bit.jpg munster/munster_000014_000019_rightImg8bit.jpg 342 | munster/munster_000015_000019_leftImg8bit.jpg munster/munster_000015_000019_rightImg8bit.jpg 343 | munster/munster_000016_000019_leftImg8bit.jpg munster/munster_000016_000019_rightImg8bit.jpg 344 | munster/munster_000017_000019_leftImg8bit.jpg munster/munster_000017_000019_rightImg8bit.jpg 345 | munster/munster_000018_000019_leftImg8bit.jpg munster/munster_000018_000019_rightImg8bit.jpg 346 | munster/munster_000019_000019_leftImg8bit.jpg munster/munster_000019_000019_rightImg8bit.jpg 347 | munster/munster_000020_000019_leftImg8bit.jpg munster/munster_000020_000019_rightImg8bit.jpg 348 | munster/munster_000021_000019_leftImg8bit.jpg munster/munster_000021_000019_rightImg8bit.jpg 349 | munster/munster_000022_000019_leftImg8bit.jpg munster/munster_000022_000019_rightImg8bit.jpg 350 | munster/munster_000023_000019_leftImg8bit.jpg munster/munster_000023_000019_rightImg8bit.jpg 351 | munster/munster_000024_000019_leftImg8bit.jpg munster/munster_000024_000019_rightImg8bit.jpg 352 | munster/munster_000025_000019_leftImg8bit.jpg munster/munster_000025_000019_rightImg8bit.jpg 353 | munster/munster_000026_000019_leftImg8bit.jpg munster/munster_000026_000019_rightImg8bit.jpg 354 | munster/munster_000027_000019_leftImg8bit.jpg munster/munster_000027_000019_rightImg8bit.jpg 355 | munster/munster_000028_000019_leftImg8bit.jpg munster/munster_000028_000019_rightImg8bit.jpg 356 | munster/munster_000029_000019_leftImg8bit.jpg munster/munster_000029_000019_rightImg8bit.jpg 357 | munster/munster_000030_000019_leftImg8bit.jpg munster/munster_000030_000019_rightImg8bit.jpg 358 | munster/munster_000031_000019_leftImg8bit.jpg munster/munster_000031_000019_rightImg8bit.jpg 359 | munster/munster_000032_000019_leftImg8bit.jpg munster/munster_000032_000019_rightImg8bit.jpg 360 | munster/munster_000033_000019_leftImg8bit.jpg munster/munster_000033_000019_rightImg8bit.jpg 361 | munster/munster_000034_000019_leftImg8bit.jpg munster/munster_000034_000019_rightImg8bit.jpg 362 | munster/munster_000035_000019_leftImg8bit.jpg munster/munster_000035_000019_rightImg8bit.jpg 363 | munster/munster_000036_000019_leftImg8bit.jpg munster/munster_000036_000019_rightImg8bit.jpg 364 | munster/munster_000037_000019_leftImg8bit.jpg munster/munster_000037_000019_rightImg8bit.jpg 365 | munster/munster_000038_000019_leftImg8bit.jpg munster/munster_000038_000019_rightImg8bit.jpg 366 | munster/munster_000039_000019_leftImg8bit.jpg munster/munster_000039_000019_rightImg8bit.jpg 367 | munster/munster_000040_000019_leftImg8bit.jpg munster/munster_000040_000019_rightImg8bit.jpg 368 | munster/munster_000041_000019_leftImg8bit.jpg munster/munster_000041_000019_rightImg8bit.jpg 369 | munster/munster_000042_000019_leftImg8bit.jpg munster/munster_000042_000019_rightImg8bit.jpg 370 | munster/munster_000043_000019_leftImg8bit.jpg munster/munster_000043_000019_rightImg8bit.jpg 371 | munster/munster_000044_000019_leftImg8bit.jpg munster/munster_000044_000019_rightImg8bit.jpg 372 | munster/munster_000045_000019_leftImg8bit.jpg munster/munster_000045_000019_rightImg8bit.jpg 373 | munster/munster_000046_000019_leftImg8bit.jpg munster/munster_000046_000019_rightImg8bit.jpg 374 | munster/munster_000047_000019_leftImg8bit.jpg munster/munster_000047_000019_rightImg8bit.jpg 375 | munster/munster_000048_000019_leftImg8bit.jpg munster/munster_000048_000019_rightImg8bit.jpg 376 | munster/munster_000049_000019_leftImg8bit.jpg munster/munster_000049_000019_rightImg8bit.jpg 377 | munster/munster_000050_000019_leftImg8bit.jpg munster/munster_000050_000019_rightImg8bit.jpg 378 | munster/munster_000051_000019_leftImg8bit.jpg munster/munster_000051_000019_rightImg8bit.jpg 379 | munster/munster_000052_000019_leftImg8bit.jpg munster/munster_000052_000019_rightImg8bit.jpg 380 | munster/munster_000053_000019_leftImg8bit.jpg munster/munster_000053_000019_rightImg8bit.jpg 381 | munster/munster_000054_000019_leftImg8bit.jpg munster/munster_000054_000019_rightImg8bit.jpg 382 | munster/munster_000055_000019_leftImg8bit.jpg munster/munster_000055_000019_rightImg8bit.jpg 383 | munster/munster_000056_000019_leftImg8bit.jpg munster/munster_000056_000019_rightImg8bit.jpg 384 | munster/munster_000057_000019_leftImg8bit.jpg munster/munster_000057_000019_rightImg8bit.jpg 385 | munster/munster_000058_000019_leftImg8bit.jpg munster/munster_000058_000019_rightImg8bit.jpg 386 | munster/munster_000059_000019_leftImg8bit.jpg munster/munster_000059_000019_rightImg8bit.jpg 387 | munster/munster_000060_000019_leftImg8bit.jpg munster/munster_000060_000019_rightImg8bit.jpg 388 | munster/munster_000061_000019_leftImg8bit.jpg munster/munster_000061_000019_rightImg8bit.jpg 389 | munster/munster_000062_000019_leftImg8bit.jpg munster/munster_000062_000019_rightImg8bit.jpg 390 | munster/munster_000063_000019_leftImg8bit.jpg munster/munster_000063_000019_rightImg8bit.jpg 391 | munster/munster_000064_000019_leftImg8bit.jpg munster/munster_000064_000019_rightImg8bit.jpg 392 | munster/munster_000065_000019_leftImg8bit.jpg munster/munster_000065_000019_rightImg8bit.jpg 393 | munster/munster_000066_000019_leftImg8bit.jpg munster/munster_000066_000019_rightImg8bit.jpg 394 | munster/munster_000067_000019_leftImg8bit.jpg munster/munster_000067_000019_rightImg8bit.jpg 395 | munster/munster_000068_000019_leftImg8bit.jpg munster/munster_000068_000019_rightImg8bit.jpg 396 | munster/munster_000069_000019_leftImg8bit.jpg munster/munster_000069_000019_rightImg8bit.jpg 397 | munster/munster_000070_000019_leftImg8bit.jpg munster/munster_000070_000019_rightImg8bit.jpg 398 | munster/munster_000071_000019_leftImg8bit.jpg munster/munster_000071_000019_rightImg8bit.jpg 399 | munster/munster_000072_000019_leftImg8bit.jpg munster/munster_000072_000019_rightImg8bit.jpg 400 | munster/munster_000073_000019_leftImg8bit.jpg munster/munster_000073_000019_rightImg8bit.jpg 401 | munster/munster_000074_000019_leftImg8bit.jpg munster/munster_000074_000019_rightImg8bit.jpg 402 | munster/munster_000075_000019_leftImg8bit.jpg munster/munster_000075_000019_rightImg8bit.jpg 403 | munster/munster_000076_000019_leftImg8bit.jpg munster/munster_000076_000019_rightImg8bit.jpg 404 | munster/munster_000077_000019_leftImg8bit.jpg munster/munster_000077_000019_rightImg8bit.jpg 405 | munster/munster_000078_000019_leftImg8bit.jpg munster/munster_000078_000019_rightImg8bit.jpg 406 | munster/munster_000079_000019_leftImg8bit.jpg munster/munster_000079_000019_rightImg8bit.jpg 407 | munster/munster_000080_000019_leftImg8bit.jpg munster/munster_000080_000019_rightImg8bit.jpg 408 | munster/munster_000081_000019_leftImg8bit.jpg munster/munster_000081_000019_rightImg8bit.jpg 409 | munster/munster_000082_000019_leftImg8bit.jpg munster/munster_000082_000019_rightImg8bit.jpg 410 | munster/munster_000083_000019_leftImg8bit.jpg munster/munster_000083_000019_rightImg8bit.jpg 411 | munster/munster_000084_000019_leftImg8bit.jpg munster/munster_000084_000019_rightImg8bit.jpg 412 | munster/munster_000085_000019_leftImg8bit.jpg munster/munster_000085_000019_rightImg8bit.jpg 413 | munster/munster_000086_000019_leftImg8bit.jpg munster/munster_000086_000019_rightImg8bit.jpg 414 | munster/munster_000087_000019_leftImg8bit.jpg munster/munster_000087_000019_rightImg8bit.jpg 415 | munster/munster_000088_000019_leftImg8bit.jpg munster/munster_000088_000019_rightImg8bit.jpg 416 | munster/munster_000089_000019_leftImg8bit.jpg munster/munster_000089_000019_rightImg8bit.jpg 417 | munster/munster_000090_000019_leftImg8bit.jpg munster/munster_000090_000019_rightImg8bit.jpg 418 | munster/munster_000091_000019_leftImg8bit.jpg munster/munster_000091_000019_rightImg8bit.jpg 419 | munster/munster_000092_000019_leftImg8bit.jpg munster/munster_000092_000019_rightImg8bit.jpg 420 | munster/munster_000093_000019_leftImg8bit.jpg munster/munster_000093_000019_rightImg8bit.jpg 421 | munster/munster_000094_000019_leftImg8bit.jpg munster/munster_000094_000019_rightImg8bit.jpg 422 | munster/munster_000095_000019_leftImg8bit.jpg munster/munster_000095_000019_rightImg8bit.jpg 423 | munster/munster_000096_000019_leftImg8bit.jpg munster/munster_000096_000019_rightImg8bit.jpg 424 | munster/munster_000097_000019_leftImg8bit.jpg munster/munster_000097_000019_rightImg8bit.jpg 425 | munster/munster_000098_000019_leftImg8bit.jpg munster/munster_000098_000019_rightImg8bit.jpg 426 | munster/munster_000099_000019_leftImg8bit.jpg munster/munster_000099_000019_rightImg8bit.jpg 427 | munster/munster_000100_000019_leftImg8bit.jpg munster/munster_000100_000019_rightImg8bit.jpg 428 | munster/munster_000101_000019_leftImg8bit.jpg munster/munster_000101_000019_rightImg8bit.jpg 429 | munster/munster_000102_000019_leftImg8bit.jpg munster/munster_000102_000019_rightImg8bit.jpg 430 | munster/munster_000103_000019_leftImg8bit.jpg munster/munster_000103_000019_rightImg8bit.jpg 431 | munster/munster_000104_000019_leftImg8bit.jpg munster/munster_000104_000019_rightImg8bit.jpg 432 | munster/munster_000105_000019_leftImg8bit.jpg munster/munster_000105_000019_rightImg8bit.jpg 433 | munster/munster_000106_000019_leftImg8bit.jpg munster/munster_000106_000019_rightImg8bit.jpg 434 | munster/munster_000107_000019_leftImg8bit.jpg munster/munster_000107_000019_rightImg8bit.jpg 435 | munster/munster_000108_000019_leftImg8bit.jpg munster/munster_000108_000019_rightImg8bit.jpg 436 | munster/munster_000109_000019_leftImg8bit.jpg munster/munster_000109_000019_rightImg8bit.jpg 437 | munster/munster_000110_000019_leftImg8bit.jpg munster/munster_000110_000019_rightImg8bit.jpg 438 | munster/munster_000111_000019_leftImg8bit.jpg munster/munster_000111_000019_rightImg8bit.jpg 439 | munster/munster_000112_000019_leftImg8bit.jpg munster/munster_000112_000019_rightImg8bit.jpg 440 | munster/munster_000113_000019_leftImg8bit.jpg munster/munster_000113_000019_rightImg8bit.jpg 441 | munster/munster_000114_000019_leftImg8bit.jpg munster/munster_000114_000019_rightImg8bit.jpg 442 | munster/munster_000115_000019_leftImg8bit.jpg munster/munster_000115_000019_rightImg8bit.jpg 443 | munster/munster_000116_000019_leftImg8bit.jpg munster/munster_000116_000019_rightImg8bit.jpg 444 | munster/munster_000117_000019_leftImg8bit.jpg munster/munster_000117_000019_rightImg8bit.jpg 445 | munster/munster_000118_000019_leftImg8bit.jpg munster/munster_000118_000019_rightImg8bit.jpg 446 | munster/munster_000119_000019_leftImg8bit.jpg munster/munster_000119_000019_rightImg8bit.jpg 447 | munster/munster_000120_000019_leftImg8bit.jpg munster/munster_000120_000019_rightImg8bit.jpg 448 | munster/munster_000121_000019_leftImg8bit.jpg munster/munster_000121_000019_rightImg8bit.jpg 449 | munster/munster_000122_000019_leftImg8bit.jpg munster/munster_000122_000019_rightImg8bit.jpg 450 | munster/munster_000123_000019_leftImg8bit.jpg munster/munster_000123_000019_rightImg8bit.jpg 451 | munster/munster_000124_000019_leftImg8bit.jpg munster/munster_000124_000019_rightImg8bit.jpg 452 | munster/munster_000125_000019_leftImg8bit.jpg munster/munster_000125_000019_rightImg8bit.jpg 453 | munster/munster_000126_000019_leftImg8bit.jpg munster/munster_000126_000019_rightImg8bit.jpg 454 | munster/munster_000127_000019_leftImg8bit.jpg munster/munster_000127_000019_rightImg8bit.jpg 455 | munster/munster_000128_000019_leftImg8bit.jpg munster/munster_000128_000019_rightImg8bit.jpg 456 | munster/munster_000129_000019_leftImg8bit.jpg munster/munster_000129_000019_rightImg8bit.jpg 457 | munster/munster_000130_000019_leftImg8bit.jpg munster/munster_000130_000019_rightImg8bit.jpg 458 | munster/munster_000131_000019_leftImg8bit.jpg munster/munster_000131_000019_rightImg8bit.jpg 459 | munster/munster_000132_000019_leftImg8bit.jpg munster/munster_000132_000019_rightImg8bit.jpg 460 | munster/munster_000133_000019_leftImg8bit.jpg munster/munster_000133_000019_rightImg8bit.jpg 461 | munster/munster_000134_000019_leftImg8bit.jpg munster/munster_000134_000019_rightImg8bit.jpg 462 | munster/munster_000135_000019_leftImg8bit.jpg munster/munster_000135_000019_rightImg8bit.jpg 463 | munster/munster_000136_000019_leftImg8bit.jpg munster/munster_000136_000019_rightImg8bit.jpg 464 | munster/munster_000137_000019_leftImg8bit.jpg munster/munster_000137_000019_rightImg8bit.jpg 465 | munster/munster_000138_000019_leftImg8bit.jpg munster/munster_000138_000019_rightImg8bit.jpg 466 | munster/munster_000139_000019_leftImg8bit.jpg munster/munster_000139_000019_rightImg8bit.jpg 467 | munster/munster_000140_000019_leftImg8bit.jpg munster/munster_000140_000019_rightImg8bit.jpg 468 | munster/munster_000141_000019_leftImg8bit.jpg munster/munster_000141_000019_rightImg8bit.jpg 469 | munster/munster_000142_000019_leftImg8bit.jpg munster/munster_000142_000019_rightImg8bit.jpg 470 | munster/munster_000143_000019_leftImg8bit.jpg munster/munster_000143_000019_rightImg8bit.jpg 471 | munster/munster_000144_000019_leftImg8bit.jpg munster/munster_000144_000019_rightImg8bit.jpg 472 | munster/munster_000145_000019_leftImg8bit.jpg munster/munster_000145_000019_rightImg8bit.jpg 473 | munster/munster_000146_000019_leftImg8bit.jpg munster/munster_000146_000019_rightImg8bit.jpg 474 | munster/munster_000147_000019_leftImg8bit.jpg munster/munster_000147_000019_rightImg8bit.jpg 475 | munster/munster_000148_000019_leftImg8bit.jpg munster/munster_000148_000019_rightImg8bit.jpg 476 | munster/munster_000149_000019_leftImg8bit.jpg munster/munster_000149_000019_rightImg8bit.jpg 477 | munster/munster_000150_000019_leftImg8bit.jpg munster/munster_000150_000019_rightImg8bit.jpg 478 | munster/munster_000151_000019_leftImg8bit.jpg munster/munster_000151_000019_rightImg8bit.jpg 479 | munster/munster_000152_000019_leftImg8bit.jpg munster/munster_000152_000019_rightImg8bit.jpg 480 | munster/munster_000153_000019_leftImg8bit.jpg munster/munster_000153_000019_rightImg8bit.jpg 481 | munster/munster_000154_000019_leftImg8bit.jpg munster/munster_000154_000019_rightImg8bit.jpg 482 | munster/munster_000155_000019_leftImg8bit.jpg munster/munster_000155_000019_rightImg8bit.jpg 483 | munster/munster_000156_000019_leftImg8bit.jpg munster/munster_000156_000019_rightImg8bit.jpg 484 | munster/munster_000157_000019_leftImg8bit.jpg munster/munster_000157_000019_rightImg8bit.jpg 485 | munster/munster_000158_000019_leftImg8bit.jpg munster/munster_000158_000019_rightImg8bit.jpg 486 | munster/munster_000159_000019_leftImg8bit.jpg munster/munster_000159_000019_rightImg8bit.jpg 487 | munster/munster_000160_000019_leftImg8bit.jpg munster/munster_000160_000019_rightImg8bit.jpg 488 | munster/munster_000161_000019_leftImg8bit.jpg munster/munster_000161_000019_rightImg8bit.jpg 489 | munster/munster_000162_000019_leftImg8bit.jpg munster/munster_000162_000019_rightImg8bit.jpg 490 | munster/munster_000163_000019_leftImg8bit.jpg munster/munster_000163_000019_rightImg8bit.jpg 491 | munster/munster_000164_000019_leftImg8bit.jpg munster/munster_000164_000019_rightImg8bit.jpg 492 | munster/munster_000165_000019_leftImg8bit.jpg munster/munster_000165_000019_rightImg8bit.jpg 493 | munster/munster_000166_000019_leftImg8bit.jpg munster/munster_000166_000019_rightImg8bit.jpg 494 | munster/munster_000167_000019_leftImg8bit.jpg munster/munster_000167_000019_rightImg8bit.jpg 495 | munster/munster_000168_000019_leftImg8bit.jpg munster/munster_000168_000019_rightImg8bit.jpg 496 | munster/munster_000169_000019_leftImg8bit.jpg munster/munster_000169_000019_rightImg8bit.jpg 497 | munster/munster_000170_000019_leftImg8bit.jpg munster/munster_000170_000019_rightImg8bit.jpg 498 | munster/munster_000171_000019_leftImg8bit.jpg munster/munster_000171_000019_rightImg8bit.jpg 499 | munster/munster_000172_000019_leftImg8bit.jpg munster/munster_000172_000019_rightImg8bit.jpg 500 | munster/munster_000173_000019_leftImg8bit.jpg munster/munster_000173_000019_rightImg8bit.jpg 501 | --------------------------------------------------------------------------------