├── README.md ├── data_loader.py ├── eigen_test_files.txt ├── eigen_train_files.txt ├── eigen_val_files.txt ├── get_dataset.sh ├── get_depth_maps.sh ├── imgs ├── train_image_24.jpg └── train_image_28.jpg ├── model.py ├── nyu_dataloader.py ├── nyu_loader.py ├── nyu_train.py ├── prepare_data.py ├── train.py ├── train_dorn.py ├── train_patchgan.py ├── train_unet.py └── unet.py /README.md: -------------------------------------------------------------------------------- 1 | # Refining Monocular Depth Estimation using PatchGAN Priors 2 | Learning Depth for Autonomous driving from Monocular Images 3 | 4 | ## Network 5 | The repo presents an approach to refine monocular depth estimates by incorporating a patch discriminator.
6 | 7 | To train, please run 8 | ``` 9 | python train.py [args] 10 | ``` 11 | 12 | # Results 13 | The final results for KITTI are still pending. For the NYU dataset, it achieves a MSE of 0.03 and L1 Loss of 0.08. 14 | 15 | Here are a few snapshots 16 | 17 | ![Sample Image 1](imgs/train_image_28.jpg "NYU sample results") 18 | ![Sample Image 2](imgs/train_image_24.jpg "NYU sample results") 19 | -------------------------------------------------------------------------------- /data_loader.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import os 3 | import glob 4 | # import cv2 5 | import torch 6 | from PIL import Image 7 | from skimage.util import img_as_float 8 | from skimage.transform import resize 9 | 10 | class DataLoader(): 11 | ''' 12 | raw_data_dir = dir containing extracted raw KITTI data (folder containing 2011-09-26 etc.) 13 | depth_maps_dir = dir containing extracted depth maps 14 | ''' 15 | 16 | def __init__(self, raw_images_path, depth_images_path, mode="train"): 17 | 18 | self.mode = mode 19 | 20 | if self.mode == "train": 21 | with open('eigen_train_files.txt', 'r') as f: 22 | self.files = f.readlines() 23 | elif self.mode == "test": 24 | with open('eigen_test_files.txt', 'r') as f: 25 | self.files = f.readlines() 26 | elif self.mode == "val": 27 | with open('eigen_val_files.txt', 'r') as f: 28 | self.files = f.readlines() 29 | 30 | self.data = [] 31 | for l in self.files: 32 | s = l.split() 33 | for im in s: 34 | self.data.append(raw_images_path + im) 35 | 36 | self.imgs, self.labels = [], [] 37 | 38 | for img_name in self.data: 39 | img_name = img_name.split('.')[0] + '.png' 40 | tokens = img_name.split('/') 41 | path = depth_images_path + 'train/' + tokens[-4] + '/proj_depth/groundtruth/' + tokens[-3] + '/' + tokens[-1] 42 | path = path.split('.')[0] + '.png' 43 | if os.path.exists(path) and os.path.exists(img_name): 44 | self.imgs.append(img_name) 45 | self.labels.append(path) 46 | 47 | print('Found %d Images %d'%(len(self.imgs), len(self.labels))) 48 | 49 | def __len__(self): 50 | return len(self.imgs) 51 | 52 | def load_data(self, img_file, label_file): 53 | x = Image.open(img_file) 54 | y = Image.open(label_file) 55 | x = np.array(x).astype(np.float32) 56 | y = np.array(y).astype(np.float32) 57 | x = resize(x, (90, 270), anti_aliasing=True) 58 | y = resize(y, (90, 270), anti_aliasing=True) 59 | x = x / 255.0 60 | y[y<1] = y 61 | y = np.log(y) 62 | y = y / np.max(y) 63 | return x, y 64 | 65 | def get_one_batch(self, batch_size = 64): 66 | images = [] 67 | labels = [] 68 | 69 | while True: 70 | idx = np.random.choice(len(self.imgs), batch_size) 71 | for i in idx: 72 | x, y = self.load_data(self.imgs[i], self.labels[i]) 73 | images.append(x) 74 | labels.append(y) 75 | yield torch.from_numpy(np.array(images)).permute(0,3,1,2), torch.from_numpy(np.array(labels)).permute(0,3,1,2) 76 | -------------------------------------------------------------------------------- /eigen_test_files.txt: -------------------------------------------------------------------------------- 1 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000069.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000069.jpg 2 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000054.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000054.jpg 3 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000042.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000042.jpg 4 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000057.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000057.jpg 5 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000030.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000030.jpg 6 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000027.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000027.jpg 7 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000012.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000012.jpg 8 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000075.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000075.jpg 9 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000036.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000036.jpg 10 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000033.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000033.jpg 11 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000015.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000015.jpg 12 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000072.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000072.jpg 13 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000003.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000003.jpg 14 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000039.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000039.jpg 15 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000009.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000009.jpg 16 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000051.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000051.jpg 17 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000060.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000060.jpg 18 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000021.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000021.jpg 19 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000000.jpg 20 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000024.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000024.jpg 21 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000045.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000045.jpg 22 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000018.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000018.jpg 23 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000048.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000048.jpg 24 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000006.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000006.jpg 25 | 2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000063.jpg 2011_09_26/2011_09_26_drive_0002_sync/image_03/data/0000000063.jpg 26 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000000.jpg 27 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000016.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000016.jpg 28 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000032.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000032.jpg 29 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000048.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000048.jpg 30 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000064.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000064.jpg 31 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000080.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000080.jpg 32 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000096.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000096.jpg 33 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000112.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000112.jpg 34 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000128.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000128.jpg 35 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000144.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000144.jpg 36 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000160.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000160.jpg 37 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000176.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000176.jpg 38 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000196.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000196.jpg 39 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000212.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000212.jpg 40 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000228.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000228.jpg 41 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000244.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000244.jpg 42 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000260.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000260.jpg 43 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000276.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000276.jpg 44 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000292.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000292.jpg 45 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000308.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000308.jpg 46 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000324.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000324.jpg 47 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000340.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000340.jpg 48 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000356.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000356.jpg 49 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000372.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000372.jpg 50 | 2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000388.jpg 2011_09_26/2011_09_26_drive_0009_sync/image_03/data/0000000388.jpg 51 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000090.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000090.jpg 52 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000050.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000050.jpg 53 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000110.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000110.jpg 54 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000115.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000115.jpg 55 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000060.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000060.jpg 56 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000105.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000105.jpg 57 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000125.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000125.jpg 58 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000020.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000020.jpg 59 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000140.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000140.jpg 60 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000085.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000085.jpg 61 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000070.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000070.jpg 62 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000080.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000080.jpg 63 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000065.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000065.jpg 64 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000095.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000095.jpg 65 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000130.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000130.jpg 66 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000100.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000100.jpg 67 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000010.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000010.jpg 68 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000030.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000030.jpg 69 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000000.jpg 70 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000135.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000135.jpg 71 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000040.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000040.jpg 72 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000005.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000005.jpg 73 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000120.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000120.jpg 74 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000045.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000045.jpg 75 | 2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000035.jpg 2011_09_26/2011_09_26_drive_0013_sync/image_03/data/0000000035.jpg 76 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000003.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000003.jpg 77 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000069.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000069.jpg 78 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000057.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000057.jpg 79 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000012.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000012.jpg 80 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000072.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000072.jpg 81 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000018.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000018.jpg 82 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000063.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000063.jpg 83 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000000.jpg 84 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000084.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000084.jpg 85 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000015.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000015.jpg 86 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000066.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000066.jpg 87 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000006.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000006.jpg 88 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000048.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000048.jpg 89 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000060.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000060.jpg 90 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000009.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000009.jpg 91 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000033.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000033.jpg 92 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000021.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000021.jpg 93 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000075.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000075.jpg 94 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000027.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000027.jpg 95 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000045.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000045.jpg 96 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000078.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000078.jpg 97 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000036.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000036.jpg 98 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000051.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000051.jpg 99 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000054.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000054.jpg 100 | 2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000042.jpg 2011_09_26/2011_09_26_drive_0020_sync/image_03/data/0000000042.jpg 101 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000018.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000018.jpg 102 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000090.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000090.jpg 103 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000126.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000126.jpg 104 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000378.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000378.jpg 105 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000036.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000036.jpg 106 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000288.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000288.jpg 107 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000198.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000198.jpg 108 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000450.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000450.jpg 109 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000144.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000144.jpg 110 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000072.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000072.jpg 111 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000252.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000252.jpg 112 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000180.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000180.jpg 113 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000432.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000432.jpg 114 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000396.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000396.jpg 115 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000054.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000054.jpg 116 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000468.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000468.jpg 117 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000306.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000306.jpg 118 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000108.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000108.jpg 119 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000162.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000162.jpg 120 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000342.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000342.jpg 121 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000270.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000270.jpg 122 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000414.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000414.jpg 123 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000216.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000216.jpg 124 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000360.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000360.jpg 125 | 2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000324.jpg 2011_09_26/2011_09_26_drive_0023_sync/image_03/data/0000000324.jpg 126 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000077.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000077.jpg 127 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000035.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000035.jpg 128 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000091.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000091.jpg 129 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000112.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000112.jpg 130 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000007.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000007.jpg 131 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000175.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000175.jpg 132 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000042.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000042.jpg 133 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000098.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000098.jpg 134 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000133.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000133.jpg 135 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000161.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000161.jpg 136 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000014.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000014.jpg 137 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000126.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000126.jpg 138 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000168.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000168.jpg 139 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000070.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000070.jpg 140 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000084.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000084.jpg 141 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000140.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000140.jpg 142 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000049.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000049.jpg 143 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000000.jpg 144 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000182.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000182.jpg 145 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000147.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000147.jpg 146 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000056.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000056.jpg 147 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000063.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000063.jpg 148 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000021.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000021.jpg 149 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000119.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000119.jpg 150 | 2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000028.jpg 2011_09_26/2011_09_26_drive_0027_sync/image_03/data/0000000028.jpg 151 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000380.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000380.jpg 152 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000394.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000394.jpg 153 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000324.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000324.jpg 154 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000000.jpg 155 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000268.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000268.jpg 156 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000366.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000366.jpg 157 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000296.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000296.jpg 158 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000014.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000014.jpg 159 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000028.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000028.jpg 160 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000182.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000182.jpg 161 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000168.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000168.jpg 162 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000196.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000196.jpg 163 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000140.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000140.jpg 164 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000084.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000084.jpg 165 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000056.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000056.jpg 166 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000112.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000112.jpg 167 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000352.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000352.jpg 168 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000126.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000126.jpg 169 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000070.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000070.jpg 170 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000310.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000310.jpg 171 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000154.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000154.jpg 172 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000098.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000098.jpg 173 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000408.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000408.jpg 174 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000042.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000042.jpg 175 | 2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000338.jpg 2011_09_26/2011_09_26_drive_0029_sync/image_03/data/0000000338.jpg 176 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000000.jpg 177 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000128.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000128.jpg 178 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000192.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000192.jpg 179 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000032.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000032.jpg 180 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000352.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000352.jpg 181 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000608.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000608.jpg 182 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000224.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000224.jpg 183 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000576.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000576.jpg 184 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000672.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000672.jpg 185 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000064.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000064.jpg 186 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000448.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000448.jpg 187 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000704.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000704.jpg 188 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000640.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000640.jpg 189 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000512.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000512.jpg 190 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000768.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000768.jpg 191 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000160.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000160.jpg 192 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000416.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000416.jpg 193 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000480.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000480.jpg 194 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000800.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000800.jpg 195 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000288.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000288.jpg 196 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000544.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000544.jpg 197 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000096.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000096.jpg 198 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000384.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000384.jpg 199 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000256.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000256.jpg 200 | 2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000320.jpg 2011_09_26/2011_09_26_drive_0036_sync/image_03/data/0000000320.jpg 201 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000000.jpg 202 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000005.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000005.jpg 203 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000010.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000010.jpg 204 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000015.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000015.jpg 205 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000020.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000020.jpg 206 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000025.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000025.jpg 207 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000030.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000030.jpg 208 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000035.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000035.jpg 209 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000040.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000040.jpg 210 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000045.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000045.jpg 211 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000050.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000050.jpg 212 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000055.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000055.jpg 213 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000060.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000060.jpg 214 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000065.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000065.jpg 215 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000070.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000070.jpg 216 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000075.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000075.jpg 217 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000080.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000080.jpg 218 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000085.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000085.jpg 219 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000090.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000090.jpg 220 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000095.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000095.jpg 221 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000100.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000100.jpg 222 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000105.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000105.jpg 223 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000110.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000110.jpg 224 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000115.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000115.jpg 225 | 2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000120.jpg 2011_09_26/2011_09_26_drive_0046_sync/image_03/data/0000000120.jpg 226 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000000.jpg 227 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000001.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000001.jpg 228 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000002.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000002.jpg 229 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000003.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000003.jpg 230 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000004.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000004.jpg 231 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000005.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000005.jpg 232 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000006.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000006.jpg 233 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000007.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000007.jpg 234 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000008.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000008.jpg 235 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000009.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000009.jpg 236 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000010.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000010.jpg 237 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000011.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000011.jpg 238 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000012.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000012.jpg 239 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000013.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000013.jpg 240 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000014.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000014.jpg 241 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000015.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000015.jpg 242 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000016.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000016.jpg 243 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000017.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000017.jpg 244 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000018.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000018.jpg 245 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000019.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000019.jpg 246 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000020.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000020.jpg 247 | 2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000021.jpg 2011_09_26/2011_09_26_drive_0048_sync/image_03/data/0000000021.jpg 248 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000046.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000046.jpg 249 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000014.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000014.jpg 250 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000036.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000036.jpg 251 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000028.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000028.jpg 252 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000026.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000026.jpg 253 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000050.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000050.jpg 254 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000040.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000040.jpg 255 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000008.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000008.jpg 256 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000016.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000016.jpg 257 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000044.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000044.jpg 258 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000018.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000018.jpg 259 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000032.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000032.jpg 260 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000042.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000042.jpg 261 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000010.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000010.jpg 262 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000020.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000020.jpg 263 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000048.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000048.jpg 264 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000052.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000052.jpg 265 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000006.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000006.jpg 266 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000030.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000030.jpg 267 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000012.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000012.jpg 268 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000038.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000038.jpg 269 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000000.jpg 270 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000002.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000002.jpg 271 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000004.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000004.jpg 272 | 2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000022.jpg 2011_09_26/2011_09_26_drive_0052_sync/image_03/data/0000000022.jpg 273 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000011.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000011.jpg 274 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000033.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000033.jpg 275 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000242.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000242.jpg 276 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000253.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000253.jpg 277 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000286.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000286.jpg 278 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000154.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000154.jpg 279 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000099.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000099.jpg 280 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000220.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000220.jpg 281 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000022.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000022.jpg 282 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000077.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000077.jpg 283 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000187.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000187.jpg 284 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000143.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000143.jpg 285 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000066.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000066.jpg 286 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000176.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000176.jpg 287 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000110.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000110.jpg 288 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000275.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000275.jpg 289 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000264.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000264.jpg 290 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000198.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000198.jpg 291 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000055.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000055.jpg 292 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000088.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000088.jpg 293 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000121.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000121.jpg 294 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000209.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000209.jpg 295 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000165.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000165.jpg 296 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000231.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000231.jpg 297 | 2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000044.jpg 2011_09_26/2011_09_26_drive_0056_sync/image_03/data/0000000044.jpg 298 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000056.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000056.jpg 299 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000000.jpg 300 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000344.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000344.jpg 301 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000358.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000358.jpg 302 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000316.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000316.jpg 303 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000238.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000238.jpg 304 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000098.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000098.jpg 305 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000112.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000112.jpg 306 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000028.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000028.jpg 307 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000014.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000014.jpg 308 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000330.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000330.jpg 309 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000154.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000154.jpg 310 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000042.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000042.jpg 311 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000302.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000302.jpg 312 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000182.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000182.jpg 313 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000288.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000288.jpg 314 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000140.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000140.jpg 315 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000274.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000274.jpg 316 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000224.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000224.jpg 317 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000372.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000372.jpg 318 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000196.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000196.jpg 319 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000126.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000126.jpg 320 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000084.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000084.jpg 321 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000210.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000210.jpg 322 | 2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000070.jpg 2011_09_26/2011_09_26_drive_0059_sync/image_03/data/0000000070.jpg 323 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000528.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000528.jpg 324 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000308.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000308.jpg 325 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000044.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000044.jpg 326 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000352.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000352.jpg 327 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000066.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000066.jpg 328 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000000.jpg 329 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000506.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000506.jpg 330 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000176.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000176.jpg 331 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000022.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000022.jpg 332 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000242.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000242.jpg 333 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000462.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000462.jpg 334 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000418.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000418.jpg 335 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000110.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000110.jpg 336 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000440.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000440.jpg 337 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000396.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000396.jpg 338 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000154.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000154.jpg 339 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000374.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000374.jpg 340 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000088.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000088.jpg 341 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000286.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000286.jpg 342 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000550.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000550.jpg 343 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000264.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000264.jpg 344 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000220.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000220.jpg 345 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000330.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000330.jpg 346 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000484.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000484.jpg 347 | 2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000198.jpg 2011_09_26/2011_09_26_drive_0064_sync/image_03/data/0000000198.jpg 348 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000283.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000283.jpg 349 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000361.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000361.jpg 350 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000270.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000270.jpg 351 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000127.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000127.jpg 352 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000205.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000205.jpg 353 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000218.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000218.jpg 354 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000153.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000153.jpg 355 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000335.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000335.jpg 356 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000192.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000192.jpg 357 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000348.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000348.jpg 358 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000101.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000101.jpg 359 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000049.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000049.jpg 360 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000179.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000179.jpg 361 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000140.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000140.jpg 362 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000374.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000374.jpg 363 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000322.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000322.jpg 364 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000309.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000309.jpg 365 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000244.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000244.jpg 366 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000062.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000062.jpg 367 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000257.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000257.jpg 368 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000088.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000088.jpg 369 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000114.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000114.jpg 370 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000075.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000075.jpg 371 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000296.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000296.jpg 372 | 2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000231.jpg 2011_09_26/2011_09_26_drive_0084_sync/image_03/data/0000000231.jpg 373 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000007.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000007.jpg 374 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000196.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000196.jpg 375 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000439.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000439.jpg 376 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000169.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000169.jpg 377 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000115.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000115.jpg 378 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000034.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000034.jpg 379 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000304.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000304.jpg 380 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000331.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000331.jpg 381 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000277.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000277.jpg 382 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000520.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000520.jpg 383 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000682.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000682.jpg 384 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000628.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000628.jpg 385 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000088.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000088.jpg 386 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000601.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000601.jpg 387 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000574.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000574.jpg 388 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000223.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000223.jpg 389 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000655.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000655.jpg 390 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000358.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000358.jpg 391 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000412.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000412.jpg 392 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000142.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000142.jpg 393 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000385.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000385.jpg 394 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000061.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000061.jpg 395 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000493.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000493.jpg 396 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000466.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000466.jpg 397 | 2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000250.jpg 2011_09_26/2011_09_26_drive_0086_sync/image_03/data/0000000250.jpg 398 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000000.jpg 399 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000016.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000016.jpg 400 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000032.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000032.jpg 401 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000048.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000048.jpg 402 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000064.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000064.jpg 403 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000080.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000080.jpg 404 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000096.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000096.jpg 405 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000112.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000112.jpg 406 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000128.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000128.jpg 407 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000144.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000144.jpg 408 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000160.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000160.jpg 409 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000176.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000176.jpg 410 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000192.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000192.jpg 411 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000208.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000208.jpg 412 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000224.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000224.jpg 413 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000240.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000240.jpg 414 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000256.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000256.jpg 415 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000305.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000305.jpg 416 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000321.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000321.jpg 417 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000337.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000337.jpg 418 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000353.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000353.jpg 419 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000369.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000369.jpg 420 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000385.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000385.jpg 421 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000401.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000401.jpg 422 | 2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000417.jpg 2011_09_26/2011_09_26_drive_0093_sync/image_03/data/0000000417.jpg 423 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000000.jpg 424 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000019.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000019.jpg 425 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000038.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000038.jpg 426 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000057.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000057.jpg 427 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000076.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000076.jpg 428 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000095.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000095.jpg 429 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000114.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000114.jpg 430 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000133.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000133.jpg 431 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000152.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000152.jpg 432 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000171.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000171.jpg 433 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000190.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000190.jpg 434 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000209.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000209.jpg 435 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000228.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000228.jpg 436 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000247.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000247.jpg 437 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000266.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000266.jpg 438 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000285.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000285.jpg 439 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000304.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000304.jpg 440 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000323.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000323.jpg 441 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000342.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000342.jpg 442 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000361.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000361.jpg 443 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000380.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000380.jpg 444 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000399.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000399.jpg 445 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000418.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000418.jpg 446 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000437.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000437.jpg 447 | 2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000456.jpg 2011_09_26/2011_09_26_drive_0096_sync/image_03/data/0000000456.jpg 448 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000692.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000692.jpg 449 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000930.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000930.jpg 450 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000760.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000760.jpg 451 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000896.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000896.jpg 452 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000284.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000284.jpg 453 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000148.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000148.jpg 454 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000522.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000522.jpg 455 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000794.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000794.jpg 456 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000624.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000624.jpg 457 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000726.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000726.jpg 458 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000216.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000216.jpg 459 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000318.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000318.jpg 460 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000488.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000488.jpg 461 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000590.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000590.jpg 462 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000454.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000454.jpg 463 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000862.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000862.jpg 464 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000386.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000386.jpg 465 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000352.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000352.jpg 466 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000420.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000420.jpg 467 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000658.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000658.jpg 468 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000828.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000828.jpg 469 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000556.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000556.jpg 470 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000114.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000114.jpg 471 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000182.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000182.jpg 472 | 2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000080.jpg 2011_09_26/2011_09_26_drive_0101_sync/image_03/data/0000000080.jpg 473 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000015.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000015.jpg 474 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000035.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000035.jpg 475 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000043.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000043.jpg 476 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000051.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000051.jpg 477 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000059.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000059.jpg 478 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000067.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000067.jpg 479 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000075.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000075.jpg 480 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000083.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000083.jpg 481 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000091.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000091.jpg 482 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000099.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000099.jpg 483 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000107.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000107.jpg 484 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000115.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000115.jpg 485 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000123.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000123.jpg 486 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000131.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000131.jpg 487 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000139.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000139.jpg 488 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000147.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000147.jpg 489 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000155.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000155.jpg 490 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000163.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000163.jpg 491 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000171.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000171.jpg 492 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000179.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000179.jpg 493 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000187.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000187.jpg 494 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000195.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000195.jpg 495 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000203.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000203.jpg 496 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000211.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000211.jpg 497 | 2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000219.jpg 2011_09_26/2011_09_26_drive_0106_sync/image_03/data/0000000219.jpg 498 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000312.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000312.jpg 499 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000494.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000494.jpg 500 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000104.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000104.jpg 501 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000130.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000130.jpg 502 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000156.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000156.jpg 503 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000182.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000182.jpg 504 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000598.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000598.jpg 505 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000416.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000416.jpg 506 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000364.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000364.jpg 507 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000026.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000026.jpg 508 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000078.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000078.jpg 509 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000572.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000572.jpg 510 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000468.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000468.jpg 511 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000260.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000260.jpg 512 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000624.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000624.jpg 513 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000234.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000234.jpg 514 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000442.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000442.jpg 515 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000390.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000390.jpg 516 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000546.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000546.jpg 517 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000286.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000286.jpg 518 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000000.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000000.jpg 519 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000338.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000338.jpg 520 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000208.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000208.jpg 521 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000650.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000650.jpg 522 | 2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000052.jpg 2011_09_26/2011_09_26_drive_0117_sync/image_03/data/0000000052.jpg 523 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000024.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000024.jpg 524 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000021.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000021.jpg 525 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000036.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000036.jpg 526 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000000.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000000.jpg 527 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000051.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000051.jpg 528 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000018.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000018.jpg 529 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000033.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000033.jpg 530 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000090.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000090.jpg 531 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000045.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000045.jpg 532 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000054.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000054.jpg 533 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000012.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000012.jpg 534 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000039.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000039.jpg 535 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000009.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000009.jpg 536 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000003.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000003.jpg 537 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000030.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000030.jpg 538 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000078.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000078.jpg 539 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000060.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000060.jpg 540 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000048.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000048.jpg 541 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000084.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000084.jpg 542 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000081.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000081.jpg 543 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000006.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000006.jpg 544 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000057.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000057.jpg 545 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000072.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000072.jpg 546 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000087.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000087.jpg 547 | 2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000063.jpg 2011_09_28/2011_09_28_drive_0002_sync/image_03/data/0000000063.jpg 548 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000252.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000252.jpg 549 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000540.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000540.jpg 550 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000001054.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000001054.jpg 551 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000036.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000036.jpg 552 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000360.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000360.jpg 553 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000807.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000807.jpg 554 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000879.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000879.jpg 555 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000288.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000288.jpg 556 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000771.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000771.jpg 557 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000000.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000000.jpg 558 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000216.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000216.jpg 559 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000951.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000951.jpg 560 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000324.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000324.jpg 561 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000432.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000432.jpg 562 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000504.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000504.jpg 563 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000576.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000576.jpg 564 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000108.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000108.jpg 565 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000180.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000180.jpg 566 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000072.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000072.jpg 567 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000612.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000612.jpg 568 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000915.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000915.jpg 569 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000735.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000735.jpg 570 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000144.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000144.jpg 571 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000396.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000396.jpg 572 | 2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000468.jpg 2011_09_29/2011_09_29_drive_0071_sync/image_03/data/0000000468.jpg 573 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000132.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000132.jpg 574 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000011.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000011.jpg 575 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000154.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000154.jpg 576 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000022.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000022.jpg 577 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000242.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000242.jpg 578 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000198.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000198.jpg 579 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000176.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000176.jpg 580 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000231.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000231.jpg 581 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000275.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000275.jpg 582 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000220.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000220.jpg 583 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000088.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000088.jpg 584 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000143.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000143.jpg 585 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000055.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000055.jpg 586 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000033.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000033.jpg 587 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000187.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000187.jpg 588 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000110.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000110.jpg 589 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000044.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000044.jpg 590 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000077.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000077.jpg 591 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000066.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000066.jpg 592 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000000.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000000.jpg 593 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000165.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000165.jpg 594 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000264.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000264.jpg 595 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000253.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000253.jpg 596 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000209.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000209.jpg 597 | 2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000121.jpg 2011_09_30/2011_09_30_drive_0016_sync/image_03/data/0000000121.jpg 598 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000107.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000107.jpg 599 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002247.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002247.jpg 600 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001391.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001391.jpg 601 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000535.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000535.jpg 602 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001819.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001819.jpg 603 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001177.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001177.jpg 604 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000428.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000428.jpg 605 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001926.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001926.jpg 606 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000749.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000749.jpg 607 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001284.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001284.jpg 608 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002140.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002140.jpg 609 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001605.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001605.jpg 610 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001498.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001498.jpg 611 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000642.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000642.jpg 612 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002740.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002740.jpg 613 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002419.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002419.jpg 614 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000856.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000856.jpg 615 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002526.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002526.jpg 616 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001712.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001712.jpg 617 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001070.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000001070.jpg 618 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000000.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000000.jpg 619 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002033.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002033.jpg 620 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000214.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000214.jpg 621 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000963.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000000963.jpg 622 | 2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002633.jpg 2011_09_30/2011_09_30_drive_0018_sync/image_03/data/0000002633.jpg 623 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000533.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000533.jpg 624 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000001040.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000001040.jpg 625 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000082.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000082.jpg 626 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000205.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000205.jpg 627 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000835.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000835.jpg 628 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000451.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000451.jpg 629 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000164.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000164.jpg 630 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000794.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000794.jpg 631 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000328.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000328.jpg 632 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000615.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000615.jpg 633 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000917.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000917.jpg 634 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000369.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000369.jpg 635 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000287.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000287.jpg 636 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000123.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000123.jpg 637 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000876.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000876.jpg 638 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000410.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000410.jpg 639 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000492.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000492.jpg 640 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000958.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000958.jpg 641 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000656.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000656.jpg 642 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000000.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000000.jpg 643 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000753.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000753.jpg 644 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000574.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000574.jpg 645 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000001081.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000001081.jpg 646 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000041.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000041.jpg 647 | 2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000246.jpg 2011_09_30/2011_09_30_drive_0027_sync/image_03/data/0000000246.jpg 648 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002906.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000002906.jpg 649 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002544.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000002544.jpg 650 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000362.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000000362.jpg 651 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000004535.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000004535.jpg 652 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000734.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000000734.jpg 653 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001096.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000001096.jpg 654 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000004173.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000004173.jpg 655 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000543.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000000543.jpg 656 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001277.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000001277.jpg 657 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000004354.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000004354.jpg 658 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001458.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000001458.jpg 659 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001820.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000001820.jpg 660 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003449.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000003449.jpg 661 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003268.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000003268.jpg 662 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000915.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000000915.jpg 663 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002363.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000002363.jpg 664 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002725.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000002725.jpg 665 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000181.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000000181.jpg 666 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001639.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000001639.jpg 667 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003992.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000003992.jpg 668 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003087.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000003087.jpg 669 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002001.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000002001.jpg 670 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003811.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000003811.jpg 671 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003630.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000003630.jpg 672 | 2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000000.jpg 2011_10_03/2011_10_03_drive_0027_sync/image_03/data/0000000000.jpg 673 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000096.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000096.jpg 674 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000800.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000800.jpg 675 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000320.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000320.jpg 676 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000576.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000576.jpg 677 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000000.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000000.jpg 678 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000480.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000480.jpg 679 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000640.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000640.jpg 680 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000032.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000032.jpg 681 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000384.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000384.jpg 682 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000160.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000160.jpg 683 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000704.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000704.jpg 684 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000736.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000736.jpg 685 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000672.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000672.jpg 686 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000064.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000064.jpg 687 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000288.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000288.jpg 688 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000352.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000352.jpg 689 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000512.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000512.jpg 690 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000544.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000544.jpg 691 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000608.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000608.jpg 692 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000128.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000128.jpg 693 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000224.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000224.jpg 694 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000416.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000416.jpg 695 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000192.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000192.jpg 696 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000448.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000448.jpg 697 | 2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000768.jpg 2011_10_03/2011_10_03_drive_0047_sync/image_03/data/0000000768.jpg 698 | -------------------------------------------------------------------------------- /get_dataset.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | files=( 4 | 2011_09_26_calib.zip 5 | 2011_09_26_drive_0001 6 | 2011_09_26_drive_0002 7 | 2011_09_26_drive_0005 8 | 2011_09_26_drive_0009 9 | 2011_09_26_drive_0011 10 | 2011_09_26_drive_0013 11 | 2011_09_26_drive_0014 12 | 2011_09_26_drive_0015 13 | 2011_09_26_drive_0017 14 | 2011_09_26_drive_0018 15 | 2011_09_26_drive_0019 16 | 2011_09_26_drive_0020 17 | 2011_09_26_drive_0022 18 | 2011_09_26_drive_0023 19 | 2011_09_26_drive_0027 20 | 2011_09_26_drive_0028 21 | 2011_09_26_drive_0029 22 | 2011_09_26_drive_0032 23 | 2011_09_26_drive_0035 24 | 2011_09_26_drive_0036 25 | 2011_09_26_drive_0039 26 | 2011_09_26_drive_0046 27 | 2011_09_26_drive_0048 28 | 2011_09_26_drive_0051 29 | 2011_09_26_drive_0052 30 | 2011_09_26_drive_0056 31 | 2011_09_26_drive_0057 32 | 2011_09_26_drive_0059 33 | 2011_09_26_drive_0060 34 | 2011_09_26_drive_0061 35 | 2011_09_26_drive_0064 36 | 2011_09_26_drive_0070 37 | 2011_09_26_drive_0079 38 | 2011_09_26_drive_0084 39 | 2011_09_26_drive_0086 40 | 2011_09_26_drive_0087 41 | 2011_09_26_drive_0091 42 | 2011_09_26_drive_0093 43 | 2011_09_26_drive_0095 44 | 2011_09_26_drive_0096 45 | 2011_09_26_drive_0101 46 | 2011_09_26_drive_0104 47 | 2011_09_26_drive_0106 48 | 2011_09_26_drive_0113 49 | 2011_09_26_drive_0117 50 | 2011_09_26_drive_0119 51 | 2011_09_28_calib.zip 52 | 2011_09_28_drive_0001 53 | 2011_09_28_drive_0002 54 | 2011_09_28_drive_0016 55 | 2011_09_28_drive_0021 56 | 2011_09_28_drive_0034 57 | 2011_09_28_drive_0035 58 | 2011_09_28_drive_0037 59 | 2011_09_28_drive_0038 60 | 2011_09_28_drive_0039 61 | 2011_09_28_drive_0043 62 | 2011_09_28_drive_0045 63 | 2011_09_28_drive_0047 64 | 2011_09_28_drive_0053 65 | 2011_09_28_drive_0054 66 | 2011_09_28_drive_0057 67 | 2011_09_28_drive_0065 68 | 2011_09_28_drive_0066 69 | 2011_09_28_drive_0068 70 | 2011_09_28_drive_0070 71 | 2011_09_28_drive_0071 72 | 2011_09_28_drive_0075 73 | 2011_09_28_drive_0077 74 | 2011_09_28_drive_0078 75 | 2011_09_28_drive_0080 76 | 2011_09_28_drive_0082 77 | 2011_09_28_drive_0086 78 | 2011_09_28_drive_0087 79 | 2011_09_28_drive_0089 80 | 2011_09_28_drive_0090 81 | 2011_09_28_drive_0094 82 | 2011_09_28_drive_0095 83 | 2011_09_28_drive_0096 84 | 2011_09_28_drive_0098 85 | 2011_09_28_drive_0100 86 | 2011_09_28_drive_0102 87 | 2011_09_28_drive_0103 88 | 2011_09_28_drive_0104 89 | 2011_09_28_drive_0106 90 | 2011_09_28_drive_0108 91 | 2011_09_28_drive_0110 92 | 2011_09_28_drive_0113 93 | 2011_09_28_drive_0117 94 | 2011_09_28_drive_0119 95 | 2011_09_28_drive_0121 96 | 2011_09_28_drive_0122 97 | 2011_09_28_drive_0125 98 | 2011_09_28_drive_0126 99 | 2011_09_28_drive_0128 100 | 2011_09_28_drive_0132 101 | 2011_09_28_drive_0134 102 | 2011_09_28_drive_0135 103 | 2011_09_28_drive_0136 104 | 2011_09_28_drive_0138 105 | 2011_09_28_drive_0141 106 | 2011_09_28_drive_0143 107 | 2011_09_28_drive_0145 108 | 2011_09_28_drive_0146 109 | 2011_09_28_drive_0149 110 | 2011_09_28_drive_0153 111 | 2011_09_28_drive_0154 112 | 2011_09_28_drive_0155 113 | 2011_09_28_drive_0156 114 | 2011_09_28_drive_0160 115 | 2011_09_28_drive_0161 116 | 2011_09_28_drive_0162 117 | 2011_09_28_drive_0165 118 | 2011_09_28_drive_0166 119 | 2011_09_28_drive_0167 120 | 2011_09_28_drive_0168 121 | 2011_09_28_drive_0171 122 | 2011_09_28_drive_0174 123 | 2011_09_28_drive_0177 124 | 2011_09_28_drive_0179 125 | 2011_09_28_drive_0183 126 | 2011_09_28_drive_0184 127 | 2011_09_28_drive_0185 128 | 2011_09_28_drive_0186 129 | 2011_09_28_drive_0187 130 | 2011_09_28_drive_0191 131 | 2011_09_28_drive_0192 132 | 2011_09_28_drive_0195 133 | 2011_09_28_drive_0198 134 | 2011_09_28_drive_0199 135 | 2011_09_28_drive_0201 136 | 2011_09_28_drive_0204 137 | 2011_09_28_drive_0205 138 | 2011_09_28_drive_0208 139 | 2011_09_28_drive_0209 140 | 2011_09_28_drive_0214 141 | 2011_09_28_drive_0216 142 | 2011_09_28_drive_0220 143 | 2011_09_28_drive_0222 144 | 2011_09_28_drive_0225 145 | 2011_09_29_calib.zip 146 | 2011_09_29_drive_0004 147 | 2011_09_29_drive_0026 148 | 2011_09_29_drive_0071 149 | 2011_09_29_drive_0108 150 | 2011_09_30_calib.zip 151 | 2011_09_30_drive_0016 152 | 2011_09_30_drive_0018 153 | 2011_09_30_drive_0020 154 | 2011_09_30_drive_0027 155 | 2011_09_30_drive_0028 156 | 2011_09_30_drive_0033 157 | 2011_09_30_drive_0034 158 | 2011_09_30_drive_0072 159 | 2011_10_03_calib.zip 160 | 2011_10_03_drive_0027 161 | 2011_10_03_drive_0034 162 | 2011_10_03_drive_0042 163 | 2011_10_03_drive_0047 164 | 2011_10_03_drive_0058 165 | ) 166 | 167 | for i in ${files[@]}; do 168 | if [ ${i:(-3)} != "zip" ] 169 | then 170 | shortname=$i'_sync.zip' 171 | fullname=$i'/'$i'_sync.zip' 172 | else 173 | shortname=$i 174 | fullname=$i 175 | fi 176 | echo "Downloading: "$shortname 177 | wget -c 'https://s3.eu-central-1.amazonaws.com/avg-kitti/raw_data/'$fullname 178 | unzip -o $shortname 179 | rm $shortname 180 | done 181 | -------------------------------------------------------------------------------- /get_depth_maps.sh: -------------------------------------------------------------------------------- 1 | wget -c https://s3.eu-central-1.amazonaws.com/avg-kitti/data_depth_annotated.zip 2 | -------------------------------------------------------------------------------- /imgs/train_image_24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manjotms10/PatchGAN/83de60576137f958efcd1eaa66e8cb62001887aa/imgs/train_image_24.jpg -------------------------------------------------------------------------------- /imgs/train_image_28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/manjotms10/PatchGAN/83de60576137f958efcd1eaa66e8cb62001887aa/imgs/train_image_28.jpg -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.utils.model_zoo as model_zoo 4 | import CSPN as post_process 5 | import update_model 6 | 7 | # memory analyze 8 | import gc 9 | 10 | __all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', 11 | 'resnet152'] 12 | 13 | model_urls = { 14 | 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', 15 | 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', 16 | 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', 17 | 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', 18 | 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', 19 | } 20 | 21 | model_path = { 22 | 'resnet18': 'pretrained/resnet18.pth', 23 | 'resnet50': 'pretrained/resnet50.pth' 24 | } 25 | 26 | 27 | def conv3x3(in_planes, out_planes, stride=1): 28 | """3x3 convolution with padding""" 29 | return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, 30 | padding=1, bias=False) 31 | 32 | 33 | class BasicBlock(nn.Module): 34 | expansion = 1 35 | 36 | def __init__(self, inplanes, planes, stride=1, downsample=None): 37 | super(BasicBlock, self).__init__() 38 | self.conv1 = conv3x3(inplanes, planes, stride) 39 | self.bn1 = nn.BatchNorm2d(planes) 40 | self.relu = nn.ReLU(inplace=True) 41 | self.conv2 = conv3x3(planes, planes) 42 | self.bn2 = nn.BatchNorm2d(planes) 43 | self.downsample = downsample 44 | self.stride = stride 45 | 46 | def forward(self, x): 47 | residual = x 48 | 49 | out = self.conv1(x) 50 | out = self.bn1(out) 51 | out = self.relu(out) 52 | 53 | out = self.conv2(out) 54 | out = self.bn2(out) 55 | 56 | if self.downsample is not None: 57 | residual = self.downsample(x) 58 | 59 | out += residual 60 | out = self.relu(out) 61 | 62 | return out 63 | 64 | 65 | class Bottleneck(nn.Module): 66 | expansion = 4 67 | 68 | def __init__(self, inplanes, planes, stride=1, downsample=None): 69 | super(Bottleneck, self).__init__() 70 | self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) 71 | self.bn1 = nn.BatchNorm2d(planes) 72 | self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, 73 | padding=1, bias=False) 74 | self.bn2 = nn.BatchNorm2d(planes) 75 | self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False) 76 | self.bn3 = nn.BatchNorm2d(planes * 4) 77 | self.relu = nn.ReLU(inplace=True) 78 | self.downsample = downsample 79 | self.stride = stride 80 | 81 | def forward(self, x): 82 | residual = x 83 | 84 | out = self.conv1(x) 85 | out = self.bn1(out) 86 | out = self.relu(out) 87 | 88 | out = self.conv2(out) 89 | out = self.bn2(out) 90 | out = self.relu(out) 91 | 92 | out = self.conv3(out) 93 | out = self.bn3(out) 94 | 95 | if self.downsample is not None: 96 | residual = self.downsample(x) 97 | 98 | out += residual 99 | out = self.relu(out) 100 | 101 | return out 102 | 103 | 104 | class UpProj_Block(nn.Module): 105 | def __init__(self, in_channels, out_channels, oheight=0, owidth=0): 106 | super(UpProj_Block, self).__init__() 107 | self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 108 | self.bn1 = nn.BatchNorm2d(out_channels) 109 | self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) 110 | self.bn2 = nn.BatchNorm2d(out_channels) 111 | self.sc_conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 112 | self.sc_bn1 = nn.BatchNorm2d(out_channels) 113 | self.relu = nn.ReLU(inplace=True) 114 | self.oheight = oheight 115 | self.owidth = owidth 116 | 117 | def _up_pooling(self, x, scale): 118 | oheight = 0 119 | owidth = 0 120 | if self.oheight == 0 and self.owidth == 0: 121 | oheight = scale * x.size(2) 122 | owidth = scale * x.size(3) 123 | x = nn.Upsample(scale_factor=scale, mode='nearest')(x) 124 | else: 125 | oheight = self.oheight 126 | owidth = self.owidth 127 | x = nn.Upsample(size=(oheight, owidth), mode='nearest')(x) 128 | mask = torch.zeros_like(x) 129 | for h in range(0, oheight, 2): 130 | for w in range(0, owidth, 2): 131 | mask[:, :, h, w] = 1 132 | x = torch.mul(mask, x) 133 | return x 134 | 135 | def forward(self, x): 136 | x = self._up_pooling(x, 2) 137 | out = self.relu(self.bn1(self.conv1(x))) 138 | out = self.bn2(self.conv2(out)) 139 | short_cut = self.sc_bn1(self.sc_conv1(x)) 140 | out += short_cut 141 | out = self.relu(out) 142 | return out 143 | 144 | 145 | class Simple_Gudi_UpConv_Block(nn.Module): 146 | def __init__(self, in_channels, out_channels, oheight=0, owidth=0): 147 | super(Simple_Gudi_UpConv_Block, self).__init__() 148 | self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 149 | self.bn1 = nn.BatchNorm2d(out_channels) 150 | self.relu = nn.ReLU(inplace=True) 151 | self.oheight = oheight 152 | self.owidth = owidth 153 | 154 | def _up_pooling(self, x, scale): 155 | 156 | x = nn.Upsample(scale_factor=scale, mode='nearest')(x) 157 | if self.oheight != 0 and self.owidth != 0: 158 | x = x.narrow(2, 0, self.oheight) 159 | x = x.narrow(3, 0, self.owidth) 160 | mask = torch.zeros_like(x) 161 | for h in range(0, self.oheight, 2): 162 | for w in range(0, self.owidth, 2): 163 | mask[:, :, h, w] = 1 164 | x = torch.mul(mask, x) 165 | return x 166 | 167 | def forward(self, x): 168 | x = self._up_pooling(x, 2) 169 | out = self.relu(self.bn1(self.conv1(x))) 170 | return out 171 | 172 | 173 | class Simple_Gudi_UpConv_Block_Last_Layer(nn.Module): 174 | def __init__(self, in_channels, out_channels, oheight=0, owidth=0): 175 | super(Simple_Gudi_UpConv_Block_Last_Layer, self).__init__() 176 | self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) 177 | self.oheight = oheight 178 | self.owidth = owidth 179 | 180 | def _up_pooling(self, x, scale): 181 | 182 | x = nn.Upsample(scale_factor=scale, mode='nearest')(x) 183 | if self.oheight != 0 and self.owidth != 0: 184 | x = x.narrow(2, 0, self.oheight) 185 | x = x.narrow(3, 0, self.owidth) 186 | mask = torch.zeros_like(x) 187 | for h in range(0, self.oheight, 2): 188 | for w in range(0, self.owidth, 2): 189 | mask[:, :, h, w] = 1 190 | x = torch.mul(mask, x) 191 | return x 192 | 193 | def forward(self, x): 194 | x = self._up_pooling(x, 2) 195 | out = self.conv1(x) 196 | return out 197 | 198 | 199 | class Gudi_UpProj_Block(nn.Module): 200 | def __init__(self, in_channels, out_channels, oheight=0, owidth=0): 201 | super(Gudi_UpProj_Block, self).__init__() 202 | self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 203 | self.bn1 = nn.BatchNorm2d(out_channels) 204 | self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) 205 | self.bn2 = nn.BatchNorm2d(out_channels) 206 | self.sc_conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 207 | self.sc_bn1 = nn.BatchNorm2d(out_channels) 208 | self.relu = nn.ReLU(inplace=True) 209 | self.oheight = oheight 210 | self.owidth = owidth 211 | 212 | def _up_pooling(self, x, scale): 213 | 214 | x = nn.Upsample(scale_factor=scale, mode='nearest')(x) 215 | if self.oheight != 0 and self.owidth != 0: 216 | x = x[:, :, 0:self.oheight, 0:self.owidth] 217 | mask = torch.zeros_like(x) 218 | for h in range(0, self.oheight, 2): 219 | for w in range(0, self.owidth, 2): 220 | mask[:, :, h, w] = 1 221 | x = torch.mul(mask, x) 222 | return x 223 | 224 | def forward(self, x): 225 | x = self._up_pooling(x, 2) 226 | out = self.relu(self.bn1(self.conv1(x))) 227 | out = self.bn2(self.conv2(out)) 228 | short_cut = self.sc_bn1(self.sc_conv1(x)) 229 | out += short_cut 230 | out = self.relu(out) 231 | return out 232 | 233 | 234 | class Gudi_UpProj_Block_Cat(nn.Module): 235 | def __init__(self, in_channels, out_channels, oheight=0, owidth=0): 236 | super(Gudi_UpProj_Block_Cat, self).__init__() 237 | self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 238 | self.bn1 = nn.BatchNorm2d(out_channels) 239 | self.conv1_1 = nn.Conv2d(out_channels * 2, out_channels, kernel_size=3, stride=1, padding=1, bias=False) 240 | self.bn1_1 = nn.BatchNorm2d(out_channels) 241 | self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False) 242 | self.bn2 = nn.BatchNorm2d(out_channels) 243 | self.sc_conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False) 244 | self.sc_bn1 = nn.BatchNorm2d(out_channels) 245 | self.relu = nn.ReLU(inplace=True) 246 | self.oheight = oheight 247 | self.owidth = owidth 248 | 249 | def _up_pooling(self, x, scale): 250 | 251 | x = nn.Upsample(scale_factor=scale, mode='nearest')(x) 252 | if self.oheight != 0 and self.owidth != 0: 253 | x = x[:, :, 0:self.oheight, 0:self.owidth] 254 | mask = torch.zeros_like(x) 255 | for h in range(0, self.oheight, 2): 256 | for w in range(0, self.owidth, 2): 257 | mask[:, :, h, w] = 1 258 | x = torch.mul(mask, x) 259 | return x 260 | 261 | def forward(self, x, side_input): 262 | x = self._up_pooling(x, 2) 263 | out = self.relu(self.bn1(self.conv1(x))) 264 | out = torch.cat((out, side_input), 1) 265 | out = self.relu(self.bn1_1(self.conv1_1(out))) 266 | out = self.bn2(self.conv2(out)) 267 | short_cut = self.sc_bn1(self.sc_conv1(x)) 268 | out += short_cut 269 | out = self.relu(out) 270 | return out 271 | 272 | 273 | class ResNet(nn.Module): 274 | 275 | def __init__(self, block, layers, up_proj_block): 276 | self.inplanes = 64 277 | super(ResNet, self).__init__() 278 | self.conv1_1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, 279 | bias=False) 280 | self.bn1 = nn.BatchNorm2d(64) 281 | self.relu = nn.ReLU(inplace=True) 282 | self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) 283 | self.layer1 = self._make_layer(block, 64, layers[0]) 284 | self.layer2 = self._make_layer(block, 128, layers[1], stride=2) 285 | self.layer3 = self._make_layer(block, 256, layers[2], stride=2) 286 | self.layer4 = self._make_layer(block, 512, layers[3], stride=2) 287 | 288 | self.mid_channel = 256 * block.expansion 289 | self.conv2 = nn.Conv2d(512 * block.expansion, 512 * block.expansion, kernel_size=3, stride=1, padding=1, 290 | bias=False) 291 | self.bn2 = nn.BatchNorm2d(512 * block.expansion) 292 | self.conv3 = nn.Conv2d(128, 1, kernel_size=3, stride=1, padding=1, bias=False) 293 | 294 | self.post_process_layer = self._make_post_process_layer() 295 | 296 | self.gud_up_proj_layer1 = self._make_gud_up_conv_layer(Gudi_UpProj_Block, 2048, 1024, 15, 19) 297 | self.gud_up_proj_layer2 = self._make_gud_up_conv_layer(Gudi_UpProj_Block_Cat, 1024, 512, 29, 38) 298 | self.gud_up_proj_layer3 = self._make_gud_up_conv_layer(Gudi_UpProj_Block_Cat, 512, 256, 57, 76) 299 | self.gud_up_proj_layer4 = self._make_gud_up_conv_layer(Gudi_UpProj_Block_Cat, 256, 64, 114, 152) 300 | self.gud_up_proj_layer5 = self._make_gud_up_conv_layer(Simple_Gudi_UpConv_Block_Last_Layer, 64, 1, 228, 304) 301 | self.gud_up_proj_layer6 = self._make_gud_up_conv_layer(Simple_Gudi_UpConv_Block_Last_Layer, 64, 1, 228, 304) 302 | 303 | def _make_layer(self, block, planes, blocks, stride=1): 304 | downsample = None 305 | if stride != 1 or self.inplanes != planes * block.expansion: 306 | downsample = nn.Sequential( 307 | nn.Conv2d(self.inplanes, planes * block.expansion, 308 | kernel_size=1, stride=stride, bias=False), 309 | nn.BatchNorm2d(planes * block.expansion), 310 | ) 311 | 312 | layers = [] 313 | layers.append(block(self.inplanes, planes, stride, downsample)) 314 | self.inplanes = planes * block.expansion 315 | for i in range(1, blocks): 316 | layers.append(block(self.inplanes, planes)) 317 | 318 | return nn.Sequential(*layers) 319 | 320 | def _make_up_conv_layer(self, up_proj_block, in_channels, out_channels): 321 | return up_proj_block(in_channels, out_channels) 322 | 323 | def _make_gud_up_conv_layer(self, up_proj_block, in_channels, out_channels, oheight, owidth): 324 | return up_proj_block(in_channels, out_channels, oheight, owidth) 325 | 326 | def _make_post_process_layer(self): 327 | return post_process.Affinity_Propagate(spn=True) 328 | 329 | def forward(self, x): 330 | [batch_size, channel, height, width] = x.size() 331 | #sparse_depth = x.narrow(1, 3, 1).clone() # get sparse depth 332 | 333 | x = self.conv1_1(x) 334 | skip4 = x 335 | 336 | x = self.bn1(x) 337 | x = self.relu(x) 338 | x = self.maxpool(x) 339 | x = self.layer1(x) 340 | skip3 = x 341 | 342 | x = self.layer2(x) 343 | skip2 = x 344 | 345 | x = self.layer3(x) 346 | x = self.layer4(x) 347 | 348 | x = self.bn2(self.conv2(x)) 349 | x = self.gud_up_proj_layer1(x) 350 | 351 | x = self.gud_up_proj_layer2(x, skip2) 352 | x = self.gud_up_proj_layer3(x, skip3) 353 | x = self.gud_up_proj_layer4(x, skip4) 354 | 355 | blur_depth = self.gud_up_proj_layer5(x) 356 | guidance = self.gud_up_proj_layer6(x) 357 | #x = self.post_process_layer(guidance, blur_depth, sparse_depth) 358 | 359 | x = guidance 360 | return x 361 | 362 | 363 | def resnet18(pretrained=False, **kwargs): 364 | """Constructs a ResNet-18 model. 365 | Args: 366 | pretrained (bool): If True, returns a model pre-trained on ImageNet 367 | """ 368 | model = ResNet(BasicBlock, [2, 2, 2, 2], UpProj_Block, **kwargs) 369 | if pretrained: 370 | print('==> Load pretrained model..') 371 | pretrained_dict = torch.load(model_path['resnet18']) 372 | model.load_state_dict(update_model.update_model(model, pretrained_dict)) 373 | return model 374 | 375 | 376 | def resnet34(pretrained=False, **kwargs): 377 | """Constructs a ResNet-34 model. 378 | Args: 379 | pretrained (bool): If True, returns a model pre-trained on ImageNet 380 | """ 381 | model = ResNet(BasicBlock, [3, 4, 6, 3], UpProj_Block, **kwargs) 382 | if pretrained: 383 | model.load_state_dict(model_zoo.load_url(model_urls['resnet34'])) 384 | return model 385 | 386 | 387 | def resnet50(pretrained=False, **kwargs): 388 | """Constructs a ResNet-50 model. 389 | Args: 390 | pretrained (bool): If True, returns a model pre-trained on ImageNet 391 | """ 392 | model = ResNet(Bottleneck, [3, 4, 6, 3], UpProj_Block, **kwargs) 393 | if pretrained: 394 | print('==> Load pretrained model..') 395 | pretrained_dict = torch.load(model_path['resnet50']) 396 | model.load_state_dict(update_model.update_model(model, pretrained_dict)) 397 | return model 398 | 399 | 400 | def resnet101(pretrained=False, **kwargs): 401 | """Constructs a ResNet-101 model. 402 | Args: 403 | pretrained (bool): If True, returns a model pre-trained on ImageNet 404 | """ 405 | model = ResNet(Bottleneck, [3, 4, 23, 3], UpProj_Block, **kwargs) 406 | if pretrained: 407 | model.load_state_dict(model_zoo.load_url(model_urls['resnet101'])) 408 | return model 409 | 410 | 411 | def resnet152(pretrained=False, **kwargs): 412 | """Constructs a ResNet-152 model. 413 | Args: 414 | pretrained (bool): If True, returns a model pre-trained on ImageNet 415 | """ 416 | model = ResNet(Bottleneck, [3, 8, 36, 3], UpProj_Block, **kwargs) 417 | if pretrained: 418 | model.load_state_dict(model_zoo.load_url(model_urls['resnet152'])) 419 | return model 420 | 421 | 422 | if __name__ == "__main__": 423 | image = torch.randn(1, 4, 228, 304).float() 424 | image = image.cuda() 425 | 426 | model = resnet50(pretrained=True) 427 | model = model.cuda() 428 | 429 | with torch.no_grad(): 430 | pred = model.forward(image) 431 | 432 | print(pred.size()) 433 | -------------------------------------------------------------------------------- /nyu_dataloader.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pickle 3 | 4 | import numpy as np 5 | import glob 6 | import torch 7 | from PIL import Image 8 | from skimage.util import img_as_float 9 | from skimage.transform import resize 10 | from torchvision import transforms 11 | 12 | 13 | class DataLoader(): 14 | ''' 15 | raw_data_dir = dir containing extracted raw NYU data (folder containing 2011-09-26 etc.) 16 | ''' 17 | 18 | def __init__(self, raw_images_path, mode="train"): 19 | 20 | self.mode = mode 21 | self.raw_images_path = raw_images_path 22 | self.split_file = "nyu_split.pkl" 23 | 24 | if not os.path.isfile(self.split_file): 25 | self.train_test_split() 26 | 27 | with open(self.split_file, "rb") as split_f: 28 | split = pickle.load(split_f) 29 | 30 | if self.mode == "train": 31 | self.images = split["train"] 32 | else: 33 | self.images = split["val"] 34 | 35 | print('Found Images %d'%(len(self.images))) 36 | 37 | def load_data(self, img_file, label_file): 38 | x = Image.open(img_file) 39 | y = Image.open(label_file) 40 | x = np.array(x) 41 | y = np.array(y) 42 | 43 | x = resize(x, (228, 304), anti_aliasing=True) 44 | y = resize(y, (228, 304), anti_aliasing=True) 45 | x = img_as_float(x) 46 | y = img_as_float(y) 47 | 48 | return x, y 49 | 50 | def __len__(self): 51 | return len(self.images) 52 | 53 | def train_test_split(self): 54 | images = [x.split('/')[-1].split('.')[0] for x in sorted(glob.glob(self.raw_images_path + '/*.jpg'))] 55 | 56 | total = len(images) 57 | indexes = np.random.permutation(total) 58 | 59 | split = int(0.9 * total) 60 | train = images[:split] 61 | val = images[split:] 62 | out = {'train': train, 'val': val} 63 | with open("nyu_split.pkl", "wb") as file: 64 | pickle.dump(out, file) 65 | 66 | def get_one_batch(self, batch_size = 16): 67 | images = [] 68 | labels = [] 69 | 70 | while True: 71 | idx = np.random.choice(len(self.images), batch_size) 72 | for i in idx: 73 | image = os.path.join(self.raw_images_path, self.images[i] + ".jpg") 74 | label = os.path.join(self.raw_images_path, self.images[i] + ".png") 75 | x, y = self.load_data(image, label) 76 | #x, y = self.train_transform(x, y) 77 | y= np.expand_dims(y, axis=0) 78 | images.append(x) 79 | labels.append(y) 80 | yield torch.from_numpy(np.array(images)).permute(0, 3, 1, 2), torch.from_numpy(np.array(labels)) 81 | 82 | 83 | def train_transform(self, rgb, depth): 84 | s = np.random.uniform(1.0, 1.5) # random scaling 85 | depth_np = depth / s 86 | angle = np.random.uniform(-5.0, 5.0) # random rotation degrees 87 | do_flip = np.random.uniform(0.0, 1.0) < 0.5 # random horizontal flip 88 | 89 | # perform 1st step of data augmentation 90 | transform = transforms.Compose([ 91 | #transforms.Rotate(angle), 92 | transforms.Resize(s), 93 | transforms.CenterCrop(self.output_size), 94 | transforms.HorizontalFlip(do_flip) 95 | ]) 96 | 97 | rgb_np = transform(rgb) 98 | rgb_np = self.color_jitter(rgb_np) # random color jittering 99 | rgb_np = np.asfarray(rgb_np, dtype='float') / 255 100 | depth_np = transform(depth_np) 101 | 102 | return rgb_np, depth_np -------------------------------------------------------------------------------- /nyu_loader.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | import glob 4 | import torch 5 | from PIL import Image 6 | from skimage.util import img_as_float 7 | from skimage.transform import resize 8 | from torchvision import transforms 9 | 10 | class DataLoader(): 11 | ''' 12 | raw_data_dir = dir containing extracted raw NYU data (folder containing 2011-09-26 etc.) 13 | ''' 14 | 15 | def __init__(self, raw_images_path, mode="train"): 16 | 17 | self.mode = mode 18 | 19 | self.train_images = sorted(glob.glob(raw_images_path + '/*.jpg')) 20 | self.train_labels = sorted(glob.glob(raw_images_path + '/*.png')) 21 | 22 | print('Found %d Images %d'%(len(self.train_images), len(self.train_labels))) 23 | 24 | def load_data(self, img_file, label_file): 25 | x = Image.open(img_file) 26 | y = Image.open(label_file).convert('RGB') 27 | x = np.array(x).astype(np.float32) 28 | y = np.array(y).astype(np.float32) 29 | 30 | x = resize(x, (228, 304), anti_aliasing=True) 31 | y = resize(y, (228, 304), anti_aliasing=True) 32 | x = img_as_float(x)/127.5 - 1 33 | y = img_as_float(y)/127.5 - 1 34 | 35 | return x, y 36 | 37 | def get_one_batch(self, batch_size = 16): 38 | images = [] 39 | labels = [] 40 | 41 | while True: 42 | idx = np.random.choice(len(self.train_images), batch_size) 43 | for i in idx: 44 | x, y = self.load_data(self.train_images[i], self.train_labels[i]) 45 | #x, y = self.train_transform(x, y) 46 | images.append(x) 47 | labels.append(y) 48 | yield torch.from_numpy(np.array(images)).permute(0, 3, 1, 2), torch.from_numpy(np.array(labels)).permute(0, 3, 1, 2) 49 | 50 | 51 | def train_transform(self, rgb, depth): 52 | s = np.random.uniform(1.0, 1.5) # random scaling 53 | depth_np = depth / s 54 | angle = np.random.uniform(-5.0, 5.0) # random rotation degrees 55 | do_flip = np.random.uniform(0.0, 1.0) < 0.5 # random horizontal flip 56 | 57 | # perform 1st step of data augmentation 58 | transform = transforms.Compose([ 59 | #transforms.Rotate(angle), 60 | transforms.Resize(s), 61 | transforms.CenterCrop(self.output_size), 62 | transforms.HorizontalFlip(do_flip) 63 | ]) 64 | 65 | rgb_np = transform(rgb) 66 | rgb_np = self.color_jitter(rgb_np) # random color jittering 67 | rgb_np = np.asfarray(rgb_np, dtype='float') / 255 68 | depth_np = transform(depth_np) 69 | 70 | return rgb_np, depth_np 71 | 72 | -------------------------------------------------------------------------------- /nyu_train.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | import torchvision.models 7 | import collections 8 | import math 9 | import time 10 | import pickle 11 | 12 | from nyu_loader import DataLoader 13 | 14 | def weights_init(m): 15 | # Initialize filters with Gaussian random weights 16 | if isinstance(m, nn.Conv2d): 17 | n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels 18 | m.weight.data.normal_(0, math.sqrt(2. / n)) 19 | if m.bias is not None: 20 | m.bias.data.zero_() 21 | elif isinstance(m, nn.ConvTranspose2d): 22 | n = m.kernel_size[0] * m.kernel_size[1] * m.in_channels 23 | m.weight.data.normal_(0, math.sqrt(2. / n)) 24 | if m.bias is not None: 25 | m.bias.data.zero_() 26 | elif isinstance(m, nn.BatchNorm2d): 27 | m.weight.data.fill_(1) 28 | m.bias.data.zero_() 29 | 30 | 31 | class Unpool(nn.Module): 32 | # Unpool: 2*2 unpooling with zero padding 33 | def __init__(self, num_channels, stride=2): 34 | super(Unpool, self).__init__() 35 | 36 | self.num_channels = num_channels 37 | self.stride = stride 38 | 39 | def forward(self, x): 40 | weights = torch.zeros(self.num_channels, 1, self.stride, self.stride) 41 | if torch.cuda.is_available(): 42 | weights = weights.cuda() 43 | weights[:, :, 0, 0] = 1 44 | return F.conv_transpose2d(x, weights, stride=self.stride, groups=self.num_channels) 45 | 46 | 47 | class Decoder(nn.Module): 48 | names = ['deconv2', 'deconv3', 'upconv', 'upproj'] 49 | 50 | def __init__(self): 51 | super(Decoder, self).__init__() 52 | 53 | self.layer1 = None 54 | self.layer2 = None 55 | self.layer3 = None 56 | self.layer4 = None 57 | 58 | def forward(self, x): 59 | x = self.layer1(x) 60 | x = self.layer2(x) 61 | x = self.layer3(x) 62 | x = self.layer4(x) 63 | return x 64 | 65 | 66 | class DeConv(Decoder): 67 | def __init__(self, in_channels, kernel_size): 68 | assert kernel_size >= 2, "kernel_size out of range: {}".format(kernel_size) 69 | super(DeConv, self).__init__() 70 | 71 | def convt(in_channels): 72 | stride = 2 73 | padding = (kernel_size - 1) // 2 74 | output_padding = kernel_size % 2 75 | assert -2 - 2 * padding + kernel_size + output_padding == 0, "deconv parameters incorrect" 76 | 77 | module_name = "deconv{}".format(kernel_size) 78 | return nn.Sequential(collections.OrderedDict([ 79 | (module_name, nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size, 80 | stride, padding, output_padding, bias=False)), 81 | ('batchnorm', nn.BatchNorm2d(in_channels // 2)), 82 | ('relu', nn.ReLU(inplace=True)), 83 | ])) 84 | 85 | self.layer1 = convt(in_channels) 86 | self.layer2 = convt(in_channels // 2) 87 | self.layer3 = convt(in_channels // (2 ** 2)) 88 | self.layer4 = convt(in_channels // (2 ** 3)) 89 | 90 | 91 | class UpConv(Decoder): 92 | # UpConv decoder consists of 4 upconv modules with decreasing number of channels and increasing feature map size 93 | def upconv_module(self, in_channels): 94 | # UpConv module: unpool -> 5*5 conv -> batchnorm -> ReLU 95 | upconv = nn.Sequential(collections.OrderedDict([ 96 | ('unpool', Unpool(in_channels)), 97 | ('conv', nn.Conv2d(in_channels, in_channels // 2, kernel_size=5, stride=1, padding=2, bias=False)), 98 | ('batchnorm', nn.BatchNorm2d(in_channels // 2)), 99 | ('relu', nn.ReLU()), 100 | ])) 101 | return upconv 102 | 103 | def __init__(self, in_channels): 104 | super(UpConv, self).__init__() 105 | self.layer1 = self.upconv_module(in_channels) 106 | self.layer2 = self.upconv_module(in_channels // 2) 107 | self.layer3 = self.upconv_module(in_channels // 4) 108 | self.layer4 = self.upconv_module(in_channels // 8) 109 | 110 | 111 | class FasterUpConv(Decoder): 112 | # Faster Upconv using pixelshuffle 113 | 114 | class faster_upconv_module(nn.Module): 115 | 116 | def __init__(self, in_channel): 117 | super(FasterUpConv.faster_upconv_module, self).__init__() 118 | 119 | self.conv1_ = nn.Sequential(collections.OrderedDict([ 120 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=3)), 121 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 122 | ])) 123 | 124 | self.conv2_ = nn.Sequential(collections.OrderedDict([ 125 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(2, 3))), 126 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 127 | ])) 128 | 129 | self.conv3_ = nn.Sequential(collections.OrderedDict([ 130 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(3, 2))), 131 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 132 | ])) 133 | 134 | self.conv4_ = nn.Sequential(collections.OrderedDict([ 135 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=2)), 136 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 137 | ])) 138 | 139 | self.ps = nn.PixelShuffle(2) 140 | self.relu = nn.ReLU(inplace=True) 141 | 142 | def forward(self, x): 143 | # print('Upmodule x size = ', x.size()) 144 | x1 = self.conv1_(nn.functional.pad(x, (1, 1, 1, 1))) 145 | x2 = self.conv2_(nn.functional.pad(x, (1, 1, 0, 1))) 146 | x3 = self.conv3_(nn.functional.pad(x, (0, 1, 1, 1))) 147 | x4 = self.conv4_(nn.functional.pad(x, (0, 1, 0, 1))) 148 | 149 | x = torch.cat((x1, x2, x3, x4), dim=1) 150 | 151 | output = self.ps(x) 152 | output = self.relu(output) 153 | 154 | return output 155 | 156 | def __init__(self, in_channel): 157 | super(FasterUpConv, self).__init__() 158 | 159 | self.layer1 = self.faster_upconv_module(in_channel) 160 | self.layer2 = self.faster_upconv_module(in_channel // 2) 161 | self.layer3 = self.faster_upconv_module(in_channel // 4) 162 | self.layer4 = self.faster_upconv_module(in_channel // 8) 163 | 164 | 165 | class UpProj(Decoder): 166 | # UpProj decoder consists of 4 upproj modules with decreasing number of channels and increasing feature map size 167 | 168 | class UpProjModule(nn.Module): 169 | # UpProj module has two branches, with a Unpool at the start and a ReLu at the end 170 | # upper branch: 5*5 conv -> batchnorm -> ReLU -> 3*3 conv -> batchnorm 171 | # bottom branch: 5*5 conv -> batchnorm 172 | 173 | def __init__(self, in_channels): 174 | super(UpProj.UpProjModule, self).__init__() 175 | out_channels = in_channels // 2 176 | self.unpool = Unpool(in_channels) 177 | self.upper_branch = nn.Sequential(collections.OrderedDict([ 178 | ('conv1', nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False)), 179 | ('batchnorm1', nn.BatchNorm2d(out_channels)), 180 | ('relu', nn.ReLU()), 181 | ('conv2', nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)), 182 | ('batchnorm2', nn.BatchNorm2d(out_channels)), 183 | ])) 184 | self.bottom_branch = nn.Sequential(collections.OrderedDict([ 185 | ('conv', nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False)), 186 | ('batchnorm', nn.BatchNorm2d(out_channels)), 187 | ])) 188 | self.relu = nn.ReLU() 189 | 190 | def forward(self, x): 191 | x = self.unpool(x) 192 | x1 = self.upper_branch(x) 193 | x2 = self.bottom_branch(x) 194 | x = x1 + x2 195 | x = self.relu(x) 196 | return x 197 | 198 | def __init__(self, in_channels): 199 | super(UpProj, self).__init__() 200 | self.layer1 = self.UpProjModule(in_channels) 201 | self.layer2 = self.UpProjModule(in_channels // 2) 202 | self.layer3 = self.UpProjModule(in_channels // 4) 203 | self.layer4 = self.UpProjModule(in_channels // 8) 204 | 205 | 206 | class FasterUpProj(Decoder): 207 | # Faster UpProj decorder using pixelshuffle 208 | 209 | class faster_upconv(nn.Module): 210 | 211 | def __init__(self, in_channel): 212 | super(FasterUpProj.faster_upconv, self).__init__() 213 | 214 | self.conv1_ = nn.Sequential(collections.OrderedDict([ 215 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=3)), 216 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 217 | ])) 218 | 219 | self.conv2_ = nn.Sequential(collections.OrderedDict([ 220 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(2, 3))), 221 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 222 | ])) 223 | 224 | self.conv3_ = nn.Sequential(collections.OrderedDict([ 225 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(3, 2))), 226 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 227 | ])) 228 | 229 | self.conv4_ = nn.Sequential(collections.OrderedDict([ 230 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=2)), 231 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 232 | ])) 233 | 234 | self.ps = nn.PixelShuffle(2) 235 | self.relu = nn.ReLU(inplace=True) 236 | 237 | def forward(self, x): 238 | # print('Upmodule x size = ', x.size()) 239 | x1 = self.conv1_(nn.functional.pad(x, (1, 1, 1, 1))) 240 | x2 = self.conv2_(nn.functional.pad(x, (1, 1, 0, 1))) 241 | x3 = self.conv3_(nn.functional.pad(x, (0, 1, 1, 1))) 242 | x4 = self.conv4_(nn.functional.pad(x, (0, 1, 0, 1))) 243 | # print(x1.size(), x2.size(), x3.size(), x4.size()) 244 | 245 | x = torch.cat((x1, x2, x3, x4), dim=1) 246 | 247 | x = self.ps(x) 248 | return x 249 | 250 | class FasterUpProjModule(nn.Module): 251 | def __init__(self, in_channels): 252 | super(FasterUpProj.FasterUpProjModule, self).__init__() 253 | out_channels = in_channels // 2 254 | 255 | self.upper_branch = nn.Sequential(collections.OrderedDict([ 256 | ('faster_upconv', FasterUpProj.faster_upconv(in_channels)), 257 | ('relu', nn.ReLU(inplace=True)), 258 | ('conv', nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)), 259 | ('batchnorm', nn.BatchNorm2d(out_channels)), 260 | ])) 261 | self.bottom_branch = FasterUpProj.faster_upconv(in_channels) 262 | self.relu = nn.ReLU(inplace=True) 263 | 264 | def forward(self, x): 265 | x1 = self.upper_branch(x) 266 | x2 = self.bottom_branch(x) 267 | x = x1 + x2 268 | x = self.relu(x) 269 | return x 270 | 271 | def __init__(self, in_channel): 272 | super(FasterUpProj, self).__init__() 273 | 274 | self.layer1 = self.FasterUpProjModule(in_channel) 275 | self.layer2 = self.FasterUpProjModule(in_channel // 2) 276 | self.layer3 = self.FasterUpProjModule(in_channel // 4) 277 | self.layer4 = self.FasterUpProjModule(in_channel // 8) 278 | 279 | 280 | def choose_decoder(decoder, in_channels): 281 | if decoder[:6] == 'deconv': 282 | assert len(decoder) == 7 283 | kernel_size = int(decoder[6]) 284 | return DeConv(in_channels, kernel_size) 285 | elif decoder == "upproj": 286 | return UpProj(in_channels) 287 | elif decoder == "upconv": 288 | return UpConv(in_channels) 289 | elif decoder == "fasterupproj": 290 | return FasterUpProj(in_channels) 291 | else: 292 | assert False, "invalid option for decoder: {}".format(decoder) 293 | 294 | class ResNet(nn.Module): 295 | def __init__(self, dataset = 'kitti', layers = 50, decoder = 'upproj', output_size=(228, 304), in_channels=3, pretrained=True): 296 | 297 | if layers not in [18, 34, 50, 101, 152]: 298 | raise RuntimeError( 299 | 'Only 18, 34, 50, 101, and 152 layer model are defined for ResNet. Got {}'.format(layers)) 300 | 301 | super(ResNet, self).__init__() 302 | pretrained_model = torchvision.models.__dict__['resnet{}'.format(layers)](pretrained=pretrained) 303 | 304 | if in_channels == 3: 305 | self.conv1 = pretrained_model._modules['conv1'] 306 | self.bn1 = pretrained_model._modules['bn1'] 307 | else: 308 | self.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) 309 | self.bn1 = nn.BatchNorm2d(64) 310 | weights_init(self.conv1) 311 | weights_init(self.bn1) 312 | 313 | self.output_size = output_size 314 | 315 | self.relu = pretrained_model._modules['relu'] 316 | self.maxpool = pretrained_model._modules['maxpool'] 317 | self.layer1 = pretrained_model._modules['layer1'] 318 | self.layer2 = pretrained_model._modules['layer2'] 319 | self.layer3 = pretrained_model._modules['layer3'] 320 | self.layer4 = pretrained_model._modules['layer4'] 321 | 322 | # clear memory 323 | del pretrained_model 324 | 325 | # define number of intermediate channels 326 | if layers <= 34: 327 | num_channels = 512 328 | elif layers >= 50: 329 | num_channels = 2048 330 | 331 | self.conv2 = nn.Conv2d(num_channels, num_channels // 2, kernel_size=1, bias=False) 332 | self.bn2 = nn.BatchNorm2d(num_channels // 2) 333 | 334 | self.upSample = choose_decoder(decoder, num_channels // 2) 335 | 336 | # setting bias=true doesn't improve accuracy 337 | self.conv3 = nn.Conv2d(num_channels // 32, 3, kernel_size=3, stride=1, padding=1, bias=False) 338 | self.bilinear = nn.Upsample(size=self.output_size, mode='bilinear', align_corners=True) 339 | 340 | # weight init 341 | self.conv2.apply(weights_init) 342 | self.bn2.apply(weights_init) 343 | 344 | self.upSample.apply(weights_init) 345 | 346 | self.conv3.apply(weights_init) 347 | 348 | def forward(self, x): 349 | # resnet 350 | x = self.conv1(x) 351 | x = self.bn1(x) 352 | x = self.relu(x) 353 | x = self.maxpool(x) 354 | x1 = self.layer1(x) 355 | x2 = self.layer2(x1) 356 | x3 = self.layer3(x2) 357 | x4 = self.layer4(x3) 358 | 359 | x = self.conv2(x4) 360 | x = self.bn2(x) 361 | 362 | x = self.upSample(x) 363 | 364 | x = self.conv3(x) 365 | x = self.bilinear(x) 366 | 367 | return x 368 | 369 | def get_1x_lr_params(self): 370 | """ 371 | This generator returns all the parameters of the net layer whose learning rate is 1x lr. 372 | """ 373 | b = [self.conv1, self.bn1, self.relu, self.maxpool, self.layer1, self.layer2, self.layer3, self.layer4] 374 | for i in range(len(b)): 375 | for k in b[i].parameters(): 376 | if k.requires_grad: 377 | yield k 378 | 379 | def get_10x_lr_params(self): 380 | """ 381 | This generator returns all the parameters of the net layer whose learning rate is 20x lr. 382 | """ 383 | b = [self.conv2, self.bn2, self.upSample, self.conv3, self.bilinear] 384 | for j in range(len(b)): 385 | for k in b[j].parameters(): 386 | if k.requires_grad: 387 | yield k 388 | 389 | 390 | class Discriminator(nn.Module): 391 | """ 392 | Discriminator for FCRN 393 | """ 394 | def __init__(self, n_in): 395 | super(Discriminator, self).__init__() 396 | self.n_in = n_in 397 | self.modules = [] 398 | 399 | self.modules += [ nn.Conv2d(self.n_in, 32, kernel_size=3, stride=(1, 1), padding=(2, 2)), 400 | nn.MaxPool2d(kernel_size=(2, 2)), 401 | nn.LeakyReLU(0.2, True), 402 | nn.Conv2d(32, 32, 3, 1, 1), 403 | nn.MaxPool2d(kernel_size=(2,2)), 404 | nn.LeakyReLU(0.2, True), 405 | nn.Conv2d(32, 32, 3, 1, 1), 406 | nn.MaxPool2d(kernel_size=(2,2)), 407 | nn.LeakyReLU(0.2, True), 408 | nn.Conv2d(32, 32, 3, 1, 1), 409 | nn.MaxPool2d(kernel_size=(2,2)), 410 | nn.LeakyReLU(0.2, True), 411 | ] 412 | 413 | self.model = nn.Sequential(*self.modules) 414 | self.fc = nn.Linear(32 * 4, 1) 415 | 416 | def forward(self, x): 417 | x = self.model(x) 418 | x = x.view(x.size(0), -1) 419 | x = self.fc(x) 420 | return torch.sigmoid(x) 421 | 422 | 423 | """ 424 | Define Loss functions here 425 | """ 426 | class ScaleInvariantError(nn.Module): 427 | """ 428 | Scale invariant error defined in Eigen's paper! 429 | """ 430 | 431 | def __init__(self, lamada=1.0): 432 | super(ScaleInvariantError, self).__init__() 433 | self.lamada = lamada 434 | return 435 | 436 | def forward(self, y_true, y_pred): 437 | first_log = torch.log(torch.clamp(y_pred, 0, 1)) 438 | second_log = torch.log(torch.clamp(y_true, 0, 1)) 439 | d = first_log - second_log 440 | loss = torch.mean(d * d) - self.lamada * torch.mean(d) * torch.mean(d) 441 | return loss 442 | 443 | 444 | class MaskedMSELoss(nn.Module): 445 | def __init__(self): 446 | super(MaskedMSELoss, self).__init__() 447 | 448 | def forward(self, pred, target): 449 | assert pred.dim() == target.dim(), "inconsistent dimensions" 450 | valid_mask = (target > 0).detach() 451 | diff = target - pred 452 | diff = diff[valid_mask] 453 | self.loss = (diff ** 2).mean() 454 | return self.loss 455 | 456 | 457 | class MaskedL1Loss(nn.Module): 458 | def __init__(self): 459 | super(MaskedL1Loss, self).__init__() 460 | 461 | def forward(self, pred, target): 462 | assert pred.dim() == target.dim(), "inconsistent dimensions" 463 | valid_mask = (target > 0).detach() 464 | diff = target - pred 465 | diff = diff[valid_mask] 466 | self.loss = diff.abs().mean() 467 | return self.loss 468 | 469 | 470 | class berHuLoss(nn.Module): 471 | def __init__(self): 472 | super(berHuLoss, self).__init__() 473 | 474 | def forward(self, pred, target): 475 | assert pred.dim() == target.dim(), "inconsistent dimensions" 476 | 477 | huber_c = torch.max(pred - target) 478 | huber_c = 0.2 * huber_c 479 | 480 | valid_mask = (target > 0).detach() 481 | diff = target - pred 482 | diff = diff[valid_mask] 483 | diff = diff.abs() 484 | 485 | huber_mask = (diff > huber_c).detach() 486 | 487 | diff2 = diff[huber_mask] 488 | diff2 = diff2 ** 2 489 | 490 | self.loss = torch.cat((diff, diff2)).mean() 491 | 492 | return self.loss 493 | 494 | 495 | def set_requires_grad(net, requires_grad=False): 496 | if net is not None: 497 | for param in net.parameters(): 498 | param.requires_grad = requires_grad 499 | 500 | def save_image(model, x, batch, mode="train"): 501 | pred = model(x) 502 | pred *= 100 503 | npimg = pred.cpu().detach().numpy() 504 | npimg = np.transpose(npimg, (0, 2, 3, 1)) 505 | cv2.imwrite('saved_images/%s_image_%d.jpg'%(mode, batch), npimg[0]) 506 | 507 | 508 | def train(train_loader, val_loader, model, discriminator, criterion_L1, criterion_MSE, 509 | criterion_berHu, criterion_GAN, optimizer, optimizer_D, epoch, batch_size, val_frequency=10): 510 | model.train() # switch to train mode 511 | eval_mode = False 512 | num_batches = 1453 // batch_size 513 | init_lr = optimizer.param_groups[0]['lr'] 514 | 515 | total_losses_log = {"l1":0, "mse":0, "berHu":0, "adv":0} 516 | 517 | valid_T = torch.ones(batch_size, 1).cuda() 518 | zeros_T = torch.zeros(batch_size, 1).cuda() 519 | 520 | train_loss_list = [] 521 | val_loss_list = [] 522 | 523 | for iter_ in range(num_batches): 524 | # Adjust Learning Rate 525 | if iter_ % 1000 == 0 and optimizer.param_groups[0]['lr'] > init_lr/10.0: 526 | for param_group in optimizer.param_groups: 527 | param_group['lr'] *= 0.98 528 | 529 | input, target = next(train_loader.get_one_batch(batch_size)) 530 | input, target = input.float(), target.float() 531 | input, target = input.cuda(), target.cuda() 532 | torch.cuda.synchronize() 533 | 534 | optimizer.zero_grad() 535 | 536 | pred = model(input) 537 | 538 | loss_L1 = criterion_L1(pred, target) 539 | loss_MSE = criterion_MSE(pred, target) 540 | loss_berHu = criterion_berHu(pred, target) 541 | #loss_SI = criterion_SI(pred, target) 542 | ''' 543 | set_requires_grad(discriminator, False) 544 | 545 | loss_adv = 0 546 | 547 | for a in range(3): 548 | for b in range(9): 549 | row = 30 * a 550 | col = 30 * b 551 | patch_fake = pred[:, :, row:row+30, col:col+30] 552 | pred_fake = discriminator(patch_fake) 553 | loss_adv += criterion_GAN(pred_fake, valid_T) 554 | ''' 555 | 556 | loss_gen = loss_L1 + loss_berHu 557 | loss_gen.backward() 558 | optimizer.step() 559 | ''' 560 | set_requires_grad(discriminator, True) 561 | optimizer_D.zero_grad() 562 | loss_D = 0 563 | for a in range(3): 564 | for b in range(9): 565 | row = 30 * a 566 | col = 30 * b 567 | patch_fake = pred[:, :, row:row+30, col:col+30] 568 | patch_real = target[:, :, row:row+30, col:col+30] 569 | pred_fake = discriminator(patch_fake.detach()) 570 | pred_real = discriminator(patch_real) 571 | loss_D_fake = criterion_GAN(pred_fake, zeros_T) 572 | loss_D_real = criterion_GAN(pred_real, valid_T) 573 | loss_D += 0.5 * (loss_D_fake + loss_D_real) 574 | 575 | loss_D.backward() 576 | optimizer_D.step() 577 | 578 | torch.cuda.synchronize() 579 | ''' 580 | total_losses_log["l1"] += loss_L1.item() 581 | total_losses_log["mse"] += loss_MSE.item() 582 | total_losses_log["berHu"] += loss_berHu.item() 583 | #total_losses_log["adv"] += loss_adv.item() 584 | 585 | if (iter_ + 1) % 10 == 0: 586 | save_image(model, input, iter_) 587 | print('Train Epoch: {} Batch: [{}/{}], L1 ={:0.3f}, MSE={:0.3f}, berHu={:0.3f}'.format( 588 | epoch, iter_ + 1, num_batches, 589 | loss_L1.item(), loss_MSE.item(), loss_berHu.item())) 590 | 591 | if (iter_ + 1) % val_frequency == 0: 592 | val_loss = validate(val_loader, model, discriminator, criterion_L1, criterion_MSE, criterion_berHu, criterion_GAN, batch_size, iter_) 593 | for key in total_losses_log.keys(): 594 | total_losses_log[key] /= (val_frequency * batch_size) 595 | train_loss_list.append(total_losses_log) 596 | val_loss_list.append(val_loss) 597 | save_losses(train_loss_list, val_loss_list) 598 | print("TRAIN:- ", total_losses_log) 599 | print("VAL :- ", val_loss) 600 | total_losses_log = {"l1":0, "mse":0, "berHu":0, "adv":0} 601 | 602 | def save_losses(train_loss_list, val_loss_list): 603 | out = {"train_loss": train_loss_list, "val_loss":val_loss_list} 604 | with open("losses.pkl", "wb") as log: 605 | pickle.dump(out, log) 606 | 607 | def validate(val_loader, model, discriminator, criterion_L1, criterion_MSE, 608 | criterion_berHu, criterion_GAN, batch_size, train_iter): 609 | model.eval() # switch to evaluate mode 610 | #discriminator.eval() 611 | 612 | valid_T = torch.ones(batch_size, 1).cuda() 613 | zeros_T = torch.zeros(batch_size, 1).cuda() 614 | 615 | #num_batches = len(val_loader) // batch_size 616 | total_losses = {"l1":0, "mse":0, "berHu":0, "adv":0} 617 | num_batches = 25 618 | for i in range(num_batches): 619 | 620 | input, target = next(val_loader.get_one_batch(batch_size)) 621 | input, target = input.float(), target.float() 622 | input, target = input.cuda(), target.cuda() 623 | 624 | torch.cuda.synchronize() 625 | 626 | # compute output 627 | end = time.time() 628 | with torch.no_grad(): 629 | pred = model(input) 630 | 631 | torch.cuda.synchronize() 632 | 633 | loss_L1 = criterion_L1(pred, target) 634 | loss_MSE = criterion_MSE(pred, target) 635 | loss_berHu = criterion_berHu(pred, target) 636 | ''' 637 | loss_adv = 0 638 | with torch.no_grad(): 639 | for a in range(3): 640 | for b in range(9): 641 | row = 30 * a 642 | col = 30 * b 643 | patch_fake = pred[:, :, row:row+30, col:col+30] 644 | pred_fake = discriminator(patch_fake) 645 | loss_adv += criterion_GAN(pred_fake, valid_T) 646 | ''' 647 | total_losses["l1"] += loss_L1.item() 648 | total_losses["mse"] += loss_MSE.item() 649 | total_losses["berHu"] += loss_berHu.item() 650 | #total_losses["adv"] += loss_adv.item() 651 | 652 | if i==0: 653 | save_image(model, input, train_iter, "val") 654 | 655 | for key in total_losses.keys(): 656 | total_losses[key] /= (num_batches * batch_size) 657 | 658 | model.train() 659 | #discriminator.train() 660 | return total_losses 661 | 662 | raw_data_dir = "" 663 | depth_maps_dir = "depth/" 664 | nyu_dir = "../cnn_depth_tensorflow/data/nyu_datasets/" 665 | print("=> Loading Data ...") 666 | train_loader = DataLoader(nyu_dir) 667 | val_loader = DataLoader(nyu_dir) 668 | 669 | print("=> creating Model") 670 | model = ResNet(layers=101, output_size=(90, 270), pretrained=True) 671 | discriminator = Discriminator(3) 672 | discriminator.apply(weights_init) 673 | 674 | print("=> model created.") 675 | start_epoch = 0 676 | init_lr = 0.001 677 | 678 | train_params = [{'params': model.get_1x_lr_params(), 'lr': init_lr}, 679 | {'params': model.get_10x_lr_params(), 'lr': init_lr * 10}] 680 | 681 | optimizer = torch.optim.SGD(train_params, lr=init_lr) 682 | optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=init_lr) 683 | 684 | # You can use DataParallel() whether you use Multi-GPUs or not 685 | model = nn.DataParallel(model).cuda() 686 | #model = model.cuda() 687 | discriminator = discriminator.cuda() 688 | 689 | # Define Loss Function 690 | criterion_L1 = MaskedL1Loss() 691 | criterion_berHu = berHuLoss() 692 | criterion_MSE = MaskedMSELoss() 693 | criterion_GAN = nn.BCELoss() 694 | 695 | batch_size = 64 696 | val_frequency = 50 697 | 698 | for epoch in range(50): 699 | # Train the Model 700 | train(train_loader, val_loader, model, discriminator, criterion_L1, criterion_MSE, criterion_berHu, 701 | criterion_GAN, optimizer, optimizer_D, epoch, batch_size, val_frequency) 702 | 703 | # Save Checkpoint 704 | torch.save({ 705 | 'epoch': epoch, 706 | 'model_state_dict': model.state_dict(), 707 | 'optimizer_state_dict': optimizer.state_dict(), 708 | }, './ResNet.pth') 709 | 710 | -------------------------------------------------------------------------------- /prepare_data.py: -------------------------------------------------------------------------------- 1 | #encoding: utf-8 2 | import os 3 | import numpy as np 4 | import h5py 5 | from PIL import Image 6 | import random 7 | import wget 8 | 9 | 10 | def convert_nyu(path): 11 | imgdir = os.path.join("data", "nyu_datasets"); 12 | if not os.path.exists(imgdir): 13 | os.makedirs(imgdir) 14 | 15 | nyuurl = 'http://horatio.cs.nyu.edu/mit/silberman/nyu_depth_v2/nyu_depth_v2_labeled.mat' 16 | file = os.path.join("data", "nyu_depth_v2_labeled.mat") 17 | if not os.path.exists(file): 18 | filename = wget.download(nyuurl, out="data") 19 | print('\n downloaded: ', filename) 20 | 21 | print("load dataset: %s" % (path)) 22 | f = h5py.File(path) 23 | 24 | trains = [] 25 | for i, (image, depth) in enumerate(zip(f['images'], f['depths'])): 26 | ra_image = image.transpose(2, 1, 0) 27 | ra_depth = depth.transpose(1, 0) 28 | re_depth = (ra_depth/np.max(ra_depth))*255.0 29 | image_pil = Image.fromarray(np.uint8(ra_image)) 30 | depth_pil = Image.fromarray(np.uint8(re_depth)) 31 | image_name = os.path.join("data", "nyu_datasets", "%05d.jpg" % (i)) 32 | image_pil.save(image_name) 33 | depth_name = os.path.join("data", "nyu_datasets", "%05d.png" % (i)) 34 | depth_pil.save(depth_name) 35 | 36 | trains.append((image_name, depth_name)) 37 | 38 | random.shuffle(trains) 39 | 40 | if not os.path.exists('train.csv'): 41 | os.remove('train.csv') 42 | 43 | with open('train.csv', 'w') as output: 44 | for (image_name, depth_name) in trains: 45 | output.write("%s,%s" % (image_name, depth_name)) 46 | output.write("\n") 47 | 48 | if __name__ == '__main__': 49 | current_directory = os.getcwd() 50 | nyu_path = 'data/nyu_depth_v2_labeled.mat' 51 | convert_nyu(nyu_path) 52 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import cv2 3 | import torch 4 | import torch.nn as nn 5 | import torch.nn.functional as F 6 | import torchvision.models 7 | import collections 8 | import math 9 | import time 10 | import pickle 11 | 12 | from data_loader import DataLoader 13 | 14 | def weights_init(m): 15 | # Initialize filters with Gaussian random weights 16 | if isinstance(m, nn.Conv2d): 17 | n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels 18 | m.weight.data.normal_(0, math.sqrt(2. / n)) 19 | if m.bias is not None: 20 | m.bias.data.zero_() 21 | elif isinstance(m, nn.ConvTranspose2d): 22 | n = m.kernel_size[0] * m.kernel_size[1] * m.in_channels 23 | m.weight.data.normal_(0, math.sqrt(2. / n)) 24 | if m.bias is not None: 25 | m.bias.data.zero_() 26 | elif isinstance(m, nn.BatchNorm2d): 27 | m.weight.data.fill_(1) 28 | m.bias.data.zero_() 29 | 30 | 31 | class Unpool(nn.Module): 32 | # Unpool: 2*2 unpooling with zero padding 33 | def __init__(self, num_channels, stride=2): 34 | super(Unpool, self).__init__() 35 | 36 | self.num_channels = num_channels 37 | self.stride = stride 38 | 39 | def forward(self, x): 40 | weights = torch.zeros(self.num_channels, 1, self.stride, self.stride) 41 | if torch.cuda.is_available(): 42 | weights = weights.cuda() 43 | weights[:, :, 0, 0] = 1 44 | return F.conv_transpose2d(x, weights, stride=self.stride, groups=self.num_channels) 45 | 46 | 47 | class Decoder(nn.Module): 48 | names = ['deconv2', 'deconv3', 'upconv', 'upproj'] 49 | 50 | def __init__(self): 51 | super(Decoder, self).__init__() 52 | 53 | self.layer1 = None 54 | self.layer2 = None 55 | self.layer3 = None 56 | self.layer4 = None 57 | 58 | def forward(self, x): 59 | x = self.layer1(x) 60 | x = self.layer2(x) 61 | x = self.layer3(x) 62 | x = self.layer4(x) 63 | return x 64 | 65 | 66 | class DeConv(Decoder): 67 | def __init__(self, in_channels, kernel_size): 68 | assert kernel_size >= 2, "kernel_size out of range: {}".format(kernel_size) 69 | super(DeConv, self).__init__() 70 | 71 | def convt(in_channels): 72 | stride = 2 73 | padding = (kernel_size - 1) // 2 74 | output_padding = kernel_size % 2 75 | assert -2 - 2 * padding + kernel_size + output_padding == 0, "deconv parameters incorrect" 76 | 77 | module_name = "deconv{}".format(kernel_size) 78 | return nn.Sequential(collections.OrderedDict([ 79 | (module_name, nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size, 80 | stride, padding, output_padding, bias=False)), 81 | ('batchnorm', nn.BatchNorm2d(in_channels // 2)), 82 | ('relu', nn.ReLU(inplace=True)), 83 | ])) 84 | 85 | self.layer1 = convt(in_channels) 86 | self.layer2 = convt(in_channels // 2) 87 | self.layer3 = convt(in_channels // (2 ** 2)) 88 | self.layer4 = convt(in_channels // (2 ** 3)) 89 | 90 | 91 | class UpConv(Decoder): 92 | # UpConv decoder consists of 4 upconv modules with decreasing number of channels and increasing feature map size 93 | def upconv_module(self, in_channels): 94 | # UpConv module: unpool -> 5*5 conv -> batchnorm -> ReLU 95 | upconv = nn.Sequential(collections.OrderedDict([ 96 | ('unpool', Unpool(in_channels)), 97 | ('conv', nn.Conv2d(in_channels, in_channels // 2, kernel_size=5, stride=1, padding=2, bias=False)), 98 | ('batchnorm', nn.BatchNorm2d(in_channels // 2)), 99 | ('relu', nn.ReLU()), 100 | ])) 101 | return upconv 102 | 103 | def __init__(self, in_channels): 104 | super(UpConv, self).__init__() 105 | self.layer1 = self.upconv_module(in_channels) 106 | self.layer2 = self.upconv_module(in_channels // 2) 107 | self.layer3 = self.upconv_module(in_channels // 4) 108 | self.layer4 = self.upconv_module(in_channels // 8) 109 | 110 | 111 | class FasterUpConv(Decoder): 112 | # Faster Upconv using pixelshuffle 113 | 114 | class faster_upconv_module(nn.Module): 115 | 116 | def __init__(self, in_channel): 117 | super(FasterUpConv.faster_upconv_module, self).__init__() 118 | 119 | self.conv1_ = nn.Sequential(collections.OrderedDict([ 120 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=3)), 121 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 122 | ])) 123 | 124 | self.conv2_ = nn.Sequential(collections.OrderedDict([ 125 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(2, 3))), 126 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 127 | ])) 128 | 129 | self.conv3_ = nn.Sequential(collections.OrderedDict([ 130 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(3, 2))), 131 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 132 | ])) 133 | 134 | self.conv4_ = nn.Sequential(collections.OrderedDict([ 135 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=2)), 136 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 137 | ])) 138 | 139 | self.ps = nn.PixelShuffle(2) 140 | self.relu = nn.ReLU(inplace=True) 141 | 142 | def forward(self, x): 143 | # print('Upmodule x size = ', x.size()) 144 | x1 = self.conv1_(nn.functional.pad(x, (1, 1, 1, 1))) 145 | x2 = self.conv2_(nn.functional.pad(x, (1, 1, 0, 1))) 146 | x3 = self.conv3_(nn.functional.pad(x, (0, 1, 1, 1))) 147 | x4 = self.conv4_(nn.functional.pad(x, (0, 1, 0, 1))) 148 | 149 | x = torch.cat((x1, x2, x3, x4), dim=1) 150 | 151 | output = self.ps(x) 152 | output = self.relu(output) 153 | 154 | return output 155 | 156 | def __init__(self, in_channel): 157 | super(FasterUpConv, self).__init__() 158 | 159 | self.layer1 = self.faster_upconv_module(in_channel) 160 | self.layer2 = self.faster_upconv_module(in_channel // 2) 161 | self.layer3 = self.faster_upconv_module(in_channel // 4) 162 | self.layer4 = self.faster_upconv_module(in_channel // 8) 163 | 164 | 165 | class UpProj(Decoder): 166 | # UpProj decoder consists of 4 upproj modules with decreasing number of channels and increasing feature map size 167 | 168 | class UpProjModule(nn.Module): 169 | # UpProj module has two branches, with a Unpool at the start and a ReLu at the end 170 | # upper branch: 5*5 conv -> batchnorm -> ReLU -> 3*3 conv -> batchnorm 171 | # bottom branch: 5*5 conv -> batchnorm 172 | 173 | def __init__(self, in_channels): 174 | super(UpProj.UpProjModule, self).__init__() 175 | out_channels = in_channels // 2 176 | self.unpool = Unpool(in_channels) 177 | self.upper_branch = nn.Sequential(collections.OrderedDict([ 178 | ('conv1', nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False)), 179 | ('batchnorm1', nn.BatchNorm2d(out_channels)), 180 | ('relu', nn.ReLU()), 181 | ('conv2', nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)), 182 | ('batchnorm2', nn.BatchNorm2d(out_channels)), 183 | ])) 184 | self.bottom_branch = nn.Sequential(collections.OrderedDict([ 185 | ('conv', nn.Conv2d(in_channels, out_channels, kernel_size=5, stride=1, padding=2, bias=False)), 186 | ('batchnorm', nn.BatchNorm2d(out_channels)), 187 | ])) 188 | self.relu = nn.ReLU() 189 | 190 | def forward(self, x): 191 | x = self.unpool(x) 192 | x1 = self.upper_branch(x) 193 | x2 = self.bottom_branch(x) 194 | x = x1 + x2 195 | x = self.relu(x) 196 | return x 197 | 198 | def __init__(self, in_channels): 199 | super(UpProj, self).__init__() 200 | self.layer1 = self.UpProjModule(in_channels) 201 | self.layer2 = self.UpProjModule(in_channels // 2) 202 | self.layer3 = self.UpProjModule(in_channels // 4) 203 | self.layer4 = self.UpProjModule(in_channels // 8) 204 | 205 | 206 | class FasterUpProj(Decoder): 207 | # Faster UpProj decorder using pixelshuffle 208 | 209 | class faster_upconv(nn.Module): 210 | 211 | def __init__(self, in_channel): 212 | super(FasterUpProj.faster_upconv, self).__init__() 213 | 214 | self.conv1_ = nn.Sequential(collections.OrderedDict([ 215 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=3)), 216 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 217 | ])) 218 | 219 | self.conv2_ = nn.Sequential(collections.OrderedDict([ 220 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(2, 3))), 221 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 222 | ])) 223 | 224 | self.conv3_ = nn.Sequential(collections.OrderedDict([ 225 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=(3, 2))), 226 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 227 | ])) 228 | 229 | self.conv4_ = nn.Sequential(collections.OrderedDict([ 230 | ('conv1', nn.Conv2d(in_channel, in_channel // 2, kernel_size=2)), 231 | ('bn1', nn.BatchNorm2d(in_channel // 2)), 232 | ])) 233 | 234 | self.ps = nn.PixelShuffle(2) 235 | self.relu = nn.ReLU(inplace=True) 236 | 237 | def forward(self, x): 238 | # print('Upmodule x size = ', x.size()) 239 | x1 = self.conv1_(nn.functional.pad(x, (1, 1, 1, 1))) 240 | x2 = self.conv2_(nn.functional.pad(x, (1, 1, 0, 1))) 241 | x3 = self.conv3_(nn.functional.pad(x, (0, 1, 1, 1))) 242 | x4 = self.conv4_(nn.functional.pad(x, (0, 1, 0, 1))) 243 | # print(x1.size(), x2.size(), x3.size(), x4.size()) 244 | 245 | x = torch.cat((x1, x2, x3, x4), dim=1) 246 | 247 | x = self.ps(x) 248 | return x 249 | 250 | class FasterUpProjModule(nn.Module): 251 | def __init__(self, in_channels): 252 | super(FasterUpProj.FasterUpProjModule, self).__init__() 253 | out_channels = in_channels // 2 254 | 255 | self.upper_branch = nn.Sequential(collections.OrderedDict([ 256 | ('faster_upconv', FasterUpProj.faster_upconv(in_channels)), 257 | ('relu', nn.ReLU(inplace=True)), 258 | ('conv', nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)), 259 | ('batchnorm', nn.BatchNorm2d(out_channels)), 260 | ])) 261 | self.bottom_branch = FasterUpProj.faster_upconv(in_channels) 262 | self.relu = nn.ReLU(inplace=True) 263 | 264 | def forward(self, x): 265 | x1 = self.upper_branch(x) 266 | x2 = self.bottom_branch(x) 267 | x = x1 + x2 268 | x = self.relu(x) 269 | return x 270 | 271 | def __init__(self, in_channel): 272 | super(FasterUpProj, self).__init__() 273 | 274 | self.layer1 = self.FasterUpProjModule(in_channel) 275 | self.layer2 = self.FasterUpProjModule(in_channel // 2) 276 | self.layer3 = self.FasterUpProjModule(in_channel // 4) 277 | self.layer4 = self.FasterUpProjModule(in_channel // 8) 278 | 279 | 280 | def choose_decoder(decoder, in_channels): 281 | if decoder[:6] == 'deconv': 282 | assert len(decoder) == 7 283 | kernel_size = int(decoder[6]) 284 | return DeConv(in_channels, kernel_size) 285 | elif decoder == "upproj": 286 | return UpProj(in_channels) 287 | elif decoder == "upconv": 288 | return UpConv(in_channels) 289 | elif decoder == "fasterupproj": 290 | return FasterUpProj(in_channels) 291 | else: 292 | assert False, "invalid option for decoder: {}".format(decoder) 293 | 294 | class ResNet(nn.Module): 295 | def __init__(self, dataset = 'kitti', layers = 50, decoder = 'upproj', output_size=(228, 304), in_channels=3, pretrained=True): 296 | 297 | if layers not in [18, 34, 50, 101, 152]: 298 | raise RuntimeError( 299 | 'Only 18, 34, 50, 101, and 152 layer model are defined for ResNet. Got {}'.format(layers)) 300 | 301 | super(ResNet, self).__init__() 302 | pretrained_model = torchvision.models.__dict__['resnet{}'.format(layers)](pretrained=pretrained) 303 | 304 | if in_channels == 3: 305 | self.conv1 = pretrained_model._modules['conv1'] 306 | self.bn1 = pretrained_model._modules['bn1'] 307 | else: 308 | self.conv1 = nn.Conv2d(in_channels, 64, kernel_size=7, stride=2, padding=3, bias=False) 309 | self.bn1 = nn.BatchNorm2d(64) 310 | weights_init(self.conv1) 311 | weights_init(self.bn1) 312 | 313 | self.output_size = output_size 314 | 315 | self.relu = pretrained_model._modules['relu'] 316 | self.maxpool = pretrained_model._modules['maxpool'] 317 | self.layer1 = pretrained_model._modules['layer1'] 318 | self.layer2 = pretrained_model._modules['layer2'] 319 | self.layer3 = pretrained_model._modules['layer3'] 320 | self.layer4 = pretrained_model._modules['layer4'] 321 | 322 | # clear memory 323 | del pretrained_model 324 | 325 | # define number of intermediate channels 326 | if layers <= 34: 327 | num_channels = 512 328 | elif layers >= 50: 329 | num_channels = 2048 330 | 331 | self.conv2 = nn.Conv2d(num_channels, num_channels // 2, kernel_size=1, bias=False) 332 | self.bn2 = nn.BatchNorm2d(num_channels // 2) 333 | 334 | self.upSample = choose_decoder(decoder, num_channels // 2) 335 | 336 | # setting bias=true doesn't improve accuracy 337 | self.conv3 = nn.Conv2d(num_channels // 32, 3, kernel_size=3, stride=1, padding=1, bias=False) 338 | self.bilinear = nn.Upsample(size=self.output_size, mode='bilinear', align_corners=True) 339 | 340 | # weight init 341 | self.conv2.apply(weights_init) 342 | self.bn2.apply(weights_init) 343 | 344 | self.upSample.apply(weights_init) 345 | 346 | self.conv3.apply(weights_init) 347 | 348 | def forward(self, x): 349 | # resnet 350 | x = self.conv1(x) 351 | x = self.bn1(x) 352 | x = self.relu(x) 353 | x = self.maxpool(x) 354 | x1 = self.layer1(x) 355 | x2 = self.layer2(x1) 356 | x3 = self.layer3(x2) 357 | x4 = self.layer4(x3) 358 | 359 | x = self.conv2(x4) 360 | x = self.bn2(x) 361 | 362 | x = self.upSample(x) 363 | 364 | x = self.conv3(x) 365 | x = self.bilinear(x) 366 | 367 | return x 368 | 369 | def get_1x_lr_params(self): 370 | """ 371 | This generator returns all the parameters of the net layer whose learning rate is 1x lr. 372 | """ 373 | b = [self.conv1, self.bn1, self.relu, self.maxpool, self.layer1, self.layer2, self.layer3, self.layer4] 374 | for i in range(len(b)): 375 | for k in b[i].parameters(): 376 | if k.requires_grad: 377 | yield k 378 | 379 | def get_10x_lr_params(self): 380 | """ 381 | This generator returns all the parameters of the net layer whose learning rate is 20x lr. 382 | """ 383 | b = [self.conv2, self.bn2, self.upSample, self.conv3, self.bilinear] 384 | for j in range(len(b)): 385 | for k in b[j].parameters(): 386 | if k.requires_grad: 387 | yield k 388 | 389 | 390 | class Discriminator(nn.Module): 391 | """ 392 | Discriminator for FCRN 393 | """ 394 | def __init__(self, n_in): 395 | super(Discriminator, self).__init__() 396 | self.n_in = n_in 397 | self.modules = [] 398 | 399 | self.modules += [ nn.Conv2d(self.n_in, 32, kernel_size=3, stride=(1, 1), padding=(2, 2)), 400 | nn.MaxPool2d(kernel_size=(2, 2)), 401 | nn.LeakyReLU(0.2, True), 402 | nn.Conv2d(32, 32, 3, 1, 1), 403 | nn.MaxPool2d(kernel_size=(2,2)), 404 | nn.LeakyReLU(0.2, True), 405 | nn.Conv2d(32, 32, 3, 1, 1), 406 | nn.MaxPool2d(kernel_size=(2,2)), 407 | nn.LeakyReLU(0.2, True), 408 | nn.Conv2d(32, 32, 3, 1, 1), 409 | nn.MaxPool2d(kernel_size=(2,2)), 410 | nn.LeakyReLU(0.2, True), 411 | ] 412 | 413 | self.model = nn.Sequential(*self.modules) 414 | self.fc = nn.Linear(32 * 4, 1) 415 | 416 | def forward(self, x): 417 | x = self.model(x) 418 | x = x.view(x.size(0), -1) 419 | x = self.fc(x) 420 | return torch.sigmoid(x) 421 | 422 | 423 | """ 424 | Define Loss functions here 425 | """ 426 | class ScaleInvariantError(nn.Module): 427 | """ 428 | Scale invariant error defined in Eigen's paper! 429 | """ 430 | 431 | def __init__(self, lamada=0.5): 432 | super(ScaleInvariantError, self).__init__() 433 | self.lamada = lamada 434 | return 435 | 436 | def forward(self, y_true, y_pred): 437 | first_log = torch.log(torch.clamp(y_pred, 0, 1)) 438 | second_log = torch.log(torch.clamp(y_true, 0, 1)) 439 | d = first_log - second_log 440 | loss = torch.mean(d * d) - self.lamada * torch.mean(d) * torch.mean(d) 441 | return loss 442 | 443 | 444 | class MaskedMSELoss(nn.Module): 445 | def __init__(self): 446 | super(MaskedMSELoss, self).__init__() 447 | 448 | def forward(self, pred, target): 449 | assert pred.dim() == target.dim(), "inconsistent dimensions" 450 | valid_mask = (target > 0).detach() 451 | diff = target - pred 452 | diff = diff[valid_mask] 453 | self.loss = (diff ** 2).mean() 454 | return self.loss 455 | 456 | 457 | class MaskedL1Loss(nn.Module): 458 | def __init__(self): 459 | super(MaskedL1Loss, self).__init__() 460 | 461 | def forward(self, pred, target): 462 | assert pred.dim() == target.dim(), "inconsistent dimensions" 463 | valid_mask = (target > 0).detach() 464 | diff = target - pred 465 | diff = diff[valid_mask] 466 | self.loss = diff.abs().mean() 467 | return self.loss 468 | 469 | 470 | class berHuLoss(nn.Module): 471 | def __init__(self): 472 | super(berHuLoss, self).__init__() 473 | 474 | def forward(self, pred, target): 475 | assert pred.dim() == target.dim(), "inconsistent dimensions" 476 | 477 | huber_c = torch.max(pred - target) 478 | huber_c = 0.2 * huber_c 479 | 480 | valid_mask = (target > 0).detach() 481 | diff = target - pred 482 | diff = diff[valid_mask] 483 | diff = diff.abs() 484 | 485 | huber_mask = (diff > huber_c).detach() 486 | 487 | diff2 = diff[huber_mask] 488 | diff2 = diff2 ** 2 489 | 490 | self.loss = torch.cat((diff, diff2)).mean() 491 | 492 | return self.loss 493 | 494 | 495 | def set_requires_grad(net, requires_grad=False): 496 | if net is not None: 497 | for param in net.parameters(): 498 | param.requires_grad = requires_grad 499 | 500 | def save_image(model, x, batch, mode="train"): 501 | pred = model(x) 502 | pred *= 100 503 | npimg = pred.cpu().detach().numpy() 504 | npimg = np.transpose(npimg, (0, 2, 3, 1)) 505 | cv2.imwrite('saved_images/%s_image_%d.jpg'%(mode, batch), npimg[0]) 506 | 507 | 508 | def train(train_loader, val_loader, model, discriminator, criterion_L1, criterion_MSE, 509 | criterion_berHu, criterion_GAN, optimizer, optimizer_D, epoch, batch_size, val_frequency=10): 510 | model.train() # switch to train mode 511 | eval_mode = False 512 | num_batches = len(train_loader)// batch_size 513 | init_lr = optimizer.param_groups[0]['lr'] 514 | 515 | total_losses_log = {"l1":0, "mse":0, "berHu":0, "adv":0} 516 | 517 | valid_T = torch.ones(batch_size, 1).cuda() 518 | zeros_T = torch.zeros(batch_size, 1).cuda() 519 | 520 | train_loss_list = [] 521 | val_loss_list = [] 522 | 523 | for iter_ in range(num_batches): 524 | # Adjust Learning Rate 525 | #if iter_ % 1000 == 0 and optimizer.param_groups[0]['lr'] > init_lr/10.0: 526 | # for param_group in optimizer.param_groups: 527 | # param_group['lr'] *= 0.98 528 | 529 | input, target = next(train_loader.get_one_batch(batch_size)) 530 | input, target = input.float(), target.float() 531 | input, target = input.cuda(), target.cuda() 532 | torch.cuda.synchronize() 533 | 534 | optimizer.zero_grad() 535 | 536 | pred = model(input) 537 | 538 | loss_L1 = criterion_L1(pred, target) 539 | loss_MSE = criterion_MSE(pred, target) 540 | loss_berHu = criterion_berHu(pred, target) 541 | #loss_SI = criterion_SI(pred, target) 542 | 543 | set_requires_grad(discriminator, False) 544 | 545 | loss_adv = 0 546 | 547 | for a in range(3): 548 | for b in range(9): 549 | row = 30 * a 550 | col = 30 * b 551 | patch_fake = pred[:, :, row:row+30, col:col+30] 552 | pred_fake = discriminator(patch_fake) 553 | loss_adv += criterion_GAN(pred_fake, valid_T) 554 | 555 | loss_gen = loss_L1 + loss_adv 556 | loss_gen.backward() 557 | optimizer.step() 558 | 559 | set_requires_grad(discriminator, True) 560 | optimizer_D.zero_grad() 561 | loss_D = 0 562 | for a in range(3): 563 | for b in range(9): 564 | row = 30 * a 565 | col = 30 * b 566 | patch_fake = pred[:, :, row:row+30, col:col+30] 567 | patch_real = target[:, :, row:row+30, col:col+30] 568 | pred_fake = discriminator(patch_fake.detach()) 569 | pred_real = discriminator(patch_real) 570 | loss_D_fake = criterion_GAN(pred_fake, zeros_T) 571 | loss_D_real = criterion_GAN(pred_real, valid_T) 572 | loss_D += 0.5 * (loss_D_fake + loss_D_real) 573 | 574 | loss_D.backward() 575 | optimizer_D.step() 576 | 577 | torch.cuda.synchronize() 578 | 579 | total_losses_log["l1"] += loss_L1.item() 580 | total_losses_log["mse"] += loss_MSE.item() 581 | total_losses_log["berHu"] += loss_berHu.item() 582 | total_losses_log["adv"] += loss_adv.item() 583 | 584 | if (iter_ + 1) % 10 == 0: 585 | save_image(model, input, iter_) 586 | print('Train Epoch: {} Batch: [{}/{}], ADV:{:0.3f} L1 ={:0.3f}, MSE={:0.3f}, berHu={:0.3f}, Disc:{:0.3f}'.format( 587 | epoch, iter_ + 1, num_batches, loss_adv.item(), 588 | loss_L1.item(), loss_MSE.item(), loss_berHu.item(), loss_D.item())) 589 | 590 | if (iter_ + 1) % val_frequency == 0: 591 | val_loss = validate(val_loader, model, discriminator, criterion_L1, criterion_MSE, criterion_berHu, criterion_GAN, batch_size, iter_) 592 | for key in total_losses_log.keys(): 593 | total_losses_log[key] /= (val_frequency * batch_size) 594 | train_loss_list.append(total_losses_log) 595 | val_loss_list.append(val_loss) 596 | save_losses(train_loss_list, val_loss_list) 597 | print("TRAIN:- ", total_losses_log) 598 | print("VAL :- ", val_loss) 599 | total_losses_log = {"l1":0, "mse":0, "berHu":0, "adv":0} 600 | 601 | def save_losses(train_loss_list, val_loss_list): 602 | out = {"train_loss": train_loss_list, "val_loss":val_loss_list} 603 | with open("losses.pkl", "wb") as log: 604 | pickle.dump(out, log) 605 | 606 | def validate(val_loader, model, discriminator, criterion_L1, criterion_MSE, 607 | criterion_berHu, criterion_GAN, batch_size, train_iter): 608 | model.eval() # switch to evaluate mode 609 | discriminator.eval() 610 | 611 | valid_T = torch.ones(batch_size, 1).cuda() 612 | zeros_T = torch.zeros(batch_size, 1).cuda() 613 | 614 | #num_batches = len(val_loader) // batch_size 615 | total_losses = {"l1":0, "mse":0, "berHu":0, "adv":0} 616 | num_batches = 25 617 | for i in range(num_batches): 618 | 619 | input, target = next(val_loader.get_one_batch(batch_size)) 620 | input, target = input.float(), target.float() 621 | input, target = input.cuda(), target.cuda() 622 | 623 | torch.cuda.synchronize() 624 | 625 | # compute output 626 | end = time.time() 627 | with torch.no_grad(): 628 | pred = model(input) 629 | 630 | torch.cuda.synchronize() 631 | 632 | loss_L1 = criterion_L1(pred, target) 633 | loss_MSE = criterion_MSE(pred, target) 634 | loss_berHu = criterion_berHu(pred, target) 635 | 636 | loss_adv = 0 637 | with torch.no_grad(): 638 | for a in range(3): 639 | for b in range(9): 640 | row = 30 * a 641 | col = 30 * b 642 | patch_fake = pred[:, :, row:row+30, col:col+30] 643 | pred_fake = discriminator(patch_fake) 644 | loss_adv += criterion_GAN(pred_fake, valid_T) 645 | 646 | total_losses["l1"] += loss_L1.item() 647 | total_losses["mse"] += loss_MSE.item() 648 | total_losses["berHu"] += loss_berHu.item() 649 | total_losses["adv"] += loss_adv.item() 650 | 651 | if i==0: 652 | save_image(model, input, train_iter, "val") 653 | for key in total_losses.keys(): 654 | total_losses[key] /= (num_batches * batch_size) 655 | model.train() 656 | discriminator.train() 657 | return total_losses 658 | 659 | raw_data_dir = "" 660 | depth_maps_dir = "" 661 | print("=> Loading Data ...") 662 | train_loader = DataLoader(raw_data_dir, depth_maps_dir) 663 | val_loader = DataLoader(raw_data_dir, depth_maps_dir, mode = "val") 664 | 665 | print("=> creating Model") 666 | model = ResNet(layers=152, output_size=(90, 270), pretrained=True) 667 | discriminator = Discriminator(3) 668 | discriminator.apply(weights_init) 669 | 670 | print("=> model created.") 671 | start_epoch = 0 672 | init_lr = 0.001 673 | 674 | train_params = [{'params': model.get_1x_lr_params(), 'lr': init_lr}, 675 | {'params': model.get_10x_lr_params(), 'lr': init_lr * 10}] 676 | 677 | optimizer = torch.optim.SGD(train_params, lr=init_lr, weight_decay=4e-5) 678 | optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=init_lr) 679 | 680 | # You can use DataParallel() whether you use Multi-GPUs or not 681 | model = nn.DataParallel(model).cuda() 682 | discriminator = discriminator.cuda() 683 | 684 | # Define Loss Function 685 | criterion_L1 = MaskedL1Loss() 686 | criterion_berHu = berHuLoss() 687 | # criterion_SI = ScaleInvariantError() 688 | criterion_MSE = MaskedMSELoss() 689 | criterion_GAN = nn.BCELoss() 690 | 691 | batch_size = 64 692 | val_frequency = 100 693 | 694 | for epoch in range(10): 695 | # Train the Model 696 | train(train_loader, val_loader, model, discriminator, criterion_L1, criterion_MSE, criterion_berHu, 697 | criterion_GAN, optimizer, optimizer_D, epoch, batch_size, val_frequency) 698 | 699 | # Save Checkpoint 700 | torch.save({ 701 | 'epoch': epoch, 702 | 'model_state_dict': model.state_dict(), 703 | 'optimizer_state_dict': optimizer.state_dict(), 704 | }, './ResNet.pth') 705 | -------------------------------------------------------------------------------- /train_dorn.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import shutil 3 | import socket 4 | import time 5 | import torch 6 | from tensorboardX import SummaryWriter 7 | from torch.optim import lr_scheduler 8 | 9 | from data_loader import KittiData 10 | from dorn.evaluation import AverageMeter, Result 11 | import utils 12 | import dorn.criterion as criteria 13 | import os 14 | import torch.nn as nn 15 | 16 | from dorn.networks import DORN 17 | 18 | 19 | # set device 20 | device = "cuda" if torch.cuda.is_available() else "cpu" 21 | 22 | best_result = Result() 23 | best_result.set_to_worst() 24 | 25 | raw_data_dir = "data/" 26 | depth_maps_dir = "data/depth_maps/" 27 | output_directory = "checkpoints/" 28 | epoch_file = "epoch.txt" 29 | 30 | 31 | def create_loader(opts): 32 | train_set = KittiData(raw_data_dir, depth_maps_dir) 33 | val_set = KittiData(raw_data_dir, depth_maps_dir, mode='val') 34 | train_loader = torch.utils.data.DataLoader(train_set, batch_size=opts.batch_size, shuffle=True, pin_memory=True) 35 | val_loader = torch.utils.data.DataLoader(val_set, batch_size=1, shuffle=False, pin_memory=True) 36 | return train_loader, val_loader 37 | 38 | 39 | def main(): 40 | global best_result 41 | model = DORN() 42 | opts = utils.get_opts() 43 | epoch_tracker = utils.EpochTracker(epoch_file) 44 | 45 | train_loader, val_loader = create_loader(opts) 46 | 47 | name = output_directory + 'checkpoint-' + str(epoch_tracker.epoch) + '.pth.tar' 48 | if os.path.exists(name): 49 | checkpoint = torch.load(name) 50 | 51 | start_epoch = checkpoint['epoch'] + 1 52 | best_result = checkpoint['best_result'] 53 | optimizer = checkpoint['optimizer'] 54 | iteration = checkpoint['iteration'] 55 | 56 | # solve 'out of memory' 57 | model = checkpoint['model'] 58 | 59 | print("=> loaded checkpoint (epoch {})".format(checkpoint['epoch'])) 60 | 61 | # clear memory 62 | del checkpoint 63 | # del model_dict 64 | if torch.cuda.is_available(): 65 | torch.cuda.empty_cache() 66 | else: 67 | start_epoch = 0 68 | iteration = 0 69 | # different modules have different learning rate 70 | train_params = [{'params': model.get_1x_lr_params(), 'lr': opts.lr}, 71 | {'params': model.get_10x_lr_params(), 'lr': opts.lr * 10}] 72 | 73 | optimizer = torch.optim.SGD(train_params, lr=opts.lr, momentum=opts.momentum, weight_decay=opts.weight_decay) 74 | 75 | # You can use DataParallel() whether you use Multi-GPUs or not 76 | if torch.cuda.is_available(): 77 | model = nn.DataParallel(model).cuda() 78 | 79 | # when training, use reduceLROnPlateau to reduce learning rate 80 | scheduler = lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=opts.lr_patience) 81 | 82 | # loss function 83 | criterion = criteria.ordLoss(device) 84 | 85 | if not os.path.exists(output_directory): 86 | os.makedirs(output_directory) 87 | 88 | best_txt = os.path.join(output_directory, 'best.txt') 89 | config_txt = os.path.join(output_directory, 'config.txt') 90 | 91 | # create log 92 | log_path = os.path.join(output_directory, 'logs', 93 | datetime.now().strftime('%b%d_%H-%M-%S') + '_' + socket.gethostname()) 94 | if os.path.isdir(log_path): 95 | shutil.rmtree(log_path) 96 | os.makedirs(log_path) 97 | logger = SummaryWriter(log_path) 98 | 99 | for epoch in range(start_epoch, opts.epochs): 100 | 101 | # remember change of the learning rate 102 | for i, param_group in enumerate(optimizer.param_groups): 103 | old_lr = float(param_group['lr']) 104 | logger.add_scalar('Lr/lr_' + str(i), old_lr, epoch) 105 | 106 | train(train_loader, model, criterion, optimizer, epoch, logger, device, opts, iteration) # train for one epoch 107 | result, img_merge = validate(val_loader, model, epoch, logger, opts) # evaluate on validation set 108 | iteration = 0 109 | # remember best rmse and save checkpoint 110 | is_best = result.rmse < best_result.rmse 111 | if is_best: 112 | best_result = result 113 | with open(best_txt, 'w') as txtfile: 114 | txtfile.write( 115 | "epoch={}, rmse={:.3f}, rml={:.3f}, log10={:.3f}, d1={:.3f}, d2={:.3f}, dd31={:.3f}, " 116 | "t_gpu={:.4f}". 117 | format(epoch, result.rmse, result.absrel, result.lg10, result.delta1, result.delta2, 118 | result.delta3, 119 | result.gpu_time)) 120 | if img_merge is not None: 121 | img_filename = output_directory + '/comparison_best.png' 122 | utils.save_image(img_merge, img_filename) 123 | 124 | # save checkpoint for each epoch 125 | utils.save_checkpoint({ 126 | 'args': opts, 127 | 'epoch': epoch, 128 | 'model': model, 129 | 'best_result': best_result, 130 | 'optimizer': optimizer, 131 | 'iteration': iteration 132 | }, is_best, epoch, output_directory) 133 | 134 | epoch_tracker.write(epoch) 135 | # when rml doesn't fall, reduce learning rate 136 | scheduler.step(result.absrel) 137 | 138 | logger.close() 139 | 140 | 141 | # train 142 | def train(train_loader, model, criterion, optimizer, epoch, logger, device, opts, iteration): 143 | average_meter = AverageMeter() 144 | model.train() # switch to train mode 145 | end = time.time() 146 | 147 | batch_num = len(train_loader) 148 | 149 | for i, (input, target) in enumerate(train_loader): 150 | if i < iteration: 151 | continue 152 | 153 | input = input.to(device) 154 | target = target.to(device) 155 | 156 | if torch.cuda.is_available(): 157 | torch.cuda.synchronize() 158 | data_time = time.time() - end 159 | 160 | # compute pred 161 | end = time.time() 162 | 163 | with torch.autograd.detect_anomaly(): 164 | pred_d, pred_ord = model(input) 165 | target_c = utils.get_labels_sid(opts, target, device) # using sid, discretize the groundtruth 166 | loss = criterion(pred_ord, target_c) 167 | optimizer.zero_grad() 168 | loss.backward() # compute gradient and do SGD step 169 | optimizer.step() 170 | 171 | if torch.cuda.is_available(): 172 | torch.cuda.synchronize() 173 | 174 | gpu_time = time.time() - end 175 | 176 | # measure accuracy and record loss 177 | result = Result() 178 | depth = utils.get_depth_sid(opts, pred_d, device) 179 | result.evaluate(depth.data, target.data) 180 | average_meter.update(result, gpu_time, data_time, input.size(0)) 181 | end = time.time() 182 | 183 | if (i + 1) % opts.save_freq == 0: 184 | utils.save_checkpoint({ 185 | 'args': opts, 186 | 'epoch': epoch, 187 | 'model': model, 188 | 'best_result': best_result, 189 | 'optimizer': optimizer, 190 | 'iteration':i+1 191 | }, False, epoch, output_directory) 192 | 193 | if (i + 1) % opts.print_freq == 0: 194 | print('Train Epoch: {0} [{1}/{2}]\t' 195 | 't_Data={data_time:.3f}({average.data_time:.3f}) ' 196 | 't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\n\t' 197 | 'Loss={Loss:.5f} ' 198 | 'RMSE={result.rmse:.2f}({average.rmse:.2f}) ' 199 | 'RML={result.absrel:.2f}({average.absrel:.2f}) ' 200 | 'Log10={result.lg10:.3f}({average.lg10:.3f}) ' 201 | 'Delta1={result.delta1:.3f}({average.delta1:.3f}) ' 202 | 'Delta2={result.delta2:.3f}({average.delta2:.3f}) ' 203 | 'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format( 204 | epoch, i + 1, len(train_loader), data_time=data_time, 205 | gpu_time=gpu_time, Loss=loss.item(), result=result, average=average_meter.average())) 206 | current_step = epoch * batch_num + i 207 | logger.add_scalar('Train/RMSE', result.rmse, current_step) 208 | logger.add_scalar('Train/rml', result.absrel, current_step) 209 | logger.add_scalar('Train/Log10', result.lg10, current_step) 210 | logger.add_scalar('Train/Delta1', result.delta1, current_step) 211 | logger.add_scalar('Train/Delta2', result.delta2, current_step) 212 | logger.add_scalar('Train/Delta3', result.delta3, current_step) 213 | 214 | print("GPU:", torch.cuda.memory_allocated()) 215 | 216 | if torch.cuda.is_available(): 217 | torch.cuda.empty_cache() 218 | 219 | avg = average_meter.average() 220 | 221 | 222 | # validation 223 | def validate(val_loader, model, epoch, logger, opts): 224 | average_meter = AverageMeter() 225 | 226 | model.eval() # switch to evaluate mode 227 | 228 | end = time.time() 229 | 230 | skip = len(val_loader) // 9 # save images every skip iters 231 | 232 | for i, (input, target) in enumerate(val_loader): 233 | 234 | input, target = input.cuda(), target.cuda() 235 | torch.cuda.synchronize() 236 | data_time = time.time() - end 237 | 238 | # compute output 239 | end = time.time() 240 | with torch.no_grad(): 241 | pred, _ = model(input) 242 | 243 | torch.cuda.synchronize() 244 | gpu_time = time.time() - end 245 | 246 | # measure accuracy and record loss 247 | result = Result() 248 | pred = utils.get_depth_sid(opts, pred) 249 | result.evaluate(pred.data, target.data) 250 | 251 | average_meter.update(result, gpu_time, data_time, input.size(0)) 252 | end = time.time() 253 | 254 | # save 8 images for visualization 255 | rgb = input 256 | 257 | if i == 0: 258 | img_merge = utils.merge_into_row(rgb, target, pred) 259 | elif (i < 8 * skip) and (i % skip == 0): 260 | row = utils.merge_into_row(rgb, target, pred) 261 | img_merge = utils.add_row(img_merge, row) 262 | elif i == 8 * skip: 263 | filename = output_directory + '/comparison_' + str(epoch) + '.png' 264 | utils.save_image(img_merge, filename) 265 | 266 | if (i + 1) % opts.print_freq == 0: 267 | print('Test: [{0}/{1}]\t' 268 | 't_GPU={gpu_time:.3f}({average.gpu_time:.3f})\t' 269 | 'RMSE={result.rmse:.2f}({average.rmse:.2f}) ' 270 | 'RML={result.absrel:.2f}({average.absrel:.2f}) ' 271 | 'Log10={result.lg10:.3f}({average.lg10:.3f}) ' 272 | 'Delta1={result.delta1:.3f}({average.delta1:.3f}) ' 273 | 'Delta2={result.delta2:.3f}({average.delta2:.3f}) ' 274 | 'Delta3={result.delta3:.3f}({average.delta3:.3f})'.format( 275 | i + 1, len(val_loader), gpu_time=gpu_time, result=result, average=average_meter.average())) 276 | 277 | avg = average_meter.average() 278 | 279 | print('\n*\n' 280 | 'RMSE={average.rmse:.3f}\n' 281 | 'Rel={average.absrel:.3f}\n' 282 | 'Log10={average.lg10:.3f}\n' 283 | 'Delta1={average.delta1:.3f}\n' 284 | 'Delta2={average.delta2:.3f}\n' 285 | 'Delta3={average.delta3:.3f}\n' 286 | 't_GPU={time:.3f}\n'.format( 287 | average=avg, time=avg.gpu_time)) 288 | 289 | logger.add_scalar('Test/rmse', avg.rmse, epoch) 290 | logger.add_scalar('Test/Rel', avg.absrel, epoch) 291 | logger.add_scalar('Test/log10', avg.lg10, epoch) 292 | logger.add_scalar('Test/Delta1', avg.delta1, epoch) 293 | logger.add_scalar('Test/Delta2', avg.delta2, epoch) 294 | logger.add_scalar('Test/Delta3', avg.delta3, epoch) 295 | return avg, img_merge 296 | 297 | 298 | if __name__ == '__main__': 299 | main() 300 | -------------------------------------------------------------------------------- /train_patchgan.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | import torch.nn as nn 4 | import torch.nn.functional as F 5 | import torchvision.models 6 | import collections 7 | import math 8 | import time 9 | import pickle 10 | import matplotlib.pyplot as plt 11 | from PIL import Image 12 | from tensorboardX import SummaryWriter 13 | cmap = plt.cm.jet 14 | 15 | from nyu_dataloader import DataLoader 16 | import model 17 | from unet import UNet 18 | 19 | logger = SummaryWriter("runs/run1") 20 | 21 | def weights_init(m): 22 | # Initialize filters with Gaussian random weights 23 | if isinstance(m, nn.Conv2d): 24 | n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels 25 | m.weight.data.normal_(0, math.sqrt(2. / n)) 26 | if m.bias is not None: 27 | m.bias.data.zero_() 28 | elif isinstance(m, nn.ConvTranspose2d): 29 | n = m.kernel_size[0] * m.kernel_size[1] * m.in_channels 30 | m.weight.data.normal_(0, math.sqrt(2. / n)) 31 | if m.bias is not None: 32 | m.bias.data.zero_() 33 | elif isinstance(m, nn.BatchNorm2d): 34 | m.weight.data.fill_(1) 35 | m.bias.data.zero_() 36 | 37 | class MaskedMSELoss(nn.Module): 38 | def __init__(self): 39 | super(MaskedMSELoss, self).__init__() 40 | 41 | def forward(self, pred, target): 42 | assert pred.dim() == target.dim(), "inconsistent dimensions" 43 | valid_mask = (target > 0).detach() 44 | diff = target - pred 45 | diff = diff[valid_mask] 46 | self.loss = (diff ** 2).mean() 47 | return self.loss 48 | 49 | 50 | class MaskedL1Loss(nn.Module): 51 | def __init__(self): 52 | super(MaskedL1Loss, self).__init__() 53 | 54 | def forward(self, pred, target): 55 | assert pred.dim() == target.dim(), "inconsistent dimensions" 56 | valid_mask = (target > 0).detach() 57 | diff = target - pred 58 | diff = diff[valid_mask] 59 | self.loss = diff.abs().mean() 60 | return self.loss 61 | 62 | 63 | class berHuLoss(nn.Module): 64 | def __init__(self): 65 | super(berHuLoss, self).__init__() 66 | 67 | def forward(self, pred, target): 68 | assert pred.dim() == target.dim(), "inconsistent dimensions" 69 | 70 | huber_c = torch.max(pred - target) 71 | huber_c = 0.2 * huber_c 72 | 73 | valid_mask = (target > 0).detach() 74 | diff = target - pred 75 | diff = diff[valid_mask] 76 | diff = diff.abs() 77 | 78 | huber_mask = (diff > huber_c).detach() 79 | 80 | diff2 = diff[huber_mask] 81 | diff2 = diff2 ** 2 82 | 83 | self.loss = torch.cat((diff, diff2)).mean() 84 | 85 | return self.loss 86 | 87 | 88 | class ScaleInvariantError(nn.Module): 89 | def __init__(self, lamada=0.5): 90 | super(ScaleInvariantError, self).__init__() 91 | self.lamada = lamada 92 | return 93 | 94 | def forward(self, y_true, y_pred): 95 | first_log = torch.log(torch.clamp(y_pred, 0.0001)) 96 | second_log = torch.log(torch.clamp(y_true, 0.0001)) 97 | d = first_log - second_log 98 | loss = torch.mean(d * d) - self.lamada * torch.mean(d) * torch.mean(d) 99 | return loss 100 | 101 | def create_depth_color(depth): 102 | d_min = np.min(depth) 103 | d_max = np.max(depth) 104 | depth_relative = (depth - d_min) / (d_max - d_min) 105 | depth = (255 * cmap(depth_relative)[:, :, :3]) 106 | return depth 107 | 108 | 109 | def save_image(model, x, y, batch, mode="train"): 110 | pred = model(x) 111 | npimg = pred.cpu().detach().numpy() 112 | depth = create_depth_color(np.transpose(npimg[0], [1,2,0])[:, :, 0]) 113 | target = create_depth_color(np.transpose(y[0].cpu().numpy(), [1,2,0])[:, :, 0]) 114 | orig = 255 * np.transpose(x[0].cpu().numpy(), [1,2,0]) 115 | 116 | img = np.concatenate((orig, target, depth), axis =1) 117 | 118 | img = Image.fromarray(img.astype('uint8')) 119 | img.save('saved_images/%s_image_%d.jpg'%(mode, batch)) 120 | 121 | def adjust_learning_rate(optimizer, epoch, lr_init): 122 | """Sets the learning rate to the initial LR decayed by 2 every 5 epochs""" 123 | lr = lr_init * (0.5 ** (epoch // 5)) 124 | for param_group in optimizer.param_groups: 125 | param_group['lr'] = lr 126 | 127 | class Discriminator(nn.Module): 128 | def __init__(self): 129 | super(Discriminator, self).__init__() 130 | self.model = nn.Sequential ( 131 | nn.Conv2d(1, 32, 4, 1, 0), 132 | nn.BatchNorm2d(32), 133 | nn.ReLU(True), 134 | nn.MaxPool2d(2), 135 | nn.Conv2d(32, 32, 3, 2, 1), 136 | nn.BatchNorm2d(32), 137 | nn.ReLU(True), 138 | nn.MaxPool2d(2), 139 | nn.Conv2d(32, 32, 3, 2, 1), 140 | nn.BatchNorm2d(32), 141 | nn.ReLU(True) 142 | ) 143 | self.out = nn.Linear(32, 1) 144 | 145 | def forward(self, x): 146 | x = self.model(x) 147 | x = x.view(-1, 32) 148 | x = self.out(x) 149 | return torch.sigmoid(x) 150 | 151 | 152 | def set_requires_grad(net, requires_grad=False): 153 | if net is not None: 154 | for param in net.parameters(): 155 | param.requires_grad = requires_grad 156 | 157 | 158 | def train(train_loader, val_loader, model, discriminator, criterion_L1, criterion_MSE, 159 | criterion_berHu, criterion_GAN, optimizer, optimizer_D, epoch, batch_size): 160 | 161 | model.train() # switch to train mode 162 | eval_mode = False 163 | init_lr = optimizer.param_groups[0]['lr'] 164 | 165 | valid_T = torch.ones(batch_size, 1).cuda().double() 166 | zeros_T = torch.zeros(batch_size, 1).cuda().double() 167 | 168 | for iter_ in range(num_batches): 169 | input, target = next(train_loader.get_one_batch(batch_size)) 170 | input, target = input, target 171 | input, target = input.cuda(), target.cuda() 172 | torch.cuda.synchronize() 173 | 174 | optimizer.zero_grad() 175 | 176 | pred = model(input) 177 | 178 | loss_L1 = criterion_L1(pred, target) 179 | loss_MSE = criterion_MSE(pred, target) 180 | loss_berHu = criterion_berHu(pred, target) 181 | loss_SI = criterion_SI(pred, target) 182 | 183 | set_requires_grad(discriminator, False) 184 | 185 | loss_adv = 0 186 | 187 | for a in range(12): 188 | for b in range(16): 189 | row = 19 * a 190 | col = 19 * b 191 | patch_fake = pred[:, :, row:row+19, col:col+19] 192 | pred_fake = discriminator(patch_fake) 193 | loss_adv += criterion_GAN(pred_fake, valid_T) 194 | 195 | loss_gen = loss_SI + 0.5 * loss_adv 196 | loss_gen.backward() 197 | optimizer.step() 198 | 199 | set_requires_grad(discriminator, True) 200 | optimizer_D.zero_grad() 201 | loss_D = 0 202 | for a in range(12): 203 | for b in range(16): 204 | row = 19 * a 205 | col = 19 * b 206 | patch_fake = pred[:, :, row:row+19, col:col+19] 207 | patch_real = target[:, :, row:row+19, col:col+19] 208 | pred_fake = discriminator(patch_fake.detach()) 209 | pred_real = discriminator(patch_real) 210 | loss_D_fake = criterion_GAN(pred_fake, zeros_T) 211 | loss_D_real = criterion_GAN(pred_real, valid_T) 212 | loss_D += 0.5 * (loss_D_fake + loss_D_real) 213 | 214 | loss_D.backward() 215 | optimizer_D.step() 216 | 217 | torch.cuda.synchronize() 218 | if (iter_ + 1) % 10 == 0: 219 | save_image(model, input, target, iter_) 220 | logger.add_scalar('L1', loss_L1.item()) 221 | logger.add_scalar('MSE', loss_MSE.item()) 222 | logger.add_scalar('berHu', loss_berHu.item()) 223 | logger.add_scalar('SI', loss_SI.item()) 224 | 225 | print('Train Epoch: {} Batch: [{}/{}], SI: {:0.4f}, ADV:{:0.3f} L1 ={:0.3f}, MSE={:0.3f}, berHu={:0.3f}, Disc:{:0.3f}'.format( 226 | epoch, iter_ + 1, num_batches, loss_SI.item(), loss_adv.item(), 227 | loss_L1.item(), loss_MSE.item(), loss_berHu.item(), loss_D.item())) 228 | 229 | 230 | train_loader = DataLoader("../cnn_depth_tensorflow/data/nyu_datasets/") 231 | val_loader = DataLoader("../cnn_depth_tensorflow/data/nyu_datasets/", mode="val") 232 | 233 | model = UNet(3, 1).double() 234 | model = nn.DataParallel(model).cuda() 235 | 236 | discriminator = Discriminator().double() 237 | discriminator.apply(weights_init) 238 | discriminator = discriminator.cuda() 239 | discriminator = nn.DataParallel(discriminator) 240 | 241 | optimizer = torch.optim.Adam(model.parameters(), lr = 0.001, weight_decay=1e-4) 242 | optimizer_D = torch.optim.Adam(discriminator.parameters(), lr = 4 * 0.001) 243 | 244 | criterion_L1 = MaskedL1Loss() 245 | criterion_berHu = berHuLoss() 246 | criterion_MSE = MaskedMSELoss() 247 | criterion_SI = ScaleInvariantError() 248 | criterion_GAN = nn.BCELoss() 249 | criterion = nn.L1Loss() 250 | 251 | batch_size = 8 252 | num_epochs = 40 253 | num_batches = len(train_loader)//batch_size 254 | 255 | for epoch in range(25): 256 | adjust_learning_rate(optimizer, epoch, 0.001) 257 | train(train_loader, val_loader, model, discriminator, criterion_L1, criterion_MSE, criterion_berHu, 258 | criterion_GAN, optimizer, optimizer_D, epoch, batch_size) 259 | 260 | torch.save({ 261 | 'epoch': epoch, 262 | 'model_state_dict': model.state_dict(), 263 | 'optimizer_state_dict': optimizer.state_dict(), 264 | }, './unet.pth') 265 | 266 | 267 | -------------------------------------------------------------------------------- /train_unet.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | import torch.nn as nn 4 | import torch.nn.functional as F 5 | import torchvision.models 6 | import collections 7 | import math 8 | import time 9 | import pickle 10 | import matplotlib.pyplot as plt 11 | from PIL import Image 12 | from tensorboardX import SummaryWriter 13 | cmap = plt.cm.jet 14 | 15 | from nyu_dataloader import DataLoader 16 | import model 17 | from unet import UNet 18 | 19 | writer = SummaryWriter("runs/run1") 20 | 21 | def weights_init(m): 22 | # Initialize filters with Gaussian random weights 23 | if isinstance(m, nn.Conv2d): 24 | n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels 25 | m.weight.data.normal_(0, math.sqrt(2. / n)) 26 | if m.bias is not None: 27 | m.bias.data.zero_() 28 | elif isinstance(m, nn.ConvTranspose2d): 29 | n = m.kernel_size[0] * m.kernel_size[1] * m.in_channels 30 | m.weight.data.normal_(0, math.sqrt(2. / n)) 31 | if m.bias is not None: 32 | m.bias.data.zero_() 33 | elif isinstance(m, nn.BatchNorm2d): 34 | m.weight.data.fill_(1) 35 | m.bias.data.zero_() 36 | 37 | class MaskedMSELoss(nn.Module): 38 | def __init__(self): 39 | super(MaskedMSELoss, self).__init__() 40 | 41 | def forward(self, pred, target): 42 | assert pred.dim() == target.dim(), "inconsistent dimensions" 43 | valid_mask = (target > 0).detach() 44 | diff = target - pred 45 | diff = diff[valid_mask] 46 | self.loss = (diff ** 2).mean() 47 | return self.loss 48 | 49 | 50 | class MaskedL1Loss(nn.Module): 51 | def __init__(self): 52 | super(MaskedL1Loss, self).__init__() 53 | 54 | def forward(self, pred, target): 55 | assert pred.dim() == target.dim(), "inconsistent dimensions" 56 | valid_mask = (target > 0).detach() 57 | diff = target - pred 58 | diff = diff[valid_mask] 59 | self.loss = diff.abs().mean() 60 | return self.loss 61 | 62 | 63 | class berHuLoss(nn.Module): 64 | def __init__(self): 65 | super(berHuLoss, self).__init__() 66 | 67 | def forward(self, pred, target): 68 | assert pred.dim() == target.dim(), "inconsistent dimensions" 69 | 70 | huber_c = torch.max(pred - target) 71 | huber_c = 0.2 * huber_c 72 | 73 | valid_mask = (target > 0).detach() 74 | diff = target - pred 75 | diff = diff[valid_mask] 76 | diff = diff.abs() 77 | 78 | huber_mask = (diff > huber_c).detach() 79 | 80 | diff2 = diff[huber_mask] 81 | diff2 = diff2 ** 2 82 | 83 | self.loss = torch.cat((diff, diff2)).mean() 84 | 85 | return self.loss 86 | 87 | 88 | class ScaleInvariantError(nn.Module): 89 | def __init__(self, lamada=0.5): 90 | super(ScaleInvariantError, self).__init__() 91 | self.lamada = lamada 92 | return 93 | 94 | def forward(self, y_true, y_pred): 95 | first_log = torch.log(torch.clamp(y_pred, 0.0001)) 96 | second_log = torch.log(torch.clamp(y_true, 0.0001)) 97 | d = first_log - second_log 98 | loss = torch.mean(d * d) - self.lamada * torch.mean(d) * torch.mean(d) 99 | return loss 100 | 101 | def create_depth_color(depth): 102 | d_min = np.min(depth) 103 | d_max = np.max(depth) 104 | depth_relative = (depth - d_min) / (d_max - d_min) 105 | depth = (255 * cmap(depth_relative)[:, :, :3]) 106 | return depth 107 | 108 | 109 | def save_image(model, x, y, batch, mode="train"): 110 | pred = model(x) 111 | npimg = pred.cpu().detach().numpy() 112 | depth = create_depth_color(np.transpose(npimg[0], [1,2,0])[:, :, 0]) 113 | target = create_depth_color(np.transpose(y[0].cpu().numpy(), [1,2,0])[:, :, 0]) 114 | orig = 255 * np.transpose(x[0].cpu().numpy(), [1,2,0]) 115 | 116 | img = np.concatenate((orig, target, depth), axis =1) 117 | 118 | img = Image.fromarray(img.astype('uint8')) 119 | img.save('saved_images/%s_image_%d.jpg'%(mode, batch)) 120 | 121 | def adjust_learning_rate(optimizer, epoch, lr_init): 122 | """Sets the learning rate to the initial LR decayed by 2 every 5 epochs""" 123 | lr = lr_init * (0.5 ** (epoch // 5)) 124 | for param_group in optimizer.param_groups: 125 | param_group['lr'] = lr 126 | 127 | def train(train_loader, val_loader, model, criterion_L1, criterion_MSE, 128 | criterion_berHu, optimizer, epoch, batch_size): 129 | 130 | model.train() # switch to train mode 131 | eval_mode = False 132 | init_lr = optimizer.param_groups[0]['lr'] 133 | 134 | for iter_ in range(num_batches): 135 | input, target = next(train_loader.get_one_batch(batch_size)) 136 | input, target = input, target 137 | input, target = input.cuda(), target.cuda() 138 | torch.cuda.synchronize() 139 | 140 | optimizer.zero_grad() 141 | 142 | pred = model(input) 143 | 144 | loss_L1 = criterion_L1(pred, target) 145 | loss_MSE = criterion_MSE(pred, target) 146 | loss_berHu = criterion_berHu(pred, target) 147 | loss_SI = criterion_SI(pred, target) 148 | 149 | writer.add_scalar('L1 Loss', loss_L1.item(), 25*epoch + iter_ + 1) 150 | writer.add_scalar('MSE Loss', loss_MSE.item(), 25*epoch + iter_ + 1) 151 | writer.add_scalar('SI Loss', loss_SI.item(), 25*epoch + iter_ + 1) 152 | writer.add_scalar('berHu Loss', loss_berHu.item(), 25*epoch + iter_ + 1) 153 | 154 | writer.add_scalars('loss/metrics', { 155 | "L1": loss_L1.item(), "MSE": loss_MSE.item(), 156 | "SI": loss_SI.item(), "berHu": loss_berHu.item()} 157 | , 25 * epoch + iter_) 158 | loss_gen = loss_SI + 5 * loss_L1 159 | loss_gen.backward() 160 | optimizer.step() 161 | 162 | if (iter_ + 1) % 10 == 0: 163 | save_image(model, input, target, iter_) 164 | print('Train Epoch: {} Batch: [{}/{}], SI: {:0.4f}, L1 ={:0.3f}, MSE={:0.3f}, berHu={:0.3f}'.format( 165 | epoch, iter_ + 1, num_batches, loss_SI.item(), 166 | loss_L1.item(), loss_MSE.item(), loss_berHu.item())) 167 | 168 | 169 | train_loader = DataLoader("../cnn_depth_tensorflow/data/nyu_datasets/") 170 | val_loader = DataLoader("../cnn_depth_tensorflow/data/nyu_datasets/", mode="val") 171 | 172 | model = UNet(3, 1).double() 173 | model = nn.DataParallel(model).cuda() 174 | 175 | optimizer = torch.optim.Adam(model.parameters(), lr = 0.0002, weight_decay=1e-4) 176 | 177 | criterion_L1 = MaskedL1Loss() 178 | criterion_berHu = berHuLoss() 179 | criterion_MSE = MaskedMSELoss() 180 | criterion_SI = ScaleInvariantError() 181 | 182 | batch_size = 8 183 | num_epochs = 40 184 | num_batches = len(train_loader)//batch_size 185 | 186 | for epoch in range(25): 187 | adjust_learning_rate(optimizer, epoch, 0.001) 188 | train(train_loader, val_loader, model, criterion_L1, criterion_MSE, criterion_berHu, 189 | optimizer, epoch, batch_size) 190 | 191 | torch.save({ 192 | 'epoch': epoch, 193 | 'model_state_dict': model.state_dict(), 194 | 'optimizer_state_dict': optimizer.state_dict(), 195 | }, './unet_si.pth') 196 | 197 | 198 | -------------------------------------------------------------------------------- /unet.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import torch.nn as nn 3 | import torch.nn.functional as F 4 | 5 | 6 | class double_conv(nn.Module): 7 | '''(conv => BN => ReLU) * 2''' 8 | def __init__(self, in_ch, out_ch): 9 | super(double_conv, self).__init__() 10 | self.conv = nn.Sequential( 11 | nn.Conv2d(in_ch, out_ch, 3, padding=1), 12 | nn.BatchNorm2d(out_ch), 13 | nn.ReLU(inplace=True), 14 | nn.Conv2d(out_ch, out_ch, 3, padding=1), 15 | nn.BatchNorm2d(out_ch), 16 | nn.ReLU(inplace=True) 17 | ) 18 | 19 | def forward(self, x): 20 | x = self.conv(x) 21 | return x 22 | 23 | 24 | class inconv(nn.Module): 25 | def __init__(self, in_ch, out_ch): 26 | super(inconv, self).__init__() 27 | self.conv = double_conv(in_ch, out_ch) 28 | 29 | def forward(self, x): 30 | x = self.conv(x) 31 | return x 32 | 33 | 34 | class down(nn.Module): 35 | def __init__(self, in_ch, out_ch): 36 | super(down, self).__init__() 37 | self.mpconv = nn.Sequential( 38 | nn.MaxPool2d(2), 39 | double_conv(in_ch, out_ch) 40 | ) 41 | 42 | def forward(self, x): 43 | x = self.mpconv(x) 44 | return x 45 | 46 | 47 | class up(nn.Module): 48 | def __init__(self, in_ch, out_ch, bilinear=True): 49 | super(up, self).__init__() 50 | 51 | # would be a nice idea if the upsampling could be learned too, 52 | # but my machine do not have enough memory to handle all those weights 53 | if bilinear: 54 | self.up = nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True) 55 | else: 56 | self.up = nn.ConvTranspose2d(in_ch//2, in_ch//2, 2, stride=2) 57 | 58 | self.conv = double_conv(in_ch, out_ch) 59 | 60 | def forward(self, x1, x2): 61 | x1 = self.up(x1) 62 | 63 | # input is CHW 64 | diffY = x2.size()[2] - x1.size()[2] 65 | diffX = x2.size()[3] - x1.size()[3] 66 | 67 | x1 = F.pad(x1, (diffX // 2, diffX - diffX//2, 68 | diffY // 2, diffY - diffY//2)) 69 | 70 | # for padding issues, see 71 | # https://github.com/HaiyongJiang/U-Net-Pytorch-Unstructured-Buggy/commit/0e854509c2cea854e247a9c615f175f76fbb2e3a 72 | # https://github.com/xiaopeng-liao/Pytorch-UNet/commit/8ebac70e633bac59fc22bb5195e513d5832fb3bd 73 | 74 | x = torch.cat([x2, x1], dim=1) 75 | x = self.conv(x) 76 | return x 77 | 78 | 79 | class outconv(nn.Module): 80 | def __init__(self, in_ch, out_ch): 81 | super(outconv, self).__init__() 82 | self.conv = nn.Conv2d(in_ch, out_ch, 1) 83 | 84 | def forward(self, x): 85 | x = self.conv(x) 86 | return x 87 | 88 | class UNet(nn.Module): 89 | def __init__(self, n_channels, n_classes): 90 | super(UNet, self).__init__() 91 | self.inc = inconv(n_channels, 64) 92 | self.down1 = down(64, 128) 93 | self.down2 = down(128, 256) 94 | self.down3 = down(256, 512) 95 | self.down4 = down(512, 512) 96 | self.up1 = up(1024, 256) 97 | self.up2 = up(512, 128) 98 | self.up3 = up(256, 64) 99 | self.up4 = up(128, 64) 100 | self.outc = outconv(64, n_classes) 101 | 102 | def forward(self, x): 103 | x1 = self.inc(x) 104 | x2 = self.down1(x1) 105 | x3 = self.down2(x2) 106 | x4 = self.down3(x3) 107 | x5 = self.down4(x4) 108 | x = self.up1(x5, x4) 109 | x = self.up2(x, x3) 110 | x = self.up3(x, x2) 111 | x = self.up4(x, x1) 112 | x = self.outc(x) 113 | return F.sigmoid(x) 114 | --------------------------------------------------------------------------------