├── .gitignore ├── LICENSE ├── README.md ├── dataset └── kitti │ └── ImageSets │ ├── test.txt │ ├── train.txt │ ├── trainval.txt │ └── val.txt ├── docs ├── demo.gif └── rtm3d_architecture.png ├── requirements.txt └── src ├── config ├── __init__.py ├── kitti_config.py └── train_config.py ├── data_process ├── __init__.py ├── kitti_data_utils.py ├── kitti_dataloader.py └── kitti_dataset.py ├── losses ├── __init__.py └── losses.py ├── models ├── __init__.py ├── fpn_resnet.py ├── model_utils.py └── resnet.py ├── test.py ├── train.py ├── train.sh └── utils ├── __init__.py ├── evaluation_utils.py ├── logger.py ├── misc.py ├── torch_utils.py └── train_utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_* 2 | dataset/ 3 | checkpoints/ 4 | logs/ 5 | src/.idea/ 6 | 7 | # Byte-compiled / optimized / DLL files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # C extensions 13 | *.so 14 | 15 | # Distribution / packaging 16 | .Python 17 | build/ 18 | develop-eggs/ 19 | dist/ 20 | downloads/ 21 | eggs/ 22 | .eggs/ 23 | lib/ 24 | lib64/ 25 | parts/ 26 | sdist/ 27 | var/ 28 | wheels/ 29 | pip-wheel-metadata/ 30 | share/python-wheels/ 31 | *.egg-info/ 32 | .installed.cfg 33 | *.egg 34 | MANIFEST 35 | 36 | # PyInstaller 37 | # Usually these files are written by a python script from a template 38 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 39 | *.manifest 40 | *.spec 41 | 42 | # Installer logs 43 | pip-log.txt 44 | pip-delete-this-directory.txt 45 | 46 | # Unit test / coverage reports 47 | htmlcov/ 48 | .tox/ 49 | .nox/ 50 | .coverage 51 | .coverage.* 52 | .cache 53 | nosetests.xml 54 | coverage.xml 55 | *.cover 56 | *.py,cover 57 | .hypothesis/ 58 | .pytest_cache/ 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | db.sqlite3 68 | db.sqlite3-journal 69 | 70 | # Flask stuff: 71 | instance/ 72 | .webassets-cache 73 | 74 | # Scrapy stuff: 75 | .scrapy 76 | 77 | # Sphinx documentation 78 | docs/_build/ 79 | 80 | # PyBuilder 81 | target/ 82 | 83 | # Jupyter Notebook 84 | .ipynb_checkpoints 85 | 86 | # IPython 87 | profile_default/ 88 | ipython_config.py 89 | 90 | # pyenv 91 | .python-version 92 | 93 | # pipenv 94 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 95 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 96 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 97 | # install all needed dependencies. 98 | #Pipfile.lock 99 | 100 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 101 | __pypackages__/ 102 | 103 | # Celery stuff 104 | celerybeat-schedule 105 | celerybeat.pid 106 | 107 | # SageMath parsed files 108 | *.sage.py 109 | 110 | # Environments 111 | .env 112 | .venv 113 | env/ 114 | venv/ 115 | ENV/ 116 | env.bak/ 117 | venv.bak/ 118 | 119 | # Spyder project settings 120 | .spyderproject 121 | .spyproject 122 | 123 | # Rope project settings 124 | .ropeproject 125 | 126 | # mkdocs documentation 127 | /site 128 | 129 | # mypy 130 | .mypy_cache/ 131 | .dmypy.json 132 | dmypy.json 133 | 134 | # Pyre type checker 135 | .pyre/ 136 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Nguyen Mau Dung 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 | # RTM3D-PyTorch 2 | 3 | [![python-image]][python-url] 4 | [![pytorch-image]][pytorch-url] 5 | 6 | The PyTorch Implementation of the paper: 7 | [RTM3D: Real-time Monocular 3D Detection from Object Keypoints for Autonomous Driving](https://arxiv.org/pdf/2001.03343.pdf) (ECCV 2020) 8 | 9 | --- 10 | 11 | ## Demonstration 12 | 13 | ![demo](./docs/demo.gif) 14 | 15 | ## Features 16 | - [x] Realtime 3D object detection based on a monocular RGB image 17 | - [x] Support [distributed data parallel training](https://github.com/pytorch/examples/tree/master/distributed/ddp) 18 | - [x] Tensorboard 19 | - [x] ResNet-based **K**eypoint **F**eature **P**yramid **N**etwork (KFPN) (Using by setting `--arch fpn_resnet_18`) 20 | - [ ] Use images from both left and right cameras (Control by setting the `use_left_cam_prob` argument) 21 | - [ ] Release pre-trained models 22 | 23 | 24 | 25 | ## Some modifications from the paper 26 | - _**Formula (3)**_: 27 | - A negative value can't be an input of the `log` operator, so please **don't normalize dim** as mentioned in 28 | the paper because the normalized dim values maybe less than `0`. Hence I've directly regressed to absolute dimension values in meters. 29 | - Use `L1 loss` for depth estimation (applying the `sigmoid` activation to the depth output first). 30 | 31 | - _**Formula (5)**_: I haven't taken the absolute values of the ground-truth, 32 | I have used the **relative values** instead. [The code is here](https://github.com/maudzung/RTM3D/blob/45b9d8af1298a6ad7dacb99a8f538f285696ded4/src/data_process/kitti_dataset.py#L284) 33 | 34 | - _**Formula (7)**_: `argmin` instead of `argmax` 35 | 36 | - Generate heatmap for the center and vertexes of objects as the CenterNet paper. If you want to use the strategy from RTM3D paper, 37 | you can pass the `dynamic-sigma` argument to the `train.py` script. 38 | 39 | 40 | ## 2. Getting Started 41 | ### 2.1. Requirement 42 | 43 | ```shell script 44 | pip install -U -r requirements.txt 45 | ``` 46 | 47 | ### 2.2. Data Preparation 48 | Download the 3D KITTI detection dataset from [here](http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d). 49 | 50 | The downloaded data includes: 51 | 52 | - Training labels of object data set _**(5 MB)**_ 53 | - Camera calibration matrices of object data set _**(16 MB)**_ 54 | - **Left color images** of object data set _**(12 GB)**_ 55 | - **Right color images** of object data set _**(12 GB)**_ 56 | 57 | Please make sure that you construct the source code & dataset directories structure as below. 58 | 59 | ### 2.3. RTM3D architecture 60 | 61 | 62 | ![architecture](./docs/rtm3d_architecture.png) 63 | 64 | 65 | The model takes **only the RGB images** as the input and outputs the `main center heatmap`, `vertexes heatmap`, 66 | and `vertexes coordinate` as the base module to estimate `3D bounding box`. 67 | 68 | ### 2.4. How to run 69 | 70 | #### 2.4.1. Visualize the dataset 71 | 72 | ```shell script 73 | cd src/data_process 74 | ``` 75 | 76 | - To visualize camera images with 3D boxes, let's execute: 77 | 78 | ```shell script 79 | python kitti_dataset.py 80 | ``` 81 | 82 | Then _Press **n** to see the next sample >>> Press **Esc** to quit..._ 83 | 84 | 85 | #### 2.4.2. Inference 86 | 87 | Download the trained model from [**_here_**](https://drive.google.com/drive/folders/1lKOLHhWZasoC7cKNLcB714LBDS91whCr?usp=sharing) (will be released), 88 | then put it to `${ROOT}/checkpoints/` and execute: 89 | 90 | ```shell script 91 | python test.py --gpu_idx 0 --arch resnet_18 --pretrained_path ../checkpoints/rtm3d_resnet_18.pth 92 | ``` 93 | 94 | #### 2.4.3. Evaluation 95 | 96 | ```shell script 97 | python evaluate.py --gpu_idx 0 --arch resnet_18 --pretrained_path 98 | ``` 99 | 100 | #### 2.4.4. Training 101 | 102 | ##### 2.4.4.1. Single machine, single gpu 103 | 104 | ```shell script 105 | python train.py --gpu_idx 0 --arch --batch_size --num_workers ... 106 | ``` 107 | 108 | ##### 2.4.4.2. Multi-processing Distributed Data Parallel Training 109 | We should always use the `nccl` backend for multi-processing distributed training since it currently provides the best 110 | distributed training performance. 111 | 112 | - **Single machine (node), multiple GPUs** 113 | 114 | ```shell script 115 | python train.py --dist-url 'tcp://127.0.0.1:29500' --dist-backend 'nccl' --multiprocessing-distributed --world-size 1 --rank 0 116 | ``` 117 | 118 | - **Two machines (two nodes), multiple GPUs** 119 | 120 | _**First machine**_ 121 | 122 | ```shell script 123 | python train.py --dist-url 'tcp://IP_OF_NODE1:FREEPORT' --dist-backend 'nccl' --multiprocessing-distributed --world-size 2 --rank 0 124 | ``` 125 | _**Second machine**_ 126 | 127 | ```shell script 128 | python train.py --dist-url 'tcp://IP_OF_NODE2:FREEPORT' --dist-backend 'nccl' --multiprocessing-distributed --world-size 2 --rank 1 129 | ``` 130 | 131 | To reproduce the results, you can run the bash shell script 132 | 133 | ```bash 134 | ./train.sh 135 | ``` 136 | 137 | 138 | #### Tensorboard 139 | 140 | - To track the training progress, go to the `logs/` folder and 141 | 142 | ```shell script 143 | cd logs//tensorboard/ 144 | tensorboard --logdir=./ 145 | ``` 146 | 147 | - Then go to [http://localhost:6006/](http://localhost:6006/): 148 | 149 | 150 | ## Contact 151 | 152 | If you think this work is useful, please give me a star!
153 | If you find any errors or have any suggestions, please contact me (**Email:** `nguyenmaudung93.kstn@gmail.com`).
154 | Thank you! 155 | 156 | 157 | ## Citation 158 | 159 | ```bash 160 | @article{RTM3D, 161 | author = {Peixuan Li, Huaici Zhao, Pengfei Liu, Feidao Cao}, 162 | title = {RTM3D: Real-time Monocular 3D Detection from Object Keypoints for Autonomous Driving}, 163 | year = {2020}, 164 | conference = {ECCV 2020}, 165 | } 166 | @misc{RTM3D-PyTorch, 167 | author = {Nguyen Mau Dung}, 168 | title = {{RTM3D-PyTorch: PyTorch Implementation of the RTM3D paper}}, 169 | howpublished = {\url{https://github.com/maudzung/RTM3D-PyTorch}}, 170 | year = {2020} 171 | } 172 | ``` 173 | 174 | ## References 175 | 176 | [1] CenterNet: [Objects as Points paper](https://arxiv.org/abs/1904.07850), [PyTorch Implementation](https://github.com/xingyizhou/CenterNet) 177 | 178 | ## Folder structure 179 | 180 | ``` 181 | ${ROOT} 182 | └── checkpoints/ 183 | ├── rtm3d_resnet_18.pth 184 | ├── rtm3d_fpn_resnet_18.pth 185 | └── dataset/ 186 | └── kitti/ 187 | ├──ImageSets/ 188 | │ ├── test.txt 189 | │ ├── train.txt 190 | │ └── val.txt 191 | ├── training/ 192 | │ ├── image_2/ (left color camera) 193 | │ ├── image_3/ (right color camera) 194 | │ ├── calib/ 195 | │ ├── label_2/ 196 | └── testing/ 197 | │ ├── image_2/ (left color camera) 198 | │ ├── image_3/ (right color camera) 199 | │ ├── calib/ 200 | └── classes_names.txt 201 | └── src/ 202 | ├── config/ 203 | │   ├── train_config.py 204 | │   └── kitti_config.py 205 | ├── data_process/ 206 | │   ├── kitti_dataloader.py 207 | │   ├── kitti_dataset.py 208 | │   └── kitti_data_utils.py 209 | ├── models/ 210 | │ ├── fpn_resnet.py 211 | │   ├── resnet.py 212 | │   ├── model_utils.py 213 | └── utils/ 214 | │ ├── evaluation_utils.py 215 | │ ├── logger.py 216 | │ ├── misc.py 217 | │ ├── torch_utils.py 218 | │ ├── train_utils.py 219 | ├── evaluate.py 220 | ├── test.py 221 | ├── train.py 222 | └── train.sh 223 | ├── README.md 224 | └── requirements.txt 225 | ``` 226 | 227 | 228 | ## Usage 229 | 230 | ``` 231 | usage: train.py [-h] [--seed SEED] [--saved_fn FN] [--root-dir PATH] 232 | [--arch ARCH] [--pretrained_path PATH] [--head_conv HEAD_CONV] 233 | [--hflip_prob HFLIP_PROB] 234 | [--use_left_cam_prob USE_LEFT_CAM_PROB] [--dynamic-sigma] 235 | [--no-val] [--num_samples NUM_SAMPLES] 236 | [--num_workers NUM_WORKERS] [--batch_size BATCH_SIZE] 237 | [--print_freq N] [--tensorboard_freq N] [--checkpoint_freq N] 238 | [--start_epoch N] [--num_epochs N] [--lr_type LR_TYPE] 239 | [--lr LR] [--minimum_lr MIN_LR] [--momentum M] [-wd WD] 240 | [--optimizer_type OPTIMIZER] [--steps [STEPS [STEPS ...]]] 241 | [--world-size N] [--rank N] [--dist-url DIST_URL] 242 | [--dist-backend DIST_BACKEND] [--gpu_idx GPU_IDX] [--no_cuda] 243 | [--multiprocessing-distributed] [--evaluate] 244 | [--resume_path PATH] [--K K] 245 | 246 | The Implementation of RTM3D using PyTorch 247 | 248 | optional arguments: 249 | -h, --help show this help message and exit 250 | --seed SEED re-produce the results with seed random 251 | --saved_fn FN The name using for saving logs, models,... 252 | --root-dir PATH The ROOT working directory 253 | --arch ARCH The name of the model architecture 254 | --pretrained_path PATH 255 | the path of the pretrained checkpoint 256 | --head_conv HEAD_CONV 257 | conv layer channels for output head0 for no conv 258 | layer-1 for default setting: 64 for resnets and 256 259 | for dla. 260 | --hflip_prob HFLIP_PROB 261 | The probability of horizontal flip 262 | --use_left_cam_prob USE_LEFT_CAM_PROB 263 | The probability of using the left camera 264 | --dynamic-sigma If true, compute sigma based on Amax, Amin then 265 | generate heamapIf false, compute radius as CenterNet 266 | did 267 | --no-val If true, dont evaluate the model on the val set 268 | --num_samples NUM_SAMPLES 269 | Take a subset of the dataset to run and debug 270 | --num_workers NUM_WORKERS 271 | Number of threads for loading data 272 | --batch_size BATCH_SIZE 273 | mini-batch size (default: 16), this is the totalbatch 274 | size of all GPUs on the current node when usingData 275 | Parallel or Distributed Data Parallel 276 | --print_freq N print frequency (default: 50) 277 | --tensorboard_freq N frequency of saving tensorboard (default: 50) 278 | --checkpoint_freq N frequency of saving checkpoints (default: 5) 279 | --start_epoch N the starting epoch 280 | --num_epochs N number of total epochs to run 281 | --lr_type LR_TYPE the type of learning rate scheduler (cosin or 282 | multi_step) 283 | --lr LR initial learning rate 284 | --minimum_lr MIN_LR minimum learning rate during training 285 | --momentum M momentum 286 | -wd WD, --weight_decay WD 287 | weight decay (default: 1e-6) 288 | --optimizer_type OPTIMIZER 289 | the type of optimizer, it can be sgd or adam 290 | --steps [STEPS [STEPS ...]] 291 | number of burn in step 292 | --world-size N number of nodes for distributed training 293 | --rank N node rank for distributed training 294 | --dist-url DIST_URL url used to set up distributed training 295 | --dist-backend DIST_BACKEND 296 | distributed backend 297 | --gpu_idx GPU_IDX GPU index to use. 298 | --no_cuda If true, cuda is not used. 299 | --multiprocessing-distributed 300 | Use multi-processing distributed training to launch N 301 | processes per node, which has N GPUs. This is the 302 | fastest way to use PyTorch for either single node or 303 | multi node data parallel training 304 | --evaluate only evaluate the model, not training 305 | --resume_path PATH the path of the resumed checkpoint 306 | --K K the number of top K 307 | ``` 308 | 309 | 310 | 311 | [python-image]: https://img.shields.io/badge/Python-3.6-ff69b4.svg 312 | [python-url]: https://www.python.org/ 313 | [pytorch-image]: https://img.shields.io/badge/PyTorch-1.5-2BAF2B.svg 314 | [pytorch-url]: https://pytorch.org/ -------------------------------------------------------------------------------- /dataset/kitti/ImageSets/train.txt: -------------------------------------------------------------------------------- 1 | 000000 2 | 000003 3 | 000007 4 | 000009 5 | 000010 6 | 000011 7 | 000012 8 | 000013 9 | 000014 10 | 000016 11 | 000017 12 | 000018 13 | 000022 14 | 000026 15 | 000029 16 | 000030 17 | 000032 18 | 000034 19 | 000036 20 | 000038 21 | 000041 22 | 000043 23 | 000044 24 | 000045 25 | 000046 26 | 000049 27 | 000051 28 | 000054 29 | 000055 30 | 000056 31 | 000057 32 | 000060 33 | 000064 34 | 000067 35 | 000068 36 | 000069 37 | 000070 38 | 000071 39 | 000072 40 | 000073 41 | 000074 42 | 000075 43 | 000079 44 | 000080 45 | 000082 46 | 000083 47 | 000084 48 | 000085 49 | 000086 50 | 000087 51 | 000088 52 | 000091 53 | 000092 54 | 000095 55 | 000096 56 | 000097 57 | 000099 58 | 000100 59 | 000101 60 | 000103 61 | 000105 62 | 000109 63 | 000110 64 | 000111 65 | 000112 66 | 000113 67 | 000114 68 | 000115 69 | 000119 70 | 000120 71 | 000121 72 | 000123 73 | 000125 74 | 000127 75 | 000129 76 | 000130 77 | 000131 78 | 000133 79 | 000136 80 | 000138 81 | 000141 82 | 000142 83 | 000144 84 | 000145 85 | 000146 86 | 000148 87 | 000149 88 | 000150 89 | 000154 90 | 000155 91 | 000157 92 | 000158 93 | 000160 94 | 000162 95 | 000163 96 | 000164 97 | 000165 98 | 000166 99 | 000171 100 | 000172 101 | 000176 102 | 000177 103 | 000178 104 | 000179 105 | 000180 106 | 000184 107 | 000185 108 | 000189 109 | 000193 110 | 000198 111 | 000200 112 | 000202 113 | 000205 114 | 000206 115 | 000208 116 | 000209 117 | 000210 118 | 000214 119 | 000215 120 | 000217 121 | 000219 122 | 000220 123 | 000221 124 | 000222 125 | 000225 126 | 000227 127 | 000228 128 | 000232 129 | 000233 130 | 000238 131 | 000240 132 | 000241 133 | 000243 134 | 000244 135 | 000245 136 | 000253 137 | 000254 138 | 000255 139 | 000256 140 | 000257 141 | 000258 142 | 000259 143 | 000261 144 | 000264 145 | 000267 146 | 000271 147 | 000274 148 | 000275 149 | 000276 150 | 000277 151 | 000280 152 | 000282 153 | 000285 154 | 000286 155 | 000287 156 | 000288 157 | 000292 158 | 000294 159 | 000295 160 | 000296 161 | 000298 162 | 000299 163 | 000300 164 | 000303 165 | 000304 166 | 000306 167 | 000310 168 | 000313 169 | 000316 170 | 000317 171 | 000318 172 | 000322 173 | 000325 174 | 000326 175 | 000330 176 | 000331 177 | 000334 178 | 000337 179 | 000338 180 | 000339 181 | 000342 182 | 000344 183 | 000348 184 | 000349 185 | 000353 186 | 000358 187 | 000363 188 | 000364 189 | 000367 190 | 000368 191 | 000371 192 | 000374 193 | 000375 194 | 000380 195 | 000384 196 | 000387 197 | 000389 198 | 000390 199 | 000400 200 | 000405 201 | 000406 202 | 000410 203 | 000411 204 | 000412 205 | 000416 206 | 000417 207 | 000418 208 | 000421 209 | 000423 210 | 000424 211 | 000425 212 | 000426 213 | 000431 214 | 000432 215 | 000433 216 | 000434 217 | 000435 218 | 000438 219 | 000439 220 | 000441 221 | 000442 222 | 000444 223 | 000445 224 | 000447 225 | 000449 226 | 000456 227 | 000458 228 | 000460 229 | 000461 230 | 000462 231 | 000464 232 | 000465 233 | 000466 234 | 000467 235 | 000470 236 | 000471 237 | 000474 238 | 000482 239 | 000483 240 | 000484 241 | 000487 242 | 000488 243 | 000490 244 | 000497 245 | 000500 246 | 000501 247 | 000502 248 | 000505 249 | 000507 250 | 000511 251 | 000513 252 | 000514 253 | 000516 254 | 000518 255 | 000520 256 | 000522 257 | 000523 258 | 000525 259 | 000526 260 | 000529 261 | 000531 262 | 000532 263 | 000534 264 | 000535 265 | 000537 266 | 000538 267 | 000539 268 | 000540 269 | 000544 270 | 000547 271 | 000549 272 | 000550 273 | 000552 274 | 000553 275 | 000556 276 | 000557 277 | 000562 278 | 000563 279 | 000565 280 | 000570 281 | 000573 282 | 000574 283 | 000575 284 | 000576 285 | 000577 286 | 000578 287 | 000579 288 | 000580 289 | 000582 290 | 000584 291 | 000585 292 | 000586 293 | 000587 294 | 000592 295 | 000593 296 | 000594 297 | 000596 298 | 000597 299 | 000598 300 | 000599 301 | 000602 302 | 000603 303 | 000605 304 | 000606 305 | 000607 306 | 000608 307 | 000609 308 | 000616 309 | 000617 310 | 000621 311 | 000622 312 | 000623 313 | 000627 314 | 000629 315 | 000631 316 | 000632 317 | 000633 318 | 000637 319 | 000638 320 | 000640 321 | 000641 322 | 000643 323 | 000646 324 | 000649 325 | 000651 326 | 000652 327 | 000653 328 | 000654 329 | 000656 330 | 000661 331 | 000662 332 | 000663 333 | 000664 334 | 000665 335 | 000666 336 | 000668 337 | 000671 338 | 000672 339 | 000673 340 | 000675 341 | 000676 342 | 000678 343 | 000680 344 | 000681 345 | 000685 346 | 000686 347 | 000687 348 | 000688 349 | 000689 350 | 000690 351 | 000693 352 | 000695 353 | 000697 354 | 000701 355 | 000703 356 | 000705 357 | 000707 358 | 000709 359 | 000710 360 | 000711 361 | 000712 362 | 000713 363 | 000714 364 | 000715 365 | 000719 366 | 000720 367 | 000723 368 | 000724 369 | 000726 370 | 000730 371 | 000732 372 | 000733 373 | 000735 374 | 000738 375 | 000739 376 | 000742 377 | 000743 378 | 000744 379 | 000747 380 | 000749 381 | 000753 382 | 000755 383 | 000757 384 | 000758 385 | 000759 386 | 000760 387 | 000762 388 | 000763 389 | 000764 390 | 000770 391 | 000775 392 | 000776 393 | 000777 394 | 000780 395 | 000781 396 | 000783 397 | 000784 398 | 000785 399 | 000786 400 | 000787 401 | 000788 402 | 000789 403 | 000791 404 | 000793 405 | 000794 406 | 000796 407 | 000797 408 | 000799 409 | 000808 410 | 000813 411 | 000814 412 | 000815 413 | 000817 414 | 000818 415 | 000820 416 | 000821 417 | 000822 418 | 000824 419 | 000825 420 | 000827 421 | 000828 422 | 000829 423 | 000830 424 | 000832 425 | 000833 426 | 000834 427 | 000835 428 | 000836 429 | 000839 430 | 000842 431 | 000845 432 | 000846 433 | 000851 434 | 000853 435 | 000855 436 | 000856 437 | 000857 438 | 000858 439 | 000860 440 | 000861 441 | 000864 442 | 000865 443 | 000866 444 | 000867 445 | 000868 446 | 000870 447 | 000871 448 | 000872 449 | 000880 450 | 000882 451 | 000883 452 | 000886 453 | 000887 454 | 000888 455 | 000890 456 | 000891 457 | 000892 458 | 000895 459 | 000896 460 | 000898 461 | 000900 462 | 000901 463 | 000902 464 | 000903 465 | 000905 466 | 000906 467 | 000908 468 | 000910 469 | 000913 470 | 000914 471 | 000918 472 | 000919 473 | 000921 474 | 000924 475 | 000925 476 | 000927 477 | 000929 478 | 000933 479 | 000934 480 | 000935 481 | 000936 482 | 000937 483 | 000941 484 | 000945 485 | 000946 486 | 000947 487 | 000950 488 | 000951 489 | 000954 490 | 000955 491 | 000957 492 | 000959 493 | 000960 494 | 000962 495 | 000965 496 | 000968 497 | 000972 498 | 000975 499 | 000977 500 | 000978 501 | 000980 502 | 000982 503 | 000987 504 | 000989 505 | 000990 506 | 000992 507 | 000993 508 | 000994 509 | 000995 510 | 000996 511 | 000997 512 | 000998 513 | 001000 514 | 001001 515 | 001003 516 | 001004 517 | 001005 518 | 001009 519 | 001016 520 | 001017 521 | 001020 522 | 001023 523 | 001024 524 | 001028 525 | 001029 526 | 001030 527 | 001031 528 | 001032 529 | 001033 530 | 001034 531 | 001036 532 | 001038 533 | 001040 534 | 001041 535 | 001044 536 | 001045 537 | 001047 538 | 001048 539 | 001049 540 | 001052 541 | 001056 542 | 001057 543 | 001059 544 | 001060 545 | 001061 546 | 001062 547 | 001064 548 | 001072 549 | 001073 550 | 001074 551 | 001079 552 | 001080 553 | 001081 554 | 001082 555 | 001085 556 | 001087 557 | 001090 558 | 001091 559 | 001092 560 | 001093 561 | 001098 562 | 001100 563 | 001103 564 | 001105 565 | 001109 566 | 001110 567 | 001112 568 | 001117 569 | 001119 570 | 001121 571 | 001122 572 | 001124 573 | 001126 574 | 001128 575 | 001130 576 | 001137 577 | 001142 578 | 001146 579 | 001151 580 | 001156 581 | 001157 582 | 001159 583 | 001160 584 | 001161 585 | 001164 586 | 001165 587 | 001166 588 | 001168 589 | 001169 590 | 001170 591 | 001171 592 | 001174 593 | 001175 594 | 001181 595 | 001184 596 | 001185 597 | 001186 598 | 001190 599 | 001196 600 | 001197 601 | 001200 602 | 001201 603 | 001202 604 | 001204 605 | 001205 606 | 001208 607 | 001209 608 | 001210 609 | 001211 610 | 001212 611 | 001215 612 | 001219 613 | 001220 614 | 001223 615 | 001227 616 | 001229 617 | 001231 618 | 001233 619 | 001238 620 | 001240 621 | 001247 622 | 001248 623 | 001250 624 | 001256 625 | 001258 626 | 001262 627 | 001264 628 | 001276 629 | 001277 630 | 001278 631 | 001279 632 | 001280 633 | 001282 634 | 001283 635 | 001285 636 | 001288 637 | 001290 638 | 001293 639 | 001297 640 | 001298 641 | 001299 642 | 001300 643 | 001301 644 | 001302 645 | 001309 646 | 001310 647 | 001311 648 | 001312 649 | 001313 650 | 001315 651 | 001316 652 | 001319 653 | 001320 654 | 001321 655 | 001322 656 | 001323 657 | 001324 658 | 001325 659 | 001326 660 | 001327 661 | 001328 662 | 001335 663 | 001338 664 | 001340 665 | 001341 666 | 001343 667 | 001348 668 | 001349 669 | 001351 670 | 001354 671 | 001357 672 | 001358 673 | 001360 674 | 001361 675 | 001362 676 | 001364 677 | 001366 678 | 001367 679 | 001368 680 | 001369 681 | 001370 682 | 001371 683 | 001373 684 | 001378 685 | 001379 686 | 001383 687 | 001385 688 | 001390 689 | 001392 690 | 001393 691 | 001394 692 | 001396 693 | 001399 694 | 001400 695 | 001401 696 | 001402 697 | 001403 698 | 001404 699 | 001405 700 | 001406 701 | 001408 702 | 001409 703 | 001413 704 | 001414 705 | 001417 706 | 001418 707 | 001420 708 | 001422 709 | 001423 710 | 001425 711 | 001426 712 | 001428 713 | 001429 714 | 001430 715 | 001433 716 | 001434 717 | 001436 718 | 001440 719 | 001444 720 | 001447 721 | 001449 722 | 001452 723 | 001453 724 | 001454 725 | 001455 726 | 001456 727 | 001457 728 | 001459 729 | 001460 730 | 001462 731 | 001464 732 | 001465 733 | 001467 734 | 001468 735 | 001470 736 | 001472 737 | 001473 738 | 001474 739 | 001475 740 | 001476 741 | 001479 742 | 001482 743 | 001483 744 | 001484 745 | 001486 746 | 001490 747 | 001491 748 | 001492 749 | 001493 750 | 001494 751 | 001496 752 | 001498 753 | 001499 754 | 001500 755 | 001503 756 | 001504 757 | 001505 758 | 001506 759 | 001509 760 | 001510 761 | 001512 762 | 001515 763 | 001518 764 | 001519 765 | 001520 766 | 001523 767 | 001529 768 | 001530 769 | 001531 770 | 001532 771 | 001534 772 | 001539 773 | 001540 774 | 001541 775 | 001543 776 | 001544 777 | 001548 778 | 001550 779 | 001551 780 | 001553 781 | 001554 782 | 001556 783 | 001558 784 | 001559 785 | 001561 786 | 001563 787 | 001566 788 | 001568 789 | 001570 790 | 001571 791 | 001572 792 | 001575 793 | 001578 794 | 001580 795 | 001581 796 | 001584 797 | 001593 798 | 001595 799 | 001598 800 | 001599 801 | 001601 802 | 001604 803 | 001607 804 | 001608 805 | 001609 806 | 001611 807 | 001612 808 | 001614 809 | 001618 810 | 001620 811 | 001622 812 | 001623 813 | 001624 814 | 001626 815 | 001628 816 | 001630 817 | 001632 818 | 001636 819 | 001637 820 | 001638 821 | 001639 822 | 001641 823 | 001642 824 | 001644 825 | 001646 826 | 001648 827 | 001649 828 | 001651 829 | 001652 830 | 001653 831 | 001655 832 | 001657 833 | 001659 834 | 001661 835 | 001663 836 | 001668 837 | 001669 838 | 001671 839 | 001672 840 | 001673 841 | 001674 842 | 001676 843 | 001677 844 | 001678 845 | 001679 846 | 001681 847 | 001685 848 | 001686 849 | 001687 850 | 001688 851 | 001690 852 | 001691 853 | 001692 854 | 001695 855 | 001696 856 | 001698 857 | 001700 858 | 001703 859 | 001708 860 | 001715 861 | 001716 862 | 001720 863 | 001723 864 | 001724 865 | 001725 866 | 001728 867 | 001730 868 | 001731 869 | 001734 870 | 001735 871 | 001736 872 | 001737 873 | 001738 874 | 001739 875 | 001743 876 | 001744 877 | 001747 878 | 001748 879 | 001753 880 | 001754 881 | 001756 882 | 001757 883 | 001759 884 | 001760 885 | 001761 886 | 001763 887 | 001766 888 | 001767 889 | 001769 890 | 001770 891 | 001773 892 | 001775 893 | 001777 894 | 001779 895 | 001784 896 | 001785 897 | 001788 898 | 001789 899 | 001790 900 | 001791 901 | 001792 902 | 001793 903 | 001796 904 | 001798 905 | 001799 906 | 001803 907 | 001805 908 | 001806 909 | 001809 910 | 001810 911 | 001811 912 | 001812 913 | 001815 914 | 001816 915 | 001819 916 | 001821 917 | 001826 918 | 001827 919 | 001829 920 | 001830 921 | 001832 922 | 001833 923 | 001834 924 | 001836 925 | 001837 926 | 001838 927 | 001839 928 | 001841 929 | 001842 930 | 001843 931 | 001845 932 | 001847 933 | 001849 934 | 001850 935 | 001857 936 | 001860 937 | 001864 938 | 001865 939 | 001866 940 | 001870 941 | 001871 942 | 001873 943 | 001874 944 | 001876 945 | 001879 946 | 001882 947 | 001883 948 | 001889 949 | 001891 950 | 001894 951 | 001895 952 | 001896 953 | 001899 954 | 001901 955 | 001902 956 | 001903 957 | 001906 958 | 001907 959 | 001908 960 | 001910 961 | 001911 962 | 001912 963 | 001913 964 | 001914 965 | 001915 966 | 001916 967 | 001917 968 | 001918 969 | 001921 970 | 001922 971 | 001930 972 | 001935 973 | 001938 974 | 001939 975 | 001944 976 | 001947 977 | 001948 978 | 001949 979 | 001950 980 | 001951 981 | 001953 982 | 001955 983 | 001956 984 | 001957 985 | 001958 986 | 001961 987 | 001962 988 | 001963 989 | 001964 990 | 001965 991 | 001968 992 | 001970 993 | 001971 994 | 001973 995 | 001974 996 | 001975 997 | 001976 998 | 001981 999 | 001987 1000 | 001988 1001 | 001990 1002 | 001992 1003 | 001993 1004 | 001994 1005 | 001998 1006 | 002003 1007 | 002005 1008 | 002006 1009 | 002007 1010 | 002009 1011 | 002015 1012 | 002016 1013 | 002018 1014 | 002020 1015 | 002023 1016 | 002024 1017 | 002026 1018 | 002030 1019 | 002031 1020 | 002032 1021 | 002033 1022 | 002039 1023 | 002040 1024 | 002041 1025 | 002047 1026 | 002051 1027 | 002053 1028 | 002055 1029 | 002059 1030 | 002060 1031 | 002061 1032 | 002063 1033 | 002064 1034 | 002065 1035 | 002066 1036 | 002067 1037 | 002069 1038 | 002070 1039 | 002072 1040 | 002077 1041 | 002080 1042 | 002083 1043 | 002084 1044 | 002088 1045 | 002090 1046 | 002092 1047 | 002095 1048 | 002096 1049 | 002097 1050 | 002098 1051 | 002099 1052 | 002104 1053 | 002105 1054 | 002106 1055 | 002109 1056 | 002110 1057 | 002114 1058 | 002116 1059 | 002117 1060 | 002119 1061 | 002122 1062 | 002125 1063 | 002126 1064 | 002129 1065 | 002132 1066 | 002133 1067 | 002134 1068 | 002141 1069 | 002143 1070 | 002144 1071 | 002145 1072 | 002146 1073 | 002147 1074 | 002148 1075 | 002149 1076 | 002150 1077 | 002154 1078 | 002155 1079 | 002156 1080 | 002157 1081 | 002162 1082 | 002164 1083 | 002167 1084 | 002171 1085 | 002172 1086 | 002174 1087 | 002175 1088 | 002176 1089 | 002178 1090 | 002180 1091 | 002181 1092 | 002184 1093 | 002186 1094 | 002189 1095 | 002190 1096 | 002191 1097 | 002192 1098 | 002194 1099 | 002195 1100 | 002197 1101 | 002198 1102 | 002199 1103 | 002203 1104 | 002204 1105 | 002205 1106 | 002208 1107 | 002210 1108 | 002211 1109 | 002212 1110 | 002213 1111 | 002214 1112 | 002217 1113 | 002221 1114 | 002222 1115 | 002223 1116 | 002226 1117 | 002227 1118 | 002230 1119 | 002231 1120 | 002235 1121 | 002236 1122 | 002237 1123 | 002238 1124 | 002240 1125 | 002241 1126 | 002242 1127 | 002244 1128 | 002247 1129 | 002249 1130 | 002252 1131 | 002253 1132 | 002256 1133 | 002259 1134 | 002261 1135 | 002263 1136 | 002264 1137 | 002265 1138 | 002267 1139 | 002268 1140 | 002269 1141 | 002270 1142 | 002271 1143 | 002273 1144 | 002274 1145 | 002275 1146 | 002278 1147 | 002281 1148 | 002285 1149 | 002288 1150 | 002289 1151 | 002296 1152 | 002297 1153 | 002301 1154 | 002302 1155 | 002305 1156 | 002309 1157 | 002311 1158 | 002312 1159 | 002313 1160 | 002316 1161 | 002317 1162 | 002318 1163 | 002321 1164 | 002322 1165 | 002323 1166 | 002324 1167 | 002326 1168 | 002328 1169 | 002331 1170 | 002333 1171 | 002335 1172 | 002339 1173 | 002342 1174 | 002343 1175 | 002349 1176 | 002350 1177 | 002351 1178 | 002352 1179 | 002354 1180 | 002355 1181 | 002358 1182 | 002360 1183 | 002361 1184 | 002363 1185 | 002364 1186 | 002368 1187 | 002371 1188 | 002373 1189 | 002374 1190 | 002375 1191 | 002377 1192 | 002379 1193 | 002381 1194 | 002388 1195 | 002389 1196 | 002390 1197 | 002394 1198 | 002395 1199 | 002396 1200 | 002400 1201 | 002401 1202 | 002402 1203 | 002403 1204 | 002406 1205 | 002407 1206 | 002408 1207 | 002409 1208 | 002410 1209 | 002412 1210 | 002413 1211 | 002416 1212 | 002417 1213 | 002421 1214 | 002426 1215 | 002427 1216 | 002430 1217 | 002431 1218 | 002435 1219 | 002436 1220 | 002437 1221 | 002438 1222 | 002441 1223 | 002443 1224 | 002444 1225 | 002445 1226 | 002447 1227 | 002448 1228 | 002449 1229 | 002451 1230 | 002452 1231 | 002453 1232 | 002456 1233 | 002459 1234 | 002464 1235 | 002465 1236 | 002466 1237 | 002467 1238 | 002468 1239 | 002469 1240 | 002470 1241 | 002471 1242 | 002472 1243 | 002475 1244 | 002480 1245 | 002481 1246 | 002482 1247 | 002484 1248 | 002485 1249 | 002487 1250 | 002489 1251 | 002491 1252 | 002493 1253 | 002494 1254 | 002496 1255 | 002498 1256 | 002501 1257 | 002507 1258 | 002508 1259 | 002510 1260 | 002512 1261 | 002513 1262 | 002514 1263 | 002515 1264 | 002517 1265 | 002518 1266 | 002522 1267 | 002523 1268 | 002524 1269 | 002527 1270 | 002533 1271 | 002535 1272 | 002536 1273 | 002537 1274 | 002542 1275 | 002544 1276 | 002545 1277 | 002547 1278 | 002549 1279 | 002550 1280 | 002551 1281 | 002553 1282 | 002554 1283 | 002555 1284 | 002559 1285 | 002560 1286 | 002561 1287 | 002566 1288 | 002567 1289 | 002571 1290 | 002573 1291 | 002576 1292 | 002578 1293 | 002579 1294 | 002582 1295 | 002587 1296 | 002588 1297 | 002589 1298 | 002591 1299 | 002592 1300 | 002593 1301 | 002595 1302 | 002596 1303 | 002597 1304 | 002605 1305 | 002607 1306 | 002608 1307 | 002609 1308 | 002610 1309 | 002611 1310 | 002614 1311 | 002616 1312 | 002617 1313 | 002618 1314 | 002620 1315 | 002622 1316 | 002623 1317 | 002624 1318 | 002627 1319 | 002629 1320 | 002632 1321 | 002634 1322 | 002637 1323 | 002639 1324 | 002642 1325 | 002643 1326 | 002647 1327 | 002648 1328 | 002649 1329 | 002650 1330 | 002652 1331 | 002654 1332 | 002655 1333 | 002658 1334 | 002659 1335 | 002660 1336 | 002662 1337 | 002664 1338 | 002665 1339 | 002667 1340 | 002668 1341 | 002670 1342 | 002671 1343 | 002672 1344 | 002676 1345 | 002678 1346 | 002679 1347 | 002682 1348 | 002683 1349 | 002684 1350 | 002687 1351 | 002688 1352 | 002689 1353 | 002691 1354 | 002697 1355 | 002698 1356 | 002700 1357 | 002701 1358 | 002703 1359 | 002704 1360 | 002705 1361 | 002708 1362 | 002714 1363 | 002716 1364 | 002718 1365 | 002719 1366 | 002723 1367 | 002731 1368 | 002732 1369 | 002733 1370 | 002734 1371 | 002736 1372 | 002738 1373 | 002739 1374 | 002741 1375 | 002743 1376 | 002750 1377 | 002751 1378 | 002754 1379 | 002756 1380 | 002759 1381 | 002762 1382 | 002766 1383 | 002768 1384 | 002769 1385 | 002770 1386 | 002771 1387 | 002774 1388 | 002776 1389 | 002777 1390 | 002778 1391 | 002779 1392 | 002780 1393 | 002781 1394 | 002782 1395 | 002784 1396 | 002785 1397 | 002788 1398 | 002790 1399 | 002791 1400 | 002792 1401 | 002795 1402 | 002798 1403 | 002799 1404 | 002802 1405 | 002803 1406 | 002807 1407 | 002808 1408 | 002813 1409 | 002816 1410 | 002817 1411 | 002819 1412 | 002821 1413 | 002822 1414 | 002823 1415 | 002824 1416 | 002825 1417 | 002829 1418 | 002832 1419 | 002834 1420 | 002835 1421 | 002837 1422 | 002838 1423 | 002842 1424 | 002843 1425 | 002849 1426 | 002850 1427 | 002851 1428 | 002852 1429 | 002854 1430 | 002855 1431 | 002857 1432 | 002859 1433 | 002860 1434 | 002862 1435 | 002864 1436 | 002865 1437 | 002868 1438 | 002869 1439 | 002870 1440 | 002871 1441 | 002872 1442 | 002873 1443 | 002874 1444 | 002882 1445 | 002884 1446 | 002886 1447 | 002887 1448 | 002888 1449 | 002897 1450 | 002898 1451 | 002899 1452 | 002904 1453 | 002906 1454 | 002907 1455 | 002909 1456 | 002910 1457 | 002912 1458 | 002913 1459 | 002915 1460 | 002918 1461 | 002920 1462 | 002921 1463 | 002922 1464 | 002923 1465 | 002926 1466 | 002927 1467 | 002929 1468 | 002931 1469 | 002932 1470 | 002933 1471 | 002936 1472 | 002938 1473 | 002939 1474 | 002940 1475 | 002941 1476 | 002943 1477 | 002946 1478 | 002949 1479 | 002950 1480 | 002952 1481 | 002954 1482 | 002956 1483 | 002965 1484 | 002967 1485 | 002968 1486 | 002969 1487 | 002970 1488 | 002972 1489 | 002973 1490 | 002975 1491 | 002980 1492 | 002981 1493 | 002983 1494 | 002986 1495 | 002987 1496 | 002989 1497 | 002990 1498 | 002992 1499 | 002996 1500 | 002998 1501 | 003002 1502 | 003008 1503 | 003009 1504 | 003012 1505 | 003013 1506 | 003014 1507 | 003015 1508 | 003016 1509 | 003017 1510 | 003018 1511 | 003020 1512 | 003021 1513 | 003023 1514 | 003026 1515 | 003028 1516 | 003036 1517 | 003037 1518 | 003039 1519 | 003040 1520 | 003041 1521 | 003044 1522 | 003045 1523 | 003049 1524 | 003051 1525 | 003057 1526 | 003059 1527 | 003060 1528 | 003063 1529 | 003064 1530 | 003068 1531 | 003069 1532 | 003070 1533 | 003072 1534 | 003075 1535 | 003077 1536 | 003078 1537 | 003079 1538 | 003081 1539 | 003083 1540 | 003084 1541 | 003085 1542 | 003086 1543 | 003089 1544 | 003091 1545 | 003092 1546 | 003093 1547 | 003095 1548 | 003097 1549 | 003098 1550 | 003100 1551 | 003104 1552 | 003105 1553 | 003108 1554 | 003111 1555 | 003113 1556 | 003115 1557 | 003117 1558 | 003119 1559 | 003120 1560 | 003121 1561 | 003122 1562 | 003123 1563 | 003125 1564 | 003128 1565 | 003130 1566 | 003132 1567 | 003138 1568 | 003139 1569 | 003140 1570 | 003143 1571 | 003147 1572 | 003149 1573 | 003151 1574 | 003152 1575 | 003154 1576 | 003155 1577 | 003157 1578 | 003158 1579 | 003160 1580 | 003163 1581 | 003164 1582 | 003166 1583 | 003168 1584 | 003169 1585 | 003171 1586 | 003173 1587 | 003176 1588 | 003178 1589 | 003184 1590 | 003185 1591 | 003186 1592 | 003188 1593 | 003189 1594 | 003191 1595 | 003193 1596 | 003195 1597 | 003196 1598 | 003198 1599 | 003200 1600 | 003201 1601 | 003205 1602 | 003206 1603 | 003208 1604 | 003209 1605 | 003212 1606 | 003213 1607 | 003215 1608 | 003218 1609 | 003220 1610 | 003223 1611 | 003227 1612 | 003230 1613 | 003234 1614 | 003235 1615 | 003237 1616 | 003238 1617 | 003241 1618 | 003243 1619 | 003244 1620 | 003245 1621 | 003246 1622 | 003248 1623 | 003249 1624 | 003253 1625 | 003256 1626 | 003258 1627 | 003260 1628 | 003261 1629 | 003262 1630 | 003263 1631 | 003264 1632 | 003267 1633 | 003268 1634 | 003270 1635 | 003271 1636 | 003273 1637 | 003274 1638 | 003277 1639 | 003278 1640 | 003279 1641 | 003282 1642 | 003284 1643 | 003285 1644 | 003286 1645 | 003287 1646 | 003289 1647 | 003290 1648 | 003291 1649 | 003293 1650 | 003294 1651 | 003297 1652 | 003299 1653 | 003303 1654 | 003307 1655 | 003309 1656 | 003311 1657 | 003314 1658 | 003317 1659 | 003320 1660 | 003321 1661 | 003326 1662 | 003327 1663 | 003328 1664 | 003329 1665 | 003332 1666 | 003333 1667 | 003334 1668 | 003335 1669 | 003336 1670 | 003339 1671 | 003340 1672 | 003342 1673 | 003344 1674 | 003345 1675 | 003348 1676 | 003349 1677 | 003354 1678 | 003356 1679 | 003359 1680 | 003360 1681 | 003361 1682 | 003362 1683 | 003363 1684 | 003369 1685 | 003371 1686 | 003372 1687 | 003374 1688 | 003376 1689 | 003377 1690 | 003378 1691 | 003380 1692 | 003381 1693 | 003382 1694 | 003383 1695 | 003384 1696 | 003387 1697 | 003388 1698 | 003389 1699 | 003390 1700 | 003391 1701 | 003392 1702 | 003398 1703 | 003400 1704 | 003413 1705 | 003414 1706 | 003415 1707 | 003416 1708 | 003418 1709 | 003420 1710 | 003423 1711 | 003424 1712 | 003427 1713 | 003431 1714 | 003433 1715 | 003436 1716 | 003437 1717 | 003438 1718 | 003439 1719 | 003440 1720 | 003441 1721 | 003442 1722 | 003444 1723 | 003445 1724 | 003446 1725 | 003451 1726 | 003452 1727 | 003454 1728 | 003455 1729 | 003457 1730 | 003458 1731 | 003459 1732 | 003460 1733 | 003462 1734 | 003463 1735 | 003468 1736 | 003472 1737 | 003473 1738 | 003475 1739 | 003476 1740 | 003477 1741 | 003479 1742 | 003485 1743 | 003486 1744 | 003493 1745 | 003494 1746 | 003498 1747 | 003499 1748 | 003500 1749 | 003501 1750 | 003505 1751 | 003507 1752 | 003508 1753 | 003509 1754 | 003510 1755 | 003512 1756 | 003513 1757 | 003514 1758 | 003516 1759 | 003518 1760 | 003522 1761 | 003523 1762 | 003525 1763 | 003526 1764 | 003532 1765 | 003533 1766 | 003534 1767 | 003536 1768 | 003537 1769 | 003538 1770 | 003540 1771 | 003541 1772 | 003542 1773 | 003545 1774 | 003546 1775 | 003548 1776 | 003549 1777 | 003551 1778 | 003555 1779 | 003556 1780 | 003560 1781 | 003561 1782 | 003564 1783 | 003565 1784 | 003566 1785 | 003567 1786 | 003569 1787 | 003570 1788 | 003572 1789 | 003575 1790 | 003576 1791 | 003577 1792 | 003578 1793 | 003579 1794 | 003581 1795 | 003585 1796 | 003586 1797 | 003587 1798 | 003589 1799 | 003590 1800 | 003591 1801 | 003592 1802 | 003593 1803 | 003594 1804 | 003595 1805 | 003596 1806 | 003597 1807 | 003598 1808 | 003599 1809 | 003602 1810 | 003603 1811 | 003606 1812 | 003610 1813 | 003612 1814 | 003613 1815 | 003615 1816 | 003617 1817 | 003619 1818 | 003625 1819 | 003626 1820 | 003628 1821 | 003636 1822 | 003637 1823 | 003638 1824 | 003639 1825 | 003640 1826 | 003641 1827 | 003642 1828 | 003644 1829 | 003646 1830 | 003648 1831 | 003650 1832 | 003651 1833 | 003654 1834 | 003656 1835 | 003657 1836 | 003660 1837 | 003663 1838 | 003664 1839 | 003665 1840 | 003666 1841 | 003670 1842 | 003672 1843 | 003673 1844 | 003674 1845 | 003675 1846 | 003680 1847 | 003681 1848 | 003685 1849 | 003686 1850 | 003687 1851 | 003693 1852 | 003694 1853 | 003695 1854 | 003696 1855 | 003697 1856 | 003698 1857 | 003699 1858 | 003700 1859 | 003701 1860 | 003704 1861 | 003706 1862 | 003709 1863 | 003710 1864 | 003713 1865 | 003714 1866 | 003717 1867 | 003720 1868 | 003721 1869 | 003722 1870 | 003724 1871 | 003725 1872 | 003727 1873 | 003729 1874 | 003730 1875 | 003731 1876 | 003732 1877 | 003733 1878 | 003734 1879 | 003740 1880 | 003741 1881 | 003742 1882 | 003743 1883 | 003744 1884 | 003745 1885 | 003749 1886 | 003752 1887 | 003754 1888 | 003757 1889 | 003758 1890 | 003759 1891 | 003760 1892 | 003761 1893 | 003765 1894 | 003766 1895 | 003767 1896 | 003768 1897 | 003770 1898 | 003772 1899 | 003773 1900 | 003774 1901 | 003776 1902 | 003780 1903 | 003783 1904 | 003784 1905 | 003785 1906 | 003786 1907 | 003789 1908 | 003790 1909 | 003791 1910 | 003792 1911 | 003795 1912 | 003796 1913 | 003797 1914 | 003799 1915 | 003801 1916 | 003803 1917 | 003806 1918 | 003810 1919 | 003813 1920 | 003815 1921 | 003816 1922 | 003817 1923 | 003818 1924 | 003819 1925 | 003821 1926 | 003823 1927 | 003824 1928 | 003825 1929 | 003829 1930 | 003831 1931 | 003832 1932 | 003833 1933 | 003836 1934 | 003838 1935 | 003839 1936 | 003840 1937 | 003842 1938 | 003843 1939 | 003844 1940 | 003845 1941 | 003846 1942 | 003848 1943 | 003849 1944 | 003850 1945 | 003851 1946 | 003853 1947 | 003855 1948 | 003857 1949 | 003858 1950 | 003861 1951 | 003862 1952 | 003863 1953 | 003865 1954 | 003867 1955 | 003868 1956 | 003871 1957 | 003875 1958 | 003876 1959 | 003877 1960 | 003882 1961 | 003884 1962 | 003887 1963 | 003888 1964 | 003889 1965 | 003893 1966 | 003895 1967 | 003896 1968 | 003900 1969 | 003903 1970 | 003904 1971 | 003906 1972 | 003908 1973 | 003910 1974 | 003911 1975 | 003912 1976 | 003913 1977 | 003917 1978 | 003918 1979 | 003919 1980 | 003921 1981 | 003922 1982 | 003925 1983 | 003927 1984 | 003928 1985 | 003929 1986 | 003930 1987 | 003933 1988 | 003935 1989 | 003936 1990 | 003939 1991 | 003940 1992 | 003941 1993 | 003942 1994 | 003944 1995 | 003947 1996 | 003949 1997 | 003951 1998 | 003952 1999 | 003953 2000 | 003954 2001 | 003955 2002 | 003957 2003 | 003959 2004 | 003960 2005 | 003963 2006 | 003966 2007 | 003967 2008 | 003968 2009 | 003971 2010 | 003973 2011 | 003974 2012 | 003976 2013 | 003978 2014 | 003979 2015 | 003983 2016 | 003985 2017 | 003987 2018 | 003988 2019 | 003989 2020 | 003990 2021 | 003991 2022 | 003993 2023 | 003994 2024 | 003995 2025 | 003997 2026 | 003999 2027 | 004005 2028 | 004006 2029 | 004012 2030 | 004013 2031 | 004014 2032 | 004015 2033 | 004017 2034 | 004018 2035 | 004019 2036 | 004020 2037 | 004022 2038 | 004023 2039 | 004024 2040 | 004025 2041 | 004029 2042 | 004030 2043 | 004031 2044 | 004035 2045 | 004037 2046 | 004039 2047 | 004043 2048 | 004044 2049 | 004046 2050 | 004047 2051 | 004050 2052 | 004052 2053 | 004053 2054 | 004054 2055 | 004056 2056 | 004057 2057 | 004058 2058 | 004060 2059 | 004062 2060 | 004066 2061 | 004067 2062 | 004069 2063 | 004070 2064 | 004071 2065 | 004073 2066 | 004075 2067 | 004076 2068 | 004078 2069 | 004080 2070 | 004084 2071 | 004086 2072 | 004088 2073 | 004090 2074 | 004093 2075 | 004094 2076 | 004097 2077 | 004099 2078 | 004102 2079 | 004103 2080 | 004106 2081 | 004112 2082 | 004114 2083 | 004115 2084 | 004123 2085 | 004127 2086 | 004133 2087 | 004134 2088 | 004135 2089 | 004139 2090 | 004141 2091 | 004144 2092 | 004145 2093 | 004146 2094 | 004147 2095 | 004151 2096 | 004159 2097 | 004165 2098 | 004166 2099 | 004167 2100 | 004169 2101 | 004170 2102 | 004176 2103 | 004177 2104 | 004178 2105 | 004179 2106 | 004180 2107 | 004181 2108 | 004182 2109 | 004183 2110 | 004184 2111 | 004186 2112 | 004192 2113 | 004193 2114 | 004194 2115 | 004197 2116 | 004198 2117 | 004199 2118 | 004200 2119 | 004201 2120 | 004203 2121 | 004204 2122 | 004208 2123 | 004211 2124 | 004212 2125 | 004216 2126 | 004217 2127 | 004218 2128 | 004219 2129 | 004225 2130 | 004227 2131 | 004229 2132 | 004230 2133 | 004231 2134 | 004233 2135 | 004234 2136 | 004235 2137 | 004236 2138 | 004238 2139 | 004240 2140 | 004244 2141 | 004245 2142 | 004247 2143 | 004252 2144 | 004253 2145 | 004257 2146 | 004258 2147 | 004261 2148 | 004262 2149 | 004264 2150 | 004265 2151 | 004266 2152 | 004267 2153 | 004268 2154 | 004269 2155 | 004272 2156 | 004273 2157 | 004274 2158 | 004276 2159 | 004279 2160 | 004283 2161 | 004286 2162 | 004287 2163 | 004292 2164 | 004296 2165 | 004297 2166 | 004302 2167 | 004304 2168 | 004308 2169 | 004310 2170 | 004313 2171 | 004315 2172 | 004316 2173 | 004317 2174 | 004320 2175 | 004322 2176 | 004325 2177 | 004328 2178 | 004331 2179 | 004332 2180 | 004333 2181 | 004334 2182 | 004339 2183 | 004341 2184 | 004344 2185 | 004346 2186 | 004347 2187 | 004351 2188 | 004354 2189 | 004355 2190 | 004356 2191 | 004357 2192 | 004358 2193 | 004359 2194 | 004361 2195 | 004365 2196 | 004366 2197 | 004371 2198 | 004372 2199 | 004375 2200 | 004376 2201 | 004378 2202 | 004379 2203 | 004380 2204 | 004381 2205 | 004382 2206 | 004386 2207 | 004387 2208 | 004389 2209 | 004390 2210 | 004394 2211 | 004395 2212 | 004399 2213 | 004400 2214 | 004405 2215 | 004408 2216 | 004409 2217 | 004410 2218 | 004411 2219 | 004412 2220 | 004413 2221 | 004416 2222 | 004417 2223 | 004427 2224 | 004428 2225 | 004431 2226 | 004432 2227 | 004436 2228 | 004441 2229 | 004442 2230 | 004445 2231 | 004446 2232 | 004448 2233 | 004449 2234 | 004451 2235 | 004453 2236 | 004455 2237 | 004457 2238 | 004459 2239 | 004461 2240 | 004463 2241 | 004464 2242 | 004466 2243 | 004467 2244 | 004468 2245 | 004471 2246 | 004473 2247 | 004476 2248 | 004477 2249 | 004478 2250 | 004479 2251 | 004484 2252 | 004488 2253 | 004492 2254 | 004495 2255 | 004497 2256 | 004498 2257 | 004499 2258 | 004500 2259 | 004503 2260 | 004504 2261 | 004505 2262 | 004506 2263 | 004507 2264 | 004509 2265 | 004510 2266 | 004512 2267 | 004514 2268 | 004515 2269 | 004518 2270 | 004522 2271 | 004523 2272 | 004524 2273 | 004525 2274 | 004533 2275 | 004535 2276 | 004536 2277 | 004537 2278 | 004538 2279 | 004539 2280 | 004543 2281 | 004544 2282 | 004545 2283 | 004546 2284 | 004550 2285 | 004552 2286 | 004554 2287 | 004555 2288 | 004558 2289 | 004559 2290 | 004560 2291 | 004561 2292 | 004563 2293 | 004564 2294 | 004565 2295 | 004571 2296 | 004572 2297 | 004575 2298 | 004577 2299 | 004579 2300 | 004580 2301 | 004583 2302 | 004584 2303 | 004586 2304 | 004590 2305 | 004592 2306 | 004593 2307 | 004594 2308 | 004595 2309 | 004597 2310 | 004600 2311 | 004601 2312 | 004602 2313 | 004604 2314 | 004605 2315 | 004606 2316 | 004607 2317 | 004613 2318 | 004614 2319 | 004616 2320 | 004617 2321 | 004619 2322 | 004621 2323 | 004623 2324 | 004625 2325 | 004627 2326 | 004628 2327 | 004631 2328 | 004635 2329 | 004637 2330 | 004639 2331 | 004641 2332 | 004642 2333 | 004643 2334 | 004645 2335 | 004646 2336 | 004653 2337 | 004654 2338 | 004656 2339 | 004659 2340 | 004661 2341 | 004662 2342 | 004663 2343 | 004664 2344 | 004670 2345 | 004671 2346 | 004674 2347 | 004675 2348 | 004676 2349 | 004677 2350 | 004678 2351 | 004681 2352 | 004684 2353 | 004690 2354 | 004696 2355 | 004701 2356 | 004702 2357 | 004703 2358 | 004704 2359 | 004707 2360 | 004712 2361 | 004719 2362 | 004723 2363 | 004727 2364 | 004728 2365 | 004729 2366 | 004731 2367 | 004733 2368 | 004736 2369 | 004741 2370 | 004747 2371 | 004749 2372 | 004750 2373 | 004751 2374 | 004754 2375 | 004755 2376 | 004757 2377 | 004758 2378 | 004760 2379 | 004761 2380 | 004765 2381 | 004767 2382 | 004771 2383 | 004772 2384 | 004774 2385 | 004775 2386 | 004778 2387 | 004779 2388 | 004780 2389 | 004781 2390 | 004784 2391 | 004785 2392 | 004786 2393 | 004789 2394 | 004793 2395 | 004794 2396 | 004795 2397 | 004796 2398 | 004798 2399 | 004801 2400 | 004802 2401 | 004803 2402 | 004805 2403 | 004808 2404 | 004809 2405 | 004812 2406 | 004818 2407 | 004819 2408 | 004820 2409 | 004823 2410 | 004824 2411 | 004826 2412 | 004827 2413 | 004828 2414 | 004833 2415 | 004834 2416 | 004836 2417 | 004837 2418 | 004838 2419 | 004840 2420 | 004841 2421 | 004842 2422 | 004844 2423 | 004845 2424 | 004847 2425 | 004853 2426 | 004854 2427 | 004855 2428 | 004856 2429 | 004857 2430 | 004865 2431 | 004866 2432 | 004869 2433 | 004870 2434 | 004872 2435 | 004876 2436 | 004877 2437 | 004878 2438 | 004879 2439 | 004880 2440 | 004882 2441 | 004883 2442 | 004884 2443 | 004886 2444 | 004889 2445 | 004890 2446 | 004894 2447 | 004897 2448 | 004899 2449 | 004900 2450 | 004901 2451 | 004906 2452 | 004908 2453 | 004910 2454 | 004911 2455 | 004912 2456 | 004913 2457 | 004915 2458 | 004916 2459 | 004919 2460 | 004922 2461 | 004923 2462 | 004925 2463 | 004930 2464 | 004933 2465 | 004936 2466 | 004937 2467 | 004939 2468 | 004940 2469 | 004945 2470 | 004950 2471 | 004951 2472 | 004952 2473 | 004955 2474 | 004957 2475 | 004961 2476 | 004964 2477 | 004965 2478 | 004967 2479 | 004968 2480 | 004969 2481 | 004970 2482 | 004971 2483 | 004972 2484 | 004973 2485 | 004975 2486 | 004977 2487 | 004978 2488 | 004980 2489 | 004982 2490 | 004984 2491 | 004987 2492 | 004991 2493 | 004992 2494 | 004997 2495 | 005000 2496 | 005003 2497 | 005005 2498 | 005006 2499 | 005007 2500 | 005009 2501 | 005011 2502 | 005012 2503 | 005016 2504 | 005018 2505 | 005020 2506 | 005022 2507 | 005023 2508 | 005025 2509 | 005027 2510 | 005029 2511 | 005030 2512 | 005031 2513 | 005033 2514 | 005035 2515 | 005039 2516 | 005042 2517 | 005043 2518 | 005044 2519 | 005046 2520 | 005047 2521 | 005048 2522 | 005051 2523 | 005059 2524 | 005060 2525 | 005061 2526 | 005066 2527 | 005069 2528 | 005071 2529 | 005076 2530 | 005083 2531 | 005084 2532 | 005085 2533 | 005087 2534 | 005088 2535 | 005089 2536 | 005091 2537 | 005092 2538 | 005096 2539 | 005097 2540 | 005098 2541 | 005099 2542 | 005100 2543 | 005102 2544 | 005104 2545 | 005106 2546 | 005107 2547 | 005111 2548 | 005114 2549 | 005115 2550 | 005116 2551 | 005117 2552 | 005118 2553 | 005119 2554 | 005123 2555 | 005126 2556 | 005129 2557 | 005130 2558 | 005131 2559 | 005132 2560 | 005134 2561 | 005137 2562 | 005142 2563 | 005146 2564 | 005148 2565 | 005150 2566 | 005151 2567 | 005152 2568 | 005154 2569 | 005159 2570 | 005160 2571 | 005165 2572 | 005169 2573 | 005171 2574 | 005173 2575 | 005177 2576 | 005178 2577 | 005183 2578 | 005186 2579 | 005187 2580 | 005192 2581 | 005193 2582 | 005195 2583 | 005196 2584 | 005200 2585 | 005202 2586 | 005203 2587 | 005204 2588 | 005205 2589 | 005207 2590 | 005208 2591 | 005209 2592 | 005210 2593 | 005211 2594 | 005212 2595 | 005215 2596 | 005216 2597 | 005220 2598 | 005223 2599 | 005224 2600 | 005225 2601 | 005228 2602 | 005231 2603 | 005232 2604 | 005235 2605 | 005238 2606 | 005239 2607 | 005243 2608 | 005245 2609 | 005247 2610 | 005248 2611 | 005250 2612 | 005252 2613 | 005253 2614 | 005254 2615 | 005257 2616 | 005258 2617 | 005259 2618 | 005261 2619 | 005263 2620 | 005264 2621 | 005265 2622 | 005266 2623 | 005269 2624 | 005270 2625 | 005272 2626 | 005277 2627 | 005278 2628 | 005281 2629 | 005283 2630 | 005285 2631 | 005286 2632 | 005288 2633 | 005290 2634 | 005291 2635 | 005293 2636 | 005294 2637 | 005295 2638 | 005300 2639 | 005301 2640 | 005302 2641 | 005303 2642 | 005305 2643 | 005306 2644 | 005310 2645 | 005314 2646 | 005317 2647 | 005320 2648 | 005324 2649 | 005326 2650 | 005327 2651 | 005331 2652 | 005332 2653 | 005339 2654 | 005340 2655 | 005344 2656 | 005346 2657 | 005348 2658 | 005351 2659 | 005352 2660 | 005353 2661 | 005354 2662 | 005355 2663 | 005356 2664 | 005357 2665 | 005358 2666 | 005361 2667 | 005362 2668 | 005364 2669 | 005367 2670 | 005370 2671 | 005373 2672 | 005374 2673 | 005376 2674 | 005380 2675 | 005382 2676 | 005383 2677 | 005384 2678 | 005387 2679 | 005388 2680 | 005392 2681 | 005393 2682 | 005394 2683 | 005395 2684 | 005396 2685 | 005397 2686 | 005398 2687 | 005399 2688 | 005400 2689 | 005401 2690 | 005402 2691 | 005403 2692 | 005406 2693 | 005407 2694 | 005408 2695 | 005409 2696 | 005410 2697 | 005411 2698 | 005412 2699 | 005414 2700 | 005416 2701 | 005417 2702 | 005418 2703 | 005419 2704 | 005420 2705 | 005421 2706 | 005424 2707 | 005425 2708 | 005428 2709 | 005432 2710 | 005433 2711 | 005435 2712 | 005436 2713 | 005438 2714 | 005439 2715 | 005440 2716 | 005442 2717 | 005446 2718 | 005451 2719 | 005454 2720 | 005455 2721 | 005456 2722 | 005457 2723 | 005462 2724 | 005463 2725 | 005464 2726 | 005468 2727 | 005469 2728 | 005470 2729 | 005475 2730 | 005478 2731 | 005480 2732 | 005483 2733 | 005485 2734 | 005488 2735 | 005490 2736 | 005491 2737 | 005492 2738 | 005493 2739 | 005496 2740 | 005497 2741 | 005499 2742 | 005500 2743 | 005501 2744 | 005502 2745 | 005503 2746 | 005504 2747 | 005506 2748 | 005507 2749 | 005508 2750 | 005509 2751 | 005512 2752 | 005513 2753 | 005516 2754 | 005517 2755 | 005518 2756 | 005519 2757 | 005520 2758 | 005521 2759 | 005522 2760 | 005524 2761 | 005526 2762 | 005527 2763 | 005529 2764 | 005530 2765 | 005533 2766 | 005535 2767 | 005537 2768 | 005539 2769 | 005541 2770 | 005543 2771 | 005547 2772 | 005548 2773 | 005549 2774 | 005550 2775 | 005553 2776 | 005554 2777 | 005561 2778 | 005562 2779 | 005563 2780 | 005564 2781 | 005567 2782 | 005568 2783 | 005569 2784 | 005574 2785 | 005575 2786 | 005578 2787 | 005579 2788 | 005583 2789 | 005585 2790 | 005591 2791 | 005592 2792 | 005593 2793 | 005594 2794 | 005597 2795 | 005598 2796 | 005599 2797 | 005604 2798 | 005605 2799 | 005606 2800 | 005607 2801 | 005608 2802 | 005609 2803 | 005611 2804 | 005612 2805 | 005614 2806 | 005615 2807 | 005620 2808 | 005621 2809 | 005622 2810 | 005624 2811 | 005626 2812 | 005627 2813 | 005628 2814 | 005629 2815 | 005632 2816 | 005636 2817 | 005637 2818 | 005641 2819 | 005644 2820 | 005645 2821 | 005646 2822 | 005647 2823 | 005648 2824 | 005651 2825 | 005654 2826 | 005655 2827 | 005657 2828 | 005661 2829 | 005663 2830 | 005665 2831 | 005666 2832 | 005667 2833 | 005670 2834 | 005671 2835 | 005674 2836 | 005675 2837 | 005678 2838 | 005679 2839 | 005681 2840 | 005682 2841 | 005684 2842 | 005686 2843 | 005688 2844 | 005690 2845 | 005691 2846 | 005692 2847 | 005693 2848 | 005694 2849 | 005696 2850 | 005697 2851 | 005701 2852 | 005702 2853 | 005705 2854 | 005710 2855 | 005711 2856 | 005715 2857 | 005716 2858 | 005718 2859 | 005719 2860 | 005720 2861 | 005721 2862 | 005722 2863 | 005723 2864 | 005726 2865 | 005730 2866 | 005732 2867 | 005733 2868 | 005734 2869 | 005737 2870 | 005738 2871 | 005742 2872 | 005748 2873 | 005749 2874 | 005750 2875 | 005752 2876 | 005753 2877 | 005755 2878 | 005756 2879 | 005758 2880 | 005759 2881 | 005761 2882 | 005764 2883 | 005766 2884 | 005767 2885 | 005768 2886 | 005769 2887 | 005770 2888 | 005771 2889 | 005772 2890 | 005773 2891 | 005774 2892 | 005775 2893 | 005776 2894 | 005778 2895 | 005779 2896 | 005780 2897 | 005781 2898 | 005788 2899 | 005789 2900 | 005791 2901 | 005792 2902 | 005795 2903 | 005797 2904 | 005798 2905 | 005799 2906 | 005802 2907 | 005804 2908 | 005808 2909 | 005809 2910 | 005810 2911 | 005813 2912 | 005814 2913 | 005815 2914 | 005816 2915 | 005817 2916 | 005823 2917 | 005824 2918 | 005825 2919 | 005828 2920 | 005830 2921 | 005831 2922 | 005832 2923 | 005833 2924 | 005835 2925 | 005836 2926 | 005837 2927 | 005838 2928 | 005842 2929 | 005844 2930 | 005845 2931 | 005846 2932 | 005847 2933 | 005848 2934 | 005849 2935 | 005850 2936 | 005851 2937 | 005853 2938 | 005858 2939 | 005860 2940 | 005861 2941 | 005862 2942 | 005863 2943 | 005865 2944 | 005866 2945 | 005867 2946 | 005868 2947 | 005870 2948 | 005871 2949 | 005872 2950 | 005874 2951 | 005875 2952 | 005877 2953 | 005880 2954 | 005884 2955 | 005886 2956 | 005888 2957 | 005890 2958 | 005891 2959 | 005895 2960 | 005896 2961 | 005897 2962 | 005898 2963 | 005902 2964 | 005904 2965 | 005908 2966 | 005915 2967 | 005920 2968 | 005924 2969 | 005928 2970 | 005929 2971 | 005930 2972 | 005932 2973 | 005934 2974 | 005936 2975 | 005937 2976 | 005940 2977 | 005941 2978 | 005942 2979 | 005943 2980 | 005945 2981 | 005946 2982 | 005950 2983 | 005951 2984 | 005953 2985 | 005954 2986 | 005956 2987 | 005957 2988 | 005959 2989 | 005960 2990 | 005964 2991 | 005966 2992 | 005967 2993 | 005968 2994 | 005971 2995 | 005973 2996 | 005974 2997 | 005976 2998 | 005977 2999 | 005979 3000 | 005980 3001 | 005983 3002 | 005987 3003 | 005989 3004 | 005990 3005 | 005991 3006 | 005992 3007 | 005993 3008 | 005995 3009 | 005998 3010 | 006000 3011 | 006004 3012 | 006006 3013 | 006007 3014 | 006011 3015 | 006015 3016 | 006017 3017 | 006018 3018 | 006019 3019 | 006020 3020 | 006021 3021 | 006022 3022 | 006025 3023 | 006032 3024 | 006035 3025 | 006037 3026 | 006040 3027 | 006049 3028 | 006051 3029 | 006053 3030 | 006055 3031 | 006056 3032 | 006059 3033 | 006064 3034 | 006065 3035 | 006069 3036 | 006072 3037 | 006073 3038 | 006076 3039 | 006079 3040 | 006080 3041 | 006081 3042 | 006082 3043 | 006084 3044 | 006089 3045 | 006090 3046 | 006091 3047 | 006092 3048 | 006094 3049 | 006099 3050 | 006101 3051 | 006104 3052 | 006105 3053 | 006108 3054 | 006109 3055 | 006111 3056 | 006112 3057 | 006113 3058 | 006119 3059 | 006120 3060 | 006124 3061 | 006128 3062 | 006129 3063 | 006131 3064 | 006132 3065 | 006134 3066 | 006135 3067 | 006137 3068 | 006138 3069 | 006140 3070 | 006141 3071 | 006142 3072 | 006143 3073 | 006145 3074 | 006147 3075 | 006149 3076 | 006150 3077 | 006153 3078 | 006155 3079 | 006157 3080 | 006158 3081 | 006159 3082 | 006160 3083 | 006162 3084 | 006164 3085 | 006166 3086 | 006170 3087 | 006171 3088 | 006172 3089 | 006174 3090 | 006175 3091 | 006178 3092 | 006179 3093 | 006180 3094 | 006181 3095 | 006183 3096 | 006184 3097 | 006188 3098 | 006189 3099 | 006191 3100 | 006192 3101 | 006193 3102 | 006197 3103 | 006199 3104 | 006200 3105 | 006201 3106 | 006203 3107 | 006205 3108 | 006206 3109 | 006207 3110 | 006209 3111 | 006211 3112 | 006212 3113 | 006214 3114 | 006216 3115 | 006217 3116 | 006218 3117 | 006220 3118 | 006221 3119 | 006223 3120 | 006224 3121 | 006225 3122 | 006226 3123 | 006230 3124 | 006231 3125 | 006234 3126 | 006235 3127 | 006236 3128 | 006237 3129 | 006239 3130 | 006241 3131 | 006242 3132 | 006243 3133 | 006245 3134 | 006248 3135 | 006251 3136 | 006252 3137 | 006253 3138 | 006254 3139 | 006255 3140 | 006256 3141 | 006257 3142 | 006259 3143 | 006260 3144 | 006261 3145 | 006262 3146 | 006264 3147 | 006268 3148 | 006271 3149 | 006277 3150 | 006279 3151 | 006281 3152 | 006283 3153 | 006284 3154 | 006285 3155 | 006289 3156 | 006290 3157 | 006291 3158 | 006292 3159 | 006293 3160 | 006294 3161 | 006295 3162 | 006296 3163 | 006298 3164 | 006299 3165 | 006303 3166 | 006304 3167 | 006307 3168 | 006308 3169 | 006309 3170 | 006310 3171 | 006311 3172 | 006313 3173 | 006318 3174 | 006319 3175 | 006320 3176 | 006323 3177 | 006325 3178 | 006326 3179 | 006327 3180 | 006328 3181 | 006329 3182 | 006330 3183 | 006335 3184 | 006336 3185 | 006337 3186 | 006341 3187 | 006346 3188 | 006347 3189 | 006350 3190 | 006352 3191 | 006358 3192 | 006359 3193 | 006361 3194 | 006362 3195 | 006363 3196 | 006365 3197 | 006367 3198 | 006373 3199 | 006374 3200 | 006375 3201 | 006376 3202 | 006378 3203 | 006382 3204 | 006383 3205 | 006384 3206 | 006387 3207 | 006389 3208 | 006390 3209 | 006392 3210 | 006397 3211 | 006398 3212 | 006399 3213 | 006400 3214 | 006401 3215 | 006402 3216 | 006404 3217 | 006408 3218 | 006412 3219 | 006413 3220 | 006414 3221 | 006418 3222 | 006419 3223 | 006421 3224 | 006422 3225 | 006428 3226 | 006429 3227 | 006430 3228 | 006431 3229 | 006432 3230 | 006438 3231 | 006443 3232 | 006447 3233 | 006448 3234 | 006449 3235 | 006450 3236 | 006455 3237 | 006456 3238 | 006457 3239 | 006458 3240 | 006459 3241 | 006460 3242 | 006461 3243 | 006463 3244 | 006466 3245 | 006467 3246 | 006471 3247 | 006476 3248 | 006479 3249 | 006480 3250 | 006485 3251 | 006487 3252 | 006489 3253 | 006490 3254 | 006492 3255 | 006494 3256 | 006495 3257 | 006499 3258 | 006500 3259 | 006501 3260 | 006502 3261 | 006504 3262 | 006509 3263 | 006510 3264 | 006511 3265 | 006513 3266 | 006518 3267 | 006522 3268 | 006523 3269 | 006526 3270 | 006527 3271 | 006528 3272 | 006536 3273 | 006538 3274 | 006539 3275 | 006541 3276 | 006543 3277 | 006544 3278 | 006545 3279 | 006546 3280 | 006547 3281 | 006550 3282 | 006552 3283 | 006554 3284 | 006557 3285 | 006559 3286 | 006562 3287 | 006564 3288 | 006566 3289 | 006567 3290 | 006571 3291 | 006572 3292 | 006573 3293 | 006575 3294 | 006579 3295 | 006580 3296 | 006584 3297 | 006585 3298 | 006587 3299 | 006589 3300 | 006591 3301 | 006594 3302 | 006598 3303 | 006599 3304 | 006600 3305 | 006601 3306 | 006605 3307 | 006606 3308 | 006607 3309 | 006608 3310 | 006609 3311 | 006610 3312 | 006615 3313 | 006616 3314 | 006617 3315 | 006619 3316 | 006620 3317 | 006621 3318 | 006622 3319 | 006627 3320 | 006630 3321 | 006631 3322 | 006635 3323 | 006639 3324 | 006640 3325 | 006642 3326 | 006644 3327 | 006645 3328 | 006646 3329 | 006648 3330 | 006652 3331 | 006653 3332 | 006654 3333 | 006657 3334 | 006661 3335 | 006662 3336 | 006663 3337 | 006665 3338 | 006668 3339 | 006671 3340 | 006672 3341 | 006673 3342 | 006675 3343 | 006680 3344 | 006681 3345 | 006683 3346 | 006684 3347 | 006687 3348 | 006688 3349 | 006689 3350 | 006690 3351 | 006691 3352 | 006697 3353 | 006699 3354 | 006700 3355 | 006702 3356 | 006704 3357 | 006705 3358 | 006706 3359 | 006707 3360 | 006708 3361 | 006716 3362 | 006717 3363 | 006718 3364 | 006721 3365 | 006722 3366 | 006724 3367 | 006727 3368 | 006728 3369 | 006730 3370 | 006735 3371 | 006736 3372 | 006739 3373 | 006740 3374 | 006742 3375 | 006743 3376 | 006746 3377 | 006748 3378 | 006749 3379 | 006750 3380 | 006757 3381 | 006763 3382 | 006766 3383 | 006769 3384 | 006774 3385 | 006775 3386 | 006776 3387 | 006779 3388 | 006784 3389 | 006787 3390 | 006788 3391 | 006790 3392 | 006793 3393 | 006795 3394 | 006799 3395 | 006801 3396 | 006802 3397 | 006805 3398 | 006809 3399 | 006810 3400 | 006814 3401 | 006817 3402 | 006820 3403 | 006821 3404 | 006823 3405 | 006824 3406 | 006825 3407 | 006826 3408 | 006827 3409 | 006830 3410 | 006831 3411 | 006834 3412 | 006835 3413 | 006838 3414 | 006839 3415 | 006840 3416 | 006842 3417 | 006845 3418 | 006846 3419 | 006848 3420 | 006851 3421 | 006857 3422 | 006859 3423 | 006861 3424 | 006864 3425 | 006865 3426 | 006867 3427 | 006869 3428 | 006871 3429 | 006875 3430 | 006877 3431 | 006878 3432 | 006880 3433 | 006883 3434 | 006886 3435 | 006888 3436 | 006890 3437 | 006892 3438 | 006893 3439 | 006894 3440 | 006896 3441 | 006902 3442 | 006904 3443 | 006905 3444 | 006909 3445 | 006911 3446 | 006912 3447 | 006915 3448 | 006916 3449 | 006918 3450 | 006919 3451 | 006920 3452 | 006921 3453 | 006923 3454 | 006924 3455 | 006926 3456 | 006927 3457 | 006929 3458 | 006931 3459 | 006932 3460 | 006933 3461 | 006934 3462 | 006935 3463 | 006939 3464 | 006940 3465 | 006941 3466 | 006946 3467 | 006947 3468 | 006949 3469 | 006951 3470 | 006952 3471 | 006957 3472 | 006958 3473 | 006961 3474 | 006963 3475 | 006965 3476 | 006966 3477 | 006967 3478 | 006969 3479 | 006970 3480 | 006972 3481 | 006974 3482 | 006975 3483 | 006976 3484 | 006979 3485 | 006983 3486 | 006984 3487 | 006985 3488 | 006986 3489 | 006988 3490 | 006991 3491 | 006993 3492 | 006995 3493 | 006996 3494 | 006998 3495 | 007001 3496 | 007002 3497 | 007004 3498 | 007007 3499 | 007009 3500 | 007013 3501 | 007017 3502 | 007018 3503 | 007020 3504 | 007021 3505 | 007024 3506 | 007025 3507 | 007035 3508 | 007036 3509 | 007039 3510 | 007040 3511 | 007041 3512 | 007044 3513 | 007045 3514 | 007046 3515 | 007050 3516 | 007051 3517 | 007054 3518 | 007057 3519 | 007058 3520 | 007060 3521 | 007062 3522 | 007064 3523 | 007066 3524 | 007070 3525 | 007073 3526 | 007075 3527 | 007077 3528 | 007086 3529 | 007090 3530 | 007092 3531 | 007093 3532 | 007094 3533 | 007096 3534 | 007097 3535 | 007099 3536 | 007101 3537 | 007102 3538 | 007104 3539 | 007105 3540 | 007106 3541 | 007107 3542 | 007108 3543 | 007111 3544 | 007113 3545 | 007114 3546 | 007116 3547 | 007118 3548 | 007121 3549 | 007123 3550 | 007124 3551 | 007126 3552 | 007127 3553 | 007128 3554 | 007129 3555 | 007134 3556 | 007137 3557 | 007140 3558 | 007141 3559 | 007142 3560 | 007143 3561 | 007147 3562 | 007148 3563 | 007150 3564 | 007151 3565 | 007152 3566 | 007153 3567 | 007155 3568 | 007156 3569 | 007159 3570 | 007160 3571 | 007167 3572 | 007170 3573 | 007171 3574 | 007173 3575 | 007175 3576 | 007179 3577 | 007181 3578 | 007184 3579 | 007185 3580 | 007186 3581 | 007188 3582 | 007189 3583 | 007190 3584 | 007191 3585 | 007192 3586 | 007193 3587 | 007195 3588 | 007196 3589 | 007197 3590 | 007203 3591 | 007206 3592 | 007209 3593 | 007211 3594 | 007213 3595 | 007216 3596 | 007218 3597 | 007220 3598 | 007222 3599 | 007223 3600 | 007224 3601 | 007226 3602 | 007228 3603 | 007231 3604 | 007234 3605 | 007236 3606 | 007237 3607 | 007239 3608 | 007241 3609 | 007243 3610 | 007245 3611 | 007248 3612 | 007249 3613 | 007250 3614 | 007251 3615 | 007254 3616 | 007257 3617 | 007259 3618 | 007263 3619 | 007264 3620 | 007268 3621 | 007269 3622 | 007270 3623 | 007276 3624 | 007281 3625 | 007282 3626 | 007285 3627 | 007286 3628 | 007293 3629 | 007295 3630 | 007296 3631 | 007297 3632 | 007298 3633 | 007301 3634 | 007305 3635 | 007306 3636 | 007307 3637 | 007308 3638 | 007312 3639 | 007313 3640 | 007314 3641 | 007316 3642 | 007317 3643 | 007320 3644 | 007321 3645 | 007324 3646 | 007328 3647 | 007332 3648 | 007333 3649 | 007334 3650 | 007335 3651 | 007338 3652 | 007340 3653 | 007341 3654 | 007346 3655 | 007348 3656 | 007354 3657 | 007355 3658 | 007356 3659 | 007357 3660 | 007358 3661 | 007361 3662 | 007362 3663 | 007363 3664 | 007365 3665 | 007366 3666 | 007367 3667 | 007368 3668 | 007370 3669 | 007372 3670 | 007373 3671 | 007378 3672 | 007379 3673 | 007386 3674 | 007387 3675 | 007388 3676 | 007390 3677 | 007392 3678 | 007393 3679 | 007394 3680 | 007399 3681 | 007400 3682 | 007404 3683 | 007406 3684 | 007408 3685 | 007414 3686 | 007417 3687 | 007418 3688 | 007425 3689 | 007427 3690 | 007428 3691 | 007429 3692 | 007431 3693 | 007432 3694 | 007438 3695 | 007441 3696 | 007443 3697 | 007444 3698 | 007446 3699 | 007451 3700 | 007452 3701 | 007454 3702 | 007455 3703 | 007457 3704 | 007459 3705 | 007460 3706 | 007461 3707 | 007465 3708 | 007471 3709 | 007472 3710 | 007474 3711 | 007476 3712 | 007479 -------------------------------------------------------------------------------- /docs/demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maudzung/RTM3D/0bd3868a03f071244b2fed9ca1828298f5a96180/docs/demo.gif -------------------------------------------------------------------------------- /docs/rtm3d_architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maudzung/RTM3D/0bd3868a03f071244b2fed9ca1828298f5a96180/docs/rtm3d_architecture.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | torch==1.5.0 2 | torchvision==0.6.0 3 | easydict==1.9 4 | opencv-python==4.2.0.34 5 | numpy==1.18.3 6 | torchsummary==1.5.1 7 | tensorboard==2.2.1 8 | scikit-learn==0.22.2 9 | albumentations==0.4.5 -------------------------------------------------------------------------------- /src/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maudzung/RTM3D/0bd3868a03f071244b2fed9ca1828298f5a96180/src/config/__init__.py -------------------------------------------------------------------------------- /src/config/kitti_config.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | # Car and Van ==> Car class 4 | # Pedestrian and Person_Sitting ==> Pedestrian Class 5 | CLASS_NAME_TO_ID = { 6 | 'Pedestrian': 0, 7 | 'Car': 1, 8 | 'Cyclist': 2, 9 | 'Van': -3, 10 | 'Truck': -3, 11 | 'Person_sitting': -2, 12 | 'Tram': -99, 13 | 'Misc': -99, 14 | 'DontCare': -1 15 | } 16 | 17 | colors = [[0, 255, 255], [0, 0, 255], [255, 0, 0], [255, 120, 0], 18 | [255, 120, 120], [0, 120, 0], [120, 255, 255], [120, 0, 255]] 19 | 20 | # cal mean from train set 21 | R0 = np.array([ 22 | [0.99992475, 0.00975976, -0.00734152, 0], 23 | [-0.0097913, 0.99994262, -0.00430371, 0], 24 | [0.00729911, 0.0043753, 0.99996319, 0], 25 | [0, 0, 0, 1] 26 | ]) 27 | 28 | P2 = np.array([[719.787081, 0., 608.463003, 44.9538775], 29 | [0., 719.787081, 174.545111, 0.1066855], 30 | [0., 0., 1., 3.0106472e-03], 31 | [0., 0., 0., 0] 32 | ]) 33 | 34 | R0_inv = np.linalg.inv(R0) 35 | P2_inv = np.linalg.pinv(P2) 36 | ##################################################################################### 37 | -------------------------------------------------------------------------------- /src/config/train_config.py: -------------------------------------------------------------------------------- 1 | """ 2 | # -*- coding: utf-8 -*- 3 | ----------------------------------------------------------------------------------- 4 | # Author: Nguyen Mau Dung 5 | # DoC: 2020.08.09 6 | # email: nguyenmaudung93.kstn@gmail.com 7 | ----------------------------------------------------------------------------------- 8 | # Description: The configurations of the project will be defined here 9 | """ 10 | 11 | import os 12 | import argparse 13 | 14 | import torch 15 | from easydict import EasyDict as edict 16 | 17 | 18 | def parse_train_configs(): 19 | parser = argparse.ArgumentParser(description='The Implementation of RTM3D using PyTorch') 20 | parser.add_argument('--seed', type=int, default=2020, 21 | help='re-produce the results with seed random') 22 | parser.add_argument('--saved_fn', type=str, default='rtm3d', metavar='FN', 23 | help='The name using for saving logs, models,...') 24 | 25 | parser.add_argument('--root-dir', type=str, default='../', metavar='PATH', 26 | help='The ROOT working directory') 27 | #################################################################### 28 | ############## Model configs ######################## 29 | #################################################################### 30 | parser.add_argument('--arch', type=str, default='resnet_18', metavar='ARCH', 31 | help='The name of the model architecture') 32 | parser.add_argument('--pretrained_path', type=str, default=None, metavar='PATH', 33 | help='the path of the pretrained checkpoint') 34 | parser.add_argument('--head_conv', type=int, default=-1, 35 | help='conv layer channels for output head' 36 | '0 for no conv layer' 37 | '-1 for default setting: ' 38 | '64 for resnets and 256 for dla.') 39 | 40 | #################################################################### 41 | ############## Dataloader and Running configs ####### 42 | #################################################################### 43 | parser.add_argument('--hflip_prob', type=float, default=0., 44 | help='The probability of horizontal flip') 45 | parser.add_argument('--use_left_cam_prob', type=float, default=1., 46 | help='The probability of using the left camera') 47 | parser.add_argument('--dynamic-sigma', action='store_true', 48 | help='If true, compute sigma based on Amax, Amin then generate heamap' 49 | 'If false, compute radius as CenterNet did') 50 | parser.add_argument('--no-val', action='store_true', 51 | help='If true, dont evaluate the model on the val set') 52 | parser.add_argument('--num_samples', type=int, default=None, 53 | help='Take a subset of the dataset to run and debug') 54 | parser.add_argument('--num_workers', type=int, default=4, 55 | help='Number of threads for loading data') 56 | parser.add_argument('--batch_size', type=int, default=16, 57 | help='mini-batch size (default: 16), this is the total' 58 | 'batch size of all GPUs on the current node when using' 59 | 'Data Parallel or Distributed Data Parallel') 60 | parser.add_argument('--print_freq', type=int, default=50, metavar='N', 61 | help='print frequency (default: 50)') 62 | parser.add_argument('--tensorboard_freq', type=int, default=50, metavar='N', 63 | help='frequency of saving tensorboard (default: 50)') 64 | parser.add_argument('--checkpoint_freq', type=int, default=5, metavar='N', 65 | help='frequency of saving checkpoints (default: 5)') 66 | #################################################################### 67 | ############## Training strategy #################### 68 | #################################################################### 69 | 70 | parser.add_argument('--start_epoch', type=int, default=1, metavar='N', 71 | help='the starting epoch') 72 | parser.add_argument('--num_epochs', type=int, default=300, metavar='N', 73 | help='number of total epochs to run') 74 | parser.add_argument('--lr_type', type=str, default='multi_step', 75 | help='the type of learning rate scheduler (cosin or multi_step)') 76 | parser.add_argument('--lr', type=float, default=0.0002, metavar='LR', 77 | help='initial learning rate') 78 | parser.add_argument('--minimum_lr', type=float, default=1e-7, metavar='MIN_LR', 79 | help='minimum learning rate during training') 80 | parser.add_argument('--momentum', type=float, default=0.949, metavar='M', 81 | help='momentum') 82 | parser.add_argument('-wd', '--weight_decay', type=float, default=0., metavar='WD', 83 | help='weight decay (default: 1e-6)') 84 | parser.add_argument('--optimizer_type', type=str, default='adam', metavar='OPTIMIZER', 85 | help='the type of optimizer, it can be sgd or adam') 86 | parser.add_argument('--steps', nargs='*', default=[150, 180], 87 | help='number of burn in step') 88 | 89 | #################################################################### 90 | ############## Loss weight ########################## 91 | #################################################################### 92 | 93 | #################################################################### 94 | ############## Distributed Data Parallel ############ 95 | #################################################################### 96 | parser.add_argument('--world-size', default=-1, type=int, metavar='N', 97 | help='number of nodes for distributed training') 98 | parser.add_argument('--rank', default=-1, type=int, metavar='N', 99 | help='node rank for distributed training') 100 | parser.add_argument('--dist-url', default='tcp://127.0.0.1:29500', type=str, 101 | help='url used to set up distributed training') 102 | parser.add_argument('--dist-backend', default='nccl', type=str, 103 | help='distributed backend') 104 | parser.add_argument('--gpu_idx', default=None, type=int, 105 | help='GPU index to use.') 106 | parser.add_argument('--no_cuda', action='store_true', 107 | help='If true, cuda is not used.') 108 | parser.add_argument('--multiprocessing-distributed', action='store_true', 109 | help='Use multi-processing distributed training to launch ' 110 | 'N processes per node, which has N GPUs. This is the ' 111 | 'fastest way to use PyTorch for either single node or ' 112 | 'multi node data parallel training') 113 | #################################################################### 114 | ############## Evaluation configurations ################### 115 | #################################################################### 116 | parser.add_argument('--evaluate', action='store_true', 117 | help='only evaluate the model, not training') 118 | parser.add_argument('--resume_path', type=str, default=None, metavar='PATH', 119 | help='the path of the resumed checkpoint') 120 | parser.add_argument('--K', type=int, default=100, 121 | help='the number of top K') 122 | 123 | configs = edict(vars(parser.parse_args())) 124 | 125 | #################################################################### 126 | ############## Hardware configurations ############################# 127 | #################################################################### 128 | configs.device = torch.device('cpu' if configs.no_cuda else 'cuda') 129 | configs.ngpus_per_node = torch.cuda.device_count() 130 | 131 | configs.pin_memory = True 132 | configs.input_size = (384, 1280) 133 | configs.hm_size = (96, 320) 134 | configs.down_ratio = 4 135 | configs.max_objects = 50 136 | 137 | if configs.head_conv == -1: # init default head_conv 138 | configs.head_conv = 256 if 'dla' in configs.arch else 64 139 | 140 | configs.num_classes = 3 141 | configs.num_vertexes = 8 142 | configs.num_center_offset = 2 143 | configs.num_vertexes_offset = 2 144 | configs.num_dimension = 3 145 | configs.num_rot = 8 146 | configs.num_depth = 1 147 | configs.num_wh = 2 148 | configs.heads = { 149 | 'hm_mc': configs.num_classes, 150 | 'hm_ver': configs.num_vertexes, 151 | 'vercoor': configs.num_vertexes * 2, 152 | 'cenoff': configs.num_center_offset, 153 | 'veroff': configs.num_vertexes_offset, 154 | 'dim': configs.num_dimension, 155 | 'rot': configs.num_rot, 156 | 'depth': configs.num_depth, 157 | 'wh': configs.num_wh 158 | } 159 | 160 | #################################################################### 161 | ############## Dataset, logs, Checkpoints dir ###################### 162 | #################################################################### 163 | configs.dataset_dir = os.path.join(configs.root_dir, 'dataset', 'kitti') 164 | configs.checkpoints_dir = os.path.join(configs.root_dir, 'checkpoints', configs.saved_fn) 165 | configs.logs_dir = os.path.join(configs.root_dir, 'logs', configs.saved_fn) 166 | 167 | if not os.path.isdir(configs.checkpoints_dir): 168 | os.makedirs(configs.checkpoints_dir) 169 | if not os.path.isdir(configs.logs_dir): 170 | os.makedirs(configs.logs_dir) 171 | 172 | return configs 173 | -------------------------------------------------------------------------------- /src/data_process/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/maudzung/RTM3D/0bd3868a03f071244b2fed9ca1828298f5a96180/src/data_process/__init__.py -------------------------------------------------------------------------------- /src/data_process/kitti_data_utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | # -*- coding: utf-8 -*- 3 | ----------------------------------------------------------------------------------- 4 | # Author: Nguyen Mau Dung 5 | # DoC: 2020.08.09 6 | # email: nguyenmaudung93.kstn@gmail.com 7 | ----------------------------------------------------------------------------------- 8 | # Description: The utils of the kitti dataset 9 | """ 10 | 11 | from __future__ import print_function 12 | import sys 13 | 14 | import numpy as np 15 | import cv2 16 | 17 | sys.path.append('../') 18 | 19 | import config.kitti_config as cnf 20 | 21 | 22 | class Object3d(object): 23 | ''' 3d object label ''' 24 | 25 | def __init__(self, label_file_line): 26 | data = label_file_line.split(' ') 27 | data[1:] = [float(x) for x in data[1:]] 28 | # extract label, truncation, occlusion 29 | self.type = data[0] # 'Car', 'Pedestrian', ... 30 | self.cls_id = self.cls_type_to_id(self.type) 31 | self.truncation = data[1] # truncated pixel ratio [0..1] 32 | self.occlusion = int(data[2]) # 0=visible, 1=partly occluded, 2=fully occluded, 3=unknown 33 | self.alpha = data[3] # object observation angle [-pi..pi] 34 | 35 | # extract 2d bounding box in 0-based coordinates 36 | self.xmin = data[4] # left 37 | self.ymin = data[5] # top 38 | self.xmax = data[6] # right 39 | self.ymax = data[7] # bottom 40 | self.box2d = np.array([self.xmin, self.ymin, self.xmax, self.ymax]) 41 | 42 | # extract 3d bounding box information 43 | self.h = data[8] # box height 44 | self.w = data[9] # box width 45 | self.l = data[10] # box length (in meters) 46 | self.t = (data[11], data[12], data[13]) # location (x,y,z) in camera coord. 47 | self.dis_to_cam = np.linalg.norm(self.t) 48 | self.ry = data[14] # yaw angle (around Y-axis in camera coordinates) [-pi..pi] 49 | self.score = data[15] if data.__len__() == 16 else -1.0 50 | self.level_str = None 51 | self.level = self.get_obj_level() 52 | 53 | def cls_type_to_id(self, cls_type): 54 | if cls_type not in cnf.CLASS_NAME_TO_ID.keys(): 55 | return -1 56 | 57 | return cnf.CLASS_NAME_TO_ID[cls_type] 58 | 59 | def get_obj_level(self): 60 | height = float(self.box2d[3]) - float(self.box2d[1]) + 1 61 | 62 | if height >= 40 and self.truncation <= 0.15 and self.occlusion <= 0: 63 | self.level_str = 'Easy' 64 | return 1 # Easy 65 | elif height >= 25 and self.truncation <= 0.3 and self.occlusion <= 1: 66 | self.level_str = 'Moderate' 67 | return 2 # Moderate 68 | elif height >= 25 and self.truncation <= 0.5 and self.occlusion <= 2: 69 | self.level_str = 'Hard' 70 | return 3 # Hard 71 | else: 72 | self.level_str = 'UnKnown' 73 | return 4 74 | 75 | def print_object(self): 76 | print('Type, truncation, occlusion, alpha: %s, %d, %d, %f' % \ 77 | (self.type, self.truncation, self.occlusion, self.alpha)) 78 | print('2d bbox (x0,y0,x1,y1): %f, %f, %f, %f' % \ 79 | (self.xmin, self.ymin, self.xmax, self.ymax)) 80 | print('3d bbox h,w,l: %f, %f, %f' % \ 81 | (self.h, self.w, self.l)) 82 | print('3d bbox location, ry: (%f, %f, %f), %f' % \ 83 | (self.t[0], self.t[1], self.t[2], self.ry)) 84 | 85 | def to_kitti_format(self): 86 | kitti_str = '%s %.2f %d %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f %.2f' \ 87 | % (self.type, self.truncation, int(self.occlusion), self.alpha, self.box2d[0], self.box2d[1], 88 | self.box2d[2], self.box2d[3], self.h, self.w, self.l, self.t[0], self.t[1], self.t[2], 89 | self.ry, self.score) 90 | return kitti_str 91 | 92 | 93 | def read_label(label_filename): 94 | lines = [line.rstrip() for line in open(label_filename)] 95 | objects = [Object3d(line) for line in lines] 96 | return objects 97 | 98 | 99 | class Calibration(object): 100 | ''' Calibration matrices and utils 101 | 3d XYZ in