├── 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 |
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 |
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 | [](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 |
--------------------------------------------------------------------------------