diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/.gitignore b/cv/semantic_segmentation/bisenetv2/pytorch/.gitignore new file mode 100755 index 0000000000000000000000000000000000000000..25e57bee55758eb36d28b930983c3458b9188ce0 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/.gitignore @@ -0,0 +1,125 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ + + +## Coin: +play.py +preprocess_data.py +res/ +adj.md +tensorrt/build/* +datasets/coco/train.txt +datasets/coco/val.txt +datasets/ade20k/train.txt +datasets/ade20k/val.txt +pretrained/* +run.sh +openvino/build/* +openvino/output* +ncnn/models/* +*.onnx +tis/cpp_client/build/* +log*txt + +tvm/ diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/LICENSE b/cv/semantic_segmentation/bisenetv2/pytorch/LICENSE new file mode 100755 index 0000000000000000000000000000000000000000..4a1a5721f316db468dcbba5604e339848b4f01f5 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 CoinCheung + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/README.md b/cv/semantic_segmentation/bisenetv2/pytorch/README.md new file mode 100755 index 0000000000000000000000000000000000000000..602925835af9e25cd174aead0f70f1f2b7ea8b3a --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/README.md @@ -0,0 +1,172 @@ +# BiSeNetV1 & BiSeNetV2 + +My implementation of [BiSeNetV1](https://arxiv.org/abs/1808.00897) and [BiSeNetV2](https://arxiv.org/abs/2004.02147). + + +mIOUs and fps on cityscapes val set: +| none | ss | ssc | msf | mscf | fps(fp32/fp16/int8) | link | +|------|:--:|:---:|:---:|:----:|:---:|:----:| +| bisenetv1 | 75.44 | 76.94 | 77.45 | 78.86 | 25/78/141 | [download](https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/model_final_v1_city_new.pth) | +| bisenetv2 | 74.95 | 75.58 | 76.53 | 77.08 | 26/67/95 | [download](https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/model_final_v2_city.pth) | + +mIOUs on cocostuff val2017 set: +| none | ss | ssc | msf | mscf | link | +|------|:--:|:---:|:---:|:----:|:----:| +| bisenetv1 | 31.49 | 31.42 | 32.46 | 32.55 | [download](https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/model_final_v1_coco_new.pth) | +| bisenetv2 | 30.49 | 30.55 | 31.81 | 31.73 | [download](https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/model_final_v2_coco.pth) | + +mIOUs on ade20k val set: +| none | ss | ssc | msf | mscf | link | +|------|:--:|:---:|:---:|:----:|:----:| +| bisenetv1 | 36.15 | 36.04 | 37.27 | 36.58 | [download](https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/model_final_v1_ade20k.pth) | +| bisenetv2 | 32.53 | 32.43 | 33.23 | 31.72 | [download](https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/model_final_v2_ade20k.pth) | + +Tips: + +1. **ss** means single scale evaluation, **ssc** means single scale crop evaluation, **msf** means multi-scale evaluation with flip augment, and **mscf** means multi-scale crop evaluation with flip evaluation. The eval scales and crop size of multi-scales evaluation can be found in [configs](./configs/). + +2. The fps is tested in different way from the paper. For more information, please see [here](./tensorrt). + +3. The authors of bisenetv2 used cocostuff-10k, while I used cocostuff-123k(do not know how to say, just same 118k train and 5k val images as object detection). Thus the results maybe different from paper. + +4. The authors did not report results on ade20k, thus there is no official training settings, here I simply provide a "make it work" result. Maybe the results on ade20k can be boosted with better settings. + +5. The model has a big variance, which means that the results of training for many times would vary within a relatively big margin. For example, if you train bisenetv2 on cityscapes for many times, you will observe that the result of **ss** evaluation of bisenetv2 varies between 73.1-75.1. + + +## deploy trained models + +1. tensorrt +You can go to [tensorrt](./tensorrt) for details. + +2. ncnn +You can go to [ncnn](./ncnn) for details. + +3. openvino +You can go to [openvino](./openvino) for details. + +4. tis +Triton Inference Server(TIS) provides a service solution of deployment. You can go to [tis](./tis) for details. + + +## platform + +My platform is like this: + +* ubuntu 18.04 +* nvidia Tesla T4 gpu, driver 450.80.02 +* cuda 10.2/11.3 +* cudnn 8 +* miniconda python 3.8.8 +* pytorch 1.11.0 + + +## get start + +With a pretrained weight, you can run inference on an single image like this: + +``` +$ python tools/demo.py --config configs/bisenetv2_city.py --weight-path /path/to/your/weights.pth --img-path ./example.png +``` + +This would run inference on the image and save the result image to `./res.jpg`. + +Or you can run inference on a video like this: +``` +$ python tools/demo_video.py --config configs/bisenetv2_coco.py --weight-path res/model_final.pth --input ./video.mp4 --output res.mp4 +``` +This would generate segmentation file as `res.mp4`. If you want to read from camera, you can set `--input camera_id` rather than `input ./video.mp4`. + + +## prepare dataset + +1.cityscapes + +Register and download the dataset from the official [website](https://www.cityscapes-dataset.com/). Then decompress them into the `datasets/cityscapes` directory: +``` +$ mv /path/to/leftImg8bit_trainvaltest.zip datasets/cityscapes +$ mv /path/to/gtFine_trainvaltest.zip datasets/cityscapes +$ cd datasets/cityscapes +$ unzip leftImg8bit_trainvaltest.zip +$ unzip gtFine_trainvaltest.zip +``` + +2.cocostuff + +Download `train2017.zip`, `val2017.zip` and `stuffthingmaps_trainval2017.zip` split from official [website](https://cocodataset.org/#download). Then do as following: +``` +$ unzip train2017.zip +$ unzip val2017.zip +$ mv train2017/ /path/to/BiSeNet/datasets/coco/images +$ mv val2017/ /path/to/BiSeNet/datasets/coco/images + +$ unzip stuffthingmaps_trainval2017.zip +$ mv train2017/ /path/to/BiSeNet/datasets/coco/labels +$ mv val2017/ /path/to/BiSeNet/datasets/coco/labels + +$ cd /path/to/BiSeNet +$ python tools/gen_dataset_annos.py --dataset coco +``` + +3.ade20k + +Download `ADEChallengeData2016.zip` from this [website](http://sceneparsing.csail.mit.edu/) and unzip it. Then we can move the uncompressed folders to `datasets/ade20k`, and generate the txt files with the script I prepared for you: +``` +$ unzip ADEChallengeData2016.zip +$ mv ADEChallengeData2016/images /path/to/BiSeNet/datasets/ade20k/ +$ mv ADEChallengeData2016/annotations /path/to/BiSeNet/datasets/ade20k/ +$ python tools/gen_dataset_annos.py --ade20k +``` + + +4.custom dataset + +If you want to train on your own dataset, you should generate annotation files first with the format like this: +``` +munster_000002_000019_leftImg8bit.png,munster_000002_000019_gtFine_labelIds.png +frankfurt_000001_079206_leftImg8bit.png,frankfurt_000001_079206_gtFine_labelIds.png +... +``` +Each line is a pair of training sample and ground truth image path, which are separated by a single comma `,`. + +I recommand you to check the information of your dataset with the script: +``` +$ python tools/check_dataset_info.py --im_root /path/to/your/data_root --im_anns /path/to/your/anno_file +``` +This will print some of the information of your dataset. + +Then you need to change the field of `im_root` and `train/val_im_anns` in the config file. I prepared a demo config file for you named [`bisenet_customer.py`](./configs/bisenet_customer.py). You can start from this conig file. + + +## train + +Training commands I used to train the models can be found in [here](./dist_train.sh). + +Note: +1. though `bisenetv2` has fewer flops, it requires much more training iterations. The the training time of `bisenetv1` is shorter. +2. I used overall batch size of 16 to train all models. Since cocostuff has 171 categories, it requires more memory to train models on it. I split the 16 images into more gpus than 2, as I do with cityscapes. + + +## finetune from trained model + +You can also load the trained model weights and finetune from it, like this: +``` +$ export CUDA_VISIBLE_DEVICES=0,1 +$ torchrun --nproc_per_node=2 tools/train_amp.py --finetune-from ./res/model_final.pth --config ./configs/bisenetv2_city.py # or bisenetv1 +``` + + +## eval pretrained models +You can also evaluate a trained model like this: +``` +$ python tools/evaluate.py --config configs/bisenetv1_city.py --weight-path /path/to/your/weight.pth +``` +or you can use multi gpus: +``` +$ torchrun --nproc_per_node=2 tools/evaluate.py --config configs/bisenetv1_city.py --weight-path /path/to/your/weight.pth +``` + + +### Be aware that this is the refactored version of the original codebase. You can go to the `old` directory for original implementation if you need, though I believe you will not need it. + + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/__init__.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..d36a83d022476dc58ffb81c4338bf213d1e79981 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/__init__.py @@ -0,0 +1,21 @@ + + +import importlib + + +class cfg_dict(object): + + def __init__(self, d): + self.__dict__ = d + self.get = d.get + + +def set_cfg_from_file(cfg_path): + spec = importlib.util.spec_from_file_location('cfg_file', cfg_path) + cfg_file = importlib.util.module_from_spec(spec) + spec_loader = spec.loader.exec_module(cfg_file) + cfg = cfg_file.cfg + return cfg_dict(cfg) + + + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenet_customer.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenet_customer.py new file mode 100755 index 0000000000000000000000000000000000000000..22f09c7a41469cb2a7d009303f9a5276e2c2dcb4 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenet_customer.py @@ -0,0 +1,23 @@ + +cfg = dict( + model_type='bisenetv1', + n_cats=20, + num_aux_heads=2, + lr_start=1e-2, + weight_decay=5e-4, + warmup_iters=1000, + max_iter=80000, + dataset='CustomerDataset', + im_root='./datasets/cityscapes', + train_im_anns='./datasets/cityscapes/train.txt', + val_im_anns='./datasets/cityscapes/val.txt', + scales=[0.75, 2.], + cropsize=[512, 512], + eval_crop=[512, 512], + eval_scales=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + ims_per_gpu=8, + eval_ims_per_gpu=2, + use_fp16=True, + use_sync_bn=False, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_ade20k.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_ade20k.py new file mode 100755 index 0000000000000000000000000000000000000000..03619e7cd7a4f563947418ffce98f54c6079efd8 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_ade20k.py @@ -0,0 +1,24 @@ + +cfg = dict( + model_type='bisenetv1', + n_cats=150, + num_aux_heads=2, + lr_start=4e-2, + weight_decay=1e-4, + warmup_iters=1000, + max_iter=40000, + dataset='ADE20k', + im_root='./datasets/ade20k', + train_im_anns='./datasets/ade20k/train.txt', + val_im_anns='./datasets/ade20k/val.txt', + scales=[0.5, 2.], + cropsize=[512, 512], + eval_crop=[512, 512], + eval_scales=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + eval_start_shortside=512, + ims_per_gpu=8, + eval_ims_per_gpu=1, + use_fp16=True, + use_sync_bn=True, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_city.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_city.py new file mode 100755 index 0000000000000000000000000000000000000000..a1aff0bc9ae1dda1064bff7c571739f83659f89c --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_city.py @@ -0,0 +1,23 @@ + +cfg = dict( + model_type='bisenetv1', + n_cats=19, + num_aux_heads=2, + lr_start=1e-2, + weight_decay=5e-4, + warmup_iters=1000, + max_iter=80000, + dataset='CityScapes', + im_root='./datasets/cityscapes', + train_im_anns='./datasets/cityscapes/train.txt', + val_im_anns='./datasets/cityscapes/val.txt', + scales=[0.75, 2.], + cropsize=[1024, 1024], + eval_crop=[1024, 1024], + eval_scales=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + ims_per_gpu=8, + eval_ims_per_gpu=2, + use_fp16=True, + use_sync_bn=False, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_coco.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_coco.py new file mode 100755 index 0000000000000000000000000000000000000000..914f10d1f34ff889ae8bb9addada3a3f89ac1c18 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv1_coco.py @@ -0,0 +1,23 @@ + +cfg = dict( + model_type='bisenetv1', + n_cats=171, + num_aux_heads=2, + lr_start=1e-2, + weight_decay=1e-4, + warmup_iters=1000, + max_iter=90000, + dataset='CocoStuff', + im_root='./datasets/coco', + train_im_anns='./datasets/coco/train.txt', + val_im_anns='./datasets/coco/val.txt', + scales=[0.5, 2.], + cropsize=[512, 512], + eval_crop=[512, 512], + eval_scales=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + ims_per_gpu=4, + eval_ims_per_gpu=1, + use_fp16=True, + use_sync_bn=True, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_ade20k.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_ade20k.py new file mode 100755 index 0000000000000000000000000000000000000000..cee581292e59221b1f1d0e575db0e5c1b6343d09 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_ade20k.py @@ -0,0 +1,25 @@ + +## bisenetv2 +cfg = dict( + model_type='bisenetv2', + n_cats=150, + num_aux_heads=4, + lr_start=5e-3, + weight_decay=1e-4, + warmup_iters=1000, + max_iter=160000, + dataset='ADE20k', + im_root='./datasets/ade20k', + train_im_anns='./datasets/ade20k/train.txt', + val_im_anns='./datasets/ade20k/val.txt', + scales=[0.5, 2.], + cropsize=[640, 640], + eval_crop=[640, 640], + eval_start_shortside=640, + eval_scales=[0.5, 0.75, 1, 1.25, 1.5, 1.75], + ims_per_gpu=2, + eval_ims_per_gpu=1, + use_fp16=True, + use_sync_bn=True, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_city.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_city.py new file mode 100755 index 0000000000000000000000000000000000000000..1898aaf76bcdbaf5a1a027594217deb9651ff874 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_city.py @@ -0,0 +1,24 @@ + +## bisenetv2 +cfg = dict( + model_type='bisenetv2', + n_cats=19, + num_aux_heads=4, + lr_start=5e-3, + weight_decay=5e-4, + warmup_iters=1000, + max_iter=150000, + dataset='CityScapes', + im_root='./datasets/cityscapes', + train_im_anns='./datasets/cityscapes/train.txt', + val_im_anns='./datasets/cityscapes/val.txt', + scales=[0.25, 2.], + cropsize=[512, 1024], + eval_crop=[1024, 1024], + eval_scales=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75], + ims_per_gpu=8, + eval_ims_per_gpu=2, + use_fp16=True, + use_sync_bn=True, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_coco.py b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_coco.py new file mode 100755 index 0000000000000000000000000000000000000000..ed8e67835d59869ba908630741d98d3a1b3a1796 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/configs/bisenetv2_coco.py @@ -0,0 +1,24 @@ + +## bisenetv2 +cfg = dict( + model_type='bisenetv2', + n_cats=171, + num_aux_heads=4, + lr_start=5e-3, + weight_decay=1e-4, + warmup_iters=1000, + max_iter=180000, + dataset='CocoStuff', + im_root='./datasets/coco', + train_im_anns='./datasets/coco/train.txt', + val_im_anns='./datasets/coco/val.txt', + scales=[0.75, 2.], + cropsize=[640, 640], + eval_crop=[640, 640], + eval_scales=[0.5, 0.75, 1, 1.25, 1.5, 1.75], + ims_per_gpu=2, + eval_ims_per_gpu=1, + use_fp16=True, + use_sync_bn=True, + respth='./res', +) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/datasets/cityscapes/train.txt b/cv/semantic_segmentation/bisenetv2/pytorch/datasets/cityscapes/train.txt new file mode 100755 index 0000000000000000000000000000000000000000..11a52d1b9b8ca1107e8592e759ee80b3e7e697cf --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/datasets/cityscapes/train.txt @@ -0,0 +1,2975 @@ +leftImg8bit/train/dusseldorf/dusseldorf_000127_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000127_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_033056_leftImg8bit.png,gtFine/train/bochum/bochum_000000_033056_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000080_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000080_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000093_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000093_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000096_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000096_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000055_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000055_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000003_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000003_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000086_000019_leftImg8bit.png,gtFine/train/jena/jena_000086_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000072_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000072_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000098_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000098_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000104_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000104_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000077_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000077_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000092_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000092_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000124_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000124_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000098_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000098_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000142_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000142_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_020563_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_020563_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_018195_leftImg8bit.png,gtFine/train/bochum/bochum_000000_018195_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_000164_leftImg8bit.png,gtFine/train/hanover/hanover_000000_000164_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000129_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000129_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000270_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000270_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000175_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000175_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000047_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000047_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000014_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000014_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000027_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000027_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000094_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000094_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000228_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000228_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_054276_leftImg8bit.png,gtFine/train/hanover/hanover_000000_054276_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000009_000019_leftImg8bit.png,gtFine/train/jena/jena_000009_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000135_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000135_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_028912_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_028912_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_064393_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_064393_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000080_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000080_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000061_000019_leftImg8bit.png,gtFine/train/jena/jena_000061_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_019938_leftImg8bit.png,gtFine/train/hanover/hanover_000000_019938_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000062_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000062_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_074545_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_074545_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000005_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000005_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_028628_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_028628_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000038_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000038_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000105_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000105_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000045_000019_leftImg8bit.png,gtFine/train/jena/jena_000045_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_041610_leftImg8bit.png,gtFine/train/hanover/hanover_000000_041610_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_000885_leftImg8bit.png,gtFine/train/bochum/bochum_000000_000885_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_028379_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_028379_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000100_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000100_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000027_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000027_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_066706_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_066706_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000007_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000007_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_010445_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_010445_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000006_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000006_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000035_000019_leftImg8bit.png,gtFine/train/jena/jena_000035_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_044219_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_044219_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000013_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000013_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000113_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000113_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_074425_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_074425_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_074694_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_074694_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_001449_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_001449_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_010860_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_010860_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_005249_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_005249_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_029203_leftImg8bit.png,gtFine/train/bochum/bochum_000000_029203_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_019500_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_019500_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000056_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000056_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000047_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000047_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000150_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000150_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000114_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000114_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_056142_leftImg8bit.png,gtFine/train/hanover/hanover_000000_056142_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000193_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000193_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000009_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000009_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000145_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000145_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_035606_leftImg8bit.png,gtFine/train/hanover/hanover_000000_035606_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000054_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000054_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000192_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000192_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_032559_leftImg8bit.png,gtFine/train/hanover/hanover_000000_032559_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_064269_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_064269_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000226_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000226_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_003674_leftImg8bit.png,gtFine/train/bochum/bochum_000000_003674_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_022524_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_022524_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000082_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000082_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000094_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000094_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000106_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000106_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_050160_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_050160_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000005_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000005_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000095_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000095_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_025437_leftImg8bit.png,gtFine/train/hanover/hanover_000000_025437_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_014146_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_014146_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_006746_leftImg8bit.png,gtFine/train/bochum/bochum_000000_006746_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_056330_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_056330_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_014658_leftImg8bit.png,gtFine/train/bochum/bochum_000000_014658_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000064_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000064_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000067_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000067_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_006106_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_006106_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000058_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000058_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000083_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000083_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000127_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000127_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000094_000019_leftImg8bit.png,gtFine/train/jena/jena_000094_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000188_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000188_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000052_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000052_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_013209_leftImg8bit.png,gtFine/train/bochum/bochum_000000_013209_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_007441_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_007441_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000263_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000263_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_010372_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_010372_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000030_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000030_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000165_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000165_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_055414_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_055414_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000126_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000126_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_002095_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_002095_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_045004_leftImg8bit.png,gtFine/train/hanover/hanover_000000_045004_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000151_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000151_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_004660_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_004660_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000059_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000059_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000024_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000024_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000134_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000134_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000121_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000121_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000019_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000019_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000064_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000064_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000036_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000036_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000043_000019_leftImg8bit.png,gtFine/train/jena/jena_000043_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000028_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000028_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000145_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000145_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_018432_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_018432_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000083_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000083_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000067_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000067_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000139_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000139_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000101_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000101_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000118_000019_leftImg8bit.png,gtFine/train/jena/jena_000118_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_046324_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_046324_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_043080_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_043080_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_028608_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_028608_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000058_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000058_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000045_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000045_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000026_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000026_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014584_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014584_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_020033_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_020033_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000078_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000078_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000209_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000209_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_015220_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_015220_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_019247_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_019247_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000223_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000223_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_026919_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_026919_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000220_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000220_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000049_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000049_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000103_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000103_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000012_000019_leftImg8bit.png,gtFine/train/jena/jena_000012_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000068_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000068_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000020_000019_leftImg8bit.png,gtFine/train/jena/jena_000020_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000180_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000180_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000050_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000050_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_007950_leftImg8bit.png,gtFine/train/bochum/bochum_000000_007950_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051934_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051934_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000003_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000003_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000013_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000013_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000120_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000120_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000030_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000030_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_009574_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_009574_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000158_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000158_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000108_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000108_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000116_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000116_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000078_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000078_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000069_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000069_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000018_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000018_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000107_000019_leftImg8bit.png,gtFine/train/jena/jena_000107_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_044344_leftImg8bit.png,gtFine/train/hanover/hanover_000000_044344_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_049776_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_049776_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_088627_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_088627_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000027_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000027_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_083696_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_083696_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_015494_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_015494_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000009_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000009_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_006386_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_006386_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000012_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000012_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000039_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000039_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000002_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000002_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_008677_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_008677_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_011880_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_011880_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000060_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000060_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000040_000019_leftImg8bit.png,gtFine/train/jena/jena_000040_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000063_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000063_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000212_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000212_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000161_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000161_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_027156_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_027156_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_061048_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_061048_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000129_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000129_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000053_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000053_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000036_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000036_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000139_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000139_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_052013_leftImg8bit.png,gtFine/train/hanover/hanover_000000_052013_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000037_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000037_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_028297_leftImg8bit.png,gtFine/train/bochum/bochum_000000_028297_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000160_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000160_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000104_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000104_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_009246_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_009246_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000076_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000076_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000018_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000018_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000011_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000011_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000031_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000031_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_018592_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_018592_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_007342_leftImg8bit.png,gtFine/train/hanover/hanover_000000_007342_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_004951_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_004951_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_033747_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_033747_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000152_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000152_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_003005_leftImg8bit.png,gtFine/train/bochum/bochum_000000_003005_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_068693_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_068693_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000011_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000011_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000015_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000015_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000238_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000238_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000050_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000050_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000057_000019_leftImg8bit.png,gtFine/train/jena/jena_000057_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000016_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000016_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000075_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000075_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_045188_leftImg8bit.png,gtFine/train/hanover/hanover_000000_045188_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_048750_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_048750_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000134_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000134_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000033_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000033_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000009_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000009_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000273_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000273_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000019_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000019_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_008310_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_008310_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_033331_leftImg8bit.png,gtFine/train/bochum/bochum_000000_033331_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000023_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000023_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_049143_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_049143_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_047108_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_047108_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_022414_leftImg8bit.png,gtFine/train/bochum/bochum_000000_022414_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_013257_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_013257_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000024_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000024_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_011225_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_011225_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000081_000019_leftImg8bit.png,gtFine/train/jena/jena_000081_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_054965_leftImg8bit.png,gtFine/train/hanover/hanover_000000_054965_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_025351_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_025351_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000148_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000148_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000076_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000076_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000000_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000000_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000116_000019_leftImg8bit.png,gtFine/train/jena/jena_000116_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_068916_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_068916_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000164_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000164_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000001_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000001_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000082_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000082_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_000295_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_000295_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_006686_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_006686_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000155_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000155_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000042_000019_leftImg8bit.png,gtFine/train/jena/jena_000042_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000058_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000058_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000054_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000054_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000163_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000163_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_064224_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_064224_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000115_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000115_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000010_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000010_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_081299_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_081299_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000004_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000004_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_046078_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_046078_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000089_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000089_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_056457_leftImg8bit.png,gtFine/train/hanover/hanover_000000_056457_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_020856_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_020856_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000077_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000077_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000000_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000000_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000074_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000074_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_047702_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_047702_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_047057_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_047057_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000049_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000049_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_014030_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_014030_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000292_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000292_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_053437_leftImg8bit.png,gtFine/train/hanover/hanover_000000_053437_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000181_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000181_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000015_000019_leftImg8bit.png,gtFine/train/jena/jena_000015_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017081_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017081_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000046_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000046_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000312_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000312_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000010_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000010_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_029980_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_029980_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_019116_leftImg8bit.png,gtFine/train/hanover/hanover_000000_019116_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000125_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000125_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000052_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000052_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000143_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000143_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000018_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000018_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_025833_leftImg8bit.png,gtFine/train/bochum/bochum_000000_025833_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000100_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000100_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000075_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000140_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000140_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_003937_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_003937_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000020_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000020_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_036051_leftImg8bit.png,gtFine/train/hanover/hanover_000000_036051_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_026998_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_026998_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000127_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000127_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000075_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000075_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000101_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000101_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000030_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000030_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_019760_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_019760_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_048508_leftImg8bit.png,gtFine/train/hanover/hanover_000000_048508_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000023_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000023_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_002458_leftImg8bit.png,gtFine/train/hanover/hanover_000000_002458_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_031257_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_031257_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000073_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000073_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000222_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000222_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000039_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000039_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000141_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000141_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000247_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000247_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_017042_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_017042_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000074_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000074_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000230_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000230_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000160_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000160_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_106102_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_106102_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_005288_leftImg8bit.png,gtFine/train/hanover/hanover_000000_005288_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000160_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000160_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000051_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000051_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_025089_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_025089_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_025907_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_025907_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_085321_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_085321_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000118_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000118_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000098_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000098_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_063698_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_063698_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000013_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000013_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000000_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000000_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000044_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000044_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000115_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000115_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_011255_leftImg8bit.png,gtFine/train/bochum/bochum_000000_011255_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_034375_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_034375_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000069_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000069_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000034_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000034_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_016591_leftImg8bit.png,gtFine/train/bochum/bochum_000000_016591_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_042992_leftImg8bit.png,gtFine/train/hanover/hanover_000000_042992_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000176_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000176_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000086_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000086_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_026804_leftImg8bit.png,gtFine/train/hanover/hanover_000000_026804_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000060_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000060_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000065_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000065_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000003_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000003_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000031_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000031_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_030662_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_030662_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000145_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000145_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000077_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000077_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_005599_leftImg8bit.png,gtFine/train/hanover/hanover_000000_005599_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000015_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000015_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000065_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000065_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_026634_leftImg8bit.png,gtFine/train/bochum/bochum_000000_026634_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000079_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000079_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_046954_leftImg8bit.png,gtFine/train/hanover/hanover_000000_046954_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_035364_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_035364_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_043822_leftImg8bit.png,gtFine/train/hanover/hanover_000000_043822_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000005_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000005_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000157_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000157_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000177_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000177_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000070_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000070_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000141_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000141_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_021231_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_021231_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000184_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000184_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051317_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051317_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_038927_leftImg8bit.png,gtFine/train/hanover/hanover_000000_038927_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_033838_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_033838_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000019_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000019_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000024_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000024_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000219_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000219_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000045_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000045_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_037036_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_037036_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000218_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000218_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000041_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000041_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000040_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000040_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000009_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000009_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_090398_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_090398_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000016_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000016_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000172_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000172_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000032_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000032_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000148_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000148_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000036_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000036_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_008494_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_008494_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000254_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000254_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000121_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000121_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_044085_leftImg8bit.png,gtFine/train/hanover/hanover_000000_044085_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000120_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000120_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000056_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000056_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000113_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000113_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_001908_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_001908_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000041_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000041_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000123_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000123_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000105_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000105_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_014332_leftImg8bit.png,gtFine/train/bochum/bochum_000000_014332_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000019_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000019_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_007651_leftImg8bit.png,gtFine/train/bochum/bochum_000000_007651_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000104_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000104_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_003846_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_003846_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000016_000019_leftImg8bit.png,gtFine/train/jena/jena_000016_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000125_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000125_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000109_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000109_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000026_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000026_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014503_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014503_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000147_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000147_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000058_000019_leftImg8bit.png,gtFine/train/jena/jena_000058_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000005_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000005_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000080_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000080_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000029_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000029_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000027_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000027_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000075_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000061_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000061_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000043_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000043_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_047955_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_047955_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000187_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000187_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_091038_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_091038_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_085413_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_085413_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_071942_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_071942_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_063403_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_063403_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000147_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000147_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000007_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000007_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000131_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000131_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_032169_leftImg8bit.png,gtFine/train/bochum/bochum_000000_032169_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000167_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000167_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_050398_leftImg8bit.png,gtFine/train/hanover/hanover_000000_050398_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000142_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000142_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000180_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000180_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000195_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000195_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000102_000019_leftImg8bit.png,gtFine/train/jena/jena_000102_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_042505_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_042505_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_036480_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_036480_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000111_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000111_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000088_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000088_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000089_000019_leftImg8bit.png,gtFine/train/jena/jena_000089_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000192_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000192_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000144_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000144_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_015126_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_015126_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000251_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000251_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_034494_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_034494_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000021_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000021_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000168_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000168_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000132_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000132_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_020596_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_020596_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000044_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000044_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000141_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000141_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000092_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000092_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000032_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000032_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000160_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000160_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_091900_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_091900_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000056_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000056_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000109_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000109_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000096_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000096_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000035_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000035_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000018_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000018_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000039_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000039_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000070_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000070_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000140_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000140_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000016_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000016_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_096063_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_096063_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000023_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000023_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000069_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000069_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_057129_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_057129_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_055039_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_055039_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_044400_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_044400_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000150_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000150_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_017342_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_017342_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000093_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000093_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000112_000019_leftImg8bit.png,gtFine/train/jena/jena_000112_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000024_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000024_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000078_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000078_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000212_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000212_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_017453_leftImg8bit.png,gtFine/train/bochum/bochum_000000_017453_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_071675_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_071675_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000075_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000075_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000120_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000120_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000090_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000090_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000026_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000026_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000044_000019_leftImg8bit.png,gtFine/train/jena/jena_000044_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_044747_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_044747_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000129_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000129_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_009110_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_009110_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_062371_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_062371_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_035768_leftImg8bit.png,gtFine/train/hanover/hanover_000000_035768_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_022361_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_022361_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_046872_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_046872_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_021479_leftImg8bit.png,gtFine/train/bochum/bochum_000000_021479_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000063_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000063_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_019672_leftImg8bit.png,gtFine/train/hanover/hanover_000000_019672_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000082_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000082_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000106_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000106_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_093325_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_093325_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_003442_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_003442_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_020624_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_020624_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_024989_leftImg8bit.png,gtFine/train/hanover/hanover_000000_024989_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000070_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000070_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_059914_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_059914_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000094_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000094_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_013705_leftImg8bit.png,gtFine/train/bochum/bochum_000000_013705_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_006995_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_006995_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_047157_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_047157_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000277_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000277_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000040_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000040_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000126_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000126_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000066_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000066_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_003707_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_003707_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000031_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000031_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000006_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000006_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000108_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000108_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_042255_leftImg8bit.png,gtFine/train/hanover/hanover_000000_042255_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_058189_leftImg8bit.png,gtFine/train/hanover/hanover_000000_058189_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_025491_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_025491_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000159_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000159_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_030539_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_030539_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000102_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000102_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000029_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000029_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000130_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000130_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000122_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000122_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_018213_leftImg8bit.png,gtFine/train/hanover/hanover_000000_018213_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_019373_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_019373_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000135_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000135_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000000_000019_leftImg8bit.png,gtFine/train/jena/jena_000000_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000033_000019_leftImg8bit.png,gtFine/train/jena/jena_000033_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000088_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000088_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000124_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000124_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_045704_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_045704_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_018874_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_018874_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_008804_leftImg8bit.png,gtFine/train/bochum/bochum_000000_008804_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000010_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000010_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000242_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000242_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000042_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000042_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_056142_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_056142_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000132_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000132_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000237_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000237_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_021104_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_021104_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_000054_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_000054_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000008_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000008_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000090_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000090_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_015116_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_015116_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000310_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000310_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000111_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000111_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000170_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000170_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000103_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000103_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_015764_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_015764_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000037_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000037_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_038446_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_038446_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_030781_leftImg8bit.png,gtFine/train/hanover/hanover_000000_030781_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000103_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000103_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000111_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000111_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000199_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000199_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_029043_leftImg8bit.png,gtFine/train/hanover/hanover_000000_029043_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000113_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000113_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000049_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000049_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000078_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000078_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_018616_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_018616_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000100_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000100_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000068_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000068_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000080_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000080_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_018445_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_018445_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_038511_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_038511_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000072_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000072_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_054029_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_054029_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000133_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000133_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000056_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000056_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000088_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000088_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_040620_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_040620_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_039446_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_039446_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_030010_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_030010_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000110_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000110_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_024701_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_024701_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000108_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000108_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000012_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000012_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000135_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000135_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000004_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000004_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_016260_leftImg8bit.png,gtFine/train/bochum/bochum_000000_016260_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000031_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000031_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_029325_leftImg8bit.png,gtFine/train/hanover/hanover_000000_029325_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000130_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000130_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000083_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000083_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000096_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000096_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000074_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000074_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000056_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000056_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000080_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000080_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000083_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000083_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000046_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000046_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_043102_leftImg8bit.png,gtFine/train/hanover/hanover_000000_043102_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000039_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000039_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000047_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000047_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_062362_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_062362_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000155_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000155_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000043_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000043_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000136_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000136_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000117_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000117_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000061_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000061_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000052_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000052_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_058373_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_058373_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000035_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000035_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000044_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000044_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000023_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000023_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000096_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000096_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000022_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000022_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000084_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000084_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000020_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000020_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000121_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000121_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_088983_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_088983_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_052887_leftImg8bit.png,gtFine/train/hanover/hanover_000000_052887_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000072_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000072_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000193_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000193_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051448_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051448_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000089_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000089_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_037906_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_037906_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_079376_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_079376_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_023854_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_023854_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000117_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000117_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000073_000019_leftImg8bit.png,gtFine/train/jena/jena_000073_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_012070_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_012070_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000122_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000122_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000227_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000227_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000149_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000149_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_017950_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_017950_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_012672_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_012672_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_023472_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_023472_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000047_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000047_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000061_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000061_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000049_000019_leftImg8bit.png,gtFine/train/jena/jena_000049_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_018742_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_018742_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000002_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000002_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_005970_leftImg8bit.png,gtFine/train/hanover/hanover_000000_005970_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000178_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000178_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000091_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000091_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000211_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000211_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000113_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000113_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000118_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000118_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_031623_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_031623_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000034_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000034_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_098400_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_098400_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_043236_leftImg8bit.png,gtFine/train/hanover/hanover_000000_043236_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000026_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000026_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_040133_leftImg8bit.png,gtFine/train/hanover/hanover_000000_040133_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000072_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000072_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000074_000019_leftImg8bit.png,gtFine/train/jena/jena_000074_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000050_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000050_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_006274_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_006274_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027282_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027282_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_034936_leftImg8bit.png,gtFine/train/bochum/bochum_000000_034936_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000136_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000136_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_013322_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_013322_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000034_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000034_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_028638_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_028638_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_045841_leftImg8bit.png,gtFine/train/hanover/hanover_000000_045841_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_053604_leftImg8bit.png,gtFine/train/hanover/hanover_000000_053604_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000045_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000045_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029839_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029839_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017044_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017044_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_021663_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_021663_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000037_000019_leftImg8bit.png,gtFine/train/jena/jena_000037_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_009333_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_009333_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000037_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000037_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000109_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000109_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_003159_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_003159_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000066_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000066_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000022_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000022_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000033_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000033_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000009_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000009_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000195_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000195_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000077_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000077_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_004745_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_004745_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_011471_leftImg8bit.png,gtFine/train/hanover/hanover_000000_011471_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_026316_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_026316_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_031144_leftImg8bit.png,gtFine/train/hanover/hanover_000000_031144_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_019188_leftImg8bit.png,gtFine/train/bochum/bochum_000000_019188_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_098061_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_098061_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000138_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000138_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000057_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000057_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000132_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000132_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_032390_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_032390_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000033_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000033_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000120_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000120_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000093_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000093_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_028216_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_028216_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000155_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000155_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_021000_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_021000_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000218_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000218_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000131_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000131_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000028_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000028_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_061285_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_061285_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_048274_leftImg8bit.png,gtFine/train/hanover/hanover_000000_048274_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_040294_leftImg8bit.png,gtFine/train/hanover/hanover_000000_040294_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000112_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000112_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000063_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000063_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_055698_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_055698_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000076_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000076_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_092850_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_092850_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_038915_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_038915_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000161_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000161_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_048494_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_048494_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_041493_leftImg8bit.png,gtFine/train/hanover/hanover_000000_041493_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000014_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000014_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000182_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000182_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000043_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000043_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000086_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000086_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000107_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000107_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_018872_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_018872_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000232_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000232_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000029_000019_leftImg8bit.png,gtFine/train/jena/jena_000029_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000005_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000005_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000140_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000140_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014066_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014066_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000044_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000044_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000006_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000006_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000067_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000067_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000298_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000298_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000022_000019_leftImg8bit.png,gtFine/train/jena/jena_000022_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000103_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000103_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000082_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000082_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_057487_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_057487_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000125_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000125_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_018866_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_018866_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000092_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000092_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000177_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000177_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_033457_leftImg8bit.png,gtFine/train/hanover/hanover_000000_033457_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_047336_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_047336_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000043_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000043_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000040_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000040_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000047_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000047_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052544_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052544_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000082_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000082_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000253_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000253_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000105_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000105_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000108_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000108_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000309_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000309_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000036_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000036_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000240_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000240_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_104857_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_104857_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000086_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000086_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000050_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000050_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_034621_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_034621_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000047_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000047_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_001620_leftImg8bit.png,gtFine/train/hanover/hanover_000000_001620_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000151_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000151_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000083_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000083_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_030269_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_030269_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_036016_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_036016_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000017_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000017_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_105724_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_105724_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000073_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000073_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000074_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000074_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_070444_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_070444_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000110_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000110_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_034049_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_034049_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000075_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000052_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000052_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000055_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000055_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000085_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000085_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027481_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027481_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000146_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000146_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000001_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000001_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_040981_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_040981_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_032845_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_032845_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_095561_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_095561_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_011383_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_011383_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000107_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000107_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_056361_leftImg8bit.png,gtFine/train/hanover/hanover_000000_056361_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000001_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000001_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000131_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000131_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000142_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000142_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000130_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000130_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000089_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000089_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000150_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000150_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_024276_leftImg8bit.png,gtFine/train/hanover/hanover_000000_024276_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_032906_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_032906_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000094_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000094_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000026_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000026_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000015_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000015_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_015038_leftImg8bit.png,gtFine/train/bochum/bochum_000000_015038_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000109_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000109_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000202_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000202_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000026_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000026_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000070_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000070_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_013228_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_013228_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_047390_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_047390_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000118_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000118_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000012_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000012_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000113_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000113_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000039_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000039_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000117_000019_leftImg8bit.png,gtFine/train/jena/jena_000117_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000004_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000004_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000116_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000116_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029339_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029339_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_029526_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_029526_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_023435_leftImg8bit.png,gtFine/train/bochum/bochum_000000_023435_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000094_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000094_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_049977_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_049977_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000165_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000165_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_012675_leftImg8bit.png,gtFine/train/hanover/hanover_000000_012675_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000046_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000046_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000006_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000006_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000077_000019_leftImg8bit.png,gtFine/train/jena/jena_000077_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000172_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000172_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_016481_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_016481_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000229_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000229_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_002140_leftImg8bit.png,gtFine/train/hanover/hanover_000000_002140_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000091_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000091_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000030_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000030_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000046_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000046_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_057517_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_057517_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_039703_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_039703_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_014319_leftImg8bit.png,gtFine/train/hanover/hanover_000000_014319_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000118_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000118_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000113_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000113_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000008_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000008_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000095_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000095_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_045908_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_045908_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000166_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000166_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000093_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000093_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_012347_leftImg8bit.png,gtFine/train/hanover/hanover_000000_012347_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000066_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000066_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000112_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000112_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_048960_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_048960_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_005912_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_005912_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_002081_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_002081_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000007_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000007_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000092_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000092_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000024_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000024_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000051_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000051_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000072_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000072_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_023143_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_023143_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000068_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000068_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000029_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000029_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_009191_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_009191_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_011483_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_011483_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_017489_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_017489_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000171_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000171_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000056_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000056_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000079_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000079_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_036527_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_036527_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000290_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000290_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_030997_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_030997_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000123_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000123_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000137_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000137_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_033448_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_033448_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000084_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000084_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000173_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000173_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000080_000019_leftImg8bit.png,gtFine/train/jena/jena_000080_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_047499_leftImg8bit.png,gtFine/train/hanover/hanover_000000_047499_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_015506_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_015506_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_030889_leftImg8bit.png,gtFine/train/hanover/hanover_000000_030889_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_034231_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_034231_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_013094_leftImg8bit.png,gtFine/train/hanover/hanover_000000_013094_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_014685_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_014685_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_035958_leftImg8bit.png,gtFine/train/bochum/bochum_000000_035958_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000048_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000048_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000021_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000021_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000034_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000034_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000072_000019_leftImg8bit.png,gtFine/train/jena/jena_000072_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000002_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000002_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_048765_leftImg8bit.png,gtFine/train/hanover/hanover_000000_048765_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_023698_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_023698_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000029_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000029_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000096_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000096_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000120_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000120_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000088_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000088_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_071016_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_071016_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_019791_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_019791_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000070_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000070_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_003096_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_003096_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000100_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000100_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_005289_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_005289_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000126_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000126_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000055_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000055_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000153_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000153_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000100_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000100_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000093_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000093_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000027_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000027_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000098_000019_leftImg8bit.png,gtFine/train/jena/jena_000098_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027561_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027561_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_003224_leftImg8bit.png,gtFine/train/hanover/hanover_000000_003224_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000163_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000163_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000052_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000052_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_034633_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_034633_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_042885_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_042885_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_030701_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_030701_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000073_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000073_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000083_000019_leftImg8bit.png,gtFine/train/jena/jena_000083_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000013_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000013_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000127_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000127_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000007_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000007_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000286_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000286_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000194_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000194_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000082_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000082_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000026_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000026_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000097_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000097_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000053_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000053_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000147_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000147_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000146_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000146_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000104_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000104_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_031272_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_031272_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000033_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000033_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000073_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000073_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000070_000019_leftImg8bit.png,gtFine/train/jena/jena_000070_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_031427_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_031427_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000061_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000061_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000024_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000024_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000078_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000078_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_067223_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_067223_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_033129_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_033129_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_032460_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_032460_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000091_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000091_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000211_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000211_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_053579_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_053579_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000090_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000090_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000268_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000268_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000116_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000116_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000062_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000062_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_102574_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_102574_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029179_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029179_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000049_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000049_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014101_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014101_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000166_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000166_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000028_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000028_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000164_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000164_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_007864_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_007864_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000280_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000280_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000110_000019_leftImg8bit.png,gtFine/train/jena/jena_000110_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000106_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000106_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_010640_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_010640_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000118_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000118_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000060_000019_leftImg8bit.png,gtFine/train/jena/jena_000060_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000111_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000111_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000035_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000035_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000076_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000076_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000279_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000279_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_074267_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_074267_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000086_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000086_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000085_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000085_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000136_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000136_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_103856_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_103856_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000045_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000045_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000188_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000188_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_034387_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_034387_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000244_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000244_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000025_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000025_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_020089_leftImg8bit.png,gtFine/train/hanover/hanover_000000_020089_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000102_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000102_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_030725_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_030725_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_039420_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_039420_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000052_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000052_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_001531_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_001531_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000032_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000032_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000018_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000018_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_034560_leftImg8bit.png,gtFine/train/hanover/hanover_000000_034560_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000096_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000096_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000064_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000064_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_045446_leftImg8bit.png,gtFine/train/hanover/hanover_000000_045446_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_076392_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_076392_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000058_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000058_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000162_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000162_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_028056_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_028056_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_080878_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_080878_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000032_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000032_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_022489_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_022489_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000075_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_038022_leftImg8bit.png,gtFine/train/bochum/bochum_000000_038022_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000136_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000136_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000062_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000062_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000012_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000012_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000114_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000114_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000302_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000302_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000191_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000191_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_021222_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_021222_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_028460_leftImg8bit.png,gtFine/train/hanover/hanover_000000_028460_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000052_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000052_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_006916_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_006916_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000030_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000030_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000069_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000069_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_063385_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_063385_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000073_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000073_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_040761_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_040761_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_025746_leftImg8bit.png,gtFine/train/bochum/bochum_000000_025746_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000183_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000183_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000018_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000018_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000089_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000089_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000070_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000070_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000038_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000038_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_008200_leftImg8bit.png,gtFine/train/hanover/hanover_000000_008200_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000184_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000184_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000082_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000082_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000025_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000025_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_055860_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_055860_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000014_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000014_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000108_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000108_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000087_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000087_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_026675_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_026675_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000024_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000024_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_011170_leftImg8bit.png,gtFine/train/hanover/hanover_000000_011170_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_018114_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_018114_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000094_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000094_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000010_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000010_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000117_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000117_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000058_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000058_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000091_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000091_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_051536_leftImg8bit.png,gtFine/train/hanover/hanover_000000_051536_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000046_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000046_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000206_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000206_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000281_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000281_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000042_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000042_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000002_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000002_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000084_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000084_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_030017_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_030017_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000095_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000095_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000080_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000080_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000016_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000016_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000090_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000090_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000018_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000018_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_004383_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_004383_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_037741_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_037741_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000139_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000139_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_044996_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_044996_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_002216_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_002216_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000036_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000036_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_022645_leftImg8bit.png,gtFine/train/hanover/hanover_000000_022645_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000069_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000069_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_080438_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_080438_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000043_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000043_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000003_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000003_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000262_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000262_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_010280_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_010280_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000163_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000163_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000019_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000019_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000087_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000087_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000057_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000057_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000114_000019_leftImg8bit.png,gtFine/train/jena/jena_000114_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000022_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000022_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000071_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000071_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000051_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000051_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000087_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000087_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_024604_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_024604_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_070334_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_070334_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000111_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000111_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_031856_leftImg8bit.png,gtFine/train/hanover/hanover_000000_031856_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000143_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000143_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000040_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000040_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000137_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000137_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_049399_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_049399_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000001_000019_leftImg8bit.png,gtFine/train/jena/jena_000001_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_069096_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_069096_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000067_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000067_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000010_000019_leftImg8bit.png,gtFine/train/jena/jena_000010_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_073549_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_073549_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_049465_leftImg8bit.png,gtFine/train/hanover/hanover_000000_049465_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017761_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017761_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000311_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000311_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000018_000019_leftImg8bit.png,gtFine/train/jena/jena_000018_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000105_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000105_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000109_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000109_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_004983_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_004983_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000024_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000024_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000115_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000115_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_000042_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_000042_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_103541_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_103541_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000014_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000014_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_035276_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_035276_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000021_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000021_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_027233_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_027233_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000105_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000105_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_031360_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_031360_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000105_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000105_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052840_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052840_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000121_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000121_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000138_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000138_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000060_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000060_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000062_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000062_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000034_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000034_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000008_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000008_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_027075_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_027075_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000135_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000135_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000053_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000053_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_032315_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_032315_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000035_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000035_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000194_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000194_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_032346_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_032346_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_088197_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_088197_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000017_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000017_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000156_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000156_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000055_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000055_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_031602_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_031602_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000071_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000071_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000064_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000064_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_047619_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_047619_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_086636_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_086636_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000010_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000010_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000048_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000048_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000073_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000073_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000115_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000115_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000097_000019_leftImg8bit.png,gtFine/train/jena/jena_000097_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_039264_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_039264_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000157_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000157_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000178_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000178_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000099_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000099_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000217_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000217_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000064_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000064_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_074139_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_074139_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000014_000019_leftImg8bit.png,gtFine/train/jena/jena_000014_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000082_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000082_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_014713_leftImg8bit.png,gtFine/train/hanover/hanover_000000_014713_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_000383_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_000383_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000059_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000059_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000083_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000083_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_035568_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_035568_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000004_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000004_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_030435_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_030435_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_009554_leftImg8bit.png,gtFine/train/bochum/bochum_000000_009554_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_024243_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_024243_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000144_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000144_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_009420_leftImg8bit.png,gtFine/train/hanover/hanover_000000_009420_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_008162_leftImg8bit.png,gtFine/train/bochum/bochum_000000_008162_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_044195_leftImg8bit.png,gtFine/train/hanover/hanover_000000_044195_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000117_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000117_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000069_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000069_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000042_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000042_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000025_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000025_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_005138_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_005138_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000002_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000002_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000005_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000005_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000017_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000017_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000104_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000104_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000013_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000013_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000116_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000116_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000047_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000047_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000074_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000074_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_015350_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_015350_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000288_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000288_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000037_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000037_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_036562_leftImg8bit.png,gtFine/train/hanover/hanover_000000_036562_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000300_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000300_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000075_000019_leftImg8bit.png,gtFine/train/jena/jena_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000173_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000173_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000126_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000126_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000255_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000255_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_062964_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_062964_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000130_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000130_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_009926_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_009926_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_008239_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_008239_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_016447_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_016447_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000055_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000055_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000043_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000043_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000122_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000122_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000001_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000001_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_030346_leftImg8bit.png,gtFine/train/hanover/hanover_000000_030346_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000019_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000019_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_017469_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_017469_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_017041_leftImg8bit.png,gtFine/train/hanover/hanover_000000_017041_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000008_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000008_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000024_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000024_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000085_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000085_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000046_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000046_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000037_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000037_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_021951_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_021951_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000051_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000051_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000113_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000113_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_022560_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_022560_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000120_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000120_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_030941_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_030941_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000063_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000063_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000106_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000106_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_053086_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_053086_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000002_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000002_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_010505_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_010505_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_023515_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_023515_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_001072_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_001072_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000023_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000023_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_039114_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_039114_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_009615_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_009615_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000169_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000169_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000231_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000231_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_034686_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_034686_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000179_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000179_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000057_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000057_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000084_000019_leftImg8bit.png,gtFine/train/jena/jena_000084_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014235_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014235_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_027699_leftImg8bit.png,gtFine/train/bochum/bochum_000000_027699_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000241_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000241_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_001097_leftImg8bit.png,gtFine/train/bochum/bochum_000000_001097_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000020_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000020_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000073_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000073_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_052649_leftImg8bit.png,gtFine/train/hanover/hanover_000000_052649_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000082_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000082_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_039021_leftImg8bit.png,gtFine/train/hanover/hanover_000000_039021_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000009_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000009_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000151_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000151_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000100_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000100_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000125_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000125_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000103_000019_leftImg8bit.png,gtFine/train/jena/jena_000103_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000139_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000139_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_067338_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_067338_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_089696_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_089696_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000008_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000008_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_067587_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_067587_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000299_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000299_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000046_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000046_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000071_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000071_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000104_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000104_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_005219_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_005219_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_056601_leftImg8bit.png,gtFine/train/hanover/hanover_000000_056601_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000037_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000037_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_078842_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_078842_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000224_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000224_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000235_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000235_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_009930_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_009930_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000000_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000000_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_060907_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_060907_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_065843_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_065843_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000138_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000138_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000062_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000062_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_000381_leftImg8bit.png,gtFine/train/hanover/hanover_000000_000381_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000055_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000055_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000017_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000017_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_009690_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_009690_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000137_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000137_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000126_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000126_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000027_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000027_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000062_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000062_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_033714_leftImg8bit.png,gtFine/train/bochum/bochum_000000_033714_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000033_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000033_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_057811_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_057811_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_037298_leftImg8bit.png,gtFine/train/hanover/hanover_000000_037298_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000070_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000070_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000019_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000019_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_016681_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_016681_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000091_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000091_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000052_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000052_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_053486_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_053486_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_031223_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_031223_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_023856_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_023856_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000096_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000096_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000088_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000088_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_031067_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_031067_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000031_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000031_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000167_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000167_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000162_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000162_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_011711_leftImg8bit.png,gtFine/train/bochum/bochum_000000_011711_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000275_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000275_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000004_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000004_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000042_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000042_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000035_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000035_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_084865_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_084865_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000054_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000054_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000073_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000073_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000059_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000059_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000072_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000072_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000117_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000117_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000032_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000032_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_014033_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_014033_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000090_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000090_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_006153_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_006153_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000059_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000059_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000012_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000012_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000119_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000119_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052050_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052050_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_013914_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_013914_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_025833_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_025833_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_024136_leftImg8bit.png,gtFine/train/hanover/hanover_000000_024136_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000081_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000081_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000054_000019_leftImg8bit.png,gtFine/train/jena/jena_000054_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_099368_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_099368_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_037645_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_037645_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_046646_leftImg8bit.png,gtFine/train/hanover/hanover_000000_046646_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000028_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000028_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_010816_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_010816_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_015687_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_015687_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000114_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000114_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000008_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000008_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_029676_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_029676_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000000_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000000_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000139_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000139_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000284_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000284_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000059_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000059_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000051_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000051_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_036003_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_036003_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000198_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000198_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000003_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000003_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000092_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000092_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000021_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000021_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000220_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000220_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_000710_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_000710_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000060_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000060_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000063_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000063_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000249_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000249_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_023064_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_023064_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000080_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000080_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000153_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000153_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_019901_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_019901_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_089491_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_089491_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000136_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000136_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000120_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000120_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000056_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000056_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_010562_leftImg8bit.png,gtFine/train/bochum/bochum_000000_010562_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_073672_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_073672_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000019_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000019_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_037829_leftImg8bit.png,gtFine/train/bochum/bochum_000000_037829_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000081_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000081_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000044_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000044_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000148_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000148_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000110_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000110_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000189_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000189_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000119_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000119_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_005876_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_005876_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000106_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000106_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_003853_leftImg8bit.png,gtFine/train/hanover/hanover_000000_003853_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000117_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000117_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017283_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017283_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000115_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000115_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000114_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000114_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000102_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000102_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000060_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000060_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_009404_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_009404_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_020211_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_020211_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000087_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000087_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000057_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000057_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_035718_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_035718_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_018747_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_018747_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000011_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000011_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000252_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000252_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000063_000019_leftImg8bit.png,gtFine/train/jena/jena_000063_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_006621_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_006621_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_039231_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_039231_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029915_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029915_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_018358_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_018358_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000068_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000068_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000051_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000051_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_054220_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_054220_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000025_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000025_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000138_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000138_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000243_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000243_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_022363_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_022363_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000059_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000059_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000052_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000052_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_016125_leftImg8bit.png,gtFine/train/bochum/bochum_000000_016125_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_001068_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_001068_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_035255_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_035255_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000076_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000076_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_023510_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_023510_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_025335_leftImg8bit.png,gtFine/train/hanover/hanover_000000_025335_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000048_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000048_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000182_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000182_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000073_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000073_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_042434_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_042434_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_032614_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_032614_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000006_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000006_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000049_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000049_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000181_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000181_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000101_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000101_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_026602_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_026602_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000078_000019_leftImg8bit.png,gtFine/train/jena/jena_000078_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_040456_leftImg8bit.png,gtFine/train/hanover/hanover_000000_040456_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_030221_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_030221_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_006169_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_006169_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_017540_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_017540_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000115_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000115_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000015_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000015_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_052122_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_052122_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000076_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000076_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000006_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000006_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000021_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000021_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000278_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000278_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_020776_leftImg8bit.png,gtFine/train/bochum/bochum_000000_020776_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000043_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000043_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_052729_leftImg8bit.png,gtFine/train/hanover/hanover_000000_052729_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_015587_leftImg8bit.png,gtFine/train/hanover/hanover_000000_015587_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000057_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000057_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_002354_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_002354_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000093_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000093_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000062_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000062_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000022_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000022_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_031582_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_031582_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_030706_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_030706_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000087_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000087_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000123_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000123_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000134_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000134_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000071_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000071_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_005876_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_005876_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000071_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000071_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_027954_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_027954_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_011617_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_011617_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_024152_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_024152_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000105_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000105_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000021_000019_leftImg8bit.png,gtFine/train/jena/jena_000021_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000132_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000132_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000141_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000141_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000069_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000069_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_026575_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_026575_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000042_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000042_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_073999_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_073999_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000009_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000009_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_045880_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_045880_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000059_000019_leftImg8bit.png,gtFine/train/jena/jena_000059_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000190_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000190_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_019892_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_019892_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000075_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000033_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000033_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000065_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000065_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_058591_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_058591_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_019142_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_019142_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_005686_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_005686_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000091_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000091_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000002_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000002_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_029696_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_029696_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_002644_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_002644_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000026_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000026_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_026006_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_026006_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_028202_leftImg8bit.png,gtFine/train/hanover/hanover_000000_028202_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_056800_leftImg8bit.png,gtFine/train/hanover/hanover_000000_056800_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000101_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000101_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000131_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000131_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000201_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000201_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000103_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000103_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_034389_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_034389_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_014803_leftImg8bit.png,gtFine/train/bochum/bochum_000000_014803_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000172_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000172_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000076_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000076_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000030_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000030_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000119_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000119_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000065_000019_leftImg8bit.png,gtFine/train/jena/jena_000065_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000076_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000076_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000006_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000006_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000115_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000115_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_010160_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_010160_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_007150_leftImg8bit.png,gtFine/train/bochum/bochum_000000_007150_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000058_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000058_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000044_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000044_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000105_000019_leftImg8bit.png,gtFine/train/jena/jena_000105_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000208_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000208_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000042_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000042_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000260_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000260_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_001613_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_001613_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000063_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000063_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000041_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000041_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_034097_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_034097_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_035008_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_035008_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_039374_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_039374_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000071_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000071_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000072_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000072_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000123_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000123_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000054_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000054_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_018004_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_018004_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029400_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029400_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000051_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000051_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000005_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000005_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_047755_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_047755_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000203_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000203_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_022151_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_022151_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000000_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000000_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000042_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000042_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000055_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000055_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_029404_leftImg8bit.png,gtFine/train/hanover/hanover_000000_029404_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_004608_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_004608_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000084_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000084_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000143_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000143_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000103_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000103_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000079_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000079_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000107_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000107_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000164_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000164_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000101_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000101_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000184_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000184_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000048_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000048_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_015849_leftImg8bit.png,gtFine/train/hanover/hanover_000000_015849_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000018_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000018_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000003_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000003_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000066_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000066_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000052_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000052_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000001_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000001_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_037223_leftImg8bit.png,gtFine/train/bochum/bochum_000000_037223_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000040_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000040_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000028_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000028_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000051_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000051_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000020_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000020_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_002229_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_002229_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_040793_leftImg8bit.png,gtFine/train/hanover/hanover_000000_040793_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_006483_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_006483_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000084_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000084_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000092_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000092_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000116_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000116_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_058954_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_058954_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000287_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000287_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000193_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000193_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000050_000019_leftImg8bit.png,gtFine/train/jena/jena_000050_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000210_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000210_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000005_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000005_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000029_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000029_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_016024_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_016024_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_077927_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_077927_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_032660_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_032660_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_027771_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_027771_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000110_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000110_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_069417_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_069417_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000031_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000031_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000017_000019_leftImg8bit.png,gtFine/train/jena/jena_000017_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000088_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000088_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_019456_leftImg8bit.png,gtFine/train/hanover/hanover_000000_019456_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000049_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000049_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000079_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000079_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_000926_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_000926_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000023_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000023_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000022_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000022_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000056_000019_leftImg8bit.png,gtFine/train/jena/jena_000056_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000131_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000131_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000162_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000162_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_037039_leftImg8bit.png,gtFine/train/hanover/hanover_000000_037039_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_005252_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_005252_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000258_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000258_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000084_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000084_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_019682_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_019682_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000127_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000127_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000028_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000028_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_042869_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_042869_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000071_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000071_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_000712_leftImg8bit.png,gtFine/train/hanover/hanover_000000_000712_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000305_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000305_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000176_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000176_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000022_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000022_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000044_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000044_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000010_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000010_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000216_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000216_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_090742_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_090742_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_008584_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_008584_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000015_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000015_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000207_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000207_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_061472_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_061472_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_046398_leftImg8bit.png,gtFine/train/hanover/hanover_000000_046398_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000196_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000196_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000000_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000000_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_016253_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_016253_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_028378_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_028378_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000064_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000064_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_060821_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_060821_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000087_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000087_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_007737_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_007737_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000007_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000007_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000140_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000140_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_005995_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_005995_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000164_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000164_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_055934_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_055934_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000074_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000074_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000053_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000053_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_001278_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_001278_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000036_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000036_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000208_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000208_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000040_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000040_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000098_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000098_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000092_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000092_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000103_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000103_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000041_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000041_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_022836_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_022836_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000152_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000152_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000007_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000007_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000199_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000199_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000003_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000003_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000063_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000063_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000023_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000023_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_020873_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_020873_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000064_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000064_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_035124_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_035124_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000029_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000029_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_055124_leftImg8bit.png,gtFine/train/hanover/hanover_000000_055124_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_013944_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_013944_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000085_000019_leftImg8bit.png,gtFine/train/jena/jena_000085_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_020432_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_020432_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_026269_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_026269_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000127_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000127_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_003411_leftImg8bit.png,gtFine/train/hanover/hanover_000000_003411_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_034156_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_034156_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000094_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000094_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000036_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000036_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_099109_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_099109_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000158_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000158_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000192_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000192_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000057_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000057_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000293_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000293_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051134_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051134_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000144_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000144_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000040_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000040_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_091155_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_091155_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000062_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000062_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000303_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000303_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_058105_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_058105_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000146_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000146_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_006562_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_006562_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000042_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000042_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_015605_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_015605_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000002_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000002_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000059_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000059_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000058_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000058_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_007148_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_007148_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_019282_leftImg8bit.png,gtFine/train/hanover/hanover_000000_019282_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_030400_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_030400_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000098_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000098_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000034_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000034_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_069289_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_069289_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000105_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000105_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000101_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000101_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_019355_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_019355_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000187_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000187_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_030279_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_030279_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_073389_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_073389_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000006_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000006_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000003_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000003_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_031922_leftImg8bit.png,gtFine/train/bochum/bochum_000000_031922_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000053_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000053_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000086_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000086_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000140_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000140_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000102_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000102_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000170_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000170_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000133_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000133_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000115_000019_leftImg8bit.png,gtFine/train/jena/jena_000115_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000030_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000030_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_018546_leftImg8bit.png,gtFine/train/hanover/hanover_000000_018546_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_001106_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_001106_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_022067_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_022067_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_016376_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_016376_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000197_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000197_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000007_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000007_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_029704_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_029704_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000072_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000072_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000045_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000045_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000009_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000009_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000014_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000014_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_014673_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_014673_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000079_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000079_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_002183_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_002183_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000110_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000110_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000068_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000068_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000084_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000084_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000173_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000173_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000006_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000006_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_003991_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_003991_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000097_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000097_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_023375_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_023375_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000106_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000106_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_003632_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_003632_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_018800_leftImg8bit.png,gtFine/train/hanover/hanover_000000_018800_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000088_000019_leftImg8bit.png,gtFine/train/jena/jena_000088_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_101724_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_101724_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000130_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000130_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000079_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000079_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_003488_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_003488_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000015_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000015_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000016_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000016_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000150_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000150_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_025772_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_025772_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000065_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000065_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000129_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000129_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000058_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000058_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000077_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000077_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000074_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000074_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000107_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000107_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000006_000019_leftImg8bit.png,gtFine/train/jena/jena_000006_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000050_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000050_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_024945_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_024945_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_004106_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_004106_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000004_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000004_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_051152_leftImg8bit.png,gtFine/train/hanover/hanover_000000_051152_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_004985_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_004985_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_026908_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_026908_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000106_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000106_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027650_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027650_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000057_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000057_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000038_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000038_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000128_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000128_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000014_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000014_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000034_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000034_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000021_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000021_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_013205_leftImg8bit.png,gtFine/train/hanover/hanover_000000_013205_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_026056_leftImg8bit.png,gtFine/train/bochum/bochum_000000_026056_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000036_000019_leftImg8bit.png,gtFine/train/jena/jena_000036_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_008784_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_008784_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_010653_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_010653_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000036_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000036_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000168_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000168_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000038_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000038_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000233_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000233_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000069_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000069_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000107_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000107_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000169_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000169_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000089_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000089_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_002338_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_002338_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000097_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000097_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000020_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000020_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_026856_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_026856_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_007897_leftImg8bit.png,gtFine/train/hanover/hanover_000000_007897_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000216_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000216_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_000442_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_000442_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000091_000019_leftImg8bit.png,gtFine/train/jena/jena_000091_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_028764_leftImg8bit.png,gtFine/train/bochum/bochum_000000_028764_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_029721_leftImg8bit.png,gtFine/train/bochum/bochum_000000_029721_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000143_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000143_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000059_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000059_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029051_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029051_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000128_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000128_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_002519_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_002519_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_098616_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_098616_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000087_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000087_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000096_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000096_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000033_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000033_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000214_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000214_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000141_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000141_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_025426_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_025426_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000094_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000094_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000173_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000173_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_080674_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_080674_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000004_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000004_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000137_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000137_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000135_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000135_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000062_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000062_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_007780_leftImg8bit.png,gtFine/train/hanover/hanover_000000_007780_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000016_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000016_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000045_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000045_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000068_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000068_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000036_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000036_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_024637_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_024637_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_000508_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_000508_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000078_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000078_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_029378_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_029378_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000043_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000043_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_005936_leftImg8bit.png,gtFine/train/bochum/bochum_000000_005936_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051574_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051574_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000085_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000085_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000172_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000172_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_021337_leftImg8bit.png,gtFine/train/hanover/hanover_000000_021337_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000157_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000157_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000099_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000099_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000093_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000093_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000011_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000011_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_035713_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_035713_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000030_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000030_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000154_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000154_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000050_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000050_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000131_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000131_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000138_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000138_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052497_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052497_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000070_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000070_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_009097_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_009097_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000083_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000083_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000112_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000112_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000221_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000221_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000091_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000091_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_061685_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_061685_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_021325_leftImg8bit.png,gtFine/train/bochum/bochum_000000_021325_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000191_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000191_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000099_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000099_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000099_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000099_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_037039_leftImg8bit.png,gtFine/train/bochum/bochum_000000_037039_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000001_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000001_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000040_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000040_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000048_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000048_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000086_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000086_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000054_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000054_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000001_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000001_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_027057_leftImg8bit.png,gtFine/train/bochum/bochum_000000_027057_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_024343_leftImg8bit.png,gtFine/train/bochum/bochum_000000_024343_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000035_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000035_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000259_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000259_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000004_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000004_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000046_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000046_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_054555_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_054555_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000146_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000146_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_014886_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_014886_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_007657_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_007657_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000019_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000019_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000015_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000015_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000089_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000089_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000047_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000047_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000081_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000081_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_088054_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_088054_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000064_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000064_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_027857_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_027857_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000114_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000114_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_060586_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_060586_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000078_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000078_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000087_000019_leftImg8bit.png,gtFine/train/jena/jena_000087_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_018294_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_018294_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000282_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000282_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000050_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000050_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000041_000019_leftImg8bit.png,gtFine/train/jena/jena_000041_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000084_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000084_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000025_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000025_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000095_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000095_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000070_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000070_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000129_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000129_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000121_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000121_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_052904_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_052904_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_085645_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_085645_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000135_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000135_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000083_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000083_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000122_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000122_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000108_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000108_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000063_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000063_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000022_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000022_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000150_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000150_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000011_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000011_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000038_000019_leftImg8bit.png,gtFine/train/jena/jena_000038_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000063_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000063_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000012_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000012_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000017_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000017_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_055592_leftImg8bit.png,gtFine/train/hanover/hanover_000000_055592_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_084746_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_084746_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000101_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000101_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000134_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000134_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000245_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000245_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_097086_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_097086_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_043886_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_043886_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000116_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000116_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_037516_leftImg8bit.png,gtFine/train/hanover/hanover_000000_037516_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_066988_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_066988_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_023239_leftImg8bit.png,gtFine/train/hanover/hanover_000000_023239_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000089_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000089_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_065572_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_065572_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000070_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000070_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000045_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000045_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000049_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000049_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_019050_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_019050_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000178_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000178_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000170_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000170_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_087216_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_087216_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000119_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000119_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_026882_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_026882_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000053_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000053_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_048605_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_048605_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000097_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000097_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000128_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000128_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_019125_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_019125_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_000065_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_000065_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000003_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000003_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000061_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000061_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_013766_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_013766_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000037_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000037_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000099_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000099_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_054639_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_054639_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_013574_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_013574_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000128_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000128_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_027097_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_027097_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000081_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000081_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_017844_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_017844_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000124_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000124_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000225_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000225_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000028_000019_leftImg8bit.png,gtFine/train/jena/jena_000028_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000082_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000082_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000024_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000024_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_063808_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_063808_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000018_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000018_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000008_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000008_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_023881_leftImg8bit.png,gtFine/train/hanover/hanover_000000_023881_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000055_000019_leftImg8bit.png,gtFine/train/jena/jena_000055_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_016558_leftImg8bit.png,gtFine/train/hanover/hanover_000000_016558_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_026014_leftImg8bit.png,gtFine/train/hanover/hanover_000000_026014_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_023052_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_023052_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000092_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000092_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_025812_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_025812_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_034935_leftImg8bit.png,gtFine/train/hanover/hanover_000000_034935_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000099_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000099_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_000076_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_000076_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_061468_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_061468_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_007695_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_007695_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_042235_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_042235_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000119_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000119_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000091_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000091_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000021_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000021_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000027_000019_leftImg8bit.png,gtFine/train/jena/jena_000027_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000049_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000049_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000093_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000093_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_002293_leftImg8bit.png,gtFine/train/bochum/bochum_000000_002293_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_086499_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_086499_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_049269_leftImg8bit.png,gtFine/train/hanover/hanover_000000_049269_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000041_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000041_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000013_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000013_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_007524_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_007524_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000112_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000112_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000058_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000058_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_024717_leftImg8bit.png,gtFine/train/bochum/bochum_000000_024717_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000140_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000140_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000048_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000048_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_006518_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_006518_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_024921_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_024921_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000042_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000042_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_033506_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_033506_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000217_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000217_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_019229_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_019229_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_003489_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_003489_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000027_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000027_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_057191_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_057191_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_053222_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_053222_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_006322_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_006322_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000079_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000079_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000093_000019_leftImg8bit.png,gtFine/train/jena/jena_000093_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000039_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000039_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_014537_leftImg8bit.png,gtFine/train/hanover/hanover_000000_014537_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000055_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000055_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000171_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000171_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000122_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000122_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000301_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000301_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000042_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000042_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_005175_leftImg8bit.png,gtFine/train/hanover/hanover_000000_005175_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000110_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000110_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000142_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000142_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000055_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000055_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_049005_leftImg8bit.png,gtFine/train/hanover/hanover_000000_049005_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_021353_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_021353_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_020653_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_020653_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000102_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000102_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000250_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000250_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_026580_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_026580_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000097_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000097_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000024_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000024_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000019_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000019_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_015880_leftImg8bit.png,gtFine/train/bochum/bochum_000000_015880_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000157_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000157_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000022_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000022_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000067_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000067_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000095_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000095_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029281_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029281_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000088_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000088_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000234_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000234_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_038855_leftImg8bit.png,gtFine/train/hanover/hanover_000000_038855_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_009795_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_009795_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014931_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014931_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000017_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000017_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000029_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000029_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_009471_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_009471_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000003_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000003_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000035_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000035_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_001936_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_001936_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000018_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000018_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000024_000019_leftImg8bit.png,gtFine/train/jena/jena_000024_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000079_000019_leftImg8bit.png,gtFine/train/jena/jena_000079_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000018_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000018_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000023_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000023_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000062_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000062_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000125_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000125_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_028883_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_028883_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000005_000019_leftImg8bit.png,gtFine/train/jena/jena_000005_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000256_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000256_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_009004_leftImg8bit.png,gtFine/train/hanover/hanover_000000_009004_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_078407_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_078407_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000066_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000066_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000203_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000203_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000097_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000097_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000088_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000088_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000001_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000001_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000020_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000020_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027390_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027390_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000037_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000037_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000257_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000257_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_023338_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_023338_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000084_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000084_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_060173_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_060173_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014743_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014743_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000159_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000159_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_053776_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_053776_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_016691_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_016691_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000167_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000167_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000001_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000001_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_031323_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_031323_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_024719_leftImg8bit.png,gtFine/train/hanover/hanover_000000_024719_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000283_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000283_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000026_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000026_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000092_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000092_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_008221_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_008221_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000044_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000044_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000086_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000086_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000055_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000055_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000079_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000079_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000099_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000099_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_050228_leftImg8bit.png,gtFine/train/hanover/hanover_000000_050228_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_034720_leftImg8bit.png,gtFine/train/hanover/hanover_000000_034720_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000060_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000060_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_062542_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_062542_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_002255_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_002255_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_037161_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_037161_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000033_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000033_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000035_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000035_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_100300_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_100300_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000012_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000012_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000123_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000123_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000032_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000032_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000081_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000081_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052198_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052198_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_021393_leftImg8bit.png,gtFine/train/bochum/bochum_000000_021393_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017159_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017159_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000060_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000060_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000180_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000180_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_065055_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_065055_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000019_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000019_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000092_000019_leftImg8bit.png,gtFine/train/jena/jena_000092_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_002353_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_002353_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000054_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000054_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_055937_leftImg8bit.png,gtFine/train/hanover/hanover_000000_055937_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000098_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000098_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000115_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000115_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_035650_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_035650_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000135_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000135_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000174_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000174_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_048121_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_048121_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000004_000019_leftImg8bit.png,gtFine/train/jena/jena_000004_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000048_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000048_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000166_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000166_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000195_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000195_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000014_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000014_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000051_000019_leftImg8bit.png,gtFine/train/jena/jena_000051_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_102379_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_102379_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000054_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000054_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000078_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000078_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_019891_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_019891_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_043748_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_043748_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_020933_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_020933_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000069_000019_leftImg8bit.png,gtFine/train/jena/jena_000069_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_103367_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_103367_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000189_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000189_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_016247_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_016247_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_013266_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_013266_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000145_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000145_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000030_000019_leftImg8bit.png,gtFine/train/jena/jena_000030_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_032540_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_032540_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000061_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000061_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027998_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027998_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_005639_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_005639_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000094_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000094_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_023489_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_023489_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_000108_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_000108_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000068_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000068_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000017_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000017_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000036_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000036_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000017_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000017_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000185_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000185_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000013_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000013_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_042558_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_042558_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000060_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000060_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_094717_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_094717_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000046_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000046_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000166_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000166_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_021070_leftImg8bit.png,gtFine/train/bochum/bochum_000000_021070_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000186_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000186_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000028_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000028_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_099902_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_099902_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_031116_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_031116_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_028822_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_028822_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_096624_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_096624_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000077_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000077_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_043944_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_043944_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000159_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000159_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000067_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000067_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000177_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000177_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000085_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000085_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000149_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000149_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000099_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000099_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000049_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000049_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000010_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000010_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_105464_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_105464_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000015_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000015_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000008_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000008_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_030560_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_030560_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000041_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000041_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000122_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000122_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_045437_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_045437_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000077_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000077_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_026355_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_026355_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_064825_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_064825_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_001828_leftImg8bit.png,gtFine/train/bochum/bochum_000000_001828_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000068_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000068_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000076_000019_leftImg8bit.png,gtFine/train/jena/jena_000076_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000107_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000107_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000033_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000033_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_019697_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_019697_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_030120_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_030120_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000201_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000201_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_036232_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_036232_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000097_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000097_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000081_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000081_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_012505_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_012505_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000029_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000029_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000151_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000151_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000044_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000044_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_034040_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_034040_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_020899_leftImg8bit.png,gtFine/train/bochum/bochum_000000_020899_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000307_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000307_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000109_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000109_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000000_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000000_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000032_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000032_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000081_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000081_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_004248_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_004248_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_045657_leftImg8bit.png,gtFine/train/hanover/hanover_000000_045657_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000306_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000306_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000156_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000156_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000152_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000152_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000076_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000076_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000065_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000065_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000095_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000095_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_059339_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_059339_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000033_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000033_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000100_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000100_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000131_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000131_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_010755_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_010755_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_015685_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_015685_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000205_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000205_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000066_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000066_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000074_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000074_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_021814_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_021814_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000002_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000002_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000028_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000028_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000011_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000011_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000050_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000050_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_018153_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_018153_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000017_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000017_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000098_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000098_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051661_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051661_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000119_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000119_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000023_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000023_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_016342_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_016342_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000004_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000004_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000012_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000012_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000004_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000004_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000036_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000036_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000072_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000072_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_088783_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_088783_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000053_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000053_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000108_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000108_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_004646_leftImg8bit.png,gtFine/train/hanover/hanover_000000_004646_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_038281_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_038281_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000090_000019_leftImg8bit.png,gtFine/train/jena/jena_000090_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_015131_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_015131_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000111_000019_leftImg8bit.png,gtFine/train/jena/jena_000111_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000102_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000102_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_004260_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_004260_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000261_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000261_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_056229_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_056229_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000152_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000152_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_000876_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_000876_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000095_000019_leftImg8bit.png,gtFine/train/jena/jena_000095_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000013_000019_leftImg8bit.png,gtFine/train/jena/jena_000013_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029577_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029577_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_015321_leftImg8bit.png,gtFine/train/bochum/bochum_000000_015321_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029020_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029020_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000142_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000142_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000032_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000032_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000034_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000034_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000038_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000038_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000005_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000005_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_035689_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_035689_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_046572_leftImg8bit.png,gtFine/train/hanover/hanover_000000_046572_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_010049_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_010049_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_077642_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_077642_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_059433_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_059433_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_034141_leftImg8bit.png,gtFine/train/hanover/hanover_000000_034141_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000121_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000121_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000062_000019_leftImg8bit.png,gtFine/train/jena/jena_000062_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_023694_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_023694_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000048_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000048_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000061_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000061_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000171_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000171_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000204_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000204_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000204_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000204_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000007_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000007_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000007_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000007_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_004752_leftImg8bit.png,gtFine/train/hanover/hanover_000000_004752_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000130_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000130_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000045_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000045_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000125_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000125_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000154_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000154_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_007098_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_007098_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000076_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000076_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000116_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000116_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000265_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000265_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_034015_leftImg8bit.png,gtFine/train/hanover/hanover_000000_034015_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000008_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000008_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_033683_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_033683_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000079_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000079_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_022162_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_022162_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_055273_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_055273_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_031005_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_031005_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000134_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000134_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000239_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000239_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000035_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000035_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000031_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000031_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_013863_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_013863_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_045135_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_045135_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000124_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000124_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000025_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000025_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_028852_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_028852_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_062039_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_062039_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000246_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000246_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_078579_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_078579_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000183_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000183_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000291_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000291_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000144_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000144_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_054850_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_054850_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000139_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000139_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_011641_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_011641_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000025_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000025_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_016436_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_016436_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000153_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000153_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000090_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000090_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_046510_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_046510_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000071_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000071_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000054_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000054_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000011_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000011_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000039_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000039_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000124_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000124_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000029_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000029_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_035491_leftImg8bit.png,gtFine/train/hanover/hanover_000000_035491_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_060061_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_060061_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000197_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000197_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000015_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000015_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_016928_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_016928_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000093_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000093_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_024196_leftImg8bit.png,gtFine/train/bochum/bochum_000000_024196_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000269_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000269_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000053_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000053_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_014629_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_014629_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000161_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000161_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000081_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000081_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_031971_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_031971_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000295_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000295_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000068_000019_leftImg8bit.png,gtFine/train/jena/jena_000068_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_030546_leftImg8bit.png,gtFine/train/hanover/hanover_000000_030546_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_004229_leftImg8bit.png,gtFine/train/bochum/bochum_000000_004229_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000109_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000109_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_018155_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_018155_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_061790_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_061790_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_001173_leftImg8bit.png,gtFine/train/hanover/hanover_000000_001173_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000011_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000011_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000133_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000133_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000148_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000148_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000052_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000052_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_009619_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_009619_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_036606_leftImg8bit.png,gtFine/train/bochum/bochum_000000_036606_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000066_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000066_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000052_000019_leftImg8bit.png,gtFine/train/jena/jena_000052_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000022_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000022_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_038773_leftImg8bit.png,gtFine/train/hanover/hanover_000000_038773_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_048138_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_048138_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000158_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000158_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_036697_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_036697_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_035942_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_035942_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_050098_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_050098_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000117_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000117_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_000316_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_000316_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000315_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000315_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000074_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000074_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_026305_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_026305_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_093572_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_093572_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_031976_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_031976_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000077_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000077_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_041215_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_041215_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000042_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000042_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_012353_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_012353_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000010_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000010_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000067_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000067_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_007813_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_007813_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000092_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000092_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000032_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000032_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_059675_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_059675_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_029050_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_029050_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_005503_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_005503_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000065_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000065_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_006484_leftImg8bit.png,gtFine/train/bochum/bochum_000000_006484_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000001_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000001_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_027628_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_027628_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000007_000019_leftImg8bit.png,gtFine/train/jena/jena_000007_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000213_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000213_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000118_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000118_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000048_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000048_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000080_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000080_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_035571_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_035571_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000105_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000105_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000081_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000081_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000102_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000102_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000013_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000013_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_024362_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_024362_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_028439_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_028439_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000112_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000112_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000133_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000133_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000048_000019_leftImg8bit.png,gtFine/train/jena/jena_000048_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_000751_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_000751_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000063_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000063_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000109_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000109_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_017216_leftImg8bit.png,gtFine/train/bochum/bochum_000000_017216_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000020_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000020_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000038_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000038_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000215_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000215_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000145_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000145_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000067_000019_leftImg8bit.png,gtFine/train/jena/jena_000067_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000039_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000039_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000026_000019_leftImg8bit.png,gtFine/train/jena/jena_000026_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000046_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000046_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_038150_leftImg8bit.png,gtFine/train/bochum/bochum_000000_038150_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000147_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000147_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000029_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000029_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000054_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000054_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_030913_leftImg8bit.png,gtFine/train/bochum/bochum_000000_030913_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_056508_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_056508_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000032_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000032_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000027_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000027_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000100_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000100_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000002_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000002_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_031683_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_031683_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000186_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000186_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_037776_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_037776_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_013577_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_013577_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_000778_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_000778_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_008771_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_008771_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_057710_leftImg8bit.png,gtFine/train/hanover/hanover_000000_057710_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_027951_leftImg8bit.png,gtFine/train/bochum/bochum_000000_027951_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000014_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000014_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_103186_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_103186_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000005_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000005_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_044622_leftImg8bit.png,gtFine/train/hanover/hanover_000000_044622_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_082301_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_082301_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000165_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000165_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000158_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000158_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_034652_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_034652_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_039558_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_039558_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000179_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000179_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000034_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000034_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000025_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000025_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000175_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000175_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_051842_leftImg8bit.png,gtFine/train/hanover/hanover_000000_051842_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_023271_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_023271_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000128_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000128_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000102_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000102_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000139_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000139_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000023_000019_leftImg8bit.png,gtFine/train/jena/jena_000023_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000215_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000215_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000191_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000191_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_013814_leftImg8bit.png,gtFine/train/hanover/hanover_000000_013814_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000056_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000056_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000114_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000114_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000189_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000189_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000182_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000182_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_010329_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_010329_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000168_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000168_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000035_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000035_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000002_000019_leftImg8bit.png,gtFine/train/jena/jena_000002_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000061_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000061_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_069177_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_069177_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000065_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000065_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_024179_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_024179_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052430_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052430_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_016311_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_016311_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000083_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000083_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_000313_leftImg8bit.png,gtFine/train/bochum/bochum_000000_000313_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000065_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000065_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000108_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000108_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000016_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000016_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_032962_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_032962_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000033_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000033_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_034923_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_034923_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_024524_leftImg8bit.png,gtFine/train/bochum/bochum_000000_024524_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017593_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017593_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000104_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000104_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000038_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000038_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000003_000019_leftImg8bit.png,gtFine/train/jena/jena_000003_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000027_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000027_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_065214_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_065214_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_008603_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_008603_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_004230_leftImg8bit.png,gtFine/train/hanover/hanover_000000_004230_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_049558_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_049558_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000002_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000002_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_000168_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_000168_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000153_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000153_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_035398_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_035398_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000141_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000141_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_039470_leftImg8bit.png,gtFine/train/hanover/hanover_000000_039470_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000053_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000053_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000070_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000070_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_103075_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_103075_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000091_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000091_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000031_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000031_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000264_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000264_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_008017_leftImg8bit.png,gtFine/train/hanover/hanover_000000_008017_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_047870_leftImg8bit.png,gtFine/train/hanover/hanover_000000_047870_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000110_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000110_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000114_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000114_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000011_000019_leftImg8bit.png,gtFine/train/jena/jena_000011_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_023614_leftImg8bit.png,gtFine/train/hanover/hanover_000000_023614_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_008448_leftImg8bit.png,gtFine/train/bochum/bochum_000000_008448_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000032_000019_leftImg8bit.png,gtFine/train/jena/jena_000032_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000029_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000029_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000015_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000015_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_057816_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_057816_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_085982_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_085982_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000030_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000030_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_030839_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_030839_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000313_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000313_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_029178_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_029178_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000017_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000017_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027766_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027766_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000044_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000044_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_077756_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_077756_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000087_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000087_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000016_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000016_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000074_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000074_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000154_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000154_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_021553_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_021553_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000008_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000008_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000041_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000041_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_009128_leftImg8bit.png,gtFine/train/hanover/hanover_000000_009128_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000137_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000137_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000078_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000078_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_003904_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_003904_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_001294_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_001294_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_012376_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_012376_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_046619_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_046619_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000289_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000289_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_032266_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_032266_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000086_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000086_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000128_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000128_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_010733_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_010733_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052979_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052979_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_005666_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_005666_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_010403_leftImg8bit.png,gtFine/train/hanover/hanover_000000_010403_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_026606_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_026606_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000061_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000061_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000085_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000085_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000123_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000123_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_020334_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_020334_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000066_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000066_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000248_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000248_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000066_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000066_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000093_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000093_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000011_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000011_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_019698_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_019698_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029481_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029481_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_018720_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_018720_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000019_000019_leftImg8bit.png,gtFine/train/jena/jena_000019_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_048379_leftImg8bit.png,gtFine/train/hanover/hanover_000000_048379_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000107_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000107_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000104_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000104_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_013654_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_013654_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000148_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000148_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000077_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000077_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000039_000019_leftImg8bit.png,gtFine/train/jena/jena_000039_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000314_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000314_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000021_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000021_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000088_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000088_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_036139_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_036139_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_033531_leftImg8bit.png,gtFine/train/bochum/bochum_000000_033531_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000113_000019_leftImg8bit.png,gtFine/train/jena/jena_000113_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000122_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000122_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000084_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000084_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_043653_leftImg8bit.png,gtFine/train/hanover/hanover_000000_043653_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_028563_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_028563_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000016_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000016_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000156_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000156_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000012_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000012_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000006_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000006_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000198_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000198_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_028240_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_028240_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_042309_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_042309_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_002949_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_002949_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_017450_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_017450_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000031_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000031_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_018514_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_018514_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_055800_leftImg8bit.png,gtFine/train/hanover/hanover_000000_055800_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000101_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000101_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_080169_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_080169_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_024379_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_024379_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000114_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000114_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_013767_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_013767_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000169_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000169_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000112_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000112_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_097447_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_097447_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000190_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000190_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_037279_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_037279_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000021_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000021_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_029455_leftImg8bit.png,gtFine/train/hanover/hanover_000000_029455_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000028_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000028_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_025215_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_025215_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_013352_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_013352_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000085_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000085_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000098_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000098_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000035_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000035_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_105123_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_105123_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000067_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000067_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_065983_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_065983_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_025802_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_025802_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000130_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000130_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000013_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000013_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_015868_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_015868_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_002972_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_002972_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000001_000537_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000001_000537_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_014416_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_014416_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000137_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000137_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_093787_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_093787_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000186_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000186_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000188_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000188_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_014258_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_014258_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000101_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000101_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_051855_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_051855_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000051_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000051_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_032681_leftImg8bit.png,gtFine/train/hanover/hanover_000000_032681_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_001566_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_001566_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000126_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000126_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_024441_leftImg8bit.png,gtFine/train/hanover/hanover_000000_024441_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_029144_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_029144_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000038_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000038_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000034_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000034_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000057_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000057_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_088939_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_088939_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000020_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000020_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000096_000019_leftImg8bit.png,gtFine/train/jena/jena_000096_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_026743_leftImg8bit.png,gtFine/train/hanover/hanover_000000_026743_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_027304_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_027304_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_057678_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_057678_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000144_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000144_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_046566_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_046566_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_045481_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_045481_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000077_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000077_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_023975_leftImg8bit.png,gtFine/train/hanover/hanover_000000_023975_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000020_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000020_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000091_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000091_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_052297_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_052297_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000053_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000053_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000060_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000060_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000118_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000118_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000058_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000058_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_042382_leftImg8bit.png,gtFine/train/hanover/hanover_000000_042382_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000111_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000111_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_026183_leftImg8bit.png,gtFine/train/hanover/hanover_000000_026183_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_005537_leftImg8bit.png,gtFine/train/bochum/bochum_000000_005537_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000054_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000054_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000066_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000066_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_032719_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_032719_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000000_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000000_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_026741_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_026741_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000078_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000078_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000025_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000025_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_011775_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_011775_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_001722_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_001722_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_071150_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_071150_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_065604_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_065604_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_034302_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_034302_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000047_000019_leftImg8bit.png,gtFine/train/jena/jena_000047_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000176_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000176_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000038_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000038_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000106_000019_leftImg8bit.png,gtFine/train/jena/jena_000106_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_012934_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_012934_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000025_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000025_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000013_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000013_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000170_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000170_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_057532_leftImg8bit.png,gtFine/train/hanover/hanover_000000_057532_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_033027_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_033027_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_077144_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_077144_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000185_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000185_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000003_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000003_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000090_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000090_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_020904_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_020904_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_002478_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_002478_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_032210_leftImg8bit.png,gtFine/train/hanover/hanover_000000_032210_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_062691_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_062691_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_037090_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_037090_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000132_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000132_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_053886_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_053886_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000080_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000080_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000050_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000050_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000060_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000060_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_023276_leftImg8bit.png,gtFine/train/hanover/hanover_000000_023276_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_057930_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_057930_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_024855_leftImg8bit.png,gtFine/train/bochum/bochum_000000_024855_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000051_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000051_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_042581_leftImg8bit.png,gtFine/train/hanover/hanover_000000_042581_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000071_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000071_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000120_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000120_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_023648_leftImg8bit.png,gtFine/train/bochum/bochum_000000_023648_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000096_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000096_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000142_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000142_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000134_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000134_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000000_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000000_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000149_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000149_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_020303_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_020303_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000085_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000085_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_025986_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_025986_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_017675_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_017675_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_010162_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_010162_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000047_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000047_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000128_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000128_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_032186_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_032186_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000068_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000068_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000056_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000056_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000104_000019_leftImg8bit.png,gtFine/train/jena/jena_000104_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_028556_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_028556_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_098862_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_098862_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000113_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000113_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000136_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000136_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_036937_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_036937_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000063_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000063_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000119_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000119_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000059_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000059_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000064_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000064_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_073758_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_073758_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000171_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000171_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000041_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000041_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000087_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000087_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000100_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000100_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_036299_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_036299_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_007727_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_007727_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000079_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000079_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000034_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000034_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000095_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000095_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000031_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000031_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_029240_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_029240_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_015602_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_015602_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_066424_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_066424_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_011990_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_011990_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_040051_leftImg8bit.png,gtFine/train/hanover/hanover_000000_040051_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_004032_leftImg8bit.png,gtFine/train/bochum/bochum_000000_004032_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000048_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000048_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_018878_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_018878_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000038_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000038_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000082_000019_leftImg8bit.png,gtFine/train/jena/jena_000082_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_053563_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_053563_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000047_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000047_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000034_000019_leftImg8bit.png,gtFine/train/jena/jena_000034_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_001519_leftImg8bit.png,gtFine/train/bochum/bochum_000000_001519_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_054275_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_054275_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000111_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000111_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_030111_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_030111_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000294_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000294_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_060215_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_060215_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_006355_leftImg8bit.png,gtFine/train/hanover/hanover_000000_006355_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000037_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000037_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_038729_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_038729_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000016_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000016_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000014_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000014_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000094_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000094_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000005_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000005_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000098_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000098_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_040564_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_040564_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000267_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000267_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_007325_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_007325_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000045_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000045_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000080_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000080_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_006264_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_006264_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000121_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000121_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000011_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000011_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_067799_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_067799_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000132_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000132_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000012_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000012_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000059_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000059_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000108_000019_leftImg8bit.png,gtFine/train/jena/jena_000108_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_024276_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_024276_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000065_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000065_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000210_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000210_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000010_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000010_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000200_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000200_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_012956_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_012956_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_046732_leftImg8bit.png,gtFine/train/hanover/hanover_000000_046732_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000296_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000296_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000073_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000073_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_002357_leftImg8bit.png,gtFine/train/hanover/hanover_000000_002357_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_020673_leftImg8bit.png,gtFine/train/bochum/bochum_000000_020673_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_018575_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_018575_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000102_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000102_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_035562_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_035562_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000046_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000046_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_055894_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_055894_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000053_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000053_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000050_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000050_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_047220_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_047220_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000071_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000071_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000022_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000022_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000107_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000107_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000156_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000156_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000112_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000112_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_051059_leftImg8bit.png,gtFine/train/hanover/hanover_000000_051059_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_027596_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_027596_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000047_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000047_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000064_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000064_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000147_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000147_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000149_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000149_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000076_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000076_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000205_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000205_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000194_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000194_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000103_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000103_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000104_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000104_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000054_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000054_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000082_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000082_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000129_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000129_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_052512_leftImg8bit.png,gtFine/train/hanover/hanover_000000_052512_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000168_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000168_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000276_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000276_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000133_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000133_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_047629_leftImg8bit.png,gtFine/train/hanover/hanover_000000_047629_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000111_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000111_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_034347_leftImg8bit.png,gtFine/train/hanover/hanover_000000_034347_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_033425_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_033425_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_002553_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_002553_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000007_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000007_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000057_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000057_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000297_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000297_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_033478_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_033478_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000014_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000014_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000061_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000061_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_073314_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_073314_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000152_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000152_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_004112_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_004112_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_030953_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_030953_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_015974_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_015974_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000132_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000132_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000028_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000028_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_046200_leftImg8bit.png,gtFine/train/hanover/hanover_000000_046200_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000039_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000039_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000109_000019_leftImg8bit.png,gtFine/train/jena/jena_000109_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000056_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000056_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000000_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000000_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_083586_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_083586_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000090_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000090_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000025_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000025_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_003676_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_003676_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_043550_leftImg8bit.png,gtFine/train/hanover/hanover_000000_043550_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_036427_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_036427_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_003245_leftImg8bit.png,gtFine/train/bochum/bochum_000000_003245_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_026106_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_026106_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_020655_leftImg8bit.png,gtFine/train/hanover/hanover_000000_020655_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000266_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000266_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000285_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000285_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_011971_leftImg8bit.png,gtFine/train/hanover/hanover_000000_011971_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000089_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000089_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000008_000019_leftImg8bit.png,gtFine/train/jena/jena_000008_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000049_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000049_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000072_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000072_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_015928_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_015928_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000151_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000151_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000161_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000161_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_002083_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_002083_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_014940_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_014940_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000097_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000097_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000304_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000304_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000050_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000050_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_031152_leftImg8bit.png,gtFine/train/bochum/bochum_000000_031152_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000083_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000083_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000099_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000099_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000057_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000057_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000163_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000163_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000011_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000011_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000085_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000085_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000001_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000001_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000039_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000039_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000044_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000044_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_016863_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_016863_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000117_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000117_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000077_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000077_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_053976_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_053976_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000183_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000183_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000187_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000187_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000155_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000155_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000040_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000040_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000048_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000048_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000006_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000006_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000009_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000009_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_021606_leftImg8bit.png,gtFine/train/bochum/bochum_000000_021606_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_035083_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_035083_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000119_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000119_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000075_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000075_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000009_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000009_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000108_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000108_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000206_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000206_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000175_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000175_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_002562_leftImg8bit.png,gtFine/train/bochum/bochum_000000_002562_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_010553_leftImg8bit.png,gtFine/train/hanover/hanover_000000_010553_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000143_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000143_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000124_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000124_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_022210_leftImg8bit.png,gtFine/train/bochum/bochum_000000_022210_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000043_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000043_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_015645_leftImg8bit.png,gtFine/train/bochum/bochum_000000_015645_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_033062_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_033062_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000110_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000110_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000103_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000103_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_013223_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_013223_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000308_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000308_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_033925_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_033925_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000031_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000031_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000026_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000026_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_032351_leftImg8bit.png,gtFine/train/hanover/hanover_000000_032351_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_041232_leftImg8bit.png,gtFine/train/hanover/hanover_000000_041232_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000045_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000045_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000071_000019_leftImg8bit.png,gtFine/train/jena/jena_000071_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000080_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000080_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000141_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000141_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000181_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000181_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_062710_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_062710_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_016038_leftImg8bit.png,gtFine/train/hanover/hanover_000000_016038_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000118_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000118_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000009_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000009_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000069_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000069_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_011655_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_011655_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_030324_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_030324_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_025268_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_025268_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_008576_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_008576_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_020956_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_020956_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000013_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000013_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000021_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000021_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_000629_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_000629_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_000113_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_000113_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000059_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000059_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000095_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000095_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000041_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000041_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_004447_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_004447_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000095_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000095_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000140_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000140_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000112_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000112_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_016758_leftImg8bit.png,gtFine/train/bochum/bochum_000000_016758_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000086_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000086_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_022748_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_022748_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000078_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000078_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000101_000019_leftImg8bit.png,gtFine/train/jena/jena_000101_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000027_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000027_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000060_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000060_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000099_000019_leftImg8bit.png,gtFine/train/jena/jena_000099_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_004748_leftImg8bit.png,gtFine/train/bochum/bochum_000000_004748_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_021961_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_021961_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000067_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000067_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000089_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000089_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000089_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000089_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000030_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000030_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000085_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000085_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000200_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000200_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000081_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000081_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000023_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000023_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000041_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000041_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000058_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000058_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000207_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000207_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000088_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000088_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_033454_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_033454_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000022_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000022_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_051877_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_051877_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000127_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000127_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000075_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000075_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000040_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000040_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000021_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000021_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_082187_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_082187_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_030276_leftImg8bit.png,gtFine/train/hanover/hanover_000000_030276_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_087822_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_087822_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_026356_leftImg8bit.png,gtFine/train/hanover/hanover_000000_026356_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000190_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000190_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000038_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000038_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000055_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000055_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_053027_leftImg8bit.png,gtFine/train/hanover/hanover_000000_053027_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000129_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000129_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_006922_leftImg8bit.png,gtFine/train/hanover/hanover_000000_006922_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000209_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000209_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000090_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000090_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000027_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000027_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_010700_leftImg8bit.png,gtFine/train/bochum/bochum_000000_010700_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000075_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000075_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000045_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000045_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000143_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000143_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_008305_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_008305_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_005732_leftImg8bit.png,gtFine/train/hanover/hanover_000000_005732_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000064_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000064_000019_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000007_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000007_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000072_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000072_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_029769_leftImg8bit.png,gtFine/train/hanover/hanover_000000_029769_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000133_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000133_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_092476_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_092476_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000174_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000174_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000133_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000133_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000174_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000174_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_039546_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_039546_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000046_000019_leftImg8bit.png,gtFine/train/jena/jena_000046_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000037_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000037_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000121_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000121_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_051271_leftImg8bit.png,gtFine/train/hanover/hanover_000000_051271_gtFine_labelIds.png +leftImg8bit/train/zurich/zurich_000014_000019_leftImg8bit.png,gtFine/train/zurich/zurich_000014_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000079_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000079_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000073_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000073_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_105296_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_105296_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_040021_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_040021_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000219_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000219_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000049_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000049_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000051_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000051_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_031477_leftImg8bit.png,gtFine/train/bochum/bochum_000000_031477_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000196_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000196_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_019617_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_019617_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_021651_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_021651_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000028_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000028_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000134_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000134_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000071_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000071_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000010_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000010_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000010_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000010_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000008_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000008_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_023174_leftImg8bit.png,gtFine/train/bochum/bochum_000000_023174_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000015_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000015_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_009618_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_009618_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000202_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000202_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000106_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000106_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_023040_leftImg8bit.png,gtFine/train/bochum/bochum_000000_023040_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_027007_leftImg8bit.png,gtFine/train/hanover/hanover_000000_027007_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000162_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000162_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000154_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000154_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_034930_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_034930_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000074_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000074_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000043_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000043_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_059720_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_059720_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000272_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000272_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000057_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000057_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000043_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000043_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000068_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000068_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000012_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000012_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000123_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000123_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000016_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000016_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000069_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000069_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000149_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000149_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_030122_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_030122_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000086_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000086_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_025434_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_025434_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_104428_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_104428_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_085073_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_085073_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_024251_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_024251_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_009951_leftImg8bit.png,gtFine/train/bochum/bochum_000000_009951_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000138_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000138_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000137_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000137_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000097_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000097_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000062_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000062_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000214_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000214_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_000600_leftImg8bit.png,gtFine/train/bochum/bochum_000000_000600_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000138_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000138_000019_gtFine_labelIds.png +leftImg8bit/train/krefeld/krefeld_000000_013139_leftImg8bit.png,gtFine/train/krefeld/krefeld_000000_013139_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000084_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000084_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000169_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000169_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000081_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000081_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_004580_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_004580_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000037_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000037_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_042770_leftImg8bit.png,gtFine/train/hanover/hanover_000000_042770_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000025_000019_leftImg8bit.png,gtFine/train/jena/jena_000025_000019_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000030_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000030_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000124_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000124_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000068_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000068_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000026_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000026_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_079657_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_079657_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000090_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000090_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_006192_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_006192_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000031_000019_leftImg8bit.png,gtFine/train/jena/jena_000031_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_041667_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_041667_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000065_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000065_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000020_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000020_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000185_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000185_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_056857_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_056857_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000125_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000125_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000023_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000023_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000064_000019_leftImg8bit.png,gtFine/train/jena/jena_000064_000019_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000056_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000056_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_001901_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_001901_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000041_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000041_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000100_000019_leftImg8bit.png,gtFine/train/jena/jena_000100_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000040_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000040_000019_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000065_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000065_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000136_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000136_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000066_000019_leftImg8bit.png,gtFine/train/jena/jena_000066_000019_gtFine_labelIds.png +leftImg8bit/train/jena/jena_000053_000019_leftImg8bit.png,gtFine/train/jena/jena_000053_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000271_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000271_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_076966_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_076966_gtFine_labelIds.png +leftImg8bit/train/weimar/weimar_000069_000019_leftImg8bit.png,gtFine/train/weimar/weimar_000069_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000067_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000067_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000087_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000087_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000106_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000106_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000213_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000213_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_044251_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_044251_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000153_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000153_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000067_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000067_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000066_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000066_000019_gtFine_labelIds.png +leftImg8bit/train/cologne/cologne_000039_000019_leftImg8bit.png,gtFine/train/cologne/cologne_000039_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000236_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000236_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000274_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000274_000019_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_007851_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_007851_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000146_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000146_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000159_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000159_000019_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_029729_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_029729_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000032_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000032_000019_gtFine_labelIds.png +leftImg8bit/train/erfurt/erfurt_000083_000019_leftImg8bit.png,gtFine/train/erfurt/erfurt_000083_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_031687_leftImg8bit.png,gtFine/train/bochum/bochum_000000_031687_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000126_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000126_000019_gtFine_labelIds.png +leftImg8bit/train/bremen/bremen_000167_000019_leftImg8bit.png,gtFine/train/bremen/bremen_000167_000019_gtFine_labelIds.png +leftImg8bit/train/bochum/bochum_000000_006026_leftImg8bit.png,gtFine/train/bochum/bochum_000000_006026_gtFine_labelIds.png +leftImg8bit/train/aachen/aachen_000116_000019_leftImg8bit.png,gtFine/train/aachen/aachen_000116_000019_gtFine_labelIds.png +leftImg8bit/train/darmstadt/darmstadt_000061_000019_leftImg8bit.png,gtFine/train/darmstadt/darmstadt_000061_000019_gtFine_labelIds.png +leftImg8bit/train/ulm/ulm_000020_000019_leftImg8bit.png,gtFine/train/ulm/ulm_000020_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_040221_leftImg8bit.png,gtFine/train/hanover/hanover_000000_040221_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_015561_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_015561_gtFine_labelIds.png +leftImg8bit/train/monchengladbach/monchengladbach_000000_024964_leftImg8bit.png,gtFine/train/monchengladbach/monchengladbach_000000_024964_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000179_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000179_000019_gtFine_labelIds.png +leftImg8bit/train/hamburg/hamburg_000000_094185_leftImg8bit.png,gtFine/train/hamburg/hamburg_000000_094185_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000017_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000017_000019_gtFine_labelIds.png +leftImg8bit/train/hanover/hanover_000000_014919_leftImg8bit.png,gtFine/train/hanover/hanover_000000_014919_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000000_026611_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000000_026611_gtFine_labelIds.png +leftImg8bit/train/strasbourg/strasbourg_000001_061384_leftImg8bit.png,gtFine/train/strasbourg/strasbourg_000001_061384_gtFine_labelIds.png +leftImg8bit/train/tubingen/tubingen_000004_000019_leftImg8bit.png,gtFine/train/tubingen/tubingen_000004_000019_gtFine_labelIds.png +leftImg8bit/train/stuttgart/stuttgart_000165_000019_leftImg8bit.png,gtFine/train/stuttgart/stuttgart_000165_000019_gtFine_labelIds.png +leftImg8bit/train/dusseldorf/dusseldorf_000107_000019_leftImg8bit.png,gtFine/train/dusseldorf/dusseldorf_000107_000019_gtFine_labelIds.png \ No newline at end of file diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/datasets/cityscapes/val.txt b/cv/semantic_segmentation/bisenetv2/pytorch/datasets/cityscapes/val.txt new file mode 100755 index 0000000000000000000000000000000000000000..7bf5b233c33588c391fa8a6a2fe5242bda242c7f --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/datasets/cityscapes/val.txt @@ -0,0 +1,500 @@ +leftImg8bit/val/munster/munster_000002_000019_leftImg8bit.png,gtFine/val/munster/munster_000002_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_079206_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_079206_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_077092_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_077092_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_014221_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_014221_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000047_000019_leftImg8bit.png,gtFine/val/munster/munster_000047_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_016273_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_016273_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000063_000019_leftImg8bit.png,gtFine/val/munster/munster_000063_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_020215_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_020215_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000137_000019_leftImg8bit.png,gtFine/val/munster/munster_000137_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_016005_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_016005_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_058914_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_058914_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_077434_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_077434_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_007973_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_007973_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000123_000019_leftImg8bit.png,gtFine/val/munster/munster_000123_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_031416_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_031416_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_016462_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_016462_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_013016_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_013016_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000023_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000023_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_062653_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_062653_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000012_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000012_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_067295_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_067295_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000028_000019_leftImg8bit.png,gtFine/val/munster/munster_000028_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000041_000019_leftImg8bit.png,gtFine/val/munster/munster_000041_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000015_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000015_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_019607_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_019607_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_067092_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_067092_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000028_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000028_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_020287_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_020287_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000038_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000038_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_058176_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_058176_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000091_000019_leftImg8bit.png,gtFine/val/munster/munster_000091_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000033_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000033_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_083199_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_083199_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_032018_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_032018_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000044_000019_leftImg8bit.png,gtFine/val/munster/munster_000044_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000079_000019_leftImg8bit.png,gtFine/val/munster/munster_000079_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000173_000019_leftImg8bit.png,gtFine/val/munster/munster_000173_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_018797_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_018797_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_005703_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_005703_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_009058_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_009058_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_034816_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_034816_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000100_000019_leftImg8bit.png,gtFine/val/munster/munster_000100_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000022_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000022_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000140_000019_leftImg8bit.png,gtFine/val/munster/munster_000140_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_021825_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_021825_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000171_000019_leftImg8bit.png,gtFine/val/munster/munster_000171_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000030_000019_leftImg8bit.png,gtFine/val/munster/munster_000030_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000008_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000008_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000075_000019_leftImg8bit.png,gtFine/val/munster/munster_000075_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_009688_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_009688_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000107_000019_leftImg8bit.png,gtFine/val/munster/munster_000107_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_011835_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_011835_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000113_000019_leftImg8bit.png,gtFine/val/munster/munster_000113_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000012_000019_leftImg8bit.png,gtFine/val/munster/munster_000012_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_012870_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_012870_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000070_000019_leftImg8bit.png,gtFine/val/munster/munster_000070_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000110_000019_leftImg8bit.png,gtFine/val/munster/munster_000110_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_058057_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_058057_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_012121_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_012121_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000021_000019_leftImg8bit.png,gtFine/val/munster/munster_000021_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_005410_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_005410_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_050686_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_050686_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_069633_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_069633_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000067_000019_leftImg8bit.png,gtFine/val/munster/munster_000067_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000031_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000031_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_007857_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_007857_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_003920_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_003920_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_005184_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_005184_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_058504_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_058504_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_030067_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_030067_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_011007_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_011007_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_020046_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_020046_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000145_000019_leftImg8bit.png,gtFine/val/munster/munster_000145_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000082_000019_leftImg8bit.png,gtFine/val/munster/munster_000082_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_013942_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_013942_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000089_000019_leftImg8bit.png,gtFine/val/munster/munster_000089_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_034047_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_034047_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000046_000019_leftImg8bit.png,gtFine/val/munster/munster_000046_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_022254_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_022254_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000069_000019_leftImg8bit.png,gtFine/val/munster/munster_000069_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000048_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000048_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000013_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000013_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000056_000019_leftImg8bit.png,gtFine/val/munster/munster_000056_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_003056_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_003056_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_002963_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_002963_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_011162_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_011162_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000128_000019_leftImg8bit.png,gtFine/val/munster/munster_000128_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_019854_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_019854_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_019698_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_019698_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_031266_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_031266_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_057954_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_057954_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000118_000019_leftImg8bit.png,gtFine/val/munster/munster_000118_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000044_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000044_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000051_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000051_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_059789_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_059789_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_062396_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_062396_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000055_000019_leftImg8bit.png,gtFine/val/munster/munster_000055_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_044525_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_044525_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000036_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000036_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_064305_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_064305_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_061763_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_061763_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000042_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000042_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000054_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000054_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_066832_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_066832_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055062_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055062_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000010_000019_leftImg8bit.png,gtFine/val/munster/munster_000010_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000097_000019_leftImg8bit.png,gtFine/val/munster/munster_000097_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000115_000019_leftImg8bit.png,gtFine/val/munster/munster_000115_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_029236_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_029236_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000029_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000029_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000139_000019_leftImg8bit.png,gtFine/val/munster/munster_000139_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_072295_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_072295_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_013067_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_013067_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_082087_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_082087_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000166_000019_leftImg8bit.png,gtFine/val/munster/munster_000166_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_014565_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_014565_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000127_000019_leftImg8bit.png,gtFine/val/munster/munster_000127_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_083852_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_083852_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_049698_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_049698_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000093_000019_leftImg8bit.png,gtFine/val/munster/munster_000093_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_054415_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_054415_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_005543_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_005543_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000056_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000056_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000037_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000037_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_075984_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_075984_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000130_000019_leftImg8bit.png,gtFine/val/munster/munster_000130_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000024_000019_leftImg8bit.png,gtFine/val/munster/munster_000024_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000057_000019_leftImg8bit.png,gtFine/val/munster/munster_000057_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_073243_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_073243_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_015389_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_015389_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_083029_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_083029_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_075296_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_075296_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_078803_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_078803_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_049078_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_049078_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_062016_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_062016_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_010444_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_010444_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_010600_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_010600_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_051807_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_051807_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000077_000019_leftImg8bit.png,gtFine/val/munster/munster_000077_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_054219_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_054219_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_039895_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_039895_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_051516_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_051516_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_082466_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_082466_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000027_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000027_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_046126_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_046126_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_044227_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_044227_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_068682_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_068682_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_017228_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_017228_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000001_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000001_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_070099_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_070099_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_041517_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_041517_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000167_000019_leftImg8bit.png,gtFine/val/munster/munster_000167_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000088_000019_leftImg8bit.png,gtFine/val/munster/munster_000088_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000126_000019_leftImg8bit.png,gtFine/val/munster/munster_000126_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000085_000019_leftImg8bit.png,gtFine/val/munster/munster_000085_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_038645_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_038645_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000109_000019_leftImg8bit.png,gtFine/val/munster/munster_000109_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_068063_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_068063_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_000538_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_000538_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000104_000019_leftImg8bit.png,gtFine/val/munster/munster_000104_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000146_000019_leftImg8bit.png,gtFine/val/munster/munster_000146_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055538_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055538_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_008688_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_008688_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_009854_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_009854_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000004_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000004_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000026_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000026_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_021406_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_021406_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000023_000019_leftImg8bit.png,gtFine/val/munster/munster_000023_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_008206_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_008206_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_002646_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_002646_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_008451_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_008451_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_068208_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_068208_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_018113_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_018113_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_038844_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_038844_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_050149_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_050149_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000156_000019_leftImg8bit.png,gtFine/val/munster/munster_000156_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000155_000019_leftImg8bit.png,gtFine/val/munster/munster_000155_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_011461_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_011461_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_024927_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_024927_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_027325_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_027325_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000055_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000055_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000016_000019_leftImg8bit.png,gtFine/val/munster/munster_000016_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000117_000019_leftImg8bit.png,gtFine/val/munster/munster_000117_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000150_000019_leftImg8bit.png,gtFine/val/munster/munster_000150_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000084_000019_leftImg8bit.png,gtFine/val/munster/munster_000084_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000005_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000005_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000046_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000046_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_064651_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_064651_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000124_000019_leftImg8bit.png,gtFine/val/munster/munster_000124_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_065160_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_065160_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000121_000019_leftImg8bit.png,gtFine/val/munster/munster_000121_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_047552_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_047552_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000045_000019_leftImg8bit.png,gtFine/val/munster/munster_000045_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000038_000019_leftImg8bit.png,gtFine/val/munster/munster_000038_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_046779_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_046779_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000169_000019_leftImg8bit.png,gtFine/val/munster/munster_000169_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000108_000019_leftImg8bit.png,gtFine/val/munster/munster_000108_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000103_000019_leftImg8bit.png,gtFine/val/munster/munster_000103_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_013496_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_013496_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000043_000019_leftImg8bit.png,gtFine/val/munster/munster_000043_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000051_000019_leftImg8bit.png,gtFine/val/munster/munster_000051_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_023235_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_023235_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000000_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000000_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_033655_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_033655_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_080091_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_080091_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_054884_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_054884_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000039_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000039_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000144_000019_leftImg8bit.png,gtFine/val/munster/munster_000144_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_046272_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_046272_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000036_000019_leftImg8bit.png,gtFine/val/munster/munster_000036_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_037705_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_037705_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000017_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000017_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000120_000019_leftImg8bit.png,gtFine/val/munster/munster_000120_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000065_000019_leftImg8bit.png,gtFine/val/munster/munster_000065_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000015_000019_leftImg8bit.png,gtFine/val/munster/munster_000015_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000043_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000043_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_017842_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_017842_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000095_000019_leftImg8bit.png,gtFine/val/munster/munster_000095_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_051737_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_051737_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_049209_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_049209_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_004736_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_004736_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000034_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000034_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_061682_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_061682_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_004327_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_004327_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_007622_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_007622_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000014_000019_leftImg8bit.png,gtFine/val/munster/munster_000014_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_020321_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_020321_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000092_000019_leftImg8bit.png,gtFine/val/munster/munster_000092_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000057_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000057_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000035_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000035_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000052_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000052_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000078_000019_leftImg8bit.png,gtFine/val/munster/munster_000078_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_059642_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_059642_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_048654_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_048654_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_001236_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_001236_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000135_000019_leftImg8bit.png,gtFine/val/munster/munster_000135_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_049298_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_049298_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_064130_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_064130_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_032556_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_032556_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_067474_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_067474_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_047178_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_047178_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000008_000019_leftImg8bit.png,gtFine/val/munster/munster_000008_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000011_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000011_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000074_000019_leftImg8bit.png,gtFine/val/munster/munster_000074_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_003588_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_003588_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_035144_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_035144_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000071_000019_leftImg8bit.png,gtFine/val/munster/munster_000071_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000050_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000050_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_028590_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_028590_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_012699_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_012699_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000106_000019_leftImg8bit.png,gtFine/val/munster/munster_000106_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_015768_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_015768_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_013382_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_013382_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_004859_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_004859_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000099_000019_leftImg8bit.png,gtFine/val/munster/munster_000099_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_013710_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_013710_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_066092_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_066092_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000003_000019_leftImg8bit.png,gtFine/val/munster/munster_000003_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_067178_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_067178_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000129_000019_leftImg8bit.png,gtFine/val/munster/munster_000129_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_002759_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_002759_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_046504_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_046504_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_017459_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_017459_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000042_000019_leftImg8bit.png,gtFine/val/munster/munster_000042_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_068772_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_068772_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_017476_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_017476_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_038245_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_038245_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_023369_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_023369_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000030_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000030_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000157_000019_leftImg8bit.png,gtFine/val/munster/munster_000157_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_030669_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_030669_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_052594_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_052594_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_035864_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_035864_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_010156_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_010156_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000013_000019_leftImg8bit.png,gtFine/val/munster/munster_000013_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000019_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000019_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000066_000019_leftImg8bit.png,gtFine/val/munster/munster_000066_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000010_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000010_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_012038_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_012038_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_014406_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_014406_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000060_000019_leftImg8bit.png,gtFine/val/munster/munster_000060_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_066438_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_066438_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000033_000019_leftImg8bit.png,gtFine/val/munster/munster_000033_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000059_000019_leftImg8bit.png,gtFine/val/munster/munster_000059_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_041354_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_041354_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000162_000019_leftImg8bit.png,gtFine/val/munster/munster_000162_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000009_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000009_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000054_000019_leftImg8bit.png,gtFine/val/munster/munster_000054_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000111_000019_leftImg8bit.png,gtFine/val/munster/munster_000111_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000068_000019_leftImg8bit.png,gtFine/val/munster/munster_000068_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000125_000019_leftImg8bit.png,gtFine/val/munster/munster_000125_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000034_000019_leftImg8bit.png,gtFine/val/munster/munster_000034_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000083_000019_leftImg8bit.png,gtFine/val/munster/munster_000083_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000049_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000049_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000040_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000040_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_021879_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_021879_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000148_000019_leftImg8bit.png,gtFine/val/munster/munster_000148_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_010763_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_010763_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_060422_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_060422_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_080830_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_080830_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_040732_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_040732_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_054640_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_054640_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000019_000019_leftImg8bit.png,gtFine/val/munster/munster_000019_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000094_000019_leftImg8bit.png,gtFine/val/munster/munster_000094_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000041_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000041_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_063045_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_063045_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_007365_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_007365_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000021_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000021_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_044413_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_044413_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000072_000019_leftImg8bit.png,gtFine/val/munster/munster_000072_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000047_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000047_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_059119_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_059119_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_049770_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_049770_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_012868_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_012868_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_076502_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_076502_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_030310_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_030310_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000018_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000018_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_005898_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_005898_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000086_000019_leftImg8bit.png,gtFine/val/munster/munster_000086_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000007_000019_leftImg8bit.png,gtFine/val/munster/munster_000007_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055603_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055603_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_010830_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_010830_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000153_000019_leftImg8bit.png,gtFine/val/munster/munster_000153_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055709_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055709_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000048_000019_leftImg8bit.png,gtFine/val/munster/munster_000048_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000142_000019_leftImg8bit.png,gtFine/val/munster/munster_000142_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000073_000019_leftImg8bit.png,gtFine/val/munster/munster_000073_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000114_000019_leftImg8bit.png,gtFine/val/munster/munster_000114_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_077233_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_077233_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000132_000019_leftImg8bit.png,gtFine/val/munster/munster_000132_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_009969_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_009969_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_080391_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_080391_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000165_000019_leftImg8bit.png,gtFine/val/munster/munster_000165_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_014480_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_014480_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_015328_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_015328_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_007285_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_007285_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_009291_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_009291_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000016_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000016_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000112_000019_leftImg8bit.png,gtFine/val/munster/munster_000112_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_001751_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_001751_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000062_000019_leftImg8bit.png,gtFine/val/munster/munster_000062_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_065617_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_065617_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000122_000019_leftImg8bit.png,gtFine/val/munster/munster_000122_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_008200_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_008200_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000151_000019_leftImg8bit.png,gtFine/val/munster/munster_000151_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000025_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000025_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_044658_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_044658_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_022797_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_022797_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000053_000019_leftImg8bit.png,gtFine/val/munster/munster_000053_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_062250_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_062250_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000134_000019_leftImg8bit.png,gtFine/val/munster/munster_000134_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000053_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000053_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_053102_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_053102_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000076_000019_leftImg8bit.png,gtFine/val/munster/munster_000076_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055306_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055306_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000007_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000007_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_073464_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_073464_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000025_000019_leftImg8bit.png,gtFine/val/munster/munster_000025_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000090_000019_leftImg8bit.png,gtFine/val/munster/munster_000090_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_007407_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_007407_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_005898_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_005898_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000003_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000003_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_072155_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_072155_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000147_000019_leftImg8bit.png,gtFine/val/munster/munster_000147_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000006_000019_leftImg8bit.png,gtFine/val/munster/munster_000006_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_012738_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_012738_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_025921_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_025921_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000163_000019_leftImg8bit.png,gtFine/val/munster/munster_000163_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_062509_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_062509_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_002196_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_002196_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000052_000019_leftImg8bit.png,gtFine/val/munster/munster_000052_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000160_000019_leftImg8bit.png,gtFine/val/munster/munster_000160_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_003025_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_003025_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000119_000019_leftImg8bit.png,gtFine/val/munster/munster_000119_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_042098_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_042098_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000009_000019_leftImg8bit.png,gtFine/val/munster/munster_000009_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000050_000019_leftImg8bit.png,gtFine/val/munster/munster_000050_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_060906_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_060906_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000161_000019_leftImg8bit.png,gtFine/val/munster/munster_000161_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000037_000019_leftImg8bit.png,gtFine/val/munster/munster_000037_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000020_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000020_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_012519_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_012519_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_012009_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_012009_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000040_000019_leftImg8bit.png,gtFine/val/munster/munster_000040_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_009561_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_009561_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000029_000019_leftImg8bit.png,gtFine/val/munster/munster_000029_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000143_000019_leftImg8bit.png,gtFine/val/munster/munster_000143_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_065850_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_065850_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_020880_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_020880_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000170_000019_leftImg8bit.png,gtFine/val/munster/munster_000170_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_067735_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_067735_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_060545_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_060545_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000101_000019_leftImg8bit.png,gtFine/val/munster/munster_000101_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_042733_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_042733_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_009504_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_009504_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_020693_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_020693_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000031_000019_leftImg8bit.png,gtFine/val/munster/munster_000031_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_001016_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_001016_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_041664_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_041664_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_011810_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_011810_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_048355_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_048355_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000001_000019_leftImg8bit.png,gtFine/val/munster/munster_000001_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000020_000019_leftImg8bit.png,gtFine/val/munster/munster_000020_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_029086_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_029086_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000152_000019_leftImg8bit.png,gtFine/val/munster/munster_000152_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000049_000019_leftImg8bit.png,gtFine/val/munster/munster_000049_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_028232_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_028232_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_001464_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_001464_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000032_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000032_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_016286_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_016286_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_023769_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_023769_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000061_000019_leftImg8bit.png,gtFine/val/munster/munster_000061_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000058_000019_leftImg8bit.png,gtFine/val/munster/munster_000058_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_028854_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_028854_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000133_000019_leftImg8bit.png,gtFine/val/munster/munster_000133_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000168_000019_leftImg8bit.png,gtFine/val/munster/munster_000168_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000158_000019_leftImg8bit.png,gtFine/val/munster/munster_000158_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000002_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000002_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_060135_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_060135_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000159_000019_leftImg8bit.png,gtFine/val/munster/munster_000159_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000017_000019_leftImg8bit.png,gtFine/val/munster/munster_000017_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_014741_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_014741_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_025713_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_025713_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000045_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000045_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_066574_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_066574_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000039_000019_leftImg8bit.png,gtFine/val/munster/munster_000039_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_011715_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_011715_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_054077_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_054077_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_028335_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_028335_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000022_000019_leftImg8bit.png,gtFine/val/munster/munster_000022_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_056580_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_056580_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000098_000019_leftImg8bit.png,gtFine/val/munster/munster_000098_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_002512_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_002512_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_000576_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_000576_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000096_000019_leftImg8bit.png,gtFine/val/munster/munster_000096_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_041074_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_041074_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000138_000019_leftImg8bit.png,gtFine/val/munster/munster_000138_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_038418_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_038418_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_017101_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_017101_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_073911_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_073911_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000136_000019_leftImg8bit.png,gtFine/val/munster/munster_000136_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000026_000019_leftImg8bit.png,gtFine/val/munster/munster_000026_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_015676_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_015676_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000000_000019_leftImg8bit.png,gtFine/val/munster/munster_000000_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_052120_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_052120_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_044787_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_044787_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000018_000019_leftImg8bit.png,gtFine/val/munster/munster_000018_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000032_000019_leftImg8bit.png,gtFine/val/munster/munster_000032_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000154_000019_leftImg8bit.png,gtFine/val/munster/munster_000154_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_043395_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_043395_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000131_000019_leftImg8bit.png,gtFine/val/munster/munster_000131_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_062793_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_062793_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000011_000019_leftImg8bit.png,gtFine/val/munster/munster_000011_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000087_000019_leftImg8bit.png,gtFine/val/munster/munster_000087_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_032711_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_032711_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000027_000019_leftImg8bit.png,gtFine/val/munster/munster_000027_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_071288_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_071288_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_003357_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_003357_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000035_000019_leftImg8bit.png,gtFine/val/munster/munster_000035_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055172_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055172_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000064_000019_leftImg8bit.png,gtFine/val/munster/munster_000064_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000006_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000006_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_057478_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_057478_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000105_000019_leftImg8bit.png,gtFine/val/munster/munster_000105_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_043564_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_043564_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_055387_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_055387_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_032942_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_032942_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000149_000019_leftImg8bit.png,gtFine/val/munster/munster_000149_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000024_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000024_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_048196_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_048196_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000141_000019_leftImg8bit.png,gtFine/val/munster/munster_000141_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_019969_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_019969_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_015091_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_015091_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_040575_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_040575_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_064798_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_064798_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_016029_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_016029_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_042384_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_042384_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_071781_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_071781_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000080_000019_leftImg8bit.png,gtFine/val/munster/munster_000080_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_010351_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_010351_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_013240_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_013240_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_000294_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_000294_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_011074_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_011074_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000005_000019_leftImg8bit.png,gtFine/val/munster/munster_000005_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000102_000019_leftImg8bit.png,gtFine/val/munster/munster_000102_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_004617_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_004617_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000004_000019_leftImg8bit.png,gtFine/val/munster/munster_000004_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_006589_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_006589_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_057181_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_057181_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_025512_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_025512_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000116_000019_leftImg8bit.png,gtFine/val/munster/munster_000116_000019_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000164_000019_leftImg8bit.png,gtFine/val/munster/munster_000164_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000000_021667_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000000_021667_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_073088_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_073088_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000081_000019_leftImg8bit.png,gtFine/val/munster/munster_000081_000019_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_064925_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_064925_gtFine_labelIds.png +leftImg8bit/val/frankfurt/frankfurt_000001_029600_leftImg8bit.png,gtFine/val/frankfurt/frankfurt_000001_029600_gtFine_labelIds.png +leftImg8bit/val/munster/munster_000172_000019_leftImg8bit.png,gtFine/val/munster/munster_000172_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000058_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000058_000019_gtFine_labelIds.png +leftImg8bit/val/lindau/lindau_000014_000019_leftImg8bit.png,gtFine/val/lindau/lindau_000014_000019_gtFine_labelIds.png \ No newline at end of file diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/dist_train.sh b/cv/semantic_segmentation/bisenetv2/pytorch/dist_train.sh new file mode 100755 index 0000000000000000000000000000000000000000..55001431d55639b361d7dadf9950eaee3b6bc3cc --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/dist_train.sh @@ -0,0 +1,46 @@ + +''' +NOTE: replace torchrun with torch.distributed.launch if you use older version of pytorch. I suggest you use the same version as I do since I have not tested compatibility with older version after updating. +''' + + +## bisenetv1 cityscapes +export CUDA_VISIBLE_DEVICES=0,1 +cfg_file=configs/bisenetv1_city.py +NGPUS=2 +torchrun --nproc_per_node=$NGPUS tools/train_amp.py --config $cfg_file + + +## bisenetv2 cityscapes +export CUDA_VISIBLE_DEVICES=0,1 +cfg_file=configs/bisenetv2_city.py +NGPUS=2 +torchrun --nproc_per_node=$NGPUS tools/train_amp.py --config $cfg_file + + +## bisenetv1 cocostuff +export CUDA_VISIBLE_DEVICES=0,1,2,3 +cfg_file=configs/bisenetv1_coco.py +NGPUS=4 +torchrun --nproc_per_node=$NGPUS tools/train_amp.py --config $cfg_file + + +## bisenetv2 cocostuff +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +cfg_file=configs/bisenetv2_coco.py +NGPUS=8 +torchrun --nproc_per_node=$NGPUS tools/train_amp.py --config $cfg_file + + +## bisenetv1 ade20k +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +cfg_file=configs/bisenetv1_ade20k.py +NGPUS=8 +torchrun --nproc_per_node=$NGPUS tools/train_amp.py --config $cfg_file + + +## bisenetv2 ade20k +export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 +cfg_file=configs/bisenetv2_ade20k.py +NGPUS=8 +torchrun --nproc_per_node=$NGPUS tools/train_amp.py --config $cfg_file diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/example.png b/cv/semantic_segmentation/bisenetv2/pytorch/example.png new file mode 100755 index 0000000000000000000000000000000000000000..66fbc749a06e9f04c000d74d0413c0d8d25fee4d Binary files /dev/null and b/cv/semantic_segmentation/bisenetv2/pytorch/example.png differ diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/__init__.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/__init__.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..c275c0340635b22354af7b5d64d366b0dae1b5f6 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/__init__.py @@ -0,0 +1,2 @@ + +from .get_dataloader import get_data_loader diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/ade20k.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/ade20k.py new file mode 100755 index 0000000000000000000000000000000000000000..f7938bde9fe19905c5cfd945381f25361f418dc9 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/ade20k.py @@ -0,0 +1,40 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import os +import os.path as osp +import json + +import torch +from torch.utils.data import Dataset, DataLoader +import torch.distributed as dist +import cv2 +import numpy as np + +import lib.data.transform_cv2 as T +from lib.data.base_dataset import BaseDataset + +''' +proportion of each class label pixels: + [0.1692778570779725, 0.11564757275917185, 0.0952101638485813, 0.06663867349694136, 0.05213595836428788, 0.04856869977177328, 0.04285300460652723, 0.024667459730413076, 0.021459432596108052, 0.01951911788079975, 0.019458422169334556, 0.017972951662770457, 0.017102797922112795, 0.016127154995430226, 0.012743318904507446, 0.011871312183986243, 0.01169223174996906, 0.010873715499098895, 0.01119535711707017, 0.01106824347921356, 0.010700814956159628, 0.00792769980935508, 0.007320940186670243, 0.007101978087028939, 0.006652130884336369, 0.0065129268341813954, 0.005905601374046595, 0.005655465856321791, 0.00485152244584825, 0.004812313401121428, 0.004808430157907591, 0.004852065319115992, 0.0035166264746248105, 0.0034049293812196796, 0.0031501695661207163, 0.003200865983720736, 0.0027563053654176255, 0.0026019635559833536, 0.002535207367187799, 0.0024709898687369503, 0.002511264681160722, 0.002349575022340693, 0.0022952289072600395, 0.0021756144527500325, 0.0020667410351909894, + 0.002019785482875027, 0.001971430263652598, 0.0019830032929254865, 0.0019170129596070547, 0.0019400873699042965, 0.0019177214046286212, 0.001992758707175458, 0.0019064211898405371, 0.001794991169874655, 0.0017086228805355563, 0.001816450049952539, 0.0018115561530790863, 0.0017526224833158293, 0.0016693853602227783, 0.001690968246884664, 0.001672815290479542, 0.0016435338913693607, 0.0015994805524026869, 0.001415586825791652, 0.0015309535955159497, 0.0015066783881302896, 0.0015584265652761034, 0.0014294452504793305, 0.0014381224963739522, 0.0013854752714941247, 0.001299217899155161, 0.0012526667460881378, 0.0013178209535318454, 0.0012941402888239277, 0.0010893388225083507, 0.0011300189527483507, 0.0010488809855522653, 0.0009206912461167046, 0.0009957668988478528, 0.0009413381127111981, 0.0009365154048026355, 0.0009059601825045681, 0.0008541199189880419, 0.0008971791385063005, 0.0008428502465623139, 0.0008056902958152122, 0.0008098830962054097, 0.0007822564960661871, 0.0007982742428082544, 0.0007502832355158758, 0.0007779780392762995, 0.0007712568824233966, 0.0007453305503359334, 0.0006837047894907241, 0.0007144561259049724, 0.0006892632697976981, + 0.0006652429648347085, 0.0006708271650257716, 0.0006737982709217282, 0.0006266153732017621, 0.0006591083131957701, 0.0006729084088606035, 0.0006615025588342957, 0.0005978453864296776, 0.0005662905332794616, 0.0005832571600309656, 0.000558171776296493, 0.0005270943484946844, 0.0005918616094679417, 0.0005653340750898915, 0.0005626451989934503, 0.0005906185582842337, 0.0005217418569022469, 0.0005282586325333688, 0.0005198277923139954, 0.0004861910064034809, 0.0005218504774841597, 0.0005172358250665335, 0.0005247616468645153, 0.0005357304885031275, 0.0004276964118043196, 0.0004607179872730913, 0.00041193838996318965, 0.00042133234798497776, 0.000374820234027733, 0.00041071531761801536, 0.0003664373889492048, 0.00043033958917813777, 0.00037797413481418125, 0.0004129435322190717, 0.00037504252731164754, 0.0003633328611545351, 0.00039741354470741193, 0.0003815260048785467, 0.00037395769934345317, 0.00037914990094397704, 0.000360210650939554, 0.0003641708241638368, 0.0003354311501122861, 0.0003386525655944687, 0.0003593692433029189, 0.00034422115014162057, 0.00032131529694189243, 0.00031263024322531515, 0.0003252564098949305, 0.00034751306566322646, 0.0002711341955909471, 0.00022987904222809388, 0.000242549759411221, 0.0002045743505533957] +''' + + + +class ADE20k(BaseDataset): + + def __init__(self, dataroot, annpath, trans_func=None, mode='train'): + super(ADE20k, self).__init__( + dataroot, annpath, trans_func, mode) + self.n_cats = 150 + self.lb_ignore = 255 + self.lb_map = np.arange(200) - 1 # label range from 1 to 149, 0 is ignored + self.lb_map[0] = 255 + + self.to_tensor = T.ToTensor( + mean=(0.49343230, 0.46819794, 0.43106043), # ade20k, rgb + std=(0.25680755, 0.25506608, 0.27422913), + ) + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/base_dataset.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/base_dataset.py new file mode 100755 index 0000000000000000000000000000000000000000..86eca5da1d36eb32ee94915208ef47580d03f1b0 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/base_dataset.py @@ -0,0 +1,74 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import os +import os.path as osp +import json + +import torch +from torch.utils.data import Dataset, DataLoader +import torch.distributed as dist +import cv2 +import numpy as np + + + + +class BaseDataset(Dataset): + ''' + ''' + def __init__(self, dataroot, annpath, trans_func=None, mode='train'): + super(BaseDataset, self).__init__() + assert mode in ('train', 'val', 'test') + self.mode = mode + self.trans_func = trans_func + + self.lb_ignore = -100 + self.lb_map = None + + with open(annpath, 'r') as fr: + pairs = fr.read().splitlines() + self.img_paths, self.lb_paths = [], [] + for pair in pairs: + imgpth, lbpth = pair.split(',') + self.img_paths.append(osp.join(dataroot, imgpth)) + self.lb_paths.append(osp.join(dataroot, lbpth)) + + assert len(self.img_paths) == len(self.lb_paths) + self.len = len(self.img_paths) + + def __getitem__(self, idx): + impth, lbpth = self.img_paths[idx], self.lb_paths[idx] + img, label = self.get_image(impth, lbpth) + if not self.lb_map is None: + label = self.lb_map[label] + im_lb = dict(im=img, lb=label) + if not self.trans_func is None: + im_lb = self.trans_func(im_lb) + im_lb = self.to_tensor(im_lb) + img, label = im_lb['im'], im_lb['lb'] + return img.detach(), label.unsqueeze(0).detach() + + def get_image(self, impth, lbpth): + img = cv2.imread(impth)[:, :, ::-1].copy() + label = cv2.imread(lbpth, 0) + return img, label + + def __len__(self): + return self.len + + +if __name__ == "__main__": + from tqdm import tqdm + from torch.utils.data import DataLoader + ds = CityScapes('./data/', mode='val') + dl = DataLoader(ds, + batch_size = 4, + shuffle = True, + num_workers = 4, + drop_last = True) + for imgs, label in dl: + print(len(imgs)) + for el in imgs: + print(el.size()) + break diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/cityscapes_cv2.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/cityscapes_cv2.py new file mode 100755 index 0000000000000000000000000000000000000000..84e527afb038f342445680dc41d399651d6b1a92 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/cityscapes_cv2.py @@ -0,0 +1,92 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import os +import os.path as osp +import json + +import torch +from torch.utils.data import Dataset, DataLoader +import torch.distributed as dist +import cv2 +import numpy as np + +import lib.data.transform_cv2 as T +from lib.data.base_dataset import BaseDataset + + +labels_info = [ + {"hasInstances": False, "category": "void", "catid": 0, "name": "unlabeled", "ignoreInEval": True, "id": 0, "color": [0, 0, 0], "trainId": 255}, + {"hasInstances": False, "category": "void", "catid": 0, "name": "ego vehicle", "ignoreInEval": True, "id": 1, "color": [0, 0, 0], "trainId": 255}, + {"hasInstances": False, "category": "void", "catid": 0, "name": "rectification border", "ignoreInEval": True, "id": 2, "color": [0, 0, 0], "trainId": 255}, + {"hasInstances": False, "category": "void", "catid": 0, "name": "out of roi", "ignoreInEval": True, "id": 3, "color": [0, 0, 0], "trainId": 255}, + {"hasInstances": False, "category": "void", "catid": 0, "name": "static", "ignoreInEval": True, "id": 4, "color": [0, 0, 0], "trainId": 255}, + {"hasInstances": False, "category": "void", "catid": 0, "name": "dynamic", "ignoreInEval": True, "id": 5, "color": [111, 74, 0], "trainId": 255}, + {"hasInstances": False, "category": "void", "catid": 0, "name": "ground", "ignoreInEval": True, "id": 6, "color": [81, 0, 81], "trainId": 255}, + {"hasInstances": False, "category": "flat", "catid": 1, "name": "road", "ignoreInEval": False, "id": 7, "color": [128, 64, 128], "trainId": 0}, + {"hasInstances": False, "category": "flat", "catid": 1, "name": "sidewalk", "ignoreInEval": False, "id": 8, "color": [244, 35, 232], "trainId": 1}, + {"hasInstances": False, "category": "flat", "catid": 1, "name": "parking", "ignoreInEval": True, "id": 9, "color": [250, 170, 160], "trainId": 255}, + {"hasInstances": False, "category": "flat", "catid": 1, "name": "rail track", "ignoreInEval": True, "id": 10, "color": [230, 150, 140], "trainId": 255}, + {"hasInstances": False, "category": "construction", "catid": 2, "name": "building", "ignoreInEval": False, "id": 11, "color": [70, 70, 70], "trainId": 2}, + {"hasInstances": False, "category": "construction", "catid": 2, "name": "wall", "ignoreInEval": False, "id": 12, "color": [102, 102, 156], "trainId": 3}, + {"hasInstances": False, "category": "construction", "catid": 2, "name": "fence", "ignoreInEval": False, "id": 13, "color": [190, 153, 153], "trainId": 4}, + {"hasInstances": False, "category": "construction", "catid": 2, "name": "guard rail", "ignoreInEval": True, "id": 14, "color": [180, 165, 180], "trainId": 255}, + {"hasInstances": False, "category": "construction", "catid": 2, "name": "bridge", "ignoreInEval": True, "id": 15, "color": [150, 100, 100], "trainId": 255}, + {"hasInstances": False, "category": "construction", "catid": 2, "name": "tunnel", "ignoreInEval": True, "id": 16, "color": [150, 120, 90], "trainId": 255}, + {"hasInstances": False, "category": "object", "catid": 3, "name": "pole", "ignoreInEval": False, "id": 17, "color": [153, 153, 153], "trainId": 5}, + {"hasInstances": False, "category": "object", "catid": 3, "name": "polegroup", "ignoreInEval": True, "id": 18, "color": [153, 153, 153], "trainId": 255}, + {"hasInstances": False, "category": "object", "catid": 3, "name": "traffic light", "ignoreInEval": False, "id": 19, "color": [250, 170, 30], "trainId": 6}, + {"hasInstances": False, "category": "object", "catid": 3, "name": "traffic sign", "ignoreInEval": False, "id": 20, "color": [220, 220, 0], "trainId": 7}, + {"hasInstances": False, "category": "nature", "catid": 4, "name": "vegetation", "ignoreInEval": False, "id": 21, "color": [107, 142, 35], "trainId": 8}, + {"hasInstances": False, "category": "nature", "catid": 4, "name": "terrain", "ignoreInEval": False, "id": 22, "color": [152, 251, 152], "trainId": 9}, + {"hasInstances": False, "category": "sky", "catid": 5, "name": "sky", "ignoreInEval": False, "id": 23, "color": [70, 130, 180], "trainId": 10}, + {"hasInstances": True, "category": "human", "catid": 6, "name": "person", "ignoreInEval": False, "id": 24, "color": [220, 20, 60], "trainId": 11}, + {"hasInstances": True, "category": "human", "catid": 6, "name": "rider", "ignoreInEval": False, "id": 25, "color": [255, 0, 0], "trainId": 12}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "car", "ignoreInEval": False, "id": 26, "color": [0, 0, 142], "trainId": 13}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "truck", "ignoreInEval": False, "id": 27, "color": [0, 0, 70], "trainId": 14}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "bus", "ignoreInEval": False, "id": 28, "color": [0, 60, 100], "trainId": 15}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "caravan", "ignoreInEval": True, "id": 29, "color": [0, 0, 90], "trainId": 255}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "trailer", "ignoreInEval": True, "id": 30, "color": [0, 0, 110], "trainId": 255}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "train", "ignoreInEval": False, "id": 31, "color": [0, 80, 100], "trainId": 16}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "motorcycle", "ignoreInEval": False, "id": 32, "color": [0, 0, 230], "trainId": 17}, + {"hasInstances": True, "category": "vehicle", "catid": 7, "name": "bicycle", "ignoreInEval": False, "id": 33, "color": [119, 11, 32], "trainId": 18}, + {"hasInstances": False, "category": "vehicle", "catid": 7, "name": "license plate", "ignoreInEval": True, "id": -1, "color": [0, 0, 142], "trainId": -1} +] + + + +class CityScapes(BaseDataset): + ''' + ''' + def __init__(self, dataroot, annpath, trans_func=None, mode='train'): + super(CityScapes, self).__init__( + dataroot, annpath, trans_func, mode) + self.n_cats = 19 + self.lb_ignore = 255 + self.lb_map = np.arange(256).astype(np.uint8) + for el in labels_info: + self.lb_map[el['id']] = el['trainId'] + + self.to_tensor = T.ToTensor( + mean=(0.3257, 0.3690, 0.3223), # city, rgb + std=(0.2112, 0.2148, 0.2115), + ) + + + + + +if __name__ == "__main__": + from tqdm import tqdm + from torch.utils.data import DataLoader + ds = CityScapes('./data/', mode='val') + dl = DataLoader(ds, + batch_size = 4, + shuffle = True, + num_workers = 4, + drop_last = True) + for imgs, label in dl: + print(len(imgs)) + for el in imgs: + print(el.size()) + break diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/coco.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/coco.py new file mode 100755 index 0000000000000000000000000000000000000000..4d0676d251ce908e5940a51bab434b60ee4b6da0 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/coco.py @@ -0,0 +1,67 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import os +import os.path as osp +import json + +import torch +from torch.utils.data import Dataset, DataLoader +import torch.distributed as dist +import cv2 +import numpy as np + +import lib.data.transform_cv2 as T +from lib.data.base_dataset import BaseDataset + +''' +91(thing) + 91(stuff) = 182 classes, label proportions are: + [0.0901445377, 0.00157896236, 0.00611962763, 0.00494526505, 0.00335260064, 0.00765355955, 0.00772972804, 0.00631509744, + 0.00270457286, 0.000697793344, 0.00114085574, 0.0, 0.00114084131, 0.000705729068, 0.00359758029, 0.00162208938, 0.00598373796, + 0.00440213609, 0.00362085441, 0.00193052224, 0.00271001196, 0.00492864603, 0.00186985393, 0.00332902228, 0.00334420294, 0.0, + 0.000922751106, 0.00298028204, 0.0, 0.0, 0.0010437561, 0.000285608411, 0.00318569535, 0.000314216755, 0.000313060076, 0.000364755975, + 0.000135920434, 0.000678980469, 0.000145436185, 0.000187677684, 0.000640885889, 0.00121345742, 0.000586313048, 0.00160106929, 0.0, + 0.000887093272, 0.00252332669, 0.000283407598, 0.000423017189, 0.000247005886, 0.00607086751, 0.002264644, 0.00108296684, 0.00299262899, + 0.0013542901, 0.0018255991, 0.000719220519, 0.00127748254, 0.00743539745, 0.0018222117, 0.00368625641, 0.00644224839, 0.00576837542, + 0.00234158491, 0.0102560197, 0.0, 0.0310601945, 0.0, 0.0, 0.00321417022, 0.0, 0.00343909654, 0.00366968441, 0.000223077284, + 0.000549851977, 0.00142833996, 0.000976368198, 0.000932849475, 0.00367802183, 6.33631941e-05, 0.00179415878, 0.00384408865, 0.0, + 0.00178728429, 0.00131955324, 0.00172710316, 0.000355333114, 0.00323052075, 3.45024606e-05, 0.000159319051, 0.0, 0.00233498927, + 0.00115535012, 0.00216354199, 0.00122636929, 0.0297802789, 0.00599919161, 0.00792527951, 0.00446247753, 0.00229155615, + 0.00481623284, 0.00928416394, 0.000292110971, 0.00100709844, 0.0036950065, 0.0238653594, 0.00318962423, 0.000957967243, 0.00491549702, + 0.00305316147, 0.0142686986, 0.00667806178, 0.00940045853, 0.000994700392, 0.00697502858, 0.00163056828, 0.00655119369, 0.00599044442, + 0.00200317424, 0.00546109479, 0.00496814246, 0.00128356119, 0.00893122042, 0.0423373213, 0.00275267517, 0.00730936505, 0.00231434982, + 0.00435102045, 0.00276966794, 0.00141028174, 0.000251683147, 0.00878006131, 0.00357672108, 0.000183633027, 0.00514584856, + 0.000848967739, 0.000662099529, 0.00186883821, 0.00417270686, 0.0224302911, 0.000551947753, 0.00799009014, 0.00379765772, + 0.00226731642, 0.0181341982, 0.000835227067, 0.00287355753, 0.00546769461, 0.0242787139, 0.00318951861, 0.00147349686, + 0.00167046288, 0.000520877717, 0.0101631583, 0.0234788756, 0.00283978366, 0.0624405778, 0.00258472693, 0.0204314774, 0.000550128266, + 0.00112924659, 0.001457768, 0.00190406757, 0.00173232644, 0.0116980759, 0.000850599027, 0.00565381261, 0.000787379463, 0.0577763754, + 0.00214883711, 0.00553984356, 0.0443605019, 0.0218570174, 0.0027310644, 0.00225446528, 0.00903008323, 0.00644298871, 0.00442167269, + 0.000129279566, 0.00176047379, 0.0101637834, 0.00255549522] + +11 thing classes has no annos, proportions are 0: + [11, 25, 28, 29, 44, 65, 67, 68, 70, 82, 90] +''' + + + +class CocoStuff(BaseDataset): + + def __init__(self, dataroot, annpath, trans_func=None, mode='train'): + super(CocoStuff, self).__init__( + dataroot, annpath, trans_func, mode) + self.n_cats = 171 # 91 stuff, 91 thing, 11 of thing have no annos + self.lb_ignore = 255 + + ## label mapping, remove non-existing labels + missing = [11, 25, 28, 29, 44, 65, 67, 68, 70, 82, 90] + remain = [ind for ind in range(182) if not ind in missing] + self.lb_map = np.arange(256) + for ind in remain: + self.lb_map[ind] = remain.index(ind) + + self.to_tensor = T.ToTensor( + mean=(0.46962251, 0.4464104, 0.40718787), # coco, rgb + std=(0.27469736, 0.27012361, 0.28515933), + ) + + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/customer_dataset.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/customer_dataset.py new file mode 100755 index 0000000000000000000000000000000000000000..f7355e60622113e53beea243e172738b49530e16 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/customer_dataset.py @@ -0,0 +1,21 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + + +import lib.data.transform_cv2 as T +from lib.data.base_dataset import BaseDataset + + +class CustomerDataset(BaseDataset): + + def __init__(self, dataroot, annpath, trans_func=None, mode='train'): + super(CustomerDataset, self).__init__( + dataroot, annpath, trans_func, mode) + self.lb_ignore = 255 + + self.to_tensor = T.ToTensor( + mean=(0.4, 0.4, 0.4), # rgb + std=(0.2, 0.2, 0.2), + ) + + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/get_dataloader.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/get_dataloader.py new file mode 100755 index 0000000000000000000000000000000000000000..654de737060a726a651eaa042f2314cf1aeeb8ef --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/get_dataloader.py @@ -0,0 +1,61 @@ + +import torch +from torch.utils.data import Dataset, DataLoader +import torch.distributed as dist + +import lib.data.transform_cv2 as T +from lib.data.sampler import RepeatedDistSampler + +from lib.data.cityscapes_cv2 import CityScapes +from lib.data.coco import CocoStuff +from lib.data.ade20k import ADE20k +from lib.data.customer_dataset import CustomerDataset + + + + + +def get_data_loader(cfg, mode='train'): + if mode == 'train': + trans_func = T.TransformationTrain(cfg.scales, cfg.cropsize) + batchsize = cfg.ims_per_gpu + annpath = cfg.train_im_anns + shuffle = True + drop_last = True + elif mode == 'val': + trans_func = T.TransformationVal() + batchsize = cfg.eval_ims_per_gpu + annpath = cfg.val_im_anns + shuffle = False + drop_last = False + + ds = eval(cfg.dataset)(cfg.im_root, annpath, trans_func=trans_func, mode=mode) + + if dist.is_initialized(): + assert dist.is_available(), "dist should be initialzed" + if mode == 'train': + assert not cfg.max_iter is None + n_train_imgs = cfg.ims_per_gpu * dist.get_world_size() * cfg.max_iter + sampler = RepeatedDistSampler(ds, n_train_imgs, shuffle=shuffle) + else: + sampler = torch.utils.data.distributed.DistributedSampler( + ds, shuffle=shuffle) + batchsampler = torch.utils.data.sampler.BatchSampler( + sampler, batchsize, drop_last=drop_last + ) + dl = DataLoader( + ds, + batch_sampler=batchsampler, + num_workers=4, + pin_memory=True, + ) + else: + dl = DataLoader( + ds, + batch_size=batchsize, + shuffle=shuffle, + drop_last=drop_last, + num_workers=4, + pin_memory=True, + ) + return dl diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/sampler.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/sampler.py new file mode 100755 index 0000000000000000000000000000000000000000..b6aae9f1eb353e25c0f7f1d843aaee5811d088c2 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/sampler.py @@ -0,0 +1,76 @@ + +import math +import torch +from torch.utils.data.sampler import Sampler +import torch.distributed as dist + + +class RepeatedDistSampler(Sampler): + """Sampler that restricts data loading to a subset of the dataset. + + It is especially useful in conjunction with + :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each + process can pass a DistributedSampler instance as a DataLoader sampler, + and load a subset of the original dataset that is exclusive to it. + + .. note:: + Dataset is assumed to be of constant size. + + Arguments: + dataset: Dataset used for sampling. + num_replicas (optional): Number of processes participating in + distributed training. + rank (optional): Rank of the current process within num_replicas. + shuffle (optional): If true (default), sampler will shuffle the indices + """ + + def __init__(self, dataset, num_imgs, num_replicas=None, rank=None, shuffle=True, ba=False): + if num_replicas is None: + if not dist.is_available(): + raise RuntimeError("Requires distributed package to be available") + num_replicas = dist.get_world_size() + if rank is None: + if not dist.is_available(): + raise RuntimeError("Requires distributed package to be available") + rank = dist.get_rank() + self.dataset = dataset + self.num_replicas = num_replicas + self.rank = rank + self.num_imgs_rank = int(math.ceil(num_imgs * 1.0 / self.num_replicas)) + self.total_size = self.num_imgs_rank * self.num_replicas + self.num_imgs = num_imgs + self.shuffle = shuffle + self.ba = ba + + + def __iter__(self): + # deterministically shuffle based on epoch + g = torch.Generator() + n_repeats = self.num_imgs // len(self.dataset) + 1 + indices = [] + for n in range(n_repeats): + if self.shuffle: + g.manual_seed(n) + indices += torch.randperm(len(self.dataset), generator=g).tolist() + else: + indices += [i for i in range(len(self.dataset))] + + # add extra samples to make it evenly divisible + indices = indices[:self.total_size] + assert len(indices) == self.total_size + + if self.ba: + n_rep = max(4, self.num_replicas) + len_ind = len(indices) // n_rep + 1 + indices = indices[:len_ind] + indices = [ind for ind in indices for _ in range(n_rep)] + + # subsample + indices = indices[self.rank:self.total_size:self.num_replicas] + assert len(indices) == self.num_imgs_rank + + return iter(indices) + + def __len__(self): + return self.num_imgs_rank + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/transform_cv2.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/transform_cv2.py new file mode 100755 index 0000000000000000000000000000000000000000..7cef5d8a0c817ca2173f6c211449fbb93f06645b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/data/transform_cv2.py @@ -0,0 +1,182 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + + +import random +import math + +import numpy as np +import cv2 +import torch + + + +class RandomResizedCrop(object): + ''' + size should be a tuple of (H, W) + ''' + def __init__(self, scales=(0.5, 1.), size=(384, 384)): + self.scales = scales + self.size = size + + def __call__(self, im_lb): + if self.size is None: + return im_lb + + im, lb = im_lb['im'], im_lb['lb'] + assert im.shape[:2] == lb.shape[:2] + + crop_h, crop_w = self.size + scale = np.random.uniform(min(self.scales), max(self.scales)) + im_h, im_w = [math.ceil(el * scale) for el in im.shape[:2]] + im = cv2.resize(im, (im_w, im_h)) + lb = cv2.resize(lb, (im_w, im_h), interpolation=cv2.INTER_NEAREST) + + if (im_h, im_w) == (crop_h, crop_w): return dict(im=im, lb=lb) + pad_h, pad_w = 0, 0 + if im_h < crop_h: + pad_h = (crop_h - im_h) // 2 + 1 + if im_w < crop_w: + pad_w = (crop_w - im_w) // 2 + 1 + if pad_h > 0 or pad_w > 0: + im = np.pad(im, ((pad_h, pad_h), (pad_w, pad_w), (0, 0))) + lb = np.pad(lb, ((pad_h, pad_h), (pad_w, pad_w)), 'constant', constant_values=255) + + im_h, im_w, _ = im.shape + sh, sw = np.random.random(2) + sh, sw = int(sh * (im_h - crop_h)), int(sw * (im_w - crop_w)) + return dict( + im=im[sh:sh+crop_h, sw:sw+crop_w, :].copy(), + lb=lb[sh:sh+crop_h, sw:sw+crop_w].copy() + ) + + + +class RandomHorizontalFlip(object): + + def __init__(self, p=0.5): + self.p = p + + def __call__(self, im_lb): + if np.random.random() < self.p: + return im_lb + im, lb = im_lb['im'], im_lb['lb'] + assert im.shape[:2] == lb.shape[:2] + return dict( + im=im[:, ::-1, :], + lb=lb[:, ::-1], + ) + + + +class ColorJitter(object): + + def __init__(self, brightness=None, contrast=None, saturation=None): + if not brightness is None and brightness >= 0: + self.brightness = [max(1-brightness, 0), 1+brightness] + if not contrast is None and contrast >= 0: + self.contrast = [max(1-contrast, 0), 1+contrast] + if not saturation is None and saturation >= 0: + self.saturation = [max(1-saturation, 0), 1+saturation] + + def __call__(self, im_lb): + im, lb = im_lb['im'], im_lb['lb'] + assert im.shape[:2] == lb.shape[:2] + if not self.brightness is None: + rate = np.random.uniform(*self.brightness) + im = self.adj_brightness(im, rate) + if not self.contrast is None: + rate = np.random.uniform(*self.contrast) + im = self.adj_contrast(im, rate) + if not self.saturation is None: + rate = np.random.uniform(*self.saturation) + im = self.adj_saturation(im, rate) + return dict(im=im, lb=lb,) + + def adj_saturation(self, im, rate): + M = np.float32([ + [1+2*rate, 1-rate, 1-rate], + [1-rate, 1+2*rate, 1-rate], + [1-rate, 1-rate, 1+2*rate] + ]) + shape = im.shape + im = np.matmul(im.reshape(-1, 3), M).reshape(shape)/3 + im = np.clip(im, 0, 255).astype(np.uint8) + return im + + def adj_brightness(self, im, rate): + table = np.array([ + i * rate for i in range(256) + ]).clip(0, 255).astype(np.uint8) + return table[im] + + def adj_contrast(self, im, rate): + table = np.array([ + 74 + (i - 74) * rate for i in range(256) + ]).clip(0, 255).astype(np.uint8) + return table[im] + + + + +class ToTensor(object): + ''' + mean and std should be of the channel order 'bgr' + ''' + def __init__(self, mean=(0, 0, 0), std=(1., 1., 1.)): + self.mean = mean + self.std = std + + def __call__(self, im_lb): + im, lb = im_lb['im'], im_lb['lb'] + im = im.transpose(2, 0, 1).astype(np.float32) + im = torch.from_numpy(im).div_(255) + dtype, device = im.dtype, im.device + mean = torch.as_tensor(self.mean, dtype=dtype, device=device)[:, None, None] + std = torch.as_tensor(self.std, dtype=dtype, device=device)[:, None, None] + im = im.sub_(mean).div_(std).clone() + if not lb is None: + lb = torch.from_numpy(lb.astype(np.int64).copy()).clone() + return dict(im=im, lb=lb) + + +class Compose(object): + + def __init__(self, do_list): + self.do_list = do_list + + def __call__(self, im_lb): + for comp in self.do_list: + im_lb = comp(im_lb) + return im_lb + + +class TransformationTrain(object): + + def __init__(self, scales, cropsize): + self.trans_func = Compose([ + RandomResizedCrop(scales, cropsize), + RandomHorizontalFlip(), + ColorJitter( + brightness=0.4, + contrast=0.4, + saturation=0.4 + ), + ]) + + def __call__(self, im_lb): + im_lb = self.trans_func(im_lb) + return im_lb + + +class TransformationVal(object): + + def __call__(self, im_lb): + im, lb = im_lb['im'], im_lb['lb'] + return dict(im=im, lb=lb) + + + +if __name__ == '__main__': + pass + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/logger.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/logger.py new file mode 100755 index 0000000000000000000000000000000000000000..29f6054c01020fcf0345e3d066e608c37254b99b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/logger.py @@ -0,0 +1,51 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + + +import os.path as osp +import time +import logging + +import torch.distributed as dist + + +def setup_logger(name, logpth): + logfile = '{}-{}.log'.format(name, time.strftime('%Y-%m-%d-%H-%M-%S')) + logfile = osp.join(logpth, logfile) + FORMAT = '%(levelname)s %(filename)s(%(lineno)d): %(message)s' + log_level = logging.INFO + if dist.is_initialized() and dist.get_rank() != 0: + log_level = logging.WARNING + try: + logging.basicConfig(level=log_level, format=FORMAT, filename=logfile, force=True) + except Exception: + for hl in logging.root.handlers: logging.root.removeHandler(hl) + logging.basicConfig(level=log_level, format=FORMAT, filename=logfile) + logging.root.addHandler(logging.StreamHandler()) + + +def print_log_msg(it, max_iter, lr, time_meter, loss_meter, loss_pre_meter, + loss_aux_meters): + t_intv, eta = time_meter.get() + loss_avg, _ = loss_meter.get() + loss_pre_avg, _ = loss_pre_meter.get() + loss_aux_avg = ', '.join(['{}: {:.4f}'.format(el.name, el.get()[0]) for el in loss_aux_meters]) + msg = ', '.join([ + 'iter: {it}/{max_it}', + 'lr: {lr:4f}', + 'eta: {eta}', + 'time: {time:.2f}', + 'loss: {loss:.4f}', + 'loss_pre: {loss_pre:.4f}', + ]).format( + it=it+1, + max_it=max_iter, + lr=lr, + time=t_intv, + eta=eta, + loss=loss_avg, + loss_pre=loss_pre_avg, + ) + msg += ', ' + loss_aux_avg + logger = logging.getLogger() + logger.info(msg) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/lr_scheduler.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/lr_scheduler.py new file mode 100755 index 0000000000000000000000000000000000000000..b09623aa2e7c14d0930679078e067b73664e19da --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/lr_scheduler.py @@ -0,0 +1,165 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import math +from bisect import bisect_right +import torch + + +class WarmupLrScheduler(torch.optim.lr_scheduler._LRScheduler): + + def __init__( + self, + optimizer, + warmup_iter=500, + warmup_ratio=5e-4, + warmup='exp', + last_epoch=-1, + ): + self.warmup_iter = warmup_iter + self.warmup_ratio = warmup_ratio + self.warmup = warmup + super(WarmupLrScheduler, self).__init__(optimizer, last_epoch) + + def get_lr(self): + ratio = self.get_lr_ratio() + lrs = [ratio * lr for lr in self.base_lrs] + return lrs + + def get_lr_ratio(self): + if self.last_epoch < self.warmup_iter: + ratio = self.get_warmup_ratio() + else: + ratio = self.get_main_ratio() + return ratio + + def get_main_ratio(self): + raise NotImplementedError + + def get_warmup_ratio(self): + assert self.warmup in ('linear', 'exp') + alpha = self.last_epoch / self.warmup_iter + if self.warmup == 'linear': + ratio = self.warmup_ratio + (1 - self.warmup_ratio) * alpha + elif self.warmup == 'exp': + ratio = self.warmup_ratio ** (1. - alpha) + return ratio + + +class WarmupPolyLrScheduler(WarmupLrScheduler): + + def __init__( + self, + optimizer, + power, + max_iter, + warmup_iter=500, + warmup_ratio=5e-4, + warmup='exp', + last_epoch=-1, + ): + self.power = power + self.max_iter = max_iter + super(WarmupPolyLrScheduler, self).__init__( + optimizer, warmup_iter, warmup_ratio, warmup, last_epoch) + + def get_main_ratio(self): + real_iter = self.last_epoch - self.warmup_iter + real_max_iter = self.max_iter - self.warmup_iter + alpha = real_iter / real_max_iter + ratio = (1 - alpha) ** self.power + return ratio + + +class WarmupExpLrScheduler(WarmupLrScheduler): + + def __init__( + self, + optimizer, + gamma, + interval=1, + warmup_iter=500, + warmup_ratio=5e-4, + warmup='exp', + last_epoch=-1, + ): + self.gamma = gamma + self.interval = interval + super(WarmupExpLrScheduler, self).__init__( + optimizer, warmup_iter, warmup_ratio, warmup, last_epoch) + + def get_main_ratio(self): + real_iter = self.last_epoch - self.warmup_iter + ratio = self.gamma ** (real_iter // self.interval) + return ratio + + +class WarmupCosineLrScheduler(WarmupLrScheduler): + + def __init__( + self, + optimizer, + max_iter, + eta_ratio=0, + warmup_iter=500, + warmup_ratio=5e-4, + warmup='exp', + last_epoch=-1, + ): + self.eta_ratio = eta_ratio + self.max_iter = max_iter + super(WarmupCosineLrScheduler, self).__init__( + optimizer, warmup_iter, warmup_ratio, warmup, last_epoch) + + def get_main_ratio(self): + real_iter = self.last_epoch - self.warmup_iter + real_max_iter = self.max_iter - self.warmup_iter + return self.eta_ratio + (1 - self.eta_ratio) * ( + 1 + math.cos(math.pi * self.last_epoch / real_max_iter)) / 2 + + +class WarmupStepLrScheduler(WarmupLrScheduler): + + def __init__( + self, + optimizer, + milestones: list, + gamma=0.1, + warmup_iter=500, + warmup_ratio=5e-4, + warmup='exp', + last_epoch=-1, + ): + self.milestones = milestones + self.gamma = gamma + super(WarmupStepLrScheduler, self).__init__( + optimizer, warmup_iter, warmup_ratio, warmup, last_epoch) + + def get_main_ratio(self): + real_iter = self.last_epoch - self.warmup_iter + ratio = self.gamma ** bisect_right(self.milestones, real_iter) + return ratio + + +if __name__ == "__main__": + model = torch.nn.Conv2d(3, 16, 3, 1, 1) + optim = torch.optim.SGD(model.parameters(), lr=1e-3) + + max_iter = 20000 + lr_scheduler = WarmupPolyLrScheduler(optim, 0.9, max_iter, 200, 0.1, 'linear', -1) + lrs = [] + for _ in range(max_iter): + lr = lr_scheduler.get_lr()[0] + print(lr) + lrs.append(lr) + lr_scheduler.step() + import matplotlib + import matplotlib.pyplot as plt + import numpy as np + lrs = np.array(lrs) + n_lrs = len(lrs) + plt.plot(np.arange(n_lrs), lrs) + plt.grid() + plt.show() + + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/meters.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/meters.py new file mode 100755 index 0000000000000000000000000000000000000000..89734318911678f29e1f240cbaf0439095d72eff --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/meters.py @@ -0,0 +1,43 @@ + +import time +import datetime + +class TimeMeter(object): + + def __init__(self, max_iter): + self.iter = 0 + self.max_iter = max_iter + self.st = time.time() + self.global_st = self.st + self.curr = self.st + + def update(self): + self.iter += 1 + + def get(self): + self.curr = time.time() + interv = self.curr - self.st + global_interv = self.curr - self.global_st + eta = int((self.max_iter-self.iter) * (global_interv / (self.iter+1))) + eta = str(datetime.timedelta(seconds=eta)) + self.st = self.curr + return interv, eta + + +class AvgMeter(object): + + def __init__(self, name): + self.name = name + self.seq = [] + self.global_seq = [] + + def update(self, val): + self.seq.append(val) + self.global_seq.append(val) + + def get(self): + avg = sum(self.seq) / len(self.seq) + global_avg = sum(self.global_seq) / len(self.global_seq) + self.seq = [] + return avg, global_avg + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/__init__.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..2c735037871bae9eb7ff1fda8bc6d6c6e4333962 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/__init__.py @@ -0,0 +1,10 @@ + + +from .bisenetv1 import BiSeNetV1 +from .bisenetv2 import BiSeNetV2 + + +model_factory = { + 'bisenetv1': BiSeNetV1, + 'bisenetv2': BiSeNetV2, +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/bisenetv1.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/bisenetv1.py new file mode 100755 index 0000000000000000000000000000000000000000..678b6f8569ad91f98884891870f4eba8e4cdfc74 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/bisenetv1.py @@ -0,0 +1,327 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torchvision + +from .resnet import Resnet18 + +from torch.nn import BatchNorm2d + + +class ConvBNReLU(nn.Module): + + def __init__(self, in_chan, out_chan, ks=3, stride=1, padding=1, *args, **kwargs): + super(ConvBNReLU, self).__init__() + self.conv = nn.Conv2d(in_chan, + out_chan, + kernel_size = ks, + stride = stride, + padding = padding, + bias = False) + self.bn = BatchNorm2d(out_chan) + self.relu = nn.ReLU(inplace=True) + self.init_weight() + + def forward(self, x): + x = self.conv(x) + x = self.bn(x) + x = self.relu(x) + return x + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + +class UpSample(nn.Module): + + def __init__(self, n_chan, factor=2): + super(UpSample, self).__init__() + out_chan = n_chan * factor * factor + self.proj = nn.Conv2d(n_chan, out_chan, 1, 1, 0) + self.up = nn.PixelShuffle(factor) + self.init_weight() + + def forward(self, x): + feat = self.proj(x) + feat = self.up(feat) + return feat + + def init_weight(self): + nn.init.xavier_normal_(self.proj.weight, gain=1.) + + +class BiSeNetOutput(nn.Module): + + def __init__(self, in_chan, mid_chan, n_classes, up_factor=32, *args, **kwargs): + super(BiSeNetOutput, self).__init__() + self.up_factor = up_factor + out_chan = n_classes + self.conv = ConvBNReLU(in_chan, mid_chan, ks=3, stride=1, padding=1) + self.conv_out = nn.Conv2d(mid_chan, out_chan, kernel_size=1, bias=True) + self.up = nn.Upsample(scale_factor=up_factor, + mode='bilinear', align_corners=False) + self.init_weight() + + def forward(self, x): + x = self.conv(x) + x = self.conv_out(x) + x = self.up(x) + return x + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + def get_params(self): + wd_params, nowd_params = [], [] + for name, module in self.named_modules(): + if isinstance(module, (nn.Linear, nn.Conv2d)): + wd_params.append(module.weight) + if not module.bias is None: + nowd_params.append(module.bias) + elif isinstance(module, nn.modules.batchnorm._BatchNorm): + nowd_params += list(module.parameters()) + return wd_params, nowd_params + + +class AttentionRefinementModule(nn.Module): + def __init__(self, in_chan, out_chan, *args, **kwargs): + super(AttentionRefinementModule, self).__init__() + self.conv = ConvBNReLU(in_chan, out_chan, ks=3, stride=1, padding=1) + self.conv_atten = nn.Conv2d(out_chan, out_chan, kernel_size= 1, bias=False) + self.bn_atten = BatchNorm2d(out_chan) + # self.sigmoid_atten = nn.Sigmoid() + self.init_weight() + + def forward(self, x): + feat = self.conv(x) + atten = torch.mean(feat, dim=(2, 3), keepdim=True) + atten = self.conv_atten(atten) + atten = self.bn_atten(atten) + # atten = self.sigmoid_atten(atten) + atten = atten.sigmoid() + out = torch.mul(feat, atten) + return out + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + +class ContextPath(nn.Module): + def __init__(self, *args, **kwargs): + super(ContextPath, self).__init__() + self.resnet = Resnet18() + self.arm16 = AttentionRefinementModule(256, 128) + self.arm32 = AttentionRefinementModule(512, 128) + self.conv_head32 = ConvBNReLU(128, 128, ks=3, stride=1, padding=1) + self.conv_head16 = ConvBNReLU(128, 128, ks=3, stride=1, padding=1) + self.conv_avg = ConvBNReLU(512, 128, ks=1, stride=1, padding=0) + self.up32 = nn.Upsample(scale_factor=2.) + self.up16 = nn.Upsample(scale_factor=2.) + + self.init_weight() + + def forward(self, x): + feat8, feat16, feat32 = self.resnet(x) + + avg = torch.mean(feat32, dim=(2, 3), keepdim=True) + avg = self.conv_avg(avg) + + feat32_arm = self.arm32(feat32) + feat32_sum = feat32_arm + avg + feat32_up = self.up32(feat32_sum) + feat32_up = self.conv_head32(feat32_up) + + feat16_arm = self.arm16(feat16) + feat16_sum = feat16_arm + feat32_up + feat16_up = self.up16(feat16_sum) + feat16_up = self.conv_head16(feat16_up) + + return feat16_up, feat32_up # x8, x16 + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + def get_params(self): + wd_params, nowd_params = [], [] + for name, module in self.named_modules(): + if isinstance(module, (nn.Linear, nn.Conv2d)): + wd_params.append(module.weight) + if not module.bias is None: + nowd_params.append(module.bias) + elif isinstance(module, nn.modules.batchnorm._BatchNorm): + nowd_params += list(module.parameters()) + return wd_params, nowd_params + + +class SpatialPath(nn.Module): + def __init__(self, *args, **kwargs): + super(SpatialPath, self).__init__() + self.conv1 = ConvBNReLU(3, 64, ks=7, stride=2, padding=3) + self.conv2 = ConvBNReLU(64, 64, ks=3, stride=2, padding=1) + self.conv3 = ConvBNReLU(64, 64, ks=3, stride=2, padding=1) + self.conv_out = ConvBNReLU(64, 128, ks=1, stride=1, padding=0) + self.init_weight() + + def forward(self, x): + feat = self.conv1(x) + feat = self.conv2(feat) + feat = self.conv3(feat) + feat = self.conv_out(feat) + return feat + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + def get_params(self): + wd_params, nowd_params = [], [] + for name, module in self.named_modules(): + if isinstance(module, nn.Linear) or isinstance(module, nn.Conv2d): + wd_params.append(module.weight) + if not module.bias is None: + nowd_params.append(module.bias) + elif isinstance(module, nn.modules.batchnorm._BatchNorm): + nowd_params += list(module.parameters()) + return wd_params, nowd_params + + +class FeatureFusionModule(nn.Module): + def __init__(self, in_chan, out_chan, *args, **kwargs): + super(FeatureFusionModule, self).__init__() + self.convblk = ConvBNReLU(in_chan, out_chan, ks=1, stride=1, padding=0) + ## use conv-bn instead of 2 layer mlp, so that tensorrt 7.2.3.4 can work for fp16 + self.conv = nn.Conv2d(out_chan, + out_chan, + kernel_size = 1, + stride = 1, + padding = 0, + bias = False) + self.bn = nn.BatchNorm2d(out_chan) + # self.conv1 = nn.Conv2d(out_chan, + # out_chan//4, + # kernel_size = 1, + # stride = 1, + # padding = 0, + # bias = False) + # self.conv2 = nn.Conv2d(out_chan//4, + # out_chan, + # kernel_size = 1, + # stride = 1, + # padding = 0, + # bias = False) + # self.relu = nn.ReLU(inplace=True) + self.init_weight() + + def forward(self, fsp, fcp): + fcat = torch.cat([fsp, fcp], dim=1) + feat = self.convblk(fcat) + atten = torch.mean(feat, dim=(2, 3), keepdim=True) + atten = self.conv(atten) + atten = self.bn(atten) + # atten = self.conv1(atten) + # atten = self.relu(atten) + # atten = self.conv2(atten) + atten = atten.sigmoid() + feat_atten = torch.mul(feat, atten) + feat_out = feat_atten + feat + return feat_out + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + def get_params(self): + wd_params, nowd_params = [], [] + for name, module in self.named_modules(): + if isinstance(module, (nn.Linear, nn.Conv2d)): + wd_params.append(module.weight) + if not module.bias is None: + nowd_params.append(module.bias) + elif isinstance(module, nn.modules.batchnorm._BatchNorm): + nowd_params += list(module.parameters()) + return wd_params, nowd_params + + +class BiSeNetV1(nn.Module): + + def __init__(self, n_classes, aux_mode='train', *args, **kwargs): + super(BiSeNetV1, self).__init__() + self.cp = ContextPath() + self.sp = SpatialPath() + self.ffm = FeatureFusionModule(256, 256) + self.conv_out = BiSeNetOutput(256, 256, n_classes, up_factor=8) + self.aux_mode = aux_mode + if self.aux_mode == 'train': + self.conv_out16 = BiSeNetOutput(128, 64, n_classes, up_factor=8) + self.conv_out32 = BiSeNetOutput(128, 64, n_classes, up_factor=16) + self.init_weight() + + def forward(self, x): + H, W = x.size()[2:] + feat_cp8, feat_cp16 = self.cp(x) + feat_sp = self.sp(x) + feat_fuse = self.ffm(feat_sp, feat_cp8) + + feat_out = self.conv_out(feat_fuse) + if self.aux_mode == 'train': + feat_out16 = self.conv_out16(feat_cp8) + feat_out32 = self.conv_out32(feat_cp16) + return feat_out, feat_out16, feat_out32 + elif self.aux_mode == 'eval': + return feat_out, + elif self.aux_mode == 'pred': + feat_out = feat_out.argmax(dim=1) + return feat_out + else: + raise NotImplementedError + + def init_weight(self): + for ly in self.children(): + if isinstance(ly, nn.Conv2d): + nn.init.kaiming_normal_(ly.weight, a=1) + if not ly.bias is None: nn.init.constant_(ly.bias, 0) + + def get_params(self): + wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params = [], [], [], [] + for name, child in self.named_children(): + child_wd_params, child_nowd_params = child.get_params() + if isinstance(child, (FeatureFusionModule, BiSeNetOutput)): + lr_mul_wd_params += child_wd_params + lr_mul_nowd_params += child_nowd_params + else: + wd_params += child_wd_params + nowd_params += child_nowd_params + return wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params + + +if __name__ == "__main__": + net = BiSeNetV1(19) + net.cuda() + net.eval() + in_ten = torch.randn(16, 3, 640, 480).cuda() + out, out16, out32 = net(in_ten) + print(out.shape) + print(out16.shape) + print(out32.shape) + + net.get_params() diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/bisenetv2.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/bisenetv2.py new file mode 100755 index 0000000000000000000000000000000000000000..c8307d85b08587c7fe338dffaebcee0e12b0a67f --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/bisenetv2.py @@ -0,0 +1,443 @@ + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as modelzoo + +backbone_url = 'https://github.com/CoinCheung/BiSeNet/releases/download/0.0.0/backbone_v2.pth' + + +class ConvBNReLU(nn.Module): + + def __init__(self, in_chan, out_chan, ks=3, stride=1, padding=1, + dilation=1, groups=1, bias=False): + super(ConvBNReLU, self).__init__() + self.conv = nn.Conv2d( + in_chan, out_chan, kernel_size=ks, stride=stride, + padding=padding, dilation=dilation, + groups=groups, bias=bias) + self.bn = nn.BatchNorm2d(out_chan) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): + feat = self.conv(x) + feat = self.bn(feat) + feat = self.relu(feat) + return feat + + +class UpSample(nn.Module): + + def __init__(self, n_chan, factor=2): + super(UpSample, self).__init__() + out_chan = n_chan * factor * factor + self.proj = nn.Conv2d(n_chan, out_chan, 1, 1, 0) + self.up = nn.PixelShuffle(factor) + self.init_weight() + + def forward(self, x): + feat = self.proj(x) + feat = self.up(feat) + return feat + + def init_weight(self): + nn.init.xavier_normal_(self.proj.weight, gain=1.) + + + +class DetailBranch(nn.Module): + + def __init__(self): + super(DetailBranch, self).__init__() + self.S1 = nn.Sequential( + ConvBNReLU(3, 64, 3, stride=2), + ConvBNReLU(64, 64, 3, stride=1), + ) + self.S2 = nn.Sequential( + ConvBNReLU(64, 64, 3, stride=2), + ConvBNReLU(64, 64, 3, stride=1), + ConvBNReLU(64, 64, 3, stride=1), + ) + self.S3 = nn.Sequential( + ConvBNReLU(64, 128, 3, stride=2), + ConvBNReLU(128, 128, 3, stride=1), + ConvBNReLU(128, 128, 3, stride=1), + ) + + def forward(self, x): + feat = self.S1(x) + feat = self.S2(feat) + feat = self.S3(feat) + return feat + + +class StemBlock(nn.Module): + + def __init__(self): + super(StemBlock, self).__init__() + self.conv = ConvBNReLU(3, 16, 3, stride=2) + self.left = nn.Sequential( + ConvBNReLU(16, 8, 1, stride=1, padding=0), + ConvBNReLU(8, 16, 3, stride=2), + ) + self.right = nn.MaxPool2d( + kernel_size=3, stride=2, padding=1, ceil_mode=False) + self.fuse = ConvBNReLU(32, 16, 3, stride=1) + + def forward(self, x): + feat = self.conv(x) + feat_left = self.left(feat) + feat_right = self.right(feat) + feat = torch.cat([feat_left, feat_right], dim=1) + feat = self.fuse(feat) + return feat + + +class CEBlock(nn.Module): + + def __init__(self): + super(CEBlock, self).__init__() + self.bn = nn.BatchNorm2d(128) + self.conv_gap = ConvBNReLU(128, 128, 1, stride=1, padding=0) + #TODO: in paper here is naive conv2d, no bn-relu + self.conv_last = ConvBNReLU(128, 128, 3, stride=1) + + def forward(self, x): + feat = torch.mean(x, dim=(2, 3), keepdim=True) + feat = self.bn(feat) + feat = self.conv_gap(feat) + feat = feat + x + feat = self.conv_last(feat) + return feat + + +class GELayerS1(nn.Module): + + def __init__(self, in_chan, out_chan, exp_ratio=6): + super(GELayerS1, self).__init__() + mid_chan = in_chan * exp_ratio + self.conv1 = ConvBNReLU(in_chan, in_chan, 3, stride=1) + self.dwconv = nn.Sequential( + nn.Conv2d( + in_chan, mid_chan, kernel_size=3, stride=1, + padding=1, groups=in_chan, bias=False), + nn.BatchNorm2d(mid_chan), + nn.ReLU(inplace=True), # not shown in paper + ) + self.conv2 = nn.Sequential( + nn.Conv2d( + mid_chan, out_chan, kernel_size=1, stride=1, + padding=0, bias=False), + nn.BatchNorm2d(out_chan), + ) + self.conv2[1].last_bn = True + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): + feat = self.conv1(x) + feat = self.dwconv(feat) + feat = self.conv2(feat) + feat = feat + x + feat = self.relu(feat) + return feat + + +class GELayerS2(nn.Module): + + def __init__(self, in_chan, out_chan, exp_ratio=6): + super(GELayerS2, self).__init__() + mid_chan = in_chan * exp_ratio + self.conv1 = ConvBNReLU(in_chan, in_chan, 3, stride=1) + self.dwconv1 = nn.Sequential( + nn.Conv2d( + in_chan, mid_chan, kernel_size=3, stride=2, + padding=1, groups=in_chan, bias=False), + nn.BatchNorm2d(mid_chan), + ) + self.dwconv2 = nn.Sequential( + nn.Conv2d( + mid_chan, mid_chan, kernel_size=3, stride=1, + padding=1, groups=mid_chan, bias=False), + nn.BatchNorm2d(mid_chan), + nn.ReLU(inplace=True), # not shown in paper + ) + self.conv2 = nn.Sequential( + nn.Conv2d( + mid_chan, out_chan, kernel_size=1, stride=1, + padding=0, bias=False), + nn.BatchNorm2d(out_chan), + ) + self.conv2[1].last_bn = True + self.shortcut = nn.Sequential( + nn.Conv2d( + in_chan, in_chan, kernel_size=3, stride=2, + padding=1, groups=in_chan, bias=False), + nn.BatchNorm2d(in_chan), + nn.Conv2d( + in_chan, out_chan, kernel_size=1, stride=1, + padding=0, bias=False), + nn.BatchNorm2d(out_chan), + ) + self.relu = nn.ReLU(inplace=True) + + def forward(self, x): + feat = self.conv1(x) + feat = self.dwconv1(feat) + feat = self.dwconv2(feat) + feat = self.conv2(feat) + shortcut = self.shortcut(x) + feat = feat + shortcut + feat = self.relu(feat) + return feat + + +class SegmentBranch(nn.Module): + + def __init__(self): + super(SegmentBranch, self).__init__() + self.S1S2 = StemBlock() + self.S3 = nn.Sequential( + GELayerS2(16, 32), + GELayerS1(32, 32), + ) + self.S4 = nn.Sequential( + GELayerS2(32, 64), + GELayerS1(64, 64), + ) + self.S5_4 = nn.Sequential( + GELayerS2(64, 128), + GELayerS1(128, 128), + GELayerS1(128, 128), + GELayerS1(128, 128), + ) + self.S5_5 = CEBlock() + + def forward(self, x): + feat2 = self.S1S2(x) + feat3 = self.S3(feat2) + feat4 = self.S4(feat3) + feat5_4 = self.S5_4(feat4) + feat5_5 = self.S5_5(feat5_4) + return feat2, feat3, feat4, feat5_4, feat5_5 + + +class BGALayer(nn.Module): + + def __init__(self): + super(BGALayer, self).__init__() + self.left1 = nn.Sequential( + nn.Conv2d( + 128, 128, kernel_size=3, stride=1, + padding=1, groups=128, bias=False), + nn.BatchNorm2d(128), + nn.Conv2d( + 128, 128, kernel_size=1, stride=1, + padding=0, bias=False), + ) + self.left2 = nn.Sequential( + nn.Conv2d( + 128, 128, kernel_size=3, stride=2, + padding=1, bias=False), + nn.BatchNorm2d(128), + nn.AvgPool2d(kernel_size=3, stride=2, padding=1, ceil_mode=False) + ) + self.right1 = nn.Sequential( + nn.Conv2d( + 128, 128, kernel_size=3, stride=1, + padding=1, bias=False), + nn.BatchNorm2d(128), + ) + self.right2 = nn.Sequential( + nn.Conv2d( + 128, 128, kernel_size=3, stride=1, + padding=1, groups=128, bias=False), + nn.BatchNorm2d(128), + nn.Conv2d( + 128, 128, kernel_size=1, stride=1, + padding=0, bias=False), + ) + self.up1 = nn.Upsample(scale_factor=4) + self.up2 = nn.Upsample(scale_factor=4) + ##TODO: does this really has no relu? + self.conv = nn.Sequential( + nn.Conv2d( + 128, 128, kernel_size=3, stride=1, + padding=1, bias=False), + nn.BatchNorm2d(128), + nn.ReLU(inplace=True), # not shown in paper + ) + + def forward(self, x_d, x_s): + dsize = x_d.size()[2:] + left1 = self.left1(x_d) + left2 = self.left2(x_d) + right1 = self.right1(x_s) + right2 = self.right2(x_s) + right1 = self.up1(right1) + left = left1 * torch.sigmoid(right1) + right = left2 * torch.sigmoid(right2) + right = self.up2(right) + out = self.conv(left + right) + return out + + + +class SegmentHead(nn.Module): + + def __init__(self, in_chan, mid_chan, n_classes, up_factor=8, aux=True): + super(SegmentHead, self).__init__() + self.conv = ConvBNReLU(in_chan, mid_chan, 3, stride=1) + self.drop = nn.Dropout(0.1) + self.up_factor = up_factor + + out_chan = n_classes + mid_chan2 = up_factor * up_factor if aux else mid_chan + up_factor = up_factor // 2 if aux else up_factor + self.conv_out = nn.Sequential( + nn.Sequential( + nn.Upsample(scale_factor=2), + ConvBNReLU(mid_chan, mid_chan2, 3, stride=1) + ) if aux else nn.Identity(), + nn.Conv2d(mid_chan2, out_chan, 1, 1, 0, bias=True), + nn.Upsample(scale_factor=up_factor, mode='bilinear', align_corners=False) + ) + + def forward(self, x): + feat = self.conv(x) + feat = self.drop(feat) + feat = self.conv_out(feat) + return feat + + +class BiSeNetV2(nn.Module): + + def __init__(self, n_classes, aux_mode='train'): + super(BiSeNetV2, self).__init__() + self.aux_mode = aux_mode + self.detail = DetailBranch() + self.segment = SegmentBranch() + self.bga = BGALayer() + + ## TODO: what is the number of mid chan ? + self.head = SegmentHead(128, 1024, n_classes, up_factor=8, aux=False) + if self.aux_mode == 'train': + self.aux2 = SegmentHead(16, 128, n_classes, up_factor=4) + self.aux3 = SegmentHead(32, 128, n_classes, up_factor=8) + self.aux4 = SegmentHead(64, 128, n_classes, up_factor=16) + self.aux5_4 = SegmentHead(128, 128, n_classes, up_factor=32) + + self.init_weights() + + def forward(self, x): + size = x.size()[2:] + feat_d = self.detail(x) + feat2, feat3, feat4, feat5_4, feat_s = self.segment(x) + feat_head = self.bga(feat_d, feat_s) + + logits = self.head(feat_head) + if self.aux_mode == 'train': + logits_aux2 = self.aux2(feat2) + logits_aux3 = self.aux3(feat3) + logits_aux4 = self.aux4(feat4) + logits_aux5_4 = self.aux5_4(feat5_4) + return logits, logits_aux2, logits_aux3, logits_aux4, logits_aux5_4 + elif self.aux_mode == 'eval': + return logits, + elif self.aux_mode == 'pred': + pred = logits.argmax(dim=1) + return pred + else: + raise NotImplementedError + + def init_weights(self): + for name, module in self.named_modules(): + if isinstance(module, (nn.Conv2d, nn.Linear)): + nn.init.kaiming_normal_(module.weight, mode='fan_out') + if not module.bias is None: nn.init.constant_(module.bias, 0) + elif isinstance(module, nn.modules.batchnorm._BatchNorm): + if hasattr(module, 'last_bn') and module.last_bn: + nn.init.zeros_(module.weight) + else: + nn.init.ones_(module.weight) + nn.init.zeros_(module.bias) + self.load_pretrain() + + + def load_pretrain(self): + state = modelzoo.load_url(backbone_url) + for name, child in self.named_children(): + if name in state.keys(): + child.load_state_dict(state[name], strict=True) + + def get_params(self): + def add_param_to_list(mod, wd_params, nowd_params): + for param in mod.parameters(): + if param.dim() == 1: + nowd_params.append(param) + elif param.dim() == 4: + wd_params.append(param) + else: + print(name) + + wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params = [], [], [], [] + for name, child in self.named_children(): + if 'head' in name or 'aux' in name: + add_param_to_list(child, lr_mul_wd_params, lr_mul_nowd_params) + else: + add_param_to_list(child, wd_params, nowd_params) + return wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params + + + +if __name__ == "__main__": + # x = torch.randn(16, 3, 1024, 2048) + # detail = DetailBranch() + # feat = detail(x) + # print('detail', feat.size()) + # + # x = torch.randn(16, 3, 1024, 2048) + # stem = StemBlock() + # feat = stem(x) + # print('stem', feat.size()) + # + # x = torch.randn(16, 128, 16, 32) + # ceb = CEBlock() + # feat = ceb(x) + # print(feat.size()) + # + # x = torch.randn(16, 32, 16, 32) + # ge1 = GELayerS1(32, 32) + # feat = ge1(x) + # print(feat.size()) + # + # x = torch.randn(16, 16, 16, 32) + # ge2 = GELayerS2(16, 32) + # feat = ge2(x) + # print(feat.size()) + # + # left = torch.randn(16, 128, 64, 128) + # right = torch.randn(16, 128, 16, 32) + # bga = BGALayer() + # feat = bga(left, right) + # print(feat.size()) + # + # x = torch.randn(16, 128, 64, 128) + # head = SegmentHead(128, 128, 19) + # logits = head(x) + # print(logits.size()) + # + # x = torch.randn(16, 3, 1024, 2048) + # segment = SegmentBranch() + # feat = segment(x)[0] + # print(feat.size()) + # + x = torch.randn(16, 3, 1024, 2048) + model = BiSeNetV2(n_classes=19) + outs = model(x) + for out in outs: + print(out.size()) + # print(logits.size()) + + # for name, param in model.named_parameters(): + # if len(param.size()) == 1: + # print(name) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/resnet.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/resnet.py new file mode 100755 index 0000000000000000000000000000000000000000..7b039ed73f9d38f16ee93f62a62aebdd94b3bca8 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/models/resnet.py @@ -0,0 +1,113 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.utils.model_zoo as modelzoo + +resnet18_url = 'https://download.pytorch.org/models/resnet18-5c106cde.pth' + + +from torch.nn import BatchNorm2d + + +def conv3x3(in_planes, out_planes, stride=1): + """3x3 convolution with padding""" + return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, + padding=1, bias=False) + + +class BasicBlock(nn.Module): + def __init__(self, in_chan, out_chan, stride=1): + super(BasicBlock, self).__init__() + self.conv1 = conv3x3(in_chan, out_chan, stride) + self.bn1 = BatchNorm2d(out_chan) + self.conv2 = conv3x3(out_chan, out_chan) + self.bn2 = BatchNorm2d(out_chan) + self.relu = nn.ReLU(inplace=True) + self.downsample = None + if in_chan != out_chan or stride != 1: + self.downsample = nn.Sequential( + nn.Conv2d(in_chan, out_chan, + kernel_size=1, stride=stride, bias=False), + BatchNorm2d(out_chan), + ) + + def forward(self, x): + residual = self.conv1(x) + residual = self.bn1(residual) + residual = self.relu(residual) + residual = self.conv2(residual) + residual = self.bn2(residual) + + shortcut = x + if self.downsample is not None: + shortcut = self.downsample(x) + + out = shortcut + residual + out = self.relu(out) + return out + + +def create_layer_basic(in_chan, out_chan, bnum, stride=1): + layers = [BasicBlock(in_chan, out_chan, stride=stride)] + for i in range(bnum-1): + layers.append(BasicBlock(out_chan, out_chan, stride=1)) + return nn.Sequential(*layers) + + +class Resnet18(nn.Module): + def __init__(self): + super(Resnet18, self).__init__() + self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, + bias=False) + self.bn1 = BatchNorm2d(64) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = create_layer_basic(64, 64, bnum=2, stride=1) + self.layer2 = create_layer_basic(64, 128, bnum=2, stride=2) + self.layer3 = create_layer_basic(128, 256, bnum=2, stride=2) + self.layer4 = create_layer_basic(256, 512, bnum=2, stride=2) + self.init_weight() + + def forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + x = self.maxpool(x) + + x = self.layer1(x) + feat8 = self.layer2(x) # 1/8 + feat16 = self.layer3(feat8) # 1/16 + feat32 = self.layer4(feat16) # 1/32 + return feat8, feat16, feat32 + + def init_weight(self): + state_dict = modelzoo.load_url(resnet18_url) + self_state_dict = self.state_dict() + for k, v in state_dict.items(): + if 'fc' in k: continue + self_state_dict.update({k: v}) + self.load_state_dict(self_state_dict) + + def get_params(self): + wd_params, nowd_params = [], [] + for name, module in self.named_modules(): + if isinstance(module, (nn.Linear, nn.Conv2d)): + wd_params.append(module.weight) + if not module.bias is None: + nowd_params.append(module.bias) + elif isinstance(module, nn.modules.batchnorm._BatchNorm): + nowd_params += list(module.parameters()) + return wd_params, nowd_params + + +if __name__ == "__main__": + net = Resnet18() + x = torch.randn(16, 3, 224, 224) + out = net(x) + print(out[0].size()) + print(out[1].size()) + print(out[2].size()) + net.get_params() diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/lib/ohem_ce_loss.py b/cv/semantic_segmentation/bisenetv2/pytorch/lib/ohem_ce_loss.py new file mode 100755 index 0000000000000000000000000000000000000000..850a9cb00626146ea2c6376450b2c99681832b1d --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/lib/ohem_ce_loss.py @@ -0,0 +1,46 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + + +import torch +import torch.nn as nn +import torch.nn.functional as F + + +# import ohem_cpp +# class OhemCELoss(nn.Module): +# +# def __init__(self, thresh, lb_ignore=255): +# super(OhemCELoss, self).__init__() +# self.score_thresh = thresh +# self.lb_ignore = lb_ignore +# self.criteria = nn.CrossEntropyLoss(ignore_index=lb_ignore, reduction='mean') +# +# def forward(self, logits, labels): +# n_min = labels[labels != self.lb_ignore].numel() // 16 +# labels = ohem_cpp.score_ohem_label( +# logits, labels, self.lb_ignore, self.score_thresh, n_min).detach() +# loss = self.criteria(logits, labels) +# return loss + + +class OhemCELoss(nn.Module): + + def __init__(self, thresh, lb_ignore=255): + super(OhemCELoss, self).__init__() + self.thresh = -torch.log(torch.tensor(thresh, requires_grad=False, dtype=torch.float)).cuda() + self.lb_ignore = lb_ignore + self.criteria = nn.CrossEntropyLoss(ignore_index=lb_ignore, reduction='none') + + def forward(self, logits, labels): + n_min = labels[labels != self.lb_ignore].numel() // 16 + loss = self.criteria(logits, labels).view(-1) + loss_hard = loss[loss > self.thresh] + if loss_hard.numel() < n_min: + loss_hard, _ = loss.topk(n_min) + return torch.mean(loss_hard) + + +if __name__ == '__main__': + pass + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/CMakeLists.txt b/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/CMakeLists.txt new file mode 100755 index 0000000000000000000000000000000000000000..a6e80ad1bceea6aae2601ee4428f187e924dc3d9 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/CMakeLists.txt @@ -0,0 +1,16 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.15) + +PROJECT(segment) + +set(CMAKE_CXX_FLAGS "-std=c++14 -O2") + + +set (ncnn_DIR ${NCNN_ROOT}/lib/cmake/ncnn) +find_package(OpenCV REQUIRED) +find_package(OpenMP REQUIRED) +find_package(ncnn REQUIRED) + + +add_executable(segment segment.cpp) +target_include_directories(segment PUBLIC ${OpenCV_INCLUDE_DIRS}) +target_link_libraries(segment ${OpenCV_LIBRARIES} ncnn OpenMP::OpenMP_CXX) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/README.md b/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/README.md new file mode 100755 index 0000000000000000000000000000000000000000..fb27b93ac23919dab138162ce3eed6630bfbed4a --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/README.md @@ -0,0 +1,80 @@ + +### My platform + +* raspberry pi 3b +* 2022-04-04-raspios-bullseye-armhf-lite.img +* cpu: 4 core armv8, memory: 1G + + + +### Install ncnn + +Just follow the ncnn official tutoral of [build-for-linux](https://github.com/Tencent/ncnn/wiki/how-to-build#build-for-linux) to install ncnn. Following steps are all carried out on my raspberry pi: + +**step 1:** install dependencies +``` +$ sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libopencv-dev +``` + +**step 2:** (optional) install vulkan + +**step 3:** build +I am using commit `6869c81ed3e7170dc0`, and I have not tested over other commits. +``` +$ git clone https://github.com/Tencent/ncnn.git +$ cd ncnn +$ git reset --hard 6869c81ed3e7170dc0 +$ git submodule update --init +$ mkdir -p build +$ cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=OFF -DNCNN_BUILD_TOOLS=ON -DCMAKE_TOOLCHAIN_FILE=../toolchains/pi3.toolchain.cmake .. +$ make -j2 +$ make install +``` + +### Convert pytorch model to ncnn model + +#### 1. dependencies +``` +$ python -m pip install onnx-simplifier +``` + +#### 2. convert pytorch model to ncnn model via onnx +On your training platform: +``` +$ cd BiSeNet/ +$ python tools/export_onnx.py --aux-mode eval --config configs/bisenetv2_city.py --weight-path /path/to/your/model.pth --outpath ./model_v2.onnx +$ python -m onnxsim model_v2.onnx model_v2_sim.onnx +``` + +Then copy your `model_v2_sim.onnx` from training platform to raspberry device. + +On raspberry device: +``` +$ /path/to/ncnn/build/tools/onnx/onnx2ncnn model_v2_sim.onnx model_v2_sim.param model_v2_sim.bin +``` + +You can optimize the ncnn model by fusing the layers and save the weights with fp16 datatype. +On raspberry device: +``` +$ /path/to/ncnn/build/tools/ncnnoptimize model_v2_sim.param model_v2_sim.bin model_v2_sim_opt.param model_v2_sim_opt.bin 65536 +$ mv model_v2_sim_opt.param model_v2_sim.param +$ mv model_v2_sim_opt.bin model_v2_sim.bin +``` + +You can also quantize the model for int8 inference, following this [tutorial](https://github.com/Tencent/ncnn/wiki/quantized-int8-inference). Make sure your device support int8 inference. + + +### build and run the demo +#### 1. compile demo code +On raspberry device: +``` +$ mkdir -p BiSeNet/ncnn/build +$ cd BiSeNet/ncnn/build +$ cmake .. -DNCNN_ROOT=/path/to/ncnn/build/install +$ make +``` + +#### 2. run demo +``` +./segment +``` diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/segment.cpp b/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/segment.cpp new file mode 100755 index 0000000000000000000000000000000000000000..e570b099530928afee088f01c4ed0825de64ae04 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/ncnn/segment.cpp @@ -0,0 +1,141 @@ + +#include "net.h" +#include "mat.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + + +using std::string; +using std::vector; +using cv::Mat; + + +vector> get_color_map(); +void inference(); + + +int main(int argc, char** argv) { + inference(); + return 0; +} + + +void inference() { + int nthreads = 4; + string mod_param = "../models/model_v2_sim.param"; + string mod_model = "../models/model_v2_sim.bin"; + int oH{512}, oW{1024}, n_classes{19}; + float mean[3] = {0.3257f, 0.3690f, 0.3223f}; + float var[3] = {0.2112f, 0.2148f, 0.2115f}; + string impth = "../../example.png"; + string savepth = "out.png"; + + // load model + ncnn::Net mod; +#if NCNN_VULKAN + int gpu_count = ncnn::get_gpu_count(); + if (gpu_count <= 0) { + fprintf(stderr, "we do not have gpu device\n"); + return; + } + mod.opt.use_vulkan_compute = 1; + mod.set_vulkan_device(1); +#endif + //// switch off fp16 + // bool use_fp16 = false; + // mod.opt.use_fp16_packed = use_fp16; + // mod.opt.use_fp16_storage = use_fp16; + // mod.opt.use_fp16_arithmetic = use_fp16; + //// switch on bf16 + // mod.opt.use_packing_layout = true; + // mod.opt.use_ff16_storage = true; + //// reduce cpu usage + // net.opt.openmp_blocktime = 0; + mod.opt.use_winograd_convolution = true; + + // we should set opt before load model + mod.load_param(mod_param.c_str()); + mod.load_model(mod_model.c_str()); + + // load image, and copy to ncnn mat + cv::Mat im = cv::imread(impth); + if (im.empty()) { + fprintf(stderr, "cv::imread failed\n"); + return; + } + + ncnn::Mat inp = ncnn::Mat::from_pixels_resize( + im.data, ncnn::Mat::PIXEL_BGR, im.cols, im.rows, oW, oH); + for (float &el : mean) el *= 255.; + for (float &el : var) el = 1. / (255. * el); + inp.substract_mean_normalize(mean, var); + + // set input, run, get output + ncnn::Extractor ex = mod.create_extractor(); + ex.set_light_mode(true); + ex.set_num_threads(nthreads); +#if NCNN_VULKAN + ex.set_vulkan_compute(true); +#endif + + ex.input("input_image", inp); + ncnn::Mat out; + ex.extract("preds", out); // output is nchw, as onnx, where here n=1 + + // generate colorful output, and dump + vector> color_map = get_color_map(); + Mat pred(cv::Size(oW, oH), CV_8UC3); + int offset = oH * oW; + omp_set_num_threads(omp_get_max_threads()); + #pragma omp parallel for + for (int i=0; i < oH; ++i) { + uint8_t *ptr = pred.ptr(i); + for (int j{0}; j < oW; ++j) { + // compute argmax + int idx, argmax{0}; + float max; + idx = i * oW + j; + max = out[idx]; + for (int k{1}; k < n_classes; ++k) { + idx += offset; + if (max < out[idx]) { + max = out[idx]; + argmax = k; + } + } + // color the result + ptr[0] = color_map[argmax][0]; + ptr[1] = color_map[argmax][1]; + ptr[2] = color_map[argmax][2]; + ptr += 3; + } + } + cv::imwrite(savepth, pred); + + ex.clear(); // must have this, or error + mod.clear(); + +} + + +vector> get_color_map() { + vector> color_map(256, vector(3)); + std::minstd_rand rand_eng(123); + std::uniform_int_distribution u(0, 255); + for (int i{0}; i < 256; ++i) { + for (int j{0}; j < 3; ++j) { + color_map[i][j] = u(rand_eng); + } + } + return color_map; +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/openvino/CMakeLists.txt b/cv/semantic_segmentation/bisenetv2/pytorch/openvino/CMakeLists.txt new file mode 100755 index 0000000000000000000000000000000000000000..a5db3df353567b58eb1475bc878e15ce138786e1 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/openvino/CMakeLists.txt @@ -0,0 +1,35 @@ + +cmake_minimum_required (VERSION 3.10) + +cmake_policy(SET CMP0025 NEW) + +project(Samples) + + +set (CMAKE_CXX_STANDARD 14) +set(CMAKE_BUILD_TYPE "Release") +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Winit-self") +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") + + +find_package(OpenCV REQUIRED) +find_package(InferenceEngine REQUIRED) +find_package(ngraph REQUIRED) + + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${OpenCV_INCLUDE_DIRS} +) + +add_executable(segment main.cpp) +target_link_libraries( + segment + ${InferenceEngine_LIBRARIES} + ${NGRAPH_LIBRARIES} + ${OpenCV_LIBS} +) + + + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/openvino/README.md b/cv/semantic_segmentation/bisenetv2/pytorch/openvino/README.md new file mode 100755 index 0000000000000000000000000000000000000000..0f1eda8e5230ef74148d16f20e81933d123fe047 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/openvino/README.md @@ -0,0 +1,99 @@ + + +## A demo of using openvino to deploy + +Openvino is used to deploy model on intel cpus or "gpu inside cpu". + +My platform: +* Ubuntu 18.04 +* Intel(R) Xeon(R) Gold 6240 CPU @ 2.60GHz +* openvino_2021.4.689 + + +### preparation + +1.Train the model and export it to onnx +``` +$ cd BiSeNet/ +$ python tools/export_onnx.py --config configs/bisenetv2_city.py --weight-path /path/to/your/model.pth --outpath ./model_v2.onnx +``` +(Optional) 2.Install 'onnx-simplifier' to simplify the generated onnx model: +``` +$ python -m pip install onnx-simplifier +$ python -m onnxsim model_v2.onnx model_v2_sim.onnx +``` + + +### Install and configure openvino + +1.pull docker image +``` +$ docker pull openvino/ubuntu18_dev +``` + +2.start a docker container and mount code into it +``` +$ docker run -itu root -v /path/to/BiSeNet:/BiSeNet openvino/ubuntu18_dev --device /dev/dri:/dev/dri bash + +``` +If your cpu does not have intel "gpu inside of cpu" or you do not want to use it, you can remove the option of `--device /dev/dri:/dev/dri`. + +After running the above command, you will be in the container. + +(optional) 3.install gpu dependencies +If you want to use gpu, you also need to install some dependencies inside the container: +``` +# mkdir -p /tmp/opencl && cd /tmp/opencl +# useradd -ms /bin/bash -G video,users openvino +# chown openvino -R /home/openvino +# apt update +# apt install -y --no-install-recommends ocl-icd-libopencl1 +# curl -L "https://github.com/intel/compute-runtime/releases/download/19.41.14441/intel-gmmlib_19.3.2_amd64.deb" --output "intel-gmmlib_19.3.2_amd64.deb" +# curl -L "https://github.com/intel/compute-runtime/releases/download/19.41.14441/intel-igc-core_1.0.2597_amd64.deb" --output "intel-igc-core_1.0.2597_amd64.deb" +# curl -L "https://github.com/intel/compute-runtime/releases/download/19.41.14441/intel-igc-opencl_1.0.2597_amd64.deb" --output "intel-igc-opencl_1.0.2597_amd64.deb" +# curl -L "https://github.com/intel/compute-runtime/releases/download/19.41.14441/intel-opencl_19.41.14441_amd64.deb" --output "intel-opencl_19.41.14441_amd64.deb" +# curl -L "https://github.com/intel/compute-runtime/releases/download/19.41.14441/intel-ocloc_19.41.14441_amd64.deb" --output "intel-ocloc_19.04.12237_amd64.deb" +# dpkg -i /tmp/opencl/*.deb +# apt --fix-broken install +# ldconfig +``` + +I got the above commands from the official docs but I did not test it since my cpu does not have integrated gpu. + +You can check if your platform has intel gpu with this command: +``` +$ sudo lspci | grep -i vga +``` + +4.configure environment +just run this script, and the environment would be ready: +``` +# source /opt/intel/openvino_2021.4.689/bin/setupvars.sh +``` + + +### convert model and run demo + +1.convert onnx to openvino IR +In the docker container: +``` +# cd /opt/intel/openvino_2021.4.689/deployment_tools/model_optimizer +# python3 mo.py --input_model /BiSeNet/model_v2.onnx --output_dir /BiSeNet/openvino/output_v2 +``` + +2.compile and run the demo +``` +# cd /BiSeNet/openvino +# mkdir -p build && cd build +# cmake .. && make +# ./segment +``` +After this, you will see a segmentation result image named `res.jpg` generated. + + + +### Tipes + +1. GPU support: openvino supports intel cpu and intel "gpu inside cpu". Until now(2021.11), other popular isolated gpus are not supported, such as nvidia/amd gpus. Also, other integrated gpus are not supported, such as aspeed graphics family. + +2. About low-precision: precision is optimized automatically, and the model will be run in one or several precision mode. We can also manually enforce to use bf16, as long as our cpu have `avx512_bf16` supports. If cpu does not support bf16, it will use simulation which would slow down the inference. If neither native bf16 nor simulation is supported, an error would occur. diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/openvino/main.cpp b/cv/semantic_segmentation/bisenetv2/pytorch/openvino/main.cpp new file mode 100755 index 0000000000000000000000000000000000000000..96342de50f856b386fca3d7808528608a6c0255e --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/openvino/main.cpp @@ -0,0 +1,226 @@ + +#include +#include +#include +#include +#include + +#include +#include + + +std::string mdpth("../output_v2/model_v2_city.xml"); +std::string device("CPU"); // GNA does not support argmax, my cpu does not has integrated gpu +std::string impth("../../example.png"); +std::string savepth("./res.jpg"); + + + +void get_image(std::string, std::vector, float*); +std::vector> get_color_map(); +void save_predict(std::string, int*, + std::vector, std::vector); +void print_infos(); +void inference(); +void test_speed(); + + +int main() { + // print_infos(); + inference(); + // test_speed(); + return 0; +} + + +void inference() { + + // model setup + std::cout << "load network: " << mdpth << std::endl; + InferenceEngine::Core ie; + InferenceEngine::CNNNetwork model = ie.ReadNetwork(mdpth); + model.setBatchSize(1U); + + InferenceEngine::InputsDataMap inputs(model.getInputsInfo()); + InferenceEngine::InputInfo::Ptr input_info = inputs.begin()->second; + input_info->setPrecision(InferenceEngine::Precision::FP32); + input_info->setLayout(InferenceEngine::Layout::NCHW); + + InferenceEngine::DataPtr output_info = model.getOutputsInfo().begin()->second; + output_info->setPrecision(InferenceEngine::Precision::I32); + + + InferenceEngine::ExecutableNetwork network = ie.LoadNetwork(model, device); + InferenceEngine::InferRequest infer_request = network.CreateInferRequest(); + + + // set input data + std::cout << "set input data from: " << impth << std::endl; + std::string in_name = inputs.begin()->first; + auto insize = input_info->getTensorDesc().getDims(); + + InferenceEngine::Blob::Ptr inblob = infer_request.GetBlob(in_name); + InferenceEngine::MemoryBlob::Ptr minput = InferenceEngine::as(inblob); + if (!minput) { + std::cerr << "We expect MemoryBlob from inferRequest, but by fact we " + "were not able to cast inputBlob to MemoryBlob" + << std::endl; + std::abort(); + } + auto minputHolder = minput->wmap(); + float* p_inp = minputHolder.as(); + + get_image(impth, insize, p_inp); + + + // inference synchronized + std::cout << "do inference " << std::endl; + infer_request.Infer(); + + + // fetch output data + std::cout << "save result to: " << savepth << std::endl; + std::string out_name = model.getOutputsInfo().begin()->first; + auto outsize = output_info->getTensorDesc().getDims(); + InferenceEngine::Blob::Ptr outblob = infer_request.GetBlob(out_name); + InferenceEngine::MemoryBlob::Ptr moutput = InferenceEngine::as(outblob); + auto moutputHolder = moutput->rmap(); + int* p_outp = moutputHolder.as(); + + save_predict(savepth, p_outp, insize, outsize); + +} + + +void get_image(std::string impth, std::vector insize, float* data) { + int iH = insize[2]; + int iW = insize[3]; + cv::Mat im = cv::imread(impth); + if (im.empty()) { + std::cerr << "cv::imread failed: " << impth << std::endl; + std::abort(); + } + int orgH{im.rows}, orgW{im.cols}; + if ((orgH != iH) || orgW != iW) { + std::cout << "resize orignal image of (" << orgH << "," << orgW + << ") to (" << iH << ", " << iW << ") according to model requirement\n"; + cv::resize(im, im, cv::Size(iW, iH), cv::INTER_CUBIC); + } + + float mean[3] = {0.3257f, 0.3690f, 0.3223f}; + float var[3] = {0.2112f, 0.2148f, 0.2115f}; + float scale = 1.f / 255.f; + for (float &el : var) el = 1.f / el; + for (int h{0}; h < iH; ++h) { + cv::Vec3b *p = im.ptr(h); + for (int w{0}; w < iW; ++w) { + for (int c{0}; c < 3; ++c) { + int idx = (2 - c) * iH * iW + h * iW + w; // to rgb order + data[idx] = (p[w][c] * scale - mean[c]) * var[c]; + } + } + } +} + + +std::vector> get_color_map() { + std::vector> color_map(256, + std::vector(3)); + std::minstd_rand rand_eng(123); + std::uniform_int_distribution u(0, 255); + for (int i{0}; i < 256; ++i) { + for (int j{0}; j < 3; ++j) { + color_map[i][j] = u(rand_eng); + } + } + return color_map; +} + + +void save_predict(std::string savename, int* data, + std::vector insize, + std::vector outsize) { + + std::vector> color_map = get_color_map(); + int oH = outsize[1]; + int oW = outsize[2]; + cv::Mat pred(cv::Size(oW, oH), CV_8UC3); + int idx{0}; + for (int i{0}; i < oH; ++i) { + uint8_t *ptr = pred.ptr(i); + for (int j{0}; j < oW; ++j) { + ptr[0] = color_map[data[idx]][0]; + ptr[1] = color_map[data[idx]][1]; + ptr[2] = color_map[data[idx]][2]; + ptr += 3; + ++idx; + } + } + cv::imwrite(savename, pred); +} + + +void print_infos() { + + InferenceEngine::Core ie; + // ie.SetConfig({{CONFIG_KEY(ENFORCE_BF16), CONFIG_VALUE(YES)}}, "CPU"); + InferenceEngine::CNNNetwork model = ie.ReadNetwork(mdpth); + InferenceEngine::ExecutableNetwork network = ie.LoadNetwork(model, device); + + auto inp = model.getInputsInfo().begin(); + auto insize = inp->second->getTensorDesc().getDims(); + auto outp = model.getOutputsInfo().begin(); + auto outsize = outp->second->getTensorDesc().getDims(); + + std::cout << "----- supported optimizations ----- \n"; + auto cpuOptimizationCapabilities = ie.GetMetric("CPU", METRIC_KEY(OPTIMIZATION_CAPABILITIES)).as>(); + for (auto &el:cpuOptimizationCapabilities) { + std::cout << " " << el << std::endl; + } + + // std::string enforceBF16 = network.GetConfig(InferenceEngine::PluginConfigParams::KEY_ENFORCE_BF16).as(); + // std::cout << "support BF16" << enforceBF16 << std::endl; + + std::cout << "\n----- model info -----\n"; + std::cout << " model batchsize: " << model.getBatchSize() << std::endl; + std::cout << " input name: " << inp->first << std::endl; + std::cout << " input size: (" + << insize[0] << ", " + << insize[1] << ", " + << insize[2] << ", " + << insize[3] << ") \n"; + std::cout << " output name: " << model.getOutputsInfo().begin()->first << std::endl; + std::cout << " output size: (" + << outsize[0] << ", " + << outsize[1] << ", " + << outsize[2] << ") \n"; + std::cout << "----------------------\n\n"; +} + + + +void test_speed() { + + std::cout << "load network: " << mdpth << std::endl; + InferenceEngine::Core ie; + /* if we enforce using bf16 and platform does not support avx512_bf16, then simulation would be used which would drag down speed. If simulation is not supported, there would be exception. */ + // ie.SetConfig({{CONFIG_KEY(ENFORCE_BF16), CONFIG_VALUE(YES)}}, "CPU"); + InferenceEngine::CNNNetwork model = ie.ReadNetwork(mdpth); + model.setBatchSize(1U); + InferenceEngine::ExecutableNetwork network = ie.LoadNetwork(model, device); + InferenceEngine::InferRequest infer_request = network.CreateInferRequest(); + + + std::cout << "test speed ... \n"; + const int n_loops{500}; + auto start = std::chrono::steady_clock::now(); + for (int i{0}; i < n_loops; ++i) { + infer_request.Infer(); + } + auto end = std::chrono::steady_clock::now(); + double duration = std::chrono::duration(end - start).count(); + duration /= 1000.; + std::cout << "running " << n_loops << " times, use time: " + << duration << "s" << std::endl; + std::cout << "fps is: " << static_cast(n_loops) / duration << std::endl; +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/requirements.txt b/cv/semantic_segmentation/bisenetv2/pytorch/requirements.txt new file mode 100755 index 0000000000000000000000000000000000000000..819a3d3f83e10330b7af273c89070727f2fbc097 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/requirements.txt @@ -0,0 +1,2 @@ +tabulate +urllib=1.25.10 diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/CMakeLists.txt b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/CMakeLists.txt new file mode 100755 index 0000000000000000000000000000000000000000..8ffbd39ebb69a72c1d781ce58bc7b4aabb8416bc --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/CMakeLists.txt @@ -0,0 +1,27 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 3.17) + +PROJECT(segment) + +set(CMAKE_CXX_FLAGS "-std=c++14 -O2") +set(CMAKE_NVCC_FLAGS "-std=c++14 -O2") + + +link_directories(/usr/local/cuda/lib64) +link_directories(${PROJECT_SOURCE_DIR}/build) +# include_directories(/root/build/TensorRT-8.2.5.1/include) +# link_directories(/root/build/TensorRT-8.2.5.1/lib) + + +find_package(CUDA REQUIRED) +find_package(OpenCV REQUIRED) + +cuda_add_library(kernels STATIC kernels.cu) + +add_executable(segment segment.cpp trt_dep.cpp read_img.cpp) +target_include_directories( + segment PUBLIC ${CUDA_INCLUDE_DIRS} ${CUDNN_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS}) +target_link_libraries( + segment -lnvinfer -lnvinfer_plugin -lnvparsers -lnvonnxparser -lkernels + ${CUDA_LIBRARIES} + ${OpenCV_LIBRARIES}) + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/README.md b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/README.md new file mode 100755 index 0000000000000000000000000000000000000000..4dafb11ff7cb93bb6c516073291a695b3cd6d319 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/README.md @@ -0,0 +1,112 @@ + + +## Deploy with Tensorrt + +Firstly, We should export our trained model to onnx model: +``` +$ cd BiSeNet/ +$ python tools/export_onnx.py --config configs/bisenetv2_city.py --weight-path /path/to/your/model.pth --outpath ./model.onnx --aux-mode eval +``` + +**NOTE:** I use cropsize of `1024x2048` here in my example, you should change it according to your specific application. The inference cropsize is fixed from this step on, so you should decide the inference cropsize when you export the model here. + +Then we can use either c++ or python to compile the model and run inference. + + +### Using C++ + +#### 1. My platform + +* ubuntu 18.04 +* nvidia Tesla T4 gpu, driver newer than 450.80 +* cuda 11.3, cudnn 8 +* cmake 3.22.0 +* opencv built from source +* tensorrt 8.2.5.1 + + + +#### 2. Build with source code +Just use the standard cmake build method: +``` +mkdir -p tensorrt/build +cd tensorrt/build +cmake .. +make +``` +This would generate a `./segment` in the `tensorrt/build` directory. + + +#### 3. Convert onnx to tensorrt model +If you can successfully compile the source code, you can parse the onnx model to tensorrt model with one of the following commands. +For fp32, command is: +``` +$ ./segment compile /path/to/onnx.model /path/to/saved_model.trt +``` +If your gpu support acceleration with fp16 inferenece, you can add a `--fp16` option to in this step: +``` +$ ./segment compile /path/to/onnx.model /path/to/saved_model.trt --fp16 +``` +Building an int8 engine is also supported. Firstly, you should make sure your gpu support int8 inference, or you model will not be faster than fp16/fp32. Then you should prepare certain amount of images for int8 calibration. In this example, I use train set of cityscapes for calibration. The command is like this: +``` +$ rm calibrate_int8 # delete this if exists +$ ./segment compile /path/to/onnx.model /path/to/saved_model.trt --int8 /path/to/BiSeNet/datasets/cityscapes /path/to/BiSeNet/datasets/cityscapes/train.txt +``` +With the above commands, we will have an tensorrt engine named `saved_model.trt` generated. + +Note that I use the simplest method to parse the command line args, so please do **Not** change the order of the args in above command. + + +#### 4. Infer with one single image +Run inference like this: +``` +$ ./segment run /path/to/saved_model.trt /path/to/input/image.jpg /path/to/saved_img.jpg +``` + + +#### 5. Test speed +The speed depends on the specific gpu platform you are working on, you can test the fps on your gpu like this: +``` +$ ./segment test /path/to/saved_model.trt +``` + + +#### 6. Tips: +1. ~Since tensorrt 7.0.0 cannot parse well the `bilinear interpolation` op exported from pytorch, I replace them with pytorch `nn.PixelShuffle`, which would bring some performance overhead(more flops and parameters), and make inference a bit slower. Also due to the `nn.PixelShuffle` op, you **must** export the onnx model with input size to be *n* times of 32.~ +If you are using 7.2.3.4 or newer versions, you should not have problem with `interpolate` anymore. + +2. ~There would be some problem for tensorrt 7.0.0 to parse the `nn.AvgPool2d` op from pytorch with onnx opset11. So I use opset10 to export the model.~ +Likewise, you do not need to worry about this anymore with version newer than 7.2.3.4. + +3. The speed(fps) is tested on a single nvidia Tesla T4 gpu with `batchsize=1` and `cropsize=(1024,2048)`. Please note that T4 gpu is almost 2 times slower than 2080ti, you should evaluate the speed considering your own platform and cropsize. Also note that the performance would be affected if your gpu is concurrently working on other tasks. Please make sure no other program is running on your gpu when you test the speed. + +4. On my platform, after compiling with tensorrt, the model size of bisenetv1 is 29Mb(fp16) and 128Mb(fp32), and the size of bisenetv2 is 16Mb(fp16) and 42Mb(fp32). However, the fps of bisenetv1 is 68(fp16) and 23(fp32), while the fps of bisenetv2 is 59(fp16) and 21(fp32). It is obvious that bisenetv2 has fewer parameters than bisenetv1, but the speed is otherwise. I am not sure whether it is because tensorrt has worse optimization strategy in some ops used in bisenetv2(such as depthwise convolution) or because of the limitation of the gpu on different ops. Please tell me if you have better idea on this. + +5. int8 mode is not always greatly faster than fp16 mode. For example, I tested with bisenetv1-cityscapes and tensorrt 8.2.5.1. With v100 gpu and driver 515.65, the fp16/int8 fps is 185.89/186.85, while with t4 gpu and driver 450.80, it is 78.77/142.31. + + +### Using python + +You can also use python script to compile and run inference of your model. + + +#### 1. Compile model to onnx + +With this command: +``` +$ cd BiSeNet/tensorrt +$ python segment.py compile --onnx /path/to/model.onnx --savepth ./model.trt --quant fp16/fp32 +``` + +This will compile onnx model into tensorrt serialized engine, save save to `./model.trt`. + + +#### 2. Inference with Tensorrt + +Run Inference like this: +``` +$ python segment.py run --mdpth ./model.trt --impth ../example.png --outpth ./res.png +``` + +This will use the tensorrt model compiled above, and run inference with the example image. + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/batch_stream.hpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/batch_stream.hpp new file mode 100755 index 0000000000000000000000000000000000000000..09d0262316ebd96c81db7779cbf72e9cfcaf645b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/batch_stream.hpp @@ -0,0 +1,148 @@ + +#ifndef BATCH_STREAM_HPP +#define BATCH_STREAM_HPP + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "NvInfer.h" +#include "read_img.hpp" + +using nvinfer1::Dims; +using nvinfer1::Dims3; +using nvinfer1::Dims4; + + +class IBatchStream +{ +public: + virtual void reset(int firstBatch) = 0; + virtual bool next() = 0; + virtual void skip(int skipCount) = 0; + virtual float* getBatch() = 0; + virtual int getBatchesRead() const = 0; + virtual int getBatchSize() const = 0; + virtual nvinfer1::Dims4 getDims() const = 0; +}; + + +class BatchStream : public IBatchStream +{ +public: + BatchStream(int batchSize, int maxBatches, Dims indim, + const std::string& dataRoot, + const std::string& dataFile) + : mBatchSize{batchSize} + , mMaxBatches{maxBatches} + { + mDims = Dims3(indim.d[1], indim.d[2], indim.d[3]); + + readDataFile(dataFile, dataRoot); + mSampleSize = std::accumulate( + mDims.d, mDims.d + mDims.nbDims, 1, std::multiplies()) * sizeof(float); + mData.resize(mSampleSize * mBatchSize); + } + + void reset(int firstBatch) override + { + cout << "mBatchCount: " << mBatchCount << endl; + mBatchCount = firstBatch; + } + + bool next() override + { + if (mBatchCount >= mMaxBatches) + { + return false; + } + ++mBatchCount; + return true; + } + + void skip(int skipCount) override + { + mBatchCount += skipCount; + } + + float* getBatch() override + { + int offset = mBatchCount * mBatchSize; + for (int i{0}; i < mBatchSize; ++i) { + int ind = offset + i; + read_data(mPaths[ind], &mData[i * mSampleSize], mDims.d[1], mDims.d[2]); + } + return mData.data(); + } + + int getBatchesRead() const override + { + return mBatchCount; + } + + int getBatchSize() const override + { + return mBatchSize; + } + + nvinfer1::Dims4 getDims() const override + { + return Dims4{mBatchSize, mDims.d[0], mDims.d[1], mDims.d[2]}; + } + +private: + void readDataFile(const std::string& dataFilePath, const std::string& dataRootPath) + { + std::ifstream file(dataFilePath, std::ios::in); + if (!file.is_open()) { + cout << "file open failed: " << dataFilePath << endl; + std::abort(); + } + std::stringstream ss; + file >> ss.rdbuf(); + file.close(); + + std::string impth; + int n_imgs = 0; + while (std::getline(ss, impth)) ++n_imgs; + ss.clear(); ss.seekg(0, std::ios::beg); + if (n_imgs <= 0) { + cout << "ann file is empty, cannot read image paths for int8 calibration: " + << dataFilePath << endl; + std::abort(); + } + + mPaths.resize(n_imgs); + for (int i{0}; i < n_imgs; ++i) { + std::getline(ss, impth, ','); + mPaths[i] = dataRootPath + "/" + impth; + std::getline(ss, impth); + } + if (mMaxBatches < 0) { + mMaxBatches = n_imgs / mBatchSize - 1; + } + if (mMaxBatches <= 0) { + cout << "must have at least 1 batch for calibration\n"; + std::abort(); + } + cout << "mMaxBatches = " << mMaxBatches << endl; + } + + + int mBatchSize{0}; + int mBatchCount{0}; + int mMaxBatches{0}; + Dims3 mDims{}; + std::vector mPaths; + std::vector mData; + int mSampleSize{0}; +}; + + +#endif diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/entropy_calibrator.hpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/entropy_calibrator.hpp new file mode 100755 index 0000000000000000000000000000000000000000..bc72ba47d21bd3a42fb592cc318e8b38e658cc94 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/entropy_calibrator.hpp @@ -0,0 +1,160 @@ +/* + * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ENTROPY_CALIBRATOR_HPP +#define ENTROPY_CALIBRATOR_HPP + +#include +#include +#include +#include "NvInfer.h" + +//! \class EntropyCalibratorImpl +//! +//! \brief Implements common functionality for Entropy calibrators. +//! +template +class EntropyCalibratorImpl +{ +public: + EntropyCalibratorImpl( + TBatchStream stream, int firstBatch, std::string cal_table_name, const char* inputBlobName, bool readCache = true) + : mStream{stream} + , mCalibrationTableName(cal_table_name) + , mInputBlobName(inputBlobName) + , mReadCache(readCache) + { + nvinfer1::Dims4 dims = mStream.getDims(); + mInputCount = std::accumulate( + dims.d, dims.d + dims.nbDims, 1, std::multiplies()); + cout << "dims.nbDims: " << dims.nbDims << endl; + for (int i{0}; i < dims.nbDims; ++i) { + cout << dims.d[i] << ", "; + } + cout << endl; + + cudaError_t state; + state = cudaMalloc(&mDeviceInput, mInputCount * sizeof(float)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + cout << "mInputCount: " << mInputCount << endl; + mStream.reset(firstBatch); + } + + virtual ~EntropyCalibratorImpl() + { + cudaError_t state; + state = cudaFree(mDeviceInput); + if (state) { + cout << "free memory failed\n"; + std::abort(); + } + } + + int getBatchSize() const + { + return mStream.getBatchSize(); + } + + bool getBatch(void* bindings[], const char* names[], int nbBindings) + { + if (!mStream.next()) + { + return false; + } + cudaError_t state; + state = cudaMemcpy(mDeviceInput, mStream.getBatch(), mInputCount * sizeof(float), cudaMemcpyHostToDevice); + if (state) { + cout << "memory copy to device failed\n"; + std::abort(); + } + assert(!strcmp(names[0], mInputBlobName)); + bindings[0] = mDeviceInput; + return true; + } + + const void* readCalibrationCache(size_t& length) + { + mCalibrationCache.clear(); + std::ifstream input(mCalibrationTableName, std::ios::binary); + input >> std::noskipws; + if (mReadCache && input.good()) + { + std::copy(std::istream_iterator(input), std::istream_iterator(), + std::back_inserter(mCalibrationCache)); + } + length = mCalibrationCache.size(); + return length ? mCalibrationCache.data() : nullptr; + } + + void writeCalibrationCache(const void* cache, size_t length) + { + std::ofstream output(mCalibrationTableName, std::ios::binary); + output.write(reinterpret_cast(cache), length); + } + +private: + TBatchStream mStream; + size_t mInputCount; + std::string mCalibrationTableName; + const char* mInputBlobName; + bool mReadCache{true}; + void* mDeviceInput{nullptr}; + std::vector mCalibrationCache; +}; + +//! \class Int8EntropyCalibrator2 +//! +//! \brief Implements Entropy calibrator 2. +//! CalibrationAlgoType is kENTROPY_CALIBRATION_2. +//! +template +class Int8EntropyCalibrator2 : public nvinfer1::IInt8EntropyCalibrator2 +{ +public: + Int8EntropyCalibrator2( + TBatchStream stream, int firstBatch, const char* networkName, const char* inputBlobName, bool readCache = true) + : mImpl(stream, firstBatch, networkName, inputBlobName, readCache) + { + } + + int getBatchSize() const noexcept override + { + return mImpl.getBatchSize(); + } + + bool getBatch(void* bindings[], const char* names[], int nbBindings) noexcept override + { + return mImpl.getBatch(bindings, names, nbBindings); + } + + const void* readCalibrationCache(size_t& length) noexcept override + { + return mImpl.readCalibrationCache(length); + } + + void writeCalibrationCache(const void* cache, size_t length) noexcept override + { + mImpl.writeCalibrationCache(cache, length); + } + +private: + EntropyCalibratorImpl mImpl; +}; + +#endif // ENTROPY_CALIBRATOR_H diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/kernels.cu b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/kernels.cu new file mode 100755 index 0000000000000000000000000000000000000000..b9bf4de12556d64a33457ef14dd0828b72c3ccba --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/kernels.cu @@ -0,0 +1,158 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "NvInfer.h" + + + +#define BLOCKSIZE 512 + +#define ivpair thrust::pair + + +template +__forceinline__ __device__ void reduce_max(ivpair* sdata, int blocksize, int tid) { + __syncthreads(); + for (int s{blocksize / 2}; s > 0; s >>= 1) { + if (tid < s) { + if (sdata[tid].first < sdata[tid + s].first) { + sdata[tid] = sdata[tid + s]; + } + } + __syncthreads(); + } +} + + +template +__global__ void arg_max_depth(const int n_size, + const int dimsize, const int m_size, + const scalar_t *inten, + int *oten) { + extern __shared__ __align__(sizeof(ivpair)) unsigned char sdata_raw[]; + ivpair *sdata = reinterpret_cast(sdata_raw); + sdata = sdata + blockDim.x * threadIdx.y; + + int sample_offset = gridDim.x * blockDim.y; + int bid = threadIdx.y + blockIdx.x * blockDim.y; + int samplesize = n_size * m_size; + + for (int i{bid}; i < samplesize; i += sample_offset) { + int n_idx = i / m_size; + int m_idx = i % m_size; + + /// NOTE: This is not memory-safe when dimsize < blockDim.x + int idx = n_idx * dimsize * m_size + threadIdx.x * m_size + m_idx; + ivpair maxp = thrust::make_pair(inten[idx], threadIdx.x); + int j = threadIdx.x + blockDim.x; + for (; j < dimsize; j += blockDim.x) { + idx += blockDim.x * m_size; + scalar_t val = inten[idx]; + if (val > maxp.first) { + maxp = thrust::make_pair(val, j); + } + } + sdata[threadIdx.x] = maxp; + __syncthreads(); + reduce_max(sdata, blockDim.x, threadIdx.x); + + idx = n_idx * m_size + m_idx; + oten[idx] = sdata[0].second; + } +} + + +template +__global__ void arg_max_spatial(const int n_size, + const int dimsize, const int m_size, + const scalar_t *inten, + int *oten) { + + int sample_offset = gridDim.x * blockDim.x; + int tid = threadIdx.x + blockIdx.x * blockDim.x; + int samplesize = n_size * m_size; + + for (int i{tid}; i < samplesize; i += sample_offset) { + int n_idx = i / m_size; + int m_idx = i % m_size; + + // obtain max + int idx = n_idx * dimsize * m_size + m_idx; + scalar_t max_val = inten[idx]; + int res = 0; + for (int j{1}; j < dimsize; ++j) { + idx += m_size; + scalar_t val = inten[idx]; + if (val > max_val) { + max_val = val; + res = j; + } + } + idx = n_idx * m_size + m_idx; + oten[idx] = res; + } +} + + +void argMaxFunc(const void *inten, + void *oten, const int n_size, + const int dimsize, const int m_size, + cudaStream_t* stream) { + if (inten == nullptr or oten == nullptr) std::abort(); + + int samplesize = n_size * m_size; + int shm_size = 0; + dim3 grid, block; + + if (dimsize <= 256) { + int blockx, gridx; + cudaOccupancyMaxPotentialBlockSize(&gridx, &blockx, + arg_max_spatial, 0, samplesize); + gridx = std::min(4096, gridx << 2); + block.x = blockx; grid.x = gridx; + + if (stream == nullptr) { + arg_max_spatial<<>>( + n_size, dimsize, m_size, + reinterpret_cast(inten), + reinterpret_cast(oten)); + } else { + arg_max_spatial<<>>( + n_size, dimsize, m_size, + reinterpret_cast(inten), + reinterpret_cast(oten)); + } + + } else { + int blockx, blocky, gridx; + shm_size = (sizeof(float) + sizeof(int)) * BLOCKSIZE; + int block_lmt = std::min(BLOCKSIZE, dimsize); + blockx = 32; + while (blockx <= block_lmt) blockx = (blockx << 1); + blockx = (blockx >> 1); // must make sure dimsize > blockx + blocky = BLOCKSIZE / blockx; + gridx = std::min(4096, samplesize / blocky); + block.x = blockx; block.y = blocky; grid.x = gridx; + + if (stream == nullptr) { + arg_max_depth<<>>( + n_size, dimsize, m_size, + reinterpret_cast(inten), + reinterpret_cast(oten)); + } else { + arg_max_depth<<>>( + n_size, dimsize, m_size, + reinterpret_cast(inten), + reinterpret_cast(oten)); + } + } + + +} + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/kernels.hpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/kernels.hpp new file mode 100755 index 0000000000000000000000000000000000000000..db05f6ea2bdc6a55fafff083930c0561310e6d4b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/kernels.hpp @@ -0,0 +1,13 @@ +#ifndef _KERNELS_HPP_ +#define _KERNELS_HPP_ + +#include +#include + + +void argMaxFunc(const void *inten, + void *oten, const int n_size, + const int dimsize, const int m_size, + cudaStream_t* stream); + +#endif diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/read_img.cpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/read_img.cpp new file mode 100755 index 0000000000000000000000000000000000000000..60657dac2b56191f4983c45f316147c339ca981b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/read_img.cpp @@ -0,0 +1,56 @@ + +#include +#include +#include +#include +#include +#include + + +using std::cout; +using std::endl; +using std::vector; +using std::string; +using cv::Mat; + + +void read_data(std::string impth, float *data, int iH, int iW, + int& orgH, int& orgW) { + vector mean{0.485f, 0.456f, 0.406f}; // rgb order + vector variance{0.229f, 0.224f, 0.225f}; + + Mat im = cv::imread(impth); + if (im.empty()) { + cout << "cannot read image \n"; + std::abort(); + } + + orgH = im.rows; orgW = im.cols; + if ((orgH != iH) || orgW != iW) { + cout << "resize orignal image of (" << orgH << "," << orgW + << ") to (" << iH << ", " << iW << ") according to model require\n"; + cv::resize(im, im, cv::Size(iW, iH), cv::INTER_CUBIC); + } + + // normalize and convert to rgb + float scale = 1.f / 255.f; + for (int i{0}; i < variance.size(); ++ i) { + variance[i] = 1.f / variance[i]; + } + for (int h{0}; h < iH; ++h) { + cv::Vec3b *p = im.ptr(h); + for (int w{0}; w < iW; ++w) { + for (int c{0}; c < 3; ++c) { + int idx = c * iH * iW + h * iW + w; + data[idx] = (p[w][2 - c] * scale - mean[c]) * variance[c]; + } + } + } +} + + +void read_data(std::string impth, float *data, int iH, int iW) { + int tmp1, tmp2; + read_data(impth, data, iH, iW, tmp1, tmp2); +} + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/read_img.hpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/read_img.hpp new file mode 100755 index 0000000000000000000000000000000000000000..08d930bdecd1697a90e09688d62ab3fb30b60e8d --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/read_img.hpp @@ -0,0 +1,26 @@ + +#ifndef _READ_IMAGE_HPP_ +#define _READ_IMAGE_HPP_ + + +#include +#include +#include +#include +#include +#include + + +using std::cout; +using std::endl; +using std::vector; +using std::string; +using cv::Mat; + + +void read_data(std::string impth, float *data, + int iH, int iW, int& orgH, int& orgW); +void read_data(std::string impth, float *data, int iH, int iW); + + +#endif diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/segment.cpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/segment.cpp new file mode 100755 index 0000000000000000000000000000000000000000..a71b4ad60d2dea431758191e2d86e80cc341ce7b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/segment.cpp @@ -0,0 +1,171 @@ +#include "NvInfer.h" +#include "NvOnnxParser.h" +#include "NvInferPlugin.h" +#include +#include "NvInferRuntimeCommon.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "trt_dep.hpp" +#include "read_img.hpp" + + +using nvinfer1::IHostMemory; +using nvinfer1::IBuilder; +using nvinfer1::INetworkDefinition; +using nvinfer1::ICudaEngine; +using nvinfer1::IInt8Calibrator; +using nvinfer1::IBuilderConfig; +using nvinfer1::IRuntime; +using nvinfer1::IExecutionContext; +using nvinfer1::ILogger; +using nvinfer1::Dims3; +using nvinfer1::Dims2; +using Severity = nvinfer1::ILogger::Severity; + +using std::string; +using std::ios; +using std::ofstream; +using std::ifstream; +using std::vector; +using std::cout; +using std::endl; +using std::array; + +using cv::Mat; + + + + +vector> get_color_map(); + +void compile_onnx(vector args); +void run_with_trt(vector args); +void test_speed(vector args); + + +int main(int argc, char* argv[]) { + if (argc < 3) { + cout << "usage is ./segment compile/run/test\n"; + std::abort(); + } + + vector args; + for (int i{1}; i < argc; ++i) args.emplace_back(argv[i]); + + if (args[0] == "compile") { + if (argc < 4) { + cout << "usage is: ./segment compile input.onnx output.trt [--fp16|--fp32]\n"; + cout << "or ./segment compile input.onnx output.trt --int8 /path/to/data_root /path/to/ann_file\n"; + std::abort(); + } + compile_onnx(args); + } else if (args[0] == "run") { + if (argc < 5) { + cout << "usage is ./segment run ./xxx.trt input.jpg result.jpg\n"; + std::abort(); + } + run_with_trt(args); + } else if (args[0] == "test") { + if (argc < 3) { + cout << "usage is ./segment test ./xxx.trt\n"; + std::abort(); + } + test_speed(args); + } + + return 0; +} + + +void compile_onnx(vector args) { + string quant("fp32"); + string data_root("none"); + string data_file("none"); + if ((args.size() >= 4)) { + if (args[3] == "--fp32") { + quant = "fp32"; + } else if (args[3] == "--fp16") { + quant = "fp16"; + } else if (args[3] == "--int8") { + quant = "int8"; + data_root = args[4]; + data_file = args[5]; + } else { + cout << "invalid args of quantization: " << args[3] << endl; + std::abort(); + } + } + + TrtSharedEnginePtr engine = parse_to_engine(args[1], quant, data_root, data_file); + serialize(engine, args[2]); +} + + +void run_with_trt(vector args) { + + TrtSharedEnginePtr engine = deserialize(args[1]); + + Dims3 i_dims = static_cast( + engine->getBindingDimensions(engine->getBindingIndex("input_image"))); + Dims3 o_dims = static_cast( + engine->getBindingDimensions(engine->getBindingIndex("preds"))); + const int iH{i_dims.d[2]}, iW{i_dims.d[3]}; + const int oH{o_dims.d[2]}, oW{o_dims.d[3]}; + + // prepare image and resize + vector data; data.resize(iH * iW * 3); + int orgH, orgW; + read_data(args[2], &data[0], iH, iW, orgH, orgW); + + // call engine + vector res = infer_with_engine(engine, data); + + // generate colored out + vector> color_map = get_color_map(); + Mat pred(cv::Size(oW, oH), CV_8UC3); + int idx{0}; + for (int i{0}; i < oH; ++i) { + uint8_t *ptr = pred.ptr(i); + for (int j{0}; j < oW; ++j) { + ptr[0] = color_map[res[idx]][0]; + ptr[1] = color_map[res[idx]][1]; + ptr[2] = color_map[res[idx]][2]; + ptr += 3; + ++idx; + } + } + + // resize back and save + if ((orgH != oH) || (orgW != oW)) { + cv::resize(pred, pred, cv::Size(orgW, orgH), cv::INTER_CUBIC); + } + cv::imwrite(args[3], pred); +} + + +vector> get_color_map() { + vector> color_map(256, vector(3)); + std::minstd_rand rand_eng(123); + std::uniform_int_distribution u(0, 255); + for (int i{0}; i < 256; ++i) { + for (int j{0}; j < 3; ++j) { + color_map[i][j] = u(rand_eng); + } + } + return color_map; +} + + +void test_speed(vector args) { + TrtSharedEnginePtr engine = deserialize(args[1]); + test_fps_with_engine(engine); +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/segment.py b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/segment.py new file mode 100755 index 0000000000000000000000000000000000000000..32e34d42afa696449f891e403f5362ea7adceb1c --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/segment.py @@ -0,0 +1,157 @@ + +import os +import os.path as osp +import cv2 +import numpy as np +import logging +import argparse + +import tensorrt as trt +import pycuda.driver as cuda +import pycuda.autoinit + + +parser = argparse.ArgumentParser() +subparsers = parser.add_subparsers(dest="command") +compile_parser = subparsers.add_parser('compile') +compile_parser.add_argument('--onnx') +compile_parser.add_argument('--quant', default='fp32') +compile_parser.add_argument('--savepth', default='./model.trt') +run_parser = subparsers.add_parser('run') +run_parser.add_argument('--mdpth') +run_parser.add_argument('--impth') +run_parser.add_argument('--outpth', default='./res.png') +args = parser.parse_args() + + +np.random.seed(123) +in_datatype = trt.nptype(trt.float32) +out_datatype = trt.nptype(trt.int32) +palette = np.random.randint(0, 256, (256, 3)).astype(np.uint8) + +ctx = pycuda.autoinit.context +trt.init_libnvinfer_plugins(None, "") +TRT_LOGGER = trt.Logger() + + + +def get_image(impth, size): + mean = np.array([0.485, 0.456, 0.406], dtype=np.float32)[:, None, None] + var = np.array([0.229, 0.224, 0.225], dtype=np.float32)[:, None, None] + iH, iW = size[0], size[1] + img = cv2.imread(impth)[:, :, ::-1] + orgH, orgW, _ = img.shape + img = cv2.resize(img, (iW, iH)).astype(np.float32) + img = img.transpose(2, 0, 1) / 255. + img = (img - mean) / var + return img, (orgH, orgW) + + + +def allocate_buffers(engine): + h_input = cuda.pagelocked_empty( + trt.volume(engine.get_binding_shape(0)), dtype=in_datatype) + print(engine.get_binding_shape(0)) + d_input = cuda.mem_alloc(h_input.nbytes) + h_outputs, d_outputs = [], [] + n_outs = 1 + for i in range(n_outs): + h_output = cuda.pagelocked_empty( + trt.volume(engine.get_binding_shape(i+1)), + dtype=out_datatype) + d_output = cuda.mem_alloc(h_output.nbytes) + h_outputs.append(h_output) + d_outputs.append(d_output) + stream = cuda.Stream() + return ( + stream, + h_input, + d_input, + h_outputs, + d_outputs, + ) + + +def build_engine_from_onnx(onnx_file_path): + engine = None ## add this to avoid return deleted engine + EXPLICIT_BATCH = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH) + with trt.Builder(TRT_LOGGER) as builder, builder.create_network(EXPLICIT_BATCH) as network, builder.create_builder_config() as config, trt.OnnxParser(network, TRT_LOGGER) as parser, trt.Runtime(TRT_LOGGER) as runtime: + + # Parse model file + print(f'Loading ONNX file from path {onnx_file_path}...') + assert os.path.exists(onnx_file_path), f'cannot find {onnx_file_path}' + with open(onnx_file_path, 'rb') as fr: + if not parser.parse(fr.read()): + print ('ERROR: Failed to parse the ONNX file.') + for error in range(parser.num_errors): + print (parser.get_error(error)) + assert False + + # build settings + builder.max_batch_size = 128 + config.max_workspace_size = 1 << 30 # 1G + if args.quant == 'fp16': + config.set_flag(trt.BuilderFlag.FP16) + + print("Start to build Engine") + plan = builder.build_serialized_network(network, config) + engine = runtime.deserialize_cuda_engine(plan) + return engine + + +def serialize_engine_to_file(engine, savepth): + plan = engine.serialize() + with open(savepth, "wb") as fw: + fw.write(plan) + + +def deserialize_engine_from_file(savepth): + with open(savepth, 'rb') as fr, trt.Runtime(TRT_LOGGER) as runtime: + engine = runtime.deserialize_cuda_engine(fr.read()) + return engine + + +def main(): + if args.command == 'compile': + engine = build_engine_from_onnx(args.onnx) + serialize_engine_to_file(engine, args.savepth) + + elif args.command == 'run': + engine = deserialize_engine_from_file(args.mdpth) + + ishape = engine.get_binding_shape(0) + img, (orgH, orgW) = get_image(args.impth, ishape[2:]) + + ## create engine and allocate bffers + ( + stream, + h_input, + d_input, + h_outputs, + d_outputs, + ) = allocate_buffers(engine) + ctx.push() + context = engine.create_execution_context() + ctx.pop() + bds = [int(d_input), ] + [int(el) for el in d_outputs] + + h_input = np.ascontiguousarray(img) + cuda.memcpy_htod_async(d_input, h_input, stream) + context.execute_async( + bindings=bds, stream_handle=stream.handle) + for h_output, d_output in zip(h_outputs, d_outputs): + cuda.memcpy_dtoh_async(h_output, d_output, stream) + stream.synchronize() + + oshape = engine.get_binding_shape(1) + pred = np.argmax(h_outputs[0].reshape(oshape), axis=1) + out = palette[pred] + out = out.reshape(*oshape[2:], 3) + out = cv2.resize(out, (orgW, orgH)) + cv2.imwrite(args.outpth, out) + + + +if __name__ == '__main__': + main() + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/trt_dep.cpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/trt_dep.cpp new file mode 100755 index 0000000000000000000000000000000000000000..71f105c4d7699c5d9f4357dadba68c0685efd1b7 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/trt_dep.cpp @@ -0,0 +1,311 @@ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "trt_dep.hpp" +#include "batch_stream.hpp" +#include "entropy_calibrator.hpp" +#include "kernels.hpp" + + +using nvinfer1::IHostMemory; +using nvinfer1::IBuilder; +using nvinfer1::INetworkDefinition; +using nvinfer1::ICudaEngine; +using nvinfer1::IInt8Calibrator; +using nvinfer1::IBuilderConfig; +using nvinfer1::IRuntime; +using nvinfer1::IExecutionContext; +using nvinfer1::ILogger; +using nvinfer1::Dims3; +using nvinfer1::Dims2; +using Severity = nvinfer1::ILogger::Severity; + +using std::string; +using std::ios; +using std::ofstream; +using std::ifstream; +using std::vector; +using std::cout; +using std::endl; +using std::array; + + +Logger gLogger; + + +TrtSharedEnginePtr shared_engine_ptr(ICudaEngine* ptr) { + return TrtSharedEnginePtr(ptr, TrtDeleter()); +} + + +TrtSharedEnginePtr parse_to_engine(string onnx_pth, + string quant, string data_root, string data_file) { + unsigned int maxBatchSize{1}; + long memory_limit = 1UL << 32; // 4G + + auto builder = TrtUnqPtr(nvinfer1::createInferBuilder(gLogger)); + if (!builder) { + cout << "create builder failed\n"; + std::abort(); + } + + const auto explicitBatch = 1U << static_cast( + nvinfer1::NetworkDefinitionCreationFlag::kEXPLICIT_BATCH); + auto network = TrtUnqPtr( + builder->createNetworkV2(explicitBatch)); + if (!network) { + cout << "create network failed\n"; + std::abort(); + } + + auto config = TrtUnqPtr(builder->createBuilderConfig()); + if (!config) { + cout << "create builder config failed\n"; + std::abort(); + } + + auto parser = TrtUnqPtr(nvonnxparser::createParser(*network, gLogger)); + if (!parser) { + cout << "create parser failed\n"; + std::abort(); + } + + int verbosity = (int)nvinfer1::ILogger::Severity::kWARNING; + bool state = parser->parseFromFile(onnx_pth.c_str(), verbosity); + if (!state) { + cout << "parse model failed\n"; + std::abort(); + } + + config->setMaxWorkspaceSize(memory_limit); + if ((quant == "fp16" or quant == "int8") && builder->platformHasFastFp16()) { + config->setFlag(nvinfer1::BuilderFlag::kFP16); // fp16 + } + std::unique_ptr calibrator; + if (quant == "int8" && builder->platformHasFastInt8()) { + config->setFlag(nvinfer1::BuilderFlag::kINT8); //int8 + int batchsize = 32; + int n_cal_batches = -1; + string cal_table_name = "calibrate_int8"; + string input_name = "input_image"; + + Dims indim = network->getInput(0)->getDimensions(); + BatchStream calibrationStream( + batchsize, n_cal_batches, indim, + data_root, data_file); + calibrator.reset(new Int8EntropyCalibrator2( + calibrationStream, 0, cal_table_name.c_str(), input_name.c_str())); + config->setInt8Calibrator(calibrator.get()); + } + + auto output = network->getOutput(0); + // output->setType(nvinfer1::DataType::kINT32); + output->setType(nvinfer1::DataType::kFLOAT); + + cout << " start to build \n"; + CudaStreamUnqPtr stream(new cudaStream_t); + if (cudaStreamCreate(stream.get())) { + cout << "create stream failed\n"; + std::abort(); + } + config->setProfileStream(*stream); + + auto plan = TrtUnqPtr(builder->buildSerializedNetwork(*network, *config)); + if (!plan) { + cout << "serialization failed\n"; + std::abort(); + } + + auto runtime = TrtUnqPtr(nvinfer1::createInferRuntime(gLogger)); + if (!plan) { + cout << "create runtime failed\n"; + std::abort(); + } + + TrtSharedEnginePtr engine = shared_engine_ptr( + runtime->deserializeCudaEngine(plan->data(), plan->size())); + if (!engine) { + cout << "create engine failed\n"; + std::abort(); + } + cout << "done build engine \n"; + + return engine; +} + + +void serialize(TrtSharedEnginePtr engine, string save_path) { + + auto trt_stream = TrtUnqPtr(engine->serialize()); + if (!trt_stream) { + cout << "serialize engine failed\n"; + std::abort(); + } + + ofstream ofile(save_path, ios::out | ios::binary); + ofile.write((const char*)trt_stream->data(), trt_stream->size()); + + ofile.close(); +} + + +TrtSharedEnginePtr deserialize(string serpth) { + + ifstream ifile(serpth, ios::in | ios::binary); + if (!ifile) { + cout << "read serialized file failed\n"; + std::abort(); + } + + ifile.seekg(0, ios::end); + const int mdsize = ifile.tellg(); + ifile.clear(); + ifile.seekg(0, ios::beg); + vector buf(mdsize); + ifile.read(&buf[0], mdsize); + ifile.close(); + cout << "model size: " << mdsize << endl; + + auto runtime = TrtUnqPtr(nvinfer1::createInferRuntime(gLogger)); + TrtSharedEnginePtr engine = shared_engine_ptr( + runtime->deserializeCudaEngine((void*)&buf[0], mdsize)); + return engine; +} + + +vector infer_with_engine(TrtSharedEnginePtr engine, vector& data) { + Dims3 out_dims = static_cast( + engine->getBindingDimensions(engine->getBindingIndex("preds"))); + + const int batchsize{1}, H{out_dims.d[2]}, W{out_dims.d[3]}; + const int n_classes{out_dims.d[1]}; + const int in_size{static_cast(data.size())}; + const int logits_size{batchsize * n_classes * H * W}; + const int out_size{batchsize * H * W}; + vector buffs(3); + vector res(out_size); + + auto context = TrtUnqPtr(engine->createExecutionContext()); + if (!context) { + cout << "create execution context failed\n"; + std::abort(); + } + + cudaError_t state; + state = cudaMalloc(&buffs[0], in_size * sizeof(float)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + state = cudaMalloc(&buffs[1], logits_size * sizeof(float)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + state = cudaMalloc(&buffs[2], out_size * sizeof(int)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + CudaStreamUnqPtr stream(new cudaStream_t); + if (cudaStreamCreate(stream.get())) { + cout << "create stream failed\n"; + std::abort(); + } + + state = cudaMemcpyAsync( + buffs[0], &data[0], in_size * sizeof(float), + cudaMemcpyHostToDevice, *stream); + if (state) { + cout << "transmit to device failed\n"; + std::abort(); + } + + context->enqueueV2(&buffs[0], *stream, nullptr); + // context->enqueue(1, &buffs[0], stream, nullptr); + argMaxFunc(buffs[1], buffs[2], batchsize, n_classes, H * W, stream.get()); + + state = cudaMemcpyAsync( + &res[0], buffs[2], out_size * sizeof(int), + cudaMemcpyDeviceToHost, *stream); + if (state) { + cout << "transmit to host failed \n"; + std::abort(); + } + + cudaStreamSynchronize(*stream); + + cudaFree(buffs[0]); + cudaFree(buffs[1]); + cudaFree(buffs[2]); + + return res; +} + + +void test_fps_with_engine(TrtSharedEnginePtr engine) { + Dims3 in_dims = static_cast( + engine->getBindingDimensions(engine->getBindingIndex("input_image"))); + Dims3 out_dims = static_cast( + engine->getBindingDimensions(engine->getBindingIndex("preds"))); + + const int batchsize{1}; + const int oH{out_dims.d[2]}, oW{out_dims.d[3]}; + const int n_classes{out_dims.d[1]}; + const int iH{in_dims.d[2]}, iW{in_dims.d[3]}; + const int in_size{batchsize * 3 * iH * iW}; + const int logits_size{batchsize * n_classes * oH * oW}; + const int out_size{batchsize * oH * oW}; + + auto context = TrtUnqPtr(engine->createExecutionContext()); + if (!context) { + cout << "create execution context failed\n"; + std::abort(); + } + + vector buffs(3); + cudaError_t state; + state = cudaMalloc(&buffs[0], in_size * sizeof(float)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + state = cudaMalloc(&buffs[1], logits_size * sizeof(float)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + state = cudaMalloc(&buffs[2], out_size * sizeof(int)); + if (state) { + cout << "allocate memory failed\n"; + std::abort(); + } + + cout << "\ntest with cropsize of (" << iH << ", " << iW << ") ...\n"; + auto start = std::chrono::steady_clock::now(); + const int n_loops{1000}; + for (int i{0}; i < n_loops; ++i) { + // context->execute(1, &buffs[0]); + context->executeV2(&buffs[0]); + argMaxFunc(buffs[1], buffs[2], batchsize, n_classes, oH * oW, nullptr); + } + auto end = std::chrono::steady_clock::now(); + double duration = std::chrono::duration(end - start).count(); + duration /= 1000.; + cout << "running " << n_loops << " times, use time: " + << duration << "s" << endl; + cout << "fps is: " << static_cast(n_loops) / duration << endl; + + + cudaFree(buffs[0]); + cudaFree(buffs[1]); + cudaFree(buffs[2]); +} + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/trt_dep.hpp b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/trt_dep.hpp new file mode 100755 index 0000000000000000000000000000000000000000..2b794dc636bdf0a231258c7dca48dc2a28cbcca4 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tensorrt/trt_dep.hpp @@ -0,0 +1,64 @@ +#ifndef _TRT_DEP_HPP_ +#define _TRT_DEP_HPP_ + +#include "NvInfer.h" +#include "NvOnnxParser.h" +#include "NvInferPlugin.h" +#include + +#include +#include +#include +#include + + +using std::string; +using std::vector; +using std::cout; +using std::endl; + +using nvinfer1::ICudaEngine; +using nvinfer1::ILogger; +using Severity = nvinfer1::ILogger::Severity; + + +class Logger: public ILogger { + public: + void log(Severity severity, const char* msg) noexcept override { + if (severity != Severity::kINFO) { + std::cout << msg << std::endl; + } + } +}; + +struct TrtDeleter { + template + void operator()(T* obj) const { + delete obj; + } +}; + +struct CudaStreamDeleter { + void operator()(cudaStream_t* stream) const { + cudaStreamDestroy(*stream); + } +}; + +template +using TrtUnqPtr = std::unique_ptr; +using CudaStreamUnqPtr = std::unique_ptr; +using TrtSharedEnginePtr = std::shared_ptr; + + +extern Logger gLogger; + + +TrtSharedEnginePtr shared_engine_ptr(ICudaEngine* ptr); +TrtSharedEnginePtr parse_to_engine(string onnx_path, string quant, + string data_root, string data_file); +void serialize(TrtSharedEnginePtr engine, string save_path); +TrtSharedEnginePtr deserialize(string serpth); +vector infer_with_engine(TrtSharedEnginePtr engine, vector& data); +void test_fps_with_engine(TrtSharedEnginePtr engine); + +#endif diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/README.md b/cv/semantic_segmentation/bisenetv2/pytorch/tis/README.md new file mode 100755 index 0000000000000000000000000000000000000000..4d7c6fe9b168446e199d640eae9fe393ed3ab9c8 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/README.md @@ -0,0 +1,123 @@ + + +## A simple demo of using trition-inference-serving + +### Platform + +* ubuntu 18.04 +* cmake-3.22.0 +* 8 Tesla T4 gpu + + +### Serving Model + +#### 1. prepare model repository + +We need to export our model to onnx and copy it to model repository: +``` +$ cd BiSeNet +$ python tools/export_onnx.py --config configs/bisenetv1_city.py --weight-path /path/to/your/model.pth --outpath ./model.onnx +$ cp -riv ./model.onnx tis/models/bisenetv1/1 + +$ python tools/export_onnx.py --config configs/bisenetv2_city.py --weight-path /path/to/your/model.pth --outpath ./model.onnx +$ cp -riv ./model.onnx tis/models/bisenetv2/1 +``` + +#### 2. prepare the preprocessing backend +We can use either python backend or cpp backend for preprocessing in the server side. +Firstly, we pull the docker image, and start a serving container: +``` +$ docker pull nvcr.io/nvidia/tritonserver:22.07-py3 +$ docker run -it --gpus all --rm -p8000:8000 -p8001:8001 -p8002:8002 -v /path/to/BiSeNet/tis/models:/models -v /path/to/BiSeNet/:/BiSeNet nvcr.io/nvidia/tritonserver:21.10-py3 bash +``` +From here on, we are in the container environment. Let's prepare the backends in the container: +``` +# ln -s /usr/local/bin/pip3.8 /usr/bin/pip3.8 +# /usr/bin/python3 -m pip install pillow +# apt update && apt install rapidjson-dev libopencv-dev +``` +Then we download cmake 3.22 and unzip in the container, we use this cmake 3.22 in the following operations. +We compile c++ backends: +``` +# cp -riv /BiSeNet/tis/self_backend /opt/tritonserver/backends +# chmod 777 /opt/tritonserver/backends/self_backend +# cd /opt/tritonserver/backends/self_backend +# mkdir -p build && cd build +# cmake .. && make -j4 +# mv -iuv libtriton_self_backend.so .. +``` +Utils now, we should have backends prepared. + + + +#### 3. start service +We start the server in the docker container, following the above steps: +``` +# tritonserver --model-repository=/models +``` +In general, the service would start now. You can check whether service has started by: +``` +$ curl -v localhost:8000/v2/health/ready +``` + +By default, we use gpu 0 and gpu 1, you can change configurations in the `config.pbtxt` file. + + +### Request with client + +We call the model service with both python and c++ method. + +From here on, we are at the client machine, rather than the server docker container. + + +#### 1. python method + +Firstly, we need to install dependency package: +``` +$ python -m pip install tritonclient[all]==2.15.0 +``` + +Then we can run the script for both http request and grpc request: +``` +$ cd BiSeNet/tis +$ python client_http.py # if you want to use http client +$ python client_grpc.py # if you want to use grpc client +``` + +This would generate a result file named `res.jpg` in `BiSeNet/tis` directory. + + +#### 2. c++ method + +We need to compile c++ client library from source: +``` +$ apt install rapidjson-dev +$ mkdir -p /data/ $$ cd /data/ +$ git clone https://github.com/triton-inference-server/client.git +$ cd client && git reset --hard da04158bc094925a56b +$ mkdir -p build && cd build +$ cmake -DCMAKE_INSTALL_PREFIX=/opt/triton_client -DTRITON_ENABLE_CC_HTTP=ON -DTRITON_ENABLE_CC_GRPC=ON -DTRITON_ENABLE_PERF_ANALYZER=OFF -DTRITON_ENABLE_PYTHON_HTTP=OFF -DTRITON_ENABLE_PYTHON_GRPC=OFF -DTRITON_ENABLE_JAVA_HTTP=OFF -DTRITON_ENABLE_GPU=ON -DTRITON_ENABLE_EXAMPLES=OFF -DTRITON_ENABLE_TESTS=ON .. +$ make cc-clients +``` +The above commands are exactly what I used to compile the library. I learned these commands from the official document. + +Also, We need to install `cmake` with version `3.22`. + +Optionally, I compiled opencv from source and install it to `/opt/opencv`. You can first skip this and see whether you meet problems. If you have problems about opencv in the following steps, you can compile opencv as what I do. + +After installing the dependencies, we can compile our c++ client: +``` +$ cd BiSeNet/tis/cpp_client +$ mkdir -p build && cd build +$ cmake .. && make +``` + +Finally, we run the client and see a result file named `res.jpg` generated: +``` + ./client +``` + + +### In the end + +This is a simple demo with only basic function. There are many other features that is useful, such as shared memory and dynamic batching. If you have interests on this, you can learn more in the official document. diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_backend.py b/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_backend.py new file mode 100755 index 0000000000000000000000000000000000000000..6784d291a5fd6997f11be6f1e9d83fad8063221a --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_backend.py @@ -0,0 +1,81 @@ + + +import argparse +import sys +import numpy as np +import cv2 +import gevent.ssl + +import tritonclient.http as httpclient +from tritonclient.utils import InferenceServerException + + +np.random.seed(123) +palette = np.random.randint(0, 256, (100, 3)) + + +url = '10.128.61.8:8000' +# url = '127.0.0.1:8000' +model_name = 'preprocess_cpp' +model_version = '1' +inp_name = 'raw_img_bytes' +outp_name = 'processed_img' +inp_dtype = 'UINT8' +impth = '../example.png' +mean = [0.3257, 0.3690, 0.3223] # city, rgb +std = [0.2112, 0.2148, 0.2115] + + +## prepare image and mean/std +inp_data = np.fromfile(impth, dtype=np.uint8)[None, ...] +mean = np.array(mean, dtype=np.float32)[None, ...] +std = np.array(std, dtype=np.float32)[None, ...] +inputs = [] +inputs.append(httpclient.InferInput(inp_name, inp_data.shape, inp_dtype)) +inputs.append(httpclient.InferInput('channel_mean', mean.shape, 'FP32')) +inputs.append(httpclient.InferInput('channel_std', std.shape, 'FP32')) +inputs[0].set_data_from_numpy(inp_data, binary_data=True) +inputs[1].set_data_from_numpy(mean, binary_data=True) +inputs[2].set_data_from_numpy(std, binary_data=True) + +## client +triton_client = httpclient.InferenceServerClient( + url=url, verbose=False, concurrency=32) + +## infer +# sync +# results = triton_client.infer(model_name, inputs) + + +# async +# results = triton_client.async_infer( +# model_name, +# inputs, +# outputs=None, +# query_params=None, +# headers=None, +# request_compression_algorithm=None, +# response_compression_algorithm=None) +# results = results.get_result() # async infer only + + +## dynamic batching, this is not allowed, since different pictures has different raw size +results = [] +for i in range(10): + r = triton_client.async_infer( + model_name, + inputs, + outputs=None, + query_params=None, + headers=None, + request_compression_algorithm=None, + response_compression_algorithm=None) + results.append(r) +for i in range(10): + results[i].get_result() +results = results[i] + + +# get output +outp = results.as_numpy(outp_name).squeeze() +print(outp.shape) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_grpc.py b/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_grpc.py new file mode 100755 index 0000000000000000000000000000000000000000..5109c1e220f2673d2d2b164cb6cd109aa02b2d8e --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_grpc.py @@ -0,0 +1,88 @@ + +import numpy as np +import cv2 + +import grpc + +from tritonclient.grpc import service_pb2, service_pb2_grpc +import tritonclient.grpc.model_config_pb2 as mc + + +np.random.seed(123) +palette = np.random.randint(0, 256, (100, 3)) + + + +url = '10.128.61.8:8001' +# url = '127.0.0.1:8001' +model_name = 'bisenetv1' +model_version = '1' +inp_name = 'raw_img_bytes' +outp_name = 'preds' +inp_dtype = 'UINT8' +outp_dtype = np.int64 +impth = '../example.png' +mean = [0.3257, 0.3690, 0.3223] # city, rgb +std = [0.2112, 0.2148, 0.2115] + + +## input data and mean/std +inp_data = np.fromfile(impth, dtype=np.uint8)[None, ...] +mean = np.array(mean, dtype=np.float32)[None, ...] +std = np.array(std, dtype=np.float32)[None, ...] +inputs = [service_pb2.ModelInferRequest().InferInputTensor() for _ in range(3)] +inputs[0].name = inp_name +inputs[0].datatype = inp_dtype +inputs[0].shape.extend(inp_data.shape) +inputs[1].name = 'channel_mean' +inputs[1].datatype = 'FP32' +inputs[1].shape.extend(mean.shape) +inputs[2].name = 'channel_std' +inputs[2].datatype = 'FP32' +inputs[2].shape.extend(std.shape) +inp_bytes = [inp_data.tobytes(), mean.tobytes(), std.tobytes()] + + +option = [ + ('grpc.max_receive_message_length', 1073741824), + ('grpc.max_send_message_length', 1073741824), + ] +channel = grpc.insecure_channel(url, options=option) +grpc_stub = service_pb2_grpc.GRPCInferenceServiceStub(channel) + + +metadata_request = service_pb2.ModelMetadataRequest( + name=model_name, version=model_version) +metadata_response = grpc_stub.ModelMetadata(metadata_request) +print(metadata_response) + +config_request = service_pb2.ModelConfigRequest( + name=model_name, + version=model_version) +config_response = grpc_stub.ModelConfig(config_request) +print(config_response) + + +request = service_pb2.ModelInferRequest() +request.model_name = model_name +request.model_version = model_version + +request.ClearField("inputs") +request.ClearField("raw_input_contents") +request.inputs.extend(inputs) +request.raw_input_contents.extend(inp_bytes) + + +# sync +# resp = grpc_stub.ModelInfer(request) +# async +resp = grpc_stub.ModelInfer.future(request) +resp = resp.result() + +outp_bytes = resp.raw_output_contents[0] +outp_shape = resp.outputs[0].shape + +out = np.frombuffer(outp_bytes, dtype=outp_dtype).reshape(*outp_shape).squeeze() + +out = palette[out] +cv2.imwrite('res.png', out) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_http.py b/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_http.py new file mode 100755 index 0000000000000000000000000000000000000000..d1fa501be501645f6137a683a20ca8a80193ebe1 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/client_http.py @@ -0,0 +1,64 @@ + + +import argparse +import sys +import numpy as np +import cv2 +import gevent.ssl + +import tritonclient.http as httpclient +from tritonclient.utils import InferenceServerException + + +np.random.seed(123) +palette = np.random.randint(0, 256, (100, 3)) + + +url = '10.128.61.8:8000' +# url = '127.0.0.1:8000' +model_name = 'bisenetv2' +model_version = '1' +inp_name = 'raw_img_bytes' +outp_name = 'preds' +inp_dtype = 'UINT8' +impth = '../example.png' +mean = [0.3257, 0.3690, 0.3223] # city, rgb +std = [0.2112, 0.2148, 0.2115] + + +## prepare image and mean/std +inp_data = np.fromfile(impth, dtype=np.uint8)[None, ...] +mean = np.array(mean, dtype=np.float32)[None, ...] +std = np.array(std, dtype=np.float32)[None, ...] +inputs = [] +inputs.append(httpclient.InferInput(inp_name, inp_data.shape, inp_dtype)) +inputs.append(httpclient.InferInput('channel_mean', mean.shape, 'FP32')) +inputs.append(httpclient.InferInput('channel_std', std.shape, 'FP32')) +inputs[0].set_data_from_numpy(inp_data, binary_data=True) +inputs[1].set_data_from_numpy(mean, binary_data=True) +inputs[2].set_data_from_numpy(std, binary_data=True) + + +## client +triton_client = httpclient.InferenceServerClient( + url=url, verbose=False, concurrency=32) + +## infer +# sync +# results = triton_client.infer(model_name, inputs) + +# async +results = triton_client.async_infer( + model_name, + inputs, + outputs=None, + query_params=None, + headers=None, + request_compression_algorithm=None, + response_compression_algorithm=None) +results = results.get_result() # async infer only + +# get output +outp = results.as_numpy(outp_name).squeeze() +out = palette[outp] +cv2.imwrite('res.png', out) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/cpp_client/CMakeLists.txt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/cpp_client/CMakeLists.txt new file mode 100755 index 0000000000000000000000000000000000000000..15eb56f257f979c91c6cb1ab7053d9c7d5bd9838 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/cpp_client/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required (VERSION 3.18) + +project(Samples) + +set(CMAKE_CXX_FLAGS "-std=c++14 -O2") +set(CMAKE_BUILD_TYPE Release) + +set(CMAKE_PREFIX_PATH + /opt/triton_client/ + /opt/opencv/lib/cmake/opencv4) +find_package(OpenCV REQUIRED) + +include_directories( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} + ${OpenCV_INCLUDE_DIRS} + /opt/triton_client/include +) +link_directories( + /opt/triton_client/lib + ) + + +add_executable(client main.cpp) +target_link_libraries(client PRIVATE + grpcclient + ${OpenCV_LIBS} + -lpthread + ) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/cpp_client/main.cpp b/cv/semantic_segmentation/bisenetv2/pytorch/tis/cpp_client/main.cpp new file mode 100755 index 0000000000000000000000000000000000000000..39a326b44daa772352fc5739b09609873f127e7c --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/cpp_client/main.cpp @@ -0,0 +1,326 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "grpc_client.h" +#include "common.h" + +#include + + +namespace tc = triton::client; + + +#define FAIL_IF_ERR(X, MSG) \ + { \ + tc::Error err = (X); \ + if (!err.IsOk()) { \ + std::cerr << "error: " << (MSG) << ": " << err << std::endl; \ + exit(1); \ + } \ + } + + +std::string url("10.128.61.8:8001"); +// std::string url("127.0.0.1:8001"); +std::string model_name("bisenetv1"); +std::string model_version("1"); +uint32_t client_timeout{5000000}; + +std::string impth("../../../example.png"); +std::string savepth("./res.jpg"); +std::vector mean{0.3257, 0.3690, 0.3223}; // city, rgb +std::vector var{0.2112, 0.2148, 0.2115}; +std::string inp_name("raw_img_bytes"); +std::string outp_name("preds"); +std::string inp_type("UINT8"); + + + +std::vector> get_color_map(); +std::vector get_image(std::string, std::vector&); +std::vector get_image_bytes(std::string); +void save_predict(std::string, int64_t*, std::vector); +void do_inference(); +void do_inference_with_bytes(std::vector&, bool); +void print_infos(); +void test_speed(); + + +int main() { + // print_infos(); + do_inference(); + // test_speed(); + return 0; +} + + +void do_inference() { + // create input + // std::vector inp_data = get_image(impth, inp_shape); + std::vector inp_data = get_image_bytes(impth); + std::cout << "read image: " << impth << std::endl; + do_inference_with_bytes(inp_data, true); +} + + +void do_inference_with_bytes(std::vector& inp_data, bool verbose) { + + // define client + std::unique_ptr client; + FAIL_IF_ERR( + tc::InferenceServerGrpcClient::Create(&client, url, false), // verbose=false + "unable to create grpc client"); + if (verbose) std::cout << "create client\n"; + + //// raw image + tc::InferInput* input; + FAIL_IF_ERR( + tc::InferInput::Create(&input, inp_name, + {1, static_cast(inp_data.size())}, inp_type), + "unable to get input data"); + std::shared_ptr input_ptr; + input_ptr.reset(input); + FAIL_IF_ERR(input_ptr->Reset(), "unable to reset input data"); + FAIL_IF_ERR(input_ptr->AppendRaw(inp_data), "unable to set data for input"); + //// mean/std + tc::InferInput *inp_mean, *inp_std; + FAIL_IF_ERR( + tc::InferInput::Create(&inp_mean, "channel_mean", {1, 3}, "FP32"), + "unable to get input mean"); + FAIL_IF_ERR( + tc::InferInput::Create(&inp_std, "channel_std", {1, 3}, "FP32"), + "unable to get input std"); + std::shared_ptr inp_mean_ptr, inp_std_ptr; + inp_mean_ptr.reset(inp_mean); + inp_std_ptr.reset(inp_std); + FAIL_IF_ERR(inp_mean_ptr->Reset(), "unable to reset input mean"); + FAIL_IF_ERR(inp_std_ptr->Reset(), "unable to reset input std"); + FAIL_IF_ERR( + inp_mean_ptr->AppendRaw(reinterpret_cast(&mean[0]), // must be uint8_t data type + mean.size() * sizeof(float)), + "unable to set data for input mean"); + FAIL_IF_ERR( + inp_std_ptr->AppendRaw(reinterpret_cast(&var[0]), + var.size() * sizeof(float)), + "unable to set data for input std"); + if (verbose) std::cout << "set input\n"; + + + // create output + tc::InferRequestedOutput* output; + FAIL_IF_ERR( + tc::InferRequestedOutput::Create(&output, outp_name), + "unable to get output"); + std::shared_ptr output_ptr; + output_ptr.reset(output); + if (verbose) std::cout << "set output\n"; + + // infer options + tc::InferOptions options(model_name); + options.model_version_ = model_version; + options.client_timeout_ = client_timeout; + tc::Headers http_headers; + grpc_compression_algorithm compression_algorithm = + grpc_compression_algorithm::GRPC_COMPRESS_NONE; + if (verbose) std::cout << "set options\n"; + + // inference + std::vector inputs = {input_ptr.get(), + inp_mean_ptr.get(), inp_std_ptr.get()}; + std::vector outputs = {output_ptr.get()}; + tc::InferResult* results; + FAIL_IF_ERR( + client->Infer( + &results, options, inputs, outputs, http_headers, + compression_algorithm), + "failed sending synchronous infer request"); + std::shared_ptr results_ptr; + results_ptr.reset(results); + FAIL_IF_ERR( + results_ptr->RequestStatus(), + "inference failed"); + if (verbose) std::cout << "send request and do inference\n"; + + // parse output + int64_t* raw_outp{nullptr}; // NOTE: int64_t is used according to model + size_t n_bytes{0}; + FAIL_IF_ERR( + results_ptr->RawData( + outp_name, (const uint8_t**)(&raw_outp), &n_bytes), + "fetch output failed"); + std::vector outp_shape; + FAIL_IF_ERR( + results_ptr->Shape(outp_name, &outp_shape), + "get output shape failed"); + if (n_bytes != std::accumulate(outp_shape.begin(), outp_shape.end(), 1, + std::multiplies()) * sizeof(int64_t)) { + std::cerr << "output shape is not set correctly\n"; + exit(1); + } + if (verbose) std::cout << "fetch output\n"; + + // save colorful result + save_predict(savepth, raw_outp, outp_shape); + if (verbose) std::cout << "save inference result to:" << savepth << std::endl; +} + + +std::vector get_image(std::string impth, std::vector& shape) { + int64_t iH = shape[2]; + int64_t iW = shape[3]; + cv::Mat im = cv::imread(impth); + if (im.empty()) { + std::cerr << "cv::imread failed: " << impth << std::endl; + exit(1); + } + int64_t orgH{im.rows}, orgW{im.cols}; + if ((orgH != iH) || orgW != iW) { + std::cout << "resize orignal image of (" << orgH << "," << orgW + << ") to (" << iH << ", " << iW << ") according to model requirement\n"; + cv::resize(im, im, cv::Size(iW, iH), cv::INTER_CUBIC); + } + + std::vector data(iH * iW * 3); + float mean[3] = {0.3257f, 0.3690f, 0.3223f}; + float var[3] = {0.2112f, 0.2148f, 0.2115f}; + float scale = 1.f / 255.f; + for (float &el : var) el = 1.f / el; + for (int h{0}; h < iH; ++h) { + cv::Vec3b *p = im.ptr(h); + for (int w{0}; w < iW; ++w) { + for (int c{0}; c < 3; ++c) { + int idx = (2 - c) * iH * iW + h * iW + w; // to rgb order + data[idx] = (p[w][c] * scale - mean[c]) * var[c]; + } + } + } + return data; +} + + +std::vector get_image_bytes(std::string impth) { + std::ifstream fin(impth, std::ios::in|std::ios::binary); + fin.seekg(0, fin.end); + int nbytes = fin.tellg(); + if (nbytes == -1) { + std::cerr << "image file read failed: " << impth << std::endl; + exit(1); + } + fin.clear(); + fin.seekg(0); + + std::vector res(nbytes); + fin.read(reinterpret_cast(&res[0]), nbytes); + fin.close(); + + return res; +} + +std::vector> get_color_map() { + std::vector> color_map(256, + std::vector(3)); + std::minstd_rand rand_eng(123); + std::uniform_int_distribution u(0, 255); + for (int i{0}; i < 256; ++i) { + for (int j{0}; j < 3; ++j) { + color_map[i][j] = u(rand_eng); + } + } + return color_map; +} + + +void save_predict(std::string savename, int64_t* data, + std::vector outsize) { + std::vector> color_map = get_color_map(); + int64_t oH = outsize[2]; // outsize is n1hw + int64_t oW = outsize[3]; + cv::Mat pred(cv::Size(oW, oH), CV_8UC3); + int idx{0}; + for (int i{0}; i < oH; ++i) { + uint8_t *ptr = pred.ptr(i); + for (int j{0}; j < oW; ++j) { + ptr[0] = color_map[data[idx]][0]; + ptr[1] = color_map[data[idx]][1]; + ptr[2] = color_map[data[idx]][2]; + ptr += 3; + ++idx; + } + } + cv::imwrite(savename, pred); +} + + + +void print_infos() { + // define client + std::unique_ptr client; + FAIL_IF_ERR( + tc::InferenceServerGrpcClient::Create(&client, url, false), + "unable to create grpc client"); + + tc::Headers http_headers; + inference::ModelConfigResponse model_config; + FAIL_IF_ERR( + client->ModelConfig( + &model_config, model_name, model_version, http_headers), + "unable to get config"); + + inference::ModelMetadataResponse model_metadata; + FAIL_IF_ERR( + client->ModelMetadata( + &model_metadata, model_name, model_version, http_headers), + "unable to get meta data"); + + std::cout << "---- model info ----" << std::endl; + auto input = model_metadata.inputs(0); + auto output = model_metadata.outputs(0); + std::cout << "name: " << model_metadata.name() << std::endl; + std::cout << "platform: " << model_metadata.platform() << std::endl; + std::cout << "max_batch_size: " << model_config.config().max_batch_size() << std::endl; + + int size; + size = input.shape().size(); + std::cout << input.name() << ": \n size: ("; + for (int i{0}; i < size; ++i) { + std::cout << input.shape()[i] << ", "; + } + std::cout << ")\n data_type: " << input.datatype() << std::endl;; + size = output.shape().size(); + std::cout << output.name() << ": \n size: ("; + for (int i{0}; i < size; ++i) { + std::cout << output.shape()[i] << ", "; + } + std::cout << ")\n data_type: " << output.datatype() << std::endl;; + std::cout << "--------------------" << std::endl; +} + + +void test_speed() { + + std::vector inp_data = get_image_bytes(impth); + // warmup + do_inference_with_bytes(inp_data, false); + + std::cout << "test speed ... \n"; + const int n_loops{500}; + auto start = std::chrono::steady_clock::now(); + for (int i{0}; i < n_loops; ++i) { + do_inference_with_bytes(inp_data, false); + } + auto end = std::chrono::steady_clock::now(); + + double duration = std::chrono::duration(end - start).count(); + duration /= 1000.; + std::cout << "running " << n_loops << " times, use time: " + << duration << "s" << std::endl; + std::cout << "fps is: " << static_cast(n_loops) / duration << std::endl; +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv1/config.pbtxt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv1/config.pbtxt new file mode 100755 index 0000000000000000000000000000000000000000..c35e2abd6fe975c3f58b59fc1f59855407c792bb --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv1/config.pbtxt @@ -0,0 +1,64 @@ +name: "bisenetv1" +platform: "ensemble" +max_batch_size: 256 +input [ + { + name: "raw_img_bytes" + data_type: TYPE_UINT8 + dims: [ -1 ] + }, + { + name: "channel_mean" + data_type: TYPE_FP32 + dims: [ 3 ] + }, + { + name: "channel_std" + data_type: TYPE_FP32 + dims: [ 3 ] + } +] +output [ + { + name: "preds" + data_type: TYPE_INT64 + dims: [1, 1024, 2048 ] + } +] + +ensemble_scheduling { + step [ + { + model_name: "preprocess_py" + model_version: 1 + input_map { + key: "raw_img_bytes" + value: "raw_img_bytes" + } + input_map { + key: "channel_mean" + value: "channel_mean" + } + input_map { + key: "channel_std" + value: "channel_std" + } + output_map { + key: "processed_img" + value: "processed_img" + } + }, + { + model_name: "bisenetv1_model" + model_version: 1 + input_map { + key: "input_image" + value: "processed_img" + } + output_map { + key: "preds" + value: "preds" + } + } + ] +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv1_model/config.pbtxt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv1_model/config.pbtxt new file mode 100755 index 0000000000000000000000000000000000000000..63ea2d3a2c0530b7be84954d766f3cd1585fd478 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv1_model/config.pbtxt @@ -0,0 +1,31 @@ +name: "bisenetv1_model" +platform: "onnxruntime_onnx" +max_batch_size: 0 +input [ +{ + name: "input_image" + data_type: TYPE_FP32 + dims: [ 1, 3, 1024, 2048 ] +} +] +output [ +{ + name: "preds" + data_type: TYPE_INT64 + dims: [ 1, 1024, 2048 ] +} +] +optimization { execution_accelerators { # we use tensorrt backend, pure onnxruntime seems to have memory leackage problem + gpu_execution_accelerator : [ { + name : "tensorrt" + parameters { key: "precision_mode" value: "FP16" } + parameters { key: "max_workspace_size_bytes" value: "4294967296" } + }] +}} +instance_group [ +{ + count: 2 + kind: KIND_GPU + gpus: [ 0, 1 ] +} +] diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv2/config.pbtxt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv2/config.pbtxt new file mode 100755 index 0000000000000000000000000000000000000000..6db929b22191f9fd365ae220cb34344b91e0388a --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv2/config.pbtxt @@ -0,0 +1,64 @@ +name: "bisenetv2" +platform: "ensemble" +max_batch_size: 256 +input [ + { + name: "raw_img_bytes" + data_type: TYPE_UINT8 + dims: [ -1 ] + }, + { + name: "channel_mean" + data_type: TYPE_FP32 + dims: [ 3 ] + }, + { + name: "channel_std" + data_type: TYPE_FP32 + dims: [ 3 ] + } +] +output [ + { + name: "preds" + data_type: TYPE_INT64 + dims: [1, 1024, 2048 ] + } +] + +ensemble_scheduling { + step [ + { + model_name: "preprocess_cpp" + model_version: 1 + input_map { + key: "raw_img_bytes" + value: "raw_img_bytes" + } + input_map { + key: "channel_mean" + value: "channel_mean" + } + input_map { + key: "channel_std" + value: "channel_std" + } + output_map { + key: "processed_img" + value: "processed_img" + } + }, + { + model_name: "bisenetv2_model" + model_version: 1 + input_map { + key: "input_image" + value: "processed_img" + } + output_map { + key: "preds" + value: "preds" + } + } + ] +} diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv2_model/config.pbtxt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv2_model/config.pbtxt new file mode 100755 index 0000000000000000000000000000000000000000..a9124a914879c592905ae5525cd9ca31c98c0246 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/bisenetv2_model/config.pbtxt @@ -0,0 +1,31 @@ +name: "bisenetv2_model" +platform: "onnxruntime_onnx" +max_batch_size: 0 +input [ +{ + name: "input_image" + data_type: TYPE_FP32 + dims: [1, 3, 1024, 2048 ] +} +] +output [ +{ + name: "preds" + data_type: TYPE_INT64 + dims: [1, 1024, 2048 ] +} +] +optimization { execution_accelerators { # we use tensorrt backend, pure onnxruntime seems to have memory leackage problem + gpu_execution_accelerator : [ { + name : "tensorrt" + parameters { key: "precision_mode" value: "FP16" } + parameters { key: "max_workspace_size_bytes" value: "4294967296" } + }] +}} +instance_group [ +{ + count: 2 + kind: KIND_GPU + gpus: [ 0, 1 ] +} +] diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_cpp/1/.gitkeep b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_cpp/1/.gitkeep new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_cpp/config.pbtxt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_cpp/config.pbtxt new file mode 100755 index 0000000000000000000000000000000000000000..6dee44a3b0777e7b6da321e5b764a397412b1dbd --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_cpp/config.pbtxt @@ -0,0 +1,35 @@ +name: "preprocess_cpp" +backend: "self_backend" +max_batch_size: 256 +# dynamic_batching { ## this is not allowed, since we cannot know raw bytes size of each inputs from the server, as they just concat the bytes together +# max_queue_delay_microseconds: 5000000 +# } +input [ +{ + name: "raw_img_bytes" + data_type: TYPE_UINT8 + dims: [ -1 ] +}, +{ + name: "channel_mean" + data_type: TYPE_FP32 + dims: [ 3 ] +}, +{ + name: "channel_std" + data_type: TYPE_FP32 + dims: [ 3 ] +} +] +output [ + { + name: "processed_img" + data_type: TYPE_FP32 + dims: [ 1, 3, 1024, 2048 ] + } +] +instance_group [ + { + kind: KIND_CPU + } +] diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_py/1/model.py b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_py/1/model.py new file mode 100755 index 0000000000000000000000000000000000000000..2af1128eafb6ef480f53a712e9051236f656591f --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_py/1/model.py @@ -0,0 +1,122 @@ +import numpy as np +import sys +import json +import io + +# triton_python_backend_utils is available in every Triton Python model. You +# need to use this module to create inference requests and responses. It also +# contains some utility functions for extracting information from model_config +# and converting Triton input/output types to numpy types. +import triton_python_backend_utils as pb_utils + +from PIL import Image +import os + + +class TritonPythonModel: + """Your Python model must use the same class name. Every Python model + that is created must have "TritonPythonModel" as the class name. + """ + + def initialize(self, args): + """`initialize` is called only once when the model is being loaded. + Implementing `initialize` function is optional. This function allows + the model to intialize any state associated with this model. + + Parameters + ---------- + args : dict + Both keys and values are strings. The dictionary keys and values are: + * model_config: A JSON string containing the model configuration + * model_instance_kind: A string containing model instance kind + * model_instance_device_id: A string containing model instance device ID + * model_repository: Model repository path + * model_version: Model version + * model_name: Model name + """ + + # You must parse model_config. JSON string is not parsed here + self.model_config = model_config = json.loads(args['model_config']) + + # Get OUTPUT0 configuration + output0_config = pb_utils.get_output_config_by_name( + model_config, "processed_img") + + # Convert Triton types to numpy types + self.output0_dtype = pb_utils.triton_string_to_numpy( + output0_config['data_type']) + + self.output0_shape = output0_config['dims'] + + def execute(self, requests): + """`execute` MUST be implemented in every Python model. `execute` + function receives a list of pb_utils.InferenceRequest as the only + argument. This function is called when an inference request is made + for this model. Depending on the batching configuration (e.g. Dynamic + Batching) used, `requests` may contain multiple requests. Every + Python model, must create one pb_utils.InferenceResponse for every + pb_utils.InferenceRequest in `requests`. If there is an error, you can + set the error argument when creating a pb_utils.InferenceResponse + + Parameters + ---------- + requests : list + A list of pb_utils.InferenceRequest + + Returns + ------- + list + A list of pb_utils.InferenceResponse. The length of this list must + be the same as `requests` + """ + + output0_dtype = self.output0_dtype + N, C, H, W = self.output0_shape + + responses = [] + + # Every Python backend must iterate over everyone of the requests + # and create a pb_utils.InferenceResponse for each of them. + for request in requests: + # Get INPUT0 + im_bytes = pb_utils.get_input_tensor_by_name(request, "raw_img_bytes") + im_bytes = im_bytes.as_numpy().tobytes() + im = Image.open(io.BytesIO(im_bytes)) + im = im.resize((W, H), Image.ANTIALIAS) + im = np.array(im) + + # Get mean/std + mean = pb_utils.get_input_tensor_by_name(request, "channel_mean") + std = pb_utils.get_input_tensor_by_name(request, "channel_std") + mean = mean.as_numpy().reshape(1, 1, 3) + std = std.as_numpy().reshape(1, 1, 3) + + # preprocess + im = ((im / 255.) - mean) / std + im = im[None, ...].transpose(0, 3, 1, 2).astype(np.float32) + + + out_tensor_0 = pb_utils.Tensor("processed_img", im) + + # Create InferenceResponse. You can set an error here in case + # there was a problem with handling this inference request. + # Below is an example of how you can set errors in inference + # response: + # + # pb_utils.InferenceResponse( + # output_tensors=..., TritonError("An error occured")) + inference_response = pb_utils.InferenceResponse( + output_tensors=[out_tensor_0]) + responses.append(inference_response) + + # You should return a list of pb_utils.InferenceResponse. Length + # of this list must match the length of `requests` list. + return responses + + def finalize(self): + """`finalize` is called only once when the model is being unloaded. + Implementing `finalize` function is OPTIONAL. This function allows + the model to perform any necessary clean ups before exit. + """ + print('Cleaning up...') + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_py/config.pbtxt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_py/config.pbtxt new file mode 100755 index 0000000000000000000000000000000000000000..0ebdfd890596546c3af6bcfe2ec52551530abcec --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/models/preprocess_py/config.pbtxt @@ -0,0 +1,30 @@ +name: "preprocess_py" +backend: "python" +max_batch_size: 256 +input [ +{ + name: "raw_img_bytes" + data_type: TYPE_UINT8 + dims: [ -1 ] +}, +{ + name: "channel_mean" + data_type: TYPE_FP32 + dims: [ 3 ] +}, +{ + name: "channel_std" + data_type: TYPE_FP32 + dims: [ 3 ] +} +] + +output [ +{ + name: "processed_img" + data_type: TYPE_FP32 + dims: [1, 3, 1024, 2048 ] +} +] + +instance_group [{ kind: KIND_CPU }] diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/CMakeLists.txt b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/CMakeLists.txt new file mode 100755 index 0000000000000000000000000000000000000000..051dc9d102a871a96996572e2312f7c695e93eb4 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/CMakeLists.txt @@ -0,0 +1,185 @@ +# Copyright 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +cmake_minimum_required(VERSION 3.17) + +project(tutorialrecommendedbackend LANGUAGES C CXX) + +# +# Options +# +# Must include options required for this project as well as any +# projects included in this one by FetchContent. +# +# GPU support is disabled by default because recommended backend +# doesn't use GPUs. +# +option(TRITON_ENABLE_GPU "Enable GPU support in backend" OFF) +option(TRITON_ENABLE_STATS "Include statistics collections in backend" ON) + +set(TRITON_COMMON_REPO_TAG "main" CACHE STRING "Tag for triton-inference-server/common repo") +set(TRITON_CORE_REPO_TAG "main" CACHE STRING "Tag for triton-inference-server/core repo") +set(TRITON_BACKEND_REPO_TAG "main" CACHE STRING "Tag for triton-inference-server/backend repo") + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() + +# +# Dependencies +# +# FetchContent requires us to include the transitive closure of all +# repos that we depend on so that we can override the tags. +# +include(FetchContent) + +FetchContent_Declare( + repo-common + GIT_REPOSITORY https://github.com/triton-inference-server/common.git + GIT_TAG ${TRITON_COMMON_REPO_TAG} + GIT_SHALLOW ON +) +FetchContent_Declare( + repo-core + GIT_REPOSITORY https://github.com/triton-inference-server/core.git + GIT_TAG ${TRITON_CORE_REPO_TAG} + GIT_SHALLOW ON +) +FetchContent_Declare( + repo-backend + GIT_REPOSITORY https://github.com/triton-inference-server/backend.git + GIT_TAG ${TRITON_BACKEND_REPO_TAG} + GIT_SHALLOW ON +) +FetchContent_MakeAvailable(repo-common repo-core repo-backend) + +find_package (OpenCV REQUIRED) + +# +# The backend must be built into a shared library. Use an ldscript to +# hide all symbols except for the TRITONBACKEND API. +# +configure_file(src/libtriton_recommended.ldscript libtriton_recommended.ldscript COPYONLY) + +add_library( + triton-self_backend-backend SHARED + src/recommended.cc +) + +add_library( + TutorialRecommendedBackend::triton-self_backend-backend ALIAS triton-self_backend-backend +) + +target_include_directories( + triton-self_backend-backend + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/src + ${OpenCV_INCLUDE_DIRS} +) + +target_compile_features(triton-self_backend-backend PRIVATE cxx_std_14) +target_compile_options( + triton-self_backend-backend PRIVATE + $<$,$,$>: + -Wall -Wextra -Wno-unused-parameter -Wno-type-limits -Werror> + $<$:/Wall /D_WIN32_WINNT=0x0A00 /EHsc> +) + +target_link_libraries( + triton-self_backend-backend + PRIVATE + triton-core-serverapi # from repo-core + triton-core-backendapi # from repo-core + triton-core-serverstub # from repo-core + triton-backend-utils # from repo-backend + ${OpenCV_LIBS} +) + +if(WIN32) + set_target_properties( + triton-self_backend-backend PROPERTIES + POSITION_INDEPENDENT_CODE ON + OUTPUT_NAME triton_self_backend + ) +else() + set_target_properties( + triton-self_backend-backend PROPERTIES + POSITION_INDEPENDENT_CODE ON + OUTPUT_NAME triton_self_backend + LINK_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/libtriton_recommended.ldscript + LINK_FLAGS "-Wl,--version-script libtriton_recommended.ldscript" + ) +endif() + +# +# Install +# +include(GNUInstallDirs) +set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/TutorialRecommendedBackend) + +install( + TARGETS + triton-self_backend-backend + EXPORT + triton-self_backend-backend-targets + LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/backends/self_backend + RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/backends/self_backend +) + +install( + EXPORT + triton-self_backend-backend-targets + FILE + TutorialRecommendedBackendTargets.cmake + NAMESPACE + TutorialRecommendedBackend:: + DESTINATION + ${INSTALL_CONFIGDIR} +) + +include(CMakePackageConfigHelpers) +configure_package_config_file( + ${CMAKE_CURRENT_LIST_DIR}/cmake/TutorialRecommendedBackendConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/TutorialRecommendedBackendConfig.cmake + INSTALL_DESTINATION ${INSTALL_CONFIGDIR} +) + +install( + FILES + ${CMAKE_CURRENT_BINARY_DIR}/TutorialRecommendedBackendConfig.cmake + DESTINATION ${INSTALL_CONFIGDIR} +) + +# +# Export from build tree +# +export( + EXPORT triton-self_backend-backend-targets + FILE ${CMAKE_CURRENT_BINARY_DIR}/TutorialRecommendedBackendTargets.cmake + NAMESPACE TutorialRecommendedBackend:: +) + +export(PACKAGE TutorialRecommendedBackend) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/cmake/TutorialRecommendedBackendConfig.cmake.in b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/cmake/TutorialRecommendedBackendConfig.cmake.in new file mode 100755 index 0000000000000000000000000000000000000000..4007f9f8d7a4f302be52acc868532b4929739f48 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/cmake/TutorialRecommendedBackendConfig.cmake.in @@ -0,0 +1,39 @@ +# Copyright 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +include(CMakeFindDependencyMacro) + +get_filename_component( + TUTORIALRECOMMENDEDBACKEND_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH +) + +list(APPEND CMAKE_MODULE_PATH ${TUTORIALRECOMMENDEDBACKEND_CMAKE_DIR}) + +if(NOT TARGET TutorialRecommendedBackend::triton-recommended-backend) + include("${TUTORIALRECOMMENDEDBACKEND_CMAKE_DIR}/TutorialRecommendedBackendTargets.cmake") +endif() + +set(TUTORIALRECOMMENDEDBACKEND_LIBRARIES TutorialRecommendedBackend::triton-recommended-backend) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/src/libtriton_recommended.ldscript b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/src/libtriton_recommended.ldscript new file mode 100755 index 0000000000000000000000000000000000000000..748714d16fd3a4d028e71216f33da78ff4e6dbe9 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/src/libtriton_recommended.ldscript @@ -0,0 +1,30 @@ +# Copyright 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of NVIDIA CORPORATION nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +{ + global: + TRITONBACKEND_*; + local: *; +}; diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/src/recommended.cc b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/src/recommended.cc new file mode 100755 index 0000000000000000000000000000000000000000..bb757cee795c18fafb8ce62dfa2b583a65822066 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tis/self_backend/src/recommended.cc @@ -0,0 +1,916 @@ +// Copyright 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// * Neither the name of NVIDIA CORPORATION nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY +// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "triton/backend/backend_common.h" +#include "triton/backend/backend_input_collector.h" +#include "triton/backend/backend_model.h" +#include "triton/backend/backend_model_instance.h" +#include "triton/backend/backend_output_responder.h" +#include "triton/core/tritonbackend.h" +#include +#include +#include +#include + +using std::cout; +using std::endl; + + +///////////// +// +// Coin: ModelEndPoint +// +// Wraps model end point information + +struct InModelEndPoint { + // Seems tis will take care of input buffer memory, so we just + // use the pointer without caring about memory release + const char *buffer; + size_t buffer_byte_size; + TRITONSERVER_MemoryType buffer_memory_type; + int64_t buffer_memory_type_id; +}; + +struct OutModelEndPoint { + // It is up to user to allocate output buffer memory, therefore + // we should take care of memory release with shared_ptr + std::shared_ptr buffer; + size_t buffer_byte_size; + TRITONSERVER_MemoryType buffer_memory_type; + int64_t buffer_memory_type_id; + std::vector shape; +}; + + +//// call back function +// Input is raw bytes, which will be decoded into image tensors +// It is not allowed to batch raw bytes inputs together to decode and preprocess +// Therefore we should not use the field of 'dynamic_batching' in the config.pbtxt +void callback_func(std::vector& inputs, + std::vector& outputs) { + + // decode image and resize + cv::Mat buffer = cv::Mat(cv::Size(1, inputs[0].buffer_byte_size), + CV_8UC1, const_cast(inputs[0].buffer)); + cv::Mat im = cv::imdecode(buffer, cv::IMREAD_COLOR); + cout << "image size: " << im.size() << endl; + int ndims = outputs[0].shape.size(); + int H = outputs[0].shape[ndims - 2]; // last two dims as hw + int W = outputs[0].shape[ndims - 1]; + cv::Mat imresized = im; + if (im.rows != H or im.cols != W) { + cv::resize(im, imresized, cv::Size(W, H), 0., 0., cv::INTER_CUBIC); + cout << "resize image into: " << imresized.size() << endl; + } + + // obtain mean/std + std::vector channel_mean(3), channel_std(3); + for (int i{0}; i < 3; ++i) { + channel_mean[i] = reinterpret_cast( + const_cast(inputs[1].buffer))[i]; + channel_std[i] = 1. / reinterpret_cast( + const_cast(inputs[2].buffer))[i]; + } + float scale = 1. / 255; + + // allocate output buffer + outputs[0].buffer = std::shared_ptr( + new char[outputs[0].buffer_byte_size], + [](const char* p) {cout<<"release output memory\n"; delete[] p;}); + float* obuf = reinterpret_cast(const_cast(outputs[0].buffer.get())); + + // divide 255 and then normalize with channel mean/std + for (int h{0}; h < H; ++h) { + cv::Vec3b *ptr = imresized.ptr(h); + for (int w{0}; w < W; ++w) { + for (int c{0}; c < 3; ++c) { + int ind = c * H * W + h * W + w; + obuf[ind] = (ptr[w][2 - c] * scale - channel_mean[c]) * channel_std[c]; + } + } + } +} + + +namespace triton { namespace backend { namespace recommended { + +// +// Backend that demonstrates the TRITONBACKEND API. This backend works +// for any model that has 1 input with any datatype and any shape and +// 1 output with the same shape and datatype as the input. The backend +// supports both batching and non-batching models. +// +// For each batch of requests, the backend returns the input tensor +// value in the output tensor. +// + +///////////// + +extern "C" { + +// Triton calls TRITONBACKEND_Initialize when a backend is loaded into +// Triton to allow the backend to create and initialize any state that +// is intended to be shared across all models and model instances that +// use the backend. The backend should also verify version +// compatibility with Triton in this function. +// +TRITONSERVER_Error* +TRITONBACKEND_Initialize(TRITONBACKEND_Backend* backend) +{ + const char* cname; + RETURN_IF_ERROR(TRITONBACKEND_BackendName(backend, &cname)); + std::string name(cname); + + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("TRITONBACKEND_Initialize: ") + name).c_str()); + + // Check the backend API version that Triton supports vs. what this + // backend was compiled against. Make sure that the Triton major + // version is the same and the minor version is >= what this backend + // uses. + uint32_t api_version_major, api_version_minor; + RETURN_IF_ERROR( + TRITONBACKEND_ApiVersion(&api_version_major, &api_version_minor)); + + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("Triton TRITONBACKEND API version: ") + + std::to_string(api_version_major) + "." + + std::to_string(api_version_minor)) + .c_str()); + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("'") + name + "' TRITONBACKEND API version: " + + std::to_string(TRITONBACKEND_API_VERSION_MAJOR) + "." + + std::to_string(TRITONBACKEND_API_VERSION_MINOR)) + .c_str()); + + if ((api_version_major != TRITONBACKEND_API_VERSION_MAJOR) || + (api_version_minor < TRITONBACKEND_API_VERSION_MINOR)) { + return TRITONSERVER_ErrorNew( + TRITONSERVER_ERROR_UNSUPPORTED, + "triton backend API version does not support this backend"); + } + + // The backend configuration may contain information needed by the + // backend, such as tritonserver command-line arguments. This + // backend doesn't use any such configuration but for this example + // print whatever is available. + TRITONSERVER_Message* backend_config_message; + RETURN_IF_ERROR( + TRITONBACKEND_BackendConfig(backend, &backend_config_message)); + + const char* buffer; + size_t byte_size; + RETURN_IF_ERROR(TRITONSERVER_MessageSerializeToJson( + backend_config_message, &buffer, &byte_size)); + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("backend configuration:\n") + buffer).c_str()); + + // This backend does not require any "global" state but as an + // example create a string to demonstrate. + std::string* state = new std::string("backend state"); + RETURN_IF_ERROR( + TRITONBACKEND_BackendSetState(backend, reinterpret_cast(state))); + + return nullptr; // success +} + +// Triton calls TRITONBACKEND_Finalize when a backend is no longer +// needed. +// +TRITONSERVER_Error* +TRITONBACKEND_Finalize(TRITONBACKEND_Backend* backend) +{ + // Delete the "global" state associated with the backend. + void* vstate; + RETURN_IF_ERROR(TRITONBACKEND_BackendState(backend, &vstate)); + std::string* state = reinterpret_cast(vstate); + + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("TRITONBACKEND_Finalize: state is '") + *state + "'") + .c_str()); + + delete state; + + return nullptr; // success +} + +} // extern "C" + +///////////// + +// +// ModelState +// +// State associated with a model that is using this backend. An object +// of this class is created and associated with each +// TRITONBACKEND_Model. ModelState is derived from BackendModel class +// provided in the backend utilities that provides many common +// functions. +// +class ModelState : public BackendModel { + public: + static TRITONSERVER_Error* Create( + TRITONBACKEND_Model* triton_model, ModelState** state); + virtual ~ModelState() = default; + + // Name of the input and output tensor + const std::string& InputTensorName(int ind) const { return input_names_[ind]; } + const std::string& OutputTensorName(int ind) const { return output_names_[ind]; } + + // Datatype of the input and output tensor + /// TRITONSERVER_DataType TensorDataType() const { return datatype_; } + TRITONSERVER_DataType InputTensorDataType(int ind) const { return inp_dtypes_[ind]; } + TRITONSERVER_DataType OutputTensorDataType(int ind) const { return outp_dtypes_[ind]; } + + // Shape of the input and output tensor as given in the model + // configuration file. This shape will not include the batch + // dimension (if the model has one). + const std::vector& InputTensorNonBatchShape(int ind) const { return inp_nb_shapes_[ind]; } + const std::vector& OutputTensorNonBatchShape(int ind) const { return outp_nb_shapes_[ind]; } + + // Shape of the input and output tensor, including the batch + // dimension (if the model has one). This method cannot be called + // until the model is completely loaded and initialized, including + // all instances of the model. In practice, this means that backend + // should only call it in TRITONBACKEND_ModelInstanceExecute. + TRITONSERVER_Error* InputTensorShape(std::vector& shape, int ind); + TRITONSERVER_Error* OutputTensorShape(std::vector& shape, int ind); + + // Number of inputs and outputs + int NumOfInputs() { return n_inps; } + int NumOfOutputs() { return n_outps; } + + // Validate that this model is supported by this backend. + TRITONSERVER_Error* ValidateModelConfig(); + + private: + ModelState(TRITONBACKEND_Model* triton_model); + + std::vector input_names_; + std::vector output_names_; + + std::vector inp_dtypes_; + std::vector outp_dtypes_; + + std::vector inp_shape_initialized_; + std::vector outp_shape_initialized_; + std::vector> inp_nb_shapes_; // no-batch shape + std::vector> inp_shapes_; + std::vector> outp_nb_shapes_; // no-batch shape + std::vector> outp_shapes_; + + int n_inps; + int n_outps; +}; + +ModelState::ModelState(TRITONBACKEND_Model* triton_model) + : BackendModel(triton_model) +{ + // Validate that the model's configuration matches what is supported + // by this backend. + THROW_IF_BACKEND_MODEL_ERROR(ValidateModelConfig()); +} + +TRITONSERVER_Error* +ModelState::Create(TRITONBACKEND_Model* triton_model, ModelState** state) +{ + try { + *state = new ModelState(triton_model); + } + catch (const BackendModelException& ex) { + RETURN_ERROR_IF_TRUE( + ex.err_ == nullptr, TRITONSERVER_ERROR_INTERNAL, + std::string("unexpected nullptr in BackendModelException")); + RETURN_IF_ERROR(ex.err_); + } + + return nullptr; // success +} + + +TRITONSERVER_Error* +ModelState::InputTensorShape(std::vector& shape, int ind) +{ + // This backend supports models that batch along the first dimension + // and those that don't batch. For non-batch models the output shape + // will be the shape from the model configuration. For batch models + // the output shape will be the shape from the model configuration + // prepended with [ -1 ] to represent the batch dimension. The + // backend "responder" utility used below will set the appropriate + // batch dimension value for each response. The shape needs to be + // initialized lazily because the SupportsFirstDimBatching function + // cannot be used until the model is completely loaded. + if (!inp_shape_initialized_[ind]) { + bool supports_first_dim_batching; + RETURN_IF_ERROR(SupportsFirstDimBatching(&supports_first_dim_batching)); + if (supports_first_dim_batching) { + inp_shapes_[ind].push_back(-1); + } + + inp_shapes_[ind].insert( + inp_shapes_[ind].end(), + inp_nb_shapes_[ind].begin(), + inp_nb_shapes_[ind].end()); + inp_shape_initialized_[ind] = true; + } + + shape = inp_shapes_[ind]; + + return nullptr; // success +} + + +TRITONSERVER_Error* +ModelState::OutputTensorShape(std::vector& shape, int ind) +{ + // This backend supports models that batch along the first dimension + // and those that don't batch. For non-batch models the output shape + // will be the shape from the model configuration. For batch models + // the output shape will be the shape from the model configuration + // prepended with [ -1 ] to represent the batch dimension. The + // backend "responder" utility used below will set the appropriate + // batch dimension value for each response. The shape needs to be + // initialized lazily because the SupportsFirstDimBatching function + // cannot be used until the model is completely loaded. + if (!outp_shape_initialized_[ind]) { + bool supports_first_dim_batching; + RETURN_IF_ERROR(SupportsFirstDimBatching(&supports_first_dim_batching)); + if (supports_first_dim_batching) { + outp_shapes_[ind].push_back(-1); + } + + outp_shapes_[ind].insert( + outp_shapes_[ind].end(), + outp_nb_shapes_[ind].begin(), + outp_nb_shapes_[ind].end()); + outp_shape_initialized_[ind] = true; + } + + shape = outp_shapes_[ind]; + + return nullptr; // success +} + + +TRITONSERVER_Error* +ModelState::ValidateModelConfig() +{ + // If verbose logging is enabled, dump the model's configuration as + // JSON into the console output. + if (TRITONSERVER_LogIsEnabled(TRITONSERVER_LOG_VERBOSE)) { + common::TritonJson::WriteBuffer buffer; + RETURN_IF_ERROR(ModelConfig().PrettyWrite(&buffer)); + LOG_MESSAGE( + TRITONSERVER_LOG_VERBOSE, + (std::string("model configuration:\n") + buffer.Contents()).c_str()); + } + + // ModelConfig is the model configuration as a TritonJson + // object. Use the TritonJson utilities to parse the JSON and + // determine if the configuration is supported by this backend. + common::TritonJson::Value inputs, outputs; + RETURN_IF_ERROR(ModelConfig().MemberAsArray("input", &inputs)); + RETURN_IF_ERROR(ModelConfig().MemberAsArray("output", &outputs)); + + + //// input name, data_type and shape from config.pbtxt + n_inps = inputs.ArraySize(); // num_inputs + inp_shapes_.resize(n_inps); + for (int i{0}; i < n_inps; ++i) { + + common::TritonJson::Value input; + RETURN_IF_ERROR(inputs.IndexAsObject(i, &input)); + + // name + const char* input_name; + size_t input_name_len; + RETURN_IF_ERROR(input.MemberAsString("name", &input_name, &input_name_len)); + input_names_.push_back(std::string(input_name)); + + // data type + std::string input_dtype; + RETURN_IF_ERROR(input.MemberAsString("data_type", &input_dtype)); + inp_dtypes_.push_back(ModelConfigDataTypeToTritonServerDataType(input_dtype)); + + // dims and shape + std::vector input_shape; + RETURN_IF_ERROR(backend::ParseShape(input, "dims", &input_shape)); + inp_nb_shapes_.push_back(input_shape); + inp_shape_initialized_.push_back(false); + + } + + //// out name, data_type and shape from config.pbtxt + n_outps = outputs.ArraySize(); // num_outputs + outp_shapes_.resize(n_outps); + for (int i{0}; i < n_outps; ++i) { + + common::TritonJson::Value output; + RETURN_IF_ERROR(outputs.IndexAsObject(i, &output)); + + // name + const char* output_name; + size_t output_name_len; + RETURN_IF_ERROR( + output.MemberAsString("name", &output_name, &output_name_len)); + output_names_.push_back(std::string(output_name)); + + // data type + std::string output_dtype; + RETURN_IF_ERROR(output.MemberAsString("data_type", &output_dtype)); + outp_dtypes_.push_back(ModelConfigDataTypeToTritonServerDataType(output_dtype)); + + // dims and shape + std::vector output_shape; + RETURN_IF_ERROR(backend::ParseShape(output, "dims", &output_shape)); + outp_nb_shapes_.push_back(output_shape); + outp_shape_initialized_.push_back(false); + } + + return nullptr; // success +} + +extern "C" { + +// Triton calls TRITONBACKEND_ModelInitialize when a model is loaded +// to allow the backend to create any state associated with the model, +// and to also examine the model configuration to determine if the +// configuration is suitable for the backend. Any errors reported by +// this function will prevent the model from loading. +// +TRITONSERVER_Error* +TRITONBACKEND_ModelInitialize(TRITONBACKEND_Model* model) +{ + // Create a ModelState object and associate it with the + // TRITONBACKEND_Model. If anything goes wrong with initialization + // of the model state then an error is returned and Triton will fail + // to load the model. + ModelState* model_state; + RETURN_IF_ERROR(ModelState::Create(model, &model_state)); + RETURN_IF_ERROR( + TRITONBACKEND_ModelSetState(model, reinterpret_cast(model_state))); + + return nullptr; // success +} + +// Triton calls TRITONBACKEND_ModelFinalize when a model is no longer +// needed. The backend should cleanup any state associated with the +// model. This function will not be called until all model instances +// of the model have been finalized. +// +TRITONSERVER_Error* +TRITONBACKEND_ModelFinalize(TRITONBACKEND_Model* model) +{ + void* vstate; + RETURN_IF_ERROR(TRITONBACKEND_ModelState(model, &vstate)); + ModelState* model_state = reinterpret_cast(vstate); + delete model_state; + + return nullptr; // success +} + +} // extern "C" + + +///////////// + +// +// ModelInstanceState +// +// State associated with a model instance. An object of this class is +// created and associated with each +// TRITONBACKEND_ModelInstance. ModelInstanceState is derived from +// BackendModelInstance class provided in the backend utilities that +// provides many common functions. +// +class ModelInstanceState : public BackendModelInstance { + public: + static TRITONSERVER_Error* Create( + ModelState* model_state, + TRITONBACKEND_ModelInstance* triton_model_instance, + ModelInstanceState** state); + virtual ~ModelInstanceState() = default; + + // Get the state of the model that corresponds to this instance. + ModelState* StateForModel() const { return model_state_; } + + private: + ModelInstanceState( + ModelState* model_state, + TRITONBACKEND_ModelInstance* triton_model_instance) + : BackendModelInstance(model_state, triton_model_instance), + model_state_(model_state) + { + } + + ModelState* model_state_; +}; + +TRITONSERVER_Error* +ModelInstanceState::Create( + ModelState* model_state, TRITONBACKEND_ModelInstance* triton_model_instance, + ModelInstanceState** state) +{ + try { + *state = new ModelInstanceState(model_state, triton_model_instance); + } + catch (const BackendModelInstanceException& ex) { + RETURN_ERROR_IF_TRUE( + ex.err_ == nullptr, TRITONSERVER_ERROR_INTERNAL, + std::string("unexpected nullptr in BackendModelInstanceException")); + RETURN_IF_ERROR(ex.err_); + } + + return nullptr; // success +} + +extern "C" { + +// Triton calls TRITONBACKEND_ModelInstanceInitialize when a model +// instance is created to allow the backend to initialize any state +// associated with the instance. +// +TRITONSERVER_Error* +TRITONBACKEND_ModelInstanceInitialize(TRITONBACKEND_ModelInstance* instance) +{ + // Get the model state associated with this instance's model. + TRITONBACKEND_Model* model; + RETURN_IF_ERROR(TRITONBACKEND_ModelInstanceModel(instance, &model)); + + void* vmodelstate; + RETURN_IF_ERROR(TRITONBACKEND_ModelState(model, &vmodelstate)); + ModelState* model_state = reinterpret_cast(vmodelstate); + + // Create a ModelInstanceState object and associate it with the + // TRITONBACKEND_ModelInstance. + ModelInstanceState* instance_state; + RETURN_IF_ERROR( + ModelInstanceState::Create(model_state, instance, &instance_state)); + RETURN_IF_ERROR(TRITONBACKEND_ModelInstanceSetState( + instance, reinterpret_cast(instance_state))); + + return nullptr; // success +} + +// Triton calls TRITONBACKEND_ModelInstanceFinalize when a model +// instance is no longer needed. The backend should cleanup any state +// associated with the model instance. +// +TRITONSERVER_Error* +TRITONBACKEND_ModelInstanceFinalize(TRITONBACKEND_ModelInstance* instance) +{ + void* vstate; + RETURN_IF_ERROR(TRITONBACKEND_ModelInstanceState(instance, &vstate)); + ModelInstanceState* instance_state = + reinterpret_cast(vstate); + delete instance_state; + + return nullptr; // success +} + +} // extern "C" + +///////////// + +extern "C" { + +// When Triton calls TRITONBACKEND_ModelInstanceExecute it is required +// that a backend create a response for each request in the batch. A +// response may be the output tensors required for that request or may +// be an error that is returned in the response. +// +TRITONSERVER_Error* +TRITONBACKEND_ModelInstanceExecute( + TRITONBACKEND_ModelInstance* instance, TRITONBACKEND_Request** requests, + const uint32_t request_count) +{ + // Collect various timestamps during the execution of this batch or + // requests. These values are reported below before returning from + // the function. + + uint64_t exec_start_ns = 0; + SET_TIMESTAMP(exec_start_ns); + + // Triton will not call this function simultaneously for the same + // 'instance'. But since this backend could be used by multiple + // instances from multiple models the implementation needs to handle + // multiple calls to this function at the same time (with different + // 'instance' objects). Best practice for a high-performance + // implementation is to avoid introducing mutex/lock and instead use + // only function-local and model-instance-specific state. + ModelInstanceState* instance_state; + RETURN_IF_ERROR(TRITONBACKEND_ModelInstanceState( + instance, reinterpret_cast(&instance_state))); + ModelState* model_state = instance_state->StateForModel(); + + // 'responses' is initialized as a parallel array to 'requests', + // with one TRITONBACKEND_Response object for each + // TRITONBACKEND_Request object. If something goes wrong while + // creating these response objects, the backend simply returns an + // error from TRITONBACKEND_ModelInstanceExecute, indicating to + // Triton that this backend did not create or send any responses and + // so it is up to Triton to create and send an appropriate error + // response for each request. RETURN_IF_ERROR is one of several + // useful macros for error handling that can be found in + // backend_common.h. + + std::vector responses; + responses.reserve(request_count); + for (uint32_t r = 0; r < request_count; ++r) { + TRITONBACKEND_Request* request = requests[r]; + TRITONBACKEND_Response* response; + RETURN_IF_ERROR(TRITONBACKEND_ResponseNew(&response, request)); + responses.push_back(response); + } + + // At this point, the backend takes ownership of 'requests', which + // means that it is responsible for sending a response for every + // request. From here, even if something goes wrong in processing, + // the backend must return 'nullptr' from this function to indicate + // success. Any errors and failures must be communicated via the + // response objects. + // + // To simplify error handling, the backend utilities manage + // 'responses' in a specific way and it is recommended that backends + // follow this same pattern. When an error is detected in the + // processing of a request, an appropriate error response is sent + // and the corresponding TRITONBACKEND_Response object within + // 'responses' is set to nullptr to indicate that the + // request/response has already been handled and no futher processing + // should be performed for that request. Even if all responses fail, + // the backend still allows execution to flow to the end of the + // function so that statistics are correctly reported by the calls + // to TRITONBACKEND_ModelInstanceReportStatistics and + // TRITONBACKEND_ModelInstanceReportBatchStatistics. + // RESPOND_AND_SET_NULL_IF_ERROR, and + // RESPOND_ALL_AND_SET_NULL_IF_ERROR are macros from + // backend_common.h that assist in this management of response + // objects. + + // The backend could iterate over the 'requests' and process each + // one separately. But for performance reasons it is usually + // preferred to create batched input tensors that are processed + // simultaneously. This is especially true for devices like GPUs + // that are capable of exploiting the large amount parallelism + // exposed by larger data sets. + // + // The backend utilities provide a "collector" to facilitate this + // batching process. The 'collector's ProcessTensor function will + // combine a tensor's value from each request in the batch into a + // single contiguous buffer. The buffer can be provided by the + // backend or 'collector' can create and manage it. In this backend, + // there is not a specific buffer into which the batch should be + // created, so use ProcessTensor arguments that cause collector to + // manage it. + + BackendInputCollector collector( + requests, request_count, &responses, model_state->TritonMemoryManager(), + false /* pinned_enabled */, nullptr /* stream*/); + + // To instruct ProcessTensor to "gather" the entire batch of input + // tensors into a single contiguous buffer in CPU memory, set the + // "allowed input types" to be the CPU ones (see tritonserver.h in + // the triton-inference-server/core repo for allowed memory types). + std::vector> allowed_input_types = + {{TRITONSERVER_MEMORY_CPU_PINNED, 0}, {TRITONSERVER_MEMORY_CPU, 0}}; + + /// Coin: Here we get input buffers and meta info, such that we can process + /// them and implement the logic of the backend + int n_inps = model_state->NumOfInputs(); + std::vector inputs(n_inps); + for (int i{0}; i < n_inps; ++i) { + RESPOND_ALL_AND_SET_NULL_IF_ERROR( + responses, request_count, + collector.ProcessTensor( + model_state->InputTensorName(i).c_str(), nullptr /* existing_buffer */, + 0 /* existing_buffer_byte_size */, allowed_input_types, + &inputs[i].buffer, + &inputs[i].buffer_byte_size, + &inputs[i].buffer_memory_type, + &inputs[i].buffer_memory_type_id)); + } + + int n_outps = model_state->NumOfOutputs(); + std::vector outputs(n_outps); + for (int i{0}; i < n_outps; ++i) { + outputs[i].buffer_memory_type = TRITONSERVER_MEMORY_CPU; + outputs[i].buffer_memory_type_id = 0; + model_state->OutputTensorShape(outputs[i].shape, i); + int64_t byte_size = TRITONSERVER_DataTypeByteSize( + model_state->OutputTensorDataType(i)); + int64_t n_pixels = std::accumulate( + outputs[i].shape.begin()+1, outputs[i].shape.end(), + 1, std::multiplies()); + outputs[i].buffer_byte_size = n_pixels * byte_size; + + /// print datatype + /// cout << TRITONSERVER_DataTypeString(model_state->OutputTensorDataType(i)) << endl; + } + + //// Coin: here we implement our logic + callback_func(inputs, outputs); + + + // Finalize the collector. If 'true' is returned, 'input_buffer' + // will not be valid until the backend synchronizes the CUDA + // stream or event that was used when creating the collector. For + // this backend, GPU is not supported and so no CUDA sync should + // be needed; so if 'true' is returned simply log an error. + const bool need_cuda_input_sync = collector.Finalize(); + if (need_cuda_input_sync) { + LOG_MESSAGE( + TRITONSERVER_LOG_ERROR, + "'recommended' backend: unexpected CUDA sync required by collector"); + } + + // 'input_buffer' contains the batched input tensor. The backend can + // implement whatever logic is necessary to produce the output + // tensor. This backend simply logs the input tensor value and then + // returns the input tensor value in the output tensor so no actual + // computation is needed. + + uint64_t compute_start_ns = 0; + SET_TIMESTAMP(compute_start_ns); + + /* + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("model ") + model_state->Name() + ": requests in batch " + + std::to_string(request_count)) + .c_str()); + std::string tstr; + IGNORE_ERROR(BufferAsTypedString( + tstr, input_buffer, input_buffer_byte_size, + model_state->TensorDataType())); + LOG_MESSAGE( + TRITONSERVER_LOG_INFO, + (std::string("batched " + model_state->InputTensorName() + " value: ") + + tstr) + .c_str()); + */ + + // const char* output_buffer = input_buffer; + // TRITONSERVER_MemoryType output_buffer_memory_type = input_buffer_memory_type; + // int64_t output_buffer_memory_type_id = input_buffer_memory_type_id; + + uint64_t compute_end_ns = 0; + SET_TIMESTAMP(compute_end_ns); + + bool supports_first_dim_batching; + RESPOND_ALL_AND_SET_NULL_IF_ERROR( + responses, request_count, + model_state->SupportsFirstDimBatching(&supports_first_dim_batching)); + + std::vector> outp_shapes(n_outps); + for (int i{0}; i < n_outps; ++i) { + RESPOND_ALL_AND_SET_NULL_IF_ERROR( + responses, request_count, model_state->OutputTensorShape( + outp_shapes[i], i)); + } + + // Because the output tensor values are concatenated into a single + // contiguous 'output_buffer', the backend must "scatter" them out + // to the individual response output tensors. The backend utilities + // provide a "responder" to facilitate this scattering process. + + // The 'responders's ProcessTensor function will copy the portion of + // 'output_buffer' corresonding to each request's output into the + // response for that request. + + BackendOutputResponder responder( + requests, request_count, &responses, model_state->TritonMemoryManager(), + supports_first_dim_batching, false /* pinned_enabled */, + nullptr /* stream*/); + + for (int i{0}; i < n_outps; ++i) { + const char* output_buffer = outputs[i].buffer.get(); + //const char* output_buffer = new char[16]; + responder.ProcessTensor( + model_state->OutputTensorName(i).c_str(), model_state->OutputTensorDataType(i), + outp_shapes[i], output_buffer, outputs[i].buffer_memory_type, + outputs[i].buffer_memory_type_id); + + } + + // Finalize the responder. If 'true' is returned, the output + // tensors' data will not be valid until the backend synchronizes + // the CUDA stream or event that was used when creating the + // responder. For this backend, GPU is not supported and so no CUDA + // sync should be needed; so if 'true' is returned simply log an + // error. + const bool need_cuda_output_sync = responder.Finalize(); + if (need_cuda_output_sync) { + LOG_MESSAGE( + TRITONSERVER_LOG_ERROR, + "'recommended' backend: unexpected CUDA sync required by responder"); + } + + // Send all the responses that haven't already been sent because of + // an earlier error. + for (auto& response : responses) { + if (response != nullptr) { + LOG_IF_ERROR( + TRITONBACKEND_ResponseSend( + response, TRITONSERVER_RESPONSE_COMPLETE_FINAL, nullptr), + "failed to send response"); + } + } + + uint64_t exec_end_ns = 0; + SET_TIMESTAMP(exec_end_ns); + +#ifdef TRITON_ENABLE_STATS + // For batch statistics need to know the total batch size of the + // requests. This is not necessarily just the number of requests, + // because if the model supports batching then any request can be a + // batched request itself. + size_t total_batch_size = 0; + if (!supports_first_dim_batching) { + total_batch_size = request_count; + } else { + for (uint32_t r = 0; r < request_count; ++r) { + auto& request = requests[r]; + TRITONBACKEND_Input* input = nullptr; + LOG_IF_ERROR( + TRITONBACKEND_RequestInputByIndex(request, 0 /* index */, &input), + "failed getting request input"); + if (input != nullptr) { + const int64_t* shape = nullptr; + LOG_IF_ERROR( + TRITONBACKEND_InputProperties( + input, nullptr, nullptr, &shape, nullptr, nullptr, nullptr), + "failed getting input properties"); + if (shape != nullptr) { + total_batch_size += shape[0]; + } + } + } + } +#else + (void)exec_start_ns; + (void)exec_end_ns; + (void)compute_start_ns; + (void)compute_end_ns; +#endif // TRITON_ENABLE_STATS + + // Report statistics for each request, and then release the request. + for (uint32_t r = 0; r < request_count; ++r) { + auto& request = requests[r]; + +#ifdef TRITON_ENABLE_STATS + LOG_IF_ERROR( + TRITONBACKEND_ModelInstanceReportStatistics( + instance_state->TritonModelInstance(), request, + (responses[r] != nullptr) /* success */, exec_start_ns, + compute_start_ns, compute_end_ns, exec_end_ns), + "failed reporting request statistics"); +#endif // TRITON_ENABLE_STATS + + LOG_IF_ERROR( + TRITONBACKEND_RequestRelease(request, TRITONSERVER_REQUEST_RELEASE_ALL), + "failed releasing request"); + } + +#ifdef TRITON_ENABLE_STATS + // Report batch statistics. + LOG_IF_ERROR( + TRITONBACKEND_ModelInstanceReportBatchStatistics( + instance_state->TritonModelInstance(), total_batch_size, + exec_start_ns, compute_start_ns, compute_end_ns, exec_end_ns), + "failed reporting batch request statistics"); +#endif // TRITON_ENABLE_STATS + + return nullptr; // success +} + +} // extern "C" + +}}} // namespace triton::backend::recommended diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/__init__.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/check_dataset_info.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/check_dataset_info.py new file mode 100755 index 0000000000000000000000000000000000000000..37aaee5bd25a926e1094a7be3b0f25c8b1131965 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/check_dataset_info.py @@ -0,0 +1,118 @@ + +import os +import os.path as osp +import argparse +from tqdm import tqdm + +import cv2 +import numpy as np + + +parse = argparse.ArgumentParser() +parse.add_argument('--im_root', dest='im_root', type=str, default='./datasets/cityscapes',) +parse.add_argument('--im_anns', dest='im_anns', type=str, default='./datasets/cityscapes/train.txt',) +parse.add_argument('--lb_ignore', dest='lb_ignore', type=int, default=255) +args = parse.parse_args() + +lb_ignore = args.lb_ignore + + +with open(args.im_anns, 'r') as fr: + lines = fr.read().splitlines() + +n_pairs = len(lines) +impaths, lbpaths = [], [] +for l in lines: + impth, lbpth = l.split(',') + impth = osp.join(args.im_root, impth) + lbpth = osp.join(args.im_root, lbpth) + impaths.append(impth) + lbpaths.append(lbpth) + + +## shapes +max_shape_area, min_shape_area = [0, 0], [100000, 100000] +max_shape_height, min_shape_height = [0, 0], [100000, 100000] +max_shape_width, min_shape_width = [0, 0], [100000, 100000] +max_lb_val, min_lb_val = -1, 10000000 +for impth, lbpth in tqdm(zip(impaths, lbpaths), total=n_pairs): + im = cv2.imread(impth)[:, :, ::-1] + lb = cv2.imread(lbpth, 0) + assert im.shape[:2] == lb.shape + + shape = lb.shape + area = shape[0] * shape[1] + if area > max_shape_area[0] * max_shape_area[1]: + max_shape_area = shape + if area < min_shape_area[0] * min_shape_area[1]: + min_shape_area = shape + + if shape[0] > max_shape_height[0]: + max_shape_height = shape + if shape[0] < min_shape_height[0]: + min_shape_height = shape + + if shape[1] > max_shape_width[1]: + max_shape_width = shape + if shape[1] < min_shape_width[1]: + min_shape_width = shape + + lb = lb[lb != lb_ignore] + if lb.size > 0: + max_lb_val = max(max_lb_val, np.max(lb)) + min_lb_val = min(min_lb_val, np.min(lb)) + +## label info +lb_minlength = max_lb_val+1-min_lb_val +lb_hist = np.zeros(lb_minlength) +for lbpth in tqdm(lbpaths): + lb = cv2.imread(lbpth, 0) + lb = lb[lb != lb_ignore] - min_lb_val + lb_hist += np.bincount(lb, minlength=lb_minlength) + +lb_missing_vals = [ind + min_lb_val + for ind, el in enumerate(lb_hist.tolist()) if el == 0] +lb_ratios = (lb_hist / lb_hist.sum()).tolist() + + +## pixel mean/std +rgb_mean = np.zeros(3).astype(np.float32) +n_pixels = 0 +for impth in tqdm(impaths): + im = cv2.imread(impth)[:, :, ::-1].astype(np.float32) + im = im.reshape(-1, 3) / 255. + n_pixels += im.shape[0] + rgb_mean += im.sum(axis=0) +rgb_mean = (rgb_mean / n_pixels) + +rgb_std = np.zeros(3).astype(np.float32) +for impth in tqdm(impaths): + im = cv2.imread(impth)[:, :, ::-1].astype(np.float32) + im = im.reshape(-1, 3) / 255. + + a = (im - rgb_mean.reshape(1, 3)) ** 2 + rgb_std += a.sum(axis=0) +rgb_std = (rgb_std / n_pixels) ** 0.5 + +rgb_mean = rgb_mean.tolist() +rgb_std = rgb_std.tolist() + + +print('\n') +print(f'there are {n_pairs} lines in {args.im_anns}, which means {n_pairs} image/label image pairs') +print('\n') + +print(f'max and min image shapes by area are: {max_shape_area}, {min_shape_area}') +print(f'max and min image shapes by height are: {max_shape_height}, {min_shape_height}') +print(f'max and min image shapes by width are: {max_shape_width}, {min_shape_width}') +print('\n') + +print(f'we ignore label value of {args.lb_ignore} in label images') +print(f'label values are within range of [{min_lb_val}, {max_lb_val}]') +print(f'label values that are missing: {lb_missing_vals}') +print('ratios of each label value(from small to big, without ignored): ') +print('\t', lb_ratios) +print('\n') + +print('pixel mean rgb: ', rgb_mean) +print('pixel std rgb: ', rgb_std) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/conver_to_trt.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/conver_to_trt.py new file mode 100755 index 0000000000000000000000000000000000000000..7b5d46cc3e63c1599d260aacd6650e94634b546a --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/conver_to_trt.py @@ -0,0 +1,39 @@ +import argparse +import os.path as osp +import sys +sys.path.insert(0, '.') + +import torch +from torch2trt import torch2trt + +from lib.models import model_factory +from configs import set_cfg_from_file + +torch.set_grad_enabled(False) + + +parse = argparse.ArgumentParser() +parse.add_argument('--config', dest='config', type=str, default='configs/bisenetv2.py',) +parse.add_argument('--weight-path', type=str, default='./res/model_final.pth',) +parse.add_argument('--fp16', action='store_true') +parse.add_argument('--outpath', dest='out_pth', type=str, + default='model.trt') +args = parse.parse_args() + + +cfg = set_cfg_from_file(args.config) +if cfg.use_sync_bn: cfg.use_sync_bn = False + +net = model_factory[cfg.model_type](cfg.n_cats, aux_mode='pred') +net.load_state_dict(torch.load(args.weight_path), strict=False) +net.cuda() +net.eval() + + +# dummy_input = torch.randn(1, 3, *cfg.crop_size) +dummy_input = torch.randn(1, 3, 1024, 2048).cuda() + +trt_model = torch2trt(net, [dummy_input, ], fp16_mode=args.fp16, max_workspace=1 << 30) + +with open(args.out_pth, 'wb') as fw: + fw.write(trt_model.engine.serialize()) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/demo.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/demo.py new file mode 100755 index 0000000000000000000000000000000000000000..e437c1aff35dd52d063a71c9270a060dd209fedf --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/demo.py @@ -0,0 +1,63 @@ + +import sys +sys.path.insert(0, '.') +import argparse +import math +import torch +import torch.nn as nn +import torch.nn.functional as F +from PIL import Image +import numpy as np +import cv2 + +import lib.data.transform_cv2 as T +from lib.models import model_factory +from configs import set_cfg_from_file + + +# uncomment the following line if you want to reduce cpu usage, see issue #231 +# torch.set_num_threads(4) + +torch.set_grad_enabled(False) +np.random.seed(123) + + +# args +parse = argparse.ArgumentParser() +parse.add_argument('--config', dest='config', type=str, default='configs/bisenetv2.py',) +parse.add_argument('--weight-path', type=str, default='./res/model_final.pth',) +parse.add_argument('--img-path', dest='img_path', type=str, default='./example.png',) +args = parse.parse_args() +cfg = set_cfg_from_file(args.config) + + +palette = np.random.randint(0, 256, (256, 3), dtype=np.uint8) + +# define model +net = model_factory[cfg.model_type](cfg.n_cats, aux_mode='eval') +net.load_state_dict(torch.load(args.weight_path, map_location='cpu'), strict=False) +net.eval() +net.cuda() + +# prepare data +to_tensor = T.ToTensor( + mean=(0.3257, 0.3690, 0.3223), # city, rgb + std=(0.2112, 0.2148, 0.2115), +) +im = cv2.imread(args.img_path)[:, :, ::-1] +im = to_tensor(dict(im=im, lb=None))['im'].unsqueeze(0).cuda() + +# shape divisor +org_size = im.size()[2:] +new_size = [math.ceil(el / 32) * 32 for el in im.size()[2:]] + +# inference +im = F.interpolate(im, size=new_size, align_corners=False, mode='bilinear') +out = net(im)[0] +out = F.interpolate(out, size=org_size, align_corners=False, mode='bilinear') +out = out.argmax(dim=1) + +# visualize +out = out.squeeze().detach().cpu().numpy() +pred = palette[out] +cv2.imwrite('./res.jpg', pred) diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/demo_video.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/demo_video.py new file mode 100755 index 0000000000000000000000000000000000000000..d3df05f7db556f4d1ad29c69d1f094b6f89be24b --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/demo_video.py @@ -0,0 +1,141 @@ + +import sys +sys.path.insert(0, '.') +import argparse +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.multiprocessing as mp +import time +from PIL import Image +import numpy as np +import cv2 + +import lib.data.transform_cv2 as T +from lib.models import model_factory +from configs import set_cfg_from_file + + +torch.set_grad_enabled(False) + + +# args +parse = argparse.ArgumentParser() +parse.add_argument('--config', dest='config', type=str, default='configs/bisenetv2.py',) +parse.add_argument('--weight-path', type=str, default='./res/model_final.pth',) +parse.add_argument('--input', dest='input', type=str, default='./example.mp4',) +parse.add_argument('--output', dest='output', type=str, default='./res.mp4',) +args = parse.parse_args() +cfg = set_cfg_from_file(args.config) + + + +# define model +def get_model(): + net = model_factory[cfg.model_type](cfg.n_cats, aux_mode='eval') + net.load_state_dict(torch.load(args.weight_path, map_location='cpu'), strict=False) + net.eval() + net.cuda() + return net + + +# fetch frames +def get_func(inpth, in_q, done): + cap = cv2.VideoCapture(args.input) + width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # type is float + height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # type is float + fps = cap.get(cv2.CAP_PROP_FPS) + + to_tensor = T.ToTensor( + mean=(0.3257, 0.3690, 0.3223), # city, rgb + std=(0.2112, 0.2148, 0.2115), + ) + + while cap.isOpened(): + ret, frame = cap.read() + if not ret: break + frame = frame[:, :, ::-1] + frame = to_tensor(dict(im=frame, lb=None))['im'].unsqueeze(0) + in_q.put(frame) + + in_q.put('quit') + done.wait() + + cap.release() + time.sleep(1) + print('input queue done') + + +# save to video +def save_func(inpth, outpth, out_q): + np.random.seed(123) + palette = np.random.randint(0, 256, (256, 3), dtype=np.uint8) + + cap = cv2.VideoCapture(args.input) + width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # type is float + height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # type is float + fps = cap.get(cv2.CAP_PROP_FPS) + cap.release() + + video_writer = cv2.VideoWriter(outpth, + cv2.VideoWriter_fourcc(*"mp4v"), + fps, (int(width), int(height))) + + while True: + out = out_q.get() + if out == 'quit': break + out = out.numpy() + preds = palette[out] + for pred in preds: + video_writer.write(pred) + video_writer.release() + print('output queue done') + + +# inference a list of frames +def infer_batch(frames): + frames = torch.cat(frames, dim=0).cuda() + H, W = frames.size()[2:] + frames = F.interpolate(frames, size=(768, 768), mode='bilinear', + align_corners=False) # must be divisible by 32 + out = net(frames)[0] + out = F.interpolate(out, size=(H, W), mode='bilinear', + align_corners=False).argmax(dim=1).detach().cpu() + out_q.put(out) + + + +if __name__ == '__main__': + mp.set_start_method('spawn') + + in_q = mp.Queue(1024) + out_q = mp.Queue(1024) + done = mp.Event() + + in_worker = mp.Process(target=get_func, + args=(args.input, in_q, done)) + out_worker = mp.Process(target=save_func, + args=(args.input, args.output, out_q)) + + in_worker.start() + out_worker.start() + + net = get_model() + + frames = [] + while True: + frame = in_q.get() + if frame == 'quit': break + + frames.append(frame) + if len(frames) == 8: + infer_batch(frames) + frames = [] + if len(frames) > 0: + infer_batch(frames) + + out_q.put('quit') + done.set() + + out_worker.join() + in_worker.join() diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/evaluate.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/evaluate.py new file mode 100755 index 0000000000000000000000000000000000000000..435affc43fb594cce85c018ac5ea1b2af1256531 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/evaluate.py @@ -0,0 +1,454 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import sys +sys.path.insert(0, '.') +import os +import os.path as osp +import logging +import argparse +import math +from tabulate import tabulate + +from tqdm import tqdm +import numpy as np +import cv2 + +import torch +import torch.nn as nn +import torch.nn.functional as F +import torch.distributed as dist + +from lib.models import model_factory +from configs import set_cfg_from_file +from lib.logger import setup_logger +from lib.data import get_data_loader + + +def get_round_size(size, divisor=32): + return [math.ceil(el / divisor) * divisor for el in size] + + +class SizePreprocessor(object): + + def __init__(self, shape=None, shortside=None, longside=None): + self.shape = shape + self.shortside = shortside + self.longside = longside + + def __call__(self, imgs): + new_size = None + if not self.shape is None: + new_size = self.shape + elif not self.shortside is None: + h, w = imgs.size()[2:] + ss = self.shortside + if h < w: h, w = ss, int(ss / h * w) + else: h, w = int(ss / w * h), ss + new_size = h, w + elif not self.longside is None: # long size limit + h, w = imgs.size()[2:] + if max(h, w) > self.longside: + ls = self.longside + if h < w: h, w = int(ls / w * h), ls + else: h, w = ls, int(ls / h * w) + new_size = h, w + + if not new_size is None: + imgs = F.interpolate(imgs, size=new_size, + mode='bilinear', align_corners=False) + return imgs + + + +class Metrics(object): + + def __init__(self, n_classes, lb_ignore=255): + self.n_classes = n_classes + self.lb_ignore = lb_ignore + self.confusion = torch.zeros((n_classes, n_classes)).cuda().detach() + + @torch.no_grad() + def update(self, preds, label): + keep = label != self.lb_ignore + preds, label = preds[keep], label[keep] + self.confusion += torch.bincount( + label * self.n_classes + preds, + minlength=self.n_classes ** 2 + ).view(self.n_classes, self.n_classes) + + @torch.no_grad() + def compute_metrics(self,): + if dist.is_initialized(): + dist.all_reduce(self.confusion, dist.ReduceOp.SUM) + + confusion = self.confusion + weights = confusion.sum(dim=1) / confusion.sum() + tps = confusion.diag() + fps = confusion.sum(dim=0) - tps + fns = confusion.sum(dim=1) - tps + + # iou and fw miou + # ious = confusion.diag() / (confusion.sum(dim=0) + confusion.sum(dim=1) - confusion.diag() + 1) + ious = tps / (tps + fps + fns + 1) + miou = ious.nanmean() + fw_miou = torch.sum(weights * ious) + + eps = 1e-6 + # macro f1 score + macro_precision = tps / (tps + fps + 1) + macro_recall = tps / (tps + fns + 1) + f1_scores = (2 * macro_precision * macro_recall) / ( + macro_precision + macro_recall + eps) + macro_f1 = f1_scores.nanmean(dim=0) + + # micro f1 score + tps_ = tps.sum(dim=0) + fps_ = fps.sum(dim=0) + fns_ = fns.sum(dim=0) + micro_precision = tps_ / (tps_ + fps_ + 1) + micro_recall = tps_ / (tps_ + fns_ + 1) + micro_f1 = (2 * micro_precision * micro_recall) / ( + micro_precision + micro_recall + eps) + + metric_dict = dict( + weights=weights.tolist(), + ious=ious.tolist(), + miou=miou.item(), + fw_miou=fw_miou.item(), + f1_scores=f1_scores.tolist(), + macro_f1=macro_f1.item(), + micro_f1=micro_f1.item(), + ) + return metric_dict + + + +class MscEvalV0(object): + + def __init__(self, n_classes, scales=(0.5, ), flip=False, lb_ignore=255, size_processor=None): + self.n_classes = n_classes + self.scales = scales + self.flip = flip + self.ignore_label = lb_ignore + self.sp = size_processor + self.metric_observer = Metrics(n_classes, lb_ignore) + + @torch.no_grad() + def __call__(self, net, dl): + ## evaluate + n_classes = self.n_classes + hist = torch.zeros(n_classes, n_classes).cuda().detach() + if dist.is_initialized() and dist.get_rank() != 0: + diter = enumerate(dl) + else: + diter = enumerate(tqdm(dl)) + for i, (imgs, label) in diter: + imgs = self.sp(imgs) + N, _, H, W = imgs.shape + label = label.squeeze(1).cuda() + size = label.size()[-2:] + probs = torch.zeros( + (N, n_classes, *size), + dtype=torch.float32).cuda().detach() + for scale in self.scales: + sH, sW = int(scale * H), int(scale * W) + sH, sW = get_round_size((sH, sW)) + im_sc = F.interpolate(imgs, size=(sH, sW), + mode='bilinear', align_corners=True) + + im_sc = im_sc.cuda() + logits = net(im_sc)[0] + logits = F.interpolate(logits, size=size, + mode='bilinear', align_corners=True) + probs += torch.softmax(logits, dim=1) + if self.flip: + im_sc = torch.flip(im_sc, dims=(3, )) + logits = net(im_sc)[0] + logits = torch.flip(logits, dims=(3, )) + logits = F.interpolate(logits, size=size, + mode='bilinear', align_corners=True) + probs += torch.softmax(logits, dim=1) + preds = torch.argmax(probs, dim=1) + self.metric_observer.update(preds, label) + + metric_dict = self.metric_observer.compute_metrics() + return metric_dict + + + +class MscEvalCrop(object): + + def __init__( + self, + n_classes, + cropsize=1024, + cropstride=2./3, + flip=True, + scales=[0.5, 0.75, 1, 1.25, 1.5, 1.75], + lb_ignore=255, + size_processor=None + ): + self.n_classes = n_classes + self.scales = scales + self.ignore_label = lb_ignore + self.flip = flip + self.sp = size_processor + self.metric_observer = Metrics(n_classes, lb_ignore) + + self.cropsize = cropsize if isinstance(cropsize, (list, tuple)) else (cropsize, cropsize) + self.cropstride = cropstride + + + def pad_tensor(self, inten): + N, C, H, W = inten.size() + cropH, cropW = self.cropsize + if cropH < H and cropW < W: return inten, [0, H, 0, W] + padH, padW = max(cropH, H), max(cropW, W) + outten = torch.zeros(N, C, padH, padW).cuda() + outten.requires_grad_(False) + marginH, marginW = padH - H, padW - W + hst, hed = marginH // 2, marginH // 2 + H + wst, wed = marginW // 2, marginW // 2 + W + outten[:, :, hst:hed, wst:wed] = inten + return outten, [hst, hed, wst, wed] + + + def eval_chip(self, net, crop): + prob = net(crop)[0].softmax(dim=1) + if self.flip: + crop = torch.flip(crop, dims=(3,)) + prob += net(crop)[0].flip(dims=(3,)).softmax(dim=1) + prob = torch.exp(prob) + return prob + + + def crop_eval(self, net, im, n_classes): + cropH, cropW = self.cropsize + stride_rate = self.cropstride + im, indices = self.pad_tensor(im) + N, C, H, W = im.size() + + strdH = math.ceil(cropH * stride_rate) + strdW = math.ceil(cropW * stride_rate) + n_h = math.ceil((H - cropH) / strdH) + 1 + n_w = math.ceil((W - cropW) / strdW) + 1 + prob = torch.zeros(N, n_classes, H, W).cuda() + prob.requires_grad_(False) + for i in range(n_h): + for j in range(n_w): + stH, stW = strdH * i, strdW * j + endH, endW = min(H, stH + cropH), min(W, stW + cropW) + stH, stW = endH - cropH, endW - cropW + chip = im[:, :, stH:endH, stW:endW] + prob[:, :, stH:endH, stW:endW] += self.eval_chip(net, chip) + hst, hed, wst, wed = indices + prob = prob[:, :, hst:hed, wst:wed] + return prob + + + def scale_crop_eval(self, net, im, scale, size, n_classes): + N, C, H, W = im.size() + new_hw = [int(H * scale), int(W * scale)] + im = F.interpolate(im, new_hw, mode='bilinear', align_corners=True) + prob = self.crop_eval(net, im, n_classes) + prob = F.interpolate(prob, size, mode='bilinear', align_corners=True) + return prob + + + @torch.no_grad() + def __call__(self, net, dl): + + n_classes = self.n_classes + hist = torch.zeros(n_classes, n_classes).cuda().detach() + hist.requires_grad_(False) + if dist.is_initialized() and dist.get_rank() != 0: + diter = enumerate(dl) + else: + diter = enumerate(tqdm(dl)) + + for i, (imgs, label) in diter: + imgs = imgs.cuda() + imgs = self.sp(imgs) + label = label.squeeze(1).cuda() + N, *size = label.size() + + probs = torch.zeros((N, n_classes, *size)).cuda() + probs.requires_grad_(False) + for sc in self.scales: + probs += self.scale_crop_eval(net, imgs, sc, size, n_classes) + torch.cuda.empty_cache() + preds = torch.argmax(probs, dim=1) + self.metric_observer.update(preds, label) + + metric_dict = self.metric_observer.compute_metrics() + return metric_dict + + +def print_res_table(tname, heads, weights, metric, cat_metric): + heads = [tname, 'ratio'] + heads + lines = [] + for k, v in metric.items(): + line = [k, '-'] + [f'{el:.6f}' for el in v] + lines.append(line) + cat_res = [weights,] + cat_metric + cat_res = [ + [f'cat {idx}',] + [f'{el:.6f}' for el in group] + for idx,group in enumerate(zip(*cat_res))] + content = cat_res + lines + return heads, content + + +@torch.no_grad() +def eval_model(cfg, net): + org_aux = net.aux_mode + net.aux_mode = 'eval' + net.eval() + + is_dist = dist.is_initialized() + dl = get_data_loader(cfg, mode='val') + lb_ignore = dl.dataset.lb_ignore + + heads, mious, fw_mious, cat_ious = [], [], [], [] + f1_scores, macro_f1, micro_f1 = [], [], [] + logger = logging.getLogger() + + size_processor = SizePreprocessor( + cfg.get('eval_start_shape'), + cfg.get('eval_start_shortside'), + cfg.get('eval_start_longside'), + ) + + single_scale = MscEvalV0( + n_classes=cfg.n_cats, + scales=(1., ), + flip=False, + lb_ignore=lb_ignore, + size_processor=size_processor + ) + logger.info('compute single scale metrics') + metrics = single_scale(net, dl) + heads.append('ss') + mious.append(metrics['miou']) + fw_mious.append(metrics['fw_miou']) + cat_ious.append(metrics['ious']) + f1_scores.append(metrics['f1_scores']) + macro_f1.append(metrics['macro_f1']) + micro_f1.append(metrics['micro_f1']) + + single_crop = MscEvalCrop( + n_classes=cfg.n_cats, + cropsize=cfg.eval_crop, + cropstride=2. / 3, + flip=False, + scales=(1., ), + lb_ignore=lb_ignore, + size_processor=size_processor + ) + logger.info('compute single scale crop metrics') + metrics = single_crop(net, dl) + heads.append('ssc') + mious.append(metrics['miou']) + fw_mious.append(metrics['fw_miou']) + cat_ious.append(metrics['ious']) + f1_scores.append(metrics['f1_scores']) + macro_f1.append(metrics['macro_f1']) + micro_f1.append(metrics['micro_f1']) + + ms_flip = MscEvalV0( + n_classes=cfg.n_cats, + scales=cfg.eval_scales, + flip=True, + lb_ignore=lb_ignore, + size_processor=size_processor + ) + logger.info('compute multi scale flip metrics') + metrics = ms_flip(net, dl) + heads.append('msf') + mious.append(metrics['miou']) + fw_mious.append(metrics['fw_miou']) + cat_ious.append(metrics['ious']) + f1_scores.append(metrics['f1_scores']) + macro_f1.append(metrics['macro_f1']) + micro_f1.append(metrics['micro_f1']) + + ms_flip_crop = MscEvalCrop( + n_classes=cfg.n_cats, + cropsize=cfg.eval_crop, + cropstride=2. / 3, + flip=True, + scales=cfg.eval_scales, + lb_ignore=lb_ignore, + size_processor=size_processor + ) + logger.info('compute multi scale flip crop metrics') + metrics = ms_flip_crop(net, dl) + heads.append('msfc') + mious.append(metrics['miou']) + fw_mious.append(metrics['fw_miou']) + cat_ious.append(metrics['ious']) + f1_scores.append(metrics['f1_scores']) + macro_f1.append(metrics['macro_f1']) + micro_f1.append(metrics['micro_f1']) + + weights = metrics['weights'] + + metric = dict(mious=mious, fw_mious=fw_mious) + iou_heads, iou_content = print_res_table('iou', heads, + weights, metric, cat_ious) + metric = dict(macro_f1=macro_f1, micro_f1=micro_f1) + f1_heads, f1_content = print_res_table('f1 score', heads, + weights, metric, f1_scores) + + net.aux_mode = org_aux + return iou_heads, iou_content, f1_heads, f1_content + + +def evaluate(cfg, weight_pth): + logger = logging.getLogger() + + ## model + logger.info('setup and restore model') + net = model_factory[cfg.model_type](cfg.n_cats) + net.load_state_dict(torch.load(weight_pth, map_location='cpu')) + net.cuda() + + # if dist.is_initialized(): + # local_rank = dist.get_rank() + # net = nn.parallel.DistributedDataParallel( + # net, + # device_ids=[local_rank, ], + # output_device=local_rank + # ) + + ## evaluator + iou_heads, iou_content, f1_heads, f1_content = eval_model(cfg, net) + logger.info('\neval results of f1 score metric:') + logger.info('\n' + tabulate(f1_content, headers=f1_heads, tablefmt='orgtbl')) + logger.info('\neval results of miou metric:') + logger.info('\n' + tabulate(iou_content, headers=iou_heads, tablefmt='orgtbl')) + + +def parse_args(): + parse = argparse.ArgumentParser() + parse.add_argument('--weight-path', dest='weight_pth', type=str, + default='model_final.pth',) + parse.add_argument('--config', dest='config', type=str, + default='configs/bisenetv2.py',) + return parse.parse_args() + + +def main(): + args = parse_args() + cfg = set_cfg_from_file(args.config) + if 'LOCAL_RANK' in os.environ: + local_rank = int(os.environ['LOCAL_RANK']) + torch.cuda.set_device(local_rank) + dist.init_process_group(backend='nccl') + if not osp.exists(cfg.respth): os.makedirs(cfg.respth) + setup_logger(f'{cfg.model_type}-{cfg.dataset.lower()}-eval', cfg.respth) + evaluate(cfg, args.weight_pth) + + +if __name__ == "__main__": + main() diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/export_libtorch.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/export_libtorch.py new file mode 100755 index 0000000000000000000000000000000000000000..7a566e89b3fe1a39971475d14faaa00e3589229d --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/export_libtorch.py @@ -0,0 +1,37 @@ +import argparse +import os.path as osp +import sys +sys.path.insert(0, '.') + +import torch + +from lib.models import model_factory +from configs import set_cfg_from_file + +torch.set_grad_enabled(False) + + +parse = argparse.ArgumentParser() +parse.add_argument('--config', dest='config', type=str, + default='configs/bisenetv2.py',) +parse.add_argument('--weight-path', dest='weight_pth', type=str, + default='model_final.pth') +parse.add_argument('--outpath', dest='out_pth', type=str, + default='model.pt') +args = parse.parse_args() + + +cfg = set_cfg_from_file(args.config) +if cfg.use_sync_bn: cfg.use_sync_bn = False + +net = model_factory[cfg.model_type](cfg.n_cats, aux_mode='pred') +net.load_state_dict(torch.load(args.weight_pth, map_location='cpu'), strict=False) +net.eval() + + +# dummy_input = torch.randn(1, 3, *cfg.crop_size) +dummy_input = torch.randn(1, 3, 1024, 2048) +script_module = torch.jit.trace(net, dummy_input) +# script_module.save(args.out_pth, _use_new_zipfile_serialization=False) +script_module.save(args.out_pth) + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/export_onnx.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/export_onnx.py new file mode 100755 index 0000000000000000000000000000000000000000..7acd98e0fb6f215d426ab6693e602b0038335107 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/export_onnx.py @@ -0,0 +1,42 @@ +import argparse +import os.path as osp +import sys +sys.path.insert(0, '.') + +import torch + +from lib.models import model_factory +from configs import set_cfg_from_file + +torch.set_grad_enabled(False) + + +parse = argparse.ArgumentParser() +parse.add_argument('--config', dest='config', type=str, + default='configs/bisenetv2.py',) +parse.add_argument('--weight-path', dest='weight_pth', type=str, + default='model_final.pth') +parse.add_argument('--outpath', dest='out_pth', type=str, + default='model.onnx') +parse.add_argument('--aux-mode', dest='aux_mode', type=str, + default='pred') +args = parse.parse_args() + + +cfg = set_cfg_from_file(args.config) +if cfg.use_sync_bn: cfg.use_sync_bn = False + +net = model_factory[cfg.model_type](cfg.n_cats, aux_mode=args.aux_mode) +net.load_state_dict(torch.load(args.weight_pth, map_location='cpu'), strict=False) +net.eval() + + +# dummy_input = torch.randn(1, 3, *cfg.crop_size) +dummy_input = torch.randn(1, 3, 1024, 2048) +input_names = ['input_image'] +output_names = ['preds',] + +torch.onnx.export(net, dummy_input, args.out_pth, + input_names=input_names, output_names=output_names, + verbose=False, opset_version=11, ) + diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/gen_dataset_annos.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/gen_dataset_annos.py new file mode 100755 index 0000000000000000000000000000000000000000..bcba9697daf4cb00c9a5b647ad685ad6b936ad5c --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/gen_dataset_annos.py @@ -0,0 +1,88 @@ + +import os +import os.path as osp +import argparse + + +def gen_coco(): + ''' + root_path: + |- images + |- train2017 + |- val2017 + |- labels + |- train2017 + |- val2017 + ''' + root_path = './datasets/coco' + save_path = './datasets/coco/' + for mode in ('train', 'val'): + im_root = osp.join(root_path, f'images/{mode}2017') + lb_root = osp.join(root_path, f'labels/{mode}2017') + + ims = os.listdir(im_root) + lbs = os.listdir(lb_root) + + print(len(ims)) + print(len(lbs)) + + im_names = [el.replace('.jpg', '') for el in ims] + lb_names = [el.replace('.png', '') for el in lbs] + common_names = list(set(im_names) & set(lb_names)) + + lines = [ + f'images/{mode}2017/{name}.jpg,labels/{mode}2017/{name}.png' + for name in common_names + ] + + with open(f'{save_path}/{mode}.txt', 'w') as fw: + fw.write('\n'.join(lines)) + + +def gen_ade20k(): + ''' + root_path: + |- images + |- training + |- validation + |- annotations + |- training + |- validation + ''' + root_path = './datasets/ade20k/' + save_path = './datasets/ade20k/' + folder_map = {'train': 'training', 'val': 'validation'} + for mode in ('train', 'val'): + folder = folder_map[mode] + im_root = osp.join(root_path, f'images/{folder}') + lb_root = osp.join(root_path, f'annotations/{folder}') + + ims = os.listdir(im_root) + lbs = os.listdir(lb_root) + + print(len(ims)) + print(len(lbs)) + + im_names = [el.replace('.jpg', '') for el in ims] + lb_names = [el.replace('.png', '') for el in lbs] + common_names = list(set(im_names) & set(lb_names)) + + lines = [ + f'images/{folder}/{name}.jpg,annotations/{folder}/{name}.png' + for name in common_names + ] + + with open(f'{save_path}/{mode}.txt', 'w') as fw: + fw.write('\n'.join(lines)) + + + +if __name__ == '__main__': + parse = argparse.ArgumentParser() + parse.add_argument('--dataset', dest='dataset', type=str, default='coco') + args = parse.parse_args() + + if args.dataset == 'coco': + gen_coco() + elif args.dataset == 'ade20k': + gen_ade20k() diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/tools/train_amp.py b/cv/semantic_segmentation/bisenetv2/pytorch/tools/train_amp.py new file mode 100755 index 0000000000000000000000000000000000000000..08207d03af7dfc169358dbec8bde33426ad2eecb --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/tools/train_amp.py @@ -0,0 +1,210 @@ +#!/usr/bin/python +# -*- encoding: utf-8 -*- + +import sys +sys.path.insert(0, '.') +import os +import os.path as osp +import random +import logging +import time +import json +import argparse +import numpy as np +from tabulate import tabulate + +import torch +import torch.nn as nn +import torch.distributed as dist +from torch.utils.data import DataLoader +import torch.cuda.amp as amp + +from lib.models import model_factory +from configs import set_cfg_from_file +from lib.data import get_data_loader +from evaluate import eval_model +from lib.ohem_ce_loss import OhemCELoss +from lib.lr_scheduler import WarmupPolyLrScheduler +from lib.meters import TimeMeter, AvgMeter +from lib.logger import setup_logger, print_log_msg + + + +## fix all random seeds +# torch.manual_seed(123) +# torch.cuda.manual_seed(123) +# np.random.seed(123) +# random.seed(123) +# torch.backends.cudnn.deterministic = True +# torch.backends.cudnn.benchmark = True +# torch.multiprocessing.set_sharing_strategy('file_system') + + +def parse_args(): + parse = argparse.ArgumentParser() + parse.add_argument('--config', dest='config', type=str, + default='configs/bisenetv2.py',) + parse.add_argument('--finetune-from', type=str, default=None,) + return parse.parse_args() + +args = parse_args() +cfg = set_cfg_from_file(args.config) + + +def set_model(lb_ignore=255): + logger = logging.getLogger() + net = model_factory[cfg.model_type](cfg.n_cats) + if not args.finetune_from is None: + logger.info(f'load pretrained weights from {args.finetune_from}') + msg = net.load_state_dict(torch.load(args.finetune_from, + map_location='cpu'), strict=False) + logger.info('\tmissing keys: ' + json.dumps(msg.missing_keys)) + logger.info('\tunexpected keys: ' + json.dumps(msg.unexpected_keys)) + if cfg.use_sync_bn: net = nn.SyncBatchNorm.convert_sync_batchnorm(net) + net.cuda() + net.train() + criteria_pre = OhemCELoss(0.7, lb_ignore) + criteria_aux = [OhemCELoss(0.7, lb_ignore) + for _ in range(cfg.num_aux_heads)] + return net, criteria_pre, criteria_aux + + +def set_optimizer(model): + if hasattr(model, 'get_params'): + wd_params, nowd_params, lr_mul_wd_params, lr_mul_nowd_params = model.get_params() + # wd_val = cfg.weight_decay + wd_val = 0 + params_list = [ + {'params': wd_params, }, + {'params': nowd_params, 'weight_decay': wd_val}, + {'params': lr_mul_wd_params, 'lr': cfg.lr_start * 10}, + {'params': lr_mul_nowd_params, 'weight_decay': wd_val, 'lr': cfg.lr_start * 10}, + ] + else: + wd_params, non_wd_params = [], [] + for name, param in model.named_parameters(): + if param.dim() == 1: + non_wd_params.append(param) + elif param.dim() == 2 or param.dim() == 4: + wd_params.append(param) + params_list = [ + {'params': wd_params, }, + {'params': non_wd_params, 'weight_decay': 0}, + ] + optim = torch.optim.SGD( + params_list, + lr=cfg.lr_start, + momentum=0.9, + weight_decay=cfg.weight_decay, + ) + return optim + + +def set_model_dist(net): + local_rank = int(os.environ['LOCAL_RANK']) + net = nn.parallel.DistributedDataParallel( + net, + device_ids=[local_rank, ], + # find_unused_parameters=True, + output_device=local_rank + ) + return net + + +def set_meters(): + time_meter = TimeMeter(cfg.max_iter) + loss_meter = AvgMeter('loss') + loss_pre_meter = AvgMeter('loss_prem') + loss_aux_meters = [AvgMeter('loss_aux{}'.format(i)) + for i in range(cfg.num_aux_heads)] + return time_meter, loss_meter, loss_pre_meter, loss_aux_meters + + + +def train(): + logger = logging.getLogger() + + ## dataset + dl = get_data_loader(cfg, mode='train') + + ## model + net, criteria_pre, criteria_aux = set_model(dl.dataset.lb_ignore) + + ## optimizer + optim = set_optimizer(net) + + ## mixed precision training + scaler = amp.GradScaler() + + ## ddp training + net = set_model_dist(net) + + ## meters + time_meter, loss_meter, loss_pre_meter, loss_aux_meters = set_meters() + + ## lr scheduler + lr_schdr = WarmupPolyLrScheduler(optim, power=0.9, + max_iter=cfg.max_iter, warmup_iter=cfg.warmup_iters, + warmup_ratio=0.1, warmup='exp', last_epoch=-1,) + + ## train loop + for it, (im, lb) in enumerate(dl): + im = im.cuda() + lb = lb.cuda() + + lb = torch.squeeze(lb, 1) + + optim.zero_grad() + with amp.autocast(enabled=cfg.use_fp16): + logits, *logits_aux = net(im) + loss_pre = criteria_pre(logits, lb) + loss_aux = [crit(lgt, lb) for crit, lgt in zip(criteria_aux, logits_aux)] + loss = loss_pre + sum(loss_aux) + scaler.scale(loss).backward() + scaler.step(optim) + scaler.update() + torch.cuda.synchronize() + + time_meter.update() + loss_meter.update(loss.item()) + loss_pre_meter.update(loss_pre.item()) + _ = [mter.update(lss.item()) for mter, lss in zip(loss_aux_meters, loss_aux)] + + ## print training log message + if (it + 1) % 100 == 0: + lr = lr_schdr.get_lr() + lr = sum(lr) / len(lr) + print_log_msg( + it, cfg.max_iter, lr, time_meter, loss_meter, + loss_pre_meter, loss_aux_meters) + lr_schdr.step() + + ## dump the final model and evaluate the result + save_pth = osp.join(cfg.respth, 'model_final.pth') + logger.info('\nsave models to {}'.format(save_pth)) + state = net.module.state_dict() + if dist.get_rank() == 0: torch.save(state, save_pth) + + logger.info('\nevaluating the final model') + torch.cuda.empty_cache() + iou_heads, iou_content, f1_heads, f1_content = eval_model(cfg, net.module) + logger.info('\neval results of f1 score metric:') + logger.info('\n' + tabulate(f1_content, headers=f1_heads, tablefmt='orgtbl')) + logger.info('\neval results of miou metric:') + logger.info('\n' + tabulate(iou_content, headers=iou_heads, tablefmt='orgtbl')) + + return + + +def main(): + local_rank = int(os.environ['LOCAL_RANK']) + torch.cuda.set_device(local_rank) + dist.init_process_group(backend='nccl') + + if not osp.exists(cfg.respth): os.makedirs(cfg.respth) + setup_logger(f'{cfg.model_type}-{cfg.dataset.lower()}-train', cfg.respth) + train() + + +if __name__ == "__main__": + main() diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/train.sh b/cv/semantic_segmentation/bisenetv2/pytorch/train.sh new file mode 100755 index 0000000000000000000000000000000000000000..6a15938c13190572bb62e7eb7c88ef5fd29b33f8 --- /dev/null +++ b/cv/semantic_segmentation/bisenetv2/pytorch/train.sh @@ -0,0 +1,7 @@ +# Copyright (c) 2023, Shanghai Iluvatar CoreX Semiconductor Co., Ltd. +# All Rights Reserved. + +NUM_GPUS=$1 +CONFIG=$2 + +python3 -m torch.distributed.run --nproc_per_node=$NUM_GPUS tools/train_amp.py --config $CONFIG diff --git a/cv/semantic_segmentation/bisenetv2/pytorch/video.mp4 b/cv/semantic_segmentation/bisenetv2/pytorch/video.mp4 new file mode 100755 index 0000000000000000000000000000000000000000..2d838a8deccad15e6ea4465476b5e046e151fcbe Binary files /dev/null and b/cv/semantic_segmentation/bisenetv2/pytorch/video.mp4 differ