├── .gitignore
├── README.md
├── data
├── input
│ ├── ade20k.jpg
│ ├── cityscapes1.png
│ ├── cityscapes2.png
│ └── my_own_image.jpg
├── list
│ ├── ade20k_train_list.txt
│ ├── ade20k_val_list.txt
│ ├── cityscapes_train_list.txt
│ └── cityscapes_val_list.txt
└── output
│ ├── my_own_image.png
│ ├── vis_im1.png
│ └── vis_im2.png
├── demo.ipynb
├── evaluate.py
├── model.py
├── network.py
├── script
├── download_ADE20k.sh
└── download_weights.py
├── train.py
└── utils
├── __init__.py
├── color150.mat
├── config.py
├── icnet.png
├── image_reader.py
└── visualize.py
/.gitignore:
--------------------------------------------------------------------------------
1 | __pycache__/
2 | .ipynb_checkpoints/
3 | ADEChallengeData2016
4 | cityscapes_dataset
5 | checkpoint
6 | *.npy
7 | model.ckpt-*
8 |
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ICNet_tensorflow
2 | [](http://hits.dwyl.com/hellochick/ICNet-tensorflow)
3 |
4 | This repo provides a TensorFlow-based implementation of paper "[ICNet for Real-Time Semantic Segmentation on High-Resolution Images](https://arxiv.org/abs/1704.08545)," by Hengshuang Zhao, and et. al. (ECCV'18).
5 |
6 | The model generates segmentation mask for every pixel in the image. It's based on the ResNet50 with totally three branches as auxiliary paths, see architecture below for illustration.
7 |
8 | 
9 |
10 | We provide both training and inference code in this repo. The pre-trained models we provided are converted from caffe weights in [Official Implementation](https://github.com/hszhao/ICNet).
11 |
12 | ## News (2018.10.22 updated):
13 | Now you can try ICNet on your own image online using [ModelDepot live demo](https://modeldepot.io/hellochick/icnet)!
14 |
15 | ## Table Of Contents
16 | - [Environment Setup](#environment)
17 | - [Download Weights](#download-weights)
18 | - [Download Dataset](#download-dataset)
19 | + [ade20k](#download-ade20k)
20 | + [cityscapes](#download-cityscapes)
21 | - [Get Started!](#get-started)
22 | + [Inference on your own image](#inference)
23 | + [Evaluate on cityscapes/ade20k dataset](#evaluation)
24 | + [Training on your own dataset](#training)
25 |
26 | ## Environment Setup
27 | ```
28 | pip install tensorflow-gpu opencv-python jupyter matplotlib tqdm
29 | ```
30 |
31 | ## Download Weights
32 | We provide pre-trained weights for [cityscapes](https://www.cityscapes-dataset.com/) and [ADE20k](http://sceneparsing.csail.mit.edu/) dataset. You can download the weights easily use following command,
33 |
34 | ```
35 | python script/download_weights.py --dataset cityscapes (or ade20k)
36 | ```
37 |
38 | ## Download Dataset (Optional)
39 | If you want to evaluate the provided weights or keep fine-tuning on cityscapes and ade20k dataset, you need to download them using different methods.
40 |
41 | ### ADE20k dataset
42 | Simply run following command:
43 |
44 | ```
45 | bash script/download_ADE20k.sh
46 | ```
47 |
48 | ### Cityscapes dataset
49 | You need to download Cityscape dataset from [Official website](https://www.cityscapes-dataset.com/) first (you'll need to request access which may take couple of days).
50 |
51 | Then convert downloaded dataset ground truth to training format by following [instructions to install cityscapesScripts](https://github.com/mcordts/cityscapesScripts) then running these commands:
52 | ```bash
53 | export CITYSCAPES_DATASET=
54 | csCreateTrainIdLabelImgs
55 | ```
56 |
57 | ## Get started!
58 | This repo provide three phases with full documented, which means you can try train/evaluate/inference on your own.
59 |
60 | ### Inference on your own image
61 | [demo.ipynb](./demo.ipynb) show the easiest example to run semantic segmnetation on your own image.
62 |
63 | 
64 | 
65 |
66 | In the end of [demo.ipynb](./demo.ipynb), you can test the speed of ICNet.
67 |
68 | Here are some results run on Titan Xp with high resolution images (1024x2048):
69 | **~0.037(s) per images, which means we can get ~27 fps** (nearly same as described in paper).
70 |
71 | ### Evaluate on cityscapes/ade20k dataset
72 | To get the results, you need to follow the steps metioned above to download dataset first.
73 | Then you need to change the `data_dir` path in [config.py](./utils/config.py#L6).
74 |
75 | ```python
76 | CITYSCAPES_DATA_DIR = '/data/cityscapes_dataset/cityscape/'
77 | ADE20K_DATA_DIR = './data/ADEChallengeData2016/'
78 | ```
79 |
80 | #### Cityscapes
81 | Perform in single-scaled model on the cityscapes validation dataset. (We have sucessfully re-produced the performance same to caffe framework).
82 |
83 | | Model | Accuracy | Model | Accuracy |
84 | |:-----------:|:----------:|:---------:|:---------:|
85 | | train_30k | **67.26%/67.7%** | train_30k_bn |**67.31%/67.7%** |
86 | | trainval_90k| **80.90%** | trainval_90k_bn |**0.8081%** |
87 |
88 | Run following command to get evaluation results,
89 | ```
90 | python evaluate.py --dataset=cityscapes --filter-scale=1 --model=trainval
91 | ```
92 |
93 | List of Args:
94 | ```
95 | --model=train - To select train_30k model
96 | --model=trainval - To select trainval_90k model
97 | --model=train_bn - To select train_30k_bn model
98 | --model=trainval_bn - To select trainval_90k_bn model
99 | ```
100 |
101 | ### ADE20k
102 | Reach **32.25%mIoU** on ADE20k validation set.
103 |
104 | ```
105 | python evaluate.py --dataset=ade20k --filter-scale=2 --model=others
106 | ```
107 | > Note: to use model provided by us, set `filter-scale` to 2.
108 |
109 | ## Training on your own dataset
110 | This implementation is different from the details descibed in ICNet paper, since I did not re-produce model compression part. Instead, we **train on the half kernels directly**.
111 |
112 | In orignal paper, the authod trained the model in full kernels and then performed model-pruning techique to kill half kernels. Here **we use --filter-scale to denote whether pruning or not**.
113 |
114 | For example, `--filter-scale=1` <-> `[h, w, 32]` and `--filter-scale=2` <-> `[h, w, 64]`.
115 |
116 | ### Step by Step
117 | **1. Change the configurations** in [utils/config.py](./utils/config.py).
118 |
119 | ```python
120 | cityscapes_param = {'name': 'cityscapes',
121 | 'num_classes': 19,
122 | 'ignore_label': 255,
123 | 'eval_size': [1025, 2049],
124 | 'eval_steps': 500,
125 | 'eval_list': CITYSCAPES_eval_list,
126 | 'train_list': CITYSCAPES_train_list,
127 | 'data_dir': CITYSCAPES_DATA_DIR}
128 | ```
129 |
130 | **2. Set Hyperparameters** in `train.py`,
131 |
132 | ```python
133 | class TrainConfig(Config):
134 | def __init__(self, dataset, is_training, filter_scale=1, random_scale=None, random_mirror=None):
135 | Config.__init__(self, dataset, is_training, filter_scale, random_scale, random_mirror)
136 |
137 | # Set pre-trained weights here (You can download weight using `python script/download_weights.py`)
138 | # Note that you need to use "bnnomerge" version.
139 | model_weight = './model/cityscapes/icnet_cityscapes_train_30k_bnnomerge.npy'
140 |
141 | # Set hyperparameters here, you can get much more setting in Config Class, see 'utils/config.py' for details.
142 | LAMBDA1 = 0.16
143 | LAMBDA2 = 0.4
144 | LAMBDA3 = 1.0
145 | BATCH_SIZE = 4
146 | LEARNING_RATE = 5e-4
147 | ```
148 |
149 | **3.** Run following command and **decide whether to update mean/var or train beta/gamma variable**.
150 | ```
151 | python train.py --update-mean-var --train-beta-gamma \
152 | --random-scale --random-mirror --dataset cityscapes --filter-scale 2
153 | ```
154 |
155 | **Note: Be careful to use `--update-mean-var`!** Use this flag means you will update the moving mean and moving variance in batch normalization layer. This **need large batch size**, otherwise it will lead bad results.
156 |
157 | ### Result (inference with my own data)
158 | 
159 |
160 | ## Citation
161 | @article{zhao2017icnet,
162 | author = {Hengshuang Zhao and
163 | Xiaojuan Qi and
164 | Xiaoyong Shen and
165 | Jianping Shi and
166 | Jiaya Jia},
167 | title = {ICNet for Real-Time Semantic Segmentation on High-Resolution Images},
168 | journal={arXiv preprint arXiv:1704.08545},
169 | year = {2017}
170 | }
171 |
172 | @inproceedings{zhou2017scene,
173 | title={Scene Parsing through ADE20K Dataset},
174 | author={Zhou, Bolei and Zhao, Hang and Puig, Xavier and Fidler, Sanja and Barriuso, Adela and Torralba, Antonio},
175 | booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},
176 | year={2017}
177 | }
178 |
179 | @article{zhou2016semantic,
180 | title={Semantic understanding of scenes through the ade20k dataset},
181 | author={Zhou, Bolei and Zhao, Hang and Puig, Xavier and Fidler, Sanja and Barriuso, Adela and Torralba, Antonio},
182 | journal={arXiv preprint arXiv:1608.05442},
183 | year={2016}
184 | }
185 |
186 | If you find this implementation or the pre-trained models helpful, please consider to cite:
187 |
188 | @misc{Yang2018,
189 | author = {Hsuan-Kung, Yang},
190 | title = {ICNet-tensorflow},
191 | year = {2018},
192 | publisher = {GitHub},
193 | journal = {GitHub repository},
194 | howpublished = {\url{https://github.com/hellochick/ICNet-tensorflow}}
195 | }
196 |
--------------------------------------------------------------------------------
/data/input/ade20k.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/input/ade20k.jpg
--------------------------------------------------------------------------------
/data/input/cityscapes1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/input/cityscapes1.png
--------------------------------------------------------------------------------
/data/input/cityscapes2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/input/cityscapes2.png
--------------------------------------------------------------------------------
/data/input/my_own_image.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/input/my_own_image.jpg
--------------------------------------------------------------------------------
/data/list/cityscapes_val_list.txt:
--------------------------------------------------------------------------------
1 | leftImg8bit/val/lindau/lindau_000000_000019_leftImg8bit.png gtFine/val/lindau/lindau_000000_000019_gtFine_labelTrainIds.png
2 | leftImg8bit/val/lindau/lindau_000001_000019_leftImg8bit.png gtFine/val/lindau/lindau_000001_000019_gtFine_labelTrainIds.png
3 | leftImg8bit/val/lindau/lindau_000002_000019_leftImg8bit.png gtFine/val/lindau/lindau_000002_000019_gtFine_labelTrainIds.png
4 | leftImg8bit/val/lindau/lindau_000003_000019_leftImg8bit.png gtFine/val/lindau/lindau_000003_000019_gtFine_labelTrainIds.png
5 | leftImg8bit/val/lindau/lindau_000004_000019_leftImg8bit.png gtFine/val/lindau/lindau_000004_000019_gtFine_labelTrainIds.png
6 | leftImg8bit/val/lindau/lindau_000005_000019_leftImg8bit.png gtFine/val/lindau/lindau_000005_000019_gtFine_labelTrainIds.png
7 | leftImg8bit/val/lindau/lindau_000006_000019_leftImg8bit.png gtFine/val/lindau/lindau_000006_000019_gtFine_labelTrainIds.png
8 | leftImg8bit/val/lindau/lindau_000007_000019_leftImg8bit.png gtFine/val/lindau/lindau_000007_000019_gtFine_labelTrainIds.png
9 | leftImg8bit/val/lindau/lindau_000008_000019_leftImg8bit.png gtFine/val/lindau/lindau_000008_000019_gtFine_labelTrainIds.png
10 | leftImg8bit/val/lindau/lindau_000009_000019_leftImg8bit.png gtFine/val/lindau/lindau_000009_000019_gtFine_labelTrainIds.png
11 | leftImg8bit/val/lindau/lindau_000010_000019_leftImg8bit.png gtFine/val/lindau/lindau_000010_000019_gtFine_labelTrainIds.png
12 | leftImg8bit/val/lindau/lindau_000011_000019_leftImg8bit.png gtFine/val/lindau/lindau_000011_000019_gtFine_labelTrainIds.png
13 | leftImg8bit/val/lindau/lindau_000012_000019_leftImg8bit.png gtFine/val/lindau/lindau_000012_000019_gtFine_labelTrainIds.png
14 | leftImg8bit/val/lindau/lindau_000013_000019_leftImg8bit.png gtFine/val/lindau/lindau_000013_000019_gtFine_labelTrainIds.png
15 | leftImg8bit/val/lindau/lindau_000014_000019_leftImg8bit.png gtFine/val/lindau/lindau_000014_000019_gtFine_labelTrainIds.png
16 | leftImg8bit/val/lindau/lindau_000015_000019_leftImg8bit.png gtFine/val/lindau/lindau_000015_000019_gtFine_labelTrainIds.png
17 | leftImg8bit/val/lindau/lindau_000016_000019_leftImg8bit.png gtFine/val/lindau/lindau_000016_000019_gtFine_labelTrainIds.png
18 | leftImg8bit/val/lindau/lindau_000017_000019_leftImg8bit.png gtFine/val/lindau/lindau_000017_000019_gtFine_labelTrainIds.png
19 | leftImg8bit/val/lindau/lindau_000018_000019_leftImg8bit.png gtFine/val/lindau/lindau_000018_000019_gtFine_labelTrainIds.png
20 | leftImg8bit/val/lindau/lindau_000019_000019_leftImg8bit.png gtFine/val/lindau/lindau_000019_000019_gtFine_labelTrainIds.png
21 | leftImg8bit/val/lindau/lindau_000020_000019_leftImg8bit.png gtFine/val/lindau/lindau_000020_000019_gtFine_labelTrainIds.png
22 | leftImg8bit/val/lindau/lindau_000021_000019_leftImg8bit.png gtFine/val/lindau/lindau_000021_000019_gtFine_labelTrainIds.png
23 | leftImg8bit/val/lindau/lindau_000022_000019_leftImg8bit.png gtFine/val/lindau/lindau_000022_000019_gtFine_labelTrainIds.png
24 | leftImg8bit/val/lindau/lindau_000023_000019_leftImg8bit.png gtFine/val/lindau/lindau_000023_000019_gtFine_labelTrainIds.png
25 | leftImg8bit/val/lindau/lindau_000024_000019_leftImg8bit.png gtFine/val/lindau/lindau_000024_000019_gtFine_labelTrainIds.png
26 | leftImg8bit/val/lindau/lindau_000025_000019_leftImg8bit.png gtFine/val/lindau/lindau_000025_000019_gtFine_labelTrainIds.png
27 | leftImg8bit/val/lindau/lindau_000026_000019_leftImg8bit.png gtFine/val/lindau/lindau_000026_000019_gtFine_labelTrainIds.png
28 | leftImg8bit/val/lindau/lindau_000027_000019_leftImg8bit.png gtFine/val/lindau/lindau_000027_000019_gtFine_labelTrainIds.png
29 | leftImg8bit/val/lindau/lindau_000028_000019_leftImg8bit.png gtFine/val/lindau/lindau_000028_000019_gtFine_labelTrainIds.png
30 | leftImg8bit/val/lindau/lindau_000029_000019_leftImg8bit.png gtFine/val/lindau/lindau_000029_000019_gtFine_labelTrainIds.png
31 | leftImg8bit/val/lindau/lindau_000030_000019_leftImg8bit.png gtFine/val/lindau/lindau_000030_000019_gtFine_labelTrainIds.png
32 | leftImg8bit/val/lindau/lindau_000031_000019_leftImg8bit.png gtFine/val/lindau/lindau_000031_000019_gtFine_labelTrainIds.png
33 | leftImg8bit/val/lindau/lindau_000032_000019_leftImg8bit.png gtFine/val/lindau/lindau_000032_000019_gtFine_labelTrainIds.png
34 | leftImg8bit/val/lindau/lindau_000033_000019_leftImg8bit.png gtFine/val/lindau/lindau_000033_000019_gtFine_labelTrainIds.png
35 | leftImg8bit/val/lindau/lindau_000034_000019_leftImg8bit.png gtFine/val/lindau/lindau_000034_000019_gtFine_labelTrainIds.png
36 | leftImg8bit/val/lindau/lindau_000035_000019_leftImg8bit.png gtFine/val/lindau/lindau_000035_000019_gtFine_labelTrainIds.png
37 | leftImg8bit/val/lindau/lindau_000036_000019_leftImg8bit.png gtFine/val/lindau/lindau_000036_000019_gtFine_labelTrainIds.png
38 | leftImg8bit/val/lindau/lindau_000037_000019_leftImg8bit.png gtFine/val/lindau/lindau_000037_000019_gtFine_labelTrainIds.png
39 | leftImg8bit/val/lindau/lindau_000038_000019_leftImg8bit.png gtFine/val/lindau/lindau_000038_000019_gtFine_labelTrainIds.png
40 | leftImg8bit/val/lindau/lindau_000039_000019_leftImg8bit.png gtFine/val/lindau/lindau_000039_000019_gtFine_labelTrainIds.png
41 | leftImg8bit/val/lindau/lindau_000040_000019_leftImg8bit.png gtFine/val/lindau/lindau_000040_000019_gtFine_labelTrainIds.png
42 | leftImg8bit/val/lindau/lindau_000041_000019_leftImg8bit.png gtFine/val/lindau/lindau_000041_000019_gtFine_labelTrainIds.png
43 | leftImg8bit/val/lindau/lindau_000042_000019_leftImg8bit.png gtFine/val/lindau/lindau_000042_000019_gtFine_labelTrainIds.png
44 | leftImg8bit/val/lindau/lindau_000043_000019_leftImg8bit.png gtFine/val/lindau/lindau_000043_000019_gtFine_labelTrainIds.png
45 | leftImg8bit/val/lindau/lindau_000044_000019_leftImg8bit.png gtFine/val/lindau/lindau_000044_000019_gtFine_labelTrainIds.png
46 | leftImg8bit/val/lindau/lindau_000045_000019_leftImg8bit.png gtFine/val/lindau/lindau_000045_000019_gtFine_labelTrainIds.png
47 | leftImg8bit/val/lindau/lindau_000046_000019_leftImg8bit.png gtFine/val/lindau/lindau_000046_000019_gtFine_labelTrainIds.png
48 | leftImg8bit/val/lindau/lindau_000047_000019_leftImg8bit.png gtFine/val/lindau/lindau_000047_000019_gtFine_labelTrainIds.png
49 | leftImg8bit/val/lindau/lindau_000048_000019_leftImg8bit.png gtFine/val/lindau/lindau_000048_000019_gtFine_labelTrainIds.png
50 | leftImg8bit/val/lindau/lindau_000049_000019_leftImg8bit.png gtFine/val/lindau/lindau_000049_000019_gtFine_labelTrainIds.png
51 | leftImg8bit/val/lindau/lindau_000050_000019_leftImg8bit.png gtFine/val/lindau/lindau_000050_000019_gtFine_labelTrainIds.png
52 | leftImg8bit/val/lindau/lindau_000051_000019_leftImg8bit.png gtFine/val/lindau/lindau_000051_000019_gtFine_labelTrainIds.png
53 | leftImg8bit/val/lindau/lindau_000052_000019_leftImg8bit.png gtFine/val/lindau/lindau_000052_000019_gtFine_labelTrainIds.png
54 | leftImg8bit/val/lindau/lindau_000053_000019_leftImg8bit.png gtFine/val/lindau/lindau_000053_000019_gtFine_labelTrainIds.png
55 | leftImg8bit/val/lindau/lindau_000054_000019_leftImg8bit.png gtFine/val/lindau/lindau_000054_000019_gtFine_labelTrainIds.png
56 | leftImg8bit/val/lindau/lindau_000055_000019_leftImg8bit.png gtFine/val/lindau/lindau_000055_000019_gtFine_labelTrainIds.png
57 | leftImg8bit/val/lindau/lindau_000056_000019_leftImg8bit.png gtFine/val/lindau/lindau_000056_000019_gtFine_labelTrainIds.png
58 | leftImg8bit/val/lindau/lindau_000057_000019_leftImg8bit.png gtFine/val/lindau/lindau_000057_000019_gtFine_labelTrainIds.png
59 | leftImg8bit/val/lindau/lindau_000058_000019_leftImg8bit.png gtFine/val/lindau/lindau_000058_000019_gtFine_labelTrainIds.png
60 | leftImg8bit/val/munster/munster_000000_000019_leftImg8bit.png gtFine/val/munster/munster_000000_000019_gtFine_labelTrainIds.png
61 | leftImg8bit/val/munster/munster_000001_000019_leftImg8bit.png gtFine/val/munster/munster_000001_000019_gtFine_labelTrainIds.png
62 | leftImg8bit/val/munster/munster_000002_000019_leftImg8bit.png gtFine/val/munster/munster_000002_000019_gtFine_labelTrainIds.png
63 | leftImg8bit/val/munster/munster_000003_000019_leftImg8bit.png gtFine/val/munster/munster_000003_000019_gtFine_labelTrainIds.png
64 | leftImg8bit/val/munster/munster_000004_000019_leftImg8bit.png gtFine/val/munster/munster_000004_000019_gtFine_labelTrainIds.png
65 | leftImg8bit/val/munster/munster_000005_000019_leftImg8bit.png gtFine/val/munster/munster_000005_000019_gtFine_labelTrainIds.png
66 | leftImg8bit/val/munster/munster_000006_000019_leftImg8bit.png gtFine/val/munster/munster_000006_000019_gtFine_labelTrainIds.png
67 | leftImg8bit/val/munster/munster_000007_000019_leftImg8bit.png gtFine/val/munster/munster_000007_000019_gtFine_labelTrainIds.png
68 | leftImg8bit/val/munster/munster_000008_000019_leftImg8bit.png gtFine/val/munster/munster_000008_000019_gtFine_labelTrainIds.png
69 | leftImg8bit/val/munster/munster_000009_000019_leftImg8bit.png gtFine/val/munster/munster_000009_000019_gtFine_labelTrainIds.png
70 | leftImg8bit/val/munster/munster_000010_000019_leftImg8bit.png gtFine/val/munster/munster_000010_000019_gtFine_labelTrainIds.png
71 | leftImg8bit/val/munster/munster_000011_000019_leftImg8bit.png gtFine/val/munster/munster_000011_000019_gtFine_labelTrainIds.png
72 | leftImg8bit/val/munster/munster_000012_000019_leftImg8bit.png gtFine/val/munster/munster_000012_000019_gtFine_labelTrainIds.png
73 | leftImg8bit/val/munster/munster_000013_000019_leftImg8bit.png gtFine/val/munster/munster_000013_000019_gtFine_labelTrainIds.png
74 | leftImg8bit/val/munster/munster_000014_000019_leftImg8bit.png gtFine/val/munster/munster_000014_000019_gtFine_labelTrainIds.png
75 | leftImg8bit/val/munster/munster_000015_000019_leftImg8bit.png gtFine/val/munster/munster_000015_000019_gtFine_labelTrainIds.png
76 | leftImg8bit/val/munster/munster_000016_000019_leftImg8bit.png gtFine/val/munster/munster_000016_000019_gtFine_labelTrainIds.png
77 | leftImg8bit/val/munster/munster_000017_000019_leftImg8bit.png gtFine/val/munster/munster_000017_000019_gtFine_labelTrainIds.png
78 | leftImg8bit/val/munster/munster_000018_000019_leftImg8bit.png gtFine/val/munster/munster_000018_000019_gtFine_labelTrainIds.png
79 | leftImg8bit/val/munster/munster_000019_000019_leftImg8bit.png gtFine/val/munster/munster_000019_000019_gtFine_labelTrainIds.png
80 | leftImg8bit/val/munster/munster_000020_000019_leftImg8bit.png gtFine/val/munster/munster_000020_000019_gtFine_labelTrainIds.png
81 | leftImg8bit/val/munster/munster_000021_000019_leftImg8bit.png gtFine/val/munster/munster_000021_000019_gtFine_labelTrainIds.png
82 | leftImg8bit/val/munster/munster_000022_000019_leftImg8bit.png gtFine/val/munster/munster_000022_000019_gtFine_labelTrainIds.png
83 | leftImg8bit/val/munster/munster_000023_000019_leftImg8bit.png gtFine/val/munster/munster_000023_000019_gtFine_labelTrainIds.png
84 | leftImg8bit/val/munster/munster_000024_000019_leftImg8bit.png gtFine/val/munster/munster_000024_000019_gtFine_labelTrainIds.png
85 | leftImg8bit/val/munster/munster_000025_000019_leftImg8bit.png gtFine/val/munster/munster_000025_000019_gtFine_labelTrainIds.png
86 | leftImg8bit/val/munster/munster_000026_000019_leftImg8bit.png gtFine/val/munster/munster_000026_000019_gtFine_labelTrainIds.png
87 | leftImg8bit/val/munster/munster_000027_000019_leftImg8bit.png gtFine/val/munster/munster_000027_000019_gtFine_labelTrainIds.png
88 | leftImg8bit/val/munster/munster_000028_000019_leftImg8bit.png gtFine/val/munster/munster_000028_000019_gtFine_labelTrainIds.png
89 | leftImg8bit/val/munster/munster_000029_000019_leftImg8bit.png gtFine/val/munster/munster_000029_000019_gtFine_labelTrainIds.png
90 | leftImg8bit/val/munster/munster_000030_000019_leftImg8bit.png gtFine/val/munster/munster_000030_000019_gtFine_labelTrainIds.png
91 | leftImg8bit/val/munster/munster_000031_000019_leftImg8bit.png gtFine/val/munster/munster_000031_000019_gtFine_labelTrainIds.png
92 | leftImg8bit/val/munster/munster_000032_000019_leftImg8bit.png gtFine/val/munster/munster_000032_000019_gtFine_labelTrainIds.png
93 | leftImg8bit/val/munster/munster_000033_000019_leftImg8bit.png gtFine/val/munster/munster_000033_000019_gtFine_labelTrainIds.png
94 | leftImg8bit/val/munster/munster_000034_000019_leftImg8bit.png gtFine/val/munster/munster_000034_000019_gtFine_labelTrainIds.png
95 | leftImg8bit/val/munster/munster_000035_000019_leftImg8bit.png gtFine/val/munster/munster_000035_000019_gtFine_labelTrainIds.png
96 | leftImg8bit/val/munster/munster_000036_000019_leftImg8bit.png gtFine/val/munster/munster_000036_000019_gtFine_labelTrainIds.png
97 | leftImg8bit/val/munster/munster_000037_000019_leftImg8bit.png gtFine/val/munster/munster_000037_000019_gtFine_labelTrainIds.png
98 | leftImg8bit/val/munster/munster_000038_000019_leftImg8bit.png gtFine/val/munster/munster_000038_000019_gtFine_labelTrainIds.png
99 | leftImg8bit/val/munster/munster_000039_000019_leftImg8bit.png gtFine/val/munster/munster_000039_000019_gtFine_labelTrainIds.png
100 | leftImg8bit/val/munster/munster_000040_000019_leftImg8bit.png gtFine/val/munster/munster_000040_000019_gtFine_labelTrainIds.png
101 | leftImg8bit/val/munster/munster_000041_000019_leftImg8bit.png gtFine/val/munster/munster_000041_000019_gtFine_labelTrainIds.png
102 | leftImg8bit/val/munster/munster_000042_000019_leftImg8bit.png gtFine/val/munster/munster_000042_000019_gtFine_labelTrainIds.png
103 | leftImg8bit/val/munster/munster_000043_000019_leftImg8bit.png gtFine/val/munster/munster_000043_000019_gtFine_labelTrainIds.png
104 | leftImg8bit/val/munster/munster_000044_000019_leftImg8bit.png gtFine/val/munster/munster_000044_000019_gtFine_labelTrainIds.png
105 | leftImg8bit/val/munster/munster_000045_000019_leftImg8bit.png gtFine/val/munster/munster_000045_000019_gtFine_labelTrainIds.png
106 | leftImg8bit/val/munster/munster_000046_000019_leftImg8bit.png gtFine/val/munster/munster_000046_000019_gtFine_labelTrainIds.png
107 | leftImg8bit/val/munster/munster_000047_000019_leftImg8bit.png gtFine/val/munster/munster_000047_000019_gtFine_labelTrainIds.png
108 | leftImg8bit/val/munster/munster_000048_000019_leftImg8bit.png gtFine/val/munster/munster_000048_000019_gtFine_labelTrainIds.png
109 | leftImg8bit/val/munster/munster_000049_000019_leftImg8bit.png gtFine/val/munster/munster_000049_000019_gtFine_labelTrainIds.png
110 | leftImg8bit/val/munster/munster_000050_000019_leftImg8bit.png gtFine/val/munster/munster_000050_000019_gtFine_labelTrainIds.png
111 | leftImg8bit/val/munster/munster_000051_000019_leftImg8bit.png gtFine/val/munster/munster_000051_000019_gtFine_labelTrainIds.png
112 | leftImg8bit/val/munster/munster_000052_000019_leftImg8bit.png gtFine/val/munster/munster_000052_000019_gtFine_labelTrainIds.png
113 | leftImg8bit/val/munster/munster_000053_000019_leftImg8bit.png gtFine/val/munster/munster_000053_000019_gtFine_labelTrainIds.png
114 | leftImg8bit/val/munster/munster_000054_000019_leftImg8bit.png gtFine/val/munster/munster_000054_000019_gtFine_labelTrainIds.png
115 | leftImg8bit/val/munster/munster_000055_000019_leftImg8bit.png gtFine/val/munster/munster_000055_000019_gtFine_labelTrainIds.png
116 | leftImg8bit/val/munster/munster_000056_000019_leftImg8bit.png gtFine/val/munster/munster_000056_000019_gtFine_labelTrainIds.png
117 | leftImg8bit/val/munster/munster_000057_000019_leftImg8bit.png gtFine/val/munster/munster_000057_000019_gtFine_labelTrainIds.png
118 | leftImg8bit/val/munster/munster_000058_000019_leftImg8bit.png gtFine/val/munster/munster_000058_000019_gtFine_labelTrainIds.png
119 | leftImg8bit/val/munster/munster_000059_000019_leftImg8bit.png gtFine/val/munster/munster_000059_000019_gtFine_labelTrainIds.png
120 | leftImg8bit/val/munster/munster_000060_000019_leftImg8bit.png gtFine/val/munster/munster_000060_000019_gtFine_labelTrainIds.png
121 | leftImg8bit/val/munster/munster_000061_000019_leftImg8bit.png gtFine/val/munster/munster_000061_000019_gtFine_labelTrainIds.png
122 | leftImg8bit/val/munster/munster_000062_000019_leftImg8bit.png gtFine/val/munster/munster_000062_000019_gtFine_labelTrainIds.png
123 | leftImg8bit/val/munster/munster_000063_000019_leftImg8bit.png gtFine/val/munster/munster_000063_000019_gtFine_labelTrainIds.png
124 | leftImg8bit/val/munster/munster_000064_000019_leftImg8bit.png gtFine/val/munster/munster_000064_000019_gtFine_labelTrainIds.png
125 | leftImg8bit/val/munster/munster_000065_000019_leftImg8bit.png gtFine/val/munster/munster_000065_000019_gtFine_labelTrainIds.png
126 | leftImg8bit/val/munster/munster_000066_000019_leftImg8bit.png gtFine/val/munster/munster_000066_000019_gtFine_labelTrainIds.png
127 | leftImg8bit/val/munster/munster_000067_000019_leftImg8bit.png gtFine/val/munster/munster_000067_000019_gtFine_labelTrainIds.png
128 | leftImg8bit/val/munster/munster_000068_000019_leftImg8bit.png gtFine/val/munster/munster_000068_000019_gtFine_labelTrainIds.png
129 | leftImg8bit/val/munster/munster_000069_000019_leftImg8bit.png gtFine/val/munster/munster_000069_000019_gtFine_labelTrainIds.png
130 | leftImg8bit/val/munster/munster_000070_000019_leftImg8bit.png gtFine/val/munster/munster_000070_000019_gtFine_labelTrainIds.png
131 | leftImg8bit/val/munster/munster_000071_000019_leftImg8bit.png gtFine/val/munster/munster_000071_000019_gtFine_labelTrainIds.png
132 | leftImg8bit/val/munster/munster_000072_000019_leftImg8bit.png gtFine/val/munster/munster_000072_000019_gtFine_labelTrainIds.png
133 | leftImg8bit/val/munster/munster_000073_000019_leftImg8bit.png gtFine/val/munster/munster_000073_000019_gtFine_labelTrainIds.png
134 | leftImg8bit/val/munster/munster_000074_000019_leftImg8bit.png gtFine/val/munster/munster_000074_000019_gtFine_labelTrainIds.png
135 | leftImg8bit/val/munster/munster_000075_000019_leftImg8bit.png gtFine/val/munster/munster_000075_000019_gtFine_labelTrainIds.png
136 | leftImg8bit/val/munster/munster_000076_000019_leftImg8bit.png gtFine/val/munster/munster_000076_000019_gtFine_labelTrainIds.png
137 | leftImg8bit/val/munster/munster_000077_000019_leftImg8bit.png gtFine/val/munster/munster_000077_000019_gtFine_labelTrainIds.png
138 | leftImg8bit/val/munster/munster_000078_000019_leftImg8bit.png gtFine/val/munster/munster_000078_000019_gtFine_labelTrainIds.png
139 | leftImg8bit/val/munster/munster_000079_000019_leftImg8bit.png gtFine/val/munster/munster_000079_000019_gtFine_labelTrainIds.png
140 | leftImg8bit/val/munster/munster_000080_000019_leftImg8bit.png gtFine/val/munster/munster_000080_000019_gtFine_labelTrainIds.png
141 | leftImg8bit/val/munster/munster_000081_000019_leftImg8bit.png gtFine/val/munster/munster_000081_000019_gtFine_labelTrainIds.png
142 | leftImg8bit/val/munster/munster_000082_000019_leftImg8bit.png gtFine/val/munster/munster_000082_000019_gtFine_labelTrainIds.png
143 | leftImg8bit/val/munster/munster_000083_000019_leftImg8bit.png gtFine/val/munster/munster_000083_000019_gtFine_labelTrainIds.png
144 | leftImg8bit/val/munster/munster_000084_000019_leftImg8bit.png gtFine/val/munster/munster_000084_000019_gtFine_labelTrainIds.png
145 | leftImg8bit/val/munster/munster_000085_000019_leftImg8bit.png gtFine/val/munster/munster_000085_000019_gtFine_labelTrainIds.png
146 | leftImg8bit/val/munster/munster_000086_000019_leftImg8bit.png gtFine/val/munster/munster_000086_000019_gtFine_labelTrainIds.png
147 | leftImg8bit/val/munster/munster_000087_000019_leftImg8bit.png gtFine/val/munster/munster_000087_000019_gtFine_labelTrainIds.png
148 | leftImg8bit/val/munster/munster_000088_000019_leftImg8bit.png gtFine/val/munster/munster_000088_000019_gtFine_labelTrainIds.png
149 | leftImg8bit/val/munster/munster_000089_000019_leftImg8bit.png gtFine/val/munster/munster_000089_000019_gtFine_labelTrainIds.png
150 | leftImg8bit/val/munster/munster_000090_000019_leftImg8bit.png gtFine/val/munster/munster_000090_000019_gtFine_labelTrainIds.png
151 | leftImg8bit/val/munster/munster_000091_000019_leftImg8bit.png gtFine/val/munster/munster_000091_000019_gtFine_labelTrainIds.png
152 | leftImg8bit/val/munster/munster_000092_000019_leftImg8bit.png gtFine/val/munster/munster_000092_000019_gtFine_labelTrainIds.png
153 | leftImg8bit/val/munster/munster_000093_000019_leftImg8bit.png gtFine/val/munster/munster_000093_000019_gtFine_labelTrainIds.png
154 | leftImg8bit/val/munster/munster_000094_000019_leftImg8bit.png gtFine/val/munster/munster_000094_000019_gtFine_labelTrainIds.png
155 | leftImg8bit/val/munster/munster_000095_000019_leftImg8bit.png gtFine/val/munster/munster_000095_000019_gtFine_labelTrainIds.png
156 | leftImg8bit/val/munster/munster_000096_000019_leftImg8bit.png gtFine/val/munster/munster_000096_000019_gtFine_labelTrainIds.png
157 | leftImg8bit/val/munster/munster_000097_000019_leftImg8bit.png gtFine/val/munster/munster_000097_000019_gtFine_labelTrainIds.png
158 | leftImg8bit/val/munster/munster_000098_000019_leftImg8bit.png gtFine/val/munster/munster_000098_000019_gtFine_labelTrainIds.png
159 | leftImg8bit/val/munster/munster_000099_000019_leftImg8bit.png gtFine/val/munster/munster_000099_000019_gtFine_labelTrainIds.png
160 | leftImg8bit/val/munster/munster_000100_000019_leftImg8bit.png gtFine/val/munster/munster_000100_000019_gtFine_labelTrainIds.png
161 | leftImg8bit/val/munster/munster_000101_000019_leftImg8bit.png gtFine/val/munster/munster_000101_000019_gtFine_labelTrainIds.png
162 | leftImg8bit/val/munster/munster_000102_000019_leftImg8bit.png gtFine/val/munster/munster_000102_000019_gtFine_labelTrainIds.png
163 | leftImg8bit/val/munster/munster_000103_000019_leftImg8bit.png gtFine/val/munster/munster_000103_000019_gtFine_labelTrainIds.png
164 | leftImg8bit/val/munster/munster_000104_000019_leftImg8bit.png gtFine/val/munster/munster_000104_000019_gtFine_labelTrainIds.png
165 | leftImg8bit/val/munster/munster_000105_000019_leftImg8bit.png gtFine/val/munster/munster_000105_000019_gtFine_labelTrainIds.png
166 | leftImg8bit/val/munster/munster_000106_000019_leftImg8bit.png gtFine/val/munster/munster_000106_000019_gtFine_labelTrainIds.png
167 | leftImg8bit/val/munster/munster_000107_000019_leftImg8bit.png gtFine/val/munster/munster_000107_000019_gtFine_labelTrainIds.png
168 | leftImg8bit/val/munster/munster_000108_000019_leftImg8bit.png gtFine/val/munster/munster_000108_000019_gtFine_labelTrainIds.png
169 | leftImg8bit/val/munster/munster_000109_000019_leftImg8bit.png gtFine/val/munster/munster_000109_000019_gtFine_labelTrainIds.png
170 | leftImg8bit/val/munster/munster_000110_000019_leftImg8bit.png gtFine/val/munster/munster_000110_000019_gtFine_labelTrainIds.png
171 | leftImg8bit/val/munster/munster_000111_000019_leftImg8bit.png gtFine/val/munster/munster_000111_000019_gtFine_labelTrainIds.png
172 | leftImg8bit/val/munster/munster_000112_000019_leftImg8bit.png gtFine/val/munster/munster_000112_000019_gtFine_labelTrainIds.png
173 | leftImg8bit/val/munster/munster_000113_000019_leftImg8bit.png gtFine/val/munster/munster_000113_000019_gtFine_labelTrainIds.png
174 | leftImg8bit/val/munster/munster_000114_000019_leftImg8bit.png gtFine/val/munster/munster_000114_000019_gtFine_labelTrainIds.png
175 | leftImg8bit/val/munster/munster_000115_000019_leftImg8bit.png gtFine/val/munster/munster_000115_000019_gtFine_labelTrainIds.png
176 | leftImg8bit/val/munster/munster_000116_000019_leftImg8bit.png gtFine/val/munster/munster_000116_000019_gtFine_labelTrainIds.png
177 | leftImg8bit/val/munster/munster_000117_000019_leftImg8bit.png gtFine/val/munster/munster_000117_000019_gtFine_labelTrainIds.png
178 | leftImg8bit/val/munster/munster_000118_000019_leftImg8bit.png gtFine/val/munster/munster_000118_000019_gtFine_labelTrainIds.png
179 | leftImg8bit/val/munster/munster_000119_000019_leftImg8bit.png gtFine/val/munster/munster_000119_000019_gtFine_labelTrainIds.png
180 | leftImg8bit/val/munster/munster_000120_000019_leftImg8bit.png gtFine/val/munster/munster_000120_000019_gtFine_labelTrainIds.png
181 | leftImg8bit/val/munster/munster_000121_000019_leftImg8bit.png gtFine/val/munster/munster_000121_000019_gtFine_labelTrainIds.png
182 | leftImg8bit/val/munster/munster_000122_000019_leftImg8bit.png gtFine/val/munster/munster_000122_000019_gtFine_labelTrainIds.png
183 | leftImg8bit/val/munster/munster_000123_000019_leftImg8bit.png gtFine/val/munster/munster_000123_000019_gtFine_labelTrainIds.png
184 | leftImg8bit/val/munster/munster_000124_000019_leftImg8bit.png gtFine/val/munster/munster_000124_000019_gtFine_labelTrainIds.png
185 | leftImg8bit/val/munster/munster_000125_000019_leftImg8bit.png gtFine/val/munster/munster_000125_000019_gtFine_labelTrainIds.png
186 | leftImg8bit/val/munster/munster_000126_000019_leftImg8bit.png gtFine/val/munster/munster_000126_000019_gtFine_labelTrainIds.png
187 | leftImg8bit/val/munster/munster_000127_000019_leftImg8bit.png gtFine/val/munster/munster_000127_000019_gtFine_labelTrainIds.png
188 | leftImg8bit/val/munster/munster_000128_000019_leftImg8bit.png gtFine/val/munster/munster_000128_000019_gtFine_labelTrainIds.png
189 | leftImg8bit/val/munster/munster_000129_000019_leftImg8bit.png gtFine/val/munster/munster_000129_000019_gtFine_labelTrainIds.png
190 | leftImg8bit/val/munster/munster_000130_000019_leftImg8bit.png gtFine/val/munster/munster_000130_000019_gtFine_labelTrainIds.png
191 | leftImg8bit/val/munster/munster_000131_000019_leftImg8bit.png gtFine/val/munster/munster_000131_000019_gtFine_labelTrainIds.png
192 | leftImg8bit/val/munster/munster_000132_000019_leftImg8bit.png gtFine/val/munster/munster_000132_000019_gtFine_labelTrainIds.png
193 | leftImg8bit/val/munster/munster_000133_000019_leftImg8bit.png gtFine/val/munster/munster_000133_000019_gtFine_labelTrainIds.png
194 | leftImg8bit/val/munster/munster_000134_000019_leftImg8bit.png gtFine/val/munster/munster_000134_000019_gtFine_labelTrainIds.png
195 | leftImg8bit/val/munster/munster_000135_000019_leftImg8bit.png gtFine/val/munster/munster_000135_000019_gtFine_labelTrainIds.png
196 | leftImg8bit/val/munster/munster_000136_000019_leftImg8bit.png gtFine/val/munster/munster_000136_000019_gtFine_labelTrainIds.png
197 | leftImg8bit/val/munster/munster_000137_000019_leftImg8bit.png gtFine/val/munster/munster_000137_000019_gtFine_labelTrainIds.png
198 | leftImg8bit/val/munster/munster_000138_000019_leftImg8bit.png gtFine/val/munster/munster_000138_000019_gtFine_labelTrainIds.png
199 | leftImg8bit/val/munster/munster_000139_000019_leftImg8bit.png gtFine/val/munster/munster_000139_000019_gtFine_labelTrainIds.png
200 | leftImg8bit/val/munster/munster_000140_000019_leftImg8bit.png gtFine/val/munster/munster_000140_000019_gtFine_labelTrainIds.png
201 | leftImg8bit/val/munster/munster_000141_000019_leftImg8bit.png gtFine/val/munster/munster_000141_000019_gtFine_labelTrainIds.png
202 | leftImg8bit/val/munster/munster_000142_000019_leftImg8bit.png gtFine/val/munster/munster_000142_000019_gtFine_labelTrainIds.png
203 | leftImg8bit/val/munster/munster_000143_000019_leftImg8bit.png gtFine/val/munster/munster_000143_000019_gtFine_labelTrainIds.png
204 | leftImg8bit/val/munster/munster_000144_000019_leftImg8bit.png gtFine/val/munster/munster_000144_000019_gtFine_labelTrainIds.png
205 | leftImg8bit/val/munster/munster_000145_000019_leftImg8bit.png gtFine/val/munster/munster_000145_000019_gtFine_labelTrainIds.png
206 | leftImg8bit/val/munster/munster_000146_000019_leftImg8bit.png gtFine/val/munster/munster_000146_000019_gtFine_labelTrainIds.png
207 | leftImg8bit/val/munster/munster_000147_000019_leftImg8bit.png gtFine/val/munster/munster_000147_000019_gtFine_labelTrainIds.png
208 | leftImg8bit/val/munster/munster_000148_000019_leftImg8bit.png gtFine/val/munster/munster_000148_000019_gtFine_labelTrainIds.png
209 | leftImg8bit/val/munster/munster_000149_000019_leftImg8bit.png gtFine/val/munster/munster_000149_000019_gtFine_labelTrainIds.png
210 | leftImg8bit/val/munster/munster_000150_000019_leftImg8bit.png gtFine/val/munster/munster_000150_000019_gtFine_labelTrainIds.png
211 | leftImg8bit/val/munster/munster_000151_000019_leftImg8bit.png gtFine/val/munster/munster_000151_000019_gtFine_labelTrainIds.png
212 | leftImg8bit/val/munster/munster_000152_000019_leftImg8bit.png gtFine/val/munster/munster_000152_000019_gtFine_labelTrainIds.png
213 | leftImg8bit/val/munster/munster_000153_000019_leftImg8bit.png gtFine/val/munster/munster_000153_000019_gtFine_labelTrainIds.png
214 | leftImg8bit/val/munster/munster_000154_000019_leftImg8bit.png gtFine/val/munster/munster_000154_000019_gtFine_labelTrainIds.png
215 | leftImg8bit/val/munster/munster_000155_000019_leftImg8bit.png gtFine/val/munster/munster_000155_000019_gtFine_labelTrainIds.png
216 | leftImg8bit/val/munster/munster_000156_000019_leftImg8bit.png gtFine/val/munster/munster_000156_000019_gtFine_labelTrainIds.png
217 | leftImg8bit/val/munster/munster_000157_000019_leftImg8bit.png gtFine/val/munster/munster_000157_000019_gtFine_labelTrainIds.png
218 | leftImg8bit/val/munster/munster_000158_000019_leftImg8bit.png gtFine/val/munster/munster_000158_000019_gtFine_labelTrainIds.png
219 | leftImg8bit/val/munster/munster_000159_000019_leftImg8bit.png gtFine/val/munster/munster_000159_000019_gtFine_labelTrainIds.png
220 | leftImg8bit/val/munster/munster_000160_000019_leftImg8bit.png gtFine/val/munster/munster_000160_000019_gtFine_labelTrainIds.png
221 | leftImg8bit/val/munster/munster_000161_000019_leftImg8bit.png gtFine/val/munster/munster_000161_000019_gtFine_labelTrainIds.png
222 | leftImg8bit/val/munster/munster_000162_000019_leftImg8bit.png gtFine/val/munster/munster_000162_000019_gtFine_labelTrainIds.png
223 | leftImg8bit/val/munster/munster_000163_000019_leftImg8bit.png gtFine/val/munster/munster_000163_000019_gtFine_labelTrainIds.png
224 | leftImg8bit/val/munster/munster_000164_000019_leftImg8bit.png gtFine/val/munster/munster_000164_000019_gtFine_labelTrainIds.png
225 | leftImg8bit/val/munster/munster_000165_000019_leftImg8bit.png gtFine/val/munster/munster_000165_000019_gtFine_labelTrainIds.png
226 | leftImg8bit/val/munster/munster_000166_000019_leftImg8bit.png gtFine/val/munster/munster_000166_000019_gtFine_labelTrainIds.png
227 | leftImg8bit/val/munster/munster_000167_000019_leftImg8bit.png gtFine/val/munster/munster_000167_000019_gtFine_labelTrainIds.png
228 | leftImg8bit/val/munster/munster_000168_000019_leftImg8bit.png gtFine/val/munster/munster_000168_000019_gtFine_labelTrainIds.png
229 | leftImg8bit/val/munster/munster_000169_000019_leftImg8bit.png gtFine/val/munster/munster_000169_000019_gtFine_labelTrainIds.png
230 | leftImg8bit/val/munster/munster_000170_000019_leftImg8bit.png gtFine/val/munster/munster_000170_000019_gtFine_labelTrainIds.png
231 | leftImg8bit/val/munster/munster_000171_000019_leftImg8bit.png gtFine/val/munster/munster_000171_000019_gtFine_labelTrainIds.png
232 | leftImg8bit/val/munster/munster_000172_000019_leftImg8bit.png gtFine/val/munster/munster_000172_000019_gtFine_labelTrainIds.png
233 | leftImg8bit/val/munster/munster_000173_000019_leftImg8bit.png gtFine/val/munster/munster_000173_000019_gtFine_labelTrainIds.png
234 | leftImg8bit/val/frankfurt/frankfurt_000000_000294_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_000294_gtFine_labelTrainIds.png
235 | leftImg8bit/val/frankfurt/frankfurt_000000_000576_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_000576_gtFine_labelTrainIds.png
236 | leftImg8bit/val/frankfurt/frankfurt_000000_001016_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_001016_gtFine_labelTrainIds.png
237 | leftImg8bit/val/frankfurt/frankfurt_000000_001236_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_001236_gtFine_labelTrainIds.png
238 | leftImg8bit/val/frankfurt/frankfurt_000000_001751_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_001751_gtFine_labelTrainIds.png
239 | leftImg8bit/val/frankfurt/frankfurt_000000_002196_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_002196_gtFine_labelTrainIds.png
240 | leftImg8bit/val/frankfurt/frankfurt_000000_002963_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_002963_gtFine_labelTrainIds.png
241 | leftImg8bit/val/frankfurt/frankfurt_000000_003025_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_003025_gtFine_labelTrainIds.png
242 | leftImg8bit/val/frankfurt/frankfurt_000000_003357_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_003357_gtFine_labelTrainIds.png
243 | leftImg8bit/val/frankfurt/frankfurt_000000_003920_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_003920_gtFine_labelTrainIds.png
244 | leftImg8bit/val/frankfurt/frankfurt_000000_004617_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_004617_gtFine_labelTrainIds.png
245 | leftImg8bit/val/frankfurt/frankfurt_000000_005543_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_005543_gtFine_labelTrainIds.png
246 | leftImg8bit/val/frankfurt/frankfurt_000000_005898_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_005898_gtFine_labelTrainIds.png
247 | leftImg8bit/val/frankfurt/frankfurt_000000_006589_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_006589_gtFine_labelTrainIds.png
248 | leftImg8bit/val/frankfurt/frankfurt_000000_007365_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_007365_gtFine_labelTrainIds.png
249 | leftImg8bit/val/frankfurt/frankfurt_000000_008206_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_008206_gtFine_labelTrainIds.png
250 | leftImg8bit/val/frankfurt/frankfurt_000000_008451_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_008451_gtFine_labelTrainIds.png
251 | leftImg8bit/val/frankfurt/frankfurt_000000_009291_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_009291_gtFine_labelTrainIds.png
252 | leftImg8bit/val/frankfurt/frankfurt_000000_009561_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_009561_gtFine_labelTrainIds.png
253 | leftImg8bit/val/frankfurt/frankfurt_000000_009688_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_009688_gtFine_labelTrainIds.png
254 | leftImg8bit/val/frankfurt/frankfurt_000000_009969_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_009969_gtFine_labelTrainIds.png
255 | leftImg8bit/val/frankfurt/frankfurt_000000_010351_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_010351_gtFine_labelTrainIds.png
256 | leftImg8bit/val/frankfurt/frankfurt_000000_010763_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_010763_gtFine_labelTrainIds.png
257 | leftImg8bit/val/frankfurt/frankfurt_000000_011007_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_011007_gtFine_labelTrainIds.png
258 | leftImg8bit/val/frankfurt/frankfurt_000000_011074_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_011074_gtFine_labelTrainIds.png
259 | leftImg8bit/val/frankfurt/frankfurt_000000_011461_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_011461_gtFine_labelTrainIds.png
260 | leftImg8bit/val/frankfurt/frankfurt_000000_011810_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_011810_gtFine_labelTrainIds.png
261 | leftImg8bit/val/frankfurt/frankfurt_000000_012009_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_012009_gtFine_labelTrainIds.png
262 | leftImg8bit/val/frankfurt/frankfurt_000000_012121_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_012121_gtFine_labelTrainIds.png
263 | leftImg8bit/val/frankfurt/frankfurt_000000_012868_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_012868_gtFine_labelTrainIds.png
264 | leftImg8bit/val/frankfurt/frankfurt_000000_013067_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_013067_gtFine_labelTrainIds.png
265 | leftImg8bit/val/frankfurt/frankfurt_000000_013240_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_013240_gtFine_labelTrainIds.png
266 | leftImg8bit/val/frankfurt/frankfurt_000000_013382_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_013382_gtFine_labelTrainIds.png
267 | leftImg8bit/val/frankfurt/frankfurt_000000_013942_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_013942_gtFine_labelTrainIds.png
268 | leftImg8bit/val/frankfurt/frankfurt_000000_014480_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_014480_gtFine_labelTrainIds.png
269 | leftImg8bit/val/frankfurt/frankfurt_000000_015389_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_015389_gtFine_labelTrainIds.png
270 | leftImg8bit/val/frankfurt/frankfurt_000000_015676_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_015676_gtFine_labelTrainIds.png
271 | leftImg8bit/val/frankfurt/frankfurt_000000_016005_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_016005_gtFine_labelTrainIds.png
272 | leftImg8bit/val/frankfurt/frankfurt_000000_016286_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_016286_gtFine_labelTrainIds.png
273 | leftImg8bit/val/frankfurt/frankfurt_000000_017228_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_017228_gtFine_labelTrainIds.png
274 | leftImg8bit/val/frankfurt/frankfurt_000000_017476_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_017476_gtFine_labelTrainIds.png
275 | leftImg8bit/val/frankfurt/frankfurt_000000_018797_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_018797_gtFine_labelTrainIds.png
276 | leftImg8bit/val/frankfurt/frankfurt_000000_019607_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_019607_gtFine_labelTrainIds.png
277 | leftImg8bit/val/frankfurt/frankfurt_000000_020215_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_020215_gtFine_labelTrainIds.png
278 | leftImg8bit/val/frankfurt/frankfurt_000000_020321_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_020321_gtFine_labelTrainIds.png
279 | leftImg8bit/val/frankfurt/frankfurt_000000_020880_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_020880_gtFine_labelTrainIds.png
280 | leftImg8bit/val/frankfurt/frankfurt_000000_021667_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_021667_gtFine_labelTrainIds.png
281 | leftImg8bit/val/frankfurt/frankfurt_000000_021879_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_021879_gtFine_labelTrainIds.png
282 | leftImg8bit/val/frankfurt/frankfurt_000000_022254_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_022254_gtFine_labelTrainIds.png
283 | leftImg8bit/val/frankfurt/frankfurt_000000_022797_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000000_022797_gtFine_labelTrainIds.png
284 | leftImg8bit/val/frankfurt/frankfurt_000001_000538_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_000538_gtFine_labelTrainIds.png
285 | leftImg8bit/val/frankfurt/frankfurt_000001_001464_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_001464_gtFine_labelTrainIds.png
286 | leftImg8bit/val/frankfurt/frankfurt_000001_002512_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_002512_gtFine_labelTrainIds.png
287 | leftImg8bit/val/frankfurt/frankfurt_000001_002646_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_002646_gtFine_labelTrainIds.png
288 | leftImg8bit/val/frankfurt/frankfurt_000001_002759_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_002759_gtFine_labelTrainIds.png
289 | leftImg8bit/val/frankfurt/frankfurt_000001_003056_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_003056_gtFine_labelTrainIds.png
290 | leftImg8bit/val/frankfurt/frankfurt_000001_003588_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_003588_gtFine_labelTrainIds.png
291 | leftImg8bit/val/frankfurt/frankfurt_000001_004327_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_004327_gtFine_labelTrainIds.png
292 | leftImg8bit/val/frankfurt/frankfurt_000001_004736_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_004736_gtFine_labelTrainIds.png
293 | leftImg8bit/val/frankfurt/frankfurt_000001_004859_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_004859_gtFine_labelTrainIds.png
294 | leftImg8bit/val/frankfurt/frankfurt_000001_005184_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_005184_gtFine_labelTrainIds.png
295 | leftImg8bit/val/frankfurt/frankfurt_000001_005410_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_005410_gtFine_labelTrainIds.png
296 | leftImg8bit/val/frankfurt/frankfurt_000001_005703_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_005703_gtFine_labelTrainIds.png
297 | leftImg8bit/val/frankfurt/frankfurt_000001_005898_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_005898_gtFine_labelTrainIds.png
298 | leftImg8bit/val/frankfurt/frankfurt_000001_007285_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_007285_gtFine_labelTrainIds.png
299 | leftImg8bit/val/frankfurt/frankfurt_000001_007407_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_007407_gtFine_labelTrainIds.png
300 | leftImg8bit/val/frankfurt/frankfurt_000001_007622_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_007622_gtFine_labelTrainIds.png
301 | leftImg8bit/val/frankfurt/frankfurt_000001_007857_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_007857_gtFine_labelTrainIds.png
302 | leftImg8bit/val/frankfurt/frankfurt_000001_007973_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_007973_gtFine_labelTrainIds.png
303 | leftImg8bit/val/frankfurt/frankfurt_000001_008200_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_008200_gtFine_labelTrainIds.png
304 | leftImg8bit/val/frankfurt/frankfurt_000001_008688_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_008688_gtFine_labelTrainIds.png
305 | leftImg8bit/val/frankfurt/frankfurt_000001_009058_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_009058_gtFine_labelTrainIds.png
306 | leftImg8bit/val/frankfurt/frankfurt_000001_009504_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_009504_gtFine_labelTrainIds.png
307 | leftImg8bit/val/frankfurt/frankfurt_000001_009854_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_009854_gtFine_labelTrainIds.png
308 | leftImg8bit/val/frankfurt/frankfurt_000001_010156_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_010156_gtFine_labelTrainIds.png
309 | leftImg8bit/val/frankfurt/frankfurt_000001_010444_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_010444_gtFine_labelTrainIds.png
310 | leftImg8bit/val/frankfurt/frankfurt_000001_010600_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_010600_gtFine_labelTrainIds.png
311 | leftImg8bit/val/frankfurt/frankfurt_000001_010830_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_010830_gtFine_labelTrainIds.png
312 | leftImg8bit/val/frankfurt/frankfurt_000001_011162_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_011162_gtFine_labelTrainIds.png
313 | leftImg8bit/val/frankfurt/frankfurt_000001_011715_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_011715_gtFine_labelTrainIds.png
314 | leftImg8bit/val/frankfurt/frankfurt_000001_011835_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_011835_gtFine_labelTrainIds.png
315 | leftImg8bit/val/frankfurt/frankfurt_000001_012038_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_012038_gtFine_labelTrainIds.png
316 | leftImg8bit/val/frankfurt/frankfurt_000001_012519_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_012519_gtFine_labelTrainIds.png
317 | leftImg8bit/val/frankfurt/frankfurt_000001_012699_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_012699_gtFine_labelTrainIds.png
318 | leftImg8bit/val/frankfurt/frankfurt_000001_012738_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_012738_gtFine_labelTrainIds.png
319 | leftImg8bit/val/frankfurt/frankfurt_000001_012870_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_012870_gtFine_labelTrainIds.png
320 | leftImg8bit/val/frankfurt/frankfurt_000001_013016_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_013016_gtFine_labelTrainIds.png
321 | leftImg8bit/val/frankfurt/frankfurt_000001_013496_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_013496_gtFine_labelTrainIds.png
322 | leftImg8bit/val/frankfurt/frankfurt_000001_013710_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_013710_gtFine_labelTrainIds.png
323 | leftImg8bit/val/frankfurt/frankfurt_000001_014221_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_014221_gtFine_labelTrainIds.png
324 | leftImg8bit/val/frankfurt/frankfurt_000001_014406_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_014406_gtFine_labelTrainIds.png
325 | leftImg8bit/val/frankfurt/frankfurt_000001_014565_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_014565_gtFine_labelTrainIds.png
326 | leftImg8bit/val/frankfurt/frankfurt_000001_014741_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_014741_gtFine_labelTrainIds.png
327 | leftImg8bit/val/frankfurt/frankfurt_000001_015091_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_015091_gtFine_labelTrainIds.png
328 | leftImg8bit/val/frankfurt/frankfurt_000001_015328_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_015328_gtFine_labelTrainIds.png
329 | leftImg8bit/val/frankfurt/frankfurt_000001_015768_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_015768_gtFine_labelTrainIds.png
330 | leftImg8bit/val/frankfurt/frankfurt_000001_016029_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_016029_gtFine_labelTrainIds.png
331 | leftImg8bit/val/frankfurt/frankfurt_000001_016273_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_016273_gtFine_labelTrainIds.png
332 | leftImg8bit/val/frankfurt/frankfurt_000001_016462_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_016462_gtFine_labelTrainIds.png
333 | leftImg8bit/val/frankfurt/frankfurt_000001_017101_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_017101_gtFine_labelTrainIds.png
334 | leftImg8bit/val/frankfurt/frankfurt_000001_017459_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_017459_gtFine_labelTrainIds.png
335 | leftImg8bit/val/frankfurt/frankfurt_000001_017842_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_017842_gtFine_labelTrainIds.png
336 | leftImg8bit/val/frankfurt/frankfurt_000001_018113_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_018113_gtFine_labelTrainIds.png
337 | leftImg8bit/val/frankfurt/frankfurt_000001_019698_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_019698_gtFine_labelTrainIds.png
338 | leftImg8bit/val/frankfurt/frankfurt_000001_019854_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_019854_gtFine_labelTrainIds.png
339 | leftImg8bit/val/frankfurt/frankfurt_000001_019969_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_019969_gtFine_labelTrainIds.png
340 | leftImg8bit/val/frankfurt/frankfurt_000001_020046_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_020046_gtFine_labelTrainIds.png
341 | leftImg8bit/val/frankfurt/frankfurt_000001_020287_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_020287_gtFine_labelTrainIds.png
342 | leftImg8bit/val/frankfurt/frankfurt_000001_020693_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_020693_gtFine_labelTrainIds.png
343 | leftImg8bit/val/frankfurt/frankfurt_000001_021406_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_021406_gtFine_labelTrainIds.png
344 | leftImg8bit/val/frankfurt/frankfurt_000001_021825_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_021825_gtFine_labelTrainIds.png
345 | leftImg8bit/val/frankfurt/frankfurt_000001_023235_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_023235_gtFine_labelTrainIds.png
346 | leftImg8bit/val/frankfurt/frankfurt_000001_023369_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_023369_gtFine_labelTrainIds.png
347 | leftImg8bit/val/frankfurt/frankfurt_000001_023769_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_023769_gtFine_labelTrainIds.png
348 | leftImg8bit/val/frankfurt/frankfurt_000001_024927_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_024927_gtFine_labelTrainIds.png
349 | leftImg8bit/val/frankfurt/frankfurt_000001_025512_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_025512_gtFine_labelTrainIds.png
350 | leftImg8bit/val/frankfurt/frankfurt_000001_025713_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_025713_gtFine_labelTrainIds.png
351 | leftImg8bit/val/frankfurt/frankfurt_000001_025921_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_025921_gtFine_labelTrainIds.png
352 | leftImg8bit/val/frankfurt/frankfurt_000001_027325_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_027325_gtFine_labelTrainIds.png
353 | leftImg8bit/val/frankfurt/frankfurt_000001_028232_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_028232_gtFine_labelTrainIds.png
354 | leftImg8bit/val/frankfurt/frankfurt_000001_028335_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_028335_gtFine_labelTrainIds.png
355 | leftImg8bit/val/frankfurt/frankfurt_000001_028590_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_028590_gtFine_labelTrainIds.png
356 | leftImg8bit/val/frankfurt/frankfurt_000001_028854_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_028854_gtFine_labelTrainIds.png
357 | leftImg8bit/val/frankfurt/frankfurt_000001_029086_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_029086_gtFine_labelTrainIds.png
358 | leftImg8bit/val/frankfurt/frankfurt_000001_029236_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_029236_gtFine_labelTrainIds.png
359 | leftImg8bit/val/frankfurt/frankfurt_000001_029600_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_029600_gtFine_labelTrainIds.png
360 | leftImg8bit/val/frankfurt/frankfurt_000001_030067_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_030067_gtFine_labelTrainIds.png
361 | leftImg8bit/val/frankfurt/frankfurt_000001_030310_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_030310_gtFine_labelTrainIds.png
362 | leftImg8bit/val/frankfurt/frankfurt_000001_030669_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_030669_gtFine_labelTrainIds.png
363 | leftImg8bit/val/frankfurt/frankfurt_000001_031266_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_031266_gtFine_labelTrainIds.png
364 | leftImg8bit/val/frankfurt/frankfurt_000001_031416_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_031416_gtFine_labelTrainIds.png
365 | leftImg8bit/val/frankfurt/frankfurt_000001_032018_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_032018_gtFine_labelTrainIds.png
366 | leftImg8bit/val/frankfurt/frankfurt_000001_032556_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_032556_gtFine_labelTrainIds.png
367 | leftImg8bit/val/frankfurt/frankfurt_000001_032711_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_032711_gtFine_labelTrainIds.png
368 | leftImg8bit/val/frankfurt/frankfurt_000001_032942_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_032942_gtFine_labelTrainIds.png
369 | leftImg8bit/val/frankfurt/frankfurt_000001_033655_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_033655_gtFine_labelTrainIds.png
370 | leftImg8bit/val/frankfurt/frankfurt_000001_034047_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_034047_gtFine_labelTrainIds.png
371 | leftImg8bit/val/frankfurt/frankfurt_000001_034816_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_034816_gtFine_labelTrainIds.png
372 | leftImg8bit/val/frankfurt/frankfurt_000001_035144_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_035144_gtFine_labelTrainIds.png
373 | leftImg8bit/val/frankfurt/frankfurt_000001_035864_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_035864_gtFine_labelTrainIds.png
374 | leftImg8bit/val/frankfurt/frankfurt_000001_037705_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_037705_gtFine_labelTrainIds.png
375 | leftImg8bit/val/frankfurt/frankfurt_000001_038245_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_038245_gtFine_labelTrainIds.png
376 | leftImg8bit/val/frankfurt/frankfurt_000001_038418_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_038418_gtFine_labelTrainIds.png
377 | leftImg8bit/val/frankfurt/frankfurt_000001_038645_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_038645_gtFine_labelTrainIds.png
378 | leftImg8bit/val/frankfurt/frankfurt_000001_038844_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_038844_gtFine_labelTrainIds.png
379 | leftImg8bit/val/frankfurt/frankfurt_000001_039895_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_039895_gtFine_labelTrainIds.png
380 | leftImg8bit/val/frankfurt/frankfurt_000001_040575_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_040575_gtFine_labelTrainIds.png
381 | leftImg8bit/val/frankfurt/frankfurt_000001_040732_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_040732_gtFine_labelTrainIds.png
382 | leftImg8bit/val/frankfurt/frankfurt_000001_041074_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_041074_gtFine_labelTrainIds.png
383 | leftImg8bit/val/frankfurt/frankfurt_000001_041354_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_041354_gtFine_labelTrainIds.png
384 | leftImg8bit/val/frankfurt/frankfurt_000001_041517_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_041517_gtFine_labelTrainIds.png
385 | leftImg8bit/val/frankfurt/frankfurt_000001_041664_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_041664_gtFine_labelTrainIds.png
386 | leftImg8bit/val/frankfurt/frankfurt_000001_042098_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_042098_gtFine_labelTrainIds.png
387 | leftImg8bit/val/frankfurt/frankfurt_000001_042384_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_042384_gtFine_labelTrainIds.png
388 | leftImg8bit/val/frankfurt/frankfurt_000001_042733_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_042733_gtFine_labelTrainIds.png
389 | leftImg8bit/val/frankfurt/frankfurt_000001_043395_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_043395_gtFine_labelTrainIds.png
390 | leftImg8bit/val/frankfurt/frankfurt_000001_043564_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_043564_gtFine_labelTrainIds.png
391 | leftImg8bit/val/frankfurt/frankfurt_000001_044227_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_044227_gtFine_labelTrainIds.png
392 | leftImg8bit/val/frankfurt/frankfurt_000001_044413_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_044413_gtFine_labelTrainIds.png
393 | leftImg8bit/val/frankfurt/frankfurt_000001_044525_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_044525_gtFine_labelTrainIds.png
394 | leftImg8bit/val/frankfurt/frankfurt_000001_044658_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_044658_gtFine_labelTrainIds.png
395 | leftImg8bit/val/frankfurt/frankfurt_000001_044787_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_044787_gtFine_labelTrainIds.png
396 | leftImg8bit/val/frankfurt/frankfurt_000001_046126_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_046126_gtFine_labelTrainIds.png
397 | leftImg8bit/val/frankfurt/frankfurt_000001_046272_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_046272_gtFine_labelTrainIds.png
398 | leftImg8bit/val/frankfurt/frankfurt_000001_046504_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_046504_gtFine_labelTrainIds.png
399 | leftImg8bit/val/frankfurt/frankfurt_000001_046779_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_046779_gtFine_labelTrainIds.png
400 | leftImg8bit/val/frankfurt/frankfurt_000001_047178_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_047178_gtFine_labelTrainIds.png
401 | leftImg8bit/val/frankfurt/frankfurt_000001_047552_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_047552_gtFine_labelTrainIds.png
402 | leftImg8bit/val/frankfurt/frankfurt_000001_048196_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_048196_gtFine_labelTrainIds.png
403 | leftImg8bit/val/frankfurt/frankfurt_000001_048355_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_048355_gtFine_labelTrainIds.png
404 | leftImg8bit/val/frankfurt/frankfurt_000001_048654_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_048654_gtFine_labelTrainIds.png
405 | leftImg8bit/val/frankfurt/frankfurt_000001_049078_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_049078_gtFine_labelTrainIds.png
406 | leftImg8bit/val/frankfurt/frankfurt_000001_049209_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_049209_gtFine_labelTrainIds.png
407 | leftImg8bit/val/frankfurt/frankfurt_000001_049298_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_049298_gtFine_labelTrainIds.png
408 | leftImg8bit/val/frankfurt/frankfurt_000001_049698_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_049698_gtFine_labelTrainIds.png
409 | leftImg8bit/val/frankfurt/frankfurt_000001_049770_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_049770_gtFine_labelTrainIds.png
410 | leftImg8bit/val/frankfurt/frankfurt_000001_050149_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_050149_gtFine_labelTrainIds.png
411 | leftImg8bit/val/frankfurt/frankfurt_000001_050686_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_050686_gtFine_labelTrainIds.png
412 | leftImg8bit/val/frankfurt/frankfurt_000001_051516_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_051516_gtFine_labelTrainIds.png
413 | leftImg8bit/val/frankfurt/frankfurt_000001_051737_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_051737_gtFine_labelTrainIds.png
414 | leftImg8bit/val/frankfurt/frankfurt_000001_051807_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_051807_gtFine_labelTrainIds.png
415 | leftImg8bit/val/frankfurt/frankfurt_000001_052120_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_052120_gtFine_labelTrainIds.png
416 | leftImg8bit/val/frankfurt/frankfurt_000001_052594_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_052594_gtFine_labelTrainIds.png
417 | leftImg8bit/val/frankfurt/frankfurt_000001_053102_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_053102_gtFine_labelTrainIds.png
418 | leftImg8bit/val/frankfurt/frankfurt_000001_054077_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_054077_gtFine_labelTrainIds.png
419 | leftImg8bit/val/frankfurt/frankfurt_000001_054219_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_054219_gtFine_labelTrainIds.png
420 | leftImg8bit/val/frankfurt/frankfurt_000001_054415_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_054415_gtFine_labelTrainIds.png
421 | leftImg8bit/val/frankfurt/frankfurt_000001_054640_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_054640_gtFine_labelTrainIds.png
422 | leftImg8bit/val/frankfurt/frankfurt_000001_054884_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_054884_gtFine_labelTrainIds.png
423 | leftImg8bit/val/frankfurt/frankfurt_000001_055062_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055062_gtFine_labelTrainIds.png
424 | leftImg8bit/val/frankfurt/frankfurt_000001_055172_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055172_gtFine_labelTrainIds.png
425 | leftImg8bit/val/frankfurt/frankfurt_000001_055306_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055306_gtFine_labelTrainIds.png
426 | leftImg8bit/val/frankfurt/frankfurt_000001_055387_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055387_gtFine_labelTrainIds.png
427 | leftImg8bit/val/frankfurt/frankfurt_000001_055538_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055538_gtFine_labelTrainIds.png
428 | leftImg8bit/val/frankfurt/frankfurt_000001_055603_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055603_gtFine_labelTrainIds.png
429 | leftImg8bit/val/frankfurt/frankfurt_000001_055709_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_055709_gtFine_labelTrainIds.png
430 | leftImg8bit/val/frankfurt/frankfurt_000001_056580_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_056580_gtFine_labelTrainIds.png
431 | leftImg8bit/val/frankfurt/frankfurt_000001_057181_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_057181_gtFine_labelTrainIds.png
432 | leftImg8bit/val/frankfurt/frankfurt_000001_057478_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_057478_gtFine_labelTrainIds.png
433 | leftImg8bit/val/frankfurt/frankfurt_000001_057954_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_057954_gtFine_labelTrainIds.png
434 | leftImg8bit/val/frankfurt/frankfurt_000001_058057_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_058057_gtFine_labelTrainIds.png
435 | leftImg8bit/val/frankfurt/frankfurt_000001_058176_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_058176_gtFine_labelTrainIds.png
436 | leftImg8bit/val/frankfurt/frankfurt_000001_058504_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_058504_gtFine_labelTrainIds.png
437 | leftImg8bit/val/frankfurt/frankfurt_000001_058914_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_058914_gtFine_labelTrainIds.png
438 | leftImg8bit/val/frankfurt/frankfurt_000001_059119_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_059119_gtFine_labelTrainIds.png
439 | leftImg8bit/val/frankfurt/frankfurt_000001_059642_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_059642_gtFine_labelTrainIds.png
440 | leftImg8bit/val/frankfurt/frankfurt_000001_059789_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_059789_gtFine_labelTrainIds.png
441 | leftImg8bit/val/frankfurt/frankfurt_000001_060135_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_060135_gtFine_labelTrainIds.png
442 | leftImg8bit/val/frankfurt/frankfurt_000001_060422_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_060422_gtFine_labelTrainIds.png
443 | leftImg8bit/val/frankfurt/frankfurt_000001_060545_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_060545_gtFine_labelTrainIds.png
444 | leftImg8bit/val/frankfurt/frankfurt_000001_060906_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_060906_gtFine_labelTrainIds.png
445 | leftImg8bit/val/frankfurt/frankfurt_000001_061682_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_061682_gtFine_labelTrainIds.png
446 | leftImg8bit/val/frankfurt/frankfurt_000001_061763_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_061763_gtFine_labelTrainIds.png
447 | leftImg8bit/val/frankfurt/frankfurt_000001_062016_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_062016_gtFine_labelTrainIds.png
448 | leftImg8bit/val/frankfurt/frankfurt_000001_062250_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_062250_gtFine_labelTrainIds.png
449 | leftImg8bit/val/frankfurt/frankfurt_000001_062396_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_062396_gtFine_labelTrainIds.png
450 | leftImg8bit/val/frankfurt/frankfurt_000001_062509_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_062509_gtFine_labelTrainIds.png
451 | leftImg8bit/val/frankfurt/frankfurt_000001_062653_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_062653_gtFine_labelTrainIds.png
452 | leftImg8bit/val/frankfurt/frankfurt_000001_062793_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_062793_gtFine_labelTrainIds.png
453 | leftImg8bit/val/frankfurt/frankfurt_000001_063045_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_063045_gtFine_labelTrainIds.png
454 | leftImg8bit/val/frankfurt/frankfurt_000001_064130_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_064130_gtFine_labelTrainIds.png
455 | leftImg8bit/val/frankfurt/frankfurt_000001_064305_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_064305_gtFine_labelTrainIds.png
456 | leftImg8bit/val/frankfurt/frankfurt_000001_064651_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_064651_gtFine_labelTrainIds.png
457 | leftImg8bit/val/frankfurt/frankfurt_000001_064798_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_064798_gtFine_labelTrainIds.png
458 | leftImg8bit/val/frankfurt/frankfurt_000001_064925_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_064925_gtFine_labelTrainIds.png
459 | leftImg8bit/val/frankfurt/frankfurt_000001_065160_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_065160_gtFine_labelTrainIds.png
460 | leftImg8bit/val/frankfurt/frankfurt_000001_065617_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_065617_gtFine_labelTrainIds.png
461 | leftImg8bit/val/frankfurt/frankfurt_000001_065850_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_065850_gtFine_labelTrainIds.png
462 | leftImg8bit/val/frankfurt/frankfurt_000001_066092_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_066092_gtFine_labelTrainIds.png
463 | leftImg8bit/val/frankfurt/frankfurt_000001_066438_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_066438_gtFine_labelTrainIds.png
464 | leftImg8bit/val/frankfurt/frankfurt_000001_066574_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_066574_gtFine_labelTrainIds.png
465 | leftImg8bit/val/frankfurt/frankfurt_000001_066832_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_066832_gtFine_labelTrainIds.png
466 | leftImg8bit/val/frankfurt/frankfurt_000001_067092_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_067092_gtFine_labelTrainIds.png
467 | leftImg8bit/val/frankfurt/frankfurt_000001_067178_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_067178_gtFine_labelTrainIds.png
468 | leftImg8bit/val/frankfurt/frankfurt_000001_067295_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_067295_gtFine_labelTrainIds.png
469 | leftImg8bit/val/frankfurt/frankfurt_000001_067474_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_067474_gtFine_labelTrainIds.png
470 | leftImg8bit/val/frankfurt/frankfurt_000001_067735_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_067735_gtFine_labelTrainIds.png
471 | leftImg8bit/val/frankfurt/frankfurt_000001_068063_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_068063_gtFine_labelTrainIds.png
472 | leftImg8bit/val/frankfurt/frankfurt_000001_068208_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_068208_gtFine_labelTrainIds.png
473 | leftImg8bit/val/frankfurt/frankfurt_000001_068682_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_068682_gtFine_labelTrainIds.png
474 | leftImg8bit/val/frankfurt/frankfurt_000001_068772_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_068772_gtFine_labelTrainIds.png
475 | leftImg8bit/val/frankfurt/frankfurt_000001_069633_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_069633_gtFine_labelTrainIds.png
476 | leftImg8bit/val/frankfurt/frankfurt_000001_070099_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_070099_gtFine_labelTrainIds.png
477 | leftImg8bit/val/frankfurt/frankfurt_000001_071288_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_071288_gtFine_labelTrainIds.png
478 | leftImg8bit/val/frankfurt/frankfurt_000001_071781_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_071781_gtFine_labelTrainIds.png
479 | leftImg8bit/val/frankfurt/frankfurt_000001_072155_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_072155_gtFine_labelTrainIds.png
480 | leftImg8bit/val/frankfurt/frankfurt_000001_072295_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_072295_gtFine_labelTrainIds.png
481 | leftImg8bit/val/frankfurt/frankfurt_000001_073088_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_073088_gtFine_labelTrainIds.png
482 | leftImg8bit/val/frankfurt/frankfurt_000001_073243_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_073243_gtFine_labelTrainIds.png
483 | leftImg8bit/val/frankfurt/frankfurt_000001_073464_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_073464_gtFine_labelTrainIds.png
484 | leftImg8bit/val/frankfurt/frankfurt_000001_073911_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_073911_gtFine_labelTrainIds.png
485 | leftImg8bit/val/frankfurt/frankfurt_000001_075296_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_075296_gtFine_labelTrainIds.png
486 | leftImg8bit/val/frankfurt/frankfurt_000001_075984_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_075984_gtFine_labelTrainIds.png
487 | leftImg8bit/val/frankfurt/frankfurt_000001_076502_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_076502_gtFine_labelTrainIds.png
488 | leftImg8bit/val/frankfurt/frankfurt_000001_077092_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_077092_gtFine_labelTrainIds.png
489 | leftImg8bit/val/frankfurt/frankfurt_000001_077233_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_077233_gtFine_labelTrainIds.png
490 | leftImg8bit/val/frankfurt/frankfurt_000001_077434_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_077434_gtFine_labelTrainIds.png
491 | leftImg8bit/val/frankfurt/frankfurt_000001_078803_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_078803_gtFine_labelTrainIds.png
492 | leftImg8bit/val/frankfurt/frankfurt_000001_079206_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_079206_gtFine_labelTrainIds.png
493 | leftImg8bit/val/frankfurt/frankfurt_000001_080091_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_080091_gtFine_labelTrainIds.png
494 | leftImg8bit/val/frankfurt/frankfurt_000001_080391_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_080391_gtFine_labelTrainIds.png
495 | leftImg8bit/val/frankfurt/frankfurt_000001_080830_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_080830_gtFine_labelTrainIds.png
496 | leftImg8bit/val/frankfurt/frankfurt_000001_082087_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_082087_gtFine_labelTrainIds.png
497 | leftImg8bit/val/frankfurt/frankfurt_000001_082466_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_082466_gtFine_labelTrainIds.png
498 | leftImg8bit/val/frankfurt/frankfurt_000001_083029_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_083029_gtFine_labelTrainIds.png
499 | leftImg8bit/val/frankfurt/frankfurt_000001_083199_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_083199_gtFine_labelTrainIds.png
500 | leftImg8bit/val/frankfurt/frankfurt_000001_083852_leftImg8bit.png gtFine/val/frankfurt/frankfurt_000001_083852_gtFine_labelTrainIds.png
501 |
--------------------------------------------------------------------------------
/data/output/my_own_image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/output/my_own_image.png
--------------------------------------------------------------------------------
/data/output/vis_im1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/output/vis_im1.png
--------------------------------------------------------------------------------
/data/output/vis_im2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/data/output/vis_im2.png
--------------------------------------------------------------------------------
/evaluate.py:
--------------------------------------------------------------------------------
1 | import argparse
2 | import time
3 |
4 | import tensorflow as tf
5 | import numpy as np
6 | from tqdm import trange
7 |
8 | from utils.config import Config
9 | from utils.image_reader import ImageReader
10 | from model import ICNet, ICNet_BN
11 |
12 | # mapping different model
13 | model_config = {'train': ICNet, 'trainval': ICNet, 'train_bn': ICNet_BN, 'trainval_bn': ICNet_BN, 'others': ICNet_BN}
14 |
15 | def get_arguments():
16 | parser = argparse.ArgumentParser(description="Reproduced ICNet")
17 |
18 | parser.add_argument("--model", type=str, default='',
19 | help="Model to use.",
20 | choices=['train', 'trainval', 'train_bn', 'trainval_bn', 'others'],
21 | required=True)
22 | parser.add_argument("--dataset", type=str, default='',
23 | choices=['ade20k', 'cityscapes'],
24 | required=True)
25 | parser.add_argument("--filter-scale", type=int, default=1,
26 | help="1 for using pruned model, while 2 for using non-pruned model.",
27 | choices=[1, 2])
28 |
29 | return parser.parse_args()
30 |
31 | def main():
32 | args = get_arguments()
33 | cfg = Config(dataset=args.dataset, is_training=False, filter_scale=args.filter_scale)
34 |
35 | model = model_config[args.model]
36 |
37 | reader = ImageReader(cfg=cfg, mode='eval')
38 | net = model(image_reader=reader, cfg=cfg, mode='eval')
39 |
40 | # mIoU
41 | pred_flatten = tf.reshape(net.output, [-1,])
42 | label_flatten = tf.reshape(net.labels, [-1,])
43 |
44 | mask = tf.not_equal(label_flatten, cfg.param['ignore_label'])
45 | indices = tf.squeeze(tf.where(mask), 1)
46 | gt = tf.cast(tf.gather(label_flatten, indices), tf.int32)
47 | pred = tf.gather(pred_flatten, indices)
48 |
49 | if cfg.dataset == 'ade20k':
50 | pred = tf.add(pred, tf.constant(1, dtype=tf.int64))
51 | mIoU, update_op = tf.metrics.mean_iou(predictions=pred, labels=gt, num_classes=cfg.param['num_classes']+1)
52 | elif cfg.dataset == 'cityscapes':
53 | mIoU, update_op = tf.metrics.mean_iou(predictions=pred, labels=gt, num_classes=cfg.param['num_classes'])
54 |
55 | net.create_session()
56 | net.restore(cfg.model_paths[args.model])
57 |
58 | for i in trange(cfg.param['eval_steps'], desc='evaluation', leave=True):
59 | _ = net.sess.run(update_op)
60 |
61 | print('mIoU: {}'.format(net.sess.run(mIoU)))
62 |
63 | if __name__ == '__main__':
64 | main()
65 |
--------------------------------------------------------------------------------
/model.py:
--------------------------------------------------------------------------------
1 | import tensorflow as tf
2 | from network import Network
3 | from utils.image_reader import _infer_preprocess
4 | from utils.visualize import decode_labels
5 |
6 | class ICNet(Network):
7 | def __init__(self, cfg, mode, image_reader=None):
8 | self.cfg = cfg
9 | self.mode = mode
10 |
11 | if mode == 'train':
12 | self.images, self.labels = image_reader.next_image, image_reader.next_label
13 |
14 | super().__init__(inputs={'data': self.images}, cfg=self.cfg)
15 |
16 | elif mode == 'eval':
17 | self.images, self.labels = image_reader.next_image, image_reader.next_label
18 |
19 | super().__init__(inputs={'data': self.images}, cfg=self.cfg)
20 |
21 | self.output = self.get_output_node()
22 |
23 | elif mode == 'inference':
24 | # Create placeholder and pre-process here.
25 | self.img_placeholder = tf.placeholder(dtype=tf.float32, shape=cfg.INFER_SIZE)
26 | self.images, self.o_shape, self.n_shape = _infer_preprocess(self.img_placeholder)
27 |
28 | super().__init__(inputs={'data': self.images}, cfg=self.cfg)
29 |
30 | self.output = self.get_output_node()
31 |
32 | def get_output_node(self):
33 | if self.mode == 'inference':
34 | # Get logits from final layer
35 | logits = self.layers['conv6_cls']
36 |
37 | # Upscale the logits and decode prediction to get final result.
38 | logits_up = tf.image.resize_bilinear(logits, size=self.n_shape, align_corners=True)
39 | logits_up = tf.image.crop_to_bounding_box(logits_up, 0, 0, self.o_shape[0], self.o_shape[1])
40 |
41 | output_classes = tf.argmax(logits_up, axis=3)
42 | output = decode_labels(output_classes, self.o_shape, self.cfg.param['num_classes'])
43 |
44 | elif self.mode == 'eval':
45 | logits = self.layers['conv6_cls']
46 |
47 | logits_up = tf.image.resize_bilinear(logits, size=tf.shape(self.labels)[1:3], align_corners=True)
48 | output = tf.argmax(logits_up, axis=3)
49 | output = tf.expand_dims(output, axis=3)
50 |
51 | return output
52 |
53 | def predict(self, image):
54 | return self.sess.run(self.output, feed_dict={self.img_placeholder: image})
55 |
56 | def setup(self):
57 | (self.feed('data')
58 | .interp(s_factor=0.5, name='data_sub2')
59 | .conv(3, 3, 32, 2, 2, biased=True, padding='SAME', relu=True, name='conv1_1_3x3_s2')
60 | .conv(3, 3, 32, 1, 1, biased=True, padding='SAME', relu=True, name='conv1_2_3x3')
61 | .conv(3, 3, 64, 1, 1, biased=True, padding='SAME', relu=True, name='conv1_3_3x3')
62 | .zero_padding(paddings=1, name='padding0')
63 | .max_pool(3, 3, 2, 2, name='pool1_3x3_s2')
64 | .conv(1, 1, 128, 1, 1, biased=True, relu=False, name='conv2_1_1x1_proj'))
65 |
66 | (self.feed('pool1_3x3_s2')
67 | .conv(1, 1, 32, 1, 1, biased=True, relu=True, name='conv2_1_1x1_reduce')
68 | .zero_padding(paddings=1, name='padding1')
69 | .conv(3, 3, 32, 1, 1, biased=True, relu=True, name='conv2_1_3x3')
70 | .conv(1, 1, 128, 1, 1, biased=True, relu=False, name='conv2_1_1x1_increase'))
71 |
72 | (self.feed('conv2_1_1x1_proj',
73 | 'conv2_1_1x1_increase')
74 | .add(name='conv2_1')
75 | .relu(name='conv2_1/relu')
76 | .conv(1, 1, 32, 1, 1, biased=True, relu=True, name='conv2_2_1x1_reduce')
77 | .zero_padding(paddings=1, name='padding2')
78 | .conv(3, 3, 32, 1, 1, biased=True, relu=True, name='conv2_2_3x3')
79 | .conv(1, 1, 128, 1, 1, biased=True, relu=False, name='conv2_2_1x1_increase'))
80 |
81 | (self.feed('conv2_1/relu',
82 | 'conv2_2_1x1_increase')
83 | .add(name='conv2_2')
84 | .relu(name='conv2_2/relu')
85 | .conv(1, 1, 32, 1, 1, biased=True, relu=True, name='conv2_3_1x1_reduce')
86 | .zero_padding(paddings=1, name='padding3')
87 | .conv(3, 3, 32, 1, 1, biased=True, relu=True, name='conv2_3_3x3')
88 | .conv(1, 1, 128, 1, 1, biased=True, relu=False, name='conv2_3_1x1_increase'))
89 |
90 | (self.feed('conv2_2/relu',
91 | 'conv2_3_1x1_increase')
92 | .add(name='conv2_3')
93 | .relu(name='conv2_3/relu')
94 | .conv(1, 1, 256, 2, 2, biased=True, relu=False, name='conv3_1_1x1_proj'))
95 |
96 | (self.feed('conv2_3/relu')
97 | .conv(1, 1, 64, 2, 2, biased=True, relu=True, name='conv3_1_1x1_reduce')
98 | .zero_padding(paddings=1, name='padding4')
99 | .conv(3, 3, 64, 1, 1, biased=True, relu=True, name='conv3_1_3x3')
100 | .conv(1, 1, 256, 1, 1, biased=True, relu=False, name='conv3_1_1x1_increase'))
101 |
102 | (self.feed('conv3_1_1x1_proj',
103 | 'conv3_1_1x1_increase')
104 | .add(name='conv3_1')
105 | .relu(name='conv3_1/relu')
106 | .interp(s_factor=0.5, name='conv3_1_sub4')
107 | .conv(1, 1, 64, 1, 1, biased=True, relu=True, name='conv3_2_1x1_reduce')
108 | .zero_padding(paddings=1, name='padding5')
109 | .conv(3, 3, 64, 1, 1, biased=True, relu=True, name='conv3_2_3x3')
110 | .conv(1, 1, 256, 1, 1, biased=True, relu=False, name='conv3_2_1x1_increase'))
111 |
112 | (self.feed('conv3_1_sub4',
113 | 'conv3_2_1x1_increase')
114 | .add(name='conv3_2')
115 | .relu(name='conv3_2/relu')
116 | .conv(1, 1, 64, 1, 1, biased=True, relu=True, name='conv3_3_1x1_reduce')
117 | .zero_padding(paddings=1, name='padding6')
118 | .conv(3, 3, 64, 1, 1, biased=True, relu=True, name='conv3_3_3x3')
119 | .conv(1, 1, 256, 1, 1, biased=True, relu=False, name='conv3_3_1x1_increase'))
120 |
121 | (self.feed('conv3_2/relu',
122 | 'conv3_3_1x1_increase')
123 | .add(name='conv3_3')
124 | .relu(name='conv3_3/relu')
125 | .conv(1, 1, 64, 1, 1, biased=True, relu=True, name='conv3_4_1x1_reduce')
126 | .zero_padding(paddings=1, name='padding7')
127 | .conv(3, 3, 64, 1, 1, biased=True, relu=True, name='conv3_4_3x3')
128 | .conv(1, 1, 256, 1, 1, biased=True, relu=False, name='conv3_4_1x1_increase'))
129 |
130 | (self.feed('conv3_3/relu',
131 | 'conv3_4_1x1_increase')
132 | .add(name='conv3_4')
133 | .relu(name='conv3_4/relu')
134 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_1_1x1_proj'))
135 |
136 | (self.feed('conv3_4/relu')
137 | .conv(1, 1, 128, 1, 1, biased=True, relu=True, name='conv4_1_1x1_reduce')
138 | .zero_padding(paddings=2, name='padding8')
139 | .atrous_conv(3, 3, 128, 2, biased=True, relu=True, name='conv4_1_3x3')
140 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_1_1x1_increase'))
141 |
142 | (self.feed('conv4_1_1x1_proj',
143 | 'conv4_1_1x1_increase')
144 | .add(name='conv4_1')
145 | .relu(name='conv4_1/relu')
146 | .conv(1, 1, 128, 1, 1, biased=True, relu=True, name='conv4_2_1x1_reduce')
147 | .zero_padding(paddings=2, name='padding9')
148 | .atrous_conv(3, 3, 128, 2, biased=True, relu=True, name='conv4_2_3x3')
149 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_2_1x1_increase'))
150 |
151 | (self.feed('conv4_1/relu',
152 | 'conv4_2_1x1_increase')
153 | .add(name='conv4_2')
154 | .relu(name='conv4_2/relu')
155 | .conv(1, 1, 128, 1, 1, biased=True, relu=True, name='conv4_3_1x1_reduce')
156 | .zero_padding(paddings=2, name='padding10')
157 | .atrous_conv(3, 3, 128, 2, biased=True, relu=True, name='conv4_3_3x3')
158 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_3_1x1_increase'))
159 |
160 | (self.feed('conv4_2/relu',
161 | 'conv4_3_1x1_increase')
162 | .add(name='conv4_3')
163 | .relu(name='conv4_3/relu')
164 | .conv(1, 1, 128, 1, 1, biased=True, relu=True, name='conv4_4_1x1_reduce')
165 | .zero_padding(paddings=2, name='padding11')
166 | .atrous_conv(3, 3, 128, 2, biased=True, relu=True, name='conv4_4_3x3')
167 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_4_1x1_increase'))
168 |
169 | (self.feed('conv4_3/relu',
170 | 'conv4_4_1x1_increase')
171 | .add(name='conv4_4')
172 | .relu(name='conv4_4/relu')
173 | .conv(1, 1, 128, 1, 1, biased=True, relu=True, name='conv4_5_1x1_reduce')
174 | .zero_padding(paddings=2, name='padding12')
175 | .atrous_conv(3, 3, 128, 2, biased=True, relu=True, name='conv4_5_3x3')
176 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_5_1x1_increase'))
177 |
178 | (self.feed('conv4_4/relu',
179 | 'conv4_5_1x1_increase')
180 | .add(name='conv4_5')
181 | .relu(name='conv4_5/relu')
182 | .conv(1, 1, 128, 1, 1, biased=True, relu=True, name='conv4_6_1x1_reduce')
183 | .zero_padding(paddings=2, name='padding13')
184 | .atrous_conv(3, 3, 128, 2, biased=True, relu=True, name='conv4_6_3x3')
185 | .conv(1, 1, 512, 1, 1, biased=True, relu=False, name='conv4_6_1x1_increase'))
186 |
187 | (self.feed('conv4_5/relu',
188 | 'conv4_6_1x1_increase')
189 | .add(name='conv4_6')
190 | .relu(name='conv4_6/relu')
191 | .conv(1, 1, 1024, 1, 1, biased=True, relu=False, name='conv5_1_1x1_proj'))
192 |
193 | (self.feed('conv4_6/relu')
194 | .conv(1, 1, 256, 1, 1, biased=True, relu=True, name='conv5_1_1x1_reduce')
195 | .zero_padding(paddings=4, name='padding14')
196 | .atrous_conv(3, 3, 256, 4, biased=True, relu=True, name='conv5_1_3x3')
197 | .conv(1, 1, 1024, 1, 1, biased=True, relu=False, name='conv5_1_1x1_increase'))
198 |
199 | (self.feed('conv5_1_1x1_proj',
200 | 'conv5_1_1x1_increase')
201 | .add(name='conv5_1')
202 | .relu(name='conv5_1/relu')
203 | .conv(1, 1, 256, 1, 1, biased=True, relu=True, name='conv5_2_1x1_reduce')
204 | .zero_padding(paddings=4, name='padding15')
205 | .atrous_conv(3, 3, 256, 4, biased=True, relu=True, name='conv5_2_3x3')
206 | .conv(1, 1, 1024, 1, 1, biased=True, relu=False, name='conv5_2_1x1_increase'))
207 |
208 | (self.feed('conv5_1/relu',
209 | 'conv5_2_1x1_increase')
210 | .add(name='conv5_2')
211 | .relu(name='conv5_2/relu')
212 | .conv(1, 1, 256, 1, 1, biased=True, relu=True, name='conv5_3_1x1_reduce')
213 | .zero_padding(paddings=4, name='padding16')
214 | .atrous_conv(3, 3, 256, 4, biased=True, relu=True, name='conv5_3_3x3')
215 | .conv(1, 1, 1024, 1, 1, biased=True, relu=False, name='conv5_3_1x1_increase'))
216 |
217 | (self.feed('conv5_2/relu',
218 | 'conv5_3_1x1_increase')
219 | .add(name='conv5_3')
220 | .relu(name='conv5_3/relu'))
221 |
222 | shape = self.layers['conv5_3/relu'].get_shape().as_list()[1:3]
223 | h, w = shape
224 |
225 | if self.mode == 'eval' and self.cfg.dataset == 'cityscapes': # Change to same configuration as original prototxt
226 | (self.feed('conv5_3/relu')
227 | .avg_pool(33, 65, 33, 65, name='conv5_3_pool1')
228 | .resize_bilinear(shape, name='conv5_3_pool1_interp'))
229 |
230 | (self.feed('conv5_3/relu')
231 | .avg_pool(17, 33, 16, 32, name='conv5_3_pool2')
232 | .resize_bilinear(shape, name='conv5_3_pool2_interp'))
233 |
234 | (self.feed('conv5_3/relu')
235 | .avg_pool(13, 25, 10, 20, name='conv5_3_pool3')
236 | .resize_bilinear(shape, name='conv5_3_pool3_interp'))
237 |
238 | (self.feed('conv5_3/relu')
239 | .avg_pool(8, 15, 5, 10, name='conv5_3_pool6')
240 | .resize_bilinear(shape, name='conv5_3_pool6_interp'))
241 | else: # In inference phase, we support different size of images as input.
242 | (self.feed('conv5_3/relu')
243 | .avg_pool(h, w, h, w, name='conv5_3_pool1')
244 | .resize_bilinear(shape, name='conv5_3_pool1_interp'))
245 |
246 | (self.feed('conv5_3/relu')
247 | .avg_pool(h/2, w/2, h/2, w/2, name='conv5_3_pool2')
248 | .resize_bilinear(shape, name='conv5_3_pool2_interp'))
249 |
250 | (self.feed('conv5_3/relu')
251 | .avg_pool(h/3, w/3, h/3, w/3, name='conv5_3_pool3')
252 | .resize_bilinear(shape, name='conv5_3_pool3_interp'))
253 |
254 | (self.feed('conv5_3/relu')
255 | .avg_pool(h/6, w/6, h/6, w/6, name='conv5_3_pool6')
256 | .resize_bilinear(shape, name='conv5_3_pool6_interp'))
257 |
258 | (self.feed('conv5_3/relu',
259 | 'conv5_3_pool6_interp',
260 | 'conv5_3_pool3_interp',
261 | 'conv5_3_pool2_interp',
262 | 'conv5_3_pool1_interp')
263 | .add(name='conv5_3_sum')
264 | .conv(1, 1, 256, 1, 1, biased=True, relu=True, name='conv5_4_k1')
265 | .interp(z_factor=2.0, name='conv5_4_interp')
266 | .zero_padding(paddings=2, name='padding17')
267 | .atrous_conv(3, 3, 128, 2, biased=True, relu=False, name='conv_sub4'))
268 |
269 | (self.feed('conv3_1/relu')
270 | .conv(1, 1, 128, 1, 1, biased=True, relu=False, name='conv3_1_sub2_proj'))
271 |
272 | (self.feed('conv_sub4',
273 | 'conv3_1_sub2_proj')
274 | .add(name='sub24_sum')
275 | .relu(name='sub24_sum/relu')
276 | .interp(z_factor=2.0, name='sub24_sum_interp')
277 | .zero_padding(paddings=2, name='padding18')
278 | .atrous_conv(3, 3, 128, 2, biased=True, relu=False, name='conv_sub2'))
279 |
280 | (self.feed('data')
281 | .conv(3, 3, 32, 2, 2, biased=True, padding='SAME', relu=True, name='conv1_sub1')
282 | .conv(3, 3, 32, 2, 2, biased=True, padding='SAME', relu=True, name='conv2_sub1')
283 | .conv(3, 3, 64, 2, 2, biased=True, padding='SAME', relu=True, name='conv3_sub1')
284 | .conv(1, 1, 128, 1, 1, biased=True, relu=False, name='conv3_sub1_proj'))
285 |
286 | (self.feed('conv_sub2',
287 | 'conv3_sub1_proj')
288 | .add(name='sub12_sum')
289 | .relu(name='sub12_sum/relu')
290 | .interp(z_factor=2.0, name='sub12_sum_interp')
291 | .conv(1, 1, self.cfg.param['num_classes'], 1, 1, biased=True, relu=False, name='conv6_cls'))
292 |
293 |
294 | class ICNet_BN(Network):
295 | def __init__(self, cfg, mode, image_reader=None):
296 | self.cfg = cfg
297 | self.mode = mode
298 |
299 | if mode == 'train':
300 | self.images, self.labels = image_reader.next_image, image_reader.next_label
301 |
302 | super().__init__(inputs={'data': self.images}, cfg=self.cfg)
303 |
304 | elif mode == 'eval':
305 | self.images, self.labels = image_reader.next_image, image_reader.next_label
306 |
307 | super().__init__(inputs={'data': self.images}, cfg=self.cfg)
308 |
309 | self.output = self.get_output_node()
310 |
311 | elif mode == 'inference':
312 | # Create placeholder and pre-process here.
313 | self.img_placeholder = tf.placeholder(dtype=tf.float32, shape=cfg.INFER_SIZE)
314 | self.images, self.o_shape, self.n_shape = _infer_preprocess(self.img_placeholder)
315 |
316 | super().__init__(inputs={'data': self.images}, cfg=self.cfg)
317 |
318 | self.output = self.get_output_node()
319 |
320 | def get_output_node(self):
321 | if self.mode == 'inference':
322 | # Get logits from final layer
323 | logits = self.layers['conv6_cls']
324 |
325 | # Upscale the logits and decode prediction to get final result.
326 | logits_up = tf.image.resize_bilinear(logits, size=self.n_shape, align_corners=True)
327 | logits_up = tf.image.crop_to_bounding_box(logits_up, 0, 0, self.o_shape[0], self.o_shape[1])
328 |
329 | output_classes = tf.argmax(logits_up, axis=3)
330 | output = decode_labels(output_classes, self.o_shape, self.cfg.param['num_classes'])
331 |
332 | elif self.mode == 'eval':
333 | logits = self.layers['conv6_cls']
334 |
335 | logits_up = tf.image.resize_bilinear(logits, size=tf.shape(self.labels)[1:3], align_corners=True)
336 | output = tf.argmax(logits_up, axis=3)
337 | output = tf.expand_dims(output, axis=3)
338 |
339 | return output
340 |
341 | def predict(self, image):
342 | return self.sess.run(self.output, feed_dict={self.img_placeholder: image})
343 |
344 | def setup(self):
345 | (self.feed('data')
346 | .interp(s_factor=0.5, name='data_sub2')
347 | .conv(3, 3, 32, 2, 2, biased=False, padding='SAME', relu=False, name='conv1_1_3x3_s2')
348 | .batch_normalization(relu=True, name='conv1_1_3x3_s2_bn')
349 | .conv(3, 3, 32, 1, 1, biased=False, padding='SAME', relu=False, name='conv1_2_3x3')
350 | .batch_normalization(relu=True, name='conv1_2_3x3_bn')
351 | .conv(3, 3, 64, 1, 1, biased=False, padding='SAME', relu=False, name='conv1_3_3x3')
352 | .batch_normalization(relu=True, name='conv1_3_3x3_bn')
353 | .zero_padding(paddings=1, name='padding0')
354 | .max_pool(3, 3, 2, 2, name='pool1_3x3_s2')
355 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv2_1_1x1_proj')
356 | .batch_normalization(relu=False, name='conv2_1_1x1_proj_bn'))
357 |
358 | (self.feed('pool1_3x3_s2')
359 | .conv(1, 1, 32, 1, 1, biased=False, relu=False, name='conv2_1_1x1_reduce')
360 | .batch_normalization(relu=True, name='conv2_1_1x1_reduce_bn')
361 | .zero_padding(paddings=1, name='padding1')
362 | .conv(3, 3, 32, 1, 1, biased=False, relu=False, name='conv2_1_3x3')
363 | .batch_normalization(relu=True, name='conv2_1_3x3_bn')
364 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv2_1_1x1_increase')
365 | .batch_normalization(relu=False, name='conv2_1_1x1_increase_bn'))
366 |
367 | (self.feed('conv2_1_1x1_proj_bn',
368 | 'conv2_1_1x1_increase_bn')
369 | .add(name='conv2_1')
370 | .relu(name='conv2_1/relu')
371 | .conv(1, 1, 32, 1, 1, biased=False, relu=False, name='conv2_2_1x1_reduce')
372 | .batch_normalization(relu=True, name='conv2_2_1x1_reduce_bn')
373 | .zero_padding(paddings=1, name='padding2')
374 | .conv(3, 3, 32, 1, 1, biased=False, relu=False, name='conv2_2_3x3')
375 | .batch_normalization(relu=True, name='conv2_2_3x3_bn')
376 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv2_2_1x1_increase')
377 | .batch_normalization(relu=False, name='conv2_2_1x1_increase_bn'))
378 |
379 | (self.feed('conv2_1/relu',
380 | 'conv2_2_1x1_increase_bn')
381 | .add(name='conv2_2')
382 | .relu(name='conv2_2/relu')
383 | .conv(1, 1, 32, 1, 1, biased=False, relu=False, name='conv2_3_1x1_reduce')
384 | .batch_normalization(relu=True, name='conv2_3_1x1_reduce_bn')
385 | .zero_padding(paddings=1, name='padding3')
386 | .conv(3, 3, 32, 1, 1, biased=False, relu=False, name='conv2_3_3x3')
387 | .batch_normalization(relu=True, name='conv2_3_3x3_bn')
388 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv2_3_1x1_increase')
389 | .batch_normalization(relu=False, name='conv2_3_1x1_increase_bn'))
390 |
391 | (self.feed('conv2_2/relu',
392 | 'conv2_3_1x1_increase_bn')
393 | .add(name='conv2_3')
394 | .relu(name='conv2_3/relu')
395 | .conv(1, 1, 256, 2, 2, biased=False, relu=False, name='conv3_1_1x1_proj')
396 | .batch_normalization(relu=False, name='conv3_1_1x1_proj_bn'))
397 |
398 | (self.feed('conv2_3/relu')
399 | .conv(1, 1, 64, 2, 2, biased=False, relu=False, name='conv3_1_1x1_reduce')
400 | .batch_normalization(relu=True, name='conv3_1_1x1_reduce_bn')
401 | .zero_padding(paddings=1, name='padding4')
402 | .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='conv3_1_3x3')
403 | .batch_normalization(relu=True, name='conv3_1_3x3_bn')
404 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv3_1_1x1_increase')
405 | .batch_normalization(relu=False, name='conv3_1_1x1_increase_bn'))
406 |
407 | (self.feed('conv3_1_1x1_proj_bn',
408 | 'conv3_1_1x1_increase_bn')
409 | .add(name='conv3_1')
410 | .relu(name='conv3_1/relu')
411 | .interp(s_factor=0.5, name='conv3_1_sub4')
412 | .conv(1, 1, 64, 1, 1, biased=False, relu=False, name='conv3_2_1x1_reduce')
413 | .batch_normalization(relu=True, name='conv3_2_1x1_reduce_bn')
414 | .zero_padding(paddings=1, name='padding5')
415 | .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='conv3_2_3x3')
416 | .batch_normalization(relu=True, name='conv3_2_3x3_bn')
417 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv3_2_1x1_increase')
418 | .batch_normalization(relu=False, name='conv3_2_1x1_increase_bn'))
419 |
420 | (self.feed('conv3_1_sub4',
421 | 'conv3_2_1x1_increase_bn')
422 | .add(name='conv3_2')
423 | .relu(name='conv3_2/relu')
424 | .conv(1, 1, 64, 1, 1, biased=False, relu=False, name='conv3_3_1x1_reduce')
425 | .batch_normalization(relu=True, name='conv3_3_1x1_reduce_bn')
426 | .zero_padding(paddings=1, name='padding6')
427 | .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='conv3_3_3x3')
428 | .batch_normalization(relu=True, name='conv3_3_3x3_bn')
429 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv3_3_1x1_increase')
430 | .batch_normalization(relu=False, name='conv3_3_1x1_increase_bn'))
431 |
432 |
433 | (self.feed('conv3_2/relu',
434 | 'conv3_3_1x1_increase_bn')
435 | .add(name='conv3_3')
436 | .relu(name='conv3_3/relu')
437 | .conv(1, 1, 64, 1, 1, biased=False, relu=False, name='conv3_4_1x1_reduce')
438 | .batch_normalization(relu=True, name='conv3_4_1x1_reduce_bn')
439 | .zero_padding(paddings=1, name='padding7')
440 | .conv(3, 3, 64, 1, 1, biased=False, relu=False, name='conv3_4_3x3')
441 | .batch_normalization(relu=True, name='conv3_4_3x3_bn')
442 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv3_4_1x1_increase')
443 | .batch_normalization(relu=False, name='conv3_4_1x1_increase_bn'))
444 |
445 | (self.feed('conv3_3/relu',
446 | 'conv3_4_1x1_increase_bn')
447 | .add(name='conv3_4')
448 | .relu(name='conv3_4/relu')
449 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_1_1x1_proj')
450 | .batch_normalization(relu=False, name='conv4_1_1x1_proj_bn'))
451 |
452 | (self.feed('conv3_4/relu')
453 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv4_1_1x1_reduce')
454 | .batch_normalization(relu=True, name='conv4_1_1x1_reduce_bn')
455 | .zero_padding(paddings=2, name='padding8')
456 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv4_1_3x3')
457 | .batch_normalization(relu=True, name='conv4_1_3x3_bn')
458 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_1_1x1_increase')
459 | .batch_normalization(relu=False, name='conv4_1_1x1_increase_bn'))
460 |
461 | (self.feed('conv4_1_1x1_proj_bn',
462 | 'conv4_1_1x1_increase_bn')
463 | .add(name='conv4_1')
464 | .relu(name='conv4_1/relu')
465 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv4_2_1x1_reduce')
466 | .batch_normalization(relu=True, name='conv4_2_1x1_reduce_bn')
467 | .zero_padding(paddings=2, name='padding9')
468 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv4_2_3x3')
469 | .batch_normalization(relu=True, name='conv4_2_3x3_bn')
470 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_2_1x1_increase')
471 | .batch_normalization(relu=False, name='conv4_2_1x1_increase_bn'))
472 |
473 | (self.feed('conv4_1/relu',
474 | 'conv4_2_1x1_increase_bn')
475 | .add(name='conv4_2')
476 | .relu(name='conv4_2/relu')
477 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv4_3_1x1_reduce')
478 | .batch_normalization(relu=True, name='conv4_3_1x1_reduce_bn')
479 | .zero_padding(paddings=2, name='padding10')
480 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv4_3_3x3')
481 | .batch_normalization(relu=True, name='conv4_3_3x3_bn')
482 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_3_1x1_increase')
483 | .batch_normalization(relu=False, name='conv4_3_1x1_increase_bn'))
484 |
485 | (self.feed('conv4_2/relu',
486 | 'conv4_3_1x1_increase_bn')
487 | .add(name='conv4_3')
488 | .relu(name='conv4_3/relu')
489 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv4_4_1x1_reduce')
490 | .batch_normalization(relu=True, name='conv4_4_1x1_reduce_bn')
491 | .zero_padding(paddings=2, name='padding11')
492 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv4_4_3x3')
493 | .batch_normalization(relu=True, name='conv4_4_3x3_bn')
494 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_4_1x1_increase')
495 | .batch_normalization(relu=False, name='conv4_4_1x1_increase_bn'))
496 |
497 | (self.feed('conv4_3/relu',
498 | 'conv4_4_1x1_increase_bn')
499 | .add(name='conv4_4')
500 | .relu(name='conv4_4/relu')
501 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv4_5_1x1_reduce')
502 | .batch_normalization(relu=True, name='conv4_5_1x1_reduce_bn')
503 | .zero_padding(paddings=2, name='padding12')
504 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv4_5_3x3')
505 | .batch_normalization(relu=True, name='conv4_5_3x3_bn')
506 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_5_1x1_increase')
507 | .batch_normalization(relu=False, name='conv4_5_1x1_increase_bn'))
508 |
509 | (self.feed('conv4_4/relu',
510 | 'conv4_5_1x1_increase_bn')
511 | .add(name='conv4_5')
512 | .relu(name='conv4_5/relu')
513 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv4_6_1x1_reduce')
514 | .batch_normalization(relu=True, name='conv4_6_1x1_reduce_bn')
515 | .zero_padding(paddings=2, name='padding13')
516 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv4_6_3x3')
517 | .batch_normalization(relu=True, name='conv4_6_3x3_bn')
518 | .conv(1, 1, 512, 1, 1, biased=False, relu=False, name='conv4_6_1x1_increase')
519 | .batch_normalization(relu=False, name='conv4_6_1x1_increase_bn'))
520 |
521 | (self.feed('conv4_5/relu',
522 | 'conv4_6_1x1_increase_bn')
523 | .add(name='conv4_6')
524 | .relu(name='conv4_6/relu')
525 | .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='conv5_1_1x1_proj')
526 | .batch_normalization(relu=False, name='conv5_1_1x1_proj_bn'))
527 |
528 | (self.feed('conv4_6/relu')
529 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv5_1_1x1_reduce')
530 | .batch_normalization(relu=True, name='conv5_1_1x1_reduce_bn')
531 | .zero_padding(paddings=4, name='padding14')
532 | .atrous_conv(3, 3, 256, 4, biased=False, relu=False, name='conv5_1_3x3')
533 | .batch_normalization(relu=True, name='conv5_1_3x3_bn')
534 | .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='conv5_1_1x1_increase')
535 | .batch_normalization(relu=False, name='conv5_1_1x1_increase_bn'))
536 |
537 | (self.feed('conv5_1_1x1_proj_bn',
538 | 'conv5_1_1x1_increase_bn')
539 | .add(name='conv5_1')
540 | .relu(name='conv5_1/relu')
541 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv5_2_1x1_reduce')
542 | .batch_normalization(relu=True, name='conv5_2_1x1_reduce_bn')
543 | .zero_padding(paddings=4, name='padding15')
544 | .atrous_conv(3, 3, 256, 4, biased=False, relu=False, name='conv5_2_3x3')
545 | .batch_normalization(relu=True, name='conv5_2_3x3_bn')
546 | .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='conv5_2_1x1_increase')
547 | .batch_normalization(relu=False, name='conv5_2_1x1_increase_bn'))
548 |
549 | (self.feed('conv5_1/relu',
550 | 'conv5_2_1x1_increase_bn')
551 | .add(name='conv5_2')
552 | .relu(name='conv5_2/relu')
553 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv5_3_1x1_reduce')
554 | .batch_normalization(relu=True, name='conv5_3_1x1_reduce_bn')
555 | .zero_padding(paddings=4, name='padding16')
556 | .atrous_conv(3, 3, 256, 4, biased=False, relu=False, name='conv5_3_3x3')
557 | .batch_normalization(relu=True, name='conv5_3_3x3_bn')
558 | .conv(1, 1, 1024, 1, 1, biased=False, relu=False, name='conv5_3_1x1_increase')
559 | .batch_normalization(relu=False, name='conv5_3_1x1_increase_bn'))
560 |
561 | (self.feed('conv5_2/relu',
562 | 'conv5_3_1x1_increase_bn')
563 | .add(name='conv5_3')
564 | .relu(name='conv5_3/relu'))
565 |
566 | shape = self.layers['conv5_3/relu'].get_shape().as_list()[1:3]
567 | h, w = shape
568 |
569 | (self.feed('conv5_3/relu')
570 | .avg_pool(h, w, h, w, name='conv5_3_pool1')
571 | .resize_bilinear(shape, name='conv5_3_pool1_interp'))
572 |
573 | (self.feed('conv5_3/relu')
574 | .avg_pool(h/2, w/2, h/2, w/2, name='conv5_3_pool2')
575 | .resize_bilinear(shape, name='conv5_3_pool2_interp'))
576 |
577 | (self.feed('conv5_3/relu')
578 | .avg_pool(h/3, w/3, h/3, w/3, name='conv5_3_pool3')
579 | .resize_bilinear(shape, name='conv5_3_pool3_interp'))
580 |
581 | (self.feed('conv5_3/relu')
582 | .avg_pool(h/4, w/4, h/4, w/4, name='conv5_3_pool6')
583 | .resize_bilinear(shape, name='conv5_3_pool6_interp'))
584 |
585 | (self.feed('conv5_3/relu',
586 | 'conv5_3_pool6_interp',
587 | 'conv5_3_pool3_interp',
588 | 'conv5_3_pool2_interp',
589 | 'conv5_3_pool1_interp')
590 | .add(name='conv5_3_sum')
591 | .conv(1, 1, 256, 1, 1, biased=False, relu=False, name='conv5_4_k1')
592 | .batch_normalization(relu=True, name='conv5_4_k1_bn')
593 | .interp(z_factor=2.0, name='conv5_4_interp')
594 | .zero_padding(paddings=2, name='padding17')
595 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv_sub4')
596 | .batch_normalization(relu=False, name='conv_sub4_bn'))
597 |
598 | (self.feed('conv3_1/relu')
599 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv3_1_sub2_proj')
600 | .batch_normalization(relu=False, name='conv3_1_sub2_proj_bn'))
601 |
602 | (self.feed('conv_sub4_bn',
603 | 'conv3_1_sub2_proj_bn')
604 | .add(name='sub24_sum')
605 | .relu(name='sub24_sum/relu')
606 | .interp(z_factor=2.0, name='sub24_sum_interp')
607 | .zero_padding(paddings=2, name='padding18')
608 | .atrous_conv(3, 3, 128, 2, biased=False, relu=False, name='conv_sub2')
609 | .batch_normalization(relu=False, name='conv_sub2_bn'))
610 |
611 | (self.feed('data')
612 | .conv(3, 3, 32, 2, 2, biased=False, padding='SAME', relu=False, name='conv1_sub1')
613 | .batch_normalization(relu=True, name='conv1_sub1_bn')
614 | .conv(3, 3, 32, 2, 2, biased=False, padding='SAME', relu=False, name='conv2_sub1')
615 | .batch_normalization(relu=True, name='conv2_sub1_bn')
616 | .conv(3, 3, 64, 2, 2, biased=False, padding='SAME', relu=False, name='conv3_sub1')
617 | .batch_normalization(relu=True, name='conv3_sub1_bn')
618 | .conv(1, 1, 128, 1, 1, biased=False, relu=False, name='conv3_sub1_proj')
619 | .batch_normalization(relu=False, name='conv3_sub1_proj_bn'))
620 |
621 | (self.feed('conv_sub2_bn',
622 | 'conv3_sub1_proj_bn')
623 | .add(name='sub12_sum')
624 | .relu(name='sub12_sum/relu')
625 | .interp(z_factor=2.0, name='sub12_sum_interp')
626 | .conv(1, 1, self.cfg.param['num_classes'], 1, 1, biased=True, relu=False, name='conv6_cls'))
627 |
628 | (self.feed('conv5_4_interp')
629 | .conv(1, 1, self.cfg.param['num_classes'], 1, 1, biased=True, relu=False, name='sub4_out'))
630 |
631 | (self.feed('sub24_sum_interp')
632 | .conv(1, 1, self.cfg.param['num_classes'], 1, 1, biased=True, relu=False, name='sub24_out'))
--------------------------------------------------------------------------------
/network.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import tensorflow as tf
3 | import os
4 |
5 | DEFAULT_PADDING = 'VALID'
6 | DEFAULT_DATAFORMAT = 'NHWC'
7 | layer_name = []
8 | BN_param_map = {'scale': 'gamma',
9 | 'offset': 'beta',
10 | 'variance': 'moving_variance',
11 | 'mean': 'moving_mean'}
12 |
13 | def layer(op):
14 | '''Decorator for composable network layers.'''
15 | def layer_decorated(self, *args, **kwargs):
16 | # Automatically set a name if not provided.
17 | name = kwargs.setdefault('name', self.get_unique_name(op.__name__))
18 | # Figure out the layer inputs.
19 | if len(self.terminals) == 0:
20 | raise RuntimeError('No input variables found for layer %s.' % name)
21 | elif len(self.terminals) == 1:
22 | layer_input = self.terminals[0]
23 | else:
24 | layer_input = list(self.terminals)
25 | # Perform the operation and get the output.
26 | layer_output = op(self, layer_input, *args, **kwargs)
27 | # Add to layer LUT.
28 | self.layers[name] = layer_output
29 | layer_name.append(name)
30 | # This output is now the input for the next layer.
31 | self.feed(layer_output)
32 | # Return self for chained calls.
33 | return self
34 |
35 | return layer_decorated
36 |
37 |
38 | class Network(object):
39 | def __init__(self, inputs, cfg, trainable=True):
40 | # The input nodes for this network
41 | self.inputs = inputs
42 | # The current list of terminal nodes
43 | self.terminals = []
44 | # Mapping from layer names to layers
45 | self.layers = dict(inputs)
46 |
47 | self.trainable = trainable
48 |
49 | # Switch variable for dropout
50 | self.use_dropout = tf.placeholder_with_default(tf.constant(1.0),
51 | shape=[],
52 | name='use_dropout')
53 | self.filter_scale = cfg.filter_scale
54 |
55 | # If true, the resulting variables are set as trainable
56 | self.is_training = cfg.is_training
57 |
58 | self.setup()
59 |
60 | def setup(self, is_training):
61 | '''Construct the network. '''
62 | raise NotImplementedError('Must be implemented by the subclass.')
63 |
64 | def create_session(self):
65 | # Set up tf session and initialize variables.
66 | config = tf.ConfigProto()
67 | config.gpu_options.allow_growth = True
68 |
69 | global_init = tf.global_variables_initializer()
70 | local_init = tf.local_variables_initializer()
71 |
72 | self.sess = tf.Session(config=config)
73 | self.sess.run([global_init, local_init])
74 |
75 | def restore(self, data_path, var_list=None):
76 | if data_path.endswith('.npy'):
77 | self.load_npy(data_path, self.sess)
78 | else:
79 | loader = tf.train.Saver(var_list=tf.global_variables())
80 | loader.restore(self.sess, data_path)
81 |
82 | print('Restore from {}'.format(data_path))
83 |
84 | def save(self, saver, save_dir, step):
85 | model_name = 'model.ckpt'
86 | checkpoint_path = os.path.join(save_dir, model_name)
87 |
88 | if not os.path.exists(save_dir):
89 | os.makedirs(save_dir)
90 |
91 | saver.save(self.sess, checkpoint_path, global_step=step)
92 | print('The checkpoint has been created, step: {}'.format(step))
93 |
94 | ## Restore from .npy
95 | def load_npy(self, data_path, session, ignore_missing=False):
96 | '''Load network weights.
97 | data_path: The path to the numpy-serialized network weights
98 | session: The current TensorFlow session
99 | ignore_missing: If true, serialized weights for missing layers are ignored.
100 | '''
101 | data_dict = np.load(data_path, encoding='latin1').item()
102 | for op_name in data_dict:
103 | with tf.variable_scope(op_name, reuse=True):
104 | for param_name, data in data_dict[op_name].items():
105 | try:
106 | if 'bn' in op_name:
107 | param_name = BN_param_map[param_name]
108 |
109 | var = tf.get_variable(param_name)
110 | session.run(var.assign(data))
111 | except ValueError:
112 | if not ignore_missing:
113 | raise
114 |
115 | def feed(self, *args):
116 | '''Set the input(s) for the next operation by replacing the terminal nodes.
117 | The arguments can be either layer names or the actual layers.
118 | '''
119 | assert len(args) != 0
120 | self.terminals = []
121 | for fed_layer in args:
122 | if isinstance(fed_layer, str):
123 | try:
124 | fed_layer = self.layers[fed_layer]
125 | except KeyError:
126 | raise KeyError('Unknown layer name fed: %s' % fed_layer)
127 | self.terminals.append(fed_layer)
128 | return self
129 |
130 | def get_output(self):
131 | '''Returns the current network output.'''
132 | return self.terminals[-1]
133 |
134 | def get_unique_name(self, prefix):
135 | '''Returns an index-suffixed unique name for the given prefix.
136 | This is used for auto-generating layer names based on the type-prefix.
137 | '''
138 | ident = sum(t.startswith(prefix) for t, _ in self.layers.items()) + 1
139 | return '%s_%d' % (prefix, ident)
140 |
141 | def make_var(self, name, shape):
142 | '''Creates a new TensorFlow variable.'''
143 | return tf.get_variable(name, shape, trainable=self.trainable)
144 |
145 | def get_layer_name(self):
146 | return layer_name
147 | def validate_padding(self, padding):
148 | '''Verifies that the padding is one of the supported ones.'''
149 | assert padding in ('SAME', 'VALID')
150 | @layer
151 | def zero_padding(self, input, paddings, name):
152 | pad_mat = np.array([[0,0], [paddings, paddings], [paddings, paddings], [0, 0]])
153 | return tf.pad(input, paddings=pad_mat, name=name)
154 |
155 | @layer
156 | def conv(self,
157 | input,
158 | k_h,
159 | k_w,
160 | c_o,
161 | s_h,
162 | s_w,
163 | name,
164 | relu=True,
165 | padding=DEFAULT_PADDING,
166 | group=1,
167 | biased=True):
168 | # Verify that the padding is acceptable
169 | self.validate_padding(padding)
170 | # Get the number of channels in the input
171 | c_i = input.get_shape()[-1]
172 |
173 | if 'out' not in name and 'cls' not in name:
174 | c_o *= self.filter_scale
175 |
176 | convolve = lambda i, k: tf.nn.conv2d(i, k, [1, s_h, s_w, 1], padding=padding,data_format=DEFAULT_DATAFORMAT)
177 | with tf.variable_scope(name) as scope:
178 | kernel = self.make_var('weights', shape=[k_h, k_w, c_i, c_o])
179 | output = convolve(input, kernel)
180 |
181 | if biased:
182 | biases = self.make_var('biases', [c_o])
183 | output = tf.nn.bias_add(output, biases)
184 | if relu:
185 | output = tf.nn.relu(output, name=scope.name)
186 | return output
187 |
188 | @layer
189 | def atrous_conv(self,
190 | input,
191 | k_h,
192 | k_w,
193 | c_o,
194 | dilation,
195 | name,
196 | relu=True,
197 | padding=DEFAULT_PADDING,
198 | group=1,
199 | biased=True):
200 | # Verify that the padding is acceptable
201 | self.validate_padding(padding)
202 | # Get the number of channels in the input
203 | c_i = input.get_shape()[-1]
204 | c_o *= self.filter_scale
205 |
206 | convolve = lambda i, k: tf.nn.atrous_conv2d(i, k, dilation, padding=padding)
207 | with tf.variable_scope(name) as scope:
208 | kernel = self.make_var('weights', shape=[k_h, k_w, c_i, c_o])
209 | output = convolve(input, kernel)
210 |
211 | if biased:
212 | biases = self.make_var('biases', [c_o])
213 | output = tf.nn.bias_add(output, biases)
214 | if relu:
215 | output = tf.nn.relu(output, name=scope.name)
216 | return output
217 |
218 | @layer
219 | def relu(self, input, name):
220 | return tf.nn.relu(input, name=name)
221 |
222 | @layer
223 | def max_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING):
224 | self.validate_padding(padding)
225 | return tf.nn.max_pool(input,
226 | ksize=[1, k_h, k_w, 1],
227 | strides=[1, s_h, s_w, 1],
228 | padding=padding,
229 | name=name,
230 | data_format=DEFAULT_DATAFORMAT)
231 |
232 | @layer
233 | def avg_pool(self, input, k_h, k_w, s_h, s_w, name, padding=DEFAULT_PADDING):
234 | self.validate_padding(padding)
235 |
236 | output = tf.nn.avg_pool(input,
237 | ksize=[1, k_h, k_w, 1],
238 | strides=[1, s_h, s_w, 1],
239 | padding=padding,
240 | name=name,
241 | data_format=DEFAULT_DATAFORMAT)
242 | return output
243 |
244 | @layer
245 | def lrn(self, input, radius, alpha, beta, name, bias=1.0):
246 | return tf.nn.local_response_normalization(input,
247 | depth_radius=radius,
248 | alpha=alpha,
249 | beta=beta,
250 | bias=bias,
251 | name=name)
252 |
253 | @layer
254 | def concat(self, inputs, axis, name):
255 | return tf.concat(axis=axis, values=inputs, name=name)
256 |
257 | @layer
258 | def add(self, inputs, name):
259 | inputs[0] = tf.image.resize_bilinear(inputs[0], size=tf.shape(inputs[1])[1:3])
260 |
261 | return tf.add_n(inputs, name=name)
262 |
263 | @layer
264 | def fc(self, input, num_out, name, relu=True):
265 | with tf.variable_scope(name) as scope:
266 | input_shape = input.get_shape()
267 | if input_shape.ndims == 4:
268 | # The input is spatial. Vectorize it first.
269 | dim = 1
270 | for d in input_shape[1:].as_list():
271 | dim *= d
272 | feed_in = tf.reshape(input, [-1, dim])
273 | else:
274 | feed_in, dim = (input, input_shape[-1].value)
275 | weights = self.make_var('weights', shape=[dim, num_out])
276 | biases = self.make_var('biases', [num_out])
277 | op = tf.nn.relu_layer if relu else tf.nn.xw_plus_b
278 | fc = op(feed_in, weights, biases, name=scope.name)
279 | return fc
280 |
281 | @layer
282 | def softmax(self, input, name):
283 | input_shape = map(lambda v: v.value, input.get_shape())
284 | if len(input_shape) > 2:
285 | # For certain models (like NiN), the singleton spatial dimensions
286 | # need to be explicitly squeezed, since they're not broadcast-able
287 | # in TensorFlow's NHWC ordering (unlike Caffe's NCHW).
288 | if input_shape[1] == 1 and input_shape[2] == 1:
289 | input = tf.squeeze(input, squeeze_dims=[1, 2])
290 | else: return tf.nn.softmax(input, name)
291 |
292 | @layer
293 | def batch_normalization(self, input, name, scale_offset=True, relu=False):
294 | output = tf.layers.batch_normalization(
295 | input,
296 | momentum=0.95,
297 | epsilon=1e-5,
298 | training=self.is_training,
299 | name=name
300 | )
301 |
302 | if relu:
303 | output = tf.nn.relu(output)
304 |
305 | return output
306 |
307 | @layer
308 | def dropout(self, input, keep_prob, name):
309 | keep = 1 - self.use_dropout + (self.use_dropout * keep_prob)
310 | return tf.nn.dropout(input, keep, name=name)
311 |
312 | @layer
313 | def resize_bilinear(self, input, size, name):
314 | return tf.image.resize_bilinear(input, size=size, align_corners=True, name=name)
315 |
316 | @layer
317 | def interp(self, input, s_factor=1, z_factor=1, name=None):
318 | ori_h, ori_w = input.get_shape().as_list()[1:3]
319 | # shrink
320 | ori_h = (ori_h - 1) * s_factor + 1
321 | ori_w = (ori_w - 1) * s_factor + 1
322 | # zoom
323 | ori_h = ori_h + (ori_h - 1) * (z_factor - 1)
324 | ori_w = ori_w + (ori_w - 1) * (z_factor - 1)
325 | resize_shape = [int(ori_h), int(ori_w)]
326 |
327 | return tf.image.resize_bilinear(input, size=resize_shape, align_corners=True, name=name)
328 |
--------------------------------------------------------------------------------
/script/download_ADE20k.sh:
--------------------------------------------------------------------------------
1 | wget -O ./data/ADEChallengeData2016.zip http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zip
2 | unzip ./data/ADEChallengeData2016.zip -d ./data
3 | rm ./data/ADEChallengeData2016.zip
4 | echo "Dataset downloaded."
5 |
--------------------------------------------------------------------------------
/script/download_weights.py:
--------------------------------------------------------------------------------
1 | from google_drive_downloader import GoogleDriveDownloader as gdd
2 | import argparse
3 |
4 | parser = argparse.ArgumentParser(description="Reproduced ICNet")
5 |
6 | parser.add_argument("--dataset", type=str, default='',
7 | choices=['ade20k', 'cityscapes'],
8 | required=True)
9 | args = parser.parse_args()
10 |
11 | if args.dataset == 'cityscapes':
12 | ## Download cityscapes weight
13 | gdd.download_file_from_google_drive(file_id='15S_vZoZZwBsORxtRAMcbdsI99o6Cvo5x',
14 | dest_path='./model/cityscapes/icnet_cityscapes_train_30k_bnnomerge.npy',
15 | unzip=False)
16 | gdd.download_file_from_google_drive(file_id='17ZILbQ7Qazg7teb567CIPJ30FD57bVVg',
17 | dest_path='./model/cityscapes/icnet_cityscapes_train_30k.npy',
18 | unzip=False)
19 | gdd.download_file_from_google_drive(file_id='1Z-slNrKYJpfpELeuh2UlueQG1krF9I4a',
20 | dest_path='./model/cityscapes/icnet_cityscapes_trainval_90k_bnnomerge.npy',
21 | unzip=False)
22 | gdd.download_file_from_google_drive(file_id='1tZIHpppPcleamBlXKSzjOqL93gNjWGec',
23 | dest_path='./model/cityscapes/icnet_cityscapes_trainval_90k.npy',
24 | unzip=False)
25 | elif args.dataset == 'ade20k':
26 | ## Download ade20k weight
27 | gdd.download_file_from_google_drive(file_id='1vh_JWy4lBM3A7QggQMIQLoJYZHEtUDi3',
28 | dest_path='./model/ade20k/model.ckpt-27150.data-00000-of-00001',
29 | unzip=False)
30 | gdd.download_file_from_google_drive(file_id='1_YAwOiBlSxu9ynlopaLQ4yjuhVTiz_-f',
31 | dest_path='./model/ade20k/model.ckpt-27150.index',
32 | unzip=False)
33 | gdd.download_file_from_google_drive(file_id='1ZeRnqKIoc3r6e8pezzT4xT-9FT0tudhd',
34 | dest_path='./model/ade20k/model.ckpt-27150.meta',
35 | unzip=False)
36 | gdd.download_file_from_google_drive(file_id='1RjIuPJ-Vhs1EuXgK9sHeT-XFoO_Sba69',
37 | dest_path='./model/ade20k/checkpoint',
38 | unzip=False)
39 |
--------------------------------------------------------------------------------
/train.py:
--------------------------------------------------------------------------------
1 | """
2 | This code is based on DrSleep's framework: https://github.com/DrSleep/tensorflow-deeplab-resnet
3 | """
4 | import argparse
5 | import os
6 | import sys
7 | import time
8 |
9 | import tensorflow as tf
10 | import numpy as np
11 |
12 | from model import ICNet_BN
13 | from utils.config import Config
14 | from utils.visualize import decode_labels
15 | from utils.image_reader import ImageReader, prepare_label
16 |
17 | def get_arguments():
18 | parser = argparse.ArgumentParser(description="Reproduced ICNet")
19 |
20 | parser.add_argument("--random-mirror", action="store_true",
21 | help="Whether to randomly mirror the inputs during the training.")
22 | parser.add_argument("--random-scale", action="store_true",
23 | help="Whether to randomly scale the inputs during the training.")
24 | parser.add_argument("--update-mean-var", action="store_true",
25 | help="whether to get update_op from tf.Graphic_Keys")
26 | parser.add_argument("--train-beta-gamma", action="store_true",
27 | help="whether to train beta & gamma in bn layer")
28 | parser.add_argument("--dataset", required=True,
29 | help="Which dataset to trained with",
30 | choices=['cityscapes', 'ade20k', 'others'])
31 | parser.add_argument("--filter-scale", type=int, default=1,
32 | help="1 for using pruned model, while 2 for using non-pruned model.",
33 | choices=[1, 2])
34 | return parser.parse_args()
35 |
36 | def get_mask(gt, num_classes, ignore_label):
37 | less_equal_class = tf.less_equal(gt, num_classes-1)
38 | not_equal_ignore = tf.not_equal(gt, ignore_label)
39 | mask = tf.logical_and(less_equal_class, not_equal_ignore)
40 | indices = tf.squeeze(tf.where(mask), 1)
41 |
42 | return indices
43 |
44 | def create_loss(output, label, num_classes, ignore_label):
45 | raw_pred = tf.reshape(output, [-1, num_classes])
46 | label = prepare_label(label, tf.stack(output.get_shape()[1:3]), num_classes=num_classes, one_hot=False)
47 | label = tf.reshape(label, [-1,])
48 |
49 | indices = get_mask(label, num_classes, ignore_label)
50 | gt = tf.cast(tf.gather(label, indices), tf.int32)
51 | pred = tf.gather(raw_pred, indices)
52 |
53 | loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=pred, labels=gt)
54 | reduced_loss = tf.reduce_mean(loss)
55 |
56 | return reduced_loss
57 |
58 | def create_losses(net, label, cfg):
59 | # Get output from different branches
60 | sub4_out = net.layers['sub4_out']
61 | sub24_out = net.layers['sub24_out']
62 | sub124_out = net.layers['conv6_cls']
63 |
64 | loss_sub4 = create_loss(sub4_out, label, cfg.param['num_classes'], cfg.param['ignore_label'])
65 | loss_sub24 = create_loss(sub24_out, label, cfg.param['num_classes'], cfg.param['ignore_label'])
66 | loss_sub124 = create_loss(sub124_out, label, cfg.param['num_classes'], cfg.param['ignore_label'])
67 |
68 | l2_losses = [cfg.WEIGHT_DECAY * tf.nn.l2_loss(v) for v in tf.trainable_variables() if 'weights' in v.name]
69 |
70 | # Calculate weighted loss of three branches, you can tune LAMBDA values to get better results.
71 | reduced_loss = cfg.LAMBDA1 * loss_sub4 + cfg.LAMBDA2 * loss_sub24 + cfg.LAMBDA3 * loss_sub124 + tf.add_n(l2_losses)
72 |
73 | return loss_sub4, loss_sub24, loss_sub124, reduced_loss
74 |
75 | class TrainConfig(Config):
76 | def __init__(self, dataset, is_training, filter_scale=1, random_scale=None, random_mirror=None):
77 | Config.__init__(self, dataset, is_training, filter_scale, random_scale, random_mirror)
78 |
79 | # Set pre-trained weights here (You can download weight using `python script/download_weights.py`)
80 | # Note that you need to use "bnnomerge" version.
81 | model_weight = './model/cityscapes/icnet_cityscapes_train_30k_bnnomerge.npy'
82 |
83 | # Set hyperparameters here, you can get much more setting in Config Class, see 'utils/config.py' for details.
84 | LAMBDA1 = 0.16
85 | LAMBDA2 = 0.4
86 | LAMBDA3 = 1.0
87 | BATCH_SIZE = 8
88 | LEARNING_RATE = 5e-4
89 |
90 | def main():
91 | """Create the model and start the training."""
92 | args = get_arguments()
93 |
94 | """
95 | Get configurations here. We pass some arguments from command line to init configurations, for training hyperparameters,
96 | you can set them in TrainConfig Class.
97 |
98 | Note: we set filter scale to 1 for pruned model, 2 for non-pruned model. The filters numbers of non-pruned
99 | model is two times larger than prunde model, e.g., [h, w, 64] <-> [h, w, 32].
100 | """
101 | cfg = TrainConfig(dataset=args.dataset,
102 | is_training=True,
103 | random_scale=args.random_scale,
104 | random_mirror=args.random_mirror,
105 | filter_scale=args.filter_scale)
106 | cfg.display()
107 |
108 | # Setup training network and training samples
109 | train_reader = ImageReader(cfg=cfg, mode='train')
110 | train_net = ICNet_BN(image_reader=train_reader,
111 | cfg=cfg, mode='train')
112 |
113 | loss_sub4, loss_sub24, loss_sub124, reduced_loss = create_losses(train_net, train_net.labels, cfg)
114 |
115 | # Setup validation network and validation samples
116 | with tf.variable_scope('', reuse=True):
117 | val_reader = ImageReader(cfg, mode='eval')
118 | val_net = ICNet_BN(image_reader=val_reader,
119 | cfg=cfg, mode='train')
120 |
121 | val_loss_sub4, val_loss_sub24, val_loss_sub124, val_reduced_loss = create_losses(val_net, val_net.labels, cfg)
122 |
123 | # Using Poly learning rate policy
124 | base_lr = tf.constant(cfg.LEARNING_RATE)
125 | step_ph = tf.placeholder(dtype=tf.float32, shape=())
126 | learning_rate = tf.scalar_mul(base_lr, tf.pow((1 - step_ph / cfg.TRAINING_STEPS), cfg.POWER))
127 |
128 | # Set restore variable
129 | restore_var = tf.global_variables()
130 | all_trainable = [v for v in tf.trainable_variables() if ('beta' not in v.name and 'gamma' not in v.name) or args.train_beta_gamma]
131 |
132 | # Gets moving_mean and moving_variance update operations from tf.GraphKeys.UPDATE_OPS
133 | if args.update_mean_var == False:
134 | update_ops = None
135 | else:
136 | update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
137 |
138 | with tf.control_dependencies(update_ops):
139 | opt_conv = tf.train.MomentumOptimizer(learning_rate, cfg.MOMENTUM)
140 | grads = tf.gradients(reduced_loss, all_trainable)
141 | train_op = opt_conv.apply_gradients(zip(grads, all_trainable))
142 |
143 | # Create session & restore weights (Here we only need to use train_net to create session since we reuse it)
144 | train_net.create_session()
145 | train_net.restore(cfg.model_weight, restore_var)
146 | saver = tf.train.Saver(var_list=tf.global_variables(), max_to_keep=5)
147 |
148 | # Iterate over training steps.
149 | for step in range(cfg.TRAINING_STEPS):
150 | start_time = time.time()
151 |
152 | feed_dict = {step_ph: step}
153 | if step % cfg.SAVE_PRED_EVERY == 0:
154 | loss_value, loss1, loss2, loss3, val_loss_value, _ = train_net.sess.run([reduced_loss, loss_sub4, loss_sub24, loss_sub124, val_reduced_loss, train_op], feed_dict=feed_dict)
155 | train_net.save(saver, cfg.SNAPSHOT_DIR, step)
156 | else:
157 | loss_value, loss1, loss2, loss3, val_loss_value, _ = train_net.sess.run([reduced_loss, loss_sub4, loss_sub24, loss_sub124, val_reduced_loss, train_op], feed_dict=feed_dict)
158 |
159 | duration = time.time() - start_time
160 | print('step {:d} \t total loss = {:.3f}, sub4 = {:.3f}, sub24 = {:.3f}, sub124 = {:.3f}, val_loss: {:.3f} ({:.3f} sec/step)'.\
161 | format(step, loss_value, loss1, loss2, loss3, val_loss_value, duration))
162 |
163 |
164 | if __name__ == '__main__':
165 | main()
166 |
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/utils/__init__.py
--------------------------------------------------------------------------------
/utils/color150.mat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/utils/color150.mat
--------------------------------------------------------------------------------
/utils/config.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import os
3 |
4 | class Config(object):
5 | # Setting dataset directory
6 | CITYSCAPES_DATA_DIR = './data/cityscapes_dataset/cityscape/'
7 | ADE20K_DATA_DIR = './data/ADEChallengeData2016/'
8 |
9 | ADE20K_eval_list = os.path.join('./data/list/ade20k_val_list.txt')
10 | CITYSCAPES_eval_list = os.path.join('./data/list/cityscapes_val_list.txt')
11 |
12 | ADE20K_train_list = os.path.join('./data/list/ade20k_train_list.txt')
13 | CITYSCAPES_train_list = os.path.join('./data/list/cityscapes_train_list.txt')
14 |
15 | IMG_MEAN = np.array((103.939, 116.779, 123.68), dtype=np.float32)
16 |
17 | ADE20k_param = {'name': 'ade20k',
18 | 'num_classes': 150, # predict: [0~149] corresponding to label [1~150], ignore class 0 (background)
19 | 'ignore_label': 0,
20 | 'eval_size': [480, 480],
21 | 'eval_steps': 2000,
22 | 'eval_list': ADE20K_eval_list,
23 | 'train_list': ADE20K_train_list,
24 | 'data_dir': ADE20K_DATA_DIR}
25 |
26 | cityscapes_param = {'name': 'cityscapes',
27 | 'num_classes': 19,
28 | 'ignore_label': 255,
29 | 'eval_size': [1025, 2049],
30 | 'eval_steps': 500,
31 | 'eval_list': CITYSCAPES_eval_list,
32 | 'train_list': CITYSCAPES_train_list,
33 | 'data_dir': CITYSCAPES_DATA_DIR}
34 |
35 | model_paths = {'train': './model/cityscapes/icnet_cityscapes_train_30k.npy',
36 | 'trainval': './model/cityscapes/icnet_cityscapes_trainval_90k.npy',
37 | 'train_bn': './model/cityscapes/icnet_cityscapes_train_30k_bnnomerge.npy',
38 | 'trainval_bn': './model/cityscapes/icnet_cityscapes_trainval_90k_bnnomerge.npy',
39 | 'others': './model/ade20k/model.ckpt-27150'}
40 |
41 | ## If you want to train on your own dataset, try to set these parameters.
42 | others_param = {'name': 'YOUR_OWN_DATASET',
43 | 'num_classes': 0,
44 | 'ignore_label': 0,
45 | 'eval_size': [0, 0],
46 | 'eval_steps': 0,
47 | 'eval_list': '/PATH/TO/YOUR_EVAL_LIST',
48 | 'train_list': '/PATH/TO/YOUR_TRAIN_LIST',
49 | 'data_dir': '/PATH/TO/YOUR_DATA_DIR'}
50 |
51 | ## You can modify following lines to train different training configurations.
52 | INFER_SIZE = [1024, 2048, 3]
53 | TRAINING_SIZE = [720, 720]
54 | TRAINING_STEPS = 60001
55 |
56 | N_WORKERS = 8
57 | BATCH_SIZE = 16
58 | LEARNING_RATE = 1e-4
59 | MOMENTUM = 0.9
60 | POWER = 0.9
61 | RANDOM_SEED = 1234
62 | WEIGHT_DECAY = 0.0001
63 | SNAPSHOT_DIR = './snapshots/'
64 | SAVE_NUM_IMAGES = 4
65 | SAVE_PRED_EVERY = 500
66 |
67 | # Loss Function = LAMBDA1 * sub4_loss + LAMBDA2 * sub24_loss + LAMBDA3 * sub124_loss
68 | LAMBDA1 = 0.16
69 | LAMBDA2 = 0.4
70 | LAMBDA3 = 1.0
71 |
72 | def __init__(self, dataset, is_training=False, filter_scale=1, random_scale=False, random_mirror=False):
73 | print('Setup configurations...')
74 |
75 | if dataset == 'ade20k':
76 | self.param = self.ADE20k_param
77 | elif dataset == 'cityscapes':
78 | self.param = self.cityscapes_param
79 | elif dataset == 'others':
80 | self.param = self.others_param
81 |
82 | self.dataset = dataset
83 | self.random_scale = random_scale
84 | self.random_mirror = random_mirror
85 | self.is_training = is_training
86 | self.filter_scale = filter_scale
87 |
88 | def display(self):
89 | """Display Configuration values."""
90 | print("\nConfigurations:")
91 | for a in dir(self):
92 | if not a.startswith("__") and not callable(getattr(self, a)) and not isinstance(getattr(self, a), dict):
93 | print("{:30} {}".format(a, getattr(self, a)))
94 |
95 | if a == ("param"):
96 | print(a)
97 | for k, v in getattr(self, a).items():
98 | print(" {:27} {}".format(k, v))
99 |
100 | print("\n")
--------------------------------------------------------------------------------
/utils/icnet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/hellochick/ICNet-tensorflow/90a85c4e8b2da241128f6ddc0938ab5c4336a309/utils/icnet.png
--------------------------------------------------------------------------------
/utils/image_reader.py:
--------------------------------------------------------------------------------
1 | import os
2 | import numpy as np
3 | import tensorflow as tf
4 | import glob
5 | import cv2
6 |
7 | def read_labeled_image_list(data_dir, data_list):
8 | f = open(data_list, 'r')
9 |
10 | images = []
11 | masks = []
12 | for line in f:
13 | try:
14 | image, mask = line[:-1].split(' ')
15 | except ValueError: # Adhoc for test.
16 | image = mask = line.strip("\n")
17 |
18 | image = os.path.join(data_dir, image)
19 | mask = os.path.join(data_dir, mask)
20 | mask = mask.strip()
21 |
22 | if not tf.gfile.Exists(image):
23 | raise ValueError('Failed to find file: ' + image)
24 |
25 | if not tf.gfile.Exists(mask):
26 | raise ValueError('Failed to find file: ' + mask)
27 |
28 | images.append(image)
29 | masks.append(mask)
30 |
31 | return images, masks
32 |
33 | def prepare_label(input_batch, new_size, num_classes, one_hot=True):
34 | with tf.name_scope('label_encode'):
35 | input_batch = tf.image.resize_nearest_neighbor(input_batch, new_size) # as labels are integer numbers, need to use NN interp.
36 | input_batch = tf.squeeze(input_batch, axis=[3]) # reducing the channel dimension.
37 | if one_hot:
38 | input_batch = tf.one_hot(input_batch, depth=num_classes)
39 |
40 | return input_batch
41 |
42 | def _extract_mean(img, img_mean, swap_channel=False):
43 | # swap channel and extract mean
44 |
45 | if swap_channel:
46 | img_r, img_g, img_b = tf.split(axis=2, num_or_size_splits=3, value=img)
47 | img = tf.cast(tf.concat(axis=2, values=[img_b, img_g, img_r]), dtype=tf.float32)
48 |
49 | img -= img_mean
50 |
51 | return img
52 |
53 | def _parse_function(image_filename, label_filename, img_mean):
54 | img_contents = tf.read_file(image_filename)
55 | label_contents = tf.read_file(label_filename)
56 |
57 | # Decode image & label
58 | img = tf.image.decode_jpeg(img_contents, channels=3)
59 | label = tf.image.decode_png(label_contents, channels=1)
60 |
61 | # swap channel and extract mean
62 | img = _extract_mean(img, img_mean, swap_channel=True)
63 |
64 | return img, label
65 |
66 | def _image_mirroring(img, label):
67 | distort_left_right_random = tf.random_uniform([1], 0, 1.0, dtype=tf.float32)[0]
68 | mirror = tf.less(tf.stack([1.0, distort_left_right_random, 1.0]), 0.5)
69 | mirror = tf.boolean_mask([0, 1, 2], mirror)
70 | img = tf.reverse(img, mirror)
71 | label = tf.reverse(label, mirror)
72 |
73 | return img, label
74 |
75 | def _image_scaling(img, label):
76 | scale = tf.random_uniform([1], minval=0.5, maxval=2.0, dtype=tf.float32, seed=None)
77 | h_new = tf.to_int32(tf.multiply(tf.to_float(tf.shape(img)[0]), scale))
78 | w_new = tf.to_int32(tf.multiply(tf.to_float(tf.shape(img)[1]), scale))
79 | new_shape = tf.squeeze(tf.stack([h_new, w_new]), axis=[1])
80 | img = tf.image.resize_images(img, new_shape)
81 | label = tf.image.resize_nearest_neighbor(tf.expand_dims(label, 0), new_shape)
82 | label = tf.squeeze(label, axis=[0])
83 |
84 | return img, label
85 |
86 | def _random_crop_and_pad_image_and_labels(image, label, crop_h, crop_w, ignore_label):
87 | label = tf.cast(label, dtype=tf.float32)
88 | label = label - ignore_label # Needs to be subtracted and later added due to 0 padding.
89 | combined = tf.concat(axis=2, values=[image, label])
90 | image_shape = tf.shape(image)
91 | combined_pad = tf.image.pad_to_bounding_box(
92 | combined,
93 | 0,
94 | 0,
95 | tf.maximum(crop_h, image_shape[0]),
96 | tf.maximum(crop_w, image_shape[1]))
97 |
98 | last_image_dim = tf.shape(image)[-1]
99 | last_label_dim = tf.shape(label)[-1]
100 | combined_crop = tf.random_crop(combined_pad, [crop_h, crop_w, 4])
101 | img_crop = combined_crop[:, :, :last_image_dim]
102 | label_crop = combined_crop[:, :, last_image_dim:]
103 | label_crop = label_crop + ignore_label
104 | label_crop = tf.cast(label_crop, dtype=tf.uint8)
105 |
106 | # Set static shape so that tensorflow knows shape at compile time.
107 | img_crop.set_shape((crop_h, crop_w, 3))
108 | label_crop.set_shape((crop_h, crop_w, 1))
109 |
110 | return img_crop, label_crop
111 |
112 | def _check_input(img):
113 | ori_h, ori_w = img.get_shape().as_list()[1:3]
114 |
115 | if ori_h % 32 != 0 or ori_w % 32 != 0:
116 | new_h = (int(ori_h/32) + 1) * 32
117 | new_w = (int(ori_w/32) + 1) * 32
118 | shape = [new_h, new_w]
119 |
120 | img = tf.image.pad_to_bounding_box(img, 0, 0, new_h, new_w)
121 |
122 | print('Image shape cannot divided by 32, padding to ({0}, {1})'.format(new_h, new_w))
123 | else:
124 | shape = [ori_h, ori_w]
125 |
126 | return img, shape
127 |
128 | def _infer_preprocess(img, swap_channel=False):
129 | o_shape = img.shape[0:2]
130 |
131 | img = _extract_mean(img, swap_channel)
132 | img = tf.expand_dims(img, axis=0)
133 | img, n_shape = _check_input(img)
134 |
135 | return img, o_shape, n_shape
136 |
137 | def _eval_preprocess(img, label, shape, dataset):
138 | if dataset == 'cityscapes':
139 | img = tf.image.pad_to_bounding_box(img, 0, 0, shape[0], shape[1])
140 | img.set_shape([shape[0], shape[1], 3])
141 | else:
142 | img = tf.image.resize_images(img, shape, align_corners=True)
143 |
144 | return img, label
145 |
146 | class ImageReader(object):
147 | '''
148 | Generic ImageReader which reads images and corresponding segmentation masks
149 | from the disk, and enqueues them into a TensorFlow queue using tf.Dataset API.
150 | '''
151 |
152 | def __init__(self, cfg, img_path=None, mode='eval'):
153 | if mode == 'train' or mode == 'eval':
154 | self.image_list, self.label_list = read_labeled_image_list(cfg.param['data_dir'], cfg.param[mode+'_list'])
155 | print(cfg.param[mode+'_list'])
156 | self.dataset = self.create_tf_dataset(cfg)
157 |
158 | self.next_image, self.next_label = self.dataset.make_one_shot_iterator().get_next()
159 |
160 | def create_tf_dataset(self, cfg):
161 | dataset = tf.data.Dataset.from_tensor_slices((self.image_list, self.label_list))
162 | dataset = dataset.map(lambda x, y: _parse_function(x, y, cfg.IMG_MEAN), num_parallel_calls=cfg.N_WORKERS)
163 |
164 | if cfg.is_training: # Training phase
165 | h, w = cfg.TRAINING_SIZE
166 |
167 | if cfg.random_scale:
168 | dataset = dataset.map(_image_scaling, num_parallel_calls=cfg.N_WORKERS)
169 | if cfg.random_mirror:
170 | dataset = dataset.map(_image_mirroring, num_parallel_calls=cfg.N_WORKERS)
171 |
172 | dataset = dataset.map(lambda x, y:
173 | _random_crop_and_pad_image_and_labels(x, y, h, w, cfg.param['ignore_label']),
174 | num_parallel_calls=cfg.N_WORKERS)
175 |
176 | dataset = dataset.shuffle(buffer_size=500)
177 | dataset = dataset.batch(cfg.BATCH_SIZE, drop_remainder=True)
178 | dataset = dataset.repeat()
179 |
180 | else: # Evaluation phase
181 | dataset = dataset.map(lambda x, y:
182 | _eval_preprocess(x, y, cfg.param['eval_size'], cfg.dataset),
183 | num_parallel_calls=cfg.N_WORKERS)
184 | dataset = dataset.batch(1)
185 |
186 | return dataset
187 |
188 |
189 |
190 |
--------------------------------------------------------------------------------
/utils/visualize.py:
--------------------------------------------------------------------------------
1 | import scipy.io as sio
2 | import numpy as np
3 | import tensorflow as tf
4 |
5 | label_colours = [[128, 64, 128], [244, 35, 231], [69, 69, 69]
6 | # 0 = road, 1 = sidewalk, 2 = building
7 | ,[102, 102, 156], [190, 153, 153], [153, 153, 153]
8 | # 3 = wall, 4 = fence, 5 = pole
9 | ,[250, 170, 29], [219, 219, 0], [106, 142, 35]
10 | # 6 = traffic light, 7 = traffic sign, 8 = vegetation
11 | ,[152, 250, 152], [69, 129, 180], [219, 19, 60]
12 | # 9 = terrain, 10 = sky, 11 = person
13 | ,[255, 0, 0], [0, 0, 142], [0, 0, 69]
14 | # 12 = rider, 13 = car, 14 = truck
15 | ,[0, 60, 100], [0, 79, 100], [0, 0, 230]
16 | # 15 = bus, 16 = train, 17 = motocycle
17 | ,[119, 10, 32]]
18 | # 18 = bicycle
19 |
20 | matfn = './utils/color150.mat'
21 | def read_labelcolours(matfn):
22 | mat = sio.loadmat(matfn)
23 | color_table = mat['colors']
24 | shape = color_table.shape
25 | color_list = [tuple(color_table[i]) for i in range(shape[0])]
26 |
27 | return color_list
28 |
29 | def decode_labels(mask, img_shape, num_classes):
30 | if num_classes == 150:
31 | color_table = read_labelcolours(matfn)
32 | else:
33 | color_table = label_colours
34 |
35 | color_mat = tf.constant(color_table, dtype=tf.float32)
36 | onehot_output = tf.one_hot(mask, depth=num_classes)
37 | onehot_output = tf.reshape(onehot_output, (-1, num_classes))
38 | pred = tf.matmul(onehot_output, color_mat)
39 | pred = tf.reshape(pred, (1, img_shape[0], img_shape[1], 3))
40 |
41 | return pred
42 |
43 | def prepare_label(input_batch, new_size, num_classes, one_hot=True):
44 | with tf.name_scope('label_encode'):
45 | input_batch = tf.image.resize_nearest_neighbor(input_batch, new_size) # as labels are integer numbers, need to use NN interp.
46 | input_batch = tf.squeeze(input_batch, squeeze_dims=[3]) # reducing the channel dimension.
47 | if one_hot:
48 | input_batch = tf.one_hot(input_batch, depth=num_classes)
49 |
50 | return input_batch
51 |
--------------------------------------------------------------------------------