├── .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 | [![HitCount](http://hits.dwyl.com/hellochick/ICNet-tensorflow.svg)](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 | ![](./utils/icnet.png) 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 | ![](./data/output/vis_im1.png) 64 | ![](./data/output/vis_im2.png) 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 | ![](./data/output/my_own_image.png) 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 | --------------------------------------------------------------------------------