├── .gitignore
├── LICENSE
├── README.md
├── create_pascal_tf_record.py
├── dataset
├── sample_images_list.txt
├── test.txt
├── train.txt
└── val.txt
├── deeplab_model.py
├── evaluate.py
├── export_inference_graph.py
├── images
├── tensorboard_images.png
└── tensorboard_miou.png
├── inference.py
├── train.py
└── utils
├── __init__.py
├── dataset_util.py
└── preprocessing.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 |
28 | # PyInstaller
29 | # Usually these files are written by a python script from a template
30 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
31 | *.manifest
32 | *.spec
33 |
34 | # Installer logs
35 | pip-log.txt
36 | pip-delete-this-directory.txt
37 |
38 | # Unit test / coverage reports
39 | htmlcov/
40 | .tox/
41 | .coverage
42 | .coverage.*
43 | .cache
44 | nosetests.xml
45 | coverage.xml
46 | *.cover
47 | .hypothesis/
48 |
49 | # Translations
50 | *.mo
51 | *.pot
52 |
53 | # Django stuff:
54 | *.log
55 | local_settings.py
56 |
57 | # Flask stuff:
58 | instance/
59 | .webassets-cache
60 |
61 | # Scrapy stuff:
62 | .scrapy
63 |
64 | # Sphinx documentation
65 | docs/_build/
66 |
67 | # PyBuilder
68 | target/
69 |
70 | # Jupyter Notebook
71 | .ipynb_checkpoints
72 |
73 | # pyenv
74 | .python-version
75 |
76 | # celery beat schedule file
77 | celerybeat-schedule
78 |
79 | # SageMath parsed files
80 | *.sage.py
81 |
82 | # dotenv
83 | .env
84 |
85 | # virtualenv
86 | .venv
87 | venv/
88 | ENV/
89 |
90 | # Spyder project settings
91 | .spyderproject
92 | .spyproject
93 |
94 | # Rope project settings
95 | .ropeproject
96 |
97 | # mkdocs documentation
98 | /site
99 |
100 | # mypy
101 | .mypy_cache/
102 |
103 | # PyCharm
104 | .idea
105 |
106 | # dataset
107 | dataset/VOCdevkit
108 | ini_checkpoints
109 | model
110 | *.record
111 | models
112 | dataset/inference_output/
113 | .DS_Store
114 | dataset/export_output
115 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Riei Ishizeki
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # DeepLab-v3 Semantic Segmentation in TensorFlow
2 |
3 | This repo attempts to reproduce [DeepLabv3](https://arxiv.org/abs/1706.05587) in
4 | TensorFlow for semantic image segmentation on the
5 | [PASCAL VOC dataset](http://host.robots.ox.ac.uk/pascal/VOC/).
6 | The implementation is largely based on
7 | [DrSleep's DeepLab v2 implemantation](https://github.com/DrSleep/tensorflow-deeplab-resnet)
8 | and
9 | [tensorflow models Resnet implementation](https://github.com/tensorflow/models/tree/master/official/resnet).
10 |
11 |
12 | ## Setup
13 | Please install latest version of TensorFlow (r1.6) and use Python 3.
14 | - Download and extract
15 | [PASCAL VOC training/validation data](http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar)
16 | (2GB tar file), specifying the location with the `--data_dir`.
17 | - Download and extract
18 | [augmented segmentation data](https://www.dropbox.com/s/oeu149j8qtbs1x0/SegmentationClassAug.zip?dl=0)
19 | (Thanks to DrSleep), specifying the location with `--data_dir` and `--label_data_dir`
20 | (namely, `$data_dir/$label_data_dir`).
21 | - For inference the trained model with `76.42%` mIoU on the Pascal VOC 2012 validation dataset
22 | is available
23 | [here](https://www.dropbox.com/s/gzwb0d6ydpfoxoa/deeplabv3_ver1.tar.gz?dl=0). Download and extract to
24 | `--model_dir`.
25 | - For training, you need to download and extract
26 | [pre-trained Resnet v2 101 model](http://download.tensorflow.org/models/resnet_v2_101_2017_04_14.tar.gz)
27 | from [slim](https://github.com/tensorflow/models/tree/master/research/slim)
28 | specifying the location with `--pre_trained_model`.
29 |
30 | ## Training
31 | For training model, you first need to convert original data to
32 | the TensorFlow TFRecord format. This enables to accelerate training seep.
33 | ```bash
34 | python create_pascal_tf_record.py --data_dir DATA_DIR \
35 | --image_data_dir IMAGE_DATA_DIR \
36 | --label_data_dir LABEL_DATA_DIR
37 | ```
38 | Once you created TFrecord for PASCAL VOC training and validation deta,
39 | you can start training model as follow:
40 | ```bash
41 | python train.py --model_dir MODEL_DIR --pre_trained_model PRE_TRAINED_MODEL
42 | ```
43 | Here, `--pre_trained_model` contains the pre-trained Resnet model, whereas
44 | `--model_dir` contains the trained DeepLabv3 checkpoints.
45 | If `--model_dir` contains the valid checkpoints, the model is trained from the
46 | specified checkpoint in `--model_dir`.
47 |
48 | You can see other options with the following command:
49 | ```bash
50 | python train.py --help
51 | ```
52 |
53 |
54 |
55 |
56 |
57 | The training process can be visualized with Tensor Board as follow:
58 | ```bash
59 | tensorboard --logdir MODEL_DIR
60 | ```
61 |
62 |
63 |
64 |
65 |
66 |
67 | ## Evaluation
68 | To evaluate how model perform, one can use the following command:
69 | ```bash
70 | python evaluate.py --help
71 | ```
72 | The current best model build by this implementation achieves `76.42%` mIoU on the Pascal VOC 2012
73 | validation dataset.
74 |
75 | | |Method | OS | mIOU |
76 | |:-----:|:------------------------------------:|:---:|:----------:|
77 | | paper | MG(1,2,4)+ASPP(6,12,18)+Image Pooling|16 | 77.21% |
78 | | repo | MG(1,2,4)+ASPP(6,12,18)+Image Pooling|16 | **76.42%** |
79 |
80 | Here, the above model was trained about 9.5 hours (with Tesla V100 and r1.6) with following parameters:
81 | ```bash
82 | python train.py --train_epochs 46 --batch_size 16 --weight_decay 1e-4 --model_dir models/ba=16,wd=1e-4,max_iter=30k --max_iter 30000
83 | ```
84 | You may achieve better performance with the cost of computation with my
85 | [DeepLabV3+ Implementation](https://github.com/rishizek/tensorflow-deeplab-v3-plus).
86 |
87 | ## Inference
88 | To apply semantic segmentation to your images, one can use the following commands:
89 | ```bash
90 | python inference.py --data_dir DATA_DIR --infer_data_list INFER_DATA_LIST --model_dir MODEL_DIR
91 | ```
92 | The trained model is available [here](https://www.dropbox.com/s/gzwb0d6ydpfoxoa/deeplabv3_ver1.tar.gz?dl=0).
93 | One can find the detailed explanation of mask such as meaning of color in
94 | [DrSleep's repo](https://github.com/DrSleep/tensorflow-deeplab-resnet).
95 |
96 | ## TODO:
97 | Pull requests are welcome.
98 | - [x] Freeze batch normalization during training
99 | - [ ] Multi-GPU support
100 | - [ ] Channels first support (Apparently large performance boost on GPU)
101 | - [ ] Model pretrained on MS-COCO
102 | - [ ] Unit test
103 |
104 | ## Acknowledgment
105 | This repo borrows code heavily from
106 | - [DrSleep's DeepLab-ResNet (DeepLabv2)](https://github.com/DrSleep/tensorflow-deeplab-resnet)
107 | - [TensorFlow Official Models](https://github.com/tensorflow/models/tree/master/official)
108 | - [Tensorflow Object Detection API](https://github.com/tensorflow/models/tree/master/research/object_detection)
109 | - [TensorFlow-Slim](https://github.com/tensorflow/models/tree/master/research/slim)
110 | - [TensorFlow](https://github.com/tensorflow/tensorflow)
111 |
--------------------------------------------------------------------------------
/create_pascal_tf_record.py:
--------------------------------------------------------------------------------
1 | """Converts PASCAL dataset to TFRecords file format."""
2 |
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import argparse
8 | import io
9 | import os
10 | import sys
11 |
12 | import PIL.Image
13 | import tensorflow as tf
14 |
15 | from utils import dataset_util
16 |
17 | parser = argparse.ArgumentParser()
18 |
19 | parser.add_argument('--data_dir', type=str, default='./dataset/VOCdevkit/VOC2012',
20 | help='Path to the directory containing the PASCAL VOC data.')
21 |
22 | parser.add_argument('--output_path', type=str, default='./dataset',
23 | help='Path to the directory to create TFRecords outputs.')
24 |
25 | parser.add_argument('--train_data_list', type=str, default='./dataset/train.txt',
26 | help='Path to the file listing the training data.')
27 |
28 | parser.add_argument('--valid_data_list', type=str, default='./dataset/val.txt',
29 | help='Path to the file listing the validation data.')
30 |
31 | parser.add_argument('--image_data_dir', type=str, default='JPEGImages',
32 | help='The directory containing the image data.')
33 |
34 | parser.add_argument('--label_data_dir', type=str, default='SegmentationClassAug',
35 | help='The directory containing the augmented label data.')
36 |
37 |
38 | def dict_to_tf_example(image_path,
39 | label_path):
40 | """Convert image and label to tf.Example proto.
41 |
42 | Args:
43 | image_path: Path to a single PASCAL image.
44 | label_path: Path to its corresponding label.
45 |
46 | Returns:
47 | example: The converted tf.Example.
48 |
49 | Raises:
50 | ValueError: if the image pointed to by image_path is not a valid JPEG or
51 | if the label pointed to by label_path is not a valid PNG or
52 | if the size of image does not match with that of label.
53 | """
54 | with tf.gfile.GFile(image_path, 'rb') as fid:
55 | encoded_jpg = fid.read()
56 | encoded_jpg_io = io.BytesIO(encoded_jpg)
57 | image = PIL.Image.open(encoded_jpg_io)
58 | if image.format != 'JPEG':
59 | raise ValueError('Image format not JPEG')
60 |
61 | with tf.gfile.GFile(label_path, 'rb') as fid:
62 | encoded_label = fid.read()
63 | encoded_label_io = io.BytesIO(encoded_label)
64 | label = PIL.Image.open(encoded_label_io)
65 | if label.format != 'PNG':
66 | raise ValueError('Label format not PNG')
67 |
68 | if image.size != label.size:
69 | raise ValueError('The size of image does not match with that of label.')
70 |
71 | width, height = image.size
72 |
73 | example = tf.train.Example(features=tf.train.Features(feature={
74 | 'image/height': dataset_util.int64_feature(height),
75 | 'image/width': dataset_util.int64_feature(width),
76 | 'image/encoded': dataset_util.bytes_feature(encoded_jpg),
77 | 'image/format': dataset_util.bytes_feature('jpeg'.encode('utf8')),
78 | 'label/encoded': dataset_util.bytes_feature(encoded_label),
79 | 'label/format': dataset_util.bytes_feature('png'.encode('utf8')),
80 | }))
81 | return example
82 |
83 |
84 | def create_tf_record(output_filename,
85 | image_dir,
86 | label_dir,
87 | examples):
88 | """Creates a TFRecord file from examples.
89 |
90 | Args:
91 | output_filename: Path to where output file is saved.
92 | image_dir: Directory where image files are stored.
93 | label_dir: Directory where label files are stored.
94 | examples: Examples to parse and save to tf record.
95 | """
96 | writer = tf.python_io.TFRecordWriter(output_filename)
97 | for idx, example in enumerate(examples):
98 | if idx % 500 == 0:
99 | tf.logging.info('On image %d of %d', idx, len(examples))
100 | image_path = os.path.join(image_dir, example + '.jpg')
101 | label_path = os.path.join(label_dir, example + '.png')
102 |
103 | if not os.path.exists(image_path):
104 | tf.logging.warning('Could not find %s, ignoring example.', image_path)
105 | continue
106 | elif not os.path.exists(label_path):
107 | tf.logging.warning('Could not find %s, ignoring example.', label_path)
108 | continue
109 |
110 | try:
111 | tf_example = dict_to_tf_example(image_path, label_path)
112 | writer.write(tf_example.SerializeToString())
113 | except ValueError:
114 | tf.logging.warning('Invalid example: %s, ignoring.', example)
115 |
116 | writer.close()
117 |
118 |
119 | def main(unused_argv):
120 | if not os.path.exists(FLAGS.output_path):
121 | os.makedirs(FLAGS.output_path)
122 |
123 | tf.logging.info("Reading from VOC dataset")
124 | image_dir = os.path.join(FLAGS.data_dir, FLAGS.image_data_dir)
125 | label_dir = os.path.join(FLAGS.data_dir, FLAGS.label_data_dir)
126 |
127 | if not os.path.isdir(label_dir):
128 | raise ValueError("Missing Augmentation label directory. "
129 | "You may download the augmented labels from the link (Thanks to DrSleep): "
130 | "https://www.dropbox.com/s/oeu149j8qtbs1x0/SegmentationClassAug.zip")
131 | train_examples = dataset_util.read_examples_list(FLAGS.train_data_list)
132 | val_examples = dataset_util.read_examples_list(FLAGS.valid_data_list)
133 |
134 | train_output_path = os.path.join(FLAGS.output_path, 'voc_train.record')
135 | val_output_path = os.path.join(FLAGS.output_path, 'voc_val.record')
136 |
137 | create_tf_record(train_output_path, image_dir, label_dir, train_examples)
138 | create_tf_record(val_output_path, image_dir, label_dir, val_examples)
139 |
140 |
141 | if __name__ == '__main__':
142 | tf.logging.set_verbosity(tf.logging.INFO)
143 | FLAGS, unparsed = parser.parse_known_args()
144 | tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
145 |
--------------------------------------------------------------------------------
/dataset/sample_images_list.txt:
--------------------------------------------------------------------------------
1 | 2007_000033.jpg
2 | 2007_000042.jpg
3 | 2007_000061.jpg
4 | 2007_000123.jpg
5 | 2007_000129.jpg
6 | 2007_000175.jpg
7 | 2007_000187.jpg
8 | 2007_000323.jpg
--------------------------------------------------------------------------------
/dataset/test.txt:
--------------------------------------------------------------------------------
1 | 2008_000006
2 | 2008_000011
3 | 2008_000012
4 | 2008_000018
5 | 2008_000024
6 | 2008_000030
7 | 2008_000031
8 | 2008_000046
9 | 2008_000047
10 | 2008_000048
11 | 2008_000057
12 | 2008_000058
13 | 2008_000068
14 | 2008_000072
15 | 2008_000079
16 | 2008_000081
17 | 2008_000083
18 | 2008_000088
19 | 2008_000094
20 | 2008_000101
21 | 2008_000104
22 | 2008_000106
23 | 2008_000108
24 | 2008_000110
25 | 2008_000111
26 | 2008_000126
27 | 2008_000127
28 | 2008_000129
29 | 2008_000130
30 | 2008_000135
31 | 2008_000150
32 | 2008_000152
33 | 2008_000156
34 | 2008_000159
35 | 2008_000160
36 | 2008_000161
37 | 2008_000166
38 | 2008_000167
39 | 2008_000168
40 | 2008_000169
41 | 2008_000171
42 | 2008_000175
43 | 2008_000178
44 | 2008_000186
45 | 2008_000198
46 | 2008_000206
47 | 2008_000208
48 | 2008_000209
49 | 2008_000211
50 | 2008_000220
51 | 2008_000224
52 | 2008_000230
53 | 2008_000240
54 | 2008_000248
55 | 2008_000249
56 | 2008_000250
57 | 2008_000256
58 | 2008_000279
59 | 2008_000282
60 | 2008_000285
61 | 2008_000286
62 | 2008_000296
63 | 2008_000300
64 | 2008_000322
65 | 2008_000324
66 | 2008_000337
67 | 2008_000366
68 | 2008_000369
69 | 2008_000377
70 | 2008_000384
71 | 2008_000390
72 | 2008_000404
73 | 2008_000411
74 | 2008_000434
75 | 2008_000440
76 | 2008_000460
77 | 2008_000467
78 | 2008_000478
79 | 2008_000485
80 | 2008_000487
81 | 2008_000490
82 | 2008_000503
83 | 2008_000504
84 | 2008_000507
85 | 2008_000513
86 | 2008_000523
87 | 2008_000529
88 | 2008_000556
89 | 2008_000565
90 | 2008_000580
91 | 2008_000590
92 | 2008_000596
93 | 2008_000597
94 | 2008_000600
95 | 2008_000603
96 | 2008_000604
97 | 2008_000612
98 | 2008_000617
99 | 2008_000621
100 | 2008_000627
101 | 2008_000633
102 | 2008_000643
103 | 2008_000644
104 | 2008_000649
105 | 2008_000651
106 | 2008_000664
107 | 2008_000665
108 | 2008_000680
109 | 2008_000681
110 | 2008_000684
111 | 2008_000685
112 | 2008_000688
113 | 2008_000693
114 | 2008_000698
115 | 2008_000707
116 | 2008_000709
117 | 2008_000712
118 | 2008_000747
119 | 2008_000751
120 | 2008_000754
121 | 2008_000762
122 | 2008_000767
123 | 2008_000768
124 | 2008_000773
125 | 2008_000774
126 | 2008_000779
127 | 2008_000797
128 | 2008_000813
129 | 2008_000816
130 | 2008_000846
131 | 2008_000866
132 | 2008_000871
133 | 2008_000872
134 | 2008_000891
135 | 2008_000892
136 | 2008_000894
137 | 2008_000896
138 | 2008_000898
139 | 2008_000909
140 | 2008_000913
141 | 2008_000920
142 | 2008_000933
143 | 2008_000935
144 | 2008_000937
145 | 2008_000938
146 | 2008_000954
147 | 2008_000958
148 | 2008_000963
149 | 2008_000967
150 | 2008_000974
151 | 2008_000986
152 | 2008_000994
153 | 2008_000995
154 | 2008_001008
155 | 2008_001010
156 | 2008_001014
157 | 2008_001016
158 | 2008_001025
159 | 2008_001029
160 | 2008_001037
161 | 2008_001059
162 | 2008_001061
163 | 2008_001072
164 | 2008_001124
165 | 2008_001126
166 | 2008_001131
167 | 2008_001138
168 | 2008_001144
169 | 2008_001151
170 | 2008_001156
171 | 2008_001179
172 | 2008_001181
173 | 2008_001184
174 | 2008_001186
175 | 2008_001197
176 | 2008_001207
177 | 2008_001212
178 | 2008_001233
179 | 2008_001234
180 | 2008_001258
181 | 2008_001268
182 | 2008_001279
183 | 2008_001281
184 | 2008_001288
185 | 2008_001291
186 | 2008_001298
187 | 2008_001309
188 | 2008_001315
189 | 2008_001316
190 | 2008_001319
191 | 2008_001327
192 | 2008_001328
193 | 2008_001332
194 | 2008_001341
195 | 2008_001347
196 | 2008_001355
197 | 2008_001378
198 | 2008_001386
199 | 2008_001400
200 | 2008_001409
201 | 2008_001411
202 | 2008_001416
203 | 2008_001418
204 | 2008_001435
205 | 2008_001459
206 | 2008_001469
207 | 2008_001474
208 | 2008_001477
209 | 2008_001483
210 | 2008_001484
211 | 2008_001485
212 | 2008_001496
213 | 2008_001507
214 | 2008_001511
215 | 2008_001519
216 | 2008_001557
217 | 2008_001567
218 | 2008_001570
219 | 2008_001571
220 | 2008_001572
221 | 2008_001579
222 | 2008_001587
223 | 2008_001608
224 | 2008_001611
225 | 2008_001614
226 | 2008_001621
227 | 2008_001639
228 | 2008_001658
229 | 2008_001678
230 | 2008_001700
231 | 2008_001713
232 | 2008_001720
233 | 2008_001755
234 | 2008_001779
235 | 2008_001785
236 | 2008_001793
237 | 2008_001794
238 | 2008_001803
239 | 2008_001818
240 | 2008_001848
241 | 2008_001855
242 | 2008_001857
243 | 2008_001861
244 | 2008_001875
245 | 2008_001878
246 | 2008_001886
247 | 2008_001897
248 | 2008_001916
249 | 2008_001925
250 | 2008_001949
251 | 2008_001953
252 | 2008_001972
253 | 2008_001999
254 | 2008_002027
255 | 2008_002040
256 | 2008_002057
257 | 2008_002070
258 | 2008_002075
259 | 2008_002095
260 | 2008_002104
261 | 2008_002105
262 | 2008_002106
263 | 2008_002136
264 | 2008_002137
265 | 2008_002147
266 | 2008_002149
267 | 2008_002163
268 | 2008_002173
269 | 2008_002174
270 | 2008_002184
271 | 2008_002186
272 | 2008_002188
273 | 2008_002190
274 | 2008_002203
275 | 2008_002211
276 | 2008_002217
277 | 2008_002228
278 | 2008_002233
279 | 2008_002246
280 | 2008_002257
281 | 2008_002261
282 | 2008_002285
283 | 2008_002287
284 | 2008_002295
285 | 2008_002303
286 | 2008_002306
287 | 2008_002309
288 | 2008_002310
289 | 2008_002318
290 | 2008_002320
291 | 2008_002332
292 | 2008_002337
293 | 2008_002345
294 | 2008_002348
295 | 2008_002352
296 | 2008_002360
297 | 2008_002381
298 | 2008_002387
299 | 2008_002388
300 | 2008_002393
301 | 2008_002406
302 | 2008_002440
303 | 2008_002455
304 | 2008_002460
305 | 2008_002462
306 | 2008_002480
307 | 2008_002518
308 | 2008_002525
309 | 2008_002535
310 | 2008_002544
311 | 2008_002553
312 | 2008_002569
313 | 2008_002572
314 | 2008_002587
315 | 2008_002635
316 | 2008_002655
317 | 2008_002695
318 | 2008_002702
319 | 2008_002706
320 | 2008_002707
321 | 2008_002722
322 | 2008_002745
323 | 2008_002757
324 | 2008_002779
325 | 2008_002805
326 | 2008_002871
327 | 2008_002895
328 | 2008_002905
329 | 2008_002923
330 | 2008_002927
331 | 2008_002939
332 | 2008_002941
333 | 2008_002962
334 | 2008_002975
335 | 2008_003000
336 | 2008_003031
337 | 2008_003038
338 | 2008_003042
339 | 2008_003069
340 | 2008_003070
341 | 2008_003115
342 | 2008_003116
343 | 2008_003130
344 | 2008_003137
345 | 2008_003138
346 | 2008_003139
347 | 2008_003165
348 | 2008_003171
349 | 2008_003176
350 | 2008_003192
351 | 2008_003194
352 | 2008_003195
353 | 2008_003198
354 | 2008_003227
355 | 2008_003247
356 | 2008_003262
357 | 2008_003298
358 | 2008_003299
359 | 2008_003307
360 | 2008_003337
361 | 2008_003353
362 | 2008_003355
363 | 2008_003363
364 | 2008_003383
365 | 2008_003389
366 | 2008_003392
367 | 2008_003399
368 | 2008_003436
369 | 2008_003457
370 | 2008_003465
371 | 2008_003481
372 | 2008_003539
373 | 2008_003548
374 | 2008_003550
375 | 2008_003567
376 | 2008_003568
377 | 2008_003606
378 | 2008_003615
379 | 2008_003654
380 | 2008_003670
381 | 2008_003700
382 | 2008_003705
383 | 2008_003727
384 | 2008_003731
385 | 2008_003734
386 | 2008_003760
387 | 2008_003804
388 | 2008_003807
389 | 2008_003810
390 | 2008_003822
391 | 2008_003833
392 | 2008_003877
393 | 2008_003879
394 | 2008_003895
395 | 2008_003901
396 | 2008_003903
397 | 2008_003911
398 | 2008_003919
399 | 2008_003927
400 | 2008_003937
401 | 2008_003946
402 | 2008_003950
403 | 2008_003955
404 | 2008_003981
405 | 2008_003991
406 | 2008_004009
407 | 2008_004039
408 | 2008_004052
409 | 2008_004063
410 | 2008_004070
411 | 2008_004078
412 | 2008_004104
413 | 2008_004139
414 | 2008_004177
415 | 2008_004181
416 | 2008_004200
417 | 2008_004219
418 | 2008_004236
419 | 2008_004250
420 | 2008_004266
421 | 2008_004299
422 | 2008_004320
423 | 2008_004334
424 | 2008_004343
425 | 2008_004349
426 | 2008_004366
427 | 2008_004386
428 | 2008_004401
429 | 2008_004423
430 | 2008_004448
431 | 2008_004481
432 | 2008_004516
433 | 2008_004536
434 | 2008_004582
435 | 2008_004609
436 | 2008_004638
437 | 2008_004642
438 | 2008_004644
439 | 2008_004669
440 | 2008_004673
441 | 2008_004691
442 | 2008_004693
443 | 2008_004709
444 | 2008_004715
445 | 2008_004757
446 | 2008_004775
447 | 2008_004782
448 | 2008_004785
449 | 2008_004798
450 | 2008_004848
451 | 2008_004861
452 | 2008_004870
453 | 2008_004877
454 | 2008_004884
455 | 2008_004891
456 | 2008_004901
457 | 2008_004919
458 | 2008_005058
459 | 2008_005069
460 | 2008_005086
461 | 2008_005087
462 | 2008_005112
463 | 2008_005113
464 | 2008_005118
465 | 2008_005128
466 | 2008_005129
467 | 2008_005153
468 | 2008_005161
469 | 2008_005162
470 | 2008_005165
471 | 2008_005187
472 | 2008_005227
473 | 2008_005308
474 | 2008_005318
475 | 2008_005320
476 | 2008_005351
477 | 2008_005372
478 | 2008_005383
479 | 2008_005391
480 | 2008_005407
481 | 2008_005420
482 | 2008_005440
483 | 2008_005487
484 | 2008_005493
485 | 2008_005520
486 | 2008_005551
487 | 2008_005556
488 | 2008_005576
489 | 2008_005578
490 | 2008_005594
491 | 2008_005619
492 | 2008_005629
493 | 2008_005644
494 | 2008_005645
495 | 2008_005651
496 | 2008_005661
497 | 2008_005662
498 | 2008_005667
499 | 2008_005694
500 | 2008_005697
501 | 2008_005709
502 | 2008_005710
503 | 2008_005733
504 | 2008_005749
505 | 2008_005753
506 | 2008_005771
507 | 2008_005781
508 | 2008_005793
509 | 2008_005802
510 | 2008_005833
511 | 2008_005844
512 | 2008_005908
513 | 2008_005931
514 | 2008_005952
515 | 2008_006016
516 | 2008_006030
517 | 2008_006033
518 | 2008_006054
519 | 2008_006073
520 | 2008_006091
521 | 2008_006142
522 | 2008_006150
523 | 2008_006206
524 | 2008_006217
525 | 2008_006264
526 | 2008_006283
527 | 2008_006308
528 | 2008_006313
529 | 2008_006333
530 | 2008_006343
531 | 2008_006381
532 | 2008_006391
533 | 2008_006423
534 | 2008_006428
535 | 2008_006440
536 | 2008_006444
537 | 2008_006473
538 | 2008_006505
539 | 2008_006531
540 | 2008_006560
541 | 2008_006571
542 | 2008_006582
543 | 2008_006594
544 | 2008_006601
545 | 2008_006633
546 | 2008_006653
547 | 2008_006678
548 | 2008_006755
549 | 2008_006772
550 | 2008_006788
551 | 2008_006799
552 | 2008_006809
553 | 2008_006838
554 | 2008_006845
555 | 2008_006852
556 | 2008_006894
557 | 2008_006905
558 | 2008_006947
559 | 2008_006983
560 | 2008_007049
561 | 2008_007065
562 | 2008_007068
563 | 2008_007111
564 | 2008_007148
565 | 2008_007159
566 | 2008_007193
567 | 2008_007228
568 | 2008_007235
569 | 2008_007249
570 | 2008_007255
571 | 2008_007268
572 | 2008_007275
573 | 2008_007292
574 | 2008_007299
575 | 2008_007306
576 | 2008_007316
577 | 2008_007400
578 | 2008_007401
579 | 2008_007419
580 | 2008_007437
581 | 2008_007483
582 | 2008_007487
583 | 2008_007520
584 | 2008_007551
585 | 2008_007603
586 | 2008_007616
587 | 2008_007654
588 | 2008_007663
589 | 2008_007708
590 | 2008_007795
591 | 2008_007801
592 | 2008_007859
593 | 2008_007903
594 | 2008_007920
595 | 2008_007926
596 | 2008_008014
597 | 2008_008017
598 | 2008_008060
599 | 2008_008077
600 | 2008_008107
601 | 2008_008108
602 | 2008_008119
603 | 2008_008126
604 | 2008_008133
605 | 2008_008144
606 | 2008_008216
607 | 2008_008244
608 | 2008_008248
609 | 2008_008250
610 | 2008_008260
611 | 2008_008277
612 | 2008_008280
613 | 2008_008290
614 | 2008_008304
615 | 2008_008340
616 | 2008_008371
617 | 2008_008390
618 | 2008_008397
619 | 2008_008409
620 | 2008_008412
621 | 2008_008419
622 | 2008_008454
623 | 2008_008491
624 | 2008_008498
625 | 2008_008565
626 | 2008_008599
627 | 2008_008603
628 | 2008_008631
629 | 2008_008634
630 | 2008_008640
631 | 2008_008646
632 | 2008_008660
633 | 2008_008663
634 | 2008_008664
635 | 2008_008709
636 | 2008_008720
637 | 2008_008747
638 | 2008_008768
639 | 2009_000004
640 | 2009_000019
641 | 2009_000024
642 | 2009_000025
643 | 2009_000053
644 | 2009_000076
645 | 2009_000107
646 | 2009_000110
647 | 2009_000115
648 | 2009_000117
649 | 2009_000175
650 | 2009_000220
651 | 2009_000259
652 | 2009_000275
653 | 2009_000314
654 | 2009_000368
655 | 2009_000373
656 | 2009_000384
657 | 2009_000388
658 | 2009_000423
659 | 2009_000433
660 | 2009_000434
661 | 2009_000458
662 | 2009_000475
663 | 2009_000481
664 | 2009_000495
665 | 2009_000514
666 | 2009_000555
667 | 2009_000556
668 | 2009_000561
669 | 2009_000571
670 | 2009_000581
671 | 2009_000605
672 | 2009_000609
673 | 2009_000644
674 | 2009_000654
675 | 2009_000671
676 | 2009_000733
677 | 2009_000740
678 | 2009_000766
679 | 2009_000775
680 | 2009_000776
681 | 2009_000795
682 | 2009_000850
683 | 2009_000881
684 | 2009_000900
685 | 2009_000914
686 | 2009_000941
687 | 2009_000977
688 | 2009_000984
689 | 2009_000986
690 | 2009_001005
691 | 2009_001015
692 | 2009_001058
693 | 2009_001072
694 | 2009_001087
695 | 2009_001092
696 | 2009_001109
697 | 2009_001114
698 | 2009_001115
699 | 2009_001141
700 | 2009_001174
701 | 2009_001175
702 | 2009_001182
703 | 2009_001222
704 | 2009_001228
705 | 2009_001246
706 | 2009_001262
707 | 2009_001274
708 | 2009_001284
709 | 2009_001297
710 | 2009_001331
711 | 2009_001336
712 | 2009_001337
713 | 2009_001379
714 | 2009_001392
715 | 2009_001451
716 | 2009_001485
717 | 2009_001488
718 | 2009_001497
719 | 2009_001504
720 | 2009_001506
721 | 2009_001573
722 | 2009_001576
723 | 2009_001603
724 | 2009_001613
725 | 2009_001652
726 | 2009_001661
727 | 2009_001668
728 | 2009_001680
729 | 2009_001688
730 | 2009_001697
731 | 2009_001729
732 | 2009_001771
733 | 2009_001785
734 | 2009_001793
735 | 2009_001814
736 | 2009_001866
737 | 2009_001872
738 | 2009_001880
739 | 2009_001883
740 | 2009_001891
741 | 2009_001913
742 | 2009_001938
743 | 2009_001946
744 | 2009_001953
745 | 2009_001969
746 | 2009_001978
747 | 2009_001995
748 | 2009_002007
749 | 2009_002036
750 | 2009_002041
751 | 2009_002049
752 | 2009_002051
753 | 2009_002062
754 | 2009_002063
755 | 2009_002067
756 | 2009_002085
757 | 2009_002092
758 | 2009_002114
759 | 2009_002115
760 | 2009_002142
761 | 2009_002148
762 | 2009_002157
763 | 2009_002181
764 | 2009_002220
765 | 2009_002284
766 | 2009_002287
767 | 2009_002300
768 | 2009_002310
769 | 2009_002315
770 | 2009_002334
771 | 2009_002337
772 | 2009_002354
773 | 2009_002357
774 | 2009_002411
775 | 2009_002426
776 | 2009_002458
777 | 2009_002459
778 | 2009_002461
779 | 2009_002466
780 | 2009_002481
781 | 2009_002483
782 | 2009_002503
783 | 2009_002581
784 | 2009_002583
785 | 2009_002589
786 | 2009_002600
787 | 2009_002601
788 | 2009_002602
789 | 2009_002641
790 | 2009_002646
791 | 2009_002656
792 | 2009_002666
793 | 2009_002720
794 | 2009_002767
795 | 2009_002768
796 | 2009_002794
797 | 2009_002821
798 | 2009_002825
799 | 2009_002839
800 | 2009_002840
801 | 2009_002859
802 | 2009_002860
803 | 2009_002881
804 | 2009_002889
805 | 2009_002892
806 | 2009_002895
807 | 2009_002896
808 | 2009_002900
809 | 2009_002924
810 | 2009_002966
811 | 2009_002973
812 | 2009_002981
813 | 2009_003004
814 | 2009_003021
815 | 2009_003028
816 | 2009_003037
817 | 2009_003038
818 | 2009_003055
819 | 2009_003085
820 | 2009_003100
821 | 2009_003106
822 | 2009_003117
823 | 2009_003139
824 | 2009_003170
825 | 2009_003179
826 | 2009_003184
827 | 2009_003186
828 | 2009_003190
829 | 2009_003221
830 | 2009_003236
831 | 2009_003242
832 | 2009_003244
833 | 2009_003260
834 | 2009_003264
835 | 2009_003274
836 | 2009_003283
837 | 2009_003296
838 | 2009_003332
839 | 2009_003341
840 | 2009_003354
841 | 2009_003370
842 | 2009_003371
843 | 2009_003374
844 | 2009_003391
845 | 2009_003393
846 | 2009_003404
847 | 2009_003405
848 | 2009_003414
849 | 2009_003428
850 | 2009_003470
851 | 2009_003474
852 | 2009_003532
853 | 2009_003536
854 | 2009_003578
855 | 2009_003580
856 | 2009_003620
857 | 2009_003621
858 | 2009_003680
859 | 2009_003699
860 | 2009_003727
861 | 2009_003737
862 | 2009_003780
863 | 2009_003811
864 | 2009_003824
865 | 2009_003831
866 | 2009_003844
867 | 2009_003850
868 | 2009_003851
869 | 2009_003864
870 | 2009_003868
871 | 2009_003869
872 | 2009_003893
873 | 2009_003909
874 | 2009_003924
875 | 2009_003925
876 | 2009_003960
877 | 2009_003979
878 | 2009_003990
879 | 2009_003997
880 | 2009_004006
881 | 2009_004010
882 | 2009_004066
883 | 2009_004077
884 | 2009_004081
885 | 2009_004097
886 | 2009_004098
887 | 2009_004136
888 | 2009_004216
889 | 2009_004220
890 | 2009_004266
891 | 2009_004269
892 | 2009_004286
893 | 2009_004296
894 | 2009_004321
895 | 2009_004342
896 | 2009_004343
897 | 2009_004344
898 | 2009_004385
899 | 2009_004408
900 | 2009_004420
901 | 2009_004441
902 | 2009_004447
903 | 2009_004461
904 | 2009_004467
905 | 2009_004485
906 | 2009_004488
907 | 2009_004516
908 | 2009_004521
909 | 2009_004544
910 | 2009_004596
911 | 2009_004613
912 | 2009_004615
913 | 2009_004618
914 | 2009_004621
915 | 2009_004646
916 | 2009_004659
917 | 2009_004663
918 | 2009_004666
919 | 2009_004691
920 | 2009_004715
921 | 2009_004726
922 | 2009_004753
923 | 2009_004776
924 | 2009_004811
925 | 2009_004814
926 | 2009_004818
927 | 2009_004835
928 | 2009_004863
929 | 2009_004894
930 | 2009_004909
931 | 2009_004928
932 | 2009_004937
933 | 2009_004954
934 | 2009_004966
935 | 2009_004970
936 | 2009_004976
937 | 2009_005004
938 | 2009_005011
939 | 2009_005053
940 | 2009_005072
941 | 2009_005115
942 | 2009_005146
943 | 2009_005151
944 | 2009_005164
945 | 2009_005179
946 | 2009_005224
947 | 2009_005243
948 | 2009_005249
949 | 2009_005252
950 | 2009_005254
951 | 2009_005258
952 | 2009_005264
953 | 2009_005266
954 | 2009_005276
955 | 2009_005290
956 | 2009_005295
957 | 2010_000004
958 | 2010_000005
959 | 2010_000006
960 | 2010_000032
961 | 2010_000062
962 | 2010_000093
963 | 2010_000094
964 | 2010_000161
965 | 2010_000176
966 | 2010_000223
967 | 2010_000226
968 | 2010_000236
969 | 2010_000239
970 | 2010_000287
971 | 2010_000300
972 | 2010_000301
973 | 2010_000328
974 | 2010_000378
975 | 2010_000405
976 | 2010_000407
977 | 2010_000472
978 | 2010_000479
979 | 2010_000491
980 | 2010_000533
981 | 2010_000535
982 | 2010_000542
983 | 2010_000554
984 | 2010_000580
985 | 2010_000594
986 | 2010_000596
987 | 2010_000599
988 | 2010_000606
989 | 2010_000615
990 | 2010_000654
991 | 2010_000659
992 | 2010_000693
993 | 2010_000698
994 | 2010_000730
995 | 2010_000734
996 | 2010_000741
997 | 2010_000755
998 | 2010_000768
999 | 2010_000794
1000 | 2010_000813
1001 | 2010_000817
1002 | 2010_000834
1003 | 2010_000839
1004 | 2010_000848
1005 | 2010_000881
1006 | 2010_000888
1007 | 2010_000900
1008 | 2010_000903
1009 | 2010_000924
1010 | 2010_000946
1011 | 2010_000953
1012 | 2010_000957
1013 | 2010_000967
1014 | 2010_000992
1015 | 2010_000998
1016 | 2010_001053
1017 | 2010_001067
1018 | 2010_001114
1019 | 2010_001132
1020 | 2010_001138
1021 | 2010_001169
1022 | 2010_001171
1023 | 2010_001228
1024 | 2010_001260
1025 | 2010_001268
1026 | 2010_001280
1027 | 2010_001298
1028 | 2010_001302
1029 | 2010_001308
1030 | 2010_001324
1031 | 2010_001332
1032 | 2010_001335
1033 | 2010_001345
1034 | 2010_001346
1035 | 2010_001349
1036 | 2010_001373
1037 | 2010_001381
1038 | 2010_001392
1039 | 2010_001396
1040 | 2010_001420
1041 | 2010_001500
1042 | 2010_001506
1043 | 2010_001521
1044 | 2010_001532
1045 | 2010_001558
1046 | 2010_001598
1047 | 2010_001611
1048 | 2010_001631
1049 | 2010_001639
1050 | 2010_001651
1051 | 2010_001663
1052 | 2010_001664
1053 | 2010_001728
1054 | 2010_001778
1055 | 2010_001861
1056 | 2010_001874
1057 | 2010_001900
1058 | 2010_001905
1059 | 2010_001969
1060 | 2010_002008
1061 | 2010_002014
1062 | 2010_002049
1063 | 2010_002052
1064 | 2010_002091
1065 | 2010_002115
1066 | 2010_002119
1067 | 2010_002134
1068 | 2010_002156
1069 | 2010_002160
1070 | 2010_002186
1071 | 2010_002210
1072 | 2010_002241
1073 | 2010_002252
1074 | 2010_002258
1075 | 2010_002262
1076 | 2010_002273
1077 | 2010_002290
1078 | 2010_002292
1079 | 2010_002347
1080 | 2010_002358
1081 | 2010_002360
1082 | 2010_002367
1083 | 2010_002416
1084 | 2010_002451
1085 | 2010_002481
1086 | 2010_002490
1087 | 2010_002495
1088 | 2010_002588
1089 | 2010_002607
1090 | 2010_002609
1091 | 2010_002610
1092 | 2010_002641
1093 | 2010_002685
1094 | 2010_002699
1095 | 2010_002719
1096 | 2010_002735
1097 | 2010_002751
1098 | 2010_002804
1099 | 2010_002835
1100 | 2010_002852
1101 | 2010_002885
1102 | 2010_002889
1103 | 2010_002904
1104 | 2010_002908
1105 | 2010_002916
1106 | 2010_002974
1107 | 2010_002977
1108 | 2010_003005
1109 | 2010_003021
1110 | 2010_003030
1111 | 2010_003038
1112 | 2010_003046
1113 | 2010_003052
1114 | 2010_003089
1115 | 2010_003110
1116 | 2010_003118
1117 | 2010_003171
1118 | 2010_003217
1119 | 2010_003221
1120 | 2010_003228
1121 | 2010_003243
1122 | 2010_003271
1123 | 2010_003295
1124 | 2010_003306
1125 | 2010_003324
1126 | 2010_003363
1127 | 2010_003382
1128 | 2010_003388
1129 | 2010_003389
1130 | 2010_003392
1131 | 2010_003430
1132 | 2010_003442
1133 | 2010_003459
1134 | 2010_003485
1135 | 2010_003486
1136 | 2010_003500
1137 | 2010_003523
1138 | 2010_003542
1139 | 2010_003552
1140 | 2010_003570
1141 | 2010_003572
1142 | 2010_003586
1143 | 2010_003615
1144 | 2010_003623
1145 | 2010_003657
1146 | 2010_003666
1147 | 2010_003705
1148 | 2010_003710
1149 | 2010_003720
1150 | 2010_003733
1151 | 2010_003750
1152 | 2010_003767
1153 | 2010_003802
1154 | 2010_003809
1155 | 2010_003830
1156 | 2010_003832
1157 | 2010_003836
1158 | 2010_003838
1159 | 2010_003850
1160 | 2010_003867
1161 | 2010_003882
1162 | 2010_003909
1163 | 2010_003922
1164 | 2010_003923
1165 | 2010_003978
1166 | 2010_003989
1167 | 2010_003990
1168 | 2010_004000
1169 | 2010_004003
1170 | 2010_004068
1171 | 2010_004076
1172 | 2010_004117
1173 | 2010_004136
1174 | 2010_004142
1175 | 2010_004195
1176 | 2010_004200
1177 | 2010_004202
1178 | 2010_004232
1179 | 2010_004261
1180 | 2010_004266
1181 | 2010_004273
1182 | 2010_004305
1183 | 2010_004403
1184 | 2010_004433
1185 | 2010_004434
1186 | 2010_004435
1187 | 2010_004438
1188 | 2010_004442
1189 | 2010_004473
1190 | 2010_004482
1191 | 2010_004487
1192 | 2010_004489
1193 | 2010_004512
1194 | 2010_004525
1195 | 2010_004527
1196 | 2010_004532
1197 | 2010_004566
1198 | 2010_004568
1199 | 2010_004579
1200 | 2010_004611
1201 | 2010_004641
1202 | 2010_004688
1203 | 2010_004699
1204 | 2010_004702
1205 | 2010_004716
1206 | 2010_004754
1207 | 2010_004767
1208 | 2010_004776
1209 | 2010_004811
1210 | 2010_004837
1211 | 2010_004839
1212 | 2010_004845
1213 | 2010_004860
1214 | 2010_004867
1215 | 2010_004881
1216 | 2010_004939
1217 | 2010_005001
1218 | 2010_005047
1219 | 2010_005051
1220 | 2010_005091
1221 | 2010_005095
1222 | 2010_005125
1223 | 2010_005140
1224 | 2010_005177
1225 | 2010_005178
1226 | 2010_005194
1227 | 2010_005197
1228 | 2010_005200
1229 | 2010_005205
1230 | 2010_005212
1231 | 2010_005248
1232 | 2010_005294
1233 | 2010_005298
1234 | 2010_005313
1235 | 2010_005324
1236 | 2010_005328
1237 | 2010_005329
1238 | 2010_005380
1239 | 2010_005404
1240 | 2010_005407
1241 | 2010_005411
1242 | 2010_005423
1243 | 2010_005499
1244 | 2010_005509
1245 | 2010_005510
1246 | 2010_005544
1247 | 2010_005549
1248 | 2010_005590
1249 | 2010_005639
1250 | 2010_005699
1251 | 2010_005704
1252 | 2010_005707
1253 | 2010_005711
1254 | 2010_005726
1255 | 2010_005741
1256 | 2010_005765
1257 | 2010_005790
1258 | 2010_005792
1259 | 2010_005797
1260 | 2010_005812
1261 | 2010_005850
1262 | 2010_005861
1263 | 2010_005869
1264 | 2010_005908
1265 | 2010_005915
1266 | 2010_005946
1267 | 2010_005965
1268 | 2010_006044
1269 | 2010_006047
1270 | 2010_006052
1271 | 2010_006081
1272 | 2011_000001
1273 | 2011_000013
1274 | 2011_000014
1275 | 2011_000020
1276 | 2011_000032
1277 | 2011_000042
1278 | 2011_000063
1279 | 2011_000115
1280 | 2011_000120
1281 | 2011_000240
1282 | 2011_000244
1283 | 2011_000254
1284 | 2011_000261
1285 | 2011_000262
1286 | 2011_000271
1287 | 2011_000274
1288 | 2011_000306
1289 | 2011_000311
1290 | 2011_000316
1291 | 2011_000328
1292 | 2011_000351
1293 | 2011_000352
1294 | 2011_000406
1295 | 2011_000414
1296 | 2011_000448
1297 | 2011_000451
1298 | 2011_000470
1299 | 2011_000473
1300 | 2011_000515
1301 | 2011_000537
1302 | 2011_000576
1303 | 2011_000603
1304 | 2011_000616
1305 | 2011_000636
1306 | 2011_000639
1307 | 2011_000654
1308 | 2011_000660
1309 | 2011_000664
1310 | 2011_000667
1311 | 2011_000670
1312 | 2011_000676
1313 | 2011_000721
1314 | 2011_000723
1315 | 2011_000762
1316 | 2011_000766
1317 | 2011_000786
1318 | 2011_000802
1319 | 2011_000810
1320 | 2011_000821
1321 | 2011_000841
1322 | 2011_000844
1323 | 2011_000846
1324 | 2011_000869
1325 | 2011_000890
1326 | 2011_000915
1327 | 2011_000924
1328 | 2011_000937
1329 | 2011_000939
1330 | 2011_000952
1331 | 2011_000968
1332 | 2011_000974
1333 | 2011_001037
1334 | 2011_001072
1335 | 2011_001085
1336 | 2011_001089
1337 | 2011_001090
1338 | 2011_001099
1339 | 2011_001104
1340 | 2011_001112
1341 | 2011_001120
1342 | 2011_001132
1343 | 2011_001151
1344 | 2011_001194
1345 | 2011_001258
1346 | 2011_001274
1347 | 2011_001314
1348 | 2011_001317
1349 | 2011_001321
1350 | 2011_001379
1351 | 2011_001425
1352 | 2011_001431
1353 | 2011_001443
1354 | 2011_001446
1355 | 2011_001452
1356 | 2011_001454
1357 | 2011_001477
1358 | 2011_001509
1359 | 2011_001512
1360 | 2011_001515
1361 | 2011_001528
1362 | 2011_001554
1363 | 2011_001561
1364 | 2011_001580
1365 | 2011_001587
1366 | 2011_001623
1367 | 2011_001648
1368 | 2011_001651
1369 | 2011_001654
1370 | 2011_001684
1371 | 2011_001696
1372 | 2011_001697
1373 | 2011_001760
1374 | 2011_001761
1375 | 2011_001798
1376 | 2011_001807
1377 | 2011_001851
1378 | 2011_001852
1379 | 2011_001853
1380 | 2011_001888
1381 | 2011_001940
1382 | 2011_002014
1383 | 2011_002028
1384 | 2011_002056
1385 | 2011_002061
1386 | 2011_002068
1387 | 2011_002076
1388 | 2011_002090
1389 | 2011_002095
1390 | 2011_002104
1391 | 2011_002136
1392 | 2011_002138
1393 | 2011_002151
1394 | 2011_002153
1395 | 2011_002155
1396 | 2011_002197
1397 | 2011_002198
1398 | 2011_002243
1399 | 2011_002250
1400 | 2011_002257
1401 | 2011_002262
1402 | 2011_002264
1403 | 2011_002296
1404 | 2011_002314
1405 | 2011_002331
1406 | 2011_002333
1407 | 2011_002411
1408 | 2011_002417
1409 | 2011_002425
1410 | 2011_002437
1411 | 2011_002444
1412 | 2011_002445
1413 | 2011_002449
1414 | 2011_002468
1415 | 2011_002469
1416 | 2011_002473
1417 | 2011_002508
1418 | 2011_002523
1419 | 2011_002534
1420 | 2011_002557
1421 | 2011_002564
1422 | 2011_002572
1423 | 2011_002597
1424 | 2011_002622
1425 | 2011_002632
1426 | 2011_002635
1427 | 2011_002643
1428 | 2011_002653
1429 | 2011_002667
1430 | 2011_002681
1431 | 2011_002707
1432 | 2011_002736
1433 | 2011_002759
1434 | 2011_002783
1435 | 2011_002792
1436 | 2011_002799
1437 | 2011_002824
1438 | 2011_002835
1439 | 2011_002866
1440 | 2011_002876
1441 | 2011_002888
1442 | 2011_002894
1443 | 2011_002903
1444 | 2011_002905
1445 | 2011_002986
1446 | 2011_003045
1447 | 2011_003064
1448 | 2011_003070
1449 | 2011_003083
1450 | 2011_003093
1451 | 2011_003096
1452 | 2011_003102
1453 | 2011_003156
1454 | 2011_003170
1455 | 2011_003178
1456 | 2011_003231
1457 |
--------------------------------------------------------------------------------
/dataset/val.txt:
--------------------------------------------------------------------------------
1 | 2007_000033
2 | 2007_000042
3 | 2007_000061
4 | 2007_000123
5 | 2007_000129
6 | 2007_000175
7 | 2007_000187
8 | 2007_000323
9 | 2007_000332
10 | 2007_000346
11 | 2007_000452
12 | 2007_000464
13 | 2007_000491
14 | 2007_000529
15 | 2007_000559
16 | 2007_000572
17 | 2007_000629
18 | 2007_000636
19 | 2007_000661
20 | 2007_000663
21 | 2007_000676
22 | 2007_000727
23 | 2007_000762
24 | 2007_000783
25 | 2007_000799
26 | 2007_000804
27 | 2007_000830
28 | 2007_000837
29 | 2007_000847
30 | 2007_000862
31 | 2007_000925
32 | 2007_000999
33 | 2007_001154
34 | 2007_001175
35 | 2007_001239
36 | 2007_001284
37 | 2007_001288
38 | 2007_001289
39 | 2007_001299
40 | 2007_001311
41 | 2007_001321
42 | 2007_001377
43 | 2007_001408
44 | 2007_001423
45 | 2007_001430
46 | 2007_001457
47 | 2007_001458
48 | 2007_001526
49 | 2007_001568
50 | 2007_001585
51 | 2007_001586
52 | 2007_001587
53 | 2007_001594
54 | 2007_001630
55 | 2007_001677
56 | 2007_001678
57 | 2007_001717
58 | 2007_001733
59 | 2007_001761
60 | 2007_001763
61 | 2007_001774
62 | 2007_001884
63 | 2007_001955
64 | 2007_002046
65 | 2007_002094
66 | 2007_002119
67 | 2007_002132
68 | 2007_002260
69 | 2007_002266
70 | 2007_002268
71 | 2007_002284
72 | 2007_002376
73 | 2007_002378
74 | 2007_002387
75 | 2007_002400
76 | 2007_002412
77 | 2007_002426
78 | 2007_002427
79 | 2007_002445
80 | 2007_002470
81 | 2007_002539
82 | 2007_002565
83 | 2007_002597
84 | 2007_002618
85 | 2007_002619
86 | 2007_002624
87 | 2007_002643
88 | 2007_002648
89 | 2007_002719
90 | 2007_002728
91 | 2007_002823
92 | 2007_002824
93 | 2007_002852
94 | 2007_002903
95 | 2007_003011
96 | 2007_003020
97 | 2007_003022
98 | 2007_003051
99 | 2007_003088
100 | 2007_003101
101 | 2007_003106
102 | 2007_003110
103 | 2007_003131
104 | 2007_003134
105 | 2007_003137
106 | 2007_003143
107 | 2007_003169
108 | 2007_003188
109 | 2007_003194
110 | 2007_003195
111 | 2007_003201
112 | 2007_003349
113 | 2007_003367
114 | 2007_003373
115 | 2007_003499
116 | 2007_003503
117 | 2007_003506
118 | 2007_003530
119 | 2007_003571
120 | 2007_003587
121 | 2007_003611
122 | 2007_003621
123 | 2007_003682
124 | 2007_003711
125 | 2007_003714
126 | 2007_003742
127 | 2007_003786
128 | 2007_003841
129 | 2007_003848
130 | 2007_003861
131 | 2007_003872
132 | 2007_003917
133 | 2007_003957
134 | 2007_003991
135 | 2007_004033
136 | 2007_004052
137 | 2007_004112
138 | 2007_004121
139 | 2007_004143
140 | 2007_004189
141 | 2007_004190
142 | 2007_004193
143 | 2007_004241
144 | 2007_004275
145 | 2007_004281
146 | 2007_004380
147 | 2007_004392
148 | 2007_004405
149 | 2007_004468
150 | 2007_004483
151 | 2007_004510
152 | 2007_004538
153 | 2007_004558
154 | 2007_004644
155 | 2007_004649
156 | 2007_004712
157 | 2007_004722
158 | 2007_004856
159 | 2007_004866
160 | 2007_004902
161 | 2007_004969
162 | 2007_005058
163 | 2007_005074
164 | 2007_005107
165 | 2007_005114
166 | 2007_005149
167 | 2007_005173
168 | 2007_005281
169 | 2007_005294
170 | 2007_005296
171 | 2007_005304
172 | 2007_005331
173 | 2007_005354
174 | 2007_005358
175 | 2007_005428
176 | 2007_005460
177 | 2007_005469
178 | 2007_005509
179 | 2007_005547
180 | 2007_005600
181 | 2007_005608
182 | 2007_005626
183 | 2007_005689
184 | 2007_005696
185 | 2007_005705
186 | 2007_005759
187 | 2007_005803
188 | 2007_005813
189 | 2007_005828
190 | 2007_005844
191 | 2007_005845
192 | 2007_005857
193 | 2007_005911
194 | 2007_005915
195 | 2007_005978
196 | 2007_006028
197 | 2007_006035
198 | 2007_006046
199 | 2007_006076
200 | 2007_006086
201 | 2007_006117
202 | 2007_006171
203 | 2007_006241
204 | 2007_006260
205 | 2007_006277
206 | 2007_006348
207 | 2007_006364
208 | 2007_006373
209 | 2007_006444
210 | 2007_006449
211 | 2007_006549
212 | 2007_006553
213 | 2007_006560
214 | 2007_006647
215 | 2007_006678
216 | 2007_006680
217 | 2007_006698
218 | 2007_006761
219 | 2007_006802
220 | 2007_006837
221 | 2007_006841
222 | 2007_006864
223 | 2007_006866
224 | 2007_006946
225 | 2007_007007
226 | 2007_007084
227 | 2007_007109
228 | 2007_007130
229 | 2007_007165
230 | 2007_007168
231 | 2007_007195
232 | 2007_007196
233 | 2007_007203
234 | 2007_007211
235 | 2007_007235
236 | 2007_007341
237 | 2007_007414
238 | 2007_007417
239 | 2007_007470
240 | 2007_007477
241 | 2007_007493
242 | 2007_007498
243 | 2007_007524
244 | 2007_007534
245 | 2007_007624
246 | 2007_007651
247 | 2007_007688
248 | 2007_007748
249 | 2007_007795
250 | 2007_007810
251 | 2007_007815
252 | 2007_007818
253 | 2007_007836
254 | 2007_007849
255 | 2007_007881
256 | 2007_007996
257 | 2007_008051
258 | 2007_008084
259 | 2007_008106
260 | 2007_008110
261 | 2007_008204
262 | 2007_008222
263 | 2007_008256
264 | 2007_008260
265 | 2007_008339
266 | 2007_008374
267 | 2007_008415
268 | 2007_008430
269 | 2007_008543
270 | 2007_008547
271 | 2007_008596
272 | 2007_008645
273 | 2007_008670
274 | 2007_008708
275 | 2007_008722
276 | 2007_008747
277 | 2007_008802
278 | 2007_008815
279 | 2007_008897
280 | 2007_008944
281 | 2007_008964
282 | 2007_008973
283 | 2007_008980
284 | 2007_009015
285 | 2007_009068
286 | 2007_009084
287 | 2007_009088
288 | 2007_009096
289 | 2007_009221
290 | 2007_009245
291 | 2007_009251
292 | 2007_009252
293 | 2007_009258
294 | 2007_009320
295 | 2007_009323
296 | 2007_009331
297 | 2007_009346
298 | 2007_009392
299 | 2007_009413
300 | 2007_009419
301 | 2007_009446
302 | 2007_009458
303 | 2007_009521
304 | 2007_009562
305 | 2007_009592
306 | 2007_009654
307 | 2007_009655
308 | 2007_009684
309 | 2007_009687
310 | 2007_009691
311 | 2007_009706
312 | 2007_009750
313 | 2007_009756
314 | 2007_009764
315 | 2007_009794
316 | 2007_009817
317 | 2007_009841
318 | 2007_009897
319 | 2007_009911
320 | 2007_009923
321 | 2007_009938
322 | 2008_000009
323 | 2008_000016
324 | 2008_000073
325 | 2008_000075
326 | 2008_000080
327 | 2008_000107
328 | 2008_000120
329 | 2008_000123
330 | 2008_000149
331 | 2008_000182
332 | 2008_000213
333 | 2008_000215
334 | 2008_000223
335 | 2008_000233
336 | 2008_000234
337 | 2008_000239
338 | 2008_000254
339 | 2008_000270
340 | 2008_000271
341 | 2008_000345
342 | 2008_000359
343 | 2008_000391
344 | 2008_000401
345 | 2008_000464
346 | 2008_000469
347 | 2008_000474
348 | 2008_000501
349 | 2008_000510
350 | 2008_000533
351 | 2008_000573
352 | 2008_000589
353 | 2008_000602
354 | 2008_000630
355 | 2008_000657
356 | 2008_000661
357 | 2008_000662
358 | 2008_000666
359 | 2008_000673
360 | 2008_000700
361 | 2008_000725
362 | 2008_000731
363 | 2008_000763
364 | 2008_000765
365 | 2008_000782
366 | 2008_000795
367 | 2008_000811
368 | 2008_000848
369 | 2008_000853
370 | 2008_000863
371 | 2008_000911
372 | 2008_000919
373 | 2008_000943
374 | 2008_000992
375 | 2008_001013
376 | 2008_001028
377 | 2008_001040
378 | 2008_001070
379 | 2008_001074
380 | 2008_001076
381 | 2008_001078
382 | 2008_001135
383 | 2008_001150
384 | 2008_001170
385 | 2008_001231
386 | 2008_001249
387 | 2008_001260
388 | 2008_001283
389 | 2008_001308
390 | 2008_001379
391 | 2008_001404
392 | 2008_001433
393 | 2008_001439
394 | 2008_001478
395 | 2008_001491
396 | 2008_001504
397 | 2008_001513
398 | 2008_001514
399 | 2008_001531
400 | 2008_001546
401 | 2008_001547
402 | 2008_001580
403 | 2008_001629
404 | 2008_001640
405 | 2008_001682
406 | 2008_001688
407 | 2008_001715
408 | 2008_001821
409 | 2008_001874
410 | 2008_001885
411 | 2008_001895
412 | 2008_001966
413 | 2008_001971
414 | 2008_001992
415 | 2008_002043
416 | 2008_002152
417 | 2008_002205
418 | 2008_002212
419 | 2008_002239
420 | 2008_002240
421 | 2008_002241
422 | 2008_002269
423 | 2008_002273
424 | 2008_002358
425 | 2008_002379
426 | 2008_002383
427 | 2008_002429
428 | 2008_002464
429 | 2008_002467
430 | 2008_002492
431 | 2008_002495
432 | 2008_002504
433 | 2008_002521
434 | 2008_002536
435 | 2008_002588
436 | 2008_002623
437 | 2008_002680
438 | 2008_002681
439 | 2008_002775
440 | 2008_002778
441 | 2008_002835
442 | 2008_002859
443 | 2008_002864
444 | 2008_002900
445 | 2008_002904
446 | 2008_002929
447 | 2008_002936
448 | 2008_002942
449 | 2008_002958
450 | 2008_003003
451 | 2008_003026
452 | 2008_003034
453 | 2008_003076
454 | 2008_003105
455 | 2008_003108
456 | 2008_003110
457 | 2008_003135
458 | 2008_003141
459 | 2008_003155
460 | 2008_003210
461 | 2008_003238
462 | 2008_003270
463 | 2008_003330
464 | 2008_003333
465 | 2008_003369
466 | 2008_003379
467 | 2008_003451
468 | 2008_003461
469 | 2008_003477
470 | 2008_003492
471 | 2008_003499
472 | 2008_003511
473 | 2008_003546
474 | 2008_003576
475 | 2008_003577
476 | 2008_003676
477 | 2008_003709
478 | 2008_003733
479 | 2008_003777
480 | 2008_003782
481 | 2008_003821
482 | 2008_003846
483 | 2008_003856
484 | 2008_003858
485 | 2008_003874
486 | 2008_003876
487 | 2008_003885
488 | 2008_003886
489 | 2008_003926
490 | 2008_003976
491 | 2008_004069
492 | 2008_004101
493 | 2008_004140
494 | 2008_004172
495 | 2008_004175
496 | 2008_004212
497 | 2008_004279
498 | 2008_004339
499 | 2008_004345
500 | 2008_004363
501 | 2008_004367
502 | 2008_004396
503 | 2008_004399
504 | 2008_004453
505 | 2008_004477
506 | 2008_004552
507 | 2008_004562
508 | 2008_004575
509 | 2008_004610
510 | 2008_004612
511 | 2008_004621
512 | 2008_004624
513 | 2008_004654
514 | 2008_004659
515 | 2008_004687
516 | 2008_004701
517 | 2008_004704
518 | 2008_004705
519 | 2008_004754
520 | 2008_004758
521 | 2008_004854
522 | 2008_004910
523 | 2008_004995
524 | 2008_005049
525 | 2008_005089
526 | 2008_005097
527 | 2008_005105
528 | 2008_005145
529 | 2008_005197
530 | 2008_005217
531 | 2008_005242
532 | 2008_005245
533 | 2008_005254
534 | 2008_005262
535 | 2008_005338
536 | 2008_005398
537 | 2008_005399
538 | 2008_005422
539 | 2008_005439
540 | 2008_005445
541 | 2008_005525
542 | 2008_005544
543 | 2008_005628
544 | 2008_005633
545 | 2008_005637
546 | 2008_005642
547 | 2008_005676
548 | 2008_005680
549 | 2008_005691
550 | 2008_005727
551 | 2008_005738
552 | 2008_005812
553 | 2008_005904
554 | 2008_005915
555 | 2008_006008
556 | 2008_006036
557 | 2008_006055
558 | 2008_006063
559 | 2008_006108
560 | 2008_006130
561 | 2008_006143
562 | 2008_006159
563 | 2008_006216
564 | 2008_006219
565 | 2008_006229
566 | 2008_006254
567 | 2008_006275
568 | 2008_006325
569 | 2008_006327
570 | 2008_006341
571 | 2008_006408
572 | 2008_006480
573 | 2008_006523
574 | 2008_006526
575 | 2008_006528
576 | 2008_006553
577 | 2008_006554
578 | 2008_006703
579 | 2008_006722
580 | 2008_006752
581 | 2008_006784
582 | 2008_006835
583 | 2008_006874
584 | 2008_006981
585 | 2008_006986
586 | 2008_007025
587 | 2008_007031
588 | 2008_007048
589 | 2008_007120
590 | 2008_007123
591 | 2008_007143
592 | 2008_007194
593 | 2008_007219
594 | 2008_007273
595 | 2008_007350
596 | 2008_007378
597 | 2008_007392
598 | 2008_007402
599 | 2008_007497
600 | 2008_007498
601 | 2008_007507
602 | 2008_007513
603 | 2008_007527
604 | 2008_007548
605 | 2008_007596
606 | 2008_007677
607 | 2008_007737
608 | 2008_007797
609 | 2008_007804
610 | 2008_007811
611 | 2008_007814
612 | 2008_007828
613 | 2008_007836
614 | 2008_007945
615 | 2008_007994
616 | 2008_008051
617 | 2008_008103
618 | 2008_008127
619 | 2008_008221
620 | 2008_008252
621 | 2008_008268
622 | 2008_008296
623 | 2008_008301
624 | 2008_008335
625 | 2008_008362
626 | 2008_008392
627 | 2008_008393
628 | 2008_008421
629 | 2008_008434
630 | 2008_008469
631 | 2008_008629
632 | 2008_008682
633 | 2008_008711
634 | 2008_008746
635 | 2009_000012
636 | 2009_000013
637 | 2009_000022
638 | 2009_000032
639 | 2009_000037
640 | 2009_000039
641 | 2009_000074
642 | 2009_000080
643 | 2009_000087
644 | 2009_000096
645 | 2009_000121
646 | 2009_000136
647 | 2009_000149
648 | 2009_000156
649 | 2009_000201
650 | 2009_000205
651 | 2009_000219
652 | 2009_000242
653 | 2009_000309
654 | 2009_000318
655 | 2009_000335
656 | 2009_000351
657 | 2009_000354
658 | 2009_000387
659 | 2009_000391
660 | 2009_000412
661 | 2009_000418
662 | 2009_000421
663 | 2009_000426
664 | 2009_000440
665 | 2009_000446
666 | 2009_000455
667 | 2009_000457
668 | 2009_000469
669 | 2009_000487
670 | 2009_000488
671 | 2009_000523
672 | 2009_000573
673 | 2009_000619
674 | 2009_000628
675 | 2009_000641
676 | 2009_000664
677 | 2009_000675
678 | 2009_000704
679 | 2009_000705
680 | 2009_000712
681 | 2009_000716
682 | 2009_000723
683 | 2009_000727
684 | 2009_000730
685 | 2009_000731
686 | 2009_000732
687 | 2009_000771
688 | 2009_000825
689 | 2009_000828
690 | 2009_000839
691 | 2009_000840
692 | 2009_000845
693 | 2009_000879
694 | 2009_000892
695 | 2009_000919
696 | 2009_000924
697 | 2009_000931
698 | 2009_000935
699 | 2009_000964
700 | 2009_000989
701 | 2009_000991
702 | 2009_000998
703 | 2009_001008
704 | 2009_001082
705 | 2009_001108
706 | 2009_001160
707 | 2009_001215
708 | 2009_001240
709 | 2009_001255
710 | 2009_001278
711 | 2009_001299
712 | 2009_001300
713 | 2009_001314
714 | 2009_001332
715 | 2009_001333
716 | 2009_001363
717 | 2009_001391
718 | 2009_001411
719 | 2009_001433
720 | 2009_001505
721 | 2009_001535
722 | 2009_001536
723 | 2009_001565
724 | 2009_001607
725 | 2009_001644
726 | 2009_001663
727 | 2009_001683
728 | 2009_001684
729 | 2009_001687
730 | 2009_001718
731 | 2009_001731
732 | 2009_001765
733 | 2009_001768
734 | 2009_001775
735 | 2009_001804
736 | 2009_001816
737 | 2009_001818
738 | 2009_001850
739 | 2009_001851
740 | 2009_001854
741 | 2009_001941
742 | 2009_001991
743 | 2009_002012
744 | 2009_002035
745 | 2009_002042
746 | 2009_002082
747 | 2009_002094
748 | 2009_002097
749 | 2009_002122
750 | 2009_002150
751 | 2009_002155
752 | 2009_002164
753 | 2009_002165
754 | 2009_002171
755 | 2009_002185
756 | 2009_002202
757 | 2009_002221
758 | 2009_002238
759 | 2009_002239
760 | 2009_002265
761 | 2009_002268
762 | 2009_002291
763 | 2009_002295
764 | 2009_002317
765 | 2009_002320
766 | 2009_002346
767 | 2009_002366
768 | 2009_002372
769 | 2009_002382
770 | 2009_002390
771 | 2009_002415
772 | 2009_002445
773 | 2009_002487
774 | 2009_002521
775 | 2009_002527
776 | 2009_002535
777 | 2009_002539
778 | 2009_002549
779 | 2009_002562
780 | 2009_002568
781 | 2009_002571
782 | 2009_002573
783 | 2009_002584
784 | 2009_002591
785 | 2009_002594
786 | 2009_002604
787 | 2009_002618
788 | 2009_002635
789 | 2009_002638
790 | 2009_002649
791 | 2009_002651
792 | 2009_002727
793 | 2009_002732
794 | 2009_002749
795 | 2009_002753
796 | 2009_002771
797 | 2009_002808
798 | 2009_002856
799 | 2009_002887
800 | 2009_002888
801 | 2009_002928
802 | 2009_002936
803 | 2009_002975
804 | 2009_002982
805 | 2009_002990
806 | 2009_003003
807 | 2009_003005
808 | 2009_003043
809 | 2009_003059
810 | 2009_003063
811 | 2009_003065
812 | 2009_003071
813 | 2009_003080
814 | 2009_003105
815 | 2009_003123
816 | 2009_003193
817 | 2009_003196
818 | 2009_003217
819 | 2009_003224
820 | 2009_003241
821 | 2009_003269
822 | 2009_003273
823 | 2009_003299
824 | 2009_003304
825 | 2009_003311
826 | 2009_003323
827 | 2009_003343
828 | 2009_003378
829 | 2009_003387
830 | 2009_003406
831 | 2009_003433
832 | 2009_003450
833 | 2009_003466
834 | 2009_003481
835 | 2009_003494
836 | 2009_003498
837 | 2009_003504
838 | 2009_003507
839 | 2009_003517
840 | 2009_003523
841 | 2009_003542
842 | 2009_003549
843 | 2009_003551
844 | 2009_003564
845 | 2009_003569
846 | 2009_003576
847 | 2009_003589
848 | 2009_003607
849 | 2009_003640
850 | 2009_003666
851 | 2009_003696
852 | 2009_003703
853 | 2009_003707
854 | 2009_003756
855 | 2009_003771
856 | 2009_003773
857 | 2009_003804
858 | 2009_003806
859 | 2009_003810
860 | 2009_003849
861 | 2009_003857
862 | 2009_003858
863 | 2009_003895
864 | 2009_003903
865 | 2009_003904
866 | 2009_003928
867 | 2009_003938
868 | 2009_003971
869 | 2009_003991
870 | 2009_004021
871 | 2009_004033
872 | 2009_004043
873 | 2009_004070
874 | 2009_004072
875 | 2009_004084
876 | 2009_004099
877 | 2009_004125
878 | 2009_004140
879 | 2009_004217
880 | 2009_004221
881 | 2009_004247
882 | 2009_004248
883 | 2009_004255
884 | 2009_004298
885 | 2009_004324
886 | 2009_004455
887 | 2009_004494
888 | 2009_004497
889 | 2009_004504
890 | 2009_004507
891 | 2009_004509
892 | 2009_004540
893 | 2009_004568
894 | 2009_004579
895 | 2009_004581
896 | 2009_004590
897 | 2009_004592
898 | 2009_004594
899 | 2009_004635
900 | 2009_004653
901 | 2009_004687
902 | 2009_004721
903 | 2009_004730
904 | 2009_004732
905 | 2009_004738
906 | 2009_004748
907 | 2009_004789
908 | 2009_004799
909 | 2009_004801
910 | 2009_004848
911 | 2009_004859
912 | 2009_004867
913 | 2009_004882
914 | 2009_004886
915 | 2009_004895
916 | 2009_004942
917 | 2009_004969
918 | 2009_004987
919 | 2009_004993
920 | 2009_004994
921 | 2009_005038
922 | 2009_005078
923 | 2009_005087
924 | 2009_005089
925 | 2009_005137
926 | 2009_005148
927 | 2009_005156
928 | 2009_005158
929 | 2009_005189
930 | 2009_005190
931 | 2009_005217
932 | 2009_005219
933 | 2009_005220
934 | 2009_005231
935 | 2009_005260
936 | 2009_005262
937 | 2009_005302
938 | 2010_000003
939 | 2010_000038
940 | 2010_000065
941 | 2010_000083
942 | 2010_000084
943 | 2010_000087
944 | 2010_000110
945 | 2010_000159
946 | 2010_000160
947 | 2010_000163
948 | 2010_000174
949 | 2010_000216
950 | 2010_000238
951 | 2010_000241
952 | 2010_000256
953 | 2010_000272
954 | 2010_000284
955 | 2010_000309
956 | 2010_000318
957 | 2010_000330
958 | 2010_000335
959 | 2010_000342
960 | 2010_000372
961 | 2010_000422
962 | 2010_000426
963 | 2010_000427
964 | 2010_000502
965 | 2010_000530
966 | 2010_000552
967 | 2010_000559
968 | 2010_000572
969 | 2010_000573
970 | 2010_000622
971 | 2010_000628
972 | 2010_000639
973 | 2010_000666
974 | 2010_000679
975 | 2010_000682
976 | 2010_000683
977 | 2010_000724
978 | 2010_000738
979 | 2010_000764
980 | 2010_000788
981 | 2010_000814
982 | 2010_000836
983 | 2010_000874
984 | 2010_000904
985 | 2010_000906
986 | 2010_000907
987 | 2010_000918
988 | 2010_000929
989 | 2010_000941
990 | 2010_000952
991 | 2010_000961
992 | 2010_001000
993 | 2010_001010
994 | 2010_001011
995 | 2010_001016
996 | 2010_001017
997 | 2010_001024
998 | 2010_001036
999 | 2010_001061
1000 | 2010_001069
1001 | 2010_001070
1002 | 2010_001079
1003 | 2010_001104
1004 | 2010_001124
1005 | 2010_001149
1006 | 2010_001151
1007 | 2010_001174
1008 | 2010_001206
1009 | 2010_001246
1010 | 2010_001251
1011 | 2010_001256
1012 | 2010_001264
1013 | 2010_001292
1014 | 2010_001313
1015 | 2010_001327
1016 | 2010_001331
1017 | 2010_001351
1018 | 2010_001367
1019 | 2010_001376
1020 | 2010_001403
1021 | 2010_001448
1022 | 2010_001451
1023 | 2010_001522
1024 | 2010_001534
1025 | 2010_001553
1026 | 2010_001557
1027 | 2010_001563
1028 | 2010_001577
1029 | 2010_001579
1030 | 2010_001646
1031 | 2010_001656
1032 | 2010_001692
1033 | 2010_001699
1034 | 2010_001734
1035 | 2010_001752
1036 | 2010_001767
1037 | 2010_001768
1038 | 2010_001773
1039 | 2010_001820
1040 | 2010_001830
1041 | 2010_001851
1042 | 2010_001908
1043 | 2010_001913
1044 | 2010_001951
1045 | 2010_001956
1046 | 2010_001962
1047 | 2010_001966
1048 | 2010_001995
1049 | 2010_002017
1050 | 2010_002025
1051 | 2010_002030
1052 | 2010_002106
1053 | 2010_002137
1054 | 2010_002142
1055 | 2010_002146
1056 | 2010_002147
1057 | 2010_002150
1058 | 2010_002161
1059 | 2010_002200
1060 | 2010_002228
1061 | 2010_002232
1062 | 2010_002251
1063 | 2010_002271
1064 | 2010_002305
1065 | 2010_002310
1066 | 2010_002336
1067 | 2010_002348
1068 | 2010_002361
1069 | 2010_002390
1070 | 2010_002396
1071 | 2010_002422
1072 | 2010_002450
1073 | 2010_002480
1074 | 2010_002512
1075 | 2010_002531
1076 | 2010_002536
1077 | 2010_002538
1078 | 2010_002546
1079 | 2010_002623
1080 | 2010_002682
1081 | 2010_002691
1082 | 2010_002693
1083 | 2010_002701
1084 | 2010_002763
1085 | 2010_002792
1086 | 2010_002868
1087 | 2010_002900
1088 | 2010_002902
1089 | 2010_002921
1090 | 2010_002929
1091 | 2010_002939
1092 | 2010_002988
1093 | 2010_003014
1094 | 2010_003060
1095 | 2010_003123
1096 | 2010_003127
1097 | 2010_003132
1098 | 2010_003168
1099 | 2010_003183
1100 | 2010_003187
1101 | 2010_003207
1102 | 2010_003231
1103 | 2010_003239
1104 | 2010_003275
1105 | 2010_003276
1106 | 2010_003293
1107 | 2010_003302
1108 | 2010_003325
1109 | 2010_003362
1110 | 2010_003365
1111 | 2010_003381
1112 | 2010_003402
1113 | 2010_003409
1114 | 2010_003418
1115 | 2010_003446
1116 | 2010_003453
1117 | 2010_003468
1118 | 2010_003473
1119 | 2010_003495
1120 | 2010_003506
1121 | 2010_003514
1122 | 2010_003531
1123 | 2010_003532
1124 | 2010_003541
1125 | 2010_003547
1126 | 2010_003597
1127 | 2010_003675
1128 | 2010_003708
1129 | 2010_003716
1130 | 2010_003746
1131 | 2010_003758
1132 | 2010_003764
1133 | 2010_003768
1134 | 2010_003771
1135 | 2010_003772
1136 | 2010_003781
1137 | 2010_003813
1138 | 2010_003820
1139 | 2010_003854
1140 | 2010_003912
1141 | 2010_003915
1142 | 2010_003947
1143 | 2010_003956
1144 | 2010_003971
1145 | 2010_004041
1146 | 2010_004042
1147 | 2010_004056
1148 | 2010_004063
1149 | 2010_004104
1150 | 2010_004120
1151 | 2010_004149
1152 | 2010_004165
1153 | 2010_004208
1154 | 2010_004219
1155 | 2010_004226
1156 | 2010_004314
1157 | 2010_004320
1158 | 2010_004322
1159 | 2010_004337
1160 | 2010_004348
1161 | 2010_004355
1162 | 2010_004369
1163 | 2010_004382
1164 | 2010_004419
1165 | 2010_004432
1166 | 2010_004472
1167 | 2010_004479
1168 | 2010_004519
1169 | 2010_004520
1170 | 2010_004529
1171 | 2010_004543
1172 | 2010_004550
1173 | 2010_004551
1174 | 2010_004556
1175 | 2010_004559
1176 | 2010_004628
1177 | 2010_004635
1178 | 2010_004662
1179 | 2010_004697
1180 | 2010_004757
1181 | 2010_004763
1182 | 2010_004772
1183 | 2010_004783
1184 | 2010_004789
1185 | 2010_004795
1186 | 2010_004815
1187 | 2010_004825
1188 | 2010_004828
1189 | 2010_004856
1190 | 2010_004857
1191 | 2010_004861
1192 | 2010_004941
1193 | 2010_004946
1194 | 2010_004951
1195 | 2010_004980
1196 | 2010_004994
1197 | 2010_005013
1198 | 2010_005021
1199 | 2010_005046
1200 | 2010_005063
1201 | 2010_005108
1202 | 2010_005118
1203 | 2010_005159
1204 | 2010_005160
1205 | 2010_005166
1206 | 2010_005174
1207 | 2010_005180
1208 | 2010_005187
1209 | 2010_005206
1210 | 2010_005245
1211 | 2010_005252
1212 | 2010_005284
1213 | 2010_005305
1214 | 2010_005344
1215 | 2010_005353
1216 | 2010_005366
1217 | 2010_005401
1218 | 2010_005421
1219 | 2010_005428
1220 | 2010_005432
1221 | 2010_005433
1222 | 2010_005496
1223 | 2010_005501
1224 | 2010_005508
1225 | 2010_005531
1226 | 2010_005534
1227 | 2010_005575
1228 | 2010_005582
1229 | 2010_005606
1230 | 2010_005626
1231 | 2010_005644
1232 | 2010_005664
1233 | 2010_005705
1234 | 2010_005706
1235 | 2010_005709
1236 | 2010_005718
1237 | 2010_005719
1238 | 2010_005727
1239 | 2010_005762
1240 | 2010_005788
1241 | 2010_005860
1242 | 2010_005871
1243 | 2010_005877
1244 | 2010_005888
1245 | 2010_005899
1246 | 2010_005922
1247 | 2010_005991
1248 | 2010_005992
1249 | 2010_006026
1250 | 2010_006034
1251 | 2010_006054
1252 | 2010_006070
1253 | 2011_000045
1254 | 2011_000051
1255 | 2011_000054
1256 | 2011_000066
1257 | 2011_000070
1258 | 2011_000112
1259 | 2011_000173
1260 | 2011_000178
1261 | 2011_000185
1262 | 2011_000226
1263 | 2011_000234
1264 | 2011_000238
1265 | 2011_000239
1266 | 2011_000248
1267 | 2011_000283
1268 | 2011_000291
1269 | 2011_000310
1270 | 2011_000312
1271 | 2011_000338
1272 | 2011_000396
1273 | 2011_000412
1274 | 2011_000419
1275 | 2011_000435
1276 | 2011_000436
1277 | 2011_000438
1278 | 2011_000455
1279 | 2011_000456
1280 | 2011_000479
1281 | 2011_000481
1282 | 2011_000482
1283 | 2011_000503
1284 | 2011_000512
1285 | 2011_000521
1286 | 2011_000526
1287 | 2011_000536
1288 | 2011_000548
1289 | 2011_000566
1290 | 2011_000585
1291 | 2011_000598
1292 | 2011_000607
1293 | 2011_000618
1294 | 2011_000638
1295 | 2011_000658
1296 | 2011_000661
1297 | 2011_000669
1298 | 2011_000747
1299 | 2011_000780
1300 | 2011_000789
1301 | 2011_000807
1302 | 2011_000809
1303 | 2011_000813
1304 | 2011_000830
1305 | 2011_000843
1306 | 2011_000874
1307 | 2011_000888
1308 | 2011_000900
1309 | 2011_000912
1310 | 2011_000953
1311 | 2011_000969
1312 | 2011_001005
1313 | 2011_001014
1314 | 2011_001020
1315 | 2011_001047
1316 | 2011_001060
1317 | 2011_001064
1318 | 2011_001069
1319 | 2011_001071
1320 | 2011_001082
1321 | 2011_001110
1322 | 2011_001114
1323 | 2011_001159
1324 | 2011_001161
1325 | 2011_001190
1326 | 2011_001232
1327 | 2011_001263
1328 | 2011_001276
1329 | 2011_001281
1330 | 2011_001287
1331 | 2011_001292
1332 | 2011_001313
1333 | 2011_001341
1334 | 2011_001346
1335 | 2011_001350
1336 | 2011_001407
1337 | 2011_001416
1338 | 2011_001421
1339 | 2011_001434
1340 | 2011_001447
1341 | 2011_001489
1342 | 2011_001529
1343 | 2011_001530
1344 | 2011_001534
1345 | 2011_001546
1346 | 2011_001567
1347 | 2011_001589
1348 | 2011_001597
1349 | 2011_001601
1350 | 2011_001607
1351 | 2011_001613
1352 | 2011_001614
1353 | 2011_001619
1354 | 2011_001624
1355 | 2011_001642
1356 | 2011_001665
1357 | 2011_001669
1358 | 2011_001674
1359 | 2011_001708
1360 | 2011_001713
1361 | 2011_001714
1362 | 2011_001722
1363 | 2011_001726
1364 | 2011_001745
1365 | 2011_001748
1366 | 2011_001775
1367 | 2011_001782
1368 | 2011_001793
1369 | 2011_001794
1370 | 2011_001812
1371 | 2011_001862
1372 | 2011_001863
1373 | 2011_001868
1374 | 2011_001880
1375 | 2011_001910
1376 | 2011_001984
1377 | 2011_001988
1378 | 2011_002002
1379 | 2011_002040
1380 | 2011_002041
1381 | 2011_002064
1382 | 2011_002075
1383 | 2011_002098
1384 | 2011_002110
1385 | 2011_002121
1386 | 2011_002124
1387 | 2011_002150
1388 | 2011_002156
1389 | 2011_002178
1390 | 2011_002200
1391 | 2011_002223
1392 | 2011_002244
1393 | 2011_002247
1394 | 2011_002279
1395 | 2011_002295
1396 | 2011_002298
1397 | 2011_002308
1398 | 2011_002317
1399 | 2011_002322
1400 | 2011_002327
1401 | 2011_002343
1402 | 2011_002358
1403 | 2011_002371
1404 | 2011_002379
1405 | 2011_002391
1406 | 2011_002498
1407 | 2011_002509
1408 | 2011_002515
1409 | 2011_002532
1410 | 2011_002535
1411 | 2011_002548
1412 | 2011_002575
1413 | 2011_002578
1414 | 2011_002589
1415 | 2011_002592
1416 | 2011_002623
1417 | 2011_002641
1418 | 2011_002644
1419 | 2011_002662
1420 | 2011_002675
1421 | 2011_002685
1422 | 2011_002713
1423 | 2011_002730
1424 | 2011_002754
1425 | 2011_002812
1426 | 2011_002863
1427 | 2011_002879
1428 | 2011_002885
1429 | 2011_002929
1430 | 2011_002951
1431 | 2011_002975
1432 | 2011_002993
1433 | 2011_002997
1434 | 2011_003003
1435 | 2011_003011
1436 | 2011_003019
1437 | 2011_003030
1438 | 2011_003055
1439 | 2011_003085
1440 | 2011_003103
1441 | 2011_003114
1442 | 2011_003145
1443 | 2011_003146
1444 | 2011_003182
1445 | 2011_003197
1446 | 2011_003205
1447 | 2011_003240
1448 | 2011_003256
1449 | 2011_003271
1450 |
--------------------------------------------------------------------------------
/deeplab_model.py:
--------------------------------------------------------------------------------
1 | """DeepLab v3 models based on slim library."""
2 |
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import tensorflow as tf
8 |
9 | from tensorflow.contrib.slim.nets import resnet_v2
10 | from tensorflow.contrib import layers as layers_lib
11 | from tensorflow.contrib.framework.python.ops import arg_scope
12 | from tensorflow.contrib.layers.python.layers import layers
13 | from tensorflow.contrib.slim.python.slim.nets import resnet_utils
14 |
15 | from utils import preprocessing
16 |
17 | _BATCH_NORM_DECAY = 0.9997
18 | _WEIGHT_DECAY = 5e-4
19 |
20 |
21 | def atrous_spatial_pyramid_pooling(inputs, output_stride, batch_norm_decay, is_training, depth=256):
22 | """Atrous Spatial Pyramid Pooling.
23 |
24 | Args:
25 | inputs: A tensor of size [batch, height, width, channels].
26 | output_stride: The ResNet unit's stride. Determines the rates for atrous convolution.
27 | the rates are (6, 12, 18) when the stride is 16, and doubled when 8.
28 | batch_norm_decay: The moving average decay when estimating layer activation
29 | statistics in batch normalization.
30 | is_training: A boolean denoting whether the input is for training.
31 | depth: The depth of the ResNet unit output.
32 |
33 | Returns:
34 | The atrous spatial pyramid pooling output.
35 | """
36 | with tf.variable_scope("aspp"):
37 | if output_stride not in [8, 16]:
38 | raise ValueError('output_stride must be either 8 or 16.')
39 |
40 | atrous_rates = [6, 12, 18]
41 | if output_stride == 8:
42 | atrous_rates = [2*rate for rate in atrous_rates]
43 |
44 | with tf.contrib.slim.arg_scope(resnet_v2.resnet_arg_scope(batch_norm_decay=batch_norm_decay)):
45 | with arg_scope([layers.batch_norm], is_training=is_training):
46 | inputs_size = tf.shape(inputs)[1:3]
47 | # (a) one 1x1 convolution and three 3x3 convolutions with rates = (6, 12, 18) when output stride = 16.
48 | # the rates are doubled when output stride = 8.
49 | conv_1x1 = layers_lib.conv2d(inputs, depth, [1, 1], stride=1, scope="conv_1x1")
50 | conv_3x3_1 = resnet_utils.conv2d_same(inputs, depth, 3, stride=1, rate=atrous_rates[0], scope='conv_3x3_1')
51 | conv_3x3_2 = resnet_utils.conv2d_same(inputs, depth, 3, stride=1, rate=atrous_rates[1], scope='conv_3x3_2')
52 | conv_3x3_3 = resnet_utils.conv2d_same(inputs, depth, 3, stride=1, rate=atrous_rates[2], scope='conv_3x3_3')
53 |
54 | # (b) the image-level features
55 | with tf.variable_scope("image_level_features"):
56 | # global average pooling
57 | image_level_features = tf.reduce_mean(inputs, [1, 2], name='global_average_pooling', keepdims=True)
58 | # 1x1 convolution with 256 filters( and batch normalization)
59 | image_level_features = layers_lib.conv2d(image_level_features, depth, [1, 1], stride=1, scope='conv_1x1')
60 | # bilinearly upsample features
61 | image_level_features = tf.image.resize_bilinear(image_level_features, inputs_size, name='upsample')
62 |
63 | net = tf.concat([conv_1x1, conv_3x3_1, conv_3x3_2, conv_3x3_3, image_level_features], axis=3, name='concat')
64 | net = layers_lib.conv2d(net, depth, [1, 1], stride=1, scope='conv_1x1_concat')
65 |
66 | return net
67 |
68 |
69 | def deeplab_v3_generator(num_classes,
70 | output_stride,
71 | base_architecture,
72 | pre_trained_model,
73 | batch_norm_decay,
74 | data_format='channels_last'):
75 | """Generator for DeepLab v3 models.
76 |
77 | Args:
78 | num_classes: The number of possible classes for image classification.
79 | output_stride: The ResNet unit's stride. Determines the rates for atrous convolution.
80 | the rates are (6, 12, 18) when the stride is 16, and doubled when 8.
81 | base_architecture: The architecture of base Resnet building block.
82 | pre_trained_model: The path to the directory that contains pre-trained models.
83 | batch_norm_decay: The moving average decay when estimating layer activation
84 | statistics in batch normalization.
85 | data_format: The input format ('channels_last', 'channels_first', or None).
86 | If set to None, the format is dependent on whether a GPU is available.
87 | Only 'channels_last' is supported currently.
88 |
89 | Returns:
90 | The model function that takes in `inputs` and `is_training` and
91 | returns the output tensor of the DeepLab v3 model.
92 | """
93 | if data_format is None:
94 | # data_format = (
95 | # 'channels_first' if tf.test.is_built_with_cuda() else 'channels_last')
96 | pass
97 |
98 | if batch_norm_decay is None:
99 | batch_norm_decay = _BATCH_NORM_DECAY
100 |
101 | if base_architecture not in ['resnet_v2_50', 'resnet_v2_101']:
102 | raise ValueError("'base_architrecture' must be either 'resnet_v2_50' or 'resnet_v2_101'.")
103 |
104 | if base_architecture == 'resnet_v2_50':
105 | base_model = resnet_v2.resnet_v2_50
106 | else:
107 | base_model = resnet_v2.resnet_v2_101
108 |
109 | def model(inputs, is_training):
110 | """Constructs the ResNet model given the inputs."""
111 | if data_format == 'channels_first':
112 | # Convert the inputs from channels_last (NHWC) to channels_first (NCHW).
113 | # This provides a large performance boost on GPU. See
114 | # https://www.tensorflow.org/performance/performance_guide#data_formats
115 | inputs = tf.transpose(inputs, [0, 3, 1, 2])
116 |
117 | # tf.logging.info('net shape: {}'.format(inputs.shape))
118 |
119 | with tf.contrib.slim.arg_scope(resnet_v2.resnet_arg_scope(batch_norm_decay=batch_norm_decay)):
120 | logits, end_points = base_model(inputs,
121 | num_classes=None,
122 | is_training=is_training,
123 | global_pool=False,
124 | output_stride=output_stride)
125 |
126 | if is_training:
127 | exclude = [base_architecture + '/logits', 'global_step']
128 | variables_to_restore = tf.contrib.slim.get_variables_to_restore(exclude=exclude)
129 | tf.train.init_from_checkpoint(pre_trained_model,
130 | {v.name.split(':')[0]: v for v in variables_to_restore})
131 |
132 | inputs_size = tf.shape(inputs)[1:3]
133 | net = end_points[base_architecture + '/block4']
134 | net = atrous_spatial_pyramid_pooling(net, output_stride, batch_norm_decay, is_training)
135 | with tf.variable_scope("upsampling_logits"):
136 | net = layers_lib.conv2d(net, num_classes, [1, 1], activation_fn=None, normalizer_fn=None, scope='conv_1x1')
137 | logits = tf.image.resize_bilinear(net, inputs_size, name='upsample')
138 |
139 | return logits
140 |
141 | return model
142 |
143 |
144 | def deeplabv3_model_fn(features, labels, mode, params):
145 | """Model function for PASCAL VOC."""
146 | if isinstance(features, dict):
147 | features = features['feature']
148 |
149 | images = tf.cast(
150 | tf.map_fn(preprocessing.mean_image_addition, features),
151 | tf.uint8)
152 |
153 | network = deeplab_v3_generator(params['num_classes'],
154 | params['output_stride'],
155 | params['base_architecture'],
156 | params['pre_trained_model'],
157 | params['batch_norm_decay'])
158 |
159 | logits = network(features, mode == tf.estimator.ModeKeys.TRAIN)
160 |
161 | pred_classes = tf.expand_dims(tf.argmax(logits, axis=3, output_type=tf.int32), axis=3)
162 |
163 | pred_decoded_labels = tf.py_func(preprocessing.decode_labels,
164 | [pred_classes, params['batch_size'], params['num_classes']],
165 | tf.uint8)
166 |
167 | predictions = {
168 | 'classes': pred_classes,
169 | 'probabilities': tf.nn.softmax(logits, name='softmax_tensor'),
170 | 'decoded_labels': pred_decoded_labels
171 | }
172 |
173 | if mode == tf.estimator.ModeKeys.PREDICT:
174 | # Delete 'decoded_labels' from predictions because custom functions produce error when used with saved_model
175 | predictions_without_decoded_labels = predictions.copy()
176 | del predictions_without_decoded_labels['decoded_labels']
177 |
178 | return tf.estimator.EstimatorSpec(
179 | mode=mode,
180 | predictions=predictions,
181 | export_outputs={
182 | 'preds': tf.estimator.export.PredictOutput(
183 | predictions_without_decoded_labels)
184 | })
185 |
186 | gt_decoded_labels = tf.py_func(preprocessing.decode_labels,
187 | [labels, params['batch_size'], params['num_classes']], tf.uint8)
188 |
189 | labels = tf.squeeze(labels, axis=3) # reduce the channel dimension.
190 |
191 | logits_by_num_classes = tf.reshape(logits, [-1, params['num_classes']])
192 | labels_flat = tf.reshape(labels, [-1, ])
193 |
194 | valid_indices = tf.to_int32(labels_flat <= params['num_classes'] - 1)
195 | valid_logits = tf.dynamic_partition(logits_by_num_classes, valid_indices, num_partitions=2)[1]
196 | valid_labels = tf.dynamic_partition(labels_flat, valid_indices, num_partitions=2)[1]
197 |
198 | preds_flat = tf.reshape(pred_classes, [-1, ])
199 | valid_preds = tf.dynamic_partition(preds_flat, valid_indices, num_partitions=2)[1]
200 | confusion_matrix = tf.confusion_matrix(valid_labels, valid_preds, num_classes=params['num_classes'])
201 |
202 | predictions['valid_preds'] = valid_preds
203 | predictions['valid_labels'] = valid_labels
204 | predictions['confusion_matrix'] = confusion_matrix
205 |
206 | cross_entropy = tf.losses.sparse_softmax_cross_entropy(
207 | logits=valid_logits, labels=valid_labels)
208 |
209 | # Create a tensor named cross_entropy for logging purposes.
210 | tf.identity(cross_entropy, name='cross_entropy')
211 | tf.summary.scalar('cross_entropy', cross_entropy)
212 |
213 | if not params['freeze_batch_norm']:
214 | train_var_list = [v for v in tf.trainable_variables()]
215 | else:
216 | train_var_list = [v for v in tf.trainable_variables()
217 | if 'beta' not in v.name and 'gamma' not in v.name]
218 |
219 | # Add weight decay to the loss.
220 | with tf.variable_scope("total_loss"):
221 | loss = cross_entropy + params.get('weight_decay', _WEIGHT_DECAY) * tf.add_n(
222 | [tf.nn.l2_loss(v) for v in train_var_list])
223 | # loss = tf.losses.get_total_loss() # obtain the regularization losses as well
224 |
225 | if mode == tf.estimator.ModeKeys.TRAIN:
226 | tf.summary.image('images',
227 | tf.concat(axis=2, values=[images, gt_decoded_labels, pred_decoded_labels]),
228 | max_outputs=params['tensorboard_images_max_outputs']) # Concatenate row-wise.
229 |
230 | global_step = tf.train.get_or_create_global_step()
231 |
232 | if params['learning_rate_policy'] == 'piecewise':
233 | # Scale the learning rate linearly with the batch size. When the batch size
234 | # is 128, the learning rate should be 0.1.
235 | initial_learning_rate = 0.1 * params['batch_size'] / 128
236 | batches_per_epoch = params['num_train'] / params['batch_size']
237 | # Multiply the learning rate by 0.1 at 100, 150, and 200 epochs.
238 | boundaries = [int(batches_per_epoch * epoch) for epoch in [100, 150, 200]]
239 | values = [initial_learning_rate * decay for decay in [1, 0.1, 0.01, 0.001]]
240 | learning_rate = tf.train.piecewise_constant(
241 | tf.cast(global_step, tf.int32), boundaries, values)
242 | elif params['learning_rate_policy'] == 'poly':
243 | learning_rate = tf.train.polynomial_decay(
244 | params['initial_learning_rate'],
245 | tf.cast(global_step, tf.int32) - params['initial_global_step'],
246 | params['max_iter'], params['end_learning_rate'], power=params['power'])
247 | else:
248 | raise ValueError('Learning rate policy must be "piecewise" or "poly"')
249 |
250 | # Create a tensor named learning_rate for logging purposes
251 | tf.identity(learning_rate, name='learning_rate')
252 | tf.summary.scalar('learning_rate', learning_rate)
253 |
254 | optimizer = tf.train.MomentumOptimizer(
255 | learning_rate=learning_rate,
256 | momentum=params['momentum'])
257 |
258 | # Batch norm requires update ops to be added as a dependency to the train_op
259 | update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
260 | with tf.control_dependencies(update_ops):
261 | train_op = optimizer.minimize(loss, global_step, var_list=train_var_list)
262 | else:
263 | train_op = None
264 |
265 | accuracy = tf.metrics.accuracy(
266 | valid_labels, valid_preds)
267 | mean_iou = tf.metrics.mean_iou(valid_labels, valid_preds, params['num_classes'])
268 | metrics = {'px_accuracy': accuracy, 'mean_iou': mean_iou}
269 |
270 | # Create a tensor named train_accuracy for logging purposes
271 | tf.identity(accuracy[1], name='train_px_accuracy')
272 | tf.summary.scalar('train_px_accuracy', accuracy[1])
273 |
274 | def compute_mean_iou(total_cm, name='mean_iou'):
275 | """Compute the mean intersection-over-union via the confusion matrix."""
276 | sum_over_row = tf.to_float(tf.reduce_sum(total_cm, 0))
277 | sum_over_col = tf.to_float(tf.reduce_sum(total_cm, 1))
278 | cm_diag = tf.to_float(tf.diag_part(total_cm))
279 | denominator = sum_over_row + sum_over_col - cm_diag
280 |
281 | # The mean is only computed over classes that appear in the
282 | # label or prediction tensor. If the denominator is 0, we need to
283 | # ignore the class.
284 | num_valid_entries = tf.reduce_sum(tf.cast(
285 | tf.not_equal(denominator, 0), dtype=tf.float32))
286 |
287 | # If the value of the denominator is 0, set it to 1 to avoid
288 | # zero division.
289 | denominator = tf.where(
290 | tf.greater(denominator, 0),
291 | denominator,
292 | tf.ones_like(denominator))
293 | iou = tf.div(cm_diag, denominator)
294 |
295 | for i in range(params['num_classes']):
296 | tf.identity(iou[i], name='train_iou_class{}'.format(i))
297 | tf.summary.scalar('train_iou_class{}'.format(i), iou[i])
298 |
299 | # If the number of valid entries is 0 (no classes) we return 0.
300 | result = tf.where(
301 | tf.greater(num_valid_entries, 0),
302 | tf.reduce_sum(iou, name=name) / num_valid_entries,
303 | 0)
304 | return result
305 |
306 | train_mean_iou = compute_mean_iou(mean_iou[1])
307 |
308 | tf.identity(train_mean_iou, name='train_mean_iou')
309 | tf.summary.scalar('train_mean_iou', train_mean_iou)
310 |
311 | return tf.estimator.EstimatorSpec(
312 | mode=mode,
313 | predictions=predictions,
314 | loss=loss,
315 | train_op=train_op,
316 | eval_metric_ops=metrics)
317 |
--------------------------------------------------------------------------------
/evaluate.py:
--------------------------------------------------------------------------------
1 | """Evaluate a DeepLab v3 model."""
2 |
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import argparse
8 | import os
9 | import sys
10 |
11 | import tensorflow as tf
12 |
13 | import deeplab_model
14 | from utils import preprocessing
15 | from utils import dataset_util
16 |
17 | import numpy as np
18 | import timeit
19 |
20 | parser = argparse.ArgumentParser()
21 |
22 | parser.add_argument('--image_data_dir', type=str, default='dataset/VOCdevkit/VOC2012/JPEGImages',
23 | help='The directory containing the image data.')
24 |
25 | parser.add_argument('--label_data_dir', type=str, default='dataset/VOCdevkit/VOC2012/SegmentationClassAug',
26 | help='The directory containing the ground truth label data.')
27 |
28 | parser.add_argument('--evaluation_data_list', type=str, default='./dataset/val.txt',
29 | help='Path to the file listing the evaluation images.')
30 |
31 | parser.add_argument('--model_dir', type=str, default='./model',
32 | help="Base directory for the model. "
33 | "Make sure 'model_checkpoint_path' given in 'checkpoint' file matches "
34 | "with checkpoint name.")
35 |
36 | parser.add_argument('--base_architecture', type=str, default='resnet_v2_101',
37 | choices=['resnet_v2_50', 'resnet_v2_101'],
38 | help='The architecture of base Resnet building block.')
39 |
40 | parser.add_argument('--output_stride', type=int, default=16,
41 | choices=[8, 16],
42 | help='Output stride for DeepLab v3. Currently 8 or 16 is supported.')
43 |
44 | _NUM_CLASSES = 21
45 |
46 |
47 | def main(unused_argv):
48 | # Using the Winograd non-fused algorithms provides a small performance boost.
49 | os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
50 |
51 | examples = dataset_util.read_examples_list(FLAGS.evaluation_data_list)
52 | image_files = [os.path.join(FLAGS.image_data_dir, filename) + '.jpg' for filename in examples]
53 | label_files = [os.path.join(FLAGS.label_data_dir, filename) + '.png' for filename in examples]
54 |
55 | features, labels = preprocessing.eval_input_fn(image_files, label_files)
56 |
57 | predictions = deeplab_model.deeplabv3_model_fn(
58 | features,
59 | labels,
60 | tf.estimator.ModeKeys.EVAL,
61 | params={
62 | 'output_stride': FLAGS.output_stride,
63 | 'batch_size': 1, # Batch size must be 1 because the images' size may differ
64 | 'base_architecture': FLAGS.base_architecture,
65 | 'pre_trained_model': None,
66 | 'batch_norm_decay': None,
67 | 'num_classes': _NUM_CLASSES,
68 | 'freeze_batch_norm': True
69 | }).predictions
70 |
71 | # Manually load the latest checkpoint
72 | saver = tf.train.Saver()
73 | with tf.Session() as sess:
74 | ckpt = tf.train.get_checkpoint_state(FLAGS.model_dir)
75 | saver.restore(sess, ckpt.model_checkpoint_path)
76 |
77 | # Loop through the batches and store predictions and labels
78 | step = 1
79 | sum_cm = np.zeros((_NUM_CLASSES, _NUM_CLASSES), dtype=np.int32)
80 | start = timeit.default_timer()
81 | while True:
82 | try:
83 | preds = sess.run(predictions)
84 | sum_cm += preds['confusion_matrix']
85 | if not step % 100:
86 | stop = timeit.default_timer()
87 | tf.logging.info("current step = {} ({:.3f} sec)".format(step, stop-start))
88 | start = timeit.default_timer()
89 | step += 1
90 | except tf.errors.OutOfRangeError:
91 | break
92 |
93 | def compute_mean_iou(total_cm):
94 | """Compute the mean intersection-over-union via the confusion matrix."""
95 | sum_over_row = np.sum(total_cm, axis=0).astype(float)
96 | sum_over_col = np.sum(total_cm, axis=1).astype(float)
97 | cm_diag = np.diagonal(total_cm).astype(float)
98 | denominator = sum_over_row + sum_over_col - cm_diag
99 |
100 | # The mean is only computed over classes that appear in the
101 | # label or prediction tensor. If the denominator is 0, we need to
102 | # ignore the class.
103 | num_valid_entries = np.sum((denominator != 0).astype(float))
104 |
105 | # If the value of the denominator is 0, set it to 1 to avoid
106 | # zero division.
107 | denominator = np.where(
108 | denominator > 0,
109 | denominator,
110 | np.ones_like(denominator))
111 |
112 | ious = cm_diag / denominator
113 |
114 | print('Intersection over Union for each class:')
115 | for i, iou in enumerate(ious):
116 | print(' class {}: {:.4f}'.format(i, iou))
117 |
118 | # If the number of valid entries is 0 (no classes) we return 0.
119 | m_iou = np.where(
120 | num_valid_entries > 0,
121 | np.sum(ious) / num_valid_entries,
122 | 0)
123 | m_iou = float(m_iou)
124 | print('mean Intersection over Union: {:.4f}'.format(float(m_iou)))
125 |
126 | def compute_accuracy(total_cm):
127 | """Compute the accuracy via the confusion matrix."""
128 | denominator = total_cm.sum().astype(float)
129 | cm_diag_sum = np.diagonal(total_cm).sum().astype(float)
130 |
131 | # If the number of valid entries is 0 (no classes) we return 0.
132 | accuracy = np.where(
133 | denominator > 0,
134 | cm_diag_sum / denominator,
135 | 0)
136 | accuracy = float(accuracy)
137 | print('Pixel Accuracy: {:.4f}'.format(float(accuracy)))
138 |
139 | compute_mean_iou(sum_cm)
140 | compute_accuracy(sum_cm)
141 |
142 |
143 | if __name__ == '__main__':
144 | tf.logging.set_verbosity(tf.logging.INFO)
145 | FLAGS, unparsed = parser.parse_known_args()
146 | tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
147 |
--------------------------------------------------------------------------------
/export_inference_graph.py:
--------------------------------------------------------------------------------
1 | """Export inference graph."""
2 |
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import argparse
8 | import os
9 | import sys
10 |
11 | import tensorflow as tf
12 |
13 | import deeplab_model
14 | from utils import preprocessing
15 |
16 |
17 | parser = argparse.ArgumentParser()
18 |
19 | parser.add_argument('--model_dir', type=str, default='./model',
20 | help="Base directory for the model. "
21 | "Make sure 'model_checkpoint_path' given in 'checkpoint' file matches "
22 | "with checkpoint name.")
23 |
24 | parser.add_argument('--export_dir', type=str, default='dataset/export_output',
25 | help='The directory where the exported SavedModel will be stored.')
26 |
27 | parser.add_argument('--base_architecture', type=str, default='resnet_v2_101',
28 | choices=['resnet_v2_50', 'resnet_v2_101'],
29 | help='The architecture of base Resnet building block.')
30 |
31 | parser.add_argument('--output_stride', type=int, default=16,
32 | choices=[8, 16],
33 | help='Output stride for DeepLab v3. Currently 8 or 16 is supported.')
34 |
35 |
36 | _NUM_CLASSES = 21
37 |
38 |
39 | def main(unused_argv):
40 | # Using the Winograd non-fused algorithms provides a small performance boost.
41 | os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
42 |
43 | model = tf.estimator.Estimator(
44 | model_fn=deeplab_model.deeplabv3_model_fn,
45 | model_dir=FLAGS.model_dir,
46 | params={
47 | 'output_stride': FLAGS.output_stride,
48 | 'batch_size': 1, # Batch size must be 1 because the images' size may differ
49 | 'base_architecture': FLAGS.base_architecture,
50 | 'pre_trained_model': None,
51 | 'batch_norm_decay': None,
52 | 'num_classes': _NUM_CLASSES,
53 | })
54 |
55 | # Export the model
56 | def serving_input_receiver_fn():
57 | image = tf.placeholder(tf.float32, [None, None, None, 3], name='image_tensor')
58 | receiver_tensors = {'image': image}
59 | features = tf.map_fn(preprocessing.mean_image_subtraction, image)
60 | return tf.estimator.export.ServingInputReceiver(
61 | features=features,
62 | receiver_tensors=receiver_tensors)
63 |
64 | model.export_savedmodel(FLAGS.export_dir, serving_input_receiver_fn)
65 |
66 |
67 | if __name__ == '__main__':
68 | tf.logging.set_verbosity(tf.logging.INFO)
69 | FLAGS, unparsed = parser.parse_known_args()
70 | tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
71 |
--------------------------------------------------------------------------------
/images/tensorboard_images.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rishizek/tensorflow-deeplab-v3/a5d7ff2a14ebafb8a9b783271e4add82488528d3/images/tensorboard_images.png
--------------------------------------------------------------------------------
/images/tensorboard_miou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rishizek/tensorflow-deeplab-v3/a5d7ff2a14ebafb8a9b783271e4add82488528d3/images/tensorboard_miou.png
--------------------------------------------------------------------------------
/inference.py:
--------------------------------------------------------------------------------
1 | """Run inference a DeepLab v3 model using tf.estimator API."""
2 |
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import argparse
8 | import os
9 | import sys
10 |
11 | import tensorflow as tf
12 |
13 | import deeplab_model
14 | from utils import preprocessing
15 | from utils import dataset_util
16 |
17 | from PIL import Image
18 | import matplotlib.pyplot as plt
19 |
20 | from tensorflow.python import debug as tf_debug
21 |
22 | parser = argparse.ArgumentParser()
23 |
24 | parser.add_argument('--data_dir', type=str, default='dataset/VOCdevkit/VOC2012/JPEGImages',
25 | help='The directory containing the image data.')
26 |
27 | parser.add_argument('--output_dir', type=str, default='./dataset/inference_output',
28 | help='Path to the directory to generate the inference results')
29 |
30 | parser.add_argument('--infer_data_list', type=str, default='./dataset/sample_images_list.txt',
31 | help='Path to the file listing the inferring images.')
32 |
33 | parser.add_argument('--model_dir', type=str, default='./model',
34 | help="Base directory for the model. "
35 | "Make sure 'model_checkpoint_path' given in 'checkpoint' file matches "
36 | "with checkpoint name.")
37 |
38 | parser.add_argument('--base_architecture', type=str, default='resnet_v2_101',
39 | choices=['resnet_v2_50', 'resnet_v2_101'],
40 | help='The architecture of base Resnet building block.')
41 |
42 | parser.add_argument('--output_stride', type=int, default=16,
43 | choices=[8, 16],
44 | help='Output stride for DeepLab v3. Currently 8 or 16 is supported.')
45 |
46 | parser.add_argument('--debug', action='store_true',
47 | help='Whether to use debugger to track down bad values during training.')
48 |
49 | _NUM_CLASSES = 21
50 |
51 |
52 | def main(unused_argv):
53 | # Using the Winograd non-fused algorithms provides a small performance boost.
54 | os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
55 |
56 | pred_hooks = None
57 | if FLAGS.debug:
58 | debug_hook = tf_debug.LocalCLIDebugHook()
59 | pred_hooks = [debug_hook]
60 |
61 | model = tf.estimator.Estimator(
62 | model_fn=deeplab_model.deeplabv3_model_fn,
63 | model_dir=FLAGS.model_dir,
64 | params={
65 | 'output_stride': FLAGS.output_stride,
66 | 'batch_size': 1, # Batch size must be 1 because the images' size may differ
67 | 'base_architecture': FLAGS.base_architecture,
68 | 'pre_trained_model': None,
69 | 'batch_norm_decay': None,
70 | 'num_classes': _NUM_CLASSES,
71 | })
72 |
73 | examples = dataset_util.read_examples_list(FLAGS.infer_data_list)
74 | image_files = [os.path.join(FLAGS.data_dir, filename) for filename in examples]
75 |
76 | predictions = model.predict(
77 | input_fn=lambda: preprocessing.eval_input_fn(image_files),
78 | hooks=pred_hooks)
79 |
80 | output_dir = FLAGS.output_dir
81 | if not os.path.exists(output_dir):
82 | os.makedirs(output_dir)
83 |
84 | for pred_dict, image_path in zip(predictions, image_files):
85 | image_basename = os.path.splitext(os.path.basename(image_path))[0]
86 | output_filename = image_basename + '_mask.png'
87 | path_to_output = os.path.join(output_dir, output_filename)
88 |
89 | print("generating:", path_to_output)
90 | mask = pred_dict['decoded_labels']
91 | mask = Image.fromarray(mask)
92 | plt.axis('off')
93 | plt.imshow(mask)
94 | plt.savefig(path_to_output, bbox_inches='tight')
95 |
96 |
97 | if __name__ == '__main__':
98 | tf.logging.set_verbosity(tf.logging.INFO)
99 | FLAGS, unparsed = parser.parse_known_args()
100 | tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
101 |
--------------------------------------------------------------------------------
/train.py:
--------------------------------------------------------------------------------
1 | """Train a DeepLab v3 model using tf.estimator API."""
2 |
3 | from __future__ import absolute_import
4 | from __future__ import division
5 | from __future__ import print_function
6 |
7 | import argparse
8 | import os
9 | import sys
10 |
11 | import tensorflow as tf
12 | import deeplab_model
13 | from utils import preprocessing
14 | from tensorflow.python import debug as tf_debug
15 |
16 | import shutil
17 |
18 | parser = argparse.ArgumentParser()
19 |
20 | parser.add_argument('--model_dir', type=str, default='./model',
21 | help='Base directory for the model.')
22 |
23 | parser.add_argument('--clean_model_dir', action='store_true',
24 | help='Whether to clean up the model directory if present.')
25 |
26 | parser.add_argument('--train_epochs', type=int, default=26,
27 | help='Number of training epochs: '
28 | 'For 30K iteration with batch size 6, train_epoch = 17.01 (= 30K * 6 / 10,582). '
29 | 'For 30K iteration with batch size 8, train_epoch = 22.68 (= 30K * 8 / 10,582). '
30 | 'For 30K iteration with batch size 10, train_epoch = 25.52 (= 30K * 10 / 10,582). '
31 | 'For 30K iteration with batch size 11, train_epoch = 31.19 (= 30K * 11 / 10,582). '
32 | 'For 30K iteration with batch size 15, train_epoch = 42.53 (= 30K * 15 / 10,582). '
33 | 'For 30K iteration with batch size 16, train_epoch = 45.36 (= 30K * 16 / 10,582).')
34 |
35 | parser.add_argument('--epochs_per_eval', type=int, default=1,
36 | help='The number of training epochs to run between evaluations.')
37 |
38 | parser.add_argument('--tensorboard_images_max_outputs', type=int, default=6,
39 | help='Max number of batch elements to generate for Tensorboard.')
40 |
41 | parser.add_argument('--batch_size', type=int, default=10,
42 | help='Number of examples per batch.')
43 |
44 | parser.add_argument('--learning_rate_policy', type=str, default='poly',
45 | choices=['poly', 'piecewise'],
46 | help='Learning rate policy to optimize loss.')
47 |
48 | parser.add_argument('--max_iter', type=int, default=30000,
49 | help='Number of maximum iteration used for "poly" learning rate policy.')
50 |
51 | parser.add_argument('--data_dir', type=str, default='./dataset/',
52 | help='Path to the directory containing the PASCAL VOC data tf record.')
53 |
54 | parser.add_argument('--base_architecture', type=str, default='resnet_v2_101',
55 | choices=['resnet_v2_50', 'resnet_v2_101'],
56 | help='The architecture of base Resnet building block.')
57 |
58 | parser.add_argument('--pre_trained_model', type=str, default='./ini_checkpoints/resnet_v2_101/resnet_v2_101.ckpt',
59 | help='Path to the pre-trained model checkpoint.')
60 |
61 | parser.add_argument('--output_stride', type=int, default=16,
62 | choices=[8, 16],
63 | help='Output stride for DeepLab v3. Currently 8 or 16 is supported.')
64 |
65 | parser.add_argument('--freeze_batch_norm', action='store_true',
66 | help='Freeze batch normalization parameters during the training.')
67 |
68 | parser.add_argument('--initial_learning_rate', type=float, default=7e-3,
69 | help='Initial learning rate for the optimizer.')
70 |
71 | parser.add_argument('--end_learning_rate', type=float, default=1e-6,
72 | help='End learning rate for the optimizer.')
73 |
74 | parser.add_argument('--initial_global_step', type=int, default=0,
75 | help='Initial global step for controlling learning rate when fine-tuning model.')
76 |
77 | parser.add_argument('--weight_decay', type=float, default=2e-4,
78 | help='The weight decay to use for regularizing the model.')
79 |
80 | parser.add_argument('--debug', action='store_true',
81 | help='Whether to use debugger to track down bad values during training.')
82 |
83 | _NUM_CLASSES = 21
84 | _HEIGHT = 513
85 | _WIDTH = 513
86 | _DEPTH = 3
87 | _MIN_SCALE = 0.5
88 | _MAX_SCALE = 2.0
89 | _IGNORE_LABEL = 255
90 |
91 | _POWER = 0.9
92 | _MOMENTUM = 0.9
93 |
94 | _BATCH_NORM_DECAY = 0.9997
95 |
96 | _NUM_IMAGES = {
97 | 'train': 10582,
98 | 'validation': 1449,
99 | }
100 |
101 |
102 | def get_filenames(is_training, data_dir):
103 | """Return a list of filenames.
104 |
105 | Args:
106 | is_training: A boolean denoting whether the input is for training.
107 | data_dir: path to the the directory containing the input data.
108 |
109 | Returns:
110 | A list of file names.
111 | """
112 | if is_training:
113 | return [os.path.join(data_dir, 'voc_train.record')]
114 | else:
115 | return [os.path.join(data_dir, 'voc_val.record')]
116 |
117 |
118 | def parse_record(raw_record):
119 | """Parse PASCAL image and label from a tf record."""
120 | keys_to_features = {
121 | 'image/height':
122 | tf.FixedLenFeature((), tf.int64),
123 | 'image/width':
124 | tf.FixedLenFeature((), tf.int64),
125 | 'image/encoded':
126 | tf.FixedLenFeature((), tf.string, default_value=''),
127 | 'image/format':
128 | tf.FixedLenFeature((), tf.string, default_value='jpeg'),
129 | 'label/encoded':
130 | tf.FixedLenFeature((), tf.string, default_value=''),
131 | 'label/format':
132 | tf.FixedLenFeature((), tf.string, default_value='png'),
133 | }
134 |
135 | parsed = tf.parse_single_example(raw_record, keys_to_features)
136 |
137 | # height = tf.cast(parsed['image/height'], tf.int32)
138 | # width = tf.cast(parsed['image/width'], tf.int32)
139 |
140 | image = tf.image.decode_image(
141 | tf.reshape(parsed['image/encoded'], shape=[]), _DEPTH)
142 | image = tf.to_float(tf.image.convert_image_dtype(image, dtype=tf.uint8))
143 | image.set_shape([None, None, 3])
144 |
145 | label = tf.image.decode_image(
146 | tf.reshape(parsed['label/encoded'], shape=[]), 1)
147 | label = tf.to_int32(tf.image.convert_image_dtype(label, dtype=tf.uint8))
148 | label.set_shape([None, None, 1])
149 |
150 | return image, label
151 |
152 |
153 | def preprocess_image(image, label, is_training):
154 | """Preprocess a single image of layout [height, width, depth]."""
155 | if is_training:
156 | # Randomly scale the image and label.
157 | image, label = preprocessing.random_rescale_image_and_label(
158 | image, label, _MIN_SCALE, _MAX_SCALE)
159 |
160 | # Randomly crop or pad a [_HEIGHT, _WIDTH] section of the image and label.
161 | image, label = preprocessing.random_crop_or_pad_image_and_label(
162 | image, label, _HEIGHT, _WIDTH, _IGNORE_LABEL)
163 |
164 | # Randomly flip the image and label horizontally.
165 | image, label = preprocessing.random_flip_left_right_image_and_label(
166 | image, label)
167 |
168 | image.set_shape([_HEIGHT, _WIDTH, 3])
169 | label.set_shape([_HEIGHT, _WIDTH, 1])
170 |
171 | image = preprocessing.mean_image_subtraction(image)
172 |
173 | return image, label
174 |
175 |
176 | def input_fn(is_training, data_dir, batch_size, num_epochs=1):
177 | """Input_fn using the tf.data input pipeline for CIFAR-10 dataset.
178 |
179 | Args:
180 | is_training: A boolean denoting whether the input is for training.
181 | data_dir: The directory containing the input data.
182 | batch_size: The number of samples per batch.
183 | num_epochs: The number of epochs to repeat the dataset.
184 |
185 | Returns:
186 | A tuple of images and labels.
187 | """
188 | dataset = tf.data.Dataset.from_tensor_slices(get_filenames(is_training, data_dir))
189 | dataset = dataset.flat_map(tf.data.TFRecordDataset)
190 |
191 | if is_training:
192 | # When choosing shuffle buffer sizes, larger sizes result in better
193 | # randomness, while smaller sizes have better performance.
194 | # is a relatively small dataset, we choose to shuffle the full epoch.
195 | dataset = dataset.shuffle(buffer_size=_NUM_IMAGES['train'])
196 |
197 | dataset = dataset.map(parse_record)
198 | dataset = dataset.map(
199 | lambda image, label: preprocess_image(image, label, is_training))
200 | dataset = dataset.prefetch(batch_size)
201 |
202 | # We call repeat after shuffling, rather than before, to prevent separate
203 | # epochs from blending together.
204 | dataset = dataset.repeat(num_epochs)
205 | dataset = dataset.batch(batch_size)
206 |
207 | iterator = dataset.make_one_shot_iterator()
208 | images, labels = iterator.get_next()
209 |
210 | return images, labels
211 |
212 |
213 | def main(unused_argv):
214 | # Using the Winograd non-fused algorithms provides a small performance boost.
215 | os.environ['TF_ENABLE_WINOGRAD_NONFUSED'] = '1'
216 |
217 | if FLAGS.clean_model_dir:
218 | shutil.rmtree(FLAGS.model_dir, ignore_errors=True)
219 |
220 | # Set up a RunConfig to only save checkpoints once per training cycle.
221 | run_config = tf.estimator.RunConfig().replace(save_checkpoints_secs=1e9)
222 | model = tf.estimator.Estimator(
223 | model_fn=deeplab_model.deeplabv3_model_fn,
224 | model_dir=FLAGS.model_dir,
225 | config=run_config,
226 | params={
227 | 'output_stride': FLAGS.output_stride,
228 | 'batch_size': FLAGS.batch_size,
229 | 'base_architecture': FLAGS.base_architecture,
230 | 'pre_trained_model': FLAGS.pre_trained_model,
231 | 'batch_norm_decay': _BATCH_NORM_DECAY,
232 | 'num_classes': _NUM_CLASSES,
233 | 'tensorboard_images_max_outputs': FLAGS.tensorboard_images_max_outputs,
234 | 'weight_decay': FLAGS.weight_decay,
235 | 'learning_rate_policy': FLAGS.learning_rate_policy,
236 | 'num_train': _NUM_IMAGES['train'],
237 | 'initial_learning_rate': FLAGS.initial_learning_rate,
238 | 'max_iter': FLAGS.max_iter,
239 | 'end_learning_rate': FLAGS.end_learning_rate,
240 | 'power': _POWER,
241 | 'momentum': _MOMENTUM,
242 | 'freeze_batch_norm': FLAGS.freeze_batch_norm,
243 | 'initial_global_step': FLAGS.initial_global_step
244 | })
245 |
246 | for _ in range(FLAGS.train_epochs // FLAGS.epochs_per_eval):
247 | tensors_to_log = {
248 | 'learning_rate': 'learning_rate',
249 | 'cross_entropy': 'cross_entropy',
250 | 'train_px_accuracy': 'train_px_accuracy',
251 | 'train_mean_iou': 'train_mean_iou',
252 | }
253 |
254 | logging_hook = tf.train.LoggingTensorHook(
255 | tensors=tensors_to_log, every_n_iter=10)
256 | train_hooks = [logging_hook]
257 | eval_hooks = None
258 |
259 | if FLAGS.debug:
260 | debug_hook = tf_debug.LocalCLIDebugHook()
261 | train_hooks.append(debug_hook)
262 | eval_hooks = [debug_hook]
263 |
264 | tf.logging.info("Start training.")
265 | model.train(
266 | input_fn=lambda: input_fn(True, FLAGS.data_dir, FLAGS.batch_size, FLAGS.epochs_per_eval),
267 | hooks=train_hooks,
268 | # steps=1 # For debug
269 | )
270 |
271 | tf.logging.info("Start evaluation.")
272 | # Evaluate the model and print results
273 | eval_results = model.evaluate(
274 | # Batch size must be 1 for testing because the images' size differs
275 | input_fn=lambda: input_fn(False, FLAGS.data_dir, 1),
276 | hooks=eval_hooks,
277 | # steps=1 # For debug
278 | )
279 | print(eval_results)
280 |
281 |
282 | if __name__ == '__main__':
283 | tf.logging.set_verbosity(tf.logging.INFO)
284 | FLAGS, unparsed = parser.parse_known_args()
285 | tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
286 |
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/rishizek/tensorflow-deeplab-v3/a5d7ff2a14ebafb8a9b783271e4add82488528d3/utils/__init__.py
--------------------------------------------------------------------------------
/utils/dataset_util.py:
--------------------------------------------------------------------------------
1 | # Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2 | #
3 | # Licensed under the Apache License, Version 2.0 (the "License");
4 | # you may not use this file except in compliance with the License.
5 | # You may obtain a copy of the License at
6 | #
7 | # http://www.apache.org/licenses/LICENSE-2.0
8 | #
9 | # Unless required by applicable law or agreed to in writing, software
10 | # distributed under the License is distributed on an "AS IS" BASIS,
11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | # See the License for the specific language governing permissions and
13 | # limitations under the License.
14 | # ==============================================================================
15 |
16 | """Utility functions for creating TFRecord data sets.
17 | source: https://github.com/tensorflow/models/blob/master/research/object_detection/utils/dataset_util.py
18 | """
19 |
20 | import tensorflow as tf
21 |
22 |
23 | def int64_feature(value):
24 | return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
25 |
26 |
27 | def int64_list_feature(value):
28 | return tf.train.Feature(int64_list=tf.train.Int64List(value=value))
29 |
30 |
31 | def bytes_feature(value):
32 | return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
33 |
34 |
35 | def bytes_list_feature(value):
36 | return tf.train.Feature(bytes_list=tf.train.BytesList(value=value))
37 |
38 |
39 | def float_list_feature(value):
40 | return tf.train.Feature(float_list=tf.train.FloatList(value=value))
41 |
42 |
43 | def read_examples_list(path):
44 | """Read list of training or validation examples.
45 |
46 | The file is assumed to contain a single example per line where the first
47 | token in the line is an identifier that allows us to find the image and
48 | annotation xml for that example.
49 |
50 | For example, the line:
51 | xyz 3
52 | would allow us to find files xyz.jpg and xyz.xml (the 3 would be ignored).
53 |
54 | Args:
55 | path: absolute path to examples list file.
56 |
57 | Returns:
58 | list of example identifiers (strings).
59 | """
60 | with tf.gfile.GFile(path) as fid:
61 | lines = fid.readlines()
62 | return [line.strip().split(' ')[0] for line in lines]
63 |
64 |
65 | def recursive_parse_xml_to_dict(xml):
66 | """Recursively parses XML contents to python dict.
67 |
68 | We assume that `object` tags are the only ones that can appear
69 | multiple times at the same level of a tree.
70 |
71 | Args:
72 | xml: xml tree obtained by parsing XML file contents using lxml.etree
73 |
74 | Returns:
75 | Python dictionary holding XML contents.
76 | """
77 | if not xml:
78 | return {xml.tag: xml.text}
79 | result = {}
80 | for child in xml:
81 | child_result = recursive_parse_xml_to_dict(child)
82 | if child.tag != 'object':
83 | result[child.tag] = child_result[child.tag]
84 | else:
85 | if child.tag not in result:
86 | result[child.tag] = []
87 | result[child.tag].append(child_result[child.tag])
88 | return {xml.tag: result}
89 |
90 |
91 | def make_initializable_iterator(dataset):
92 | """Creates an iterator, and initializes tables.
93 |
94 | This is useful in cases where make_one_shot_iterator wouldn't work because
95 | the graph contains a hash table that needs to be initialized.
96 |
97 | Args:
98 | dataset: A `tf.data.Dataset` object.
99 |
100 | Returns:
101 | A `tf.data.Iterator`.
102 | """
103 | iterator = dataset.make_initializable_iterator()
104 | tf.add_to_collection(tf.GraphKeys.TABLE_INITIALIZERS, iterator.initializer)
105 | return iterator
106 |
107 |
108 | def read_dataset(
109 | file_read_func, decode_func, input_files, config, num_workers=1,
110 | worker_index=0):
111 | """Reads a dataset, and handles repetition and shuffling.
112 |
113 | Args:
114 | file_read_func: Function to use in tf.data.Dataset.interleave, to read
115 | every individual file into a tf.data.Dataset.
116 | decode_func: Function to apply to all records.
117 | input_files: A list of file paths to read.
118 | config: A input_reader_builder.InputReader object.
119 | num_workers: Number of workers / shards.
120 | worker_index: Id for the current worker.
121 |
122 | Returns:
123 | A tf.data.Dataset based on config.
124 | """
125 | # Shard, shuffle, and read files.
126 | filenames = tf.concat([tf.matching_files(pattern) for pattern in input_files],
127 | 0)
128 | dataset = tf.data.Dataset.from_tensor_slices(filenames)
129 | dataset = dataset.shard(num_workers, worker_index)
130 | dataset = dataset.repeat(config.num_epochs or None)
131 | if config.shuffle:
132 | dataset = dataset.shuffle(config.filenames_shuffle_buffer_size,
133 | reshuffle_each_iteration=True)
134 |
135 | # Read file records and shuffle them.
136 | # If cycle_length is larger than the number of files, more than one reader
137 | # will be assigned to the same file, leading to repetition.
138 | cycle_length = tf.cast(
139 | tf.minimum(config.num_readers, tf.size(filenames)), tf.int64)
140 | # TODO: find the optimal block_length.
141 | dataset = dataset.interleave(
142 | file_read_func, cycle_length=cycle_length, block_length=1)
143 |
144 | if config.shuffle:
145 | dataset = dataset.shuffle(config.shuffle_buffer_size,
146 | reshuffle_each_iteration=True)
147 |
148 | dataset = dataset.map(decode_func, num_parallel_calls=config.num_readers)
149 | return dataset.prefetch(config.prefetch_buffer_size)
150 |
--------------------------------------------------------------------------------
/utils/preprocessing.py:
--------------------------------------------------------------------------------
1 | """Utility functions for preprocessing data sets."""
2 |
3 | from PIL import Image
4 | import numpy as np
5 | import tensorflow as tf
6 |
7 | _R_MEAN = 123.68
8 | _G_MEAN = 116.78
9 | _B_MEAN = 103.94
10 |
11 | # colour map
12 | label_colours = [(0, 0, 0), # 0=background
13 | # 1=aeroplane, 2=bicycle, 3=bird, 4=boat, 5=bottle
14 | (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128),
15 | # 6=bus, 7=car, 8=cat, 9=chair, 10=cow
16 | (0, 128, 128), (128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0),
17 | # 11=dining table, 12=dog, 13=horse, 14=motorbike, 15=person
18 | (192, 128, 0), (64, 0, 128), (192, 0, 128), (64, 128, 128), (192, 128, 128),
19 | # 16=potted plant, 17=sheep, 18=sofa, 19=train, 20=tv/monitor
20 | (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128)]
21 |
22 |
23 | def decode_labels(mask, num_images=1, num_classes=21):
24 | """Decode batch of segmentation masks.
25 |
26 | Args:
27 | mask: result of inference after taking argmax.
28 | num_images: number of images to decode from the batch.
29 | num_classes: number of classes to predict (including background).
30 |
31 | Returns:
32 | A batch with num_images RGB images of the same size as the input.
33 | """
34 | n, h, w, c = mask.shape
35 | assert (n >= num_images), 'Batch size %d should be greater or equal than number of images to save %d.' \
36 | % (n, num_images)
37 | outputs = np.zeros((num_images, h, w, 3), dtype=np.uint8)
38 | for i in range(num_images):
39 | img = Image.new('RGB', (len(mask[i, 0]), len(mask[i])))
40 | pixels = img.load()
41 | for j_, j in enumerate(mask[i, :, :, 0]):
42 | for k_, k in enumerate(j):
43 | if k < num_classes:
44 | pixels[k_, j_] = label_colours[k]
45 | outputs[i] = np.array(img)
46 | return outputs
47 |
48 |
49 | def mean_image_addition(image, means=(_R_MEAN, _G_MEAN, _B_MEAN)):
50 | """Adds the given means from each image channel.
51 |
52 | For example:
53 | means = [123.68, 116.779, 103.939]
54 | image = _mean_image_subtraction(image, means)
55 |
56 | Note that the rank of `image` must be known.
57 |
58 | Args:
59 | image: a tensor of size [height, width, C].
60 | means: a C-vector of values to subtract from each channel.
61 |
62 | Returns:
63 | the centered image.
64 |
65 | Raises:
66 | ValueError: If the rank of `image` is unknown, if `image` has a rank other
67 | than three or if the number of channels in `image` doesn't match the
68 | number of values in `means`.
69 | """
70 | if image.get_shape().ndims != 3:
71 | raise ValueError('Input must be of size [height, width, C>0]')
72 | num_channels = image.get_shape().as_list()[-1]
73 | if len(means) != num_channels:
74 | raise ValueError('len(means) must match the number of channels')
75 |
76 | channels = tf.split(axis=2, num_or_size_splits=num_channels, value=image)
77 | for i in range(num_channels):
78 | channels[i] += means[i]
79 | return tf.concat(axis=2, values=channels)
80 |
81 |
82 | def mean_image_subtraction(image, means=(_R_MEAN, _G_MEAN, _B_MEAN)):
83 | """Subtracts the given means from each image channel.
84 |
85 | For example:
86 | means = [123.68, 116.779, 103.939]
87 | image = _mean_image_subtraction(image, means)
88 |
89 | Note that the rank of `image` must be known.
90 |
91 | Args:
92 | image: a tensor of size [height, width, C].
93 | means: a C-vector of values to subtract from each channel.
94 |
95 | Returns:
96 | the centered image.
97 |
98 | Raises:
99 | ValueError: If the rank of `image` is unknown, if `image` has a rank other
100 | than three or if the number of channels in `image` doesn't match the
101 | number of values in `means`.
102 | """
103 | if image.get_shape().ndims != 3:
104 | raise ValueError('Input must be of size [height, width, C>0]')
105 | num_channels = image.get_shape().as_list()[-1]
106 | if len(means) != num_channels:
107 | raise ValueError('len(means) must match the number of channels')
108 |
109 | channels = tf.split(axis=2, num_or_size_splits=num_channels, value=image)
110 | for i in range(num_channels):
111 | channels[i] -= means[i]
112 | return tf.concat(axis=2, values=channels)
113 |
114 |
115 | def random_rescale_image_and_label(image, label, min_scale, max_scale):
116 | """Rescale an image and label with in target scale.
117 |
118 | Rescales an image and label within the range of target scale.
119 |
120 | Args:
121 | image: 3-D Tensor of shape `[height, width, channels]`.
122 | label: 3-D Tensor of shape `[height, width, 1]`.
123 | min_scale: Min target scale.
124 | max_scale: Max target scale.
125 |
126 | Returns:
127 | Cropped and/or padded image.
128 | If `images` was 3-D, a 3-D float Tensor of shape
129 | `[new_height, new_width, channels]`.
130 | If `labels` was 3-D, a 3-D float Tensor of shape
131 | `[new_height, new_width, 1]`.
132 | """
133 | if min_scale <= 0:
134 | raise ValueError('\'min_scale\' must be greater than 0.')
135 | elif max_scale <= 0:
136 | raise ValueError('\'max_scale\' must be greater than 0.')
137 | elif min_scale >= max_scale:
138 | raise ValueError('\'max_scale\' must be greater than \'min_scale\'.')
139 |
140 | shape = tf.shape(image)
141 | height = tf.to_float(shape[0])
142 | width = tf.to_float(shape[1])
143 | scale = tf.random_uniform(
144 | [], minval=min_scale, maxval=max_scale, dtype=tf.float32)
145 | new_height = tf.to_int32(height * scale)
146 | new_width = tf.to_int32(width * scale)
147 | image = tf.image.resize_images(image, [new_height, new_width],
148 | method=tf.image.ResizeMethod.BILINEAR)
149 | # Since label classes are integers, nearest neighbor need to be used.
150 | label = tf.image.resize_images(label, [new_height, new_width],
151 | method=tf.image.ResizeMethod.NEAREST_NEIGHBOR)
152 |
153 | return image, label
154 |
155 |
156 | def random_crop_or_pad_image_and_label(image, label, crop_height, crop_width, ignore_label):
157 | """Crops and/or pads an image to a target width and height.
158 |
159 | Resizes an image to a target width and height by rondomly
160 | cropping the image or padding it evenly with zeros.
161 |
162 | Args:
163 | image: 3-D Tensor of shape `[height, width, channels]`.
164 | label: 3-D Tensor of shape `[height, width, 1]`.
165 | crop_height: The new height.
166 | crop_width: The new width.
167 | ignore_label: Label class to be ignored.
168 |
169 | Returns:
170 | Cropped and/or padded image.
171 | If `images` was 3-D, a 3-D float Tensor of shape
172 | `[new_height, new_width, channels]`.
173 | """
174 | label = label - ignore_label # Subtract due to 0 padding.
175 | label = tf.to_float(label)
176 | image_height = tf.shape(image)[0]
177 | image_width = tf.shape(image)[1]
178 | image_and_label = tf.concat([image, label], axis=2)
179 | image_and_label_pad = tf.image.pad_to_bounding_box(
180 | image_and_label, 0, 0,
181 | tf.maximum(crop_height, image_height),
182 | tf.maximum(crop_width, image_width))
183 | image_and_label_crop = tf.random_crop(
184 | image_and_label_pad, [crop_height, crop_width, 4])
185 |
186 | image_crop = image_and_label_crop[:, :, :3]
187 | label_crop = image_and_label_crop[:, :, 3:]
188 | label_crop += ignore_label
189 | label_crop = tf.to_int32(label_crop)
190 |
191 | return image_crop, label_crop
192 |
193 |
194 | def random_flip_left_right_image_and_label(image, label):
195 | """Randomly flip an image and label horizontally (left to right).
196 |
197 | Args:
198 | image: A 3-D tensor of shape `[height, width, channels].`
199 | label: A 3-D tensor of shape `[height, width, 1].`
200 |
201 | Returns:
202 | A 3-D tensor of the same type and shape as `image`.
203 | A 3-D tensor of the same type and shape as `label`.
204 | """
205 | uniform_random = tf.random_uniform([], 0, 1.0)
206 | mirror_cond = tf.less(uniform_random, .5)
207 | image = tf.cond(mirror_cond, lambda: tf.reverse(image, [1]), lambda: image)
208 | label = tf.cond(mirror_cond, lambda: tf.reverse(label, [1]), lambda: label)
209 |
210 | return image, label
211 |
212 |
213 | def eval_input_fn(image_filenames, label_filenames=None, batch_size=1):
214 | """An input function for evaluation and inference.
215 |
216 | Args:
217 | image_filenames: The file names for the inferred images.
218 | label_filenames: The file names for the grand truth labels.
219 | batch_size: The number of samples per batch. Need to be 1
220 | for the images of different sizes.
221 |
222 | Returns:
223 | A tuple of images and labels.
224 | """
225 | # Reads an image from a file, decodes it into a dense tensor
226 | def _parse_function(filename, is_label):
227 | if not is_label:
228 | image_filename, label_filename = filename, None
229 | else:
230 | image_filename, label_filename = filename
231 |
232 | image_string = tf.read_file(image_filename)
233 | image = tf.image.decode_image(image_string)
234 | image = tf.to_float(tf.image.convert_image_dtype(image, dtype=tf.uint8))
235 | image.set_shape([None, None, 3])
236 |
237 | image = mean_image_subtraction(image)
238 |
239 | if not is_label:
240 | return image
241 | else:
242 | label_string = tf.read_file(label_filename)
243 | label = tf.image.decode_image(label_string)
244 | label = tf.to_int32(tf.image.convert_image_dtype(label, dtype=tf.uint8))
245 | label.set_shape([None, None, 1])
246 |
247 | return image, label
248 |
249 | if label_filenames is None:
250 | input_filenames = image_filenames
251 | else:
252 | input_filenames = (image_filenames, label_filenames)
253 |
254 | dataset = tf.data.Dataset.from_tensor_slices(input_filenames)
255 | if label_filenames is None:
256 | dataset = dataset.map(lambda x: _parse_function(x, False))
257 | else:
258 | dataset = dataset.map(lambda x, y: _parse_function((x, y), True))
259 | dataset = dataset.prefetch(batch_size)
260 | dataset = dataset.batch(batch_size)
261 | iterator = dataset.make_one_shot_iterator()
262 |
263 | if label_filenames is None:
264 | images = iterator.get_next()
265 | labels = None
266 | else:
267 | images, labels = iterator.get_next()
268 |
269 | return images, labels
270 |
--------------------------------------------------------------------------------