├── figs └── ClassHyPer.jpg ├── .idea ├── vcs.xml ├── .gitignore ├── misc.xml ├── inspectionProfiles │ ├── profiles_settings.xml │ └── Project_Default.xml ├── modules.xml └── ClassHyPer.iml ├── utils ├── mask_gen.py ├── util.py └── metrics.py ├── examples ├── train_image.txt ├── train_label.txt ├── val_image.txt ├── val_label.txt ├── test_image.txt ├── test_label.txt └── train_unsup_image.txt ├── configs ├── config.cfg └── config.py ├── models ├── CPS_Network.py └── FCN_backbone.py ├── LICENSE ├── environment.yaml ├── README.md ├── test.py ├── Tester.py ├── train.py ├── data └── dataset_list.py └── Trainer.py /figs/ClassHyPer.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/YJ-He/ClassHyPer/HEAD/figs/ClassHyPer.jpg -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /utils/mask_gen.py: -------------------------------------------------------------------------------- 1 | import torch 2 | 3 | def generate_class_mask(pred, classes): 4 | ''' 5 | generate class mask 6 | :param pred: predicted mask(H*W) 7 | :param classes: classes [0,1,2,...] 8 | :return: mask(H*W) 9 | ''' 10 | pred, classes = torch.broadcast_tensors(pred.unsqueeze(0), classes.unsqueeze(1).unsqueeze(2)) 11 | N = pred.eq(classes).sum(0) 12 | return N 13 | 14 | -------------------------------------------------------------------------------- /.idea/ClassHyPer.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/Project_Default.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 17 | -------------------------------------------------------------------------------- /examples/train_image.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_002.tif 2 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_000.tif 3 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_001.tif 4 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_005.tif 5 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_006.tif 6 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_002.tif 7 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_003.tif 8 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_004.tif 9 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_006.tif 10 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_000.tif 11 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_005.tif 12 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_002.tif 13 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_002.tif 14 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_001.tif 15 | -------------------------------------------------------------------------------- /examples/train_label.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area5_001_002.tif 2 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area1_003_000.tif 3 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area23_005_001.tif 4 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area26_000_005.tif 5 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area5_002_006.tif 6 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area3_002_002.tif 7 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area17_001_003.tif 8 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area17_000_004.tif 9 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area1_006_006.tif 10 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area21_000_000.tif 11 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area7_004_005.tif 12 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area21_007_002.tif 13 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area1_003_002.tif 14 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area23_002_001.tif 15 | -------------------------------------------------------------------------------- /configs/config.cfg: -------------------------------------------------------------------------------- 1 | [Directory] 2 | root_dir = F:\WHU 3 | save_dir = ${root_dir}\save 4 | log_dir = ${save_dir}\log 5 | test_dir = ${save_dir}\test 6 | test_log_dir = ${test_dir}\log 7 | pred_dir = ${test_dir}\predict 8 | data_folder_name = image 9 | target_folder_name = label 10 | model_name = FCNs_CPS_vgg16_bn_classhyper 11 | 12 | [Data] 13 | batch_size = 4 14 | input_channel = 3 15 | nb_classes = 6 16 | input_size = 512 17 | eval_size = 512 18 | 19 | [General] 20 | use_gpu = True 21 | device_id = 0 22 | random_seed = 1 23 | num_workers = 4 24 | 25 | [Optimizer] 26 | lr_algorithm = adamw 27 | init_lr = 0.0001 28 | lr_decay = 0.1 29 | momentum = 0.9 30 | weight_decay = 2e-4 31 | epsilon = 1e-8 32 | 33 | [Train] 34 | monitor = max/MIoU 35 | init_algorithm = kaiming 36 | use_seed = False 37 | use_one_cycle_lr = True 38 | use_mix = True 39 | early_stop = 10 40 | warmup_period = 4 41 | save_period = 1 42 | epochs = 25 43 | 44 | -------------------------------------------------------------------------------- /models/CPS_Network.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | from models.FCN_backbone import FCNs_VGG 3 | 4 | 5 | class FCNs_CPS(nn.Module): 6 | def __init__(self, in_ch, out_ch, backbone='vgg16_bn', pretrained=True): 7 | super(FCNs_CPS, self).__init__() 8 | self.name = "FCNs_CPS_" + backbone 9 | self.backbone = backbone 10 | self.branch1 = FCNs_VGG(in_ch, out_ch, backbone=backbone, pretrained=pretrained) 11 | self.branch2 = FCNs_VGG(in_ch, out_ch, backbone=backbone, pretrained=pretrained) 12 | 13 | def forward(self, data, step=1): 14 | if not self.training: 15 | pred1 = self.branch1(data) 16 | return pred1 17 | 18 | if step == 1: 19 | return self.branch1(data) 20 | elif step == 2: 21 | return self.branch2(data) 22 | 23 | if __name__ == '__main__': 24 | model = FCNs_CPS(in_ch=3, out_ch=1) 25 | print(model) 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 YongjunHe 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /utils/util.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | def ensure_dir(path): 4 | """ 5 | Directory check, if not have, create one 6 | """ 7 | if not os.path.exists(path): 8 | os.makedirs(path) 9 | 10 | class AverageMeter(object): 11 | """ 12 | Computes and stores the average and current value 13 | """ 14 | 15 | def __init__(self): 16 | self.initialized = False 17 | self.val = None 18 | self.avg = None 19 | self.sum = None 20 | self.count = None 21 | 22 | def initialize(self, val, weight): 23 | self.val = val 24 | self.avg = val 25 | self.sum = val * weight 26 | self.count = weight 27 | self.initialized = True 28 | 29 | def update(self, val, weight=1): 30 | if not self.initialized: 31 | self.initialize(val, weight) 32 | else: 33 | self.add(val, weight) 34 | 35 | def add(self, val, weight): 36 | self.val = val 37 | self.sum += val * weight 38 | self.count += weight 39 | self.avg = self.sum / self.count 40 | 41 | def value(self): 42 | return self.val 43 | 44 | def average(self): 45 | return self.avg 46 | 47 | def get_sum(self): 48 | return self.sum 49 | -------------------------------------------------------------------------------- /environment.yaml: -------------------------------------------------------------------------------- 1 | name: class_hyper 2 | channels: 3 | - pytorch 4 | - defaults 5 | dependencies: 6 | - blas=1.0=mkl 7 | - ca-certificates=2022.4.26=haa95532_0 8 | - certifi=2021.10.8=py38haa95532_2 9 | - cudatoolkit=10.2.89=h74a9793_1 10 | - freetype=2.10.4=hd328e21_0 11 | - intel-openmp=2022.0.0=haa95532_3663 12 | - jpeg=9b=hb83a4c4_2 13 | - libpng=1.6.37=h2a8f88b_0 14 | - libtiff=4.2.0=hd0e1b90_0 15 | - libuv=1.40.0=he774522_0 16 | - libwebp=1.2.2=h2bbff1b_0 17 | - lz4-c=1.9.3=h2bbff1b_1 18 | - mkl=2022.0.0=haa95532_115 19 | - ninja=1.10.2=haa95532_5 20 | - ninja-base=1.10.2=h6d14046_5 21 | - openssl=1.1.1o=h2bbff1b_0 22 | - pip=21.2.2=py38haa95532_0 23 | - python=3.8.13=h6244533_0 24 | - pytorch=1.9.0=py3.8_cuda10.2_cudnn7_0 25 | - setuptools=61.2.0=py38haa95532_0 26 | - sqlite=3.38.3=h2bbff1b_0 27 | - tk=8.6.11=h2bbff1b_1 28 | - torchvision=0.10.0=py38_cu102 29 | - typing_extensions=4.1.1=pyh06a4308_0 30 | - vc=14.2=h21ff451_1 31 | - vs2015_runtime=14.27.29016=h5e58377_2 32 | - wheel=0.37.1=pyhd3eb1b0_0 33 | - wincertstore=0.2=py38haa95532_2 34 | - xz=5.2.5=h8cc25b3_1 35 | - zlib=1.2.12=h8cc25b3_2 36 | - zstd=1.4.9=h19a0ad4_0 37 | - pip: 38 | - albumentations==1.1.0 39 | - argparse==1.4.0 40 | - atomicwrites==1.4.0 41 | - attrs==21.4.0 42 | - colorama==0.4.4 43 | - configparser==5.2.0 44 | - contextlib2==21.6.0 45 | - datetime==4.4 46 | - execnet==1.9.0 47 | - imageio==2.19.1 48 | - iniconfig==1.1.1 49 | - joblib==1.1.0 50 | - mock==4.0.3 51 | - networkx==2.8 52 | - numpy==1.22.3 53 | - opencv-python==4.5.5.64 54 | - opencv-python-headless==4.5.5.64 55 | - packaging==21.3 56 | - path==16.4.0 57 | - path-py==12.5.0 58 | - pillow==8.3.2 59 | - pluggy==1.0.0 60 | - py==1.11.0 61 | - pyparsing==3.0.9 62 | - pytest==7.1.2 63 | - pytest-shutil==1.7.0 64 | - pytz==2022.1 65 | - pywavelets==1.3.0 66 | - pyyaml==6.0 67 | - qudida==0.0.4 68 | - scikit-image==0.19.2 69 | - scikit-learn==1.1.0 70 | - scipy==1.8.0 71 | - six==1.16.0 72 | - termcolor==1.1.0 73 | - threadpoolctl==3.1.0 74 | - tifffile==2022.5.4 75 | - tomli==2.0.1 76 | - tqdm==4.64.0 77 | - zope-interface==5.4.0 78 | prefix: C:\ProgramData\Anaconda3\envs\class_hyper 79 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # **ClassHyPer: ClassMix-Based Hybrid Perturbations for Deep Semi-Supervised Semantic Segmentation of Remote Sensing Imagery** 2 | 3 | The PyTorch implementation of semi-supervised learning method—ClassHyPer. 4 | The manuscript can be visited via https://www.mdpi.com/2072-4292/14/4/879 5 | 6 | ## 1. Datasets 7 | ### (1) Links 8 | * [DeepGlobe Road](https://www.kaggle.com/datasets/balraj98/deepglobe-road-extraction-dataset) 9 | * [Massachusetts Building](https://www.cs.toronto.edu/~vmnih/data) 10 | * [WHU Aerial Building](http://study.rsgis.whu.edu.cn/pages/download/building_dataset.html) 11 | * [ISPRS 2D Semantic Labeling (Potsdam and Vaihingen)](https://www.isprs.org/education/benchmarks/UrbanSemLab/default.aspx) 12 | ### (2) Directory Structure 13 | After obtain the datasets, you need to process first and generate lists of image/label files and place as the structure shown below. Every txt file contains the full absolute path of the files, each image/label per line. Example files can be found in `./examples`. 14 | ``` 15 | /root 16 | /save/{model.name}/{datetime}/log/{model.name}.txt 17 | /history.txt 18 | /checkpoint-ep{epoch}-{val_iou}.pth 19 | /checkpoint-best.pth 20 | /test/log/{model.name}/{datetime}/test-result.txt 21 | /train_image.txt 22 | /train_label.txt 23 | /test_image.txt 24 | /test_label.txt 25 | /val_image.txt 26 | /val_label.txt 27 | /train_unsup_image.txt 28 | ``` 29 | 30 | ## 2. Usage 31 | ### 2.1 Installation 32 | The code is developed using Python 3.8 with PyTorch 1.9.0 and tested based on single RTX 2080 Ti GPU. 33 | 34 | **(1) Clone this repo.** 35 | ``` 36 | git clone https://github.com/YJ-He/ClassHyPer.git 37 | ``` 38 | 39 | **(2) Create a conda environment.** 40 | ``` 41 | conda env create -f environment.yaml 42 | conda activate class_hyper 43 | ``` 44 | 45 | ### 2.2 Training 46 | 1. set `root_dir` and hyper-parameters configuration in `./configs/config.cfg`. 47 | 2. run `python train.py`. 48 | 49 | ### 2.3 Evaludation 50 | 1. set `root_dir` and hyper-parameters configuration in `./configs/config.cfg`. 51 | 2. set `pathCkpt` in `test.py` to indicate the model checkpoint file. 52 | 3. run `python test.py`. 53 | 54 | ## 3. Structure of ClassHyPer 55 | 56 | 57 | --- 58 | ## 4. Citation 59 | If this repo is useful in your research, please kindly consider citing our paper as follow. 60 | ``` 61 | @article{he2022classhyper, 62 | title={ClassHyPer: ClassMix-Based Hybrid Perturbations for Deep Semi-Supervised Semantic Segmentation of Remote Sensing Imagery}, 63 | author={He, Yongjun and Wang, Jinfei and Liao, Chunhua and Shan, Bo and Zhou, Xin}, 64 | journal={Remote Sensing}, 65 | volume={14}, 66 | number={4}, 67 | pages={879}, 68 | year={2022}, 69 | publisher={MDPI} 70 | } 71 | ``` 72 | 73 | ## 5. References 74 | [1] [Semi-Supervised Semantic Segmentation with Cross Pseudo Supervision](https://arxiv.org/abs/2106.01226) 75 | [2] [Semi-supervised semantic segmentation needs strong, varied perturbations](https://arxiv.org/abs/1906.01916) 76 | [3] [ClassMix: Segmentation-Based Data Augmentation for Semi-Supervised Learning](https://arxiv.org/abs/2007.07936) 77 | ... 78 | 79 | **If our work give you some insights and hints, star me please! Thank you~** 80 | 81 | 82 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import argparse 3 | import torch 4 | import random 5 | import numpy as np 6 | from configs.config import MyConfiguration 7 | from Tester import Tester 8 | from data.dataset_list import MyDataset 9 | from torch.utils.data import DataLoader 10 | from models import CPS_Network 11 | 12 | def for_test(model, config, args, test_data_loader, class_name, begin_time, resume_file): 13 | 14 | myTester = Tester(model=model, config=config, args=args, 15 | test_data_loader=test_data_loader, 16 | class_name=class_name, 17 | begin_time=begin_time, 18 | resume_file=resume_file) 19 | myTester.eval_and_predict() 20 | print(" Evaluation Done ! ") 21 | 22 | def main(config, args): 23 | model = CPS_Network.FCNs_CPS(in_ch=config.input_channel, out_ch=config.nb_classes, backbone='vgg16_bn', pretrained=True) 24 | 25 | if hasattr(model, 'name'): 26 | config.config.set("Directory", "model_name", model.name+'_'+config.mix_algorithm) 27 | 28 | test_dataset = MyDataset(config=config, args=args, subset='test') 29 | 30 | test_data_loader = DataLoader(dataset=test_dataset, 31 | batch_size=config.batch_size * 4, 32 | shuffle=False, 33 | pin_memory=True, 34 | num_workers=args.threads, 35 | drop_last=False) 36 | 37 | begin_time = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') 38 | begin_time = 'test-' + begin_time 39 | 40 | if config.use_gpu: 41 | model = model.cuda(device=args.gpu) 42 | 43 | for_test(model=model, config=config, args=args, 44 | test_data_loader=test_data_loader, 45 | class_name=test_dataset.class_names, 46 | begin_time=begin_time, 47 | resume_file=args.weight, 48 | ) 49 | 50 | if __name__ == '__main__': 51 | config = MyConfiguration('configs/config.cfg') 52 | 53 | pathCkpt = r'F:\WHU\checkpoint-best.pth' 54 | 55 | parser = argparse.ArgumentParser(description="Model Evaluation") 56 | 57 | parser.add_argument('-input', metavar='input', type=str, default=config.root_dir, 58 | help='root path to directory containing input images, including train & valid & test') 59 | parser.add_argument('-output', metavar='output', type=str, default=config.save_dir, 60 | help='root path to directory containing all the output, including predictions, logs and ckpt') 61 | parser.add_argument('-weight', metavar='weight', type=str, default=pathCkpt, 62 | help='path to ckpt which will be loaded') 63 | parser.add_argument('-threads', metavar='threads', type=int, default=2, 64 | help='number of thread used for DataLoader') 65 | parser.add_argument('-is_test', action='store_true', default=True, 66 | help='in test mode, is_test=True') 67 | if config.use_gpu: 68 | parser.add_argument('-gpu', metavar='gpu', type=int, default=0, 69 | help='gpu id to be used for prediction') 70 | else: 71 | parser.add_argument('-gpu', metavar='gpu', type=int, default=-1, 72 | help='gpu id to be used for prediction') 73 | 74 | args = parser.parse_args() 75 | 76 | if config.use_seed: 77 | torch.backends.cudnn.benchmark = False 78 | torch.backends.cudnn.deterministic = True 79 | torch.cuda.manual_seed(config.random_seed) 80 | torch.manual_seed(config.random_seed) 81 | random.seed(config.random_seed) 82 | np.random.seed(config.random_seed) 83 | else: 84 | torch.backends.cudnn.benchmark = True 85 | 86 | main(config=config, args=args) 87 | -------------------------------------------------------------------------------- /examples/val_image.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_000_000.tif 2 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_000_001.tif 3 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_000_002.tif 4 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_001_000.tif 5 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_001_001.tif 6 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_001_002.tif 7 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_002_000.tif 8 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_002_001.tif 9 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_002_002.tif 10 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_003_000.tif 11 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_003_001.tif 12 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_003_002.tif 13 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_004_000.tif 14 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_004_001.tif 15 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area11_004_002.tif 16 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_000_000.tif 17 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_000_001.tif 18 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_000_002.tif 19 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_001_000.tif 20 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_001_001.tif 21 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_001_002.tif 22 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_002_000.tif 23 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_002_001.tif 24 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_002_002.tif 25 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_003_000.tif 26 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_003_001.tif 27 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_003_002.tif 28 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_004_000.tif 29 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_004_001.tif 30 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area15_004_002.tif 31 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_000_000.tif 32 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_000_001.tif 33 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_000_002.tif 34 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_001_000.tif 35 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_001_001.tif 36 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_001_002.tif 37 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_002_000.tif 38 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_002_001.tif 39 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_002_002.tif 40 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_003_000.tif 41 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_003_001.tif 42 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_003_002.tif 43 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_004_000.tif 44 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_004_001.tif 45 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area28_004_002.tif 46 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_000_000.tif 47 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_000_001.tif 48 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_000_002.tif 49 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_001_000.tif 50 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_001_001.tif 51 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_001_002.tif 52 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_002_000.tif 53 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_002_001.tif 54 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_002_002.tif 55 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_003_000.tif 56 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_003_001.tif 57 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_003_002.tif 58 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_004_000.tif 59 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_004_001.tif 60 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area30_004_002.tif 61 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_000_000.tif 62 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_000_001.tif 63 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_001_000.tif 64 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_001_001.tif 65 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_002_000.tif 66 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_002_001.tif 67 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_003_000.tif 68 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area34_003_001.tif 69 | -------------------------------------------------------------------------------- /examples/val_label.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_000_000.tif 2 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_000_001.tif 3 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_000_002.tif 4 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_001_000.tif 5 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_001_001.tif 6 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_001_002.tif 7 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_002_000.tif 8 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_002_001.tif 9 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_002_002.tif 10 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_003_000.tif 11 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_003_001.tif 12 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_003_002.tif 13 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_004_000.tif 14 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_004_001.tif 15 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area11_004_002.tif 16 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_000_000.tif 17 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_000_001.tif 18 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_000_002.tif 19 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_001_000.tif 20 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_001_001.tif 21 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_001_002.tif 22 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_002_000.tif 23 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_002_001.tif 24 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_002_002.tif 25 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_003_000.tif 26 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_003_001.tif 27 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_003_002.tif 28 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_004_000.tif 29 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_004_001.tif 30 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area15_004_002.tif 31 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_000_000.tif 32 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_000_001.tif 33 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_000_002.tif 34 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_001_000.tif 35 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_001_001.tif 36 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_001_002.tif 37 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_002_000.tif 38 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_002_001.tif 39 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_002_002.tif 40 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_003_000.tif 41 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_003_001.tif 42 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_003_002.tif 43 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_004_000.tif 44 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_004_001.tif 45 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area28_004_002.tif 46 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_000_000.tif 47 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_000_001.tif 48 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_000_002.tif 49 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_001_000.tif 50 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_001_001.tif 51 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_001_002.tif 52 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_002_000.tif 53 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_002_001.tif 54 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_002_002.tif 55 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_003_000.tif 56 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_003_001.tif 57 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_003_002.tif 58 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_004_000.tif 59 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_004_001.tif 60 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area30_004_002.tif 61 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_000_000.tif 62 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_000_001.tif 63 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_001_000.tif 64 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_001_001.tif 65 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_002_000.tif 66 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_002_001.tif 67 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_003_000.tif 68 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area34_003_001.tif 69 | -------------------------------------------------------------------------------- /utils/metrics.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import torch 3 | 4 | class Evaluator(object): 5 | """ 6 | Accuracy assessment 7 | """ 8 | def __init__(self, num_class, device): 9 | self.device = device 10 | self.num_class = num_class 11 | self.confusion_matrix = torch.zeros((self.num_class,) * 2).long().to(self.device) 12 | self.iou = torch.zeros(self.num_class).to(self.device) 13 | self.accuracy_class = torch.zeros(self.num_class).to(self.device) 14 | self.precision_class = torch.zeros(self.num_class).to(self.device) 15 | self.recall_class = torch.zeros(self.num_class).to(self.device) 16 | self.f1_score_class = torch.zeros(self.num_class).to(self.device) 17 | self.TP = torch.zeros(self.num_class).to(self.device) 18 | self.FP = torch.zeros(self.num_class).to(self.device) 19 | self.FN = torch.zeros(self.num_class).to(self.device) 20 | self.TN = torch.zeros(self.num_class).to(self.device) 21 | 22 | def Pixel_Accuracy(self): 23 | """ 24 | Overall Accuracy 25 | """ 26 | Acc = torch.diag(self.confusion_matrix).sum() / self.confusion_matrix.sum() 27 | return Acc 28 | 29 | def Mean_Intersection_over_Union(self): 30 | """ 31 | Mean IOU 32 | """ 33 | MIoU = torch.diag(self.confusion_matrix) / ( 34 | torch.sum(self.confusion_matrix, dim=1) + torch.sum(self.confusion_matrix, dim=0) - 35 | torch.diag(self.confusion_matrix)) 36 | self.iou = MIoU 37 | MIoU = torch.mean(MIoU) 38 | return MIoU 39 | 40 | def _generate_matrix(self, gt_image, pre_image): 41 | """ 42 | Calculate confusion_matrix 43 | """ 44 | mask = (gt_image >= 0) & (gt_image < self.num_class) 45 | label = self.num_class * gt_image[mask] + pre_image[mask] 46 | count = torch.bincount(label, minlength=self.num_class ** 2) 47 | confusion_matrix = count.reshape(self.num_class, self.num_class) 48 | return confusion_matrix 49 | 50 | def add_batch(self, gt_image, pre_image): 51 | assert gt_image.shape == pre_image.shape 52 | tem_cm = self.confusion_matrix.clone().detach() 53 | self.confusion_matrix = tem_cm + self._generate_matrix(gt_image, pre_image) 54 | 55 | def reset(self): 56 | self.confusion_matrix = torch.zeros((self.num_class,) * 2).long().to(self.device) 57 | 58 | def get_confusion_matrix(self): 59 | return self.confusion_matrix 60 | 61 | def get_base_value(self): 62 | self.FP = self.confusion_matrix.sum(dim=0) - torch.diag(self.confusion_matrix) 63 | self.FN = self.confusion_matrix.sum(dim=1) - torch.diag(self.confusion_matrix) 64 | self.TP = torch.diag(self.confusion_matrix) 65 | self.TN = self.confusion_matrix.sum() - (self.FP + self.FN + self.TP) 66 | return self.TP, self.FP, self.FN, self.TN 67 | 68 | def get_iou(self): 69 | return self.iou 70 | 71 | def Pixel_Precision_Class(self): 72 | self.precision_class = self.TP / (self.TP + self.FP + 1e-8) 73 | return self.precision_class 74 | 75 | def Pixel_Recall_Class(self): 76 | self.recall_class = self.TP / (self.TP + self.FN + 1e-8) 77 | return self.recall_class 78 | 79 | def Pixel_F1_score_Class(self): 80 | self.f1_score_class = 2 * self.TP / (2 * self.TP + self.FP + self.FN) 81 | return self.f1_score_class 82 | 83 | if __name__ == '__main__': 84 | evaluator = Evaluator(2, torch.device('cpu')) 85 | a = torch.tensor([1, 0, 1, 1, 1, 1, 0, 0, 0, 0]) 86 | b = torch.tensor([1, 1, 1, 1, 1, 0, 0, 0, 1, 1]) 87 | evaluator.add_batch(a, b) 88 | 89 | acc = evaluator.Pixel_Accuracy() 90 | miou = evaluator.Mean_Intersection_over_Union() 91 | TP, FP, FN, TN = evaluator.get_base_value() 92 | confusion_matrix1 = evaluator.get_confusion_matrix() 93 | iou = evaluator.get_iou() 94 | prec = evaluator.Pixel_Precision_Class() 95 | recall = evaluator.Pixel_Recall_Class() 96 | f1_score = evaluator.Pixel_F1_score_Class() 97 | print('Class: ', 2, ' Average') 98 | np.set_printoptions(formatter={'float': '{: 6.6f}'.format}) 99 | print('IoU: ', iou) 100 | print('Precision:', prec) 101 | print('Recall: ', recall) 102 | print('F_Score: ', f1_score) 103 | np.set_printoptions(formatter={'int': '{:14}'.format}) 104 | print('Confusion_matrix:') 105 | print(confusion_matrix1) 106 | -------------------------------------------------------------------------------- /models/FCN_backbone.py: -------------------------------------------------------------------------------- 1 | import torch.nn as nn 2 | from torchvision import models 3 | from torchvision.models.vgg import VGG 4 | 5 | 6 | ranges = { 7 | 'vgg11': ((0, 3), (3, 6), (6, 11), (11, 16), (16, 21)), 8 | 'vgg11_bn': ((0, 4), (4, 8), (8, 15), (15, 22), (22, 29)), 9 | 'vgg13': ((0, 5), (5, 10), (10, 15), (15, 20), (20, 25)), 10 | 'vgg13_bn': ((0, 7), (7, 14), (14, 21), (21, 28), (28, 35)), 11 | 'vgg16': ((0, 5), (5, 10), (10, 17), (17, 24), (24, 31)), 12 | 'vgg16_bn': ((0, 7), (7, 14), (14, 24), (24, 34), (34, 44)), 13 | 'vgg19': ((0, 5), (5, 10), (10, 19), (19, 28), (28, 37)), 14 | 'vgg19_bn': ((0, 7), (7, 14), (14, 27), (27, 40), (40, 53)) 15 | } 16 | 17 | cfg = { 18 | 'vgg11': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], 19 | 'vgg13': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'], 20 | 'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'], 21 | 'vgg19': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'], 22 | } 23 | 24 | 25 | def make_layers(cfg, batch_norm=False): 26 | layers = [] 27 | in_channels = 3 28 | for v in cfg: 29 | if v == 'M': 30 | layers += [nn.MaxPool2d(kernel_size=2, stride=2)] 31 | else: 32 | conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1) 33 | if batch_norm: 34 | layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)] 35 | else: 36 | layers += [conv2d, nn.ReLU(inplace=True)] 37 | in_channels = v 38 | return nn.Sequential(*layers) 39 | 40 | class FCNs_VGG(nn.Module): 41 | 42 | def __init__(self, in_ch=3, out_ch=1, backbone='vgg16_bn', pretrained=True, requires_grad=True, remove_fc=True): 43 | super().__init__() 44 | self.name = "FCNs_" + backbone 45 | 46 | assert backbone in ['vgg11', 'vgg13', 'vgg16', 'vgg19', 'vgg11_bn', 'vgg13_bn', 'vgg16_bn', 'vgg19_bn'] 47 | self.pretrained_net = VGGNet(pretrained=pretrained, model=backbone, requires_grad=requires_grad, 48 | remove_fc=remove_fc, 49 | batch_norm='bn' in backbone) 50 | if in_ch != 3: 51 | self.pretrained_net.features[0] = nn.Conv2d(in_ch, 64, 3, 1, 1) 52 | 53 | self.relu = nn.ReLU(inplace=True) 54 | self.deconv1 = nn.ConvTranspose2d(512, 512, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1) 55 | self.bn1 = nn.BatchNorm2d(512) 56 | self.deconv2 = nn.ConvTranspose2d(512, 256, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1) 57 | self.bn2 = nn.BatchNorm2d(256) 58 | self.deconv3 = nn.ConvTranspose2d(256, 128, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1) 59 | self.bn3 = nn.BatchNorm2d(128) 60 | self.deconv4 = nn.ConvTranspose2d(128, 64, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1) 61 | self.bn4 = nn.BatchNorm2d(64) 62 | self.deconv5 = nn.ConvTranspose2d(64, 32, kernel_size=3, stride=2, padding=1, dilation=1, output_padding=1) 63 | self.bn5 = nn.BatchNorm2d(32) 64 | self.classifier = nn.Conv2d(32, out_ch, kernel_size=1) 65 | 66 | def forward(self, x): 67 | output = self.pretrained_net(x) 68 | x5 = output['x5'] 69 | x4 = output['x4'] 70 | x3 = output['x3'] 71 | x2 = output['x2'] 72 | x1 = output['x1'] 73 | 74 | score = self.bn1(self.relu(self.deconv1(x5))) 75 | score = score + x4 76 | score = self.bn2(self.relu(self.deconv2(score))) 77 | score = score + x3 78 | score = self.bn3(self.relu(self.deconv3(score))) 79 | score = score + x2 80 | score = self.bn4(self.relu(self.deconv4(score))) 81 | score = score + x1 82 | score = self.bn5(self.relu(self.deconv5(score))) 83 | score = self.classifier(score) 84 | 85 | return score 86 | 87 | class VGGNet(VGG): 88 | def __init__(self, pretrained=True, model='vgg16', requires_grad=True, remove_fc=True, show_params=False, 89 | batch_norm=False): 90 | super().__init__(make_layers(cfg[model.replace('_bn', '')], batch_norm)) 91 | self.ranges = ranges[model] 92 | 93 | if pretrained: 94 | exec("self.load_state_dict(models.%s(pretrained=True).state_dict())" % model) 95 | 96 | if not requires_grad: 97 | for param in super().parameters(): 98 | param.requires_grad = False 99 | 100 | if remove_fc: # delete redundant fully-connected layer params, can save memory 101 | del self.classifier 102 | 103 | if show_params: 104 | for name, param in self.named_parameters(): 105 | print(name, param.size()) 106 | 107 | def forward(self, x): 108 | output = {} 109 | # get the output of each maxpooling layer (5 maxpool in VGG net) 110 | for idx in range(len(self.ranges)): 111 | for layer in range(self.ranges[idx][0], self.ranges[idx][1]): 112 | x = self.features[layer](x) 113 | output["x%d" % (idx + 1)] = x 114 | 115 | return output 116 | 117 | 118 | if __name__ == "__main__": 119 | model = FCNs_VGG(in_ch=3, out_ch=1, backbone="vgg16_bn") 120 | print(model) 121 | 122 | 123 | -------------------------------------------------------------------------------- /configs/config.py: -------------------------------------------------------------------------------- 1 | from configparser import ConfigParser 2 | import configparser 3 | 4 | """ 5 | # section distinguish the upper and lower letters, but key and value do not. 6 | The information in the configuration always store the data in string format, it will have translation when reading. 7 | [DEFAULT]: the value in [DEFAULT] offer default_value to all sections, and it owns the highest priority. 8 | get: getboolean() getint() getfloat() 9 | 10 | refer values in other sections 11 | interpolation method: configparser.BasicInterpolation() 12 | configparser.ExtendedInterpolation() ${section:key} 13 | config.set 14 | config.write 15 | """ 16 | 17 | class MyConfiguration(): 18 | def __init__(self, config_file=None): 19 | super(MyConfiguration, self).__init__() 20 | 21 | # ./ current directory 22 | if config_file is None: 23 | config_file = r'./configs/config1.cfg' 24 | 25 | config = ConfigParser() 26 | # interpolation method 27 | config._interpolation = configparser.ExtendedInterpolation() 28 | config.read(filenames=config_file) 29 | 30 | self.config = config 31 | self.config_path = config_file 32 | self.add_section = 'Additional' 33 | print("Loaded config file successfully ...") 34 | config.write(open(config_file, 'w')) 35 | 36 | def add_args(self, key, value): 37 | self.config.set(self.add_section, key, value) 38 | self.config.write(open(self.config_path, 'w')) 39 | 40 | def write_to_file(self, config_file_path): 41 | self.config.write(open(config_file_path, 'w')) 42 | 43 | # string int float boolean 44 | @property 45 | def test_dir(self): 46 | return self.config.get("Directory", "test_dir") 47 | 48 | @property 49 | def test_log_dir(self): 50 | return self.config.get("Directory", "test_log_dir") 51 | 52 | @property 53 | def root_dir(self): 54 | return self.config.get("Directory", "root_dir") 55 | 56 | @property 57 | def save_dir(self): 58 | return self.config.get("Directory", "save_dir") 59 | 60 | @property 61 | def log_dir(self): 62 | return self.config.get("Directory", "log_dir") 63 | 64 | @property 65 | def pred_dir(self): 66 | return self.config.get("Directory", "pred_dir") 67 | 68 | @property 69 | def data_folder_name(self): 70 | return self.config.get("Directory", "data_folder_name") 71 | 72 | @property 73 | def target_folder_name(self): 74 | return self.config.get("Directory", "target_folder_name") 75 | 76 | @property 77 | def model_name(self): 78 | return self.config.get("Directory", "model_name") 79 | 80 | @property 81 | def batch_size(self): 82 | return self.config.getint("Data", "batch_size") 83 | 84 | @property 85 | def input_channel(self): 86 | return self.config.getint("Data", "input_channel") 87 | 88 | @property 89 | def nb_classes(self): 90 | return self.config.getint("Data", "nb_classes") 91 | 92 | @property 93 | def input_size(self): 94 | return self.config.getint("Data", "input_size") 95 | 96 | @property 97 | def eval_size(self): 98 | return self.config.getint("Data", "eval_size") 99 | 100 | @property 101 | def use_gpu(self): 102 | return self.config.getboolean("General", "use_gpu") 103 | 104 | @property 105 | def device_id(self): 106 | return self.config.getint("General", "device_id") 107 | 108 | @property 109 | def random_seed(self): 110 | return self.config.getint("General", "random_seed") 111 | 112 | @property 113 | def num_workers(self): 114 | return self.config.getint("General", "num_workers") 115 | 116 | @property 117 | def lr_algorithm(self): 118 | return self.config.get("Optimizer", "lr_algorithm") 119 | 120 | @property 121 | def init_lr(self): 122 | return self.config.getfloat("Optimizer", "init_lr") 123 | 124 | @property 125 | def lr_decay(self): 126 | return self.config.getfloat("Optimizer", "lr_decay") 127 | 128 | @property 129 | def momentum(self): 130 | return self.config.getfloat("Optimizer", "momentum") 131 | 132 | @property 133 | def weight_decay(self): 134 | return self.config.getfloat("Optimizer", "weight_decay") 135 | 136 | @property 137 | def epsilon(self): 138 | return self.config.getfloat("Optimizer", "epsilon") 139 | 140 | @property 141 | def monitor(self): 142 | return self.config.get("Train", "monitor") 143 | 144 | @property 145 | def init_algorithm(self): 146 | return self.config.get("Train", "init_algorithm") 147 | 148 | @property 149 | def use_seed(self): 150 | return self.config.getboolean("Train", "use_seed") 151 | 152 | @property 153 | def use_one_cycle_lr(self): 154 | return self.config.getboolean("Train", "use_one_cycle_lr") 155 | 156 | @property 157 | def use_mix(self): 158 | return self.config.getboolean("Train", "use_mix") 159 | 160 | @property 161 | def early_stop(self): 162 | return self.config.getint("Train", "early_stop") 163 | 164 | @property 165 | def warmup_period(self): 166 | return self.config.getint("Train", "warmup_period") 167 | 168 | @property 169 | def save_period(self): 170 | return self.config.getint("Train", "save_period") 171 | 172 | @property 173 | def epochs(self): 174 | return self.config.getint("Train", "epochs") 175 | 176 | 177 | if __name__ == '__main__': 178 | config = MyConfiguration("config.cfg") 179 | config.config.set("Directory", "root_dir", 180 | r"D:\test") 181 | print(config.root_dir) 182 | -------------------------------------------------------------------------------- /Tester.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import numpy as np 3 | import os 4 | import time 5 | import torch.nn as nn 6 | from tqdm import tqdm 7 | from utils.util import AverageMeter, ensure_dir 8 | from utils.metrics import Evaluator 9 | 10 | class Tester(object): 11 | def __init__(self, 12 | model, 13 | config, 14 | args, 15 | test_data_loader, 16 | class_name, 17 | begin_time, 18 | resume_file): 19 | 20 | # for general 21 | self.config = config 22 | self.args = args 23 | self.device = torch.device('cpu') if self.args.gpu == -1 else torch.device('cuda:{}'.format(self.args.gpu)) 24 | self.class_name = class_name 25 | # for Test 26 | self.model = model.to(self.device) 27 | self.models = [] 28 | 29 | self.loss = self._loss().to(self.device) 30 | 31 | # for time 32 | self.begin_time = begin_time 33 | 34 | # for data 35 | self.test_data_loader = test_data_loader 36 | 37 | # for resume/save path 38 | self.history = { 39 | "eval": { 40 | "loss": [], 41 | "acc": [], 42 | "miou": [], 43 | "time": [], 44 | "prec": [], 45 | "recall": [], 46 | "f_score": [], 47 | }, 48 | } 49 | 50 | self.model_name = self.config.model_name 51 | 52 | # loading args.weight or the checkpoint-best.pth 53 | self.test_log_path = os.path.join(self.args.output, 'test', 'log', self.model_name, 54 | self.begin_time) 55 | ensure_dir(self.test_log_path) 56 | 57 | if self.config.use_seed: 58 | self.resume_ckpt_path = resume_file if resume_file is not None else \ 59 | os.path.join(self.config.save_dir, self.model_name, 60 | self.begin_time + '_seed' + str(self.config.random_seed), 'checkpoint-best.pth') 61 | else: 62 | self.resume_ckpt_path = resume_file if resume_file is not None else \ 63 | os.path.join(self.config.save_dir, self.model_name, 64 | self.begin_time, 'checkpoint-best.pth') 65 | 66 | self.evaluator = Evaluator(self.config.nb_classes, self.device) 67 | 68 | def _loss(self): 69 | loss = nn.CrossEntropyLoss() 70 | return loss 71 | 72 | def eval_and_predict(self): 73 | self._resume_ckpt() 74 | 75 | self.model.eval() 76 | self.evaluator.reset() 77 | 78 | ave_total_loss = AverageMeter() 79 | 80 | with torch.no_grad(): 81 | tic = time.time() 82 | for steps, (imgs, gts, filenames) in tqdm(enumerate(self.test_data_loader, start=1)): 83 | imgs = imgs.to(self.device, non_blocking=True) 84 | gts = gts.to(self.device, non_blocking=True) 85 | 86 | # sup loss 87 | sup_logits_l = self.model(imgs, step=1) 88 | gts = gts.long() 89 | 90 | loss = self.loss(sup_logits_l, gts) 91 | 92 | pred = torch.argmax(sup_logits_l, dim=1) 93 | pred = pred.view(-1).long() 94 | label = gts.view(-1).long() 95 | # Add batch sample into evaluator 96 | self.evaluator.add_batch(label, pred) 97 | 98 | ave_total_loss.update(loss.item()) 99 | total_time = time.time() - tic 100 | acc = self.evaluator.Pixel_Accuracy().cpu().detach().numpy() 101 | miou = self.evaluator.Mean_Intersection_over_Union().cpu().detach().numpy() 102 | TP, FP, FN, TN = self.evaluator.get_base_value() 103 | confusion_matrix = self.evaluator.get_confusion_matrix().cpu().detach().numpy() 104 | iou = self.evaluator.get_iou().cpu().detach().numpy() 105 | prec = self.evaluator.Pixel_Precision_Class().cpu().detach().numpy() 106 | recall = self.evaluator.Pixel_Recall_Class().cpu().detach().numpy() 107 | f1_score = self.evaluator.Pixel_F1_score_Class().cpu().detach().numpy() 108 | 109 | # display evaluation result 110 | print('Evaluation phase !\n' 111 | 'Accuracy: {:6.4f}, Loss: {:.6f}'.format( 112 | acc, ave_total_loss.average())) 113 | np.set_printoptions(formatter={'int': '{: 9}'.format}) 114 | print('Class: ', self.class_name, ' Average') 115 | np.set_printoptions(formatter={'float': '{: 6.6f}'.format}) 116 | print('IoU: ', np.hstack((iou, np.average(iou)))) 117 | print('Precision:', np.hstack((prec, np.average(prec)))) 118 | print('Recall: ', np.hstack((recall, np.average(recall)))) 119 | print('F_Score: ', np.hstack((f1_score, np.average(f1_score)))) 120 | np.set_printoptions(formatter={'int': '{:14}'.format}) 121 | print('Confusion_matrix:') 122 | print(confusion_matrix) 123 | 124 | print('Prediction Phase !\n' 125 | 'Total Time cost: {:.2f}s\n' 126 | .format(total_time, 127 | )) 128 | self.history["eval"]["loss"].append(ave_total_loss.average()) 129 | self.history["eval"]["acc"].append(acc.tolist()) 130 | self.history["eval"]["miou"].append(iou.tolist()) 131 | self.history["eval"]["time"].append(total_time) 132 | 133 | self.history["eval"]["prec"].append(prec.tolist()) 134 | self.history["eval"]["recall"].append(recall.tolist()) 135 | self.history["eval"]["f_score"].append(f1_score.tolist()) 136 | 137 | # Save results to log file 138 | print(" + Saved history of evaluation phase !") 139 | hist_path = os.path.join(self.test_log_path, "test-result.txt") 140 | with open(hist_path, 'w') as f: 141 | f.write(str(self.history).replace("'", '"')) 142 | f.write('\nConfusion_matrix:\n') 143 | f.write(str(confusion_matrix)) 144 | 145 | np.set_printoptions(formatter={'int': '{: 9}'.format}) 146 | f.write('\nClass: ' + str(self.class_name) + ' Average') 147 | np.set_printoptions(formatter={'float': '{: 6.6f}'.format}) 148 | format_iou = np.hstack((iou, np.average(iou))) 149 | format_prec = np.hstack((prec, np.average(prec))) 150 | format_recall = np.hstack((recall, np.average(recall))) 151 | format_f1_score = np.hstack((f1_score, np.average(f1_score))) 152 | f.write('\nIoU: ' + str(format_iou)) 153 | f.write('\nPrecision:' + str(format_prec)) 154 | f.write('\nRecall: ' + str(format_recall)) 155 | f.write('\nF1_score: ' + str(format_f1_score)) 156 | 157 | def _resume_ckpt(self): 158 | print(" + Loading ckpt path : {} ...".format(self.resume_ckpt_path)) 159 | checkpoint = torch.load(self.resume_ckpt_path) 160 | self.model.load_state_dict(checkpoint['state_dict'], strict=True) 161 | print(" + Model State Loaded ! :D ") 162 | print(" + Checkpoint file: '{}' , Loaded ! \n" 163 | " + Prepare to test ! ! !" 164 | .format(self.resume_ckpt_path)) 165 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | import argparse 3 | import torch 4 | import random 5 | import numpy as np 6 | from configs.config import MyConfiguration 7 | from Trainer import Trainer 8 | from Tester import Tester 9 | from data.dataset_list import MyDataset 10 | from torch.utils.data import DataLoader 11 | from models import CPS_Network 12 | 13 | def for_train(model, 14 | config, 15 | args, 16 | train_data_loader, 17 | train_unsup_data_loader0, 18 | train_unsup_data_loader1, 19 | valid_data_loader, 20 | begin_time, 21 | resume_file): 22 | myTrainer = Trainer(model=model, config=config, args=args, 23 | train_data_loader=train_data_loader, 24 | valid_data_loader=valid_data_loader, 25 | train_unsup_data_loader0=train_unsup_data_loader0, 26 | train_unsup_data_loader1=train_unsup_data_loader1, 27 | begin_time=begin_time, 28 | resume_file=resume_file) 29 | 30 | myTrainer.train() 31 | print(" Training Done ! ") 32 | 33 | 34 | def for_test(model, config, args, test_data_loader, class_name, begin_time, resume_file): 35 | myTester = Tester(model=model, config=config, args=args, 36 | test_data_loader=test_data_loader, 37 | class_name=class_name, 38 | begin_time=begin_time, 39 | resume_file=resume_file) 40 | 41 | myTester.eval_and_predict() 42 | print(" Evaluation Done ! ") 43 | 44 | 45 | def main(config, args): 46 | # model initialization 47 | model = CPS_Network.FCNs_CPS(in_ch=config.input_channel, out_ch=config.nb_classes, backbone='vgg16_bn', 48 | pretrained=True) 49 | 50 | if hasattr(model, 'name'): 51 | config.config.set("Directory", "model_name", model.name + '_classhyper') 52 | 53 | # obtain the maximum number of samples 54 | temp_datset_sup = MyDataset(config=config, args=args, subset='train') 55 | temp_datset_unsup = MyDataset(config=config, args=args, subset='train_unsup') 56 | l_sup = len(temp_datset_sup) 57 | l_unsup = len(temp_datset_unsup) 58 | max_samples = max(l_sup, l_unsup) 59 | del temp_datset_unsup, temp_datset_sup 60 | 61 | # initialize the training dataset 62 | train_dataset = MyDataset(config=config, args=args, subset='train', file_length=max_samples) 63 | train_unsup_dataset = MyDataset(config=config, args=args, subset='train_unsup', file_length=max_samples) 64 | valid_dataset = MyDataset(config=config, args=args, subset='val') 65 | test_dataset = MyDataset(config=config, args=args, subset='test') 66 | 67 | # initialize the training Dataloader 68 | train_data_loader = DataLoader(dataset=train_dataset, 69 | batch_size=config.batch_size, 70 | shuffle=True, 71 | pin_memory=True, 72 | num_workers=args.threads, 73 | drop_last=True) 74 | train_unsup_data_loader0 = DataLoader(dataset=train_unsup_dataset, 75 | batch_size=config.batch_size, 76 | shuffle=True, 77 | pin_memory=True, 78 | num_workers=args.threads, 79 | drop_last=True) 80 | train_unsup_data_loader1 = DataLoader(dataset=train_unsup_dataset, 81 | batch_size=config.batch_size, 82 | shuffle=True, 83 | pin_memory=True, 84 | num_workers=args.threads, 85 | drop_last=True) 86 | 87 | valid_data_loader = DataLoader(dataset=valid_dataset, 88 | batch_size=config.batch_size, 89 | shuffle=False, 90 | pin_memory=True, 91 | num_workers=args.threads, 92 | drop_last=False) 93 | test_data_loader = DataLoader(dataset=test_dataset, 94 | batch_size=config.batch_size, 95 | shuffle=False, 96 | pin_memory=True, 97 | num_workers=args.threads, 98 | drop_last=False) 99 | begin_time = datetime.datetime.now().strftime('%Y%m%d_%H%M%S') 100 | 101 | if config.use_gpu: 102 | model = model.cuda(device=args.gpu) 103 | 104 | for_train(model=model, config=config, args=args, 105 | train_data_loader=train_data_loader, 106 | valid_data_loader=valid_data_loader, 107 | train_unsup_data_loader0=train_unsup_data_loader0, 108 | train_unsup_data_loader1=train_unsup_data_loader1, 109 | begin_time=begin_time, 110 | resume_file=args.weight) 111 | 112 | for_test(model=model, config=config, args=args, 113 | test_data_loader=test_data_loader, 114 | class_name=test_dataset.class_names, 115 | begin_time=begin_time, 116 | resume_file=None 117 | ) 118 | 119 | 120 | if __name__ == '__main__': 121 | config = MyConfiguration('configs/config.cfg') 122 | 123 | parser = argparse.ArgumentParser(description="Model Training") 124 | parser.add_argument('-input', metavar='input', type=str, default=config.root_dir, 125 | help='root path to directory containing input images, including train & valid & test') 126 | parser.add_argument('-output', metavar='output', type=str, default=config.save_dir, 127 | help='root path to directory containing all the output, including predictions, logs and ckpt') 128 | parser.add_argument('-weight', metavar='weight', type=str, default=None, 129 | help='path to ckpt which will be loaded') 130 | parser.add_argument('-threads', metavar='threads', type=int, default=2, 131 | help='number of thread used for DataLoader') 132 | parser.add_argument('-is_test', action='store_true', default=False, 133 | help='in train mode, is_test=False') 134 | if config.use_gpu: 135 | parser.add_argument('-gpu', metavar='gpu', type=int, default=0, 136 | help='gpu id to be used for prediction') 137 | else: 138 | parser.add_argument('-gpu', metavar='gpu', type=int, default=-1, 139 | help='gpu id to be used for prediction') 140 | 141 | args = parser.parse_args() 142 | 143 | if config.use_seed: 144 | torch.backends.cudnn.benchmark = False 145 | torch.backends.cudnn.deterministic = True 146 | torch.cuda.manual_seed(config.random_seed) 147 | torch.manual_seed(config.random_seed) 148 | random.seed(config.random_seed) 149 | np.random.seed(config.random_seed) 150 | else: 151 | torch.backends.cudnn.benchmark = True 152 | 153 | main(config=config, args=args) 154 | -------------------------------------------------------------------------------- /data/dataset_list.py: -------------------------------------------------------------------------------- 1 | import os 2 | import torch 3 | import numpy as np 4 | from torch.utils.data import Dataset 5 | from PIL import Image 6 | import cv2 7 | import albumentations as A 8 | from albumentations.pytorch import ToTensorV2 9 | 10 | rgb_mean = (0.485, 0.456, 0.406) 11 | rgb_std = (0.229, 0.224, 0.225) 12 | 13 | class MyDataset(Dataset): 14 | def __init__(self, 15 | config, 16 | args, 17 | subset, 18 | file_length=None): 19 | super(MyDataset, self).__init__() 20 | assert subset == 'train' or subset == 'val' or subset == 'test' or subset == 'train_unsup' 21 | 22 | self.args = args 23 | self.config = config 24 | self.root = args.input 25 | self.subset = subset 26 | self.data = self.config.data_folder_name # image 27 | self.target = self.config.target_folder_name # label 28 | self._file_length = file_length 29 | 30 | if self.config.nb_classes == 2: # binary class(buildings and roads) 31 | self.mapping = { 32 | 0: 0, 33 | 255: 1, 34 | } 35 | self.class_names = ['other', 'building'] 36 | elif self.config.nb_classes == 6: # ISPRS dataset (six class) 37 | self.mapping = { 38 | (255, 255, 255): 0, 39 | (0, 0, 255): 1, 40 | (0, 255, 255): 2, 41 | (0, 255, 0): 3, 42 | (255, 255, 0): 4, 43 | (255, 0, 0): 5, 44 | (0, 0, 0): 6 45 | } 46 | self.class_names = ['Impervious surfaces', 'building', 'low vegetation', 'tree', 'car', 47 | 'clutter/background'] 48 | 49 | self.data_list = [] 50 | self.target_list = [] 51 | with open(os.path.join(self.root, subset + '_image.txt'), 'r') as f: 52 | for line in f: 53 | if line.strip('\n') != '': 54 | self.data_list.append(line.strip('\n')) 55 | if subset != 'train_unsup': 56 | with open(os.path.join(self.root, subset + '_label.txt'), 'r') as f: 57 | for line in f: 58 | if line.strip('\n') != '': 59 | self.target_list.append(line.strip('\n')) 60 | 61 | if self._file_length is not None: 62 | self.data_list, self.target_list = self._construct_new_file_list(self._file_length, is_UnsupData=False) 63 | else: 64 | if self._file_length is not None: 65 | self.data_list = self._construct_new_file_list(self._file_length, is_UnsupData=True) 66 | 67 | def _construct_new_file_list(self, length, is_UnsupData): 68 | """ 69 | Construct new file list based on whether is unlabeled data or not 70 | """ 71 | assert isinstance(length, int) 72 | files_len = len(self.data_list) 73 | 74 | if length < files_len: 75 | if not is_UnsupData: 76 | return self.data_list[:length], self.target_list[:length] 77 | else: 78 | return self.data_list[:length] 79 | 80 | rand_indices = torch.randperm(files_len).tolist() 81 | new_indices = rand_indices[:length % files_len] 82 | 83 | new_data_list = self.data_list * (length // files_len) 84 | new_data_list += [self.data_list[i] for i in new_indices] 85 | 86 | if not is_UnsupData: 87 | new_target_list = self.target_list * (length // files_len) 88 | new_target_list += [self.target_list[i] for i in new_indices] 89 | return new_data_list, new_target_list 90 | else: 91 | return new_data_list 92 | 93 | def mask_to_class(self, mask): 94 | """ 95 | Encode class to number 96 | """ 97 | if self.config.nb_classes == 2: 98 | for k in self.mapping: 99 | mask[mask == k] = self.mapping[k] 100 | return mask 101 | elif self.config.nb_classes == 6: 102 | mask = mask.permute(2, 0, 1).contiguous() 103 | m = torch.empty(self.config.input_size, self.config.input_size, dtype=torch.long) 104 | for k in self.mapping: 105 | idx = (mask == torch.tensor(k, dtype=torch.uint8).unsqueeze(1).unsqueeze(2)) 106 | validx = (idx.sum(0) == 3) 107 | m[validx] = torch.tensor(self.mapping[k], dtype=torch.long) 108 | return m 109 | 110 | def train_transforms(self, image, mask): 111 | """ 112 | Preprocessing and augmentation on training data (image and label) 113 | """ 114 | in_size = self.config.input_size 115 | train_transform = A.Compose( 116 | [ 117 | A.Resize(in_size, in_size, interpolation=cv2.INTER_NEAREST), 118 | A.HorizontalFlip(p=0.8), 119 | A.VerticalFlip(p=0.8), 120 | A.RandomRotate90(p=0.8), 121 | A.Transpose(p=0.8), 122 | A.Normalize(mean=rgb_mean, std=rgb_std), 123 | ToTensorV2(), 124 | ] 125 | ) 126 | transformed = train_transform(image=image, mask=mask) 127 | image = transformed["image"] 128 | mask = transformed["mask"] 129 | 130 | mask = self.mask_to_class(mask) 131 | 132 | mask = mask.float() 133 | return image, mask 134 | 135 | def untrain_transforms(self, image, mask): 136 | """ 137 | Preprocessing on val or test data (image and label) 138 | """ 139 | untrain_transform = A.Compose( 140 | [ 141 | A.Resize(self.config.eval_size, self.config.eval_size, interpolation=cv2.INTER_NEAREST), 142 | A.Normalize(mean=rgb_mean, std=rgb_std), 143 | ToTensorV2(), 144 | ] 145 | ) 146 | transformed = untrain_transform(image=image, mask=mask) 147 | image = transformed["image"] 148 | mask = transformed["mask"] 149 | 150 | mask = self.mask_to_class(mask) 151 | mask = mask.float() 152 | return image, mask 153 | 154 | def untrain_transforms1(self, image): 155 | """ 156 | Preprocessing on unsup data (image) 157 | """ 158 | untrain_transform = A.Compose( 159 | [ 160 | A.Resize(self.config.eval_size, self.config.eval_size), 161 | A.Normalize(mean=rgb_mean, std=rgb_std), 162 | ToTensorV2(), 163 | ] 164 | ) 165 | transformed = untrain_transform(image=image) 166 | image = transformed["image"] 167 | 168 | return image 169 | 170 | def __getitem__(self, index): 171 | image = cv2.imread(self.data_list[index]) 172 | image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 173 | if self.subset != 'train_unsup': 174 | mask = np.array(Image.open(self.target_list[index])).astype(np.uint8) 175 | 176 | if self.subset == 'train': 177 | if not self.args.is_test: 178 | t_datas, t_targets = self.train_transforms(image, mask) 179 | else: 180 | t_datas, t_targets = self.untrain_transforms(image, mask) 181 | return t_datas, t_targets, self.data_list[index] 182 | elif self.subset == 'train_unsup': 183 | t_datas = self.untrain_transforms1(image) 184 | return t_datas, self.data_list[index] 185 | elif self.subset == 'val' or self.subset == 'test': 186 | t_datas, t_targets = self.untrain_transforms(image, mask) 187 | return t_datas, t_targets, self.data_list[index] 188 | 189 | def __len__(self): 190 | 191 | return len(self.data_list) 192 | -------------------------------------------------------------------------------- /examples/test_image.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_000_000.tif 2 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_000_001.tif 3 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_000_002.tif 4 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_001_000.tif 5 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_001_001.tif 6 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_001_002.tif 7 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_002_000.tif 8 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_002_001.tif 9 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_002_002.tif 10 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_003_000.tif 11 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_003_001.tif 12 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area10_003_002.tif 13 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_000_000.tif 14 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_000_001.tif 15 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_000_002.tif 16 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_001_000.tif 17 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_001_001.tif 18 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_001_002.tif 19 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_002_000.tif 20 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_002_001.tif 21 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_002_002.tif 22 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_003_000.tif 23 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_003_001.tif 24 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_003_002.tif 25 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_004_000.tif 26 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_004_001.tif 27 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area12_004_002.tif 28 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_000_000.tif 29 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_000_001.tif 30 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_000_002.tif 31 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_001_000.tif 32 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_001_001.tif 33 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_001_002.tif 34 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_002_000.tif 35 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_002_001.tif 36 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_002_002.tif 37 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_003_000.tif 38 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_003_001.tif 39 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_003_002.tif 40 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_004_000.tif 41 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_004_001.tif 42 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area14_004_002.tif 43 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_000_000.tif 44 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_000_001.tif 45 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_000_002.tif 46 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_001_000.tif 47 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_001_001.tif 48 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_001_002.tif 49 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_002_000.tif 50 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_002_001.tif 51 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_002_002.tif 52 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_003_000.tif 53 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_003_001.tif 54 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_003_002.tif 55 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_004_000.tif 56 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_004_001.tif 57 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area16_004_002.tif 58 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_000_000.tif 59 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_000_001.tif 60 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_000_002.tif 61 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_001_000.tif 62 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_001_001.tif 63 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_001_002.tif 64 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_002_000.tif 65 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_002_001.tif 66 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_002_002.tif 67 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_003_000.tif 68 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_003_001.tif 69 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area20_003_002.tif 70 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_000_000.tif 71 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_000_001.tif 72 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_000_002.tif 73 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_001_000.tif 74 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_001_001.tif 75 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_001_002.tif 76 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_002_000.tif 77 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_002_001.tif 78 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_002_002.tif 79 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_003_000.tif 80 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_003_001.tif 81 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area22_003_002.tif 82 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_000_000.tif 83 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_000_001.tif 84 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_000_002.tif 85 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_001_000.tif 86 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_001_001.tif 87 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_001_002.tif 88 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_002_000.tif 89 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_002_001.tif 90 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_002_002.tif 91 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_003_000.tif 92 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_003_001.tif 93 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area24_003_002.tif 94 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_000_000.tif 95 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_000_001.tif 96 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_000_002.tif 97 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_001_000.tif 98 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_001_001.tif 99 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_001_002.tif 100 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_002_000.tif 101 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_002_001.tif 102 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_002_002.tif 103 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_003_000.tif 104 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_003_001.tif 105 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_003_002.tif 106 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_004_000.tif 107 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_004_001.tif 108 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_004_002.tif 109 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_005_000.tif 110 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_005_001.tif 111 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area27_005_002.tif 112 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_000_000.tif 113 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_000_001.tif 114 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_000_002.tif 115 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_001_000.tif 116 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_001_001.tif 117 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_001_002.tif 118 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_002_000.tif 119 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_002_001.tif 120 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_002_002.tif 121 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_003_000.tif 122 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_003_001.tif 123 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_003_002.tif 124 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_004_000.tif 125 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_004_001.tif 126 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area29_004_002.tif 127 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_000_000.tif 128 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_000_001.tif 129 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_000_002.tif 130 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_000_003.tif 131 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_001_000.tif 132 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_001_001.tif 133 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_001_002.tif 134 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_001_003.tif 135 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_002_000.tif 136 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_002_001.tif 137 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_002_002.tif 138 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_002_003.tif 139 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_003_000.tif 140 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_003_001.tif 141 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_003_002.tif 142 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_003_003.tif 143 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_004_000.tif 144 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_004_001.tif 145 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_004_002.tif 146 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area2_004_003.tif 147 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_000_000.tif 148 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_000_001.tif 149 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_000_002.tif 150 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_001_000.tif 151 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_001_001.tif 152 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_001_002.tif 153 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_002_000.tif 154 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_002_001.tif 155 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_002_002.tif 156 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_003_000.tif 157 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_003_001.tif 158 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area31_003_002.tif 159 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_000_000.tif 160 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_000_001.tif 161 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_000_002.tif 162 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_001_000.tif 163 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_001_001.tif 164 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_001_002.tif 165 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_002_000.tif 166 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_002_001.tif 167 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_002_002.tif 168 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_003_000.tif 169 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_003_001.tif 170 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area33_003_002.tif 171 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_000_000.tif 172 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_000_001.tif 173 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_000_002.tif 174 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_000_003.tif 175 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_000_004.tif 176 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_001_000.tif 177 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_001_001.tif 178 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_001_002.tif 179 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_001_003.tif 180 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_001_004.tif 181 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_002_000.tif 182 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_002_001.tif 183 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_002_002.tif 184 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_002_003.tif 185 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area35_002_004.tif 186 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_000.tif 187 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_001.tif 188 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_002.tif 189 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_003.tif 190 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_004.tif 191 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_005.tif 192 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_000_006.tif 193 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_000.tif 194 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_001.tif 195 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_002.tif 196 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_003.tif 197 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_004.tif 198 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_005.tif 199 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_001_006.tif 200 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_000.tif 201 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_001.tif 202 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_002.tif 203 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_003.tif 204 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_004.tif 205 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_005.tif 206 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_002_006.tif 207 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_000.tif 208 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_001.tif 209 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_002.tif 210 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_003.tif 211 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_004.tif 212 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_005.tif 213 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area38_003_006.tif 214 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_000_000.tif 215 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_000_001.tif 216 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_000_002.tif 217 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_001_000.tif 218 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_001_001.tif 219 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_001_002.tif 220 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_002_000.tif 221 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_002_001.tif 222 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_002_002.tif 223 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_003_000.tif 224 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_003_001.tif 225 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area4_003_002.tif 226 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_000_000.tif 227 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_000_001.tif 228 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_000_002.tif 229 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_001_000.tif 230 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_001_001.tif 231 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_001_002.tif 232 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_002_000.tif 233 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_002_001.tif 234 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_002_002.tif 235 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_003_000.tif 236 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_003_001.tif 237 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area6_003_002.tif 238 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_000_000.tif 239 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_000_001.tif 240 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_000_002.tif 241 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_001_000.tif 242 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_001_001.tif 243 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_001_002.tif 244 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_002_000.tif 245 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_002_001.tif 246 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_002_002.tif 247 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_003_000.tif 248 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_003_001.tif 249 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area8_003_002.tif 250 | -------------------------------------------------------------------------------- /examples/test_label.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_000_000.tif 2 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_000_001.tif 3 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_000_002.tif 4 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_001_000.tif 5 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_001_001.tif 6 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_001_002.tif 7 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_002_000.tif 8 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_002_001.tif 9 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_002_002.tif 10 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_003_000.tif 11 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_003_001.tif 12 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area10_003_002.tif 13 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_000_000.tif 14 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_000_001.tif 15 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_000_002.tif 16 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_001_000.tif 17 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_001_001.tif 18 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_001_002.tif 19 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_002_000.tif 20 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_002_001.tif 21 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_002_002.tif 22 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_003_000.tif 23 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_003_001.tif 24 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_003_002.tif 25 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_004_000.tif 26 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_004_001.tif 27 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area12_004_002.tif 28 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_000_000.tif 29 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_000_001.tif 30 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_000_002.tif 31 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_001_000.tif 32 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_001_001.tif 33 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_001_002.tif 34 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_002_000.tif 35 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_002_001.tif 36 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_002_002.tif 37 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_003_000.tif 38 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_003_001.tif 39 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_003_002.tif 40 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_004_000.tif 41 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_004_001.tif 42 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area14_004_002.tif 43 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_000_000.tif 44 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_000_001.tif 45 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_000_002.tif 46 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_001_000.tif 47 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_001_001.tif 48 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_001_002.tif 49 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_002_000.tif 50 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_002_001.tif 51 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_002_002.tif 52 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_003_000.tif 53 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_003_001.tif 54 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_003_002.tif 55 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_004_000.tif 56 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_004_001.tif 57 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area16_004_002.tif 58 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_000_000.tif 59 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_000_001.tif 60 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_000_002.tif 61 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_001_000.tif 62 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_001_001.tif 63 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_001_002.tif 64 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_002_000.tif 65 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_002_001.tif 66 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_002_002.tif 67 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_003_000.tif 68 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_003_001.tif 69 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area20_003_002.tif 70 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_000_000.tif 71 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_000_001.tif 72 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_000_002.tif 73 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_001_000.tif 74 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_001_001.tif 75 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_001_002.tif 76 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_002_000.tif 77 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_002_001.tif 78 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_002_002.tif 79 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_003_000.tif 80 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_003_001.tif 81 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area22_003_002.tif 82 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_000_000.tif 83 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_000_001.tif 84 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_000_002.tif 85 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_001_000.tif 86 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_001_001.tif 87 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_001_002.tif 88 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_002_000.tif 89 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_002_001.tif 90 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_002_002.tif 91 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_003_000.tif 92 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_003_001.tif 93 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area24_003_002.tif 94 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_000_000.tif 95 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_000_001.tif 96 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_000_002.tif 97 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_001_000.tif 98 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_001_001.tif 99 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_001_002.tif 100 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_002_000.tif 101 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_002_001.tif 102 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_002_002.tif 103 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_003_000.tif 104 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_003_001.tif 105 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_003_002.tif 106 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_004_000.tif 107 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_004_001.tif 108 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_004_002.tif 109 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_005_000.tif 110 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_005_001.tif 111 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area27_005_002.tif 112 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_000_000.tif 113 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_000_001.tif 114 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_000_002.tif 115 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_001_000.tif 116 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_001_001.tif 117 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_001_002.tif 118 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_002_000.tif 119 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_002_001.tif 120 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_002_002.tif 121 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_003_000.tif 122 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_003_001.tif 123 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_003_002.tif 124 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_004_000.tif 125 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_004_001.tif 126 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area29_004_002.tif 127 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_000_000.tif 128 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_000_001.tif 129 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_000_002.tif 130 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_000_003.tif 131 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_001_000.tif 132 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_001_001.tif 133 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_001_002.tif 134 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_001_003.tif 135 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_002_000.tif 136 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_002_001.tif 137 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_002_002.tif 138 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_002_003.tif 139 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_003_000.tif 140 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_003_001.tif 141 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_003_002.tif 142 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_003_003.tif 143 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_004_000.tif 144 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_004_001.tif 145 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_004_002.tif 146 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area2_004_003.tif 147 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_000_000.tif 148 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_000_001.tif 149 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_000_002.tif 150 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_001_000.tif 151 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_001_001.tif 152 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_001_002.tif 153 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_002_000.tif 154 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_002_001.tif 155 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_002_002.tif 156 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_003_000.tif 157 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_003_001.tif 158 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area31_003_002.tif 159 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_000_000.tif 160 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_000_001.tif 161 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_000_002.tif 162 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_001_000.tif 163 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_001_001.tif 164 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_001_002.tif 165 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_002_000.tif 166 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_002_001.tif 167 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_002_002.tif 168 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_003_000.tif 169 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_003_001.tif 170 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area33_003_002.tif 171 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_000_000.tif 172 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_000_001.tif 173 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_000_002.tif 174 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_000_003.tif 175 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_000_004.tif 176 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_001_000.tif 177 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_001_001.tif 178 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_001_002.tif 179 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_001_003.tif 180 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_001_004.tif 181 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_002_000.tif 182 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_002_001.tif 183 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_002_002.tif 184 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_002_003.tif 185 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area35_002_004.tif 186 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_000.tif 187 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_001.tif 188 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_002.tif 189 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_003.tif 190 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_004.tif 191 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_005.tif 192 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_000_006.tif 193 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_000.tif 194 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_001.tif 195 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_002.tif 196 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_003.tif 197 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_004.tif 198 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_005.tif 199 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_001_006.tif 200 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_000.tif 201 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_001.tif 202 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_002.tif 203 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_003.tif 204 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_004.tif 205 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_005.tif 206 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_002_006.tif 207 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_000.tif 208 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_001.tif 209 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_002.tif 210 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_003.tif 211 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_004.tif 212 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_005.tif 213 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area38_003_006.tif 214 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_000_000.tif 215 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_000_001.tif 216 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_000_002.tif 217 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_001_000.tif 218 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_001_001.tif 219 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_001_002.tif 220 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_002_000.tif 221 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_002_001.tif 222 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_002_002.tif 223 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_003_000.tif 224 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_003_001.tif 225 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area4_003_002.tif 226 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_000_000.tif 227 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_000_001.tif 228 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_000_002.tif 229 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_001_000.tif 230 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_001_001.tif 231 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_001_002.tif 232 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_002_000.tif 233 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_002_001.tif 234 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_002_002.tif 235 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_003_000.tif 236 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_003_001.tif 237 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area6_003_002.tif 238 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_000_000.tif 239 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_000_001.tif 240 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_000_002.tif 241 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_001_000.tif 242 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_001_001.tif 243 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_001_002.tif 244 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_002_000.tif 245 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_002_001.tif 246 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_002_002.tif 247 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_003_000.tif 248 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_003_001.tif 249 | D:\ISPRS\Vaihingen\label\top_mosaic_09cm_area8_003_002.tif 250 | -------------------------------------------------------------------------------- /Trainer.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import math 4 | import numpy as np 5 | import torch 6 | import torch.optim as optim 7 | import torch.nn as nn 8 | import torch.nn.init as init 9 | from utils.util import AverageMeter, ensure_dir 10 | from tqdm import tqdm 11 | from utils.metrics import Evaluator 12 | import shutil 13 | import utils.mask_gen as mask_gen 14 | from torch.cuda.amp import autocast 15 | from torch.cuda.amp import grad_scaler 16 | 17 | 18 | class Trainer(object): 19 | 20 | def __init__(self, 21 | model, 22 | config, 23 | args, 24 | train_data_loader, 25 | valid_data_loader, 26 | train_unsup_data_loader0, 27 | train_unsup_data_loader1, 28 | begin_time, 29 | resume_file=None): 30 | 31 | print(" + Training Start ... ...") 32 | # for general 33 | self.config = config 34 | self.args = args 35 | self.device = (self._device(self.args.gpu)) 36 | self.model = model.to(self.device) 37 | 38 | self.train_data_loader = train_data_loader 39 | self.valid_data_loder = valid_data_loader 40 | self.unsupervised_train_loader_0 = train_unsup_data_loader0 41 | self.unsupervised_train_loader_1 = train_unsup_data_loader1 42 | 43 | # for time 44 | self.begin_time = begin_time # part of ckpt name 45 | self.save_period = self.config.save_period # for save ckpt 46 | 47 | self.model_name = self.config.model_name 48 | 49 | if self.config.use_seed: 50 | self.checkpoint_dir = os.path.join(self.args.output, self.model_name, 51 | self.begin_time + '_seed' + str(self.config.random_seed)) 52 | self.log_dir = os.path.join(self.args.output, self.model_name, 53 | self.begin_time + '_seed' + str(self.config.random_seed), 'log') 54 | else: 55 | self.checkpoint_dir = os.path.join(self.args.output, self.model_name, 56 | self.begin_time) 57 | self.log_dir = os.path.join(self.args.output, self.model_name, 58 | self.begin_time, 'log') 59 | 60 | ensure_dir(self.checkpoint_dir) 61 | ensure_dir(self.log_dir) 62 | 63 | # output config to log file 64 | log_file_path = os.path.join(self.log_dir, self.model_name + '.txt') 65 | self.config.write_to_file(log_file_path) 66 | 67 | self.history = { 68 | 'train': { 69 | 'epoch': [], 70 | 'loss': [], 71 | 'acc': [], 72 | 'miou': [], 73 | 'prec': [], 74 | 'recall': [], 75 | 'f_score': [], 76 | }, 77 | 'valid': { 78 | 'epoch': [], 79 | 'loss': [], 80 | 'acc': [], 81 | 'miou': [], 82 | 'prec': [], 83 | 'recall': [], 84 | 'f_score': [], 85 | } 86 | } 87 | # for optimize 88 | self.weight_init_algorithm = self.config.init_algorithm 89 | self.current_lr = self.config.init_lr 90 | 91 | # for train 92 | self.start_epoch = 0 93 | self.early_stop = self.config.early_stop # early stop steps 94 | self.monitor_mode = self.config.monitor.split('/')[0] 95 | self.monitor_metric = self.config.monitor.split('/')[1] 96 | self.monitor_best = 0 97 | self.best_epoch = -1 98 | self.not_improved_count = 0 99 | self.monitor_iou = 0 100 | 101 | # resume file 102 | self.resume_file = resume_file 103 | self.resume_ = True if resume_file else False 104 | if self.resume_file is not None: 105 | with open(log_file_path, 'a') as f: 106 | f.write('\n') 107 | f.write('resume_file:' + resume_file + '\n') 108 | 109 | self.loss = self._loss().to(self.device) 110 | self.optimizer_1 = self._optimizer(lr_algorithm=self.config.lr_algorithm) 111 | self.optimizer_2 = self._optimizer(lr_algorithm=self.config.lr_algorithm) 112 | 113 | # monitor init 114 | if self.monitor_mode != 'off': 115 | assert self.monitor_mode in ['min', 'max'] 116 | self.monitor_best = math.inf if self.monitor_mode == 'min' else -math.inf 117 | 118 | if self.config.use_one_cycle_lr: 119 | self.lr_scheduler_1 = self._lr_scheduler_onecycle(self.optimizer_1) 120 | self.lr_scheduler_2 = self._lr_scheduler_onecycle(self.optimizer_2) 121 | else: 122 | self.lr_scheduler_1 = self._lr_scheduler_lambda(self.optimizer_1, last_epoch=self.start_epoch - 1) 123 | self.lr_scheduler_2 = self._lr_scheduler_lambda(self.optimizer_2, last_epoch=self.start_epoch - 1) 124 | 125 | # Evaluator 126 | self.evaluator = Evaluator(self.config.nb_classes, self.device) 127 | 128 | def _device(self, gpu): 129 | if gpu == -1: 130 | device = torch.device('cpu') 131 | return device 132 | else: 133 | device = torch.device('cuda:{}'.format(gpu)) 134 | return device 135 | 136 | def _optimizer(self, lr_algorithm): 137 | assert lr_algorithm in ['adam', 'adamw', 'sgd'] 138 | if lr_algorithm == 'adam': 139 | optimizer = optim.Adam(filter(lambda p: p.requires_grad, self.model.parameters()), 140 | lr=self.current_lr, 141 | betas=(0.9, 0.999), 142 | eps=1e-08, 143 | weight_decay=self.config.weight_decay, 144 | amsgrad=False 145 | ) 146 | elif lr_algorithm == 'sgd': 147 | optimizer = optim.SGD(filter(lambda p: p.requires_grad, self.model.parameters()), 148 | lr=self.current_lr, 149 | momentum=self.config.momentum, 150 | dampening=0, 151 | weight_decay=self.config.weight_decay, 152 | nesterov=True) 153 | elif lr_algorithm == 'adamw': 154 | optimizer = optim.AdamW(filter(lambda p: p.requires_grad, self.model.parameters()), 155 | lr=self.current_lr, 156 | betas=(0.9, 0.999), 157 | eps=1e-08, 158 | weight_decay=self.config.weight_decay, 159 | amsgrad=False 160 | ) 161 | return optimizer 162 | 163 | def _loss(self): 164 | loss = nn.CrossEntropyLoss() 165 | return loss 166 | 167 | def _lr_scheduler_onecycle(self, optimizer): 168 | lr_scheduler = optim.lr_scheduler.OneCycleLR(optimizer, max_lr=self.config.init_lr * 6, 169 | steps_per_epoch=len(self.train_data_loader), 170 | epochs=self.config.epochs + 1, 171 | div_factor=6) 172 | return lr_scheduler 173 | 174 | def _lr_scheduler_lambda(self, optimizer, last_epoch): 175 | lambda1 = lambda epoch: pow((1 - ((epoch - 1) / self.config.epochs)), 0.9) 176 | lr_scheduler = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1, last_epoch=last_epoch) 177 | 178 | return lr_scheduler 179 | 180 | def _weight_init(self, m): 181 | classname = m.__class__.__name__ 182 | if classname.find(' Conv') != -1: 183 | if self.weight_init_algorithm == 'kaiming': 184 | init.kaiming_normal_(m.weight.data) 185 | else: 186 | init.xavier_normal_(m.weight.data) 187 | m.bias.data.zero_() 188 | elif classname.find('BatchNorm2d') != -1: 189 | m.weight.data.normal_(1.0, 0.02) 190 | m.bias.data.fill_(0) 191 | 192 | def train(self): 193 | if self.resume_ == False: 194 | # init weights 195 | self.model.apply(self._weight_init) 196 | print(" + Init weight ... Done !") 197 | else: 198 | # load the checkpoint file: resume_file 199 | self._resume_ckpt(resume_file=self.resume_file) 200 | print(" + Loading pth model file ... Done!") 201 | 202 | epochs = self.config.epochs 203 | assert self.start_epoch < epochs 204 | 205 | for epoch in range(self.start_epoch, epochs + 1): 206 | train_log = self._train_epoch_classmix(epoch) 207 | eval_log = self._eval_epoch(epoch) 208 | 209 | # lr update 210 | if not self.config.use_one_cycle_lr: 211 | if self.lr_scheduler_1 is not None: 212 | self.lr_scheduler_1.step(epoch) 213 | for param_group in self.optimizer_1.param_groups: 214 | self.current_lr = param_group['lr'] 215 | if self.lr_scheduler_2 is not None: 216 | self.lr_scheduler_2.step(epoch) 217 | for param_group in self.optimizer_2.param_groups: 218 | self.current_lr = param_group['lr'] 219 | 220 | best = False 221 | if self.monitor_mode != 'off': 222 | improved = (self.monitor_mode == 'min' and eval_log[ 223 | 'val_' + self.monitor_metric] < self.monitor_best) or \ 224 | (self.monitor_mode == 'max' and eval_log['val_' + self.monitor_metric] > self.monitor_best) 225 | if improved: 226 | self.monitor_best = eval_log['val_' + self.monitor_metric] 227 | self.monitor_iou = eval_log['val_MIoU'] 228 | best = True 229 | self.best_epoch = eval_log['epoch'] 230 | self.not_improved_count = 0 231 | else: 232 | self.not_improved_count += 1 233 | 234 | if self.not_improved_count > self.early_stop: 235 | print(" + Validation Performance didn\'t improve for {} epochs." 236 | " + Training stop :/" 237 | .format(self.not_improved_count)) 238 | break 239 | if epoch % self.save_period == 0 or best == True: 240 | self._save_ckpt(epoch, best=best) 241 | 242 | # save history file 243 | print(" + Saving History ... ... ") 244 | hist_path = os.path.join(self.log_dir, 'history.txt') 245 | with open(hist_path, 'w') as f: 246 | f.write(str(self.history)) 247 | 248 | def _train_epoch_classmix(self, epoch): 249 | ave_total_loss = AverageMeter() 250 | 251 | scaler = grad_scaler.GradScaler() 252 | self.evaluator.reset() 253 | 254 | # set model mode 255 | self.model.train() 256 | 257 | train_dataloader = iter(self.train_data_loader) 258 | unsupervised_dataloader_0 = iter(self.unsupervised_train_loader_0) 259 | unsupervised_dataloader_1 = iter(self.unsupervised_train_loader_1) 260 | 261 | max_samples = max(len(self.train_data_loader), len(self.unsupervised_train_loader_0)) * self.config.batch_size 262 | niters_per_epoch = max_samples // self.config.batch_size 263 | bar_format = '{desc}[{elapsed}<{remaining},{rate_fmt}]' 264 | pbar = tqdm(range(niters_per_epoch), file=sys.stdout, bar_format=bar_format) 265 | for idx in pbar: 266 | train_minibatch = train_dataloader.next() 267 | imgs = train_minibatch[0].to(self.device, non_blocking=True) 268 | gts = train_minibatch[1].to(self.device, non_blocking=True) 269 | 270 | self.optimizer_1.zero_grad() 271 | self.optimizer_2.zero_grad() 272 | 273 | cps_loss = 0.0 274 | if epoch > self.config.warmup_period: 275 | unsup_minibatch_0 = unsupervised_dataloader_0.next() 276 | unsup_minibatch_1 = unsupervised_dataloader_1.next() 277 | unsup_imgs_0 = unsup_minibatch_0[0].to(self.device, non_blocking=True) 278 | unsup_imgs_1 = unsup_minibatch_1[0].to(self.device, non_blocking=True) 279 | 280 | with torch.no_grad(): 281 | # Estimate the pseudo-label with branch#1 & supervise branch#2 282 | logits_u0_tea_1 = self.model(unsup_imgs_0, step=1) 283 | prob_u0_tea_1 = torch.sigmoid(logits_u0_tea_1).detach() 284 | 285 | if self.config.use_mix: 286 | logits_u1_tea_1 = self.model(unsup_imgs_1, step=1) 287 | prob_u1_tea_1 = torch.sigmoid(logits_u1_tea_1).detach() 288 | else: 289 | prob_u1_tea_1 = torch.zeros_like(prob_u0_tea_1) 290 | 291 | # Estimate the pseudo-label with branch#2 & supervise branch#1 292 | logits_u0_tea_2 = self.model(unsup_imgs_0, step=2) 293 | prob_u0_tea_2 = torch.sigmoid(logits_u0_tea_2).detach() 294 | 295 | if self.config.use_mix: 296 | logits_u1_tea_2 = self.model(unsup_imgs_1, step=2) 297 | prob_u1_tea_2 = torch.sigmoid(logits_u1_tea_2).detach() 298 | else: 299 | prob_u1_tea_2 = torch.zeros_like(prob_u0_tea_2) 300 | 301 | ps_u1_tea_label_1 = torch.argmax(prob_u1_tea_1, dim=1) 302 | 303 | batch_mix_masks = torch.zeros_like(ps_u1_tea_label_1) 304 | for img_i in range(unsup_imgs_0.shape[0]): 305 | classes = torch.unique(ps_u1_tea_label_1[img_i], sorted=True) 306 | nclasses = classes.shape[0] 307 | if nclasses > 2: 308 | classes = classes[torch.Tensor( 309 | np.random.choice(nclasses, int((nclasses - nclasses % 2) / 2), replace=False)).long()] 310 | elif nclasses == 2: 311 | classes = classes[1].unsqueeze(0) 312 | elif nclasses == 1: 313 | continue 314 | batch_mix_masks[img_i] = mask_gen.generate_class_mask(ps_u1_tea_label_1[img_i], classes) 315 | 316 | batch_mix_masks = batch_mix_masks.unsqueeze(1) 317 | unsup_imgs_mixed = unsup_imgs_0 * (1 - batch_mix_masks) + unsup_imgs_1 * batch_mix_masks 318 | 319 | # Mix teacher predictions using same mask 320 | # the mask pixels are either 1 or 0 321 | prob_cons_tea_1 = prob_u0_tea_1 * (1 - batch_mix_masks) + prob_u1_tea_1 * batch_mix_masks 322 | prob_cons_tea_2 = prob_u0_tea_2 * (1 - batch_mix_masks) + prob_u1_tea_2 * batch_mix_masks 323 | 324 | ps_label_1 = torch.argmax(prob_cons_tea_1, dim=1) 325 | ps_label_2 = torch.argmax(prob_cons_tea_2, dim=1) 326 | 327 | with autocast(): 328 | if epoch > self.config.warmup_period: # warmup 329 | # Get student#1 prediction for mixed image 330 | logits_cons_stu_1 = self.model(unsup_imgs_mixed, step=1) 331 | 332 | # Get student#2 prediction for mixed image 333 | logits_cons_stu_2 = self.model(unsup_imgs_mixed, step=2) 334 | 335 | ps_label_1 = ps_label_1.long() 336 | ps_label_2 = ps_label_2.long() 337 | 338 | cps_loss = self.loss(logits_cons_stu_1, ps_label_2) + self.loss(logits_cons_stu_2, ps_label_1) 339 | 340 | # empirically set coefficient to 1.0 341 | cps_loss = cps_loss * 1.0 342 | 343 | # sup loss 344 | sup_logits_l = self.model(imgs, step=1) 345 | sup_logits_r = self.model(imgs, step=2) 346 | 347 | gts = gts.long() 348 | 349 | loss_sup_l = self.loss(sup_logits_l, gts) 350 | loss_sup_r = self.loss(sup_logits_r, gts) 351 | 352 | loss = loss_sup_l + loss_sup_r + cps_loss 353 | 354 | scaler.scale(loss).backward() 355 | scaler.step(self.optimizer_1) 356 | scaler.step(self.optimizer_2) 357 | scaler.update() 358 | 359 | pred = torch.argmax(sup_logits_l, dim=1) 360 | pred = pred.view(-1).long() 361 | 362 | label = gts.view(-1).long() 363 | 364 | # Add batch sample into evaluator 365 | self.evaluator.add_batch(label, pred) 366 | ave_total_loss.update(loss.item()) 367 | 368 | if self.config.use_one_cycle_lr: 369 | # lr update 370 | if self.lr_scheduler_1 is not None: 371 | self.lr_scheduler_1.step() 372 | for param_group in self.optimizer_1.param_groups: 373 | self.current_lr = param_group['lr'] 374 | if self.lr_scheduler_2 is not None: 375 | self.lr_scheduler_2.step() 376 | for param_group in self.optimizer_2.param_groups: 377 | self.current_lr = param_group['lr'] 378 | 379 | acc = self.evaluator.Pixel_Accuracy().cpu().detach().numpy() 380 | miou = self.evaluator.Mean_Intersection_over_Union().cpu().detach().numpy() 381 | TP, FP, FN, TN = self.evaluator.get_base_value() 382 | iou = self.evaluator.get_iou().cpu().detach().numpy() 383 | prec = self.evaluator.Pixel_Precision_Class().cpu().detach().numpy() 384 | recall = self.evaluator.Pixel_Recall_Class().cpu().detach().numpy() 385 | f1_score = self.evaluator.Pixel_F1_score_Class().cpu().detach().numpy() 386 | 387 | # train log and return 388 | self.history['train']['epoch'].append(epoch) 389 | self.history['train']['loss'].append(ave_total_loss.average()) 390 | self.history['train']['acc'].append(acc.tolist()) 391 | self.history['train']['miou'].append(miou.tolist()) 392 | 393 | self.history['train']['prec'].append(prec[1]) 394 | self.history['train']['recall'].append(recall[1]) 395 | self.history['train']['f_score'].append(f1_score[1]) 396 | 397 | if self.config.nb_classes == 2: 398 | miou = iou[1] 399 | 400 | return { 401 | 'epoch': epoch, 402 | 'loss': ave_total_loss.average(), 403 | 'acc': acc, 404 | 'miou': miou, 405 | 'prec': prec[1], 406 | 'recall': recall[1], 407 | 'f_score': f1_score[1], 408 | } 409 | 410 | def _eval_epoch(self, epoch): 411 | ave_total_loss = AverageMeter() 412 | self.evaluator.reset() 413 | # set model mode 414 | self.model.eval() 415 | 416 | with torch.no_grad(): 417 | for steps, (imgs, gts, filename) in enumerate(self.valid_data_loder, start=1): 418 | imgs = imgs.to(self.device, non_blocking=True) 419 | gts = gts.to(self.device, non_blocking=True) 420 | 421 | # sup loss 422 | sup_logits_l = self.model(imgs, step=1) 423 | gts = gts.long() 424 | 425 | loss = self.loss(sup_logits_l, gts) 426 | 427 | pred = torch.argmax(sup_logits_l, dim=1) 428 | pred = pred.view(-1).long() 429 | label = gts.view(-1).long() 430 | 431 | # Add batch sample into evaluator 432 | self.evaluator.add_batch(label, pred) 433 | 434 | # update ave metrics 435 | ave_total_loss.update(loss.item()) 436 | 437 | # calculate metrics 438 | acc = self.evaluator.Pixel_Accuracy().cpu().detach().numpy() 439 | miou = self.evaluator.Mean_Intersection_over_Union().cpu().detach().numpy() 440 | TP, FP, FN, TN = self.evaluator.get_base_value() 441 | iou = self.evaluator.get_iou().cpu().detach().numpy() 442 | prec = self.evaluator.Pixel_Precision_Class().cpu().detach().numpy() 443 | recall = self.evaluator.Pixel_Recall_Class().cpu().detach().numpy() 444 | f1_score = self.evaluator.Pixel_F1_score_Class().cpu().detach().numpy() 445 | 446 | print('Epoch {} validation done !'.format(epoch)) 447 | print('lr: {:.8f}\n' 448 | 'MIoU: {:6.4f}, Accuracy: {:6.4f}, Loss: {:.6f},\n' 449 | 'Precision: {:6.4f}, Recall: {:6.4f}, F_Score: {:6.4f}' 450 | .format(self.current_lr, 451 | miou, acc, ave_total_loss.average(), 452 | prec[1], recall[1], f1_score[1])) 453 | 454 | self.history['valid']['epoch'].append(epoch) 455 | self.history['valid']['loss'].append(ave_total_loss.average()) 456 | self.history['valid']['acc'].append(acc.tolist()) 457 | self.history['valid']['miou'].append(miou.tolist()) 458 | self.history['valid']['prec'].append(prec[1]) 459 | self.history['valid']['recall'].append(recall[1]) 460 | self.history['valid']['f_score'].append(f1_score[1]) 461 | 462 | if self.config.nb_classes == 2: 463 | miou = iou[1] 464 | 465 | # validation log and return 466 | return { 467 | 'epoch': epoch, 468 | 'val_Loss': ave_total_loss.average(), 469 | 'val_Accuracy': acc, 470 | 'val_MIoU': miou, 471 | 'val_Precision': prec[1], 472 | 'val_Recall': recall[1], 473 | 'val_F_score': f1_score[1], 474 | 475 | } 476 | 477 | def _save_ckpt(self, epoch, best): 478 | # save model ckpt 479 | state = { 480 | 'epoch': epoch, 481 | 'arch': str(self.model), 482 | 'history': self.history, 483 | 'state_dict': self.model.state_dict(), 484 | 'monitor_best': self.monitor_best, 485 | } 486 | filename = os.path.join(self.checkpoint_dir, 'checkpoint-ep{}.pth'.format(epoch)) 487 | best_filename = os.path.join(self.checkpoint_dir, 'checkpoint-best.pth') 488 | last_best_filename = os.path.join(self.checkpoint_dir, 489 | 'checkpoint-ep{}-iou{:.4f}.pth'.format(epoch, self.monitor_iou)) 490 | if best: 491 | # copy the last best model 492 | if os.path.exists(best_filename): 493 | shutil.copyfile(best_filename, last_best_filename) 494 | print(" + Saving Best Checkpoint : Epoch {} path: {} ... ".format(epoch, best_filename)) 495 | torch.save(state, best_filename) 496 | else: 497 | start_save_epochs = 1 498 | if epoch > start_save_epochs: 499 | print(" + After {} epochs, saving Checkpoint per {} epochs, path: {} ... ".format(start_save_epochs, 500 | self.save_period, 501 | filename)) 502 | torch.save(state, filename) 503 | 504 | def _resume_ckpt(self, resume_file): 505 | resume_path = os.path.join(resume_file) 506 | 507 | print(" + Loading Checkpoint: {} ... ".format(resume_path)) 508 | checkpoint = torch.load(resume_path) 509 | self.monitor_best = 0.0 510 | 511 | self.model.load_state_dict(checkpoint['state_dict'], strict=True) 512 | print(" + Model State Loaded ! :D ") 513 | print(" + Optimizer State Loaded ! :D ") 514 | print(" + Checkpoint file: '{}' , Start epoch {} Loaded !\n" 515 | " + Prepare to run ! ! !" 516 | .format(resume_path, self.start_epoch)) 517 | -------------------------------------------------------------------------------- /examples/train_unsup_image.txt: -------------------------------------------------------------------------------- 1 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_005.tif 2 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_002.tif 3 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_002.tif 4 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_006.tif 5 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_006.tif 6 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_002.tif 7 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_006.tif 8 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_002.tif 9 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_000.tif 10 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_001.tif 11 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_006.tif 12 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_001.tif 13 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_002.tif 14 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_003.tif 15 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_004.tif 16 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_003.tif 17 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_000.tif 18 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_003.tif 19 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_003.tif 20 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_006.tif 21 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_007.tif 22 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_001.tif 23 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_006.tif 24 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_004.tif 25 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_004.tif 26 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_000.tif 27 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_009.tif 28 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_001.tif 29 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_006.tif 30 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_002.tif 31 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_000.tif 32 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_005.tif 33 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_002.tif 34 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_002.tif 35 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_006.tif 36 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_006.tif 37 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_005.tif 38 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_003.tif 39 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_001.tif 40 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_000.tif 41 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_001.tif 42 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_003.tif 43 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_006.tif 44 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_004.tif 45 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_004.tif 46 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_003.tif 47 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_006.tif 48 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_005.tif 49 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_001.tif 50 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_009.tif 51 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_005.tif 52 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_001.tif 53 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_004.tif 54 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_004.tif 55 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_002.tif 56 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_006.tif 57 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_002.tif 58 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_006.tif 59 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_001.tif 60 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_001.tif 61 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_009.tif 62 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_002.tif 63 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_005.tif 64 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_002.tif 65 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_000.tif 66 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_004.tif 67 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_002.tif 68 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_002.tif 69 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_002.tif 70 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_002.tif 71 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_001.tif 72 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_001.tif 73 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_001.tif 74 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_000.tif 75 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_001.tif 76 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_006.tif 77 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_004.tif 78 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_006.tif 79 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_005.tif 80 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_004.tif 81 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_002.tif 82 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_003.tif 83 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_001.tif 84 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_007.tif 85 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_004.tif 86 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_003.tif 87 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_005.tif 88 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_001.tif 89 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_000.tif 90 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_001.tif 91 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_004.tif 92 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_006.tif 93 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_003.tif 94 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_009.tif 95 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_003.tif 96 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_005.tif 97 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_005.tif 98 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_007.tif 99 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_005.tif 100 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_006.tif 101 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_003.tif 102 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_008.tif 103 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_006.tif 104 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_000.tif 105 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_006.tif 106 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_003.tif 107 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_006.tif 108 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_001.tif 109 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_004.tif 110 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_003.tif 111 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_005.tif 112 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_004.tif 113 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_003.tif 114 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_006.tif 115 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_002.tif 116 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_004.tif 117 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_008.tif 118 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_001.tif 119 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_003.tif 120 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_004.tif 121 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_006.tif 122 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_006.tif 123 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_002.tif 124 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_000.tif 125 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_005.tif 126 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_000.tif 127 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_004.tif 128 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_002.tif 129 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_005.tif 130 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_005.tif 131 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_006.tif 132 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_002.tif 133 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_006.tif 134 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_000.tif 135 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_004.tif 136 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_010.tif 137 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_003.tif 138 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_005.tif 139 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_000.tif 140 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_005.tif 141 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_000.tif 142 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_001.tif 143 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_005.tif 144 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_001.tif 145 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_004.tif 146 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_001.tif 147 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_005.tif 148 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_000.tif 149 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_005.tif 150 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_002.tif 151 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_002.tif 152 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_007.tif 153 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_000.tif 154 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_006.tif 155 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_005.tif 156 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_003.tif 157 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_006.tif 158 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_003.tif 159 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_003.tif 160 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_000.tif 161 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_001.tif 162 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_005.tif 163 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_003.tif 164 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_003.tif 165 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_004.tif 166 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_004.tif 167 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_001.tif 168 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_002.tif 169 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_003.tif 170 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_007.tif 171 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_003.tif 172 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_003.tif 173 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_005.tif 174 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_004.tif 175 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_005.tif 176 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_006.tif 177 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_000.tif 178 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_003.tif 179 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_001.tif 180 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_004.tif 181 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_004.tif 182 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_002.tif 183 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_002.tif 184 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_005.tif 185 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_005.tif 186 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_003.tif 187 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_004.tif 188 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_009.tif 189 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_001.tif 190 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_004.tif 191 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_002.tif 192 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_008.tif 193 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_006.tif 194 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_001.tif 195 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_004.tif 196 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_002.tif 197 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_000.tif 198 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_006.tif 199 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_008.tif 200 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_002.tif 201 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_002.tif 202 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_003.tif 203 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_004.tif 204 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_003.tif 205 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_006.tif 206 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_007.tif 207 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_002.tif 208 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_007.tif 209 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_004.tif 210 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_003.tif 211 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_003.tif 212 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_005.tif 213 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_003.tif 214 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_003.tif 215 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_004.tif 216 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_000.tif 217 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_007.tif 218 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_003.tif 219 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_003.tif 220 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_002.tif 221 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_001.tif 222 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_003.tif 223 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_000.tif 224 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_003.tif 225 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_008.tif 226 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_001.tif 227 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_005.tif 228 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_008.tif 229 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_000.tif 230 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_003.tif 231 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_002.tif 232 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_009.tif 233 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_006.tif 234 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_002.tif 235 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_000.tif 236 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_000.tif 237 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_005.tif 238 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_003.tif 239 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_005.tif 240 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_001.tif 241 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_000.tif 242 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_004.tif 243 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_003.tif 244 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_000.tif 245 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_002.tif 246 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_004.tif 247 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_006.tif 248 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_002.tif 249 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_004.tif 250 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_005.tif 251 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_004.tif 252 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_006.tif 253 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_007.tif 254 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_001.tif 255 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_001.tif 256 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_004.tif 257 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_005.tif 258 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_000.tif 259 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_000.tif 260 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_008.tif 261 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_002.tif 262 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_000.tif 263 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_009.tif 264 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_006.tif 265 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_000.tif 266 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_001.tif 267 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_001.tif 268 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_001.tif 269 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_003.tif 270 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_000.tif 271 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_005.tif 272 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_005.tif 273 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_000.tif 274 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_003.tif 275 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_002.tif 276 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_002.tif 277 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_006.tif 278 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_003.tif 279 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_001.tif 280 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_002.tif 281 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_007.tif 282 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_002.tif 283 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_000.tif 284 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_002.tif 285 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_001.tif 286 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_001.tif 287 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_005.tif 288 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_001.tif 289 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_002.tif 290 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_005.tif 291 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_005.tif 292 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_000.tif 293 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_000.tif 294 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_006.tif 295 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_004.tif 296 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_001.tif 297 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_005.tif 298 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_003.tif 299 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_002.tif 300 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_001.tif 301 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_004.tif 302 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_004.tif 303 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_006.tif 304 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_000.tif 305 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_001.tif 306 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_005.tif 307 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_002.tif 308 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_000.tif 309 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_001.tif 310 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_006.tif 311 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_000.tif 312 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_002.tif 313 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_003.tif 314 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_000.tif 315 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_002.tif 316 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_007.tif 317 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_000.tif 318 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_003.tif 319 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_002.tif 320 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_004.tif 321 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_004.tif 322 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_002.tif 323 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_001.tif 324 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_002.tif 325 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_001.tif 326 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_001.tif 327 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_006.tif 328 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_005.tif 329 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_000.tif 330 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_004.tif 331 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_003.tif 332 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_004.tif 333 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_003.tif 334 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_003.tif 335 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_005.tif 336 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_006.tif 337 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_001.tif 338 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_005.tif 339 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_007.tif 340 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_006.tif 341 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_004.tif 342 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_000.tif 343 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_006.tif 344 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_006.tif 345 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_006_006.tif 346 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_006.tif 347 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_000.tif 348 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_000.tif 349 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_007_005.tif 350 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_001.tif 351 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_002.tif 352 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_000_003.tif 353 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_008.tif 354 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_004.tif 355 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_003.tif 356 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_006.tif 357 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_005.tif 358 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_005.tif 359 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_001.tif 360 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_005.tif 361 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_006.tif 362 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_004.tif 363 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_005.tif 364 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_002.tif 365 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_005.tif 366 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_002.tif 367 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_001.tif 368 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_001.tif 369 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_000.tif 370 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_007.tif 371 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_000.tif 372 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_001.tif 373 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_002.tif 374 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_002.tif 375 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_008.tif 376 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_004.tif 377 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_007.tif 378 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_005.tif 379 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_003.tif 380 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_004.tif 381 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_000.tif 382 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_000.tif 383 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_005.tif 384 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_008.tif 385 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_004.tif 386 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_002.tif 387 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_004.tif 388 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_000.tif 389 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_000.tif 390 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_010.tif 391 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_000.tif 392 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_005.tif 393 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_005.tif 394 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_005.tif 395 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_006.tif 396 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_006.tif 397 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_005.tif 398 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_000.tif 399 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_001.tif 400 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_003_002.tif 401 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_010.tif 402 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_004.tif 403 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_004.tif 404 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_001.tif 405 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_004.tif 406 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_004.tif 407 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_002.tif 408 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_000.tif 409 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_005.tif 410 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_003.tif 411 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_002.tif 412 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_001.tif 413 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_004.tif 414 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_004.tif 415 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_003.tif 416 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_008_001.tif 417 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_004.tif 418 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_000.tif 419 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_002.tif 420 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_006.tif 421 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_004.tif 422 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_006.tif 423 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_004.tif 424 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_009.tif 425 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_009.tif 426 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_005.tif 427 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_002_006.tif 428 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_003.tif 429 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_008.tif 430 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_004.tif 431 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_002.tif 432 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_005.tif 433 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_000.tif 434 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_002.tif 435 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_006.tif 436 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_002.tif 437 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_002.tif 438 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_006.tif 439 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_003.tif 440 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_002.tif 441 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_005_005.tif 442 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_006.tif 443 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_005.tif 444 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_006.tif 445 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_003_001.tif 446 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_003.tif 447 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_006.tif 448 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_009.tif 449 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_006.tif 450 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_004.tif 451 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_001.tif 452 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_000.tif 453 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_004.tif 454 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_002.tif 455 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_005.tif 456 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_000.tif 457 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_006.tif 458 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_004.tif 459 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_000.tif 460 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_006.tif 461 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_006.tif 462 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_001.tif 463 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_002.tif 464 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_005_005.tif 465 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_004.tif 466 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_000_003.tif 467 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_006_001.tif 468 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_003.tif 469 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_000.tif 470 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_003.tif 471 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_001.tif 472 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_004.tif 473 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_004.tif 474 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_010.tif 475 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_005.tif 476 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_002_005.tif 477 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_001.tif 478 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_003.tif 479 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_001.tif 480 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_000.tif 481 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_006.tif 482 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_008.tif 483 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_005.tif 484 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_005.tif 485 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_002.tif 486 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_003.tif 487 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_000.tif 488 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_002.tif 489 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_004.tif 490 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_006.tif 491 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_005.tif 492 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_004.tif 493 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_007.tif 494 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_005.tif 495 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_001.tif 496 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_006.tif 497 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_006.tif 498 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_003.tif 499 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_004.tif 500 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_005.tif 501 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_009.tif 502 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_000.tif 503 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_003.tif 504 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_002.tif 505 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_001.tif 506 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_007_007.tif 507 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_001.tif 508 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_000.tif 509 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_001.tif 510 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_002.tif 511 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_006.tif 512 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_002_004.tif 513 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_009.tif 514 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_003.tif 515 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_004.tif 516 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_001.tif 517 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_003.tif 518 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_003.tif 519 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_003.tif 520 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_007.tif 521 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_000.tif 522 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_008.tif 523 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_003.tif 524 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_003.tif 525 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_001_000.tif 526 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_006.tif 527 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_004.tif 528 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_005.tif 529 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_005.tif 530 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_006.tif 531 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_005.tif 532 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_009.tif 533 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_006_000.tif 534 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_002.tif 535 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_006.tif 536 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_006.tif 537 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_000.tif 538 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_000.tif 539 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_006.tif 540 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_004.tif 541 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_005.tif 542 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_002.tif 543 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_005.tif 544 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_004.tif 545 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_001.tif 546 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_005.tif 547 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_008.tif 548 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_001.tif 549 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_004_001.tif 550 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_004.tif 551 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_005.tif 552 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_002.tif 553 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_008_006.tif 554 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_004.tif 555 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_008_004.tif 556 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_001.tif 557 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_004_001.tif 558 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_001_003.tif 559 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_005.tif 560 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_008_006.tif 561 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_001_001.tif 562 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_007_006.tif 563 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_005_000.tif 564 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_009.tif 565 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_000.tif 566 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_008.tif 567 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_000_003.tif 568 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_004.tif 569 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_000_006.tif 570 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_002.tif 571 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_006.tif 572 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_003.tif 573 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_000_010.tif 574 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_005.tif 575 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_005.tif 576 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_004.tif 577 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_000.tif 578 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_003_001.tif 579 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_000.tif 580 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_005.tif 581 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_006.tif 582 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_003_000.tif 583 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_002.tif 584 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_002.tif 585 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_001.tif 586 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_005.tif 587 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_006.tif 588 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_003_001.tif 589 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_004_003.tif 590 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_000_000.tif 591 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_005_005.tif 592 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_008_001.tif 593 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_006.tif 594 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_000.tif 595 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_007_003.tif 596 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_002.tif 597 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_005_003.tif 598 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_003.tif 599 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_004.tif 600 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_003_002.tif 601 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_006.tif 602 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_002.tif 603 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_010.tif 604 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_000_003.tif 605 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_000.tif 606 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_008_005.tif 607 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_001_005.tif 608 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_005_002.tif 609 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_003.tif 610 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_001.tif 611 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_008_002.tif 612 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_006_004.tif 613 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_004_004.tif 614 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_001_006.tif 615 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_003.tif 616 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_007_005.tif 617 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_002.tif 618 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_003.tif 619 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_009_001.tif 620 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_002_001.tif 621 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_004_006.tif 622 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_000_003.tif 623 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_006.tif 624 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_002_007.tif 625 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_000.tif 626 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_002.tif 627 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_000.tif 628 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_003.tif 629 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_003.tif 630 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_006.tif 631 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_002.tif 632 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_001_004.tif 633 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_004.tif 634 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_003_006.tif 635 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_000_003.tif 636 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_003.tif 637 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_002_000.tif 638 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_005_001.tif 639 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_002.tif 640 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_006_001.tif 641 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_004.tif 642 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_001_000.tif 643 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_003_000.tif 644 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_001.tif 645 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_004_001.tif 646 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_001_001.tif 647 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_006_001.tif 648 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_007_004.tif 649 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_003_005.tif 650 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_000.tif 651 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_002_004.tif 652 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_006.tif 653 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_005_005.tif 654 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_002_000.tif 655 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_000.tif 656 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_005_000.tif 657 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_004_005.tif 658 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_005_003.tif 659 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_010_000.tif 660 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area13_001_001.tif 661 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_006_004.tif 662 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_000_007.tif 663 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_003_009.tif 664 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_007_005.tif 665 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_001_001.tif 666 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area26_004_006.tif 667 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area32_002_000.tif 668 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_004_003.tif 669 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area5_006_002.tif 670 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_007_004.tif 671 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area7_000_006.tif 672 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area3_006_004.tif 673 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area37_001_004.tif 674 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_008_005.tif 675 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area23_004_003.tif 676 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area17_002_000.tif 677 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area1_002_000.tif 678 | D:\ISPRS\Vaihingen\image\top_mosaic_09cm_area21_003_003.tif 679 | --------------------------------------------------------------------------------