Repository: chrischoy/DeepGlobalRegistration Branch: master Commit: 1f4871d4c616 Files: 51 Total size: 550.5 KB Directory structure: gitextract_yw16jmpj/ ├── .gitignore ├── LICENSE ├── README.md ├── assets/ │ └── results.npz ├── config.py ├── core/ │ ├── __init__.py │ ├── correspondence.py │ ├── deep_global_registration.py │ ├── knn.py │ ├── loss.py │ ├── metrics.py │ ├── registration.py │ └── trainer.py ├── dataloader/ │ ├── base_loader.py │ ├── data_loaders.py │ ├── inf_sampler.py │ ├── kitti_loader.py │ ├── split/ │ │ ├── test_3dmatch.txt │ │ ├── test_kitti.txt │ │ ├── test_modelnet40.txt │ │ ├── test_scan2cad.txt │ │ ├── train_3dmatch.txt │ │ ├── train_kitti.txt │ │ ├── train_modelnet40.txt │ │ ├── train_scan2cad.txt │ │ ├── val_3dmatch.txt │ │ ├── val_kitti.txt │ │ ├── val_modelnet40.txt │ │ └── val_scan2cad.txt │ ├── threedmatch_loader.py │ └── transforms.py ├── demo.py ├── model/ │ ├── __init__.py │ ├── common.py │ ├── pyramidnet.py │ ├── residual_block.py │ ├── resunet.py │ └── simpleunet.py ├── requirements.txt ├── scripts/ │ ├── analyze_stats.py │ ├── download_3dmatch.sh │ ├── test_3dmatch.py │ ├── test_kitti.py │ ├── train_3dmatch.sh │ └── train_kitti.sh ├── train.py └── util/ ├── __init__.py ├── file.py ├── integration.py ├── pointcloud.py └── timer.py ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Temp files .DS_Store __pycache__ *.swp *.swo *.orig .idea outputs/ *.pyc *.npy *.pdf util/*.sh checkpoints # *.npz 3dmatch/ tmp.txt output.ply bunny.ply test.sh ================================================ FILE: LICENSE ================================================ MIT License Copyright (c) 2020 Chris Choy (chrischoy@ai.stanford.edu), Wei Dong (weidong@andrew.cmu.edu) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Please cite the following papers if you use any part of the code. ``` @inproceedings{choy2020deep, title={Deep Global Registration}, author={Choy, Christopher and Dong, Wei and Koltun, Vladlen}, booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, year={2020} } @inproceedings{choy2019fully, author = {Choy, Christopher and Park, Jaesik and Koltun, Vladlen}, title = {Fully Convolutional Geometric Features}, booktitle = {ICCV}, year = {2019}, } @inproceedings{choy20194d, title={4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks}, author={Choy, Christopher and Gwak, JunYoung and Savarese, Silvio}, booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition}, year={2019} } ``` ================================================ FILE: README.md ================================================ # Deep Global Registration ## Introduction This repository contains python scripts for training and testing [Deep Global Registration, CVPR 2020 Oral](https://node1.chrischoy.org/data/publications/dgr/DGR.pdf). Deep Global Registration (DGR) proposes a differentiable framework for pairwise registration of real-world 3D scans. DGR consists of the following three modules: - a 6-dimensional convolutional network for correspondence confidence prediction - a differentiable Weighted Procrustes algorithm for closed-form pose estimation - a robust gradient-based SE(3) optimizer for pose refinement. For more details, please check out - [CVPR 2020 oral paper](https://node1.chrischoy.org/data/publications/dgr/DGR.pdf) - [1min oral video](https://youtu.be/stzgn6DkozA) - [Full CVPR oral presentation](https://youtu.be/Iy17wvo07BU) [![1min oral](assets/1min-oral.png)](https://youtu.be/stzgn6DkozA) ## Quick Pipleine Visualization | Indoor 3DMatch Registration | Outdoor KITTI Lidar Registration | |:---------------------------:|:---------------------------:| | ![](https://chrischoy.github.io/images/publication/dgr/text_100.gif) | ![](https://chrischoy.github.io/images/publication/dgr/kitti1_optimized.gif) | ## Related Works Recent end-to-end frameworks combine feature learning and pose optimization. PointNetLK combines PointNet global features with an iterative pose optimization method. Wang et al. in Deep Closest Point train graph neural network features by backpropagating through pose optimization. We further advance this line of work. In particular, our Weighted Procrustes method reduces the complexity of optimization from quadratic to linear and enables the use of dense correspondences for highly accurate registration of real-world scans. ## Deep Global Registration The first component is a 6-dimensional convolutional network that analyzes the geometry of 3D correspondences and estimates their accuracy. Please refer to [High-dim ConvNets, CVPR'20](https://github.com/chrischoy/HighDimConvNets) for more details. The second component we develop is a differentiable Weighted Procrustes solver. The Procrustes method provides a closed-form solution for rigid registration in SE(3). A differentiable version of the Procrustes method used for end-to-end registration passes gradients through coordinates, which requires O(N^2) time and memory for N keypoints. Instead, the Weighted Procrustes method passes gradients through the weights associated with correspondences rather than correspondence coordinates. The computational complexity of the Weighted Procrustes method is linear to the number of correspondences, allowing the registration pipeline to use dense correspondence sets rather than sparse keypoints. This substantially increases registration accuracy. Our third component is a robust optimization module that fine-tunes the alignment produced by the Weighted Procrustes solver and the failure detection module. This optimization module minimizes a differentiable loss via gradient descent on the continuous SE(3) representation space. The optimization is fast since it does not require neighbor search in the inner loop such as ICP. ## Configuration Our network is built on the [MinkowskiEngine](https://github.com/StanfordVL/MinkowskiEngine) and the system requirements are: - Ubuntu 14.04 or higher - CUDA 10.1.243 or higher - pytorch 1.5 or higher - python 3.6 or higher - GCC 7 You can install the MinkowskiEngine and the python requirements on your system with: ```shell # Install MinkowskiEngine sudo apt install libopenblas-dev g++-7 pip install torch export CXX=g++-7; pip install -U MinkowskiEngine --install-option="--blas=openblas" -v # Download and setup DeepGlobalRegistration git clone https://github.com/chrischoy/DeepGlobalRegistration.git cd DeepGlobalRegistration pip install -r requirements.txt ``` ## Demo You may register your own data with relevant pretrained DGR models. 3DMatch is suitable for indoor RGB-D scans; KITTI is for outdoor LiDAR scans. | Inlier Model | FCGF model | Dataset | Voxel Size | Feature Dimension | Performance | Link | |:------------:|:-----------:|:-------:|:-------------:|:-----------------:|:--------------------------:|:------:| | ResUNetBN2C | ResUNetBN2C | 3DMatch | 5cm (0.05) | 32 | TE: 7.34cm, RE: 2.43deg | [weights](http://node2.chrischoy.org/data/projects/DGR/ResUNetBN2C-feat32-3dmatch-v0.05.pth) | | ResUNetBN2C | ResUNetBN2C | KITTI | 30cm (0.3) | 32 | TE: 3.14cm, RE: 0.14deg | [weights](http://node2.chrischoy.org/data/projects/DGR/ResUNetBN2C-feat32-kitti-v0.3.pth) | ```shell python demo.py ``` | Input PointClouds | Output Prediction | |:---------------------------:|:---------------------------:| | ![](assets/demo_inputs.png) | ![](assets/demo_outputs.png) | ## Experiments | Comparison | Speed vs. Recall Pareto Frontier | | ------- | --------------- | | ![Comparison](assets/comparison-3dmatch.png) | ![Frontier](assets/frontier.png) | ## Training The entire network depends on pretrained [FCGF models](https://github.com/chrischoy/FCGF#model-zoo). Please download corresponding models before training. | Model | Normalized Feature | Dataset | Voxel Size | Feature Dimension | Link | |:-----------:|:-------------------:|:-------:|:-------------:|:-----------------:|:------:| | ResUNetBN2C | True | 3DMatch | 5cm (0.05) | 32 | [download](https://node1.chrischoy.org/data/publications/fcgf/2019-08-16_19-21-47.pth) | | ResUNetBN2C | True | KITTI | 30cm (0.3) | 32 | [download](https://node1.chrischoy.org/data/publications/fcgf/KITTI-v0.3-ResUNetBN2C-conv1-5-nout32.pth) | ### 3DMatch You may download preprocessed data and train via these commands: ```shell ./scripts/download_3dmatch.sh /path/to/3dmatch export THREED_MATCH_DIR=/path/to/3dmatch; FCGF_WEIGHTS=/path/to/fcgf_3dmatch.pth ./scripts/train_3dmatch.sh ``` ### KITTI Follow the instruction on [KITTI Odometry website](http://www.cvlibs.net/datasets/kitti/eval_odometry.php) to download the KITTI odometry train set. Then train with ```shell export KITTI_PATH=/path/to/kitti; FCGF_WEIGHTS=/path/to/fcgf_kitti.pth ./scripts/train_kitti.sh ``` ## Testing 3DMatch test set is different from train set and is available at the [download section](http://3dmatch.cs.princeton.edu/) of the official website. You may download and decompress these scenes to a new folder. To evaluate trained model on 3DMatch or KITTI, you may use ```shell python -m scripts.test_3dmatch --threed_match_dir /path/to/3dmatch_test/ --weights /path/to/dgr_3dmatch.pth ``` and ```shell python -m scripts.test_kitti --kitti_dir /path/to/kitti/ --weights /path/to/dgr_kitti.pth ``` ## Generate figures We also provide experimental results of 3DMatch comparisons in `results.npz`. To reproduce figures we presented in the paper, you may use ```shell python scripts/analyze_stats.py assets/results.npz ``` ## Citing our work Please cite the following papers if you use our code: ```latex @inproceedings{choy2020deep, title={Deep Global Registration}, author={Choy, Christopher and Dong, Wei and Koltun, Vladlen}, booktitle={CVPR}, year={2020} } @inproceedings{choy2019fully, title = {Fully Convolutional Geometric Features}, author = {Choy, Christopher and Park, Jaesik and Koltun, Vladlen}, booktitle = {ICCV}, year = {2019} } @inproceedings{choy20194d, title={4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks}, author={Choy, Christopher and Gwak, JunYoung and Savarese, Silvio}, booktitle={CVPR}, year={2019} } ``` ## Concurrent Works There have a number of 3D registration works published concurrently. - Gojcic et al., [Learning Multiview 3D Point Cloud Registration, CVPR'20](https://github.com/zgojcic/3D_multiview_reg) - Wang et al., [PRNet: Self-Supervised Learning for Partial-to-Partial Registration, NeurIPS'19](https://github.com/WangYueFt/prnet) - Yang et al., [TEASER: Fast and Certifiable Point Cloud Registration, arXiv'20](https://github.com/MIT-SPARK/TEASER-plusplus) ================================================ FILE: config.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import argparse arg_lists = [] parser = argparse.ArgumentParser() def add_argument_group(name): arg = parser.add_argument_group(name) arg_lists.append(arg) return arg def str2bool(v): return v.lower() in ('true', '1') # yapf: disable logging_arg = add_argument_group('Logging') logging_arg.add_argument('--out_dir', type=str, default='outputs') trainer_arg = add_argument_group('Trainer') trainer_arg.add_argument('--trainer', type=str, default='WeightedProcrustesTrainer') # Batch setting trainer_arg.add_argument('--batch_size', type=int, default=4) trainer_arg.add_argument('--val_batch_size', type=int, default=1) # Data loader configs trainer_arg.add_argument('--train_phase', type=str, default="train") trainer_arg.add_argument('--val_phase', type=str, default="val") trainer_arg.add_argument('--test_phase', type=str, default="test") # Data augmentation trainer_arg.add_argument('--use_random_scale', type=str2bool, default=False) trainer_arg.add_argument('--min_scale', type=float, default=0.8) trainer_arg.add_argument('--max_scale', type=float, default=1.2) trainer_arg.add_argument('--use_random_rotation', type=str2bool, default=True) trainer_arg.add_argument('--rotation_range', type=float, default=360) trainer_arg.add_argument( '--positive_pair_search_voxel_size_multiplier', type=float, default=1.5) trainer_arg.add_argument('--save_epoch_freq', type=int, default=1) trainer_arg.add_argument('--val_epoch_freq', type=int, default=1) trainer_arg.add_argument('--stat_freq', type=int, default=40, help='Frequency for writing stats to log') trainer_arg.add_argument('--test_valid', type=str2bool, default=True) trainer_arg.add_argument('--val_max_iter', type=int, default=400) trainer_arg.add_argument('--use_balanced_loss', type=str2bool, default=False) trainer_arg.add_argument('--inlier_direct_loss_weight', type=float, default=1.) trainer_arg.add_argument('--procrustes_loss_weight', type=float, default=1.) trainer_arg.add_argument('--trans_weight', type=float, default=1) trainer_arg.add_argument('--eval_registration', type=str2bool, default=True) trainer_arg.add_argument('--clip_weight_thresh', type=float, default=0.05, help='Weight threshold for detecting inliers') trainer_arg.add_argument('--best_val_metric', type=str, default='succ_rate') # Inlier detection trainer inlier_arg = add_argument_group('Inlier') inlier_arg.add_argument('--inlier_model', type=str, default='ResUNetBN2C') inlier_arg.add_argument('--inlier_feature_type', type=str, default='ones') inlier_arg.add_argument('--inlier_conv1_kernel_size', type=int, default=3) inlier_arg.add_argument('--inlier_knn', type=int, default=1) inlier_arg.add_argument('--knn_search_method', type=str, default='gpu') inlier_arg.add_argument('--inlier_use_direct_loss', type=str2bool, default=True) # Feature specific configurations feat_arg = add_argument_group('feat') feat_arg.add_argument('--feat_model', type=str, default='SimpleNetBN2C') feat_arg.add_argument('--feat_model_n_out', type=int, default=16, help='Feature dimension') feat_arg.add_argument('--feat_conv1_kernel_size', type=int, default=3) feat_arg.add_argument('--normalize_feature', type=str2bool, default=True) feat_arg.add_argument('--use_xyz_feature', type=str2bool, default=False) feat_arg.add_argument('--dist_type', type=str, default='L2') # Optimizer arguments opt_arg = add_argument_group('Optimizer') opt_arg.add_argument('--optimizer', type=str, default='SGD') opt_arg.add_argument('--max_epoch', type=int, default=100) opt_arg.add_argument('--lr', type=float, default=1e-1) opt_arg.add_argument('--momentum', type=float, default=0.8) opt_arg.add_argument('--sgd_momentum', type=float, default=0.9) opt_arg.add_argument('--sgd_dampening', type=float, default=0.1) opt_arg.add_argument('--adam_beta1', type=float, default=0.9) opt_arg.add_argument('--adam_beta2', type=float, default=0.999) opt_arg.add_argument('--weight_decay', type=float, default=1e-4) opt_arg.add_argument('--iter_size', type=int, default=1, help='accumulate gradient') opt_arg.add_argument('--bn_momentum', type=float, default=0.05) opt_arg.add_argument('--exp_gamma', type=float, default=0.99) opt_arg.add_argument('--scheduler', type=str, default='ExpLR') opt_arg.add_argument('--num_train_iter', type=int, default=-1, help='train N iter if positive') opt_arg.add_argument('--icp_cache_path', type=str, default="icp") # Misc misc_arg = add_argument_group('Misc') misc_arg.add_argument('--use_gpu', type=str2bool, default=True) misc_arg.add_argument('--weights', type=str, default=None) misc_arg.add_argument('--weights_dir', type=str, default=None) misc_arg.add_argument('--resume', type=str, default=None) misc_arg.add_argument('--resume_dir', type=str, default=None) misc_arg.add_argument('--train_num_workers', type=int, default=2) misc_arg.add_argument('--val_num_workers', type=int, default=1) misc_arg.add_argument('--test_num_workers', type=int, default=2) misc_arg.add_argument('--fast_validation', type=str2bool, default=False) misc_arg.add_argument('--nn_max_n', type=int, default=250, help='The maximum number of features to find nearest neighbors in batch') # Dataset specific configurations data_arg = add_argument_group('Data') data_arg.add_argument('--dataset', type=str, default='ThreeDMatchPairDataset03') data_arg.add_argument('--voxel_size', type=float, default=0.025) data_arg.add_argument('--threed_match_dir', type=str, default='.') data_arg.add_argument('--kitti_dir', type=str, default=None, help="Path to the KITTI odometry dataset. This path should contain /dataset/sequences.") data_arg.add_argument('--kitti_max_time_diff', type=int, default=3, help='max time difference between pairs (non inclusive)') data_arg.add_argument('--kitti_date', type=str, default='2011_09_26') # Evaluation eval_arg = add_argument_group('Data') eval_arg.add_argument('--hit_ratio_thresh', type=float, default=0.1) eval_arg.add_argument('--success_rte_thresh', type=float, default=0.3, help='Success if the RTE below this (m)') eval_arg.add_argument('--success_rre_thresh', type=float, default=15, help='Success if the RTE below this (degree)') eval_arg.add_argument('--test_random_crop', action='store_true') eval_arg.add_argument('--test_random_rotation', type=str2bool, default=False) # Demo demo_arg = add_argument_group('demo') demo_arg.add_argument('--pcd0', default="redkitchen_000.ply", type=str) demo_arg.add_argument('--pcd1', default="redkitchen_010.ply", type=str) # yapf: enable def get_config(): args = parser.parse_args() return args ================================================ FILE: core/__init__.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 ================================================ FILE: core/correspondence.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import copy import numpy as np import open3d as o3d import torch def _hash(arr, M=None): if isinstance(arr, np.ndarray): N, D = arr.shape else: N, D = len(arr[0]), len(arr) hash_vec = np.zeros(N, dtype=np.int64) for d in range(D): if isinstance(arr, np.ndarray): hash_vec += arr[:, d] * M**d else: hash_vec += arr[d] * M**d return hash_vec def find_correct_correspondence(pos_pairs, pred_pairs, hash_seed=None, len_batch=None): assert len(pos_pairs) == len(pred_pairs) if hash_seed is None: assert len(len_batch) == len(pos_pairs) corrects = [] for i, pos_pred in enumerate(zip(pos_pairs, pred_pairs)): pos_pair, pred_pair = pos_pred if isinstance(pos_pair, torch.Tensor): pos_pair = pos_pair.numpy() if isinstance(pred_pair, torch.Tensor): pred_pair = pred_pair.numpy() if hash_seed is None: N0, N1 = len_batch[i] _hash_seed = max(N0, N1) else: _hash_seed = hash_seed pos_keys = _hash(pos_pair, _hash_seed) pred_keys = _hash(pred_pair, _hash_seed) corrects.append(np.isin(pred_keys, pos_keys, assume_unique=False)) return np.hstack(corrects) ================================================ FILE: core/deep_global_registration.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import os import sys import math import logging import open3d as o3d import numpy as np import time import torch import copy import MinkowskiEngine as ME sys.path.append('.') from model import load_model from core.registration import GlobalRegistration from core.knn import find_knn_gpu from util.timer import Timer from util.pointcloud import make_open3d_point_cloud # Feature-based registrations in Open3D def registration_ransac_based_on_feature_matching(pcd0, pcd1, feats0, feats1, distance_threshold, num_iterations): assert feats0.shape[1] == feats1.shape[1] source_feat = o3d.registration.Feature() source_feat.resize(feats0.shape[1], len(feats0)) source_feat.data = feats0.astype('d').transpose() target_feat = o3d.registration.Feature() target_feat.resize(feats1.shape[1], len(feats1)) target_feat.data = feats1.astype('d').transpose() result = o3d.registration.registration_ransac_based_on_feature_matching( pcd0, pcd1, source_feat, target_feat, distance_threshold, o3d.registration.TransformationEstimationPointToPoint(False), 4, [o3d.registration.CorrespondenceCheckerBasedOnDistance(distance_threshold)], o3d.registration.RANSACConvergenceCriteria(num_iterations, 1000)) return result.transformation def registration_ransac_based_on_correspondence(pcd0, pcd1, idx0, idx1, distance_threshold, num_iterations): corres = np.stack((idx0, idx1), axis=1) corres = o3d.utility.Vector2iVector(corres) result = o3d.pipelines.registration.registration_ransac_based_on_correspondence( source = pcd0, target = pcd1, corres = corres, max_correspondence_distance = distance_threshold, estimation_method = o3d.pipelines.registration.TransformationEstimationPointToPoint(False), ransac_n = 4, criteria = o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, num_iterations)) return result.transformation class DeepGlobalRegistration: def __init__(self, config, device=torch.device('cuda')): # Basic config self.config = config self.clip_weight_thresh = self.config.clip_weight_thresh self.device = device # Safeguard self.safeguard_method = 'correspondence' # correspondence, feature_matching # Final tuning self.use_icp = True # Misc self.feat_timer = Timer() self.reg_timer = Timer() # Model config loading print("=> loading checkpoint '{}'".format(config.weights)) assert os.path.exists(config.weights) state = torch.load(config.weights) network_config = state['config'] self.network_config = network_config self.config.inlier_feature_type = network_config.inlier_feature_type self.voxel_size = network_config.voxel_size print(f'=> Setting voxel size to {self.voxel_size}') # FCGF network initialization num_feats = 1 try: FCGFModel = load_model(network_config['feat_model']) self.fcgf_model = FCGFModel( num_feats, network_config['feat_model_n_out'], bn_momentum=network_config['bn_momentum'], conv1_kernel_size=network_config['feat_conv1_kernel_size'], normalize_feature=network_config['normalize_feature']) except KeyError: # legacy pretrained models FCGFModel = load_model(network_config['model']) self.fcgf_model = FCGFModel(num_feats, network_config['model_n_out'], bn_momentum=network_config['bn_momentum'], conv1_kernel_size=network_config['conv1_kernel_size'], normalize_feature=network_config['normalize_feature']) self.fcgf_model.load_state_dict(state['state_dict']) self.fcgf_model = self.fcgf_model.to(device) self.fcgf_model.eval() # Inlier network initialization num_feats = 6 if network_config.inlier_feature_type == 'coords' else 1 InlierModel = load_model(network_config['inlier_model']) self.inlier_model = InlierModel( num_feats, 1, bn_momentum=network_config['bn_momentum'], conv1_kernel_size=network_config['inlier_conv1_kernel_size'], normalize_feature=False, D=6) self.inlier_model.load_state_dict(state['state_dict_inlier']) self.inlier_model = self.inlier_model.to(self.device) self.inlier_model.eval() print("=> loading finished") def preprocess(self, pcd): ''' Stage 0: preprocess raw input point cloud Input: raw point cloud Output: voxelized point cloud with - xyz: unique point cloud with one point per voxel - coords: coords after voxelization - feats: dummy feature placeholder for general sparse convolution ''' if isinstance(pcd, o3d.geometry.PointCloud): xyz = np.array(pcd.points) elif isinstance(pcd, np.ndarray): xyz = pcd else: raise Exception('Unrecognized pcd type') # Voxelization: # Maintain double type for xyz to improve numerical accuracy in quantization _, sel = ME.utils.sparse_quantize(xyz / self.voxel_size, return_index=True) npts = len(sel) xyz = torch.from_numpy(xyz[sel]).to(self.device) # ME standard batch coordinates coords = ME.utils.batched_coordinates([torch.floor(xyz / self.voxel_size).int()], device=self.device) feats = torch.ones(npts, 1) return xyz.float(), coords, feats def fcgf_feature_extraction(self, feats, coords): ''' Step 1: extract fast and accurate FCGF feature per point ''' sinput = ME.SparseTensor(feats, coordinates=coords, device=self.device) return self.fcgf_model(sinput).F def fcgf_feature_matching(self, feats0, feats1): ''' Step 2: coarsely match FCGF features to generate initial correspondences ''' nns = find_knn_gpu(feats0, feats1, nn_max_n=self.network_config.nn_max_n, knn=1, return_distance=False) corres_idx0 = torch.arange(len(nns)).long().squeeze().to(self.device) corres_idx1 = nns.long().squeeze() return corres_idx0, corres_idx1 def inlier_feature_generation(self, xyz0, xyz1, coords0, coords1, fcgf_feats0, fcgf_feats1, corres_idx0, corres_idx1): ''' Step 3: generate features for inlier prediction ''' assert len(corres_idx0) == len(corres_idx1) feat_type = self.config.inlier_feature_type assert feat_type in ['ones', 'feats', 'coords'] corres_idx0 = corres_idx0.to(self.device) corres_idx1 = corres_idx1.to(self.device) if feat_type == 'ones': feat = torch.ones((len(corres_idx0), 1)).float() elif feat_type == 'feats': feat = torch.cat((fcgf_feats0[corres_idx0], fcgf_feats1[corres_idx1]), dim=1) elif feat_type == 'coords': feat = torch.cat((torch.cos(xyz0[corres_idx0]), torch.cos(xyz1[corres_idx1])), dim=1) else: # should never reach here raise TypeError('Undefined feature type') return feat def inlier_prediction(self, inlier_feats, coords): ''' Step 4: predict inlier likelihood ''' sinput = ME.SparseTensor(inlier_feats, coordinates=coords, device=self.device) soutput = self.inlier_model(sinput) return soutput.F def safeguard_registration(self, pcd0, pcd1, idx0, idx1, feats0, feats1, distance_threshold, num_iterations): if self.safeguard_method == 'correspondence': T = registration_ransac_based_on_correspondence(pcd0, pcd1, idx0.cpu().numpy(), idx1.cpu().numpy(), distance_threshold, num_iterations=num_iterations) elif self.safeguard_method == 'fcgf_feature_matching': T = registration_ransac_based_on_fcgf_feature_matching(pcd0, pcd1, feats0.cpu().numpy(), feats1.cpu().numpy(), distance_threshold, num_iterations) else: raise ValueError('Undefined') return T def register(self, xyz0, xyz1, inlier_thr=0.00): ''' Main algorithm of DeepGlobalRegistration ''' self.reg_timer.tic() with torch.no_grad(): # Step 0: voxelize and generate sparse input xyz0, coords0, feats0 = self.preprocess(xyz0) xyz1, coords1, feats1 = self.preprocess(xyz1) # Step 1: Feature extraction self.feat_timer.tic() fcgf_feats0 = self.fcgf_feature_extraction(feats0, coords0) fcgf_feats1 = self.fcgf_feature_extraction(feats1, coords1) self.feat_timer.toc() # Step 2: Coarse correspondences corres_idx0, corres_idx1 = self.fcgf_feature_matching(fcgf_feats0, fcgf_feats1) # Step 3: Inlier feature generation # coords[corres_idx0]: 1D temporal + 3D spatial coord # coords[corres_idx1, 1:]: 3D spatial coord # => 1D temporal + 6D spatial coord inlier_coords = torch.cat((coords0[corres_idx0], coords1[corres_idx1, 1:]), dim=1).int() inlier_feats = self.inlier_feature_generation(xyz0, xyz1, coords0, coords1, fcgf_feats0, fcgf_feats1, corres_idx0, corres_idx1) # Step 4: Inlier likelihood estimation and truncation logit = self.inlier_prediction(inlier_feats.contiguous(), coords=inlier_coords) weights = logit.sigmoid() if self.clip_weight_thresh > 0: weights[weights < self.clip_weight_thresh] = 0 wsum = weights.sum().item() # Step 5: Registration. Note: torch's gradient may be required at this stage # > Case 0: Weighted Procrustes + Robust Refinement wsum_threshold = max(200, len(weights) * 0.05) sign = '>=' if wsum >= wsum_threshold else '<' print(f'=> Weighted sum {wsum:.2f} {sign} threshold {wsum_threshold}') T = np.identity(4) if wsum >= wsum_threshold: try: rot, trans, opt_output = GlobalRegistration(xyz0[corres_idx0], xyz1[corres_idx1], weights=weights.detach(), break_threshold_ratio=1e-4, quantization_size=2 * self.voxel_size, verbose=False) T[0:3, 0:3] = rot.detach().cpu().numpy() T[0:3, 3] = trans.detach().cpu().numpy() dgr_time = self.reg_timer.toc() print(f'=> DGR takes {dgr_time:.2} s') except RuntimeError: # Will directly go to Safeguard print('###############################################') print('# WARNING: SVD failed, weights sum: ', wsum) print('# Falling back to Safeguard') print('###############################################') else: # > Case 1: Safeguard RANSAC + (Optional) ICP pcd0 = make_open3d_point_cloud(xyz0) pcd1 = make_open3d_point_cloud(xyz1) T = self.safeguard_registration(pcd0, pcd1, corres_idx0, corres_idx1, feats0, feats1, 2 * self.voxel_size, num_iterations=80000) safeguard_time = self.reg_timer.toc() print(f'=> Safeguard takes {safeguard_time:.2} s') if self.use_icp: T = o3d.pipelines.registration.registration_icp( source=make_open3d_point_cloud(xyz0), target=make_open3d_point_cloud(xyz1), max_correspondence_distance=self.voxel_size * 2, init=T).transformation return T ================================================ FILE: core/knn.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import numpy as np from scipy.spatial import cKDTree from core.metrics import pdist def find_knn_cpu(feat0, feat1, knn=1, return_distance=False): feat1tree = cKDTree(feat1) dists, nn_inds = feat1tree.query(feat0, k=knn, n_jobs=-1) if return_distance: return nn_inds, dists else: return nn_inds def find_knn_gpu(F0, F1, nn_max_n=-1, knn=1, return_distance=False): def knn_dist(f0, f1, knn=1, dist_type='L2'): knn_dists, knn_inds = [], [] with torch.no_grad(): dist = pdist(f0, f1, dist_type=dist_type) min_dist, ind = dist.min(dim=1, keepdim=True) knn_dists.append(min_dist) knn_inds.append(ind) if knn > 1: for k in range(knn - 1): NR, NC = dist.shape flat_ind = (torch.arange(NR) * NC).type_as(ind) + ind.squeeze() dist.view(-1)[flat_ind] = np.inf min_dist, ind = dist.min(dim=1, keepdim=True) knn_dists.append(min_dist) knn_inds.append(ind) min_dist = torch.cat(knn_dists, 1) ind = torch.cat(knn_inds, 1) return min_dist, ind # Too much memory if F0 or F1 large. Divide the F0 if nn_max_n > 1: N = len(F0) C = int(np.ceil(N / nn_max_n)) stride = nn_max_n dists, inds = [], [] for i in range(C): with torch.no_grad(): dist, ind = knn_dist(F0[i * stride:(i + 1) * stride], F1, knn=knn, dist_type='L2') dists.append(dist) inds.append(ind) dists = torch.cat(dists) inds = torch.cat(inds) assert len(inds) == N else: dist = pdist(F0, F1, dist_type='SquareL2') min_dist, inds = dist.min(dim=1) dists = min_dist.detach().unsqueeze(1) #.cpu() # inds = inds.cpu() if return_distance: return inds, dists else: return inds def find_knn_batch(F0, F1, len_batch, return_distance=False, nn_max_n=-1, knn=1, search_method=None, concat_results=False): if search_method is None or search_method == 'gpu': return find_knn_gpu_batch( F0, F1, len_batch=len_batch, nn_max_n=nn_max_n, knn=knn, return_distance=return_distance, concat_results=concat_results) elif search_method == 'cpu': return find_knn_cpu_batch( F0, F1, len_batch=len_batch, knn=knn, return_distance=return_distance, concat_results=concat_results) else: raise ValueError(f'Search method {search_method} not defined') def find_knn_gpu_batch(F0, F1, len_batch, nn_max_n=-1, knn=1, return_distance=False, concat_results=False): dists, nns = [], [] start0, start1 = 0, 0 for N0, N1 in len_batch: nn = find_knn_gpu( F0[start0:start0 + N0], F1[start1:start1 + N1], nn_max_n=nn_max_n, knn=knn, return_distance=return_distance) if return_distance: nn, dist = nn dists.append(dist) if concat_results: nns.append(nn + start1) else: nns.append(nn) start0 += N0 start1 += N1 if concat_results: nns = torch.cat(nns) if return_distance: dists = torch.cat(dists) if return_distance: return nns, dists else: return nns def find_knn_cpu_batch(F0, F1, len_batch, knn=1, return_distance=False, concat_results=False): if not isinstance(F0, np.ndarray): F0 = F0.detach().cpu().numpy() F1 = F1.detach().cpu().numpy() dists, nns = [], [] start0, start1 = 0, 0 for N0, N1 in len_batch: nn = find_knn_cpu( F0[start0:start0 + N0], F1[start1:start1 + N1], return_distance=return_distance) if return_distance: nn, dist = nn dists.append(dist) if concat_results: nns.append(nn + start1) else: nns.append(nn + start1) start0 += N0 start1 += N1 if concat_results: nns = np.hstack(nns) if return_distance: dists = np.hstack(dists) if return_distance: return torch.from_numpy(nns), torch.from_numpy(dists) else: return torch.from_numpy(nns) ================================================ FILE: core/loss.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import torch.nn as nn import numpy as np class UnbalancedLoss(nn.Module): NUM_LABELS = 2 def __init__(self): super().__init__() self.crit = nn.BCEWithLogitsLoss() def forward(self, logits, label): return self.crit(logits, label.to(torch.float)) class BalancedLoss(nn.Module): NUM_LABELS = 2 def __init__(self): super().__init__() self.crit = nn.BCEWithLogitsLoss() def forward(self, logits, label): assert torch.all(label < self.NUM_LABELS) loss = torch.scalar_tensor(0.).to(logits) for i in range(self.NUM_LABELS): target_mask = label == i if torch.any(target_mask): loss += self.crit(logits[target_mask], label[target_mask].to( torch.float)) / self.NUM_LABELS return loss class HighDimSmoothL1Loss: def __init__(self, weights, quantization_size=1, eps=np.finfo(np.float32).eps): self.eps = eps self.quantization_size = quantization_size self.weights = weights if self.weights is not None: self.w1 = weights.sum() def __call__(self, X, Y): sq_dist = torch.sum(((X - Y) / self.quantization_size)**2, axis=1, keepdim=True) use_sq_half = 0.5 * (sq_dist < 1).float() loss = (0.5 - use_sq_half) * (torch.sqrt(sq_dist + self.eps) - 0.5) + use_sq_half * sq_dist if self.weights is None: return loss.mean() else: return (loss * self.weights).sum() / self.w1 ================================================ FILE: core/metrics.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import torch.functional as F def rotation_mat2angle(R): return torch.acos(torch.clamp((torch.trace(R) - 1) / 2, -0.9999, 0.9999)) def rotation_error(R1, R2): assert R1.shape == R2.shape return torch.acos(torch.clamp((torch.trace(torch.mm(R1.t(), R2)) - 1) / 2, -0.9999, 0.9999)) def translation_error(t1, t2): assert t1.shape == t2.shape return torch.sqrt(((t1 - t2)**2).sum()) def batch_rotation_error(rots1, rots2): r""" arccos( (tr(R_1^T R_2) - 1) / 2 ) rots1: B x 3 x 3 or B x 9 rots1: B x 3 x 3 or B x 9 """ assert len(rots1) == len(rots2) trace_r1Tr2 = (rots1.reshape(-1, 9) * rots2.reshape(-1, 9)).sum(1) side = (trace_r1Tr2 - 1) / 2 return torch.acos(torch.clamp(side, min=-0.999, max=0.999)) def batch_translation_error(trans1, trans2): r""" trans1: B x 3 trans2: B x 3 """ assert len(trans1) == len(trans2) return torch.norm(trans1 - trans2, p=2, dim=1, keepdim=False) def eval_metrics(output, target): output = (F.sigmoid(output) > 0.5) target = target return torch.norm(output - target) def corr_dist(est, gth, xyz0, xyz1, weight=None, max_dist=1): xyz0_est = xyz0 @ est[:3, :3].t() + est[:3, 3] xyz0_gth = xyz0 @ gth[:3, :3].t() + gth[:3, 3] dists = torch.clamp(torch.sqrt(((xyz0_est - xyz0_gth).pow(2)).sum(1)), max=max_dist) if weight is not None: dists = weight * dists return dists.mean() def pdist(A, B, dist_type='L2'): if dist_type == 'L2': D2 = torch.sum((A.unsqueeze(1) - B.unsqueeze(0)).pow(2), 2) return torch.sqrt(D2 + 1e-7) elif dist_type == 'SquareL2': return torch.sum((A.unsqueeze(1) - B.unsqueeze(0)).pow(2), 2) else: raise NotImplementedError('Not implemented') def get_loss_fn(loss): if loss == 'corr_dist': return corr_dist else: raise ValueError(f'Loss {loss}, not defined') ================================================ FILE: core/registration.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import numpy as np import torch import torch.optim as optim from core.knn import pdist from core.loss import HighDimSmoothL1Loss def ortho2rotation(poses): r""" poses: batch x 6 """ def normalize_vector(v): r""" Batch x 3 """ v_mag = torch.sqrt((v**2).sum(1, keepdim=True)) v_mag = torch.clamp(v_mag, min=1e-8) v = v / v_mag return v def cross_product(u, v): r""" u: batch x 3 v: batch x 3 """ i = u[:, 1] * v[:, 2] - u[:, 2] * v[:, 1] j = u[:, 2] * v[:, 0] - u[:, 0] * v[:, 2] k = u[:, 0] * v[:, 1] - u[:, 1] * v[:, 0] i = i[:, None] j = j[:, None] k = k[:, None] return torch.cat((i, j, k), 1) def proj_u2a(u, a): r""" u: batch x 3 a: batch x 3 """ inner_prod = (u * a).sum(1, keepdim=True) norm2 = (u**2).sum(1, keepdim=True) norm2 = torch.clamp(norm2, min=1e-8) factor = inner_prod / norm2 return factor * u x_raw = poses[:, 0:3] y_raw = poses[:, 3:6] x = normalize_vector(x_raw) y = normalize_vector(y_raw - proj_u2a(x, y_raw)) z = cross_product(x, y) x = x[:, :, None] y = y[:, :, None] z = z[:, :, None] return torch.cat((x, y, z), 2) def argmin_se3_squared_dist(X, Y): """ X: torch tensor N x 3 Y: torch tensor N x 3 """ # https://ieeexplore.ieee.org/document/88573 assert len(X) == len(Y) mux = X.mean(0, keepdim=True) muy = Y.mean(0, keepdim=True) Sxy = (Y - muy).t().mm(X - mux) / len(X) U, D, V = Sxy.svd() # svd = gesvd.GESVDFunction() # U, S, V = svd.apply(Sxy) # S[-1, -1] = U.det() * V.det() S = torch.eye(3) if U.det() * V.det() < 0: S[-1, -1] = -1 R = U.mm(S.mm(V.t())) t = muy.squeeze() - R.mm(mux.t()).squeeze() return R, t def weighted_procrustes(X, Y, w, eps): """ X: torch tensor N x 3 Y: torch tensor N x 3 w: torch tensor N """ # https://ieeexplore.ieee.org/document/88573 assert len(X) == len(Y) W1 = torch.abs(w).sum() w_norm = w / (W1 + eps) mux = (w_norm * X).sum(0, keepdim=True) muy = (w_norm * Y).sum(0, keepdim=True) # Use CPU for small arrays Sxy = (Y - muy).t().mm(w_norm * (X - mux)).cpu().double() U, D, V = Sxy.svd() S = torch.eye(3).double() if U.det() * V.det() < 0: S[-1, -1] = -1 R = U.mm(S.mm(V.t())).float() t = (muy.cpu().squeeze() - R.mm(mux.cpu().t()).squeeze()).float() return R, t class Transformation(torch.nn.Module): def __init__(self, R_init=None, t_init=None): torch.nn.Module.__init__(self) rot_init = torch.rand(1, 6) trans_init = torch.zeros(1, 3) if R_init is not None: rot_init[0, :3] = R_init[:, 0] rot_init[0, 3:] = R_init[:, 1] if t_init is not None: trans_init[0] = t_init self.rot6d = torch.nn.Parameter(rot_init) self.trans = torch.nn.Parameter(trans_init) def forward(self, points): rot_mat = ortho2rotation(self.rot6d) return points @ rot_mat[0].t() + self.trans def GlobalRegistration(points, trans_points, weights=None, max_iter=1000, verbose=False, stat_freq=20, max_break_count=20, break_threshold_ratio=1e-5, loss_fn=None, quantization_size=1): if isinstance(points, np.ndarray): points = torch.from_numpy(points).float() if isinstance(trans_points, np.ndarray): trans_points = torch.from_numpy(trans_points).float() if loss_fn is None: if weights is not None: weights.requires_grad = False loss_fn = HighDimSmoothL1Loss(weights, quantization_size) if weights is None: # Get the initialization using https://ieeexplore.ieee.org/document/88573 R, t = argmin_se3_squared_dist(points, trans_points) else: R, t = weighted_procrustes(points, trans_points, weights, loss_fn.eps) transformation = Transformation(R, t).to(points.device) optimizer = optim.Adam(transformation.parameters(), lr=1e-1) scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.999) loss_prev = loss_fn(transformation(points), trans_points).item() break_counter = 0 # Transform points for i in range(max_iter): new_points = transformation(points) loss = loss_fn(new_points, trans_points) if loss.item() < 1e-7: break optimizer.zero_grad() loss.backward() optimizer.step() scheduler.step() if i % stat_freq == 0 and verbose: print(i, scheduler.get_lr(), loss.item()) if abs(loss_prev - loss.item()) < loss_prev * break_threshold_ratio: break_counter += 1 if break_counter >= max_break_count: break loss_prev = loss.item() rot6d = transformation.rot6d.detach() trans = transformation.trans.detach() opt_result = {'iterations': i, 'loss': loss.item(), 'break_count': break_counter} return ortho2rotation(rot6d)[0], trans, opt_result ================================================ FILE: core/trainer.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 # Written by Chris Choy # Distributed under MIT License import time import os import os.path as osp import gc import logging import numpy as np import json import torch import torch.optim as optim import torch.nn.functional as F from tensorboardX import SummaryWriter from model import load_model from core.knn import find_knn_batch from core.correspondence import find_correct_correspondence from core.loss import UnbalancedLoss, BalancedLoss from core.metrics import batch_rotation_error, batch_translation_error import core.registration as GlobalRegistration from util.timer import Timer, AverageMeter from util.file import ensure_dir import MinkowskiEngine as ME eps = np.finfo(float).eps np2th = torch.from_numpy class WeightedProcrustesTrainer: def __init__(self, config, data_loader, val_data_loader=None): # occupancy only for 3D Match dataset. For ScanNet, use RGB 3 channels. num_feats = 3 if config.use_xyz_feature else 1 # Feature model initialization if config.use_gpu and not torch.cuda.is_available(): logging.warning('Warning: There\'s no CUDA support on this machine, ' 'training is performed on CPU.') raise ValueError('GPU not available, but cuda flag set') self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') self.config = config # Training config self.max_epoch = config.max_epoch self.start_epoch = 1 self.checkpoint_dir = config.out_dir self.data_loader = data_loader self.train_data_loader_iter = self.data_loader.__iter__() self.iter_size = config.iter_size self.batch_size = data_loader.batch_size # Validation config self.val_max_iter = config.val_max_iter self.val_epoch_freq = config.val_epoch_freq self.best_val_metric = config.best_val_metric self.best_val_epoch = -np.inf self.best_val = -np.inf self.val_data_loader = val_data_loader self.test_valid = True if self.val_data_loader is not None else False # Logging self.log_step = int(np.sqrt(self.config.batch_size)) self.writer = SummaryWriter(config.out_dir) # Model FeatModel = load_model(config.feat_model) InlierModel = load_model(config.inlier_model) num_feats = 6 if self.config.inlier_feature_type == 'coords' else 1 self.feat_model = FeatModel(num_feats, config.feat_model_n_out, bn_momentum=config.bn_momentum, conv1_kernel_size=config.feat_conv1_kernel_size, normalize_feature=config.normalize_feature).to( self.device) logging.info(self.feat_model) self.inlier_model = InlierModel(num_feats, 1, bn_momentum=config.bn_momentum, conv1_kernel_size=config.inlier_conv1_kernel_size, normalize_feature=False, D=6).to(self.device) logging.info(self.inlier_model) # Loss and optimizer self.clip_weight_thresh = self.config.clip_weight_thresh if self.config.use_balanced_loss: self.crit = BalancedLoss() else: self.crit = UnbalancedLoss() self.optimizer = getattr(optim, config.optimizer)(self.inlier_model.parameters(), lr=config.lr, momentum=config.momentum, weight_decay=config.weight_decay) self.scheduler = optim.lr_scheduler.ExponentialLR(self.optimizer, config.exp_gamma) # Output preparation ensure_dir(self.checkpoint_dir) json.dump(config, open(os.path.join(self.checkpoint_dir, 'config.json'), 'w'), indent=4, sort_keys=False) self._load_weights(config) def train(self): """ Major interface Full training logic: train, valid, and save """ # Baseline random feature performance if self.test_valid: val_dict = self._valid_epoch() for k, v in val_dict.items(): self.writer.add_scalar(f'val/{k}', v, 0) # Train and valid for epoch in range(self.start_epoch, self.max_epoch + 1): lr = self.scheduler.get_lr() logging.info(f" Epoch: {epoch}, LR: {lr}") self._train_epoch(epoch) self._save_checkpoint(epoch) self.scheduler.step() if self.test_valid and epoch % self.val_epoch_freq == 0: val_dict = self._valid_epoch() for k, v in val_dict.items(): self.writer.add_scalar(f'val/{k}', v, epoch) if self.best_val < val_dict[self.best_val_metric]: logging.info( f'Saving the best val model with {self.best_val_metric}: {val_dict[self.best_val_metric]}' ) self.best_val = val_dict[self.best_val_metric] self.best_val_epoch = epoch self._save_checkpoint(epoch, 'best_val_checkpoint') else: logging.info( f'Current best val model with {self.best_val_metric}: {self.best_val} at epoch {self.best_val_epoch}' ) def _train_epoch(self, epoch): gc.collect() # Fix the feature model and train the inlier model self.feat_model.eval() self.inlier_model.train() # Epoch starts from 1 total_loss, total_num = 0, 0.0 data_loader = self.data_loader iter_size = self.iter_size # Meters for statistics average_valid_meter = AverageMeter() loss_meter = AverageMeter() data_meter = AverageMeter() regist_succ_meter = AverageMeter() regist_rte_meter = AverageMeter() regist_rre_meter = AverageMeter() # Timers for profiling data_timer = Timer() nn_timer = Timer() inlier_timer = Timer() total_timer = Timer() if self.config.num_train_iter > 0: num_train_iter = self.config.num_train_iter else: num_train_iter = len(data_loader) // iter_size start_iter = (epoch - 1) * num_train_iter tp, fp, tn, fn = 0, 0, 0, 0 # Iterate over batches for curr_iter in range(num_train_iter): self.optimizer.zero_grad() batch_loss, data_time = 0, 0 total_timer.tic() for iter_idx in range(iter_size): data_timer.tic() input_dict = self.get_data(self.train_data_loader_iter) data_time += data_timer.toc(average=False) # Initial inlier prediction with FCGF and KNN matching reg_coords, reg_feats, pred_pairs, is_correct, feat_time, nn_time = self.generate_inlier_input( xyz0=input_dict['pcd0'], xyz1=input_dict['pcd1'], iC0=input_dict['sinput0_C'], iC1=input_dict['sinput1_C'], iF0=input_dict['sinput0_F'], iF1=input_dict['sinput1_F'], len_batch=input_dict['len_batch'], pos_pairs=input_dict['correspondences']) nn_timer.update(nn_time) # Inlier prediction with 6D ConvNet inlier_timer.tic() reg_sinput = ME.SparseTensor(reg_feats.contiguous(), coords=reg_coords.int()).to(self.device) reg_soutput = self.inlier_model(reg_sinput) inlier_timer.toc() logits = reg_soutput.F weights = logits.sigmoid() # Truncate weights too low # For training, inplace modification is prohibited for backward if self.clip_weight_thresh > 0: weights_tmp = torch.zeros_like(weights) valid_mask = weights > self.clip_weight_thresh weights_tmp[valid_mask] = weights[valid_mask] weights = weights_tmp # Weighted Procrustes pred_rots, pred_trans, ws = self.weighted_procrustes(xyz0s=input_dict['pcd0'], xyz1s=input_dict['pcd1'], pred_pairs=pred_pairs, weights=weights) # Get batch registration loss gt_rots, gt_trans = self.decompose_rotation_translation(input_dict['T_gt']) rot_error = batch_rotation_error(pred_rots, gt_rots) trans_error = batch_translation_error(pred_trans, gt_trans) individual_loss = rot_error + self.config.trans_weight * trans_error # Select batches with at least 10 valid correspondences valid_mask = ws > 10 num_valid = valid_mask.sum().item() average_valid_meter.update(num_valid) # Registration loss against registration GT loss = self.config.procrustes_loss_weight * individual_loss[valid_mask].mean() if not np.isfinite(loss.item()): max_val = loss.item() logging.info('Loss is infinite, abort ') continue # Direct inlier loss against nearest neighbor searched GT target = torch.from_numpy(is_correct).squeeze() if self.config.inlier_use_direct_loss: inlier_loss = self.config.inlier_direct_loss_weight * self.crit( logits.cpu().squeeze(), target.to(torch.float)) / iter_size loss += inlier_loss loss.backward() # Update statistics before backprop with torch.no_grad(): regist_rre_meter.update(rot_error.squeeze() * 180 / np.pi) regist_rte_meter.update(trans_error.squeeze()) success = (trans_error.squeeze() < self.config.success_rte_thresh) * ( rot_error.squeeze() * 180 / np.pi < self.config.success_rre_thresh) regist_succ_meter.update(success.float()) batch_loss += loss.mean().item() neg_target = (~target).to(torch.bool) pred = logits > 0 # todo thresh pred_on_pos, pred_on_neg = pred[target], pred[neg_target] tp += pred_on_pos.sum().item() fp += pred_on_neg.sum().item() tn += (~pred_on_neg).sum().item() fn += (~pred_on_pos).sum().item() # Check gradient and avoid backprop of inf values max_grad = torch.abs(self.inlier_model.final.kernel.grad).max().cpu().item() # Backprop only if gradient is finite if not np.isfinite(max_grad): self.optimizer.zero_grad() logging.info(f'Clearing the NaN gradient at iter {curr_iter}') else: self.optimizer.step() gc.collect() torch.cuda.empty_cache() total_loss += batch_loss total_num += 1.0 total_timer.toc() data_meter.update(data_time) loss_meter.update(batch_loss) # Output to logs if curr_iter % self.config.stat_freq == 0: precision = tp / (tp + fp + eps) recall = tp / (tp + fn + eps) f1 = 2 * (precision * recall) / (precision + recall + eps) tpr = tp / (tp + fn + eps) tnr = tn / (tn + fp + eps) balanced_accuracy = (tpr + tnr) / 2 correspondence_accuracy = is_correct.sum() / len(is_correct) stat = { 'loss': loss_meter.avg, 'precision': precision, 'recall': recall, 'tpr': tpr, 'tnr': tnr, 'balanced_accuracy': balanced_accuracy, 'f1': f1, 'num_valid': average_valid_meter.avg, } for k, v in stat.items(): self.writer.add_scalar(f'train/{k}', v, start_iter + curr_iter) logging.info(' '.join([ f"Train Epoch: {epoch} [{curr_iter}/{num_train_iter}],", f"Current Loss: {loss_meter.avg:.3e},", f"Correspondence acc: {correspondence_accuracy:.3e}", f", Precision: {precision:.4f}, Recall: {recall:.4f}, F1: {f1:.4f},", f"TPR: {tpr:.4f}, TNR: {tnr:.4f}, BAcc: {balanced_accuracy:.4f}", f"RTE: {regist_rte_meter.avg:.3e}, RRE: {regist_rre_meter.avg:.3e},", f"Succ rate: {regist_succ_meter.avg:3e}", f"Avg num valid: {average_valid_meter.avg:3e}", f"\tData time: {data_meter.avg:.4f}, Train time: {total_timer.avg - data_meter.avg:.4f},", f"NN search time: {nn_timer.avg:.3e}, Total time: {total_timer.avg:.4f}" ])) loss_meter.reset() regist_rte_meter.reset() regist_rre_meter.reset() regist_succ_meter.reset() average_valid_meter.reset() data_meter.reset() total_timer.reset() tp, fp, tn, fn = 0, 0, 0, 0 def _valid_epoch(self): # Change the network to evaluation mode self.feat_model.eval() self.inlier_model.eval() self.val_data_loader.dataset.reset_seed(0) num_data = 0 loss_meter = AverageMeter() hit_ratio_meter = AverageMeter() regist_succ_meter = AverageMeter() regist_rte_meter = AverageMeter() regist_rre_meter = AverageMeter() data_timer = Timer() feat_timer = Timer() inlier_timer = Timer() nn_timer = Timer() dgr_timer = Timer() tot_num_data = len(self.val_data_loader.dataset) if self.val_max_iter > 0: tot_num_data = min(self.val_max_iter, tot_num_data) tot_num_data = int(tot_num_data / self.val_data_loader.batch_size) data_loader_iter = self.val_data_loader.__iter__() tp, fp, tn, fn = 0, 0, 0, 0 for batch_idx in range(tot_num_data): data_timer.tic() input_dict = self.get_data(data_loader_iter) data_timer.toc() reg_coords, reg_feats, pred_pairs, is_correct, feat_time, nn_time = self.generate_inlier_input( xyz0=input_dict['pcd0'], xyz1=input_dict['pcd1'], iC0=input_dict['sinput0_C'], iC1=input_dict['sinput1_C'], iF0=input_dict['sinput0_F'], iF1=input_dict['sinput1_F'], len_batch=input_dict['len_batch'], pos_pairs=input_dict['correspondences']) feat_timer.update(feat_time) nn_timer.update(nn_time) hit_ratio_meter.update(is_correct.sum().item() / len(is_correct)) inlier_timer.tic() reg_sinput = ME.SparseTensor(reg_feats.contiguous(), coords=reg_coords.int()).to(self.device) reg_soutput = self.inlier_model(reg_sinput) inlier_timer.toc() dgr_timer.tic() logits = reg_soutput.F weights = logits.sigmoid() if self.clip_weight_thresh > 0: weights[weights < self.clip_weight_thresh] = 0 # Weighted Procrustes pred_rots, pred_trans, ws = self.weighted_procrustes(xyz0s=input_dict['pcd0'], xyz1s=input_dict['pcd1'], pred_pairs=pred_pairs, weights=weights) dgr_timer.toc() valid_mask = ws > 10 gt_rots, gt_trans = self.decompose_rotation_translation(input_dict['T_gt']) rot_error = batch_rotation_error(pred_rots, gt_rots) * 180 / np.pi trans_error = batch_translation_error(pred_trans, gt_trans) regist_rre_meter.update(rot_error.squeeze()) regist_rte_meter.update(trans_error.squeeze()) # Compute success success = (trans_error < self.config.success_rte_thresh) * ( rot_error < self.config.success_rre_thresh) * valid_mask regist_succ_meter.update(success.float()) target = torch.from_numpy(is_correct).squeeze() neg_target = (~target).to(torch.bool) pred = weights > 0.5 # TODO thresh pred_on_pos, pred_on_neg = pred[target], pred[neg_target] tp += pred_on_pos.sum().item() fp += pred_on_neg.sum().item() tn += (~pred_on_neg).sum().item() fn += (~pred_on_pos).sum().item() num_data += 1 torch.cuda.empty_cache() if batch_idx % self.config.stat_freq == 0: precision = tp / (tp + fp + eps) recall = tp / (tp + fn + eps) f1 = 2 * (precision * recall) / (precision + recall + eps) tpr = tp / (tp + fn + eps) tnr = tn / (tn + fp + eps) balanced_accuracy = (tpr + tnr) / 2 logging.info(' '.join([ f"Validation iter {num_data} / {tot_num_data} : Data Loading Time: {data_timer.avg:.3e},", f"NN search time: {nn_timer.avg:.3e}", f"Feature Extraction Time: {feat_timer.avg:.3e}, Inlier Time: {inlier_timer.avg:.3e},", f"Loss: {loss_meter.avg:.4f}, Hit Ratio: {hit_ratio_meter.avg:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1: {f1:.4f}, ", f"TPR: {tpr:.4f}, TNR: {tnr:.4f}, BAcc: {balanced_accuracy:.4f}, ", f"DGR RTE: {regist_rte_meter.avg:.3e}, DGR RRE: {regist_rre_meter.avg:.3e}, DGR Time: {dgr_timer.avg:.3e}", f"DGR Succ rate: {regist_succ_meter.avg:3e}", ])) data_timer.reset() precision = tp / (tp + fp + eps) recall = tp / (tp + fn + eps) f1 = 2 * (precision * recall) / (precision + recall + eps) tpr = tp / (tp + fn + eps) tnr = tn / (tn + fp + eps) balanced_accuracy = (tpr + tnr) / 2 logging.info(' '.join([ f"Feature Extraction Time: {feat_timer.avg:.3e}, NN search time: {nn_timer.avg:.3e}", f"Inlier Time: {inlier_timer.avg:.3e}, Final Loss: {loss_meter.avg}, ", f"Loss: {loss_meter.avg}, Hit Ratio: {hit_ratio_meter.avg:.4f}, Precision: {precision}, Recall: {recall}, F1: {f1}, ", f"TPR: {tpr}, TNR: {tnr}, BAcc: {balanced_accuracy}, ", f"RTE: {regist_rte_meter.avg:.3e}, RRE: {regist_rre_meter.avg:.3e}, DGR Time: {dgr_timer.avg:.3e}", f"DGR Succ rate: {regist_succ_meter.avg:3e}", ])) stat = { 'loss': loss_meter.avg, 'precision': precision, 'recall': recall, 'tpr': tpr, 'tnr': tnr, 'balanced_accuracy': balanced_accuracy, 'f1': f1, 'regist_rte': regist_rte_meter.avg, 'regist_rre': regist_rre_meter.avg, 'succ_rate': regist_succ_meter.avg } return stat def _load_weights(self, config): if config.resume is None and config.weights: logging.info("=> loading weights for inlier model '{}'".format(config.weights)) checkpoint = torch.load(config.weights) self.feat_model.load_state_dict(checkpoint['state_dict']) logging.info("=> Loaded base model weights from '{}'".format(config.weights)) if 'state_dict_inlier' in checkpoint: self.inlier_model.load_state_dict(checkpoint['state_dict_inlier']) logging.info("=> Loaded inlier weights from '{}'".format(config.weights)) else: logging.warn("Inlier weight not found in '{}'".format(config.weights)) if config.resume is not None: if osp.isfile(config.resume): logging.info("=> loading checkpoint '{}'".format(config.resume)) state = torch.load(config.resume) self.start_epoch = state['epoch'] self.feat_model.load_state_dict(state['state_dict']) self.feat_model = self.feat_model.to(self.device) self.scheduler.load_state_dict(state['scheduler']) self.optimizer.load_state_dict(state['optimizer']) if 'best_val' in state.keys(): self.best_val = state['best_val'] self.best_val_epoch = state['best_val_epoch'] self.best_val_metric = state['best_val_metric'] if 'state_dict_inlier' in state: self.inlier_model.load_state_dict(state['state_dict_inlier']) self.inlier_model = self.inlier_model.to(self.device) else: logging.warn("Inlier weights not found in '{}'".format(config.resume)) else: logging.warn("Inlier weights does not exist at '{}'".format(config.resume)) def _save_checkpoint(self, epoch, filename='checkpoint'): """ Saving checkpoints :param epoch: current epoch number :param log: logging information of the epoch :param save_best: if True, rename the saved checkpoint to 'model_best.pth' """ print('_save_checkpoint from inlier_trainer') state = { 'epoch': epoch, 'state_dict': self.feat_model.state_dict(), 'state_dict_inlier': self.inlier_model.state_dict(), 'optimizer': self.optimizer.state_dict(), 'scheduler': self.scheduler.state_dict(), 'config': self.config, 'best_val': self.best_val, 'best_val_epoch': self.best_val_epoch, 'best_val_metric': self.best_val_metric } filename = os.path.join(self.checkpoint_dir, f'{filename}.pth') logging.info("Saving checkpoint: {} ...".format(filename)) torch.save(state, filename) def get_data(self, iterator): while True: try: input_data = iterator.next() except ValueError as e: logging.info('Skipping an empty batch') continue return input_data def decompose_by_length(self, tensor, reference_tensors): decomposed_tensors = [] start_ind = 0 for r in reference_tensors: N = len(r) decomposed_tensors.append(tensor[start_ind:start_ind + N]) start_ind += N return decomposed_tensors def decompose_rotation_translation(self, Ts): Ts = Ts.float() Rs = Ts[:, :3, :3] ts = Ts[:, :3, 3] Rs.require_grad = False ts.require_grad = False return Rs, ts def weighted_procrustes(self, xyz0s, xyz1s, pred_pairs, weights): decomposed_weights = self.decompose_by_length(weights, pred_pairs) RT = [] ws = [] for xyz0, xyz1, pred_pair, w in zip(xyz0s, xyz1s, pred_pairs, decomposed_weights): xyz0.requires_grad = False xyz1.requires_grad = False ws.append(w.sum().item()) predT = GlobalRegistration.weighted_procrustes( X=xyz0[pred_pair[:, 0]].to(self.device), Y=xyz1[pred_pair[:, 1]].to(self.device), w=w, eps=np.finfo(np.float32).eps) RT.append(predT) Rs, ts = list(zip(*RT)) Rs = torch.stack(Rs, 0) ts = torch.stack(ts, 0) ws = torch.Tensor(ws) return Rs, ts, ws def generate_inlier_features(self, xyz0, xyz1, C0, C1, F0, F1, pair_ind0, pair_ind1): """ Assume that the indices 0 and indices 1 gives the pairs in the (downsampled) correspondences. """ assert len(pair_ind0) == len(pair_ind1) reg_feat_type = self.config.inlier_feature_type assert reg_feat_type in ['ones', 'coords', 'counts', 'feats'] # Move coordinates and indices to the device if 'coords' in reg_feat_type: C0 = C0.to(self.device) C1 = C1.to(self.device) # TODO: change it to append the features and then concat at last if reg_feat_type == 'ones': reg_feat = torch.ones((len(pair_ind0), 1)).to(torch.float32) elif reg_feat_type == 'feats': reg_feat = torch.cat((F0[pair_ind0], F1[pair_ind1]), dim=1) elif reg_feat_type == 'coords': reg_feat = torch.cat((torch.cos(torch.cat( xyz0, 0)[pair_ind0]), torch.cos(torch.cat(xyz1, 0)[pair_ind1])), dim=1) else: raise ValueError('Inlier feature type not defined') return reg_feat def generate_inlier_input(self, xyz0, xyz1, iC0, iC1, iF0, iF1, len_batch, pos_pairs): # pairs consist of (xyz1 index, xyz0 index) stime = time.time() sinput0 = ME.SparseTensor(iF0, coords=iC0).to(self.device) oF0 = self.feat_model(sinput0).F sinput1 = ME.SparseTensor(iF1, coords=iC1).to(self.device) oF1 = self.feat_model(sinput1).F feat_time = time.time() - stime stime = time.time() pred_pairs = self.find_pairs(oF0, oF1, len_batch) nn_time = time.time() - stime is_correct = find_correct_correspondence(pos_pairs, pred_pairs, len_batch=len_batch) cat_pred_pairs = [] start_inds = torch.zeros((1, 2)).long() for lens, pred_pair in zip(len_batch, pred_pairs): cat_pred_pairs.append(pred_pair + start_inds) start_inds += torch.LongTensor(lens) cat_pred_pairs = torch.cat(cat_pred_pairs, 0) pred_pair_inds0, pred_pair_inds1 = cat_pred_pairs.t() reg_coords = torch.cat((iC0[pred_pair_inds0], iC1[pred_pair_inds1, 1:]), 1) reg_feats = self.generate_inlier_features(xyz0, xyz1, iC0, iC1, oF0, oF1, pred_pair_inds0, pred_pair_inds1).float() return reg_coords, reg_feats, pred_pairs, is_correct, feat_time, nn_time def find_pairs(self, F0, F1, len_batch): nn_batch = find_knn_batch(F0, F1, len_batch, nn_max_n=self.config.nn_max_n, knn=self.config.inlier_knn, return_distance=False, search_method=self.config.knn_search_method) pred_pairs = [] for nns, lens in zip(nn_batch, len_batch): pred_pair_ind0, pred_pair_ind1 = torch.arange( len(nns)).long()[:, None], nns.long().cpu() nn_pairs = [] for j in range(nns.shape[1]): nn_pairs.append( torch.cat((pred_pair_ind0.cpu(), pred_pair_ind1[:, j].unsqueeze(1)), 1)) pred_pairs.append(torch.cat(nn_pairs, 0)) return pred_pairs ================================================ FILE: dataloader/base_loader.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 # # Written by Chris Choy # Distributed under MIT License import os import logging import random import torch import torch.utils.data import numpy as np import dataloader.transforms as t from dataloader.inf_sampler import InfSampler import MinkowskiEngine as ME import open3d as o3d class CollationFunctionFactory: def __init__(self, concat_correspondences=True, collation_type='default'): self.concat_correspondences = concat_correspondences if collation_type == 'default': self.collation_fn = self.collate_default elif collation_type == 'collate_pair': self.collation_fn = self.collate_pair_fn else: raise ValueError(f'collation_type {collation_type} not found') def __call__(self, list_data): return self.collation_fn(list_data) def collate_default(self, list_data): return list_data def collate_pair_fn(self, list_data): N = len(list_data) list_data = [data for data in list_data if data is not None] if N != len(list_data): logging.info(f"Retain {len(list_data)} from {N} data.") if len(list_data) == 0: raise ValueError('No data in the batch') xyz0, xyz1, coords0, coords1, feats0, feats1, matching_inds, trans, extra_packages = list( zip(*list_data)) matching_inds_batch, trans_batch, len_batch = [], [], [] coords_batch0 = ME.utils.batched_coordinates(coords0) coords_batch1 = ME.utils.batched_coordinates(coords1) trans_batch = torch.from_numpy(np.stack(trans)).float() curr_start_inds = torch.zeros((1, 2), dtype=torch.int32) for batch_id, _ in enumerate(coords0): # For scan2cad there will be empty matching_inds even after filtering # This check will skip these pairs while not affecting other datasets if (len(matching_inds[batch_id]) == 0): continue N0 = coords0[batch_id].shape[0] N1 = coords1[batch_id].shape[0] if self.concat_correspondences: matching_inds_batch.append( torch.IntTensor(matching_inds[batch_id]) + curr_start_inds) else: matching_inds_batch.append(torch.IntTensor(matching_inds[batch_id])) len_batch.append([N0, N1]) # Move the head curr_start_inds[0, 0] += N0 curr_start_inds[0, 1] += N1 # Concatenate all lists feats_batch0 = torch.cat(feats0, 0).float() feats_batch1 = torch.cat(feats1, 0).float() # xyz_batch0 = torch.cat(xyz0, 0).float() # xyz_batch1 = torch.cat(xyz1, 0).float() # trans_batch = torch.cat(trans_batch, 0).float() if self.concat_correspondences: matching_inds_batch = torch.cat(matching_inds_batch, 0).int() return { 'pcd0': xyz0, 'pcd1': xyz1, 'sinput0_C': coords_batch0, 'sinput0_F': feats_batch0, 'sinput1_C': coords_batch1, 'sinput1_F': feats_batch1, 'correspondences': matching_inds_batch, 'T_gt': trans_batch, 'len_batch': len_batch, 'extra_packages': extra_packages, } class PairDataset(torch.utils.data.Dataset): AUGMENT = None def __init__(self, phase, transform=None, random_rotation=True, random_scale=True, manual_seed=False, config=None): self.phase = phase self.files = [] self.data_objects = [] self.transform = transform self.voxel_size = config.voxel_size self.matching_search_voxel_size = \ config.voxel_size * config.positive_pair_search_voxel_size_multiplier self.random_scale = random_scale self.min_scale = config.min_scale self.max_scale = config.max_scale self.random_rotation = random_rotation self.rotation_range = config.rotation_range self.randg = np.random.RandomState() if manual_seed: self.reset_seed() def reset_seed(self, seed=0): logging.info(f"Resetting the data loader seed to {seed}") self.randg.seed(seed) def apply_transform(self, pts, trans): R = trans[:3, :3] T = trans[:3, 3] pts = pts @ R.T + T return pts def __len__(self): return len(self.files) ================================================ FILE: dataloader/data_loaders.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 from dataloader.threedmatch_loader import * from dataloader.kitti_loader import * ALL_DATASETS = [ ThreeDMatchPairDataset07, ThreeDMatchPairDataset05, ThreeDMatchPairDataset03, ThreeDMatchTrajectoryDataset, KITTIPairDataset, KITTINMPairDataset ] dataset_str_mapping = {d.__name__: d for d in ALL_DATASETS} def make_data_loader(config, phase, batch_size, num_workers=0, shuffle=None): assert phase in ['train', 'trainval', 'val', 'test'] if shuffle is None: shuffle = phase != 'test' if config.dataset not in dataset_str_mapping.keys(): logging.error(f'Dataset {config.dataset}, does not exists in ' + ', '.join(dataset_str_mapping.keys())) Dataset = dataset_str_mapping[config.dataset] use_random_scale = False use_random_rotation = False transforms = [] if phase in ['train', 'trainval']: use_random_rotation = config.use_random_rotation use_random_scale = config.use_random_scale transforms += [t.Jitter()] if phase in ['val', 'test']: use_random_rotation = config.test_random_rotation dset = Dataset(phase, transform=t.Compose(transforms), random_scale=use_random_scale, random_rotation=use_random_rotation, config=config) collation_fn = CollationFunctionFactory(concat_correspondences=False, collation_type='collate_pair') loader = torch.utils.data.DataLoader(dset, batch_size=batch_size, collate_fn=collation_fn, num_workers=num_workers, sampler=InfSampler(dset, shuffle)) return loader ================================================ FILE: dataloader/inf_sampler.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch from torch.utils.data.sampler import Sampler class InfSampler(Sampler): """Samples elements randomly, without replacement. Arguments: data_source (Dataset): dataset to sample from """ def __init__(self, data_source, shuffle=False): self.data_source = data_source self.shuffle = shuffle self.reset_permutation() def reset_permutation(self): perm = len(self.data_source) if self.shuffle: perm = torch.randperm(perm) self._perm = perm.tolist() def __iter__(self): return self def __next__(self): if len(self._perm) == 0: self.reset_permutation() return self._perm.pop() def __len__(self): return len(self.data_source) ================================================ FILE: dataloader/kitti_loader.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import os import glob from dataloader.base_loader import * from dataloader.transforms import * from util.pointcloud import get_matching_indices, make_open3d_point_cloud kitti_cache = {} kitti_icp_cache = {} class KITTIPairDataset(PairDataset): AUGMENT = None DATA_FILES = { 'train': './dataloader/split/train_kitti.txt', 'val': './dataloader/split/val_kitti.txt', 'test': './dataloader/split/test_kitti.txt' } TEST_RANDOM_ROTATION = False IS_ODOMETRY = True def __init__(self, phase, transform=None, random_rotation=True, random_scale=True, manual_seed=False, config=None): # For evaluation, use the odometry dataset training following the 3DFeat eval method self.root = root = config.kitti_dir + '/dataset' random_rotation = self.TEST_RANDOM_ROTATION self.icp_path = config.icp_cache_path try: os.mkdir(self.icp_path) except OSError as error: pass PairDataset.__init__(self, phase, transform, random_rotation, random_scale, manual_seed, config) logging.info(f"Loading the subset {phase} from {root}") # Use the kitti root self.max_time_diff = max_time_diff = config.kitti_max_time_diff subset_names = open(self.DATA_FILES[phase]).read().split() for dirname in subset_names: drive_id = int(dirname) inames = self.get_all_scan_ids(drive_id) for start_time in inames: for time_diff in range(2, max_time_diff): pair_time = time_diff + start_time if pair_time in inames: self.files.append((drive_id, start_time, pair_time)) def get_all_scan_ids(self, drive_id): fnames = glob.glob(self.root + '/sequences/%02d/velodyne/*.bin' % drive_id) assert len( fnames) > 0, f"Make sure that the path {self.root} has drive id: {drive_id}" inames = [int(os.path.split(fname)[-1][:-4]) for fname in fnames] return inames @property def velo2cam(self): try: velo2cam = self._velo2cam except AttributeError: R = np.array([ 7.533745e-03, -9.999714e-01, -6.166020e-04, 1.480249e-02, 7.280733e-04, -9.998902e-01, 9.998621e-01, 7.523790e-03, 1.480755e-02 ]).reshape(3, 3) T = np.array([-4.069766e-03, -7.631618e-02, -2.717806e-01]).reshape(3, 1) velo2cam = np.hstack([R, T]) self._velo2cam = np.vstack((velo2cam, [0, 0, 0, 1])).T return self._velo2cam def get_video_odometry(self, drive, indices=None, ext='.txt', return_all=False): data_path = self.root + '/poses/%02d.txt' % drive if data_path not in kitti_cache: kitti_cache[data_path] = np.genfromtxt(data_path) if return_all: return kitti_cache[data_path] else: return kitti_cache[data_path][indices] def odometry_to_positions(self, odometry): T_w_cam0 = odometry.reshape(3, 4) T_w_cam0 = np.vstack((T_w_cam0, [0, 0, 0, 1])) return T_w_cam0 def rot3d(self, axis, angle): ei = np.ones(3, dtype='bool') ei[axis] = 0 i = np.nonzero(ei)[0] m = np.eye(3) c, s = np.cos(angle), np.sin(angle) m[i[0], i[0]] = c m[i[0], i[1]] = -s m[i[1], i[0]] = s m[i[1], i[1]] = c return m def pos_transform(self, pos): x, y, z, rx, ry, rz, _ = pos[0] RT = np.eye(4) RT[:3, :3] = np.dot(np.dot(self.rot3d(0, rx), self.rot3d(1, ry)), self.rot3d(2, rz)) RT[:3, 3] = [x, y, z] return RT def get_position_transform(self, pos0, pos1, invert=False): T0 = self.pos_transform(pos0) T1 = self.pos_transform(pos1) return (np.dot(T1, np.linalg.inv(T0)).T if not invert else np.dot( np.linalg.inv(T1), T0).T) def _get_velodyne_fn(self, drive, t): fname = self.root + '/sequences/%02d/velodyne/%06d.bin' % (drive, t) return fname def __getitem__(self, idx): drive = self.files[idx][0] t0, t1 = self.files[idx][1], self.files[idx][2] all_odometry = self.get_video_odometry(drive, [t0, t1]) positions = [self.odometry_to_positions(odometry) for odometry in all_odometry] fname0 = self._get_velodyne_fn(drive, t0) fname1 = self._get_velodyne_fn(drive, t1) # XYZ and reflectance xyzr0 = np.fromfile(fname0, dtype=np.float32).reshape(-1, 4) xyzr1 = np.fromfile(fname1, dtype=np.float32).reshape(-1, 4) xyz0 = xyzr0[:, :3] xyz1 = xyzr1[:, :3] key = '%d_%d_%d' % (drive, t0, t1) filename = self.icp_path + '/' + key + '.npy' if key not in kitti_icp_cache: if not os.path.exists(filename): # work on the downsampled xyzs, 0.05m == 5cm sel0 = ME.utils.sparse_quantize(xyz0 / 0.05, return_index=True) sel1 = ME.utils.sparse_quantize(xyz1 / 0.05, return_index=True) M = (self.velo2cam @ positions[0].T @ np.linalg.inv(positions[1].T) @ np.linalg.inv(self.velo2cam)).T xyz0_t = self.apply_transform(xyz0[sel0], M) pcd0 = make_open3d_point_cloud(xyz0_t) pcd1 = make_open3d_point_cloud(xyz1[sel1]) reg = o3d.registration.registration_icp(pcd0, pcd1, 0.2, np.eye(4), o3d.registration.TransformationEstimationPointToPoint(), o3d.registration.ICPConvergenceCriteria(max_iteration=200)) pcd0.transform(reg.transformation) # pcd0.transform(M2) or self.apply_transform(xyz0, M2) M2 = M @ reg.transformation # o3d.draw_geometries([pcd0, pcd1]) # write to a file np.save(filename, M2) else: M2 = np.load(filename) kitti_icp_cache[key] = M2 else: M2 = kitti_icp_cache[key] if self.random_rotation: T0 = sample_random_trans(xyz0, self.randg, np.pi / 4) T1 = sample_random_trans(xyz1, self.randg, np.pi / 4) trans = T1 @ M2 @ np.linalg.inv(T0) xyz0 = self.apply_transform(xyz0, T0) xyz1 = self.apply_transform(xyz1, T1) else: trans = M2 matching_search_voxel_size = self.matching_search_voxel_size if self.random_scale and random.random() < 0.95: scale = self.min_scale + \ (self.max_scale - self.min_scale) * random.random() matching_search_voxel_size *= scale xyz0 = scale * xyz0 xyz1 = scale * xyz1 # Voxelization xyz0_th = torch.from_numpy(xyz0) xyz1_th = torch.from_numpy(xyz1) sel0 = ME.utils.sparse_quantize(xyz0_th / self.voxel_size, return_index=True) sel1 = ME.utils.sparse_quantize(xyz1_th / self.voxel_size, return_index=True) # Make point clouds using voxelized points pcd0 = make_open3d_point_cloud(xyz0[sel0]) pcd1 = make_open3d_point_cloud(xyz1[sel1]) # Get matches matches = get_matching_indices(pcd0, pcd1, trans, matching_search_voxel_size) if len(matches) < 1000: raise ValueError(f"Insufficient matches in {drive}, {t0}, {t1}") # Get features npts0 = len(sel0) npts1 = len(sel1) feats_train0, feats_train1 = [], [] unique_xyz0_th = xyz0_th[sel0] unique_xyz1_th = xyz1_th[sel1] feats_train0.append(torch.ones((npts0, 1))) feats_train1.append(torch.ones((npts1, 1))) feats0 = torch.cat(feats_train0, 1) feats1 = torch.cat(feats_train1, 1) coords0 = torch.floor(unique_xyz0_th / self.voxel_size) coords1 = torch.floor(unique_xyz1_th / self.voxel_size) if self.transform: coords0, feats0 = self.transform(coords0, feats0) coords1, feats1 = self.transform(coords1, feats1) extra_package = {'drive': drive, 't0': t0, 't1': t1} return (unique_xyz0_th.float(), unique_xyz1_th.float(), coords0.int(), coords1.int(), feats0.float(), feats1.float(), matches, trans, extra_package) class KITTINMPairDataset(KITTIPairDataset): r""" Generate KITTI pairs within N meter distance """ MIN_DIST = 10 def __init__(self, phase, transform=None, random_rotation=True, random_scale=True, manual_seed=False, config=None): self.root = root = os.path.join(config.kitti_dir, 'dataset') self.icp_path = os.path.join(config.kitti_dir, config.icp_cache_path) try: os.mkdir(self.icp_path) except OSError as error: pass random_rotation = self.TEST_RANDOM_ROTATION PairDataset.__init__(self, phase, transform, random_rotation, random_scale, manual_seed, config) logging.info(f"Loading the subset {phase} from {root}") subset_names = open(self.DATA_FILES[phase]).read().split() for dirname in subset_names: drive_id = int(dirname) fnames = glob.glob(root + '/sequences/%02d/velodyne/*.bin' % drive_id) assert len(fnames) > 0, f"Make sure that the path {root} has data {dirname}" inames = sorted([int(os.path.split(fname)[-1][:-4]) for fname in fnames]) all_odo = self.get_video_odometry(drive_id, return_all=True) all_pos = np.array([self.odometry_to_positions(odo) for odo in all_odo]) Ts = all_pos[:, :3, 3] pdist = (Ts.reshape(1, -1, 3) - Ts.reshape(-1, 1, 3))**2 pdist = np.sqrt(pdist.sum(-1)) more_than_10 = pdist > self.MIN_DIST curr_time = inames[0] while curr_time in inames: # Find the min index next_time = np.where(more_than_10[curr_time][curr_time:curr_time + 100])[0] if len(next_time) == 0: curr_time += 1 else: # Follow https://github.com/yewzijian/3DFeatNet/blob/master/scripts_data_processing/kitti/process_kitti_data.m#L44 next_time = next_time[0] + curr_time - 1 if next_time in inames: self.files.append((drive_id, curr_time, next_time)) curr_time = next_time + 1 # Remove problematic sequence for item in [ (8, 15, 58), ]: if item in self.files: self.files.pop(self.files.index(item)) ================================================ FILE: dataloader/split/test_3dmatch.txt ================================================ 7-scenes-redkitchen sun3d-home_at-home_at_scan1_2013_jan_1 sun3d-home_md-home_md_scan9_2012_sep_30 sun3d-hotel_uc-scan3 sun3d-hotel_umd-maryland_hotel1 sun3d-hotel_umd-maryland_hotel3 sun3d-mit_76_studyroom-76-1studyroom2 sun3d-mit_lab_hj-lab_hj_tea_nov_2_2012_scan1_erika ================================================ FILE: dataloader/split/test_kitti.txt ================================================ 8 9 10 ================================================ FILE: dataloader/split/test_modelnet40.txt ================================================ glass_box/test/glass_box_0172.off glass_box/test/glass_box_0173.off glass_box/test/glass_box_0174.off glass_box/test/glass_box_0175.off glass_box/test/glass_box_0176.off glass_box/test/glass_box_0177.off glass_box/test/glass_box_0178.off glass_box/test/glass_box_0179.off glass_box/test/glass_box_0180.off glass_box/test/glass_box_0181.off glass_box/test/glass_box_0182.off glass_box/test/glass_box_0183.off glass_box/test/glass_box_0184.off glass_box/test/glass_box_0185.off glass_box/test/glass_box_0186.off glass_box/test/glass_box_0187.off glass_box/test/glass_box_0188.off glass_box/test/glass_box_0189.off glass_box/test/glass_box_0190.off glass_box/test/glass_box_0191.off glass_box/test/glass_box_0192.off glass_box/test/glass_box_0193.off glass_box/test/glass_box_0194.off glass_box/test/glass_box_0195.off glass_box/test/glass_box_0196.off glass_box/test/glass_box_0197.off glass_box/test/glass_box_0198.off glass_box/test/glass_box_0199.off glass_box/test/glass_box_0200.off glass_box/test/glass_box_0201.off glass_box/test/glass_box_0202.off glass_box/test/glass_box_0203.off glass_box/test/glass_box_0204.off glass_box/test/glass_box_0205.off glass_box/test/glass_box_0206.off glass_box/test/glass_box_0207.off glass_box/test/glass_box_0208.off glass_box/test/glass_box_0209.off glass_box/test/glass_box_0210.off glass_box/test/glass_box_0211.off glass_box/test/glass_box_0212.off glass_box/test/glass_box_0213.off glass_box/test/glass_box_0214.off glass_box/test/glass_box_0215.off glass_box/test/glass_box_0216.off glass_box/test/glass_box_0217.off glass_box/test/glass_box_0218.off glass_box/test/glass_box_0219.off glass_box/test/glass_box_0220.off glass_box/test/glass_box_0221.off glass_box/test/glass_box_0222.off glass_box/test/glass_box_0223.off glass_box/test/glass_box_0224.off glass_box/test/glass_box_0225.off glass_box/test/glass_box_0226.off glass_box/test/glass_box_0227.off glass_box/test/glass_box_0228.off glass_box/test/glass_box_0229.off glass_box/test/glass_box_0230.off glass_box/test/glass_box_0231.off glass_box/test/glass_box_0232.off glass_box/test/glass_box_0233.off glass_box/test/glass_box_0234.off glass_box/test/glass_box_0235.off glass_box/test/glass_box_0236.off glass_box/test/glass_box_0237.off glass_box/test/glass_box_0238.off glass_box/test/glass_box_0239.off glass_box/test/glass_box_0240.off glass_box/test/glass_box_0241.off glass_box/test/glass_box_0242.off glass_box/test/glass_box_0243.off glass_box/test/glass_box_0244.off glass_box/test/glass_box_0245.off glass_box/test/glass_box_0246.off glass_box/test/glass_box_0247.off glass_box/test/glass_box_0248.off glass_box/test/glass_box_0249.off glass_box/test/glass_box_0250.off glass_box/test/glass_box_0251.off glass_box/test/glass_box_0252.off glass_box/test/glass_box_0253.off glass_box/test/glass_box_0254.off glass_box/test/glass_box_0255.off glass_box/test/glass_box_0256.off glass_box/test/glass_box_0257.off glass_box/test/glass_box_0258.off glass_box/test/glass_box_0259.off glass_box/test/glass_box_0260.off glass_box/test/glass_box_0261.off glass_box/test/glass_box_0262.off glass_box/test/glass_box_0263.off glass_box/test/glass_box_0264.off glass_box/test/glass_box_0265.off glass_box/test/glass_box_0266.off glass_box/test/glass_box_0267.off glass_box/test/glass_box_0268.off glass_box/test/glass_box_0269.off glass_box/test/glass_box_0270.off glass_box/test/glass_box_0271.off laptop/test/laptop_0150.off laptop/test/laptop_0151.off laptop/test/laptop_0152.off laptop/test/laptop_0153.off laptop/test/laptop_0154.off laptop/test/laptop_0155.off laptop/test/laptop_0156.off laptop/test/laptop_0157.off laptop/test/laptop_0158.off laptop/test/laptop_0159.off laptop/test/laptop_0160.off laptop/test/laptop_0161.off laptop/test/laptop_0162.off laptop/test/laptop_0163.off laptop/test/laptop_0164.off laptop/test/laptop_0165.off laptop/test/laptop_0166.off laptop/test/laptop_0167.off laptop/test/laptop_0168.off laptop/test/laptop_0169.off sink/test/sink_0129.off sink/test/sink_0130.off sink/test/sink_0131.off sink/test/sink_0132.off sink/test/sink_0133.off sink/test/sink_0134.off sink/test/sink_0135.off sink/test/sink_0136.off sink/test/sink_0137.off sink/test/sink_0138.off sink/test/sink_0139.off sink/test/sink_0140.off sink/test/sink_0141.off sink/test/sink_0142.off sink/test/sink_0143.off sink/test/sink_0144.off sink/test/sink_0145.off sink/test/sink_0146.off sink/test/sink_0147.off sink/test/sink_0148.off night_stand/test/night_stand_0201.off night_stand/test/night_stand_0202.off night_stand/test/night_stand_0203.off night_stand/test/night_stand_0204.off night_stand/test/night_stand_0205.off night_stand/test/night_stand_0206.off night_stand/test/night_stand_0207.off night_stand/test/night_stand_0208.off night_stand/test/night_stand_0209.off night_stand/test/night_stand_0210.off night_stand/test/night_stand_0211.off night_stand/test/night_stand_0212.off night_stand/test/night_stand_0213.off night_stand/test/night_stand_0214.off night_stand/test/night_stand_0215.off night_stand/test/night_stand_0216.off night_stand/test/night_stand_0217.off night_stand/test/night_stand_0218.off night_stand/test/night_stand_0219.off night_stand/test/night_stand_0220.off night_stand/test/night_stand_0221.off night_stand/test/night_stand_0222.off night_stand/test/night_stand_0223.off night_stand/test/night_stand_0224.off night_stand/test/night_stand_0225.off night_stand/test/night_stand_0226.off night_stand/test/night_stand_0227.off night_stand/test/night_stand_0228.off night_stand/test/night_stand_0229.off night_stand/test/night_stand_0230.off night_stand/test/night_stand_0231.off night_stand/test/night_stand_0232.off night_stand/test/night_stand_0233.off night_stand/test/night_stand_0234.off night_stand/test/night_stand_0235.off night_stand/test/night_stand_0236.off night_stand/test/night_stand_0237.off night_stand/test/night_stand_0238.off night_stand/test/night_stand_0239.off night_stand/test/night_stand_0240.off night_stand/test/night_stand_0241.off night_stand/test/night_stand_0242.off night_stand/test/night_stand_0243.off night_stand/test/night_stand_0244.off night_stand/test/night_stand_0245.off night_stand/test/night_stand_0246.off night_stand/test/night_stand_0247.off night_stand/test/night_stand_0248.off night_stand/test/night_stand_0249.off night_stand/test/night_stand_0250.off night_stand/test/night_stand_0251.off night_stand/test/night_stand_0252.off night_stand/test/night_stand_0253.off night_stand/test/night_stand_0254.off night_stand/test/night_stand_0255.off night_stand/test/night_stand_0256.off night_stand/test/night_stand_0257.off night_stand/test/night_stand_0258.off night_stand/test/night_stand_0259.off night_stand/test/night_stand_0260.off night_stand/test/night_stand_0261.off night_stand/test/night_stand_0262.off night_stand/test/night_stand_0263.off night_stand/test/night_stand_0264.off night_stand/test/night_stand_0265.off night_stand/test/night_stand_0266.off night_stand/test/night_stand_0267.off night_stand/test/night_stand_0268.off night_stand/test/night_stand_0269.off night_stand/test/night_stand_0270.off night_stand/test/night_stand_0271.off night_stand/test/night_stand_0272.off night_stand/test/night_stand_0273.off night_stand/test/night_stand_0274.off night_stand/test/night_stand_0275.off night_stand/test/night_stand_0276.off night_stand/test/night_stand_0277.off night_stand/test/night_stand_0278.off night_stand/test/night_stand_0279.off night_stand/test/night_stand_0280.off night_stand/test/night_stand_0281.off night_stand/test/night_stand_0282.off night_stand/test/night_stand_0283.off night_stand/test/night_stand_0284.off night_stand/test/night_stand_0285.off night_stand/test/night_stand_0286.off car/test/car_0198.off car/test/car_0199.off car/test/car_0200.off car/test/car_0201.off car/test/car_0202.off car/test/car_0203.off car/test/car_0204.off car/test/car_0205.off car/test/car_0206.off car/test/car_0207.off car/test/car_0208.off car/test/car_0209.off car/test/car_0210.off car/test/car_0211.off car/test/car_0212.off car/test/car_0213.off car/test/car_0214.off car/test/car_0215.off car/test/car_0216.off car/test/car_0217.off car/test/car_0218.off car/test/car_0219.off car/test/car_0220.off car/test/car_0221.off car/test/car_0222.off car/test/car_0223.off car/test/car_0224.off car/test/car_0225.off car/test/car_0226.off car/test/car_0227.off car/test/car_0228.off car/test/car_0229.off car/test/car_0230.off car/test/car_0231.off car/test/car_0232.off car/test/car_0233.off car/test/car_0234.off car/test/car_0235.off car/test/car_0236.off car/test/car_0237.off car/test/car_0238.off car/test/car_0239.off car/test/car_0240.off car/test/car_0241.off car/test/car_0242.off car/test/car_0243.off car/test/car_0244.off car/test/car_0245.off car/test/car_0246.off car/test/car_0247.off car/test/car_0248.off car/test/car_0249.off car/test/car_0250.off car/test/car_0251.off car/test/car_0252.off car/test/car_0253.off car/test/car_0254.off car/test/car_0255.off car/test/car_0256.off car/test/car_0257.off car/test/car_0258.off car/test/car_0259.off car/test/car_0260.off car/test/car_0261.off car/test/car_0262.off car/test/car_0263.off car/test/car_0264.off car/test/car_0265.off car/test/car_0266.off car/test/car_0267.off car/test/car_0268.off car/test/car_0269.off car/test/car_0270.off car/test/car_0271.off car/test/car_0272.off car/test/car_0273.off car/test/car_0274.off car/test/car_0275.off car/test/car_0276.off car/test/car_0277.off car/test/car_0278.off car/test/car_0279.off car/test/car_0280.off car/test/car_0281.off car/test/car_0282.off car/test/car_0283.off car/test/car_0284.off car/test/car_0285.off car/test/car_0286.off car/test/car_0287.off car/test/car_0288.off car/test/car_0289.off car/test/car_0290.off car/test/car_0291.off car/test/car_0292.off car/test/car_0293.off car/test/car_0294.off car/test/car_0295.off car/test/car_0296.off car/test/car_0297.off dresser/test/dresser_0201.off dresser/test/dresser_0202.off dresser/test/dresser_0203.off dresser/test/dresser_0204.off dresser/test/dresser_0205.off dresser/test/dresser_0206.off dresser/test/dresser_0207.off dresser/test/dresser_0208.off dresser/test/dresser_0209.off dresser/test/dresser_0210.off dresser/test/dresser_0211.off dresser/test/dresser_0212.off dresser/test/dresser_0213.off dresser/test/dresser_0214.off dresser/test/dresser_0215.off dresser/test/dresser_0216.off dresser/test/dresser_0217.off dresser/test/dresser_0218.off dresser/test/dresser_0219.off dresser/test/dresser_0220.off dresser/test/dresser_0221.off dresser/test/dresser_0222.off dresser/test/dresser_0223.off dresser/test/dresser_0224.off dresser/test/dresser_0225.off dresser/test/dresser_0226.off dresser/test/dresser_0227.off dresser/test/dresser_0228.off dresser/test/dresser_0229.off dresser/test/dresser_0230.off dresser/test/dresser_0231.off dresser/test/dresser_0232.off dresser/test/dresser_0233.off dresser/test/dresser_0234.off dresser/test/dresser_0235.off dresser/test/dresser_0236.off dresser/test/dresser_0237.off dresser/test/dresser_0238.off dresser/test/dresser_0239.off dresser/test/dresser_0240.off dresser/test/dresser_0241.off dresser/test/dresser_0242.off dresser/test/dresser_0243.off dresser/test/dresser_0244.off dresser/test/dresser_0245.off dresser/test/dresser_0246.off dresser/test/dresser_0247.off dresser/test/dresser_0248.off dresser/test/dresser_0249.off dresser/test/dresser_0250.off dresser/test/dresser_0251.off dresser/test/dresser_0252.off dresser/test/dresser_0253.off dresser/test/dresser_0254.off dresser/test/dresser_0255.off dresser/test/dresser_0256.off dresser/test/dresser_0257.off dresser/test/dresser_0258.off dresser/test/dresser_0259.off dresser/test/dresser_0260.off dresser/test/dresser_0261.off dresser/test/dresser_0262.off dresser/test/dresser_0263.off dresser/test/dresser_0264.off dresser/test/dresser_0265.off dresser/test/dresser_0266.off dresser/test/dresser_0267.off dresser/test/dresser_0268.off dresser/test/dresser_0269.off dresser/test/dresser_0270.off dresser/test/dresser_0271.off dresser/test/dresser_0272.off dresser/test/dresser_0273.off dresser/test/dresser_0274.off dresser/test/dresser_0275.off dresser/test/dresser_0276.off dresser/test/dresser_0277.off dresser/test/dresser_0278.off dresser/test/dresser_0279.off dresser/test/dresser_0280.off dresser/test/dresser_0281.off dresser/test/dresser_0282.off dresser/test/dresser_0283.off dresser/test/dresser_0284.off dresser/test/dresser_0285.off dresser/test/dresser_0286.off toilet/test/toilet_0345.off toilet/test/toilet_0346.off toilet/test/toilet_0347.off toilet/test/toilet_0348.off toilet/test/toilet_0349.off toilet/test/toilet_0350.off toilet/test/toilet_0351.off toilet/test/toilet_0352.off toilet/test/toilet_0353.off toilet/test/toilet_0354.off toilet/test/toilet_0355.off toilet/test/toilet_0356.off toilet/test/toilet_0357.off toilet/test/toilet_0358.off toilet/test/toilet_0359.off toilet/test/toilet_0360.off toilet/test/toilet_0361.off toilet/test/toilet_0362.off toilet/test/toilet_0363.off toilet/test/toilet_0364.off toilet/test/toilet_0365.off toilet/test/toilet_0366.off toilet/test/toilet_0367.off toilet/test/toilet_0368.off toilet/test/toilet_0369.off toilet/test/toilet_0370.off toilet/test/toilet_0371.off toilet/test/toilet_0372.off toilet/test/toilet_0373.off toilet/test/toilet_0374.off toilet/test/toilet_0375.off toilet/test/toilet_0376.off toilet/test/toilet_0377.off toilet/test/toilet_0378.off toilet/test/toilet_0379.off toilet/test/toilet_0380.off toilet/test/toilet_0381.off toilet/test/toilet_0382.off toilet/test/toilet_0383.off toilet/test/toilet_0384.off toilet/test/toilet_0385.off toilet/test/toilet_0386.off toilet/test/toilet_0387.off toilet/test/toilet_0388.off toilet/test/toilet_0389.off toilet/test/toilet_0390.off toilet/test/toilet_0391.off toilet/test/toilet_0392.off toilet/test/toilet_0393.off toilet/test/toilet_0394.off toilet/test/toilet_0395.off toilet/test/toilet_0396.off toilet/test/toilet_0397.off toilet/test/toilet_0398.off toilet/test/toilet_0399.off toilet/test/toilet_0400.off toilet/test/toilet_0401.off toilet/test/toilet_0402.off toilet/test/toilet_0403.off toilet/test/toilet_0404.off toilet/test/toilet_0405.off toilet/test/toilet_0406.off toilet/test/toilet_0407.off toilet/test/toilet_0408.off toilet/test/toilet_0409.off toilet/test/toilet_0410.off toilet/test/toilet_0411.off toilet/test/toilet_0412.off toilet/test/toilet_0413.off toilet/test/toilet_0414.off toilet/test/toilet_0415.off toilet/test/toilet_0416.off toilet/test/toilet_0417.off toilet/test/toilet_0418.off toilet/test/toilet_0419.off toilet/test/toilet_0420.off toilet/test/toilet_0421.off toilet/test/toilet_0422.off toilet/test/toilet_0423.off toilet/test/toilet_0424.off toilet/test/toilet_0425.off toilet/test/toilet_0426.off toilet/test/toilet_0427.off toilet/test/toilet_0428.off toilet/test/toilet_0429.off toilet/test/toilet_0430.off toilet/test/toilet_0431.off toilet/test/toilet_0432.off toilet/test/toilet_0433.off toilet/test/toilet_0434.off toilet/test/toilet_0435.off toilet/test/toilet_0436.off toilet/test/toilet_0437.off toilet/test/toilet_0438.off toilet/test/toilet_0439.off toilet/test/toilet_0440.off toilet/test/toilet_0441.off toilet/test/toilet_0442.off toilet/test/toilet_0443.off toilet/test/toilet_0444.off curtain/test/curtain_0139.off curtain/test/curtain_0140.off curtain/test/curtain_0141.off curtain/test/curtain_0142.off curtain/test/curtain_0143.off curtain/test/curtain_0144.off curtain/test/curtain_0145.off curtain/test/curtain_0146.off curtain/test/curtain_0147.off curtain/test/curtain_0148.off curtain/test/curtain_0149.off curtain/test/curtain_0150.off curtain/test/curtain_0151.off curtain/test/curtain_0152.off curtain/test/curtain_0153.off curtain/test/curtain_0154.off curtain/test/curtain_0155.off curtain/test/curtain_0156.off curtain/test/curtain_0157.off curtain/test/curtain_0158.off wardrobe/test/wardrobe_0088.off wardrobe/test/wardrobe_0089.off wardrobe/test/wardrobe_0090.off wardrobe/test/wardrobe_0091.off wardrobe/test/wardrobe_0092.off wardrobe/test/wardrobe_0093.off wardrobe/test/wardrobe_0094.off wardrobe/test/wardrobe_0095.off wardrobe/test/wardrobe_0096.off wardrobe/test/wardrobe_0097.off wardrobe/test/wardrobe_0098.off wardrobe/test/wardrobe_0099.off wardrobe/test/wardrobe_0100.off wardrobe/test/wardrobe_0101.off wardrobe/test/wardrobe_0102.off wardrobe/test/wardrobe_0103.off wardrobe/test/wardrobe_0104.off wardrobe/test/wardrobe_0105.off wardrobe/test/wardrobe_0106.off wardrobe/test/wardrobe_0107.off stool/test/stool_0091.off stool/test/stool_0092.off stool/test/stool_0093.off stool/test/stool_0094.off stool/test/stool_0095.off stool/test/stool_0096.off stool/test/stool_0097.off stool/test/stool_0098.off stool/test/stool_0099.off stool/test/stool_0100.off stool/test/stool_0101.off stool/test/stool_0102.off stool/test/stool_0103.off stool/test/stool_0104.off stool/test/stool_0105.off stool/test/stool_0106.off stool/test/stool_0107.off stool/test/stool_0108.off stool/test/stool_0109.off stool/test/stool_0110.off mantel/test/mantel_0285.off mantel/test/mantel_0286.off mantel/test/mantel_0287.off mantel/test/mantel_0288.off mantel/test/mantel_0289.off mantel/test/mantel_0290.off mantel/test/mantel_0291.off mantel/test/mantel_0292.off mantel/test/mantel_0293.off mantel/test/mantel_0294.off mantel/test/mantel_0295.off mantel/test/mantel_0296.off mantel/test/mantel_0297.off mantel/test/mantel_0298.off mantel/test/mantel_0299.off mantel/test/mantel_0300.off mantel/test/mantel_0301.off mantel/test/mantel_0302.off mantel/test/mantel_0303.off mantel/test/mantel_0304.off mantel/test/mantel_0305.off mantel/test/mantel_0306.off mantel/test/mantel_0307.off mantel/test/mantel_0308.off mantel/test/mantel_0309.off mantel/test/mantel_0310.off mantel/test/mantel_0311.off mantel/test/mantel_0312.off mantel/test/mantel_0313.off mantel/test/mantel_0314.off mantel/test/mantel_0315.off mantel/test/mantel_0316.off mantel/test/mantel_0317.off mantel/test/mantel_0318.off mantel/test/mantel_0319.off mantel/test/mantel_0320.off mantel/test/mantel_0321.off mantel/test/mantel_0322.off mantel/test/mantel_0323.off mantel/test/mantel_0324.off mantel/test/mantel_0325.off mantel/test/mantel_0326.off mantel/test/mantel_0327.off mantel/test/mantel_0328.off mantel/test/mantel_0329.off mantel/test/mantel_0330.off mantel/test/mantel_0331.off mantel/test/mantel_0332.off mantel/test/mantel_0333.off mantel/test/mantel_0334.off mantel/test/mantel_0335.off mantel/test/mantel_0336.off mantel/test/mantel_0337.off mantel/test/mantel_0338.off mantel/test/mantel_0339.off mantel/test/mantel_0340.off mantel/test/mantel_0341.off mantel/test/mantel_0342.off mantel/test/mantel_0343.off mantel/test/mantel_0344.off mantel/test/mantel_0345.off mantel/test/mantel_0346.off mantel/test/mantel_0347.off mantel/test/mantel_0348.off mantel/test/mantel_0349.off mantel/test/mantel_0350.off mantel/test/mantel_0351.off mantel/test/mantel_0352.off mantel/test/mantel_0353.off mantel/test/mantel_0354.off mantel/test/mantel_0355.off mantel/test/mantel_0356.off mantel/test/mantel_0357.off mantel/test/mantel_0358.off mantel/test/mantel_0359.off mantel/test/mantel_0360.off mantel/test/mantel_0361.off mantel/test/mantel_0362.off mantel/test/mantel_0363.off mantel/test/mantel_0364.off mantel/test/mantel_0365.off mantel/test/mantel_0366.off mantel/test/mantel_0367.off mantel/test/mantel_0368.off mantel/test/mantel_0369.off mantel/test/mantel_0370.off mantel/test/mantel_0371.off mantel/test/mantel_0372.off mantel/test/mantel_0373.off mantel/test/mantel_0374.off mantel/test/mantel_0375.off mantel/test/mantel_0376.off mantel/test/mantel_0377.off mantel/test/mantel_0378.off mantel/test/mantel_0379.off mantel/test/mantel_0380.off mantel/test/mantel_0381.off mantel/test/mantel_0382.off mantel/test/mantel_0383.off mantel/test/mantel_0384.off cup/test/cup_0080.off cup/test/cup_0081.off cup/test/cup_0082.off cup/test/cup_0083.off cup/test/cup_0084.off cup/test/cup_0085.off cup/test/cup_0086.off cup/test/cup_0087.off cup/test/cup_0088.off cup/test/cup_0089.off cup/test/cup_0090.off cup/test/cup_0091.off cup/test/cup_0092.off cup/test/cup_0093.off cup/test/cup_0094.off cup/test/cup_0095.off cup/test/cup_0096.off cup/test/cup_0097.off cup/test/cup_0098.off cup/test/cup_0099.off radio/test/radio_0105.off radio/test/radio_0106.off radio/test/radio_0107.off radio/test/radio_0108.off radio/test/radio_0109.off radio/test/radio_0110.off radio/test/radio_0111.off radio/test/radio_0112.off radio/test/radio_0113.off radio/test/radio_0114.off radio/test/radio_0115.off radio/test/radio_0116.off radio/test/radio_0117.off radio/test/radio_0118.off radio/test/radio_0119.off radio/test/radio_0120.off radio/test/radio_0121.off radio/test/radio_0122.off radio/test/radio_0123.off radio/test/radio_0124.off airplane/test/airplane_0627.off airplane/test/airplane_0628.off airplane/test/airplane_0629.off airplane/test/airplane_0630.off airplane/test/airplane_0631.off airplane/test/airplane_0632.off airplane/test/airplane_0633.off airplane/test/airplane_0634.off airplane/test/airplane_0635.off airplane/test/airplane_0636.off airplane/test/airplane_0637.off airplane/test/airplane_0638.off airplane/test/airplane_0639.off airplane/test/airplane_0640.off airplane/test/airplane_0641.off airplane/test/airplane_0642.off airplane/test/airplane_0643.off airplane/test/airplane_0644.off airplane/test/airplane_0645.off airplane/test/airplane_0646.off airplane/test/airplane_0647.off airplane/test/airplane_0648.off airplane/test/airplane_0649.off airplane/test/airplane_0650.off airplane/test/airplane_0651.off airplane/test/airplane_0652.off airplane/test/airplane_0653.off airplane/test/airplane_0654.off airplane/test/airplane_0655.off airplane/test/airplane_0656.off airplane/test/airplane_0657.off airplane/test/airplane_0658.off airplane/test/airplane_0659.off airplane/test/airplane_0660.off airplane/test/airplane_0661.off airplane/test/airplane_0662.off airplane/test/airplane_0663.off airplane/test/airplane_0664.off airplane/test/airplane_0665.off airplane/test/airplane_0666.off airplane/test/airplane_0667.off airplane/test/airplane_0668.off airplane/test/airplane_0669.off airplane/test/airplane_0670.off airplane/test/airplane_0671.off airplane/test/airplane_0672.off airplane/test/airplane_0673.off airplane/test/airplane_0674.off airplane/test/airplane_0675.off airplane/test/airplane_0676.off airplane/test/airplane_0677.off airplane/test/airplane_0678.off airplane/test/airplane_0679.off airplane/test/airplane_0680.off airplane/test/airplane_0681.off airplane/test/airplane_0682.off airplane/test/airplane_0683.off airplane/test/airplane_0684.off airplane/test/airplane_0685.off airplane/test/airplane_0686.off airplane/test/airplane_0687.off airplane/test/airplane_0688.off airplane/test/airplane_0689.off airplane/test/airplane_0690.off airplane/test/airplane_0691.off airplane/test/airplane_0692.off airplane/test/airplane_0693.off airplane/test/airplane_0694.off airplane/test/airplane_0695.off airplane/test/airplane_0696.off airplane/test/airplane_0697.off airplane/test/airplane_0698.off airplane/test/airplane_0699.off airplane/test/airplane_0700.off airplane/test/airplane_0701.off airplane/test/airplane_0702.off airplane/test/airplane_0703.off airplane/test/airplane_0704.off airplane/test/airplane_0705.off airplane/test/airplane_0706.off airplane/test/airplane_0707.off airplane/test/airplane_0708.off airplane/test/airplane_0709.off airplane/test/airplane_0710.off airplane/test/airplane_0711.off airplane/test/airplane_0712.off airplane/test/airplane_0713.off airplane/test/airplane_0714.off airplane/test/airplane_0715.off airplane/test/airplane_0716.off airplane/test/airplane_0717.off airplane/test/airplane_0718.off airplane/test/airplane_0719.off airplane/test/airplane_0720.off airplane/test/airplane_0721.off airplane/test/airplane_0722.off airplane/test/airplane_0723.off airplane/test/airplane_0724.off airplane/test/airplane_0725.off airplane/test/airplane_0726.off table/test/table_0393.off table/test/table_0394.off table/test/table_0395.off table/test/table_0396.off table/test/table_0397.off table/test/table_0398.off table/test/table_0399.off table/test/table_0400.off table/test/table_0401.off table/test/table_0402.off table/test/table_0403.off table/test/table_0404.off table/test/table_0405.off table/test/table_0406.off table/test/table_0407.off table/test/table_0408.off table/test/table_0409.off table/test/table_0410.off table/test/table_0411.off table/test/table_0412.off table/test/table_0413.off table/test/table_0414.off table/test/table_0415.off table/test/table_0416.off table/test/table_0417.off table/test/table_0418.off table/test/table_0419.off table/test/table_0420.off table/test/table_0421.off table/test/table_0422.off table/test/table_0423.off table/test/table_0424.off table/test/table_0425.off table/test/table_0426.off table/test/table_0427.off table/test/table_0428.off table/test/table_0429.off table/test/table_0430.off table/test/table_0431.off table/test/table_0432.off table/test/table_0433.off table/test/table_0434.off table/test/table_0435.off table/test/table_0436.off table/test/table_0437.off table/test/table_0438.off table/test/table_0439.off table/test/table_0440.off table/test/table_0441.off table/test/table_0442.off table/test/table_0443.off table/test/table_0444.off table/test/table_0445.off table/test/table_0446.off table/test/table_0447.off table/test/table_0448.off table/test/table_0449.off table/test/table_0450.off table/test/table_0451.off table/test/table_0452.off table/test/table_0453.off table/test/table_0454.off table/test/table_0455.off table/test/table_0456.off table/test/table_0457.off table/test/table_0458.off table/test/table_0459.off table/test/table_0460.off table/test/table_0461.off table/test/table_0462.off table/test/table_0463.off table/test/table_0464.off table/test/table_0465.off table/test/table_0466.off table/test/table_0467.off table/test/table_0468.off table/test/table_0469.off table/test/table_0470.off table/test/table_0471.off table/test/table_0472.off table/test/table_0473.off table/test/table_0474.off table/test/table_0475.off table/test/table_0476.off table/test/table_0477.off table/test/table_0478.off table/test/table_0479.off table/test/table_0480.off table/test/table_0481.off table/test/table_0482.off table/test/table_0483.off table/test/table_0484.off table/test/table_0485.off table/test/table_0486.off table/test/table_0487.off table/test/table_0488.off table/test/table_0489.off table/test/table_0490.off table/test/table_0491.off table/test/table_0492.off bench/test/bench_0174.off bench/test/bench_0175.off bench/test/bench_0176.off bench/test/bench_0177.off bench/test/bench_0178.off bench/test/bench_0179.off bench/test/bench_0180.off bench/test/bench_0181.off bench/test/bench_0182.off bench/test/bench_0183.off bench/test/bench_0184.off bench/test/bench_0185.off bench/test/bench_0186.off bench/test/bench_0187.off bench/test/bench_0188.off bench/test/bench_0189.off bench/test/bench_0190.off bench/test/bench_0191.off bench/test/bench_0192.off bench/test/bench_0193.off plant/test/plant_0241.off plant/test/plant_0242.off plant/test/plant_0243.off plant/test/plant_0244.off plant/test/plant_0245.off plant/test/plant_0246.off plant/test/plant_0247.off plant/test/plant_0248.off plant/test/plant_0249.off plant/test/plant_0250.off plant/test/plant_0251.off plant/test/plant_0252.off plant/test/plant_0253.off plant/test/plant_0254.off plant/test/plant_0255.off plant/test/plant_0256.off plant/test/plant_0257.off plant/test/plant_0258.off plant/test/plant_0259.off plant/test/plant_0260.off plant/test/plant_0261.off plant/test/plant_0262.off plant/test/plant_0263.off plant/test/plant_0264.off plant/test/plant_0265.off plant/test/plant_0266.off plant/test/plant_0267.off plant/test/plant_0268.off plant/test/plant_0269.off plant/test/plant_0270.off plant/test/plant_0271.off plant/test/plant_0272.off plant/test/plant_0273.off plant/test/plant_0274.off plant/test/plant_0275.off plant/test/plant_0276.off plant/test/plant_0277.off plant/test/plant_0278.off plant/test/plant_0279.off plant/test/plant_0280.off plant/test/plant_0281.off plant/test/plant_0282.off plant/test/plant_0283.off plant/test/plant_0284.off plant/test/plant_0285.off plant/test/plant_0286.off plant/test/plant_0287.off plant/test/plant_0288.off plant/test/plant_0289.off plant/test/plant_0290.off plant/test/plant_0291.off plant/test/plant_0292.off plant/test/plant_0293.off plant/test/plant_0294.off plant/test/plant_0295.off plant/test/plant_0296.off plant/test/plant_0297.off plant/test/plant_0298.off plant/test/plant_0299.off plant/test/plant_0300.off plant/test/plant_0301.off plant/test/plant_0302.off plant/test/plant_0303.off plant/test/plant_0304.off plant/test/plant_0305.off plant/test/plant_0306.off plant/test/plant_0307.off plant/test/plant_0308.off plant/test/plant_0309.off plant/test/plant_0310.off plant/test/plant_0311.off plant/test/plant_0312.off plant/test/plant_0313.off plant/test/plant_0314.off plant/test/plant_0315.off plant/test/plant_0316.off plant/test/plant_0317.off plant/test/plant_0318.off plant/test/plant_0319.off plant/test/plant_0320.off plant/test/plant_0321.off plant/test/plant_0322.off plant/test/plant_0323.off plant/test/plant_0324.off plant/test/plant_0325.off plant/test/plant_0326.off plant/test/plant_0327.off plant/test/plant_0328.off plant/test/plant_0329.off plant/test/plant_0330.off plant/test/plant_0331.off plant/test/plant_0332.off plant/test/plant_0333.off plant/test/plant_0334.off plant/test/plant_0335.off plant/test/plant_0336.off plant/test/plant_0337.off plant/test/plant_0338.off plant/test/plant_0339.off plant/test/plant_0340.off chair/test/chair_0890.off chair/test/chair_0891.off chair/test/chair_0892.off chair/test/chair_0893.off chair/test/chair_0894.off chair/test/chair_0895.off chair/test/chair_0896.off chair/test/chair_0897.off chair/test/chair_0898.off chair/test/chair_0899.off chair/test/chair_0900.off chair/test/chair_0901.off chair/test/chair_0902.off chair/test/chair_0903.off chair/test/chair_0904.off chair/test/chair_0905.off chair/test/chair_0906.off chair/test/chair_0907.off chair/test/chair_0908.off chair/test/chair_0909.off chair/test/chair_0910.off chair/test/chair_0911.off chair/test/chair_0912.off chair/test/chair_0913.off chair/test/chair_0914.off chair/test/chair_0915.off chair/test/chair_0916.off chair/test/chair_0917.off chair/test/chair_0918.off chair/test/chair_0919.off chair/test/chair_0920.off chair/test/chair_0921.off chair/test/chair_0922.off chair/test/chair_0923.off chair/test/chair_0924.off chair/test/chair_0925.off chair/test/chair_0926.off chair/test/chair_0927.off chair/test/chair_0928.off chair/test/chair_0929.off chair/test/chair_0930.off chair/test/chair_0931.off chair/test/chair_0932.off chair/test/chair_0933.off chair/test/chair_0934.off chair/test/chair_0935.off chair/test/chair_0936.off chair/test/chair_0937.off chair/test/chair_0938.off chair/test/chair_0939.off chair/test/chair_0940.off chair/test/chair_0941.off chair/test/chair_0942.off chair/test/chair_0943.off chair/test/chair_0944.off chair/test/chair_0945.off chair/test/chair_0946.off chair/test/chair_0947.off chair/test/chair_0948.off chair/test/chair_0949.off chair/test/chair_0950.off chair/test/chair_0951.off chair/test/chair_0952.off chair/test/chair_0953.off chair/test/chair_0954.off chair/test/chair_0955.off chair/test/chair_0956.off chair/test/chair_0957.off chair/test/chair_0958.off chair/test/chair_0959.off chair/test/chair_0960.off chair/test/chair_0961.off chair/test/chair_0962.off chair/test/chair_0963.off chair/test/chair_0964.off chair/test/chair_0965.off chair/test/chair_0966.off chair/test/chair_0967.off chair/test/chair_0968.off chair/test/chair_0969.off chair/test/chair_0970.off chair/test/chair_0971.off chair/test/chair_0972.off chair/test/chair_0973.off chair/test/chair_0974.off chair/test/chair_0975.off chair/test/chair_0976.off chair/test/chair_0977.off chair/test/chair_0978.off chair/test/chair_0979.off chair/test/chair_0980.off chair/test/chair_0981.off chair/test/chair_0982.off chair/test/chair_0983.off chair/test/chair_0984.off chair/test/chair_0985.off chair/test/chair_0986.off chair/test/chair_0987.off chair/test/chair_0988.off chair/test/chair_0989.off vase/test/vase_0476.off vase/test/vase_0477.off vase/test/vase_0478.off vase/test/vase_0479.off vase/test/vase_0480.off vase/test/vase_0481.off vase/test/vase_0482.off vase/test/vase_0483.off vase/test/vase_0484.off vase/test/vase_0485.off vase/test/vase_0486.off vase/test/vase_0487.off vase/test/vase_0488.off vase/test/vase_0489.off vase/test/vase_0490.off vase/test/vase_0491.off vase/test/vase_0492.off vase/test/vase_0493.off vase/test/vase_0494.off vase/test/vase_0495.off vase/test/vase_0496.off vase/test/vase_0497.off vase/test/vase_0498.off vase/test/vase_0499.off vase/test/vase_0500.off vase/test/vase_0501.off vase/test/vase_0502.off vase/test/vase_0503.off vase/test/vase_0504.off vase/test/vase_0505.off vase/test/vase_0506.off vase/test/vase_0507.off vase/test/vase_0508.off vase/test/vase_0509.off vase/test/vase_0510.off vase/test/vase_0511.off vase/test/vase_0512.off vase/test/vase_0513.off vase/test/vase_0514.off vase/test/vase_0515.off vase/test/vase_0516.off vase/test/vase_0517.off vase/test/vase_0518.off vase/test/vase_0519.off vase/test/vase_0520.off vase/test/vase_0521.off vase/test/vase_0522.off vase/test/vase_0523.off vase/test/vase_0524.off vase/test/vase_0525.off vase/test/vase_0526.off vase/test/vase_0527.off vase/test/vase_0528.off vase/test/vase_0529.off vase/test/vase_0530.off vase/test/vase_0531.off vase/test/vase_0532.off vase/test/vase_0533.off vase/test/vase_0534.off vase/test/vase_0535.off vase/test/vase_0536.off vase/test/vase_0537.off vase/test/vase_0538.off vase/test/vase_0539.off vase/test/vase_0540.off vase/test/vase_0541.off vase/test/vase_0542.off vase/test/vase_0543.off vase/test/vase_0544.off vase/test/vase_0545.off vase/test/vase_0546.off vase/test/vase_0547.off vase/test/vase_0548.off vase/test/vase_0549.off vase/test/vase_0550.off vase/test/vase_0551.off vase/test/vase_0552.off vase/test/vase_0553.off vase/test/vase_0554.off vase/test/vase_0555.off vase/test/vase_0556.off vase/test/vase_0557.off vase/test/vase_0558.off vase/test/vase_0559.off vase/test/vase_0560.off vase/test/vase_0561.off vase/test/vase_0562.off vase/test/vase_0563.off vase/test/vase_0564.off vase/test/vase_0565.off vase/test/vase_0566.off vase/test/vase_0567.off vase/test/vase_0568.off vase/test/vase_0569.off vase/test/vase_0570.off vase/test/vase_0571.off vase/test/vase_0572.off vase/test/vase_0573.off vase/test/vase_0574.off vase/test/vase_0575.off bookshelf/test/bookshelf_0573.off bookshelf/test/bookshelf_0574.off bookshelf/test/bookshelf_0575.off bookshelf/test/bookshelf_0576.off bookshelf/test/bookshelf_0577.off bookshelf/test/bookshelf_0578.off bookshelf/test/bookshelf_0579.off bookshelf/test/bookshelf_0580.off bookshelf/test/bookshelf_0581.off bookshelf/test/bookshelf_0582.off bookshelf/test/bookshelf_0583.off bookshelf/test/bookshelf_0584.off bookshelf/test/bookshelf_0585.off bookshelf/test/bookshelf_0586.off bookshelf/test/bookshelf_0587.off bookshelf/test/bookshelf_0588.off bookshelf/test/bookshelf_0589.off bookshelf/test/bookshelf_0590.off bookshelf/test/bookshelf_0591.off bookshelf/test/bookshelf_0592.off bookshelf/test/bookshelf_0593.off bookshelf/test/bookshelf_0594.off bookshelf/test/bookshelf_0595.off bookshelf/test/bookshelf_0596.off bookshelf/test/bookshelf_0597.off bookshelf/test/bookshelf_0598.off bookshelf/test/bookshelf_0599.off bookshelf/test/bookshelf_0600.off bookshelf/test/bookshelf_0601.off bookshelf/test/bookshelf_0602.off bookshelf/test/bookshelf_0603.off bookshelf/test/bookshelf_0604.off bookshelf/test/bookshelf_0605.off bookshelf/test/bookshelf_0606.off bookshelf/test/bookshelf_0607.off bookshelf/test/bookshelf_0608.off bookshelf/test/bookshelf_0609.off bookshelf/test/bookshelf_0610.off bookshelf/test/bookshelf_0611.off bookshelf/test/bookshelf_0612.off bookshelf/test/bookshelf_0613.off bookshelf/test/bookshelf_0614.off bookshelf/test/bookshelf_0615.off bookshelf/test/bookshelf_0616.off bookshelf/test/bookshelf_0617.off bookshelf/test/bookshelf_0618.off bookshelf/test/bookshelf_0619.off bookshelf/test/bookshelf_0620.off bookshelf/test/bookshelf_0621.off bookshelf/test/bookshelf_0622.off bookshelf/test/bookshelf_0623.off bookshelf/test/bookshelf_0624.off bookshelf/test/bookshelf_0625.off bookshelf/test/bookshelf_0626.off bookshelf/test/bookshelf_0627.off bookshelf/test/bookshelf_0628.off bookshelf/test/bookshelf_0629.off bookshelf/test/bookshelf_0630.off bookshelf/test/bookshelf_0631.off bookshelf/test/bookshelf_0632.off bookshelf/test/bookshelf_0633.off bookshelf/test/bookshelf_0634.off bookshelf/test/bookshelf_0635.off bookshelf/test/bookshelf_0636.off bookshelf/test/bookshelf_0637.off bookshelf/test/bookshelf_0638.off bookshelf/test/bookshelf_0639.off bookshelf/test/bookshelf_0640.off bookshelf/test/bookshelf_0641.off bookshelf/test/bookshelf_0642.off bookshelf/test/bookshelf_0643.off bookshelf/test/bookshelf_0644.off bookshelf/test/bookshelf_0645.off bookshelf/test/bookshelf_0646.off bookshelf/test/bookshelf_0647.off bookshelf/test/bookshelf_0648.off bookshelf/test/bookshelf_0649.off bookshelf/test/bookshelf_0650.off bookshelf/test/bookshelf_0651.off bookshelf/test/bookshelf_0652.off bookshelf/test/bookshelf_0653.off bookshelf/test/bookshelf_0654.off bookshelf/test/bookshelf_0655.off bookshelf/test/bookshelf_0656.off bookshelf/test/bookshelf_0657.off bookshelf/test/bookshelf_0658.off bookshelf/test/bookshelf_0659.off bookshelf/test/bookshelf_0660.off bookshelf/test/bookshelf_0661.off bookshelf/test/bookshelf_0662.off bookshelf/test/bookshelf_0663.off bookshelf/test/bookshelf_0664.off bookshelf/test/bookshelf_0665.off bookshelf/test/bookshelf_0666.off bookshelf/test/bookshelf_0667.off bookshelf/test/bookshelf_0668.off bookshelf/test/bookshelf_0669.off bookshelf/test/bookshelf_0670.off bookshelf/test/bookshelf_0671.off bookshelf/test/bookshelf_0672.off guitar/test/guitar_0156.off guitar/test/guitar_0157.off guitar/test/guitar_0158.off guitar/test/guitar_0159.off guitar/test/guitar_0160.off guitar/test/guitar_0161.off guitar/test/guitar_0162.off guitar/test/guitar_0163.off guitar/test/guitar_0164.off guitar/test/guitar_0165.off guitar/test/guitar_0166.off guitar/test/guitar_0167.off guitar/test/guitar_0168.off guitar/test/guitar_0169.off guitar/test/guitar_0170.off guitar/test/guitar_0171.off guitar/test/guitar_0172.off guitar/test/guitar_0173.off guitar/test/guitar_0174.off guitar/test/guitar_0175.off guitar/test/guitar_0176.off guitar/test/guitar_0177.off guitar/test/guitar_0178.off guitar/test/guitar_0179.off guitar/test/guitar_0180.off guitar/test/guitar_0181.off guitar/test/guitar_0182.off guitar/test/guitar_0183.off guitar/test/guitar_0184.off guitar/test/guitar_0185.off guitar/test/guitar_0186.off guitar/test/guitar_0187.off guitar/test/guitar_0188.off guitar/test/guitar_0189.off guitar/test/guitar_0190.off guitar/test/guitar_0191.off guitar/test/guitar_0192.off guitar/test/guitar_0193.off guitar/test/guitar_0194.off guitar/test/guitar_0195.off guitar/test/guitar_0196.off guitar/test/guitar_0197.off guitar/test/guitar_0198.off guitar/test/guitar_0199.off guitar/test/guitar_0200.off guitar/test/guitar_0201.off guitar/test/guitar_0202.off guitar/test/guitar_0203.off guitar/test/guitar_0204.off guitar/test/guitar_0205.off guitar/test/guitar_0206.off guitar/test/guitar_0207.off guitar/test/guitar_0208.off guitar/test/guitar_0209.off guitar/test/guitar_0210.off guitar/test/guitar_0211.off guitar/test/guitar_0212.off guitar/test/guitar_0213.off guitar/test/guitar_0214.off guitar/test/guitar_0215.off guitar/test/guitar_0216.off guitar/test/guitar_0217.off guitar/test/guitar_0218.off guitar/test/guitar_0219.off guitar/test/guitar_0220.off guitar/test/guitar_0221.off guitar/test/guitar_0222.off guitar/test/guitar_0223.off guitar/test/guitar_0224.off guitar/test/guitar_0225.off guitar/test/guitar_0226.off guitar/test/guitar_0227.off guitar/test/guitar_0228.off guitar/test/guitar_0229.off guitar/test/guitar_0230.off guitar/test/guitar_0231.off guitar/test/guitar_0232.off guitar/test/guitar_0233.off guitar/test/guitar_0234.off guitar/test/guitar_0235.off guitar/test/guitar_0236.off guitar/test/guitar_0237.off guitar/test/guitar_0238.off guitar/test/guitar_0239.off guitar/test/guitar_0240.off guitar/test/guitar_0241.off guitar/test/guitar_0242.off guitar/test/guitar_0243.off guitar/test/guitar_0244.off guitar/test/guitar_0245.off guitar/test/guitar_0246.off guitar/test/guitar_0247.off guitar/test/guitar_0248.off guitar/test/guitar_0249.off guitar/test/guitar_0250.off guitar/test/guitar_0251.off guitar/test/guitar_0252.off guitar/test/guitar_0253.off guitar/test/guitar_0254.off guitar/test/guitar_0255.off tv_stand/test/tv_stand_0268.off tv_stand/test/tv_stand_0269.off tv_stand/test/tv_stand_0270.off tv_stand/test/tv_stand_0271.off tv_stand/test/tv_stand_0272.off tv_stand/test/tv_stand_0273.off tv_stand/test/tv_stand_0274.off tv_stand/test/tv_stand_0275.off tv_stand/test/tv_stand_0276.off tv_stand/test/tv_stand_0277.off tv_stand/test/tv_stand_0278.off tv_stand/test/tv_stand_0279.off tv_stand/test/tv_stand_0280.off tv_stand/test/tv_stand_0281.off tv_stand/test/tv_stand_0282.off tv_stand/test/tv_stand_0283.off tv_stand/test/tv_stand_0284.off tv_stand/test/tv_stand_0285.off tv_stand/test/tv_stand_0286.off tv_stand/test/tv_stand_0287.off tv_stand/test/tv_stand_0288.off tv_stand/test/tv_stand_0289.off tv_stand/test/tv_stand_0290.off tv_stand/test/tv_stand_0291.off tv_stand/test/tv_stand_0292.off tv_stand/test/tv_stand_0293.off tv_stand/test/tv_stand_0294.off tv_stand/test/tv_stand_0295.off tv_stand/test/tv_stand_0296.off tv_stand/test/tv_stand_0297.off tv_stand/test/tv_stand_0298.off tv_stand/test/tv_stand_0299.off tv_stand/test/tv_stand_0300.off tv_stand/test/tv_stand_0301.off tv_stand/test/tv_stand_0302.off tv_stand/test/tv_stand_0303.off tv_stand/test/tv_stand_0304.off tv_stand/test/tv_stand_0305.off tv_stand/test/tv_stand_0306.off tv_stand/test/tv_stand_0307.off tv_stand/test/tv_stand_0308.off tv_stand/test/tv_stand_0309.off tv_stand/test/tv_stand_0310.off tv_stand/test/tv_stand_0311.off tv_stand/test/tv_stand_0312.off tv_stand/test/tv_stand_0313.off tv_stand/test/tv_stand_0314.off tv_stand/test/tv_stand_0315.off tv_stand/test/tv_stand_0316.off tv_stand/test/tv_stand_0317.off tv_stand/test/tv_stand_0318.off tv_stand/test/tv_stand_0319.off tv_stand/test/tv_stand_0320.off tv_stand/test/tv_stand_0321.off tv_stand/test/tv_stand_0322.off tv_stand/test/tv_stand_0323.off tv_stand/test/tv_stand_0324.off tv_stand/test/tv_stand_0325.off tv_stand/test/tv_stand_0326.off tv_stand/test/tv_stand_0327.off tv_stand/test/tv_stand_0328.off tv_stand/test/tv_stand_0329.off tv_stand/test/tv_stand_0330.off tv_stand/test/tv_stand_0331.off tv_stand/test/tv_stand_0332.off tv_stand/test/tv_stand_0333.off tv_stand/test/tv_stand_0334.off tv_stand/test/tv_stand_0335.off tv_stand/test/tv_stand_0336.off tv_stand/test/tv_stand_0337.off tv_stand/test/tv_stand_0338.off tv_stand/test/tv_stand_0339.off tv_stand/test/tv_stand_0340.off tv_stand/test/tv_stand_0341.off tv_stand/test/tv_stand_0342.off tv_stand/test/tv_stand_0343.off tv_stand/test/tv_stand_0344.off tv_stand/test/tv_stand_0345.off tv_stand/test/tv_stand_0346.off tv_stand/test/tv_stand_0347.off tv_stand/test/tv_stand_0348.off tv_stand/test/tv_stand_0349.off tv_stand/test/tv_stand_0350.off tv_stand/test/tv_stand_0351.off tv_stand/test/tv_stand_0352.off tv_stand/test/tv_stand_0353.off tv_stand/test/tv_stand_0354.off tv_stand/test/tv_stand_0355.off tv_stand/test/tv_stand_0356.off tv_stand/test/tv_stand_0357.off tv_stand/test/tv_stand_0358.off tv_stand/test/tv_stand_0359.off tv_stand/test/tv_stand_0360.off tv_stand/test/tv_stand_0361.off tv_stand/test/tv_stand_0362.off tv_stand/test/tv_stand_0363.off tv_stand/test/tv_stand_0364.off tv_stand/test/tv_stand_0365.off tv_stand/test/tv_stand_0366.off tv_stand/test/tv_stand_0367.off bathtub/test/bathtub_0107.off bathtub/test/bathtub_0108.off bathtub/test/bathtub_0109.off bathtub/test/bathtub_0110.off bathtub/test/bathtub_0111.off bathtub/test/bathtub_0112.off bathtub/test/bathtub_0113.off bathtub/test/bathtub_0114.off bathtub/test/bathtub_0115.off bathtub/test/bathtub_0116.off bathtub/test/bathtub_0117.off bathtub/test/bathtub_0118.off bathtub/test/bathtub_0119.off bathtub/test/bathtub_0120.off bathtub/test/bathtub_0121.off bathtub/test/bathtub_0122.off bathtub/test/bathtub_0123.off bathtub/test/bathtub_0124.off bathtub/test/bathtub_0125.off bathtub/test/bathtub_0126.off bathtub/test/bathtub_0127.off bathtub/test/bathtub_0128.off bathtub/test/bathtub_0129.off bathtub/test/bathtub_0130.off bathtub/test/bathtub_0131.off bathtub/test/bathtub_0132.off bathtub/test/bathtub_0133.off bathtub/test/bathtub_0134.off bathtub/test/bathtub_0135.off bathtub/test/bathtub_0136.off bathtub/test/bathtub_0137.off bathtub/test/bathtub_0138.off bathtub/test/bathtub_0139.off bathtub/test/bathtub_0140.off bathtub/test/bathtub_0141.off bathtub/test/bathtub_0142.off bathtub/test/bathtub_0143.off bathtub/test/bathtub_0144.off bathtub/test/bathtub_0145.off bathtub/test/bathtub_0146.off bathtub/test/bathtub_0147.off bathtub/test/bathtub_0148.off bathtub/test/bathtub_0149.off bathtub/test/bathtub_0150.off bathtub/test/bathtub_0151.off bathtub/test/bathtub_0152.off bathtub/test/bathtub_0153.off bathtub/test/bathtub_0154.off bathtub/test/bathtub_0155.off bathtub/test/bathtub_0156.off monitor/test/monitor_0466.off monitor/test/monitor_0467.off monitor/test/monitor_0468.off monitor/test/monitor_0469.off monitor/test/monitor_0470.off monitor/test/monitor_0471.off monitor/test/monitor_0472.off monitor/test/monitor_0473.off monitor/test/monitor_0474.off monitor/test/monitor_0475.off monitor/test/monitor_0476.off monitor/test/monitor_0477.off monitor/test/monitor_0478.off monitor/test/monitor_0479.off monitor/test/monitor_0480.off monitor/test/monitor_0481.off monitor/test/monitor_0482.off monitor/test/monitor_0483.off monitor/test/monitor_0484.off monitor/test/monitor_0485.off monitor/test/monitor_0486.off monitor/test/monitor_0487.off monitor/test/monitor_0488.off monitor/test/monitor_0489.off monitor/test/monitor_0490.off monitor/test/monitor_0491.off monitor/test/monitor_0492.off monitor/test/monitor_0493.off monitor/test/monitor_0494.off monitor/test/monitor_0495.off monitor/test/monitor_0496.off monitor/test/monitor_0497.off monitor/test/monitor_0498.off monitor/test/monitor_0499.off monitor/test/monitor_0500.off monitor/test/monitor_0501.off monitor/test/monitor_0502.off monitor/test/monitor_0503.off monitor/test/monitor_0504.off monitor/test/monitor_0505.off monitor/test/monitor_0506.off monitor/test/monitor_0507.off monitor/test/monitor_0508.off monitor/test/monitor_0509.off monitor/test/monitor_0510.off monitor/test/monitor_0511.off monitor/test/monitor_0512.off monitor/test/monitor_0513.off monitor/test/monitor_0514.off monitor/test/monitor_0515.off monitor/test/monitor_0516.off monitor/test/monitor_0517.off monitor/test/monitor_0518.off monitor/test/monitor_0519.off monitor/test/monitor_0520.off monitor/test/monitor_0521.off monitor/test/monitor_0522.off monitor/test/monitor_0523.off monitor/test/monitor_0524.off monitor/test/monitor_0525.off monitor/test/monitor_0526.off monitor/test/monitor_0527.off monitor/test/monitor_0528.off monitor/test/monitor_0529.off monitor/test/monitor_0530.off monitor/test/monitor_0531.off monitor/test/monitor_0532.off monitor/test/monitor_0533.off monitor/test/monitor_0534.off monitor/test/monitor_0535.off monitor/test/monitor_0536.off monitor/test/monitor_0537.off monitor/test/monitor_0538.off monitor/test/monitor_0539.off monitor/test/monitor_0540.off monitor/test/monitor_0541.off monitor/test/monitor_0542.off monitor/test/monitor_0543.off monitor/test/monitor_0544.off monitor/test/monitor_0545.off monitor/test/monitor_0546.off monitor/test/monitor_0547.off monitor/test/monitor_0548.off monitor/test/monitor_0549.off monitor/test/monitor_0550.off monitor/test/monitor_0551.off monitor/test/monitor_0552.off monitor/test/monitor_0553.off monitor/test/monitor_0554.off monitor/test/monitor_0555.off monitor/test/monitor_0556.off monitor/test/monitor_0557.off monitor/test/monitor_0558.off monitor/test/monitor_0559.off monitor/test/monitor_0560.off monitor/test/monitor_0561.off monitor/test/monitor_0562.off monitor/test/monitor_0563.off monitor/test/monitor_0564.off monitor/test/monitor_0565.off bottle/test/bottle_0336.off bottle/test/bottle_0337.off bottle/test/bottle_0338.off bottle/test/bottle_0339.off bottle/test/bottle_0340.off bottle/test/bottle_0341.off bottle/test/bottle_0342.off bottle/test/bottle_0343.off bottle/test/bottle_0344.off bottle/test/bottle_0345.off bottle/test/bottle_0346.off bottle/test/bottle_0347.off bottle/test/bottle_0348.off bottle/test/bottle_0349.off bottle/test/bottle_0350.off bottle/test/bottle_0351.off bottle/test/bottle_0352.off bottle/test/bottle_0353.off bottle/test/bottle_0354.off bottle/test/bottle_0355.off bottle/test/bottle_0356.off bottle/test/bottle_0357.off bottle/test/bottle_0358.off bottle/test/bottle_0359.off bottle/test/bottle_0360.off bottle/test/bottle_0361.off bottle/test/bottle_0362.off bottle/test/bottle_0363.off bottle/test/bottle_0364.off bottle/test/bottle_0365.off bottle/test/bottle_0366.off bottle/test/bottle_0367.off bottle/test/bottle_0368.off bottle/test/bottle_0369.off bottle/test/bottle_0370.off bottle/test/bottle_0371.off bottle/test/bottle_0372.off bottle/test/bottle_0373.off bottle/test/bottle_0374.off bottle/test/bottle_0375.off bottle/test/bottle_0376.off bottle/test/bottle_0377.off bottle/test/bottle_0378.off bottle/test/bottle_0379.off bottle/test/bottle_0380.off bottle/test/bottle_0381.off bottle/test/bottle_0382.off bottle/test/bottle_0383.off bottle/test/bottle_0384.off bottle/test/bottle_0385.off bottle/test/bottle_0386.off bottle/test/bottle_0387.off bottle/test/bottle_0388.off bottle/test/bottle_0389.off bottle/test/bottle_0390.off bottle/test/bottle_0391.off bottle/test/bottle_0392.off bottle/test/bottle_0393.off bottle/test/bottle_0394.off bottle/test/bottle_0395.off bottle/test/bottle_0396.off bottle/test/bottle_0397.off bottle/test/bottle_0398.off bottle/test/bottle_0399.off bottle/test/bottle_0400.off bottle/test/bottle_0401.off bottle/test/bottle_0402.off bottle/test/bottle_0403.off bottle/test/bottle_0404.off bottle/test/bottle_0405.off bottle/test/bottle_0406.off bottle/test/bottle_0407.off bottle/test/bottle_0408.off bottle/test/bottle_0409.off bottle/test/bottle_0410.off bottle/test/bottle_0411.off bottle/test/bottle_0412.off bottle/test/bottle_0413.off bottle/test/bottle_0414.off bottle/test/bottle_0415.off bottle/test/bottle_0416.off bottle/test/bottle_0417.off bottle/test/bottle_0418.off bottle/test/bottle_0419.off bottle/test/bottle_0420.off bottle/test/bottle_0421.off bottle/test/bottle_0422.off bottle/test/bottle_0423.off bottle/test/bottle_0424.off bottle/test/bottle_0425.off bottle/test/bottle_0426.off bottle/test/bottle_0427.off bottle/test/bottle_0428.off bottle/test/bottle_0429.off bottle/test/bottle_0430.off bottle/test/bottle_0431.off bottle/test/bottle_0432.off bottle/test/bottle_0433.off bottle/test/bottle_0434.off bottle/test/bottle_0435.off bowl/test/bowl_0065.off bowl/test/bowl_0066.off bowl/test/bowl_0067.off bowl/test/bowl_0068.off bowl/test/bowl_0069.off bowl/test/bowl_0070.off bowl/test/bowl_0071.off bowl/test/bowl_0072.off bowl/test/bowl_0073.off bowl/test/bowl_0074.off bowl/test/bowl_0075.off bowl/test/bowl_0076.off bowl/test/bowl_0077.off bowl/test/bowl_0078.off bowl/test/bowl_0079.off bowl/test/bowl_0080.off bowl/test/bowl_0081.off bowl/test/bowl_0082.off bowl/test/bowl_0083.off bowl/test/bowl_0084.off keyboard/test/keyboard_0146.off keyboard/test/keyboard_0147.off keyboard/test/keyboard_0148.off keyboard/test/keyboard_0149.off keyboard/test/keyboard_0150.off keyboard/test/keyboard_0151.off keyboard/test/keyboard_0152.off keyboard/test/keyboard_0153.off keyboard/test/keyboard_0154.off keyboard/test/keyboard_0155.off keyboard/test/keyboard_0156.off keyboard/test/keyboard_0157.off keyboard/test/keyboard_0158.off keyboard/test/keyboard_0159.off keyboard/test/keyboard_0160.off keyboard/test/keyboard_0161.off keyboard/test/keyboard_0162.off keyboard/test/keyboard_0163.off keyboard/test/keyboard_0164.off keyboard/test/keyboard_0165.off desk/test/desk_0201.off desk/test/desk_0202.off desk/test/desk_0203.off desk/test/desk_0204.off desk/test/desk_0205.off desk/test/desk_0206.off desk/test/desk_0207.off desk/test/desk_0208.off desk/test/desk_0209.off desk/test/desk_0210.off desk/test/desk_0211.off desk/test/desk_0212.off desk/test/desk_0213.off desk/test/desk_0214.off desk/test/desk_0215.off desk/test/desk_0216.off desk/test/desk_0217.off desk/test/desk_0218.off desk/test/desk_0219.off desk/test/desk_0220.off desk/test/desk_0221.off desk/test/desk_0222.off desk/test/desk_0223.off desk/test/desk_0224.off desk/test/desk_0225.off desk/test/desk_0226.off desk/test/desk_0227.off desk/test/desk_0228.off desk/test/desk_0229.off desk/test/desk_0230.off desk/test/desk_0231.off desk/test/desk_0232.off desk/test/desk_0233.off desk/test/desk_0234.off desk/test/desk_0235.off desk/test/desk_0236.off desk/test/desk_0237.off desk/test/desk_0238.off desk/test/desk_0239.off desk/test/desk_0240.off desk/test/desk_0241.off desk/test/desk_0242.off desk/test/desk_0243.off desk/test/desk_0244.off desk/test/desk_0245.off desk/test/desk_0246.off desk/test/desk_0247.off desk/test/desk_0248.off desk/test/desk_0249.off desk/test/desk_0250.off desk/test/desk_0251.off desk/test/desk_0252.off desk/test/desk_0253.off desk/test/desk_0254.off desk/test/desk_0255.off desk/test/desk_0256.off desk/test/desk_0257.off desk/test/desk_0258.off desk/test/desk_0259.off desk/test/desk_0260.off desk/test/desk_0261.off desk/test/desk_0262.off desk/test/desk_0263.off desk/test/desk_0264.off desk/test/desk_0265.off desk/test/desk_0266.off desk/test/desk_0267.off desk/test/desk_0268.off desk/test/desk_0269.off desk/test/desk_0270.off desk/test/desk_0271.off desk/test/desk_0272.off desk/test/desk_0273.off desk/test/desk_0274.off desk/test/desk_0275.off desk/test/desk_0276.off desk/test/desk_0277.off desk/test/desk_0278.off desk/test/desk_0279.off desk/test/desk_0280.off desk/test/desk_0281.off desk/test/desk_0282.off desk/test/desk_0283.off desk/test/desk_0284.off desk/test/desk_0285.off desk/test/desk_0286.off bed/test/bed_0516.off bed/test/bed_0517.off bed/test/bed_0518.off bed/test/bed_0519.off bed/test/bed_0520.off bed/test/bed_0521.off bed/test/bed_0522.off bed/test/bed_0523.off bed/test/bed_0524.off bed/test/bed_0525.off bed/test/bed_0526.off bed/test/bed_0527.off bed/test/bed_0528.off bed/test/bed_0529.off bed/test/bed_0530.off bed/test/bed_0531.off bed/test/bed_0532.off bed/test/bed_0533.off bed/test/bed_0534.off bed/test/bed_0535.off bed/test/bed_0536.off bed/test/bed_0537.off bed/test/bed_0538.off bed/test/bed_0539.off bed/test/bed_0540.off bed/test/bed_0541.off bed/test/bed_0542.off bed/test/bed_0543.off bed/test/bed_0544.off bed/test/bed_0545.off bed/test/bed_0546.off bed/test/bed_0547.off bed/test/bed_0548.off bed/test/bed_0549.off bed/test/bed_0550.off bed/test/bed_0551.off bed/test/bed_0552.off bed/test/bed_0553.off bed/test/bed_0554.off bed/test/bed_0555.off bed/test/bed_0556.off bed/test/bed_0557.off bed/test/bed_0558.off bed/test/bed_0559.off bed/test/bed_0560.off bed/test/bed_0561.off bed/test/bed_0562.off bed/test/bed_0563.off bed/test/bed_0564.off bed/test/bed_0565.off bed/test/bed_0566.off bed/test/bed_0567.off bed/test/bed_0568.off bed/test/bed_0569.off bed/test/bed_0570.off bed/test/bed_0571.off bed/test/bed_0572.off bed/test/bed_0573.off bed/test/bed_0574.off bed/test/bed_0575.off bed/test/bed_0576.off bed/test/bed_0577.off bed/test/bed_0578.off bed/test/bed_0579.off bed/test/bed_0580.off bed/test/bed_0581.off bed/test/bed_0582.off bed/test/bed_0583.off bed/test/bed_0584.off bed/test/bed_0585.off bed/test/bed_0586.off bed/test/bed_0587.off bed/test/bed_0588.off bed/test/bed_0589.off bed/test/bed_0590.off bed/test/bed_0591.off bed/test/bed_0592.off bed/test/bed_0593.off bed/test/bed_0594.off bed/test/bed_0595.off bed/test/bed_0596.off bed/test/bed_0597.off bed/test/bed_0598.off bed/test/bed_0599.off bed/test/bed_0600.off bed/test/bed_0601.off bed/test/bed_0602.off bed/test/bed_0603.off bed/test/bed_0604.off bed/test/bed_0605.off bed/test/bed_0606.off bed/test/bed_0607.off bed/test/bed_0608.off bed/test/bed_0609.off bed/test/bed_0610.off bed/test/bed_0611.off bed/test/bed_0612.off bed/test/bed_0613.off bed/test/bed_0614.off bed/test/bed_0615.off tent/test/tent_0164.off tent/test/tent_0165.off tent/test/tent_0166.off tent/test/tent_0167.off tent/test/tent_0168.off tent/test/tent_0169.off tent/test/tent_0170.off tent/test/tent_0171.off tent/test/tent_0172.off tent/test/tent_0173.off tent/test/tent_0174.off tent/test/tent_0175.off tent/test/tent_0176.off tent/test/tent_0177.off tent/test/tent_0178.off tent/test/tent_0179.off tent/test/tent_0180.off tent/test/tent_0181.off tent/test/tent_0182.off tent/test/tent_0183.off piano/test/piano_0232.off piano/test/piano_0233.off piano/test/piano_0234.off piano/test/piano_0235.off piano/test/piano_0236.off piano/test/piano_0237.off piano/test/piano_0238.off piano/test/piano_0239.off piano/test/piano_0240.off piano/test/piano_0241.off piano/test/piano_0242.off piano/test/piano_0243.off piano/test/piano_0244.off piano/test/piano_0245.off piano/test/piano_0246.off piano/test/piano_0247.off piano/test/piano_0248.off piano/test/piano_0249.off piano/test/piano_0250.off piano/test/piano_0251.off piano/test/piano_0252.off piano/test/piano_0253.off piano/test/piano_0254.off piano/test/piano_0255.off piano/test/piano_0256.off piano/test/piano_0257.off piano/test/piano_0258.off piano/test/piano_0259.off piano/test/piano_0260.off piano/test/piano_0261.off piano/test/piano_0262.off piano/test/piano_0263.off piano/test/piano_0264.off piano/test/piano_0265.off piano/test/piano_0266.off piano/test/piano_0267.off piano/test/piano_0268.off piano/test/piano_0269.off piano/test/piano_0270.off piano/test/piano_0271.off piano/test/piano_0272.off piano/test/piano_0273.off piano/test/piano_0274.off piano/test/piano_0275.off piano/test/piano_0276.off piano/test/piano_0277.off piano/test/piano_0278.off piano/test/piano_0279.off piano/test/piano_0280.off piano/test/piano_0281.off piano/test/piano_0282.off piano/test/piano_0283.off piano/test/piano_0284.off piano/test/piano_0285.off piano/test/piano_0286.off piano/test/piano_0287.off piano/test/piano_0288.off piano/test/piano_0289.off piano/test/piano_0290.off piano/test/piano_0291.off piano/test/piano_0292.off piano/test/piano_0293.off piano/test/piano_0294.off piano/test/piano_0295.off piano/test/piano_0296.off piano/test/piano_0297.off piano/test/piano_0298.off piano/test/piano_0299.off piano/test/piano_0300.off piano/test/piano_0301.off piano/test/piano_0302.off piano/test/piano_0303.off piano/test/piano_0304.off piano/test/piano_0305.off piano/test/piano_0306.off piano/test/piano_0307.off piano/test/piano_0308.off piano/test/piano_0309.off piano/test/piano_0310.off piano/test/piano_0311.off piano/test/piano_0312.off piano/test/piano_0313.off piano/test/piano_0314.off piano/test/piano_0315.off piano/test/piano_0316.off piano/test/piano_0317.off piano/test/piano_0318.off piano/test/piano_0319.off piano/test/piano_0320.off piano/test/piano_0321.off piano/test/piano_0322.off piano/test/piano_0323.off piano/test/piano_0324.off piano/test/piano_0325.off piano/test/piano_0326.off piano/test/piano_0327.off piano/test/piano_0328.off piano/test/piano_0329.off piano/test/piano_0330.off piano/test/piano_0331.off sofa/test/sofa_0681.off sofa/test/sofa_0682.off sofa/test/sofa_0683.off sofa/test/sofa_0684.off sofa/test/sofa_0685.off sofa/test/sofa_0686.off sofa/test/sofa_0687.off sofa/test/sofa_0688.off sofa/test/sofa_0689.off sofa/test/sofa_0690.off sofa/test/sofa_0691.off sofa/test/sofa_0692.off sofa/test/sofa_0693.off sofa/test/sofa_0694.off sofa/test/sofa_0695.off sofa/test/sofa_0696.off sofa/test/sofa_0697.off sofa/test/sofa_0698.off sofa/test/sofa_0699.off sofa/test/sofa_0700.off sofa/test/sofa_0701.off sofa/test/sofa_0702.off sofa/test/sofa_0703.off sofa/test/sofa_0704.off sofa/test/sofa_0705.off sofa/test/sofa_0706.off sofa/test/sofa_0707.off sofa/test/sofa_0708.off sofa/test/sofa_0709.off sofa/test/sofa_0710.off sofa/test/sofa_0711.off sofa/test/sofa_0712.off sofa/test/sofa_0713.off sofa/test/sofa_0714.off sofa/test/sofa_0715.off sofa/test/sofa_0716.off sofa/test/sofa_0717.off sofa/test/sofa_0718.off sofa/test/sofa_0719.off sofa/test/sofa_0720.off sofa/test/sofa_0721.off sofa/test/sofa_0722.off sofa/test/sofa_0723.off sofa/test/sofa_0724.off sofa/test/sofa_0725.off sofa/test/sofa_0726.off sofa/test/sofa_0727.off sofa/test/sofa_0728.off sofa/test/sofa_0729.off sofa/test/sofa_0730.off sofa/test/sofa_0731.off sofa/test/sofa_0732.off sofa/test/sofa_0733.off sofa/test/sofa_0734.off sofa/test/sofa_0735.off sofa/test/sofa_0736.off sofa/test/sofa_0737.off sofa/test/sofa_0738.off sofa/test/sofa_0739.off sofa/test/sofa_0740.off sofa/test/sofa_0741.off sofa/test/sofa_0742.off sofa/test/sofa_0743.off sofa/test/sofa_0744.off sofa/test/sofa_0745.off sofa/test/sofa_0746.off sofa/test/sofa_0747.off sofa/test/sofa_0748.off sofa/test/sofa_0749.off sofa/test/sofa_0750.off sofa/test/sofa_0751.off sofa/test/sofa_0752.off sofa/test/sofa_0753.off sofa/test/sofa_0754.off sofa/test/sofa_0755.off sofa/test/sofa_0756.off sofa/test/sofa_0757.off sofa/test/sofa_0758.off sofa/test/sofa_0759.off sofa/test/sofa_0760.off sofa/test/sofa_0761.off sofa/test/sofa_0762.off sofa/test/sofa_0763.off sofa/test/sofa_0764.off sofa/test/sofa_0765.off sofa/test/sofa_0766.off sofa/test/sofa_0767.off sofa/test/sofa_0768.off sofa/test/sofa_0769.off sofa/test/sofa_0770.off sofa/test/sofa_0771.off sofa/test/sofa_0772.off sofa/test/sofa_0773.off sofa/test/sofa_0774.off sofa/test/sofa_0775.off sofa/test/sofa_0776.off sofa/test/sofa_0777.off sofa/test/sofa_0778.off sofa/test/sofa_0779.off sofa/test/sofa_0780.off person/test/person_0089.off person/test/person_0090.off person/test/person_0091.off person/test/person_0092.off person/test/person_0093.off person/test/person_0094.off person/test/person_0095.off person/test/person_0096.off person/test/person_0097.off person/test/person_0098.off person/test/person_0099.off person/test/person_0100.off person/test/person_0101.off person/test/person_0102.off person/test/person_0103.off person/test/person_0104.off person/test/person_0105.off person/test/person_0106.off person/test/person_0107.off person/test/person_0108.off xbox/test/xbox_0104.off xbox/test/xbox_0105.off xbox/test/xbox_0106.off xbox/test/xbox_0107.off xbox/test/xbox_0108.off xbox/test/xbox_0109.off xbox/test/xbox_0110.off xbox/test/xbox_0111.off xbox/test/xbox_0112.off xbox/test/xbox_0113.off xbox/test/xbox_0114.off xbox/test/xbox_0115.off xbox/test/xbox_0116.off xbox/test/xbox_0117.off xbox/test/xbox_0118.off xbox/test/xbox_0119.off xbox/test/xbox_0120.off xbox/test/xbox_0121.off xbox/test/xbox_0122.off xbox/test/xbox_0123.off stairs/test/stairs_0125.off stairs/test/stairs_0126.off stairs/test/stairs_0127.off stairs/test/stairs_0128.off stairs/test/stairs_0129.off stairs/test/stairs_0130.off stairs/test/stairs_0131.off stairs/test/stairs_0132.off stairs/test/stairs_0133.off stairs/test/stairs_0134.off stairs/test/stairs_0135.off stairs/test/stairs_0136.off stairs/test/stairs_0137.off stairs/test/stairs_0138.off stairs/test/stairs_0139.off stairs/test/stairs_0140.off stairs/test/stairs_0141.off stairs/test/stairs_0142.off stairs/test/stairs_0143.off stairs/test/stairs_0144.off cone/test/cone_0168.off cone/test/cone_0169.off cone/test/cone_0170.off cone/test/cone_0171.off cone/test/cone_0172.off cone/test/cone_0173.off cone/test/cone_0174.off cone/test/cone_0175.off cone/test/cone_0176.off cone/test/cone_0177.off cone/test/cone_0178.off cone/test/cone_0179.off cone/test/cone_0180.off cone/test/cone_0181.off cone/test/cone_0182.off cone/test/cone_0183.off cone/test/cone_0184.off cone/test/cone_0185.off cone/test/cone_0186.off cone/test/cone_0187.off lamp/test/lamp_0125.off lamp/test/lamp_0126.off lamp/test/lamp_0127.off lamp/test/lamp_0128.off lamp/test/lamp_0129.off lamp/test/lamp_0130.off lamp/test/lamp_0131.off lamp/test/lamp_0132.off lamp/test/lamp_0133.off lamp/test/lamp_0134.off lamp/test/lamp_0135.off lamp/test/lamp_0136.off lamp/test/lamp_0137.off lamp/test/lamp_0138.off lamp/test/lamp_0139.off lamp/test/lamp_0140.off lamp/test/lamp_0141.off lamp/test/lamp_0142.off lamp/test/lamp_0143.off lamp/test/lamp_0144.off door/test/door_0110.off door/test/door_0111.off door/test/door_0112.off door/test/door_0113.off door/test/door_0114.off door/test/door_0115.off door/test/door_0116.off door/test/door_0117.off door/test/door_0118.off door/test/door_0119.off door/test/door_0120.off door/test/door_0121.off door/test/door_0122.off door/test/door_0123.off door/test/door_0124.off door/test/door_0125.off door/test/door_0126.off door/test/door_0127.off door/test/door_0128.off door/test/door_0129.off range_hood/test/range_hood_0116.off range_hood/test/range_hood_0117.off range_hood/test/range_hood_0118.off range_hood/test/range_hood_0119.off range_hood/test/range_hood_0120.off range_hood/test/range_hood_0121.off range_hood/test/range_hood_0122.off range_hood/test/range_hood_0123.off range_hood/test/range_hood_0124.off range_hood/test/range_hood_0125.off range_hood/test/range_hood_0126.off range_hood/test/range_hood_0127.off range_hood/test/range_hood_0128.off range_hood/test/range_hood_0129.off range_hood/test/range_hood_0130.off range_hood/test/range_hood_0131.off range_hood/test/range_hood_0132.off range_hood/test/range_hood_0133.off range_hood/test/range_hood_0134.off range_hood/test/range_hood_0135.off range_hood/test/range_hood_0136.off range_hood/test/range_hood_0137.off range_hood/test/range_hood_0138.off range_hood/test/range_hood_0139.off range_hood/test/range_hood_0140.off range_hood/test/range_hood_0141.off range_hood/test/range_hood_0142.off range_hood/test/range_hood_0143.off range_hood/test/range_hood_0144.off range_hood/test/range_hood_0145.off range_hood/test/range_hood_0146.off range_hood/test/range_hood_0147.off range_hood/test/range_hood_0148.off range_hood/test/range_hood_0149.off range_hood/test/range_hood_0150.off range_hood/test/range_hood_0151.off range_hood/test/range_hood_0152.off range_hood/test/range_hood_0153.off range_hood/test/range_hood_0154.off range_hood/test/range_hood_0155.off range_hood/test/range_hood_0156.off range_hood/test/range_hood_0157.off range_hood/test/range_hood_0158.off range_hood/test/range_hood_0159.off range_hood/test/range_hood_0160.off range_hood/test/range_hood_0161.off range_hood/test/range_hood_0162.off range_hood/test/range_hood_0163.off range_hood/test/range_hood_0164.off range_hood/test/range_hood_0165.off range_hood/test/range_hood_0166.off range_hood/test/range_hood_0167.off range_hood/test/range_hood_0168.off range_hood/test/range_hood_0169.off range_hood/test/range_hood_0170.off range_hood/test/range_hood_0171.off range_hood/test/range_hood_0172.off range_hood/test/range_hood_0173.off range_hood/test/range_hood_0174.off range_hood/test/range_hood_0175.off range_hood/test/range_hood_0176.off range_hood/test/range_hood_0177.off range_hood/test/range_hood_0178.off range_hood/test/range_hood_0179.off range_hood/test/range_hood_0180.off range_hood/test/range_hood_0181.off range_hood/test/range_hood_0182.off range_hood/test/range_hood_0183.off range_hood/test/range_hood_0184.off range_hood/test/range_hood_0185.off range_hood/test/range_hood_0186.off range_hood/test/range_hood_0187.off range_hood/test/range_hood_0188.off range_hood/test/range_hood_0189.off range_hood/test/range_hood_0190.off range_hood/test/range_hood_0191.off range_hood/test/range_hood_0192.off range_hood/test/range_hood_0193.off range_hood/test/range_hood_0194.off range_hood/test/range_hood_0195.off range_hood/test/range_hood_0196.off range_hood/test/range_hood_0197.off range_hood/test/range_hood_0198.off range_hood/test/range_hood_0199.off range_hood/test/range_hood_0200.off range_hood/test/range_hood_0201.off range_hood/test/range_hood_0202.off range_hood/test/range_hood_0203.off range_hood/test/range_hood_0204.off range_hood/test/range_hood_0205.off range_hood/test/range_hood_0206.off range_hood/test/range_hood_0207.off range_hood/test/range_hood_0208.off range_hood/test/range_hood_0209.off range_hood/test/range_hood_0210.off range_hood/test/range_hood_0211.off range_hood/test/range_hood_0212.off range_hood/test/range_hood_0213.off range_hood/test/range_hood_0214.off range_hood/test/range_hood_0215.off flower_pot/test/flower_pot_0150.off flower_pot/test/flower_pot_0151.off flower_pot/test/flower_pot_0152.off flower_pot/test/flower_pot_0153.off flower_pot/test/flower_pot_0154.off flower_pot/test/flower_pot_0155.off flower_pot/test/flower_pot_0156.off flower_pot/test/flower_pot_0157.off flower_pot/test/flower_pot_0158.off flower_pot/test/flower_pot_0159.off flower_pot/test/flower_pot_0160.off flower_pot/test/flower_pot_0161.off flower_pot/test/flower_pot_0162.off flower_pot/test/flower_pot_0163.off flower_pot/test/flower_pot_0164.off flower_pot/test/flower_pot_0165.off flower_pot/test/flower_pot_0166.off flower_pot/test/flower_pot_0167.off flower_pot/test/flower_pot_0168.off flower_pot/test/flower_pot_0169.off ================================================ FILE: dataloader/split/test_scan2cad.txt ================================================ full_annotations_clean_test.json ================================================ FILE: dataloader/split/train_3dmatch.txt ================================================ sun3d-brown_bm_1-brown_bm_1 sun3d-brown_cogsci_1-brown_cogsci_1 sun3d-brown_cs_2-brown_cs2 sun3d-brown_cs_3-brown_cs3 sun3d-harvard_c3-hv_c3_1 sun3d-harvard_c5-hv_c5_1 sun3d-harvard_c6-hv_c6_1 sun3d-harvard_c8-hv_c8_3 sun3d-home_bksh-home_bksh_oct_30_2012_scan2_erika sun3d-hotel_nips2012-nips_4 sun3d-hotel_sf-scan1 sun3d-mit_32_d507-d507_2 sun3d-mit_46_ted_lab1-ted_lab_2 sun3d-mit_76_417-76-417b sun3d-mit_dorm_next_sj-dorm_next_sj_oct_30_2012_scan1_erika sun3d-mit_w20_athena-sc_athena_oct_29_2012_scan1_erika 7-scenes-chess 7-scenes-fire 7-scenes-office 7-scenes-pumpkin 7-scenes-stairs rgbd-scenes-v2-scene_01 rgbd-scenes-v2-scene_02 rgbd-scenes-v2-scene_03 rgbd-scenes-v2-scene_04 rgbd-scenes-v2-scene_05 rgbd-scenes-v2-scene_06 rgbd-scenes-v2-scene_07 rgbd-scenes-v2-scene_08 rgbd-scenes-v2-scene_09 rgbd-scenes-v2-scene_11 rgbd-scenes-v2-scene_12 rgbd-scenes-v2-scene_13 rgbd-scenes-v2-scene_14 bundlefusion-apt0 bundlefusion-apt1 bundlefusion-apt2 bundlefusion-copyroom bundlefusion-office1 bundlefusion-office2 bundlefusion-office3 analysis-by-synthesis-apt1-kitchen analysis-by-synthesis-apt1-living analysis-by-synthesis-apt2-bed analysis-by-synthesis-apt2-living analysis-by-synthesis-apt2-luke analysis-by-synthesis-office2-5a analysis-by-synthesis-office2-5b ================================================ FILE: dataloader/split/train_kitti.txt ================================================ 0 1 2 3 4 5 ================================================ FILE: dataloader/split/train_modelnet40.txt ================================================ glass_box/train/glass_box_0001.off glass_box/train/glass_box_0002.off glass_box/train/glass_box_0003.off glass_box/train/glass_box_0004.off glass_box/train/glass_box_0005.off glass_box/train/glass_box_0006.off glass_box/train/glass_box_0007.off glass_box/train/glass_box_0008.off glass_box/train/glass_box_0009.off glass_box/train/glass_box_0010.off glass_box/train/glass_box_0011.off glass_box/train/glass_box_0012.off glass_box/train/glass_box_0013.off glass_box/train/glass_box_0014.off glass_box/train/glass_box_0015.off glass_box/train/glass_box_0016.off glass_box/train/glass_box_0017.off glass_box/train/glass_box_0018.off glass_box/train/glass_box_0019.off glass_box/train/glass_box_0020.off glass_box/train/glass_box_0021.off glass_box/train/glass_box_0022.off glass_box/train/glass_box_0023.off glass_box/train/glass_box_0024.off glass_box/train/glass_box_0025.off glass_box/train/glass_box_0026.off glass_box/train/glass_box_0027.off glass_box/train/glass_box_0028.off glass_box/train/glass_box_0029.off glass_box/train/glass_box_0030.off glass_box/train/glass_box_0031.off glass_box/train/glass_box_0032.off glass_box/train/glass_box_0033.off glass_box/train/glass_box_0034.off glass_box/train/glass_box_0035.off glass_box/train/glass_box_0036.off glass_box/train/glass_box_0037.off glass_box/train/glass_box_0038.off glass_box/train/glass_box_0039.off glass_box/train/glass_box_0040.off glass_box/train/glass_box_0041.off glass_box/train/glass_box_0042.off glass_box/train/glass_box_0043.off glass_box/train/glass_box_0044.off glass_box/train/glass_box_0045.off glass_box/train/glass_box_0046.off glass_box/train/glass_box_0047.off glass_box/train/glass_box_0048.off glass_box/train/glass_box_0049.off glass_box/train/glass_box_0050.off glass_box/train/glass_box_0051.off glass_box/train/glass_box_0052.off glass_box/train/glass_box_0053.off glass_box/train/glass_box_0054.off glass_box/train/glass_box_0055.off glass_box/train/glass_box_0056.off glass_box/train/glass_box_0057.off glass_box/train/glass_box_0058.off glass_box/train/glass_box_0059.off glass_box/train/glass_box_0060.off glass_box/train/glass_box_0061.off glass_box/train/glass_box_0062.off glass_box/train/glass_box_0063.off glass_box/train/glass_box_0064.off glass_box/train/glass_box_0065.off glass_box/train/glass_box_0066.off glass_box/train/glass_box_0067.off glass_box/train/glass_box_0068.off glass_box/train/glass_box_0069.off glass_box/train/glass_box_0070.off glass_box/train/glass_box_0071.off glass_box/train/glass_box_0072.off glass_box/train/glass_box_0073.off glass_box/train/glass_box_0074.off glass_box/train/glass_box_0075.off glass_box/train/glass_box_0076.off glass_box/train/glass_box_0077.off glass_box/train/glass_box_0078.off glass_box/train/glass_box_0079.off glass_box/train/glass_box_0080.off glass_box/train/glass_box_0081.off glass_box/train/glass_box_0082.off glass_box/train/glass_box_0083.off glass_box/train/glass_box_0084.off glass_box/train/glass_box_0085.off glass_box/train/glass_box_0086.off glass_box/train/glass_box_0087.off glass_box/train/glass_box_0088.off glass_box/train/glass_box_0089.off glass_box/train/glass_box_0090.off glass_box/train/glass_box_0091.off glass_box/train/glass_box_0092.off glass_box/train/glass_box_0093.off glass_box/train/glass_box_0094.off glass_box/train/glass_box_0095.off glass_box/train/glass_box_0096.off glass_box/train/glass_box_0097.off glass_box/train/glass_box_0098.off glass_box/train/glass_box_0099.off glass_box/train/glass_box_0100.off glass_box/train/glass_box_0101.off glass_box/train/glass_box_0102.off glass_box/train/glass_box_0103.off glass_box/train/glass_box_0104.off glass_box/train/glass_box_0105.off glass_box/train/glass_box_0106.off glass_box/train/glass_box_0107.off glass_box/train/glass_box_0108.off glass_box/train/glass_box_0109.off glass_box/train/glass_box_0110.off glass_box/train/glass_box_0111.off glass_box/train/glass_box_0112.off glass_box/train/glass_box_0113.off glass_box/train/glass_box_0114.off glass_box/train/glass_box_0115.off glass_box/train/glass_box_0116.off glass_box/train/glass_box_0117.off glass_box/train/glass_box_0118.off glass_box/train/glass_box_0119.off glass_box/train/glass_box_0120.off glass_box/train/glass_box_0121.off glass_box/train/glass_box_0122.off glass_box/train/glass_box_0123.off glass_box/train/glass_box_0124.off glass_box/train/glass_box_0125.off glass_box/train/glass_box_0126.off glass_box/train/glass_box_0127.off glass_box/train/glass_box_0128.off glass_box/train/glass_box_0129.off glass_box/train/glass_box_0130.off glass_box/train/glass_box_0131.off glass_box/train/glass_box_0132.off glass_box/train/glass_box_0133.off glass_box/train/glass_box_0134.off glass_box/train/glass_box_0135.off glass_box/train/glass_box_0136.off glass_box/train/glass_box_0137.off glass_box/train/glass_box_0138.off glass_box/train/glass_box_0139.off glass_box/train/glass_box_0140.off glass_box/train/glass_box_0141.off glass_box/train/glass_box_0142.off glass_box/train/glass_box_0143.off glass_box/train/glass_box_0144.off glass_box/train/glass_box_0145.off glass_box/train/glass_box_0146.off glass_box/train/glass_box_0147.off glass_box/train/glass_box_0148.off glass_box/train/glass_box_0149.off glass_box/train/glass_box_0150.off glass_box/train/glass_box_0151.off glass_box/train/glass_box_0152.off glass_box/train/glass_box_0153.off glass_box/train/glass_box_0154.off laptop/train/laptop_0001.off laptop/train/laptop_0002.off laptop/train/laptop_0003.off laptop/train/laptop_0004.off laptop/train/laptop_0005.off laptop/train/laptop_0006.off laptop/train/laptop_0007.off laptop/train/laptop_0008.off laptop/train/laptop_0009.off laptop/train/laptop_0010.off laptop/train/laptop_0011.off laptop/train/laptop_0012.off laptop/train/laptop_0013.off laptop/train/laptop_0014.off laptop/train/laptop_0015.off laptop/train/laptop_0016.off laptop/train/laptop_0017.off laptop/train/laptop_0018.off laptop/train/laptop_0019.off laptop/train/laptop_0020.off laptop/train/laptop_0021.off laptop/train/laptop_0022.off laptop/train/laptop_0023.off laptop/train/laptop_0024.off laptop/train/laptop_0025.off laptop/train/laptop_0026.off laptop/train/laptop_0027.off laptop/train/laptop_0028.off laptop/train/laptop_0029.off laptop/train/laptop_0030.off laptop/train/laptop_0031.off laptop/train/laptop_0032.off laptop/train/laptop_0033.off laptop/train/laptop_0034.off laptop/train/laptop_0035.off laptop/train/laptop_0036.off laptop/train/laptop_0037.off laptop/train/laptop_0038.off laptop/train/laptop_0039.off laptop/train/laptop_0040.off laptop/train/laptop_0041.off laptop/train/laptop_0042.off laptop/train/laptop_0043.off laptop/train/laptop_0044.off laptop/train/laptop_0045.off laptop/train/laptop_0046.off laptop/train/laptop_0047.off laptop/train/laptop_0048.off laptop/train/laptop_0049.off laptop/train/laptop_0050.off laptop/train/laptop_0051.off laptop/train/laptop_0052.off laptop/train/laptop_0053.off laptop/train/laptop_0054.off laptop/train/laptop_0055.off laptop/train/laptop_0056.off laptop/train/laptop_0057.off laptop/train/laptop_0058.off laptop/train/laptop_0059.off laptop/train/laptop_0060.off laptop/train/laptop_0061.off laptop/train/laptop_0062.off laptop/train/laptop_0063.off laptop/train/laptop_0064.off laptop/train/laptop_0065.off laptop/train/laptop_0066.off laptop/train/laptop_0067.off laptop/train/laptop_0068.off laptop/train/laptop_0069.off laptop/train/laptop_0070.off laptop/train/laptop_0071.off laptop/train/laptop_0072.off laptop/train/laptop_0073.off laptop/train/laptop_0074.off laptop/train/laptop_0075.off laptop/train/laptop_0076.off laptop/train/laptop_0077.off laptop/train/laptop_0078.off laptop/train/laptop_0079.off laptop/train/laptop_0080.off laptop/train/laptop_0081.off laptop/train/laptop_0082.off laptop/train/laptop_0083.off laptop/train/laptop_0084.off laptop/train/laptop_0085.off laptop/train/laptop_0086.off laptop/train/laptop_0087.off laptop/train/laptop_0088.off laptop/train/laptop_0089.off laptop/train/laptop_0090.off laptop/train/laptop_0091.off laptop/train/laptop_0092.off laptop/train/laptop_0093.off laptop/train/laptop_0094.off laptop/train/laptop_0095.off laptop/train/laptop_0096.off laptop/train/laptop_0097.off laptop/train/laptop_0098.off laptop/train/laptop_0099.off laptop/train/laptop_0100.off laptop/train/laptop_0101.off laptop/train/laptop_0102.off laptop/train/laptop_0103.off laptop/train/laptop_0104.off laptop/train/laptop_0105.off laptop/train/laptop_0106.off laptop/train/laptop_0107.off laptop/train/laptop_0108.off laptop/train/laptop_0109.off laptop/train/laptop_0110.off laptop/train/laptop_0111.off laptop/train/laptop_0112.off laptop/train/laptop_0113.off laptop/train/laptop_0114.off laptop/train/laptop_0115.off laptop/train/laptop_0116.off laptop/train/laptop_0117.off laptop/train/laptop_0118.off laptop/train/laptop_0119.off laptop/train/laptop_0120.off laptop/train/laptop_0121.off laptop/train/laptop_0122.off laptop/train/laptop_0123.off laptop/train/laptop_0124.off laptop/train/laptop_0125.off laptop/train/laptop_0126.off laptop/train/laptop_0127.off laptop/train/laptop_0128.off laptop/train/laptop_0129.off laptop/train/laptop_0130.off laptop/train/laptop_0131.off laptop/train/laptop_0132.off laptop/train/laptop_0133.off laptop/train/laptop_0134.off laptop/train/laptop_0135.off sink/train/sink_0001.off sink/train/sink_0002.off sink/train/sink_0003.off sink/train/sink_0004.off sink/train/sink_0005.off sink/train/sink_0006.off sink/train/sink_0007.off sink/train/sink_0008.off sink/train/sink_0009.off sink/train/sink_0010.off sink/train/sink_0011.off sink/train/sink_0012.off sink/train/sink_0013.off sink/train/sink_0014.off sink/train/sink_0015.off sink/train/sink_0016.off sink/train/sink_0017.off sink/train/sink_0018.off sink/train/sink_0019.off sink/train/sink_0020.off sink/train/sink_0021.off sink/train/sink_0022.off sink/train/sink_0023.off sink/train/sink_0024.off sink/train/sink_0025.off sink/train/sink_0026.off sink/train/sink_0027.off sink/train/sink_0028.off sink/train/sink_0029.off sink/train/sink_0030.off sink/train/sink_0031.off sink/train/sink_0032.off sink/train/sink_0033.off sink/train/sink_0034.off sink/train/sink_0035.off sink/train/sink_0036.off sink/train/sink_0037.off sink/train/sink_0038.off sink/train/sink_0039.off sink/train/sink_0040.off sink/train/sink_0041.off sink/train/sink_0042.off sink/train/sink_0043.off sink/train/sink_0044.off sink/train/sink_0045.off sink/train/sink_0046.off sink/train/sink_0047.off sink/train/sink_0048.off sink/train/sink_0049.off sink/train/sink_0050.off sink/train/sink_0051.off sink/train/sink_0052.off sink/train/sink_0053.off sink/train/sink_0054.off sink/train/sink_0055.off sink/train/sink_0056.off sink/train/sink_0057.off sink/train/sink_0058.off sink/train/sink_0059.off sink/train/sink_0060.off sink/train/sink_0061.off sink/train/sink_0062.off sink/train/sink_0063.off sink/train/sink_0064.off sink/train/sink_0065.off sink/train/sink_0066.off sink/train/sink_0067.off sink/train/sink_0068.off sink/train/sink_0069.off sink/train/sink_0070.off sink/train/sink_0071.off sink/train/sink_0072.off sink/train/sink_0073.off sink/train/sink_0074.off sink/train/sink_0075.off sink/train/sink_0076.off sink/train/sink_0077.off sink/train/sink_0078.off sink/train/sink_0079.off sink/train/sink_0080.off sink/train/sink_0081.off sink/train/sink_0082.off sink/train/sink_0083.off sink/train/sink_0084.off sink/train/sink_0085.off sink/train/sink_0086.off sink/train/sink_0087.off sink/train/sink_0088.off sink/train/sink_0089.off sink/train/sink_0090.off sink/train/sink_0091.off sink/train/sink_0092.off sink/train/sink_0093.off sink/train/sink_0094.off sink/train/sink_0095.off sink/train/sink_0096.off sink/train/sink_0097.off sink/train/sink_0098.off sink/train/sink_0099.off sink/train/sink_0100.off sink/train/sink_0101.off sink/train/sink_0102.off sink/train/sink_0103.off sink/train/sink_0104.off sink/train/sink_0105.off sink/train/sink_0106.off sink/train/sink_0107.off sink/train/sink_0108.off sink/train/sink_0109.off sink/train/sink_0110.off sink/train/sink_0111.off sink/train/sink_0112.off sink/train/sink_0113.off sink/train/sink_0114.off sink/train/sink_0115.off sink/train/sink_0116.off night_stand/train/night_stand_0001.off night_stand/train/night_stand_0002.off night_stand/train/night_stand_0003.off night_stand/train/night_stand_0004.off night_stand/train/night_stand_0005.off night_stand/train/night_stand_0006.off night_stand/train/night_stand_0007.off night_stand/train/night_stand_0008.off night_stand/train/night_stand_0009.off night_stand/train/night_stand_0010.off night_stand/train/night_stand_0011.off night_stand/train/night_stand_0012.off night_stand/train/night_stand_0013.off night_stand/train/night_stand_0014.off night_stand/train/night_stand_0015.off night_stand/train/night_stand_0016.off night_stand/train/night_stand_0017.off night_stand/train/night_stand_0018.off night_stand/train/night_stand_0019.off night_stand/train/night_stand_0020.off night_stand/train/night_stand_0021.off night_stand/train/night_stand_0022.off night_stand/train/night_stand_0023.off night_stand/train/night_stand_0024.off night_stand/train/night_stand_0025.off night_stand/train/night_stand_0026.off night_stand/train/night_stand_0027.off night_stand/train/night_stand_0028.off night_stand/train/night_stand_0029.off night_stand/train/night_stand_0030.off night_stand/train/night_stand_0031.off night_stand/train/night_stand_0032.off night_stand/train/night_stand_0033.off night_stand/train/night_stand_0034.off night_stand/train/night_stand_0035.off night_stand/train/night_stand_0036.off night_stand/train/night_stand_0037.off night_stand/train/night_stand_0038.off night_stand/train/night_stand_0039.off night_stand/train/night_stand_0040.off night_stand/train/night_stand_0041.off night_stand/train/night_stand_0042.off night_stand/train/night_stand_0043.off night_stand/train/night_stand_0044.off night_stand/train/night_stand_0045.off night_stand/train/night_stand_0046.off night_stand/train/night_stand_0047.off night_stand/train/night_stand_0048.off night_stand/train/night_stand_0049.off night_stand/train/night_stand_0050.off night_stand/train/night_stand_0051.off night_stand/train/night_stand_0052.off night_stand/train/night_stand_0053.off night_stand/train/night_stand_0054.off night_stand/train/night_stand_0055.off night_stand/train/night_stand_0056.off night_stand/train/night_stand_0057.off night_stand/train/night_stand_0058.off night_stand/train/night_stand_0059.off night_stand/train/night_stand_0060.off night_stand/train/night_stand_0061.off night_stand/train/night_stand_0062.off night_stand/train/night_stand_0063.off night_stand/train/night_stand_0064.off night_stand/train/night_stand_0065.off night_stand/train/night_stand_0066.off night_stand/train/night_stand_0067.off night_stand/train/night_stand_0068.off night_stand/train/night_stand_0069.off night_stand/train/night_stand_0070.off night_stand/train/night_stand_0071.off night_stand/train/night_stand_0072.off night_stand/train/night_stand_0073.off night_stand/train/night_stand_0074.off night_stand/train/night_stand_0075.off night_stand/train/night_stand_0076.off night_stand/train/night_stand_0077.off night_stand/train/night_stand_0078.off night_stand/train/night_stand_0079.off night_stand/train/night_stand_0080.off night_stand/train/night_stand_0081.off night_stand/train/night_stand_0082.off night_stand/train/night_stand_0083.off night_stand/train/night_stand_0084.off night_stand/train/night_stand_0085.off night_stand/train/night_stand_0086.off night_stand/train/night_stand_0087.off night_stand/train/night_stand_0088.off night_stand/train/night_stand_0089.off night_stand/train/night_stand_0090.off night_stand/train/night_stand_0091.off night_stand/train/night_stand_0092.off night_stand/train/night_stand_0093.off night_stand/train/night_stand_0094.off night_stand/train/night_stand_0095.off night_stand/train/night_stand_0096.off night_stand/train/night_stand_0097.off night_stand/train/night_stand_0098.off night_stand/train/night_stand_0099.off night_stand/train/night_stand_0100.off night_stand/train/night_stand_0101.off night_stand/train/night_stand_0102.off night_stand/train/night_stand_0103.off night_stand/train/night_stand_0104.off night_stand/train/night_stand_0105.off night_stand/train/night_stand_0106.off night_stand/train/night_stand_0107.off night_stand/train/night_stand_0108.off night_stand/train/night_stand_0109.off night_stand/train/night_stand_0110.off night_stand/train/night_stand_0111.off night_stand/train/night_stand_0112.off night_stand/train/night_stand_0113.off night_stand/train/night_stand_0114.off night_stand/train/night_stand_0115.off night_stand/train/night_stand_0116.off night_stand/train/night_stand_0117.off night_stand/train/night_stand_0118.off night_stand/train/night_stand_0119.off night_stand/train/night_stand_0120.off night_stand/train/night_stand_0121.off night_stand/train/night_stand_0122.off night_stand/train/night_stand_0123.off night_stand/train/night_stand_0124.off night_stand/train/night_stand_0125.off night_stand/train/night_stand_0126.off night_stand/train/night_stand_0127.off night_stand/train/night_stand_0128.off night_stand/train/night_stand_0129.off night_stand/train/night_stand_0130.off night_stand/train/night_stand_0131.off night_stand/train/night_stand_0132.off night_stand/train/night_stand_0133.off night_stand/train/night_stand_0134.off night_stand/train/night_stand_0135.off night_stand/train/night_stand_0136.off night_stand/train/night_stand_0137.off night_stand/train/night_stand_0138.off night_stand/train/night_stand_0139.off night_stand/train/night_stand_0140.off night_stand/train/night_stand_0141.off night_stand/train/night_stand_0142.off night_stand/train/night_stand_0143.off night_stand/train/night_stand_0144.off night_stand/train/night_stand_0145.off night_stand/train/night_stand_0146.off night_stand/train/night_stand_0147.off night_stand/train/night_stand_0148.off night_stand/train/night_stand_0149.off night_stand/train/night_stand_0150.off night_stand/train/night_stand_0151.off night_stand/train/night_stand_0152.off night_stand/train/night_stand_0153.off night_stand/train/night_stand_0154.off night_stand/train/night_stand_0155.off night_stand/train/night_stand_0156.off night_stand/train/night_stand_0157.off night_stand/train/night_stand_0158.off night_stand/train/night_stand_0159.off night_stand/train/night_stand_0160.off night_stand/train/night_stand_0161.off night_stand/train/night_stand_0162.off night_stand/train/night_stand_0163.off night_stand/train/night_stand_0164.off night_stand/train/night_stand_0165.off night_stand/train/night_stand_0166.off night_stand/train/night_stand_0167.off night_stand/train/night_stand_0168.off night_stand/train/night_stand_0169.off night_stand/train/night_stand_0170.off night_stand/train/night_stand_0171.off night_stand/train/night_stand_0172.off night_stand/train/night_stand_0173.off night_stand/train/night_stand_0174.off night_stand/train/night_stand_0175.off night_stand/train/night_stand_0176.off night_stand/train/night_stand_0177.off night_stand/train/night_stand_0178.off night_stand/train/night_stand_0179.off night_stand/train/night_stand_0180.off car/train/car_0001.off car/train/car_0002.off car/train/car_0003.off car/train/car_0004.off car/train/car_0005.off car/train/car_0006.off car/train/car_0007.off car/train/car_0008.off car/train/car_0009.off car/train/car_0010.off car/train/car_0011.off car/train/car_0012.off car/train/car_0013.off car/train/car_0014.off car/train/car_0015.off car/train/car_0016.off car/train/car_0017.off car/train/car_0018.off car/train/car_0019.off car/train/car_0020.off car/train/car_0021.off car/train/car_0022.off car/train/car_0023.off car/train/car_0024.off car/train/car_0025.off car/train/car_0026.off car/train/car_0027.off car/train/car_0028.off car/train/car_0029.off car/train/car_0030.off car/train/car_0031.off car/train/car_0032.off car/train/car_0033.off car/train/car_0034.off car/train/car_0035.off car/train/car_0036.off car/train/car_0037.off car/train/car_0038.off car/train/car_0039.off car/train/car_0040.off car/train/car_0041.off car/train/car_0042.off car/train/car_0043.off car/train/car_0044.off car/train/car_0045.off car/train/car_0046.off car/train/car_0047.off car/train/car_0048.off car/train/car_0049.off car/train/car_0050.off car/train/car_0051.off car/train/car_0052.off car/train/car_0053.off car/train/car_0054.off car/train/car_0055.off car/train/car_0056.off car/train/car_0057.off car/train/car_0058.off car/train/car_0059.off car/train/car_0060.off car/train/car_0061.off car/train/car_0062.off car/train/car_0063.off car/train/car_0064.off car/train/car_0065.off car/train/car_0066.off car/train/car_0067.off car/train/car_0068.off car/train/car_0069.off car/train/car_0070.off car/train/car_0071.off car/train/car_0072.off car/train/car_0073.off car/train/car_0074.off car/train/car_0075.off car/train/car_0076.off car/train/car_0077.off car/train/car_0078.off car/train/car_0079.off car/train/car_0080.off car/train/car_0081.off car/train/car_0082.off car/train/car_0083.off car/train/car_0084.off car/train/car_0085.off car/train/car_0086.off car/train/car_0087.off car/train/car_0088.off car/train/car_0089.off car/train/car_0090.off car/train/car_0091.off car/train/car_0092.off car/train/car_0093.off car/train/car_0094.off car/train/car_0095.off car/train/car_0096.off car/train/car_0097.off car/train/car_0098.off car/train/car_0099.off car/train/car_0100.off car/train/car_0101.off car/train/car_0102.off car/train/car_0103.off car/train/car_0104.off car/train/car_0105.off car/train/car_0106.off car/train/car_0107.off car/train/car_0108.off car/train/car_0109.off car/train/car_0110.off car/train/car_0111.off car/train/car_0112.off car/train/car_0113.off car/train/car_0114.off car/train/car_0115.off car/train/car_0116.off car/train/car_0117.off car/train/car_0118.off car/train/car_0119.off car/train/car_0120.off car/train/car_0121.off car/train/car_0122.off car/train/car_0123.off car/train/car_0124.off car/train/car_0125.off car/train/car_0126.off car/train/car_0127.off car/train/car_0128.off car/train/car_0129.off car/train/car_0130.off car/train/car_0131.off car/train/car_0132.off car/train/car_0133.off car/train/car_0134.off car/train/car_0135.off car/train/car_0136.off car/train/car_0137.off car/train/car_0138.off car/train/car_0139.off car/train/car_0140.off car/train/car_0141.off car/train/car_0142.off car/train/car_0143.off car/train/car_0144.off car/train/car_0145.off car/train/car_0146.off car/train/car_0147.off car/train/car_0148.off car/train/car_0149.off car/train/car_0150.off car/train/car_0151.off car/train/car_0152.off car/train/car_0153.off car/train/car_0154.off car/train/car_0155.off car/train/car_0156.off car/train/car_0157.off car/train/car_0158.off car/train/car_0159.off car/train/car_0160.off car/train/car_0161.off car/train/car_0162.off car/train/car_0163.off car/train/car_0164.off car/train/car_0165.off car/train/car_0166.off car/train/car_0167.off car/train/car_0168.off car/train/car_0169.off car/train/car_0170.off car/train/car_0171.off car/train/car_0172.off car/train/car_0173.off car/train/car_0174.off car/train/car_0175.off car/train/car_0176.off car/train/car_0177.off car/train/car_0178.off dresser/train/dresser_0001.off dresser/train/dresser_0002.off dresser/train/dresser_0003.off dresser/train/dresser_0004.off dresser/train/dresser_0005.off dresser/train/dresser_0006.off dresser/train/dresser_0007.off dresser/train/dresser_0008.off dresser/train/dresser_0009.off dresser/train/dresser_0010.off dresser/train/dresser_0011.off dresser/train/dresser_0012.off dresser/train/dresser_0013.off dresser/train/dresser_0014.off dresser/train/dresser_0015.off dresser/train/dresser_0016.off dresser/train/dresser_0017.off dresser/train/dresser_0018.off dresser/train/dresser_0019.off dresser/train/dresser_0020.off dresser/train/dresser_0021.off dresser/train/dresser_0022.off dresser/train/dresser_0023.off dresser/train/dresser_0024.off dresser/train/dresser_0025.off dresser/train/dresser_0026.off dresser/train/dresser_0027.off dresser/train/dresser_0028.off dresser/train/dresser_0029.off dresser/train/dresser_0030.off dresser/train/dresser_0031.off dresser/train/dresser_0032.off dresser/train/dresser_0033.off dresser/train/dresser_0034.off dresser/train/dresser_0035.off dresser/train/dresser_0036.off dresser/train/dresser_0037.off dresser/train/dresser_0038.off dresser/train/dresser_0039.off dresser/train/dresser_0040.off dresser/train/dresser_0041.off dresser/train/dresser_0042.off dresser/train/dresser_0043.off dresser/train/dresser_0044.off dresser/train/dresser_0045.off dresser/train/dresser_0046.off dresser/train/dresser_0047.off dresser/train/dresser_0048.off dresser/train/dresser_0049.off dresser/train/dresser_0050.off dresser/train/dresser_0051.off dresser/train/dresser_0052.off dresser/train/dresser_0053.off dresser/train/dresser_0054.off dresser/train/dresser_0055.off dresser/train/dresser_0056.off dresser/train/dresser_0057.off dresser/train/dresser_0058.off dresser/train/dresser_0059.off dresser/train/dresser_0060.off dresser/train/dresser_0061.off dresser/train/dresser_0062.off dresser/train/dresser_0063.off dresser/train/dresser_0064.off dresser/train/dresser_0065.off dresser/train/dresser_0066.off dresser/train/dresser_0067.off dresser/train/dresser_0068.off dresser/train/dresser_0069.off dresser/train/dresser_0070.off dresser/train/dresser_0071.off dresser/train/dresser_0072.off dresser/train/dresser_0073.off dresser/train/dresser_0074.off dresser/train/dresser_0075.off dresser/train/dresser_0076.off dresser/train/dresser_0077.off dresser/train/dresser_0078.off dresser/train/dresser_0079.off dresser/train/dresser_0080.off dresser/train/dresser_0081.off dresser/train/dresser_0082.off dresser/train/dresser_0083.off dresser/train/dresser_0084.off dresser/train/dresser_0085.off dresser/train/dresser_0086.off dresser/train/dresser_0087.off dresser/train/dresser_0088.off dresser/train/dresser_0089.off dresser/train/dresser_0090.off dresser/train/dresser_0091.off dresser/train/dresser_0092.off dresser/train/dresser_0093.off dresser/train/dresser_0094.off dresser/train/dresser_0095.off dresser/train/dresser_0096.off dresser/train/dresser_0097.off dresser/train/dresser_0098.off dresser/train/dresser_0099.off dresser/train/dresser_0100.off dresser/train/dresser_0101.off dresser/train/dresser_0102.off dresser/train/dresser_0103.off dresser/train/dresser_0104.off dresser/train/dresser_0105.off dresser/train/dresser_0106.off dresser/train/dresser_0107.off dresser/train/dresser_0108.off dresser/train/dresser_0109.off dresser/train/dresser_0110.off dresser/train/dresser_0111.off dresser/train/dresser_0112.off dresser/train/dresser_0113.off dresser/train/dresser_0114.off dresser/train/dresser_0115.off dresser/train/dresser_0116.off dresser/train/dresser_0117.off dresser/train/dresser_0118.off dresser/train/dresser_0119.off dresser/train/dresser_0120.off dresser/train/dresser_0121.off dresser/train/dresser_0122.off dresser/train/dresser_0123.off dresser/train/dresser_0124.off dresser/train/dresser_0125.off dresser/train/dresser_0126.off dresser/train/dresser_0127.off dresser/train/dresser_0128.off dresser/train/dresser_0129.off dresser/train/dresser_0130.off dresser/train/dresser_0131.off dresser/train/dresser_0132.off dresser/train/dresser_0133.off dresser/train/dresser_0134.off dresser/train/dresser_0135.off dresser/train/dresser_0136.off dresser/train/dresser_0137.off dresser/train/dresser_0138.off dresser/train/dresser_0139.off dresser/train/dresser_0140.off dresser/train/dresser_0141.off dresser/train/dresser_0142.off dresser/train/dresser_0143.off dresser/train/dresser_0144.off dresser/train/dresser_0145.off dresser/train/dresser_0146.off dresser/train/dresser_0147.off dresser/train/dresser_0148.off dresser/train/dresser_0149.off dresser/train/dresser_0150.off dresser/train/dresser_0151.off dresser/train/dresser_0152.off dresser/train/dresser_0153.off dresser/train/dresser_0154.off dresser/train/dresser_0155.off dresser/train/dresser_0156.off dresser/train/dresser_0157.off dresser/train/dresser_0158.off dresser/train/dresser_0159.off dresser/train/dresser_0160.off dresser/train/dresser_0161.off dresser/train/dresser_0162.off dresser/train/dresser_0163.off dresser/train/dresser_0164.off dresser/train/dresser_0165.off dresser/train/dresser_0166.off dresser/train/dresser_0167.off dresser/train/dresser_0168.off dresser/train/dresser_0169.off dresser/train/dresser_0170.off dresser/train/dresser_0171.off dresser/train/dresser_0172.off dresser/train/dresser_0173.off dresser/train/dresser_0174.off dresser/train/dresser_0175.off dresser/train/dresser_0176.off dresser/train/dresser_0177.off dresser/train/dresser_0178.off dresser/train/dresser_0179.off dresser/train/dresser_0180.off toilet/train/toilet_0001.off toilet/train/toilet_0002.off toilet/train/toilet_0003.off toilet/train/toilet_0004.off toilet/train/toilet_0005.off toilet/train/toilet_0006.off toilet/train/toilet_0007.off toilet/train/toilet_0008.off toilet/train/toilet_0009.off toilet/train/toilet_0010.off toilet/train/toilet_0011.off toilet/train/toilet_0012.off toilet/train/toilet_0013.off toilet/train/toilet_0014.off toilet/train/toilet_0015.off toilet/train/toilet_0016.off toilet/train/toilet_0017.off toilet/train/toilet_0018.off toilet/train/toilet_0019.off toilet/train/toilet_0020.off toilet/train/toilet_0021.off toilet/train/toilet_0022.off toilet/train/toilet_0023.off toilet/train/toilet_0024.off toilet/train/toilet_0025.off toilet/train/toilet_0026.off toilet/train/toilet_0027.off toilet/train/toilet_0028.off toilet/train/toilet_0029.off toilet/train/toilet_0030.off toilet/train/toilet_0031.off toilet/train/toilet_0032.off toilet/train/toilet_0033.off toilet/train/toilet_0034.off toilet/train/toilet_0035.off toilet/train/toilet_0036.off toilet/train/toilet_0037.off toilet/train/toilet_0038.off toilet/train/toilet_0039.off toilet/train/toilet_0040.off toilet/train/toilet_0041.off toilet/train/toilet_0042.off toilet/train/toilet_0043.off toilet/train/toilet_0044.off toilet/train/toilet_0045.off toilet/train/toilet_0046.off toilet/train/toilet_0047.off toilet/train/toilet_0048.off toilet/train/toilet_0049.off toilet/train/toilet_0050.off toilet/train/toilet_0051.off toilet/train/toilet_0052.off toilet/train/toilet_0053.off toilet/train/toilet_0054.off toilet/train/toilet_0055.off toilet/train/toilet_0056.off toilet/train/toilet_0057.off toilet/train/toilet_0058.off toilet/train/toilet_0059.off toilet/train/toilet_0060.off toilet/train/toilet_0061.off toilet/train/toilet_0062.off toilet/train/toilet_0063.off toilet/train/toilet_0064.off toilet/train/toilet_0065.off toilet/train/toilet_0066.off toilet/train/toilet_0067.off toilet/train/toilet_0068.off toilet/train/toilet_0069.off toilet/train/toilet_0070.off toilet/train/toilet_0071.off toilet/train/toilet_0072.off toilet/train/toilet_0073.off toilet/train/toilet_0074.off toilet/train/toilet_0075.off toilet/train/toilet_0076.off toilet/train/toilet_0077.off toilet/train/toilet_0078.off toilet/train/toilet_0079.off toilet/train/toilet_0080.off toilet/train/toilet_0081.off toilet/train/toilet_0082.off toilet/train/toilet_0083.off toilet/train/toilet_0084.off toilet/train/toilet_0085.off toilet/train/toilet_0086.off toilet/train/toilet_0087.off toilet/train/toilet_0088.off toilet/train/toilet_0089.off toilet/train/toilet_0090.off toilet/train/toilet_0091.off toilet/train/toilet_0092.off toilet/train/toilet_0093.off toilet/train/toilet_0094.off toilet/train/toilet_0095.off toilet/train/toilet_0096.off toilet/train/toilet_0097.off toilet/train/toilet_0098.off toilet/train/toilet_0099.off toilet/train/toilet_0100.off toilet/train/toilet_0101.off toilet/train/toilet_0102.off toilet/train/toilet_0103.off toilet/train/toilet_0104.off toilet/train/toilet_0105.off toilet/train/toilet_0106.off toilet/train/toilet_0107.off toilet/train/toilet_0108.off toilet/train/toilet_0109.off toilet/train/toilet_0110.off toilet/train/toilet_0111.off toilet/train/toilet_0112.off toilet/train/toilet_0113.off toilet/train/toilet_0114.off toilet/train/toilet_0115.off toilet/train/toilet_0116.off toilet/train/toilet_0117.off toilet/train/toilet_0118.off toilet/train/toilet_0119.off toilet/train/toilet_0120.off toilet/train/toilet_0121.off toilet/train/toilet_0122.off toilet/train/toilet_0123.off toilet/train/toilet_0124.off toilet/train/toilet_0125.off toilet/train/toilet_0126.off toilet/train/toilet_0127.off toilet/train/toilet_0128.off toilet/train/toilet_0129.off toilet/train/toilet_0130.off toilet/train/toilet_0131.off toilet/train/toilet_0132.off toilet/train/toilet_0133.off toilet/train/toilet_0134.off toilet/train/toilet_0135.off toilet/train/toilet_0136.off toilet/train/toilet_0137.off toilet/train/toilet_0138.off toilet/train/toilet_0139.off toilet/train/toilet_0140.off toilet/train/toilet_0141.off toilet/train/toilet_0142.off toilet/train/toilet_0143.off toilet/train/toilet_0144.off toilet/train/toilet_0145.off toilet/train/toilet_0146.off toilet/train/toilet_0147.off toilet/train/toilet_0148.off toilet/train/toilet_0149.off toilet/train/toilet_0150.off toilet/train/toilet_0151.off toilet/train/toilet_0152.off toilet/train/toilet_0153.off toilet/train/toilet_0154.off toilet/train/toilet_0155.off toilet/train/toilet_0156.off toilet/train/toilet_0157.off toilet/train/toilet_0158.off toilet/train/toilet_0159.off toilet/train/toilet_0160.off toilet/train/toilet_0161.off toilet/train/toilet_0162.off toilet/train/toilet_0163.off toilet/train/toilet_0164.off toilet/train/toilet_0165.off toilet/train/toilet_0166.off toilet/train/toilet_0167.off toilet/train/toilet_0168.off toilet/train/toilet_0169.off toilet/train/toilet_0170.off toilet/train/toilet_0171.off toilet/train/toilet_0172.off toilet/train/toilet_0173.off toilet/train/toilet_0174.off toilet/train/toilet_0175.off toilet/train/toilet_0176.off toilet/train/toilet_0177.off toilet/train/toilet_0178.off toilet/train/toilet_0179.off toilet/train/toilet_0180.off toilet/train/toilet_0181.off toilet/train/toilet_0182.off toilet/train/toilet_0183.off toilet/train/toilet_0184.off toilet/train/toilet_0185.off toilet/train/toilet_0186.off toilet/train/toilet_0187.off toilet/train/toilet_0188.off toilet/train/toilet_0189.off toilet/train/toilet_0190.off toilet/train/toilet_0191.off toilet/train/toilet_0192.off toilet/train/toilet_0193.off toilet/train/toilet_0194.off toilet/train/toilet_0195.off toilet/train/toilet_0196.off toilet/train/toilet_0197.off toilet/train/toilet_0198.off toilet/train/toilet_0199.off toilet/train/toilet_0200.off toilet/train/toilet_0201.off toilet/train/toilet_0202.off toilet/train/toilet_0203.off toilet/train/toilet_0204.off toilet/train/toilet_0205.off toilet/train/toilet_0206.off toilet/train/toilet_0207.off toilet/train/toilet_0208.off toilet/train/toilet_0209.off toilet/train/toilet_0210.off toilet/train/toilet_0211.off toilet/train/toilet_0212.off toilet/train/toilet_0213.off toilet/train/toilet_0214.off toilet/train/toilet_0215.off toilet/train/toilet_0216.off toilet/train/toilet_0217.off toilet/train/toilet_0218.off toilet/train/toilet_0219.off toilet/train/toilet_0220.off toilet/train/toilet_0221.off toilet/train/toilet_0222.off toilet/train/toilet_0223.off toilet/train/toilet_0224.off toilet/train/toilet_0225.off toilet/train/toilet_0226.off toilet/train/toilet_0227.off toilet/train/toilet_0228.off toilet/train/toilet_0229.off toilet/train/toilet_0230.off toilet/train/toilet_0231.off toilet/train/toilet_0232.off toilet/train/toilet_0233.off toilet/train/toilet_0234.off toilet/train/toilet_0235.off toilet/train/toilet_0236.off toilet/train/toilet_0237.off toilet/train/toilet_0238.off toilet/train/toilet_0239.off toilet/train/toilet_0240.off toilet/train/toilet_0241.off toilet/train/toilet_0242.off toilet/train/toilet_0243.off toilet/train/toilet_0244.off toilet/train/toilet_0245.off toilet/train/toilet_0246.off toilet/train/toilet_0247.off toilet/train/toilet_0248.off toilet/train/toilet_0249.off toilet/train/toilet_0250.off toilet/train/toilet_0251.off toilet/train/toilet_0252.off toilet/train/toilet_0253.off toilet/train/toilet_0254.off toilet/train/toilet_0255.off toilet/train/toilet_0256.off toilet/train/toilet_0257.off toilet/train/toilet_0258.off toilet/train/toilet_0259.off toilet/train/toilet_0260.off toilet/train/toilet_0261.off toilet/train/toilet_0262.off toilet/train/toilet_0263.off toilet/train/toilet_0264.off toilet/train/toilet_0265.off toilet/train/toilet_0266.off toilet/train/toilet_0267.off toilet/train/toilet_0268.off toilet/train/toilet_0269.off toilet/train/toilet_0270.off toilet/train/toilet_0271.off toilet/train/toilet_0272.off toilet/train/toilet_0273.off toilet/train/toilet_0274.off toilet/train/toilet_0275.off toilet/train/toilet_0276.off toilet/train/toilet_0277.off toilet/train/toilet_0278.off toilet/train/toilet_0279.off toilet/train/toilet_0280.off toilet/train/toilet_0281.off toilet/train/toilet_0282.off toilet/train/toilet_0283.off toilet/train/toilet_0284.off toilet/train/toilet_0285.off toilet/train/toilet_0286.off toilet/train/toilet_0287.off toilet/train/toilet_0288.off toilet/train/toilet_0289.off toilet/train/toilet_0290.off toilet/train/toilet_0291.off toilet/train/toilet_0292.off toilet/train/toilet_0293.off toilet/train/toilet_0294.off toilet/train/toilet_0295.off toilet/train/toilet_0296.off toilet/train/toilet_0297.off toilet/train/toilet_0298.off toilet/train/toilet_0299.off toilet/train/toilet_0300.off toilet/train/toilet_0301.off toilet/train/toilet_0302.off toilet/train/toilet_0303.off toilet/train/toilet_0304.off toilet/train/toilet_0305.off toilet/train/toilet_0306.off toilet/train/toilet_0307.off toilet/train/toilet_0308.off toilet/train/toilet_0309.off toilet/train/toilet_0310.off curtain/train/curtain_0001.off curtain/train/curtain_0002.off curtain/train/curtain_0003.off curtain/train/curtain_0004.off curtain/train/curtain_0005.off curtain/train/curtain_0006.off curtain/train/curtain_0007.off curtain/train/curtain_0008.off curtain/train/curtain_0009.off curtain/train/curtain_0010.off curtain/train/curtain_0011.off curtain/train/curtain_0012.off curtain/train/curtain_0013.off curtain/train/curtain_0014.off curtain/train/curtain_0015.off curtain/train/curtain_0016.off curtain/train/curtain_0017.off curtain/train/curtain_0018.off curtain/train/curtain_0019.off curtain/train/curtain_0020.off curtain/train/curtain_0021.off curtain/train/curtain_0022.off curtain/train/curtain_0023.off curtain/train/curtain_0024.off curtain/train/curtain_0025.off curtain/train/curtain_0026.off curtain/train/curtain_0027.off curtain/train/curtain_0028.off curtain/train/curtain_0029.off curtain/train/curtain_0030.off curtain/train/curtain_0031.off curtain/train/curtain_0032.off curtain/train/curtain_0033.off curtain/train/curtain_0034.off curtain/train/curtain_0035.off curtain/train/curtain_0036.off curtain/train/curtain_0037.off curtain/train/curtain_0038.off curtain/train/curtain_0039.off curtain/train/curtain_0040.off curtain/train/curtain_0041.off curtain/train/curtain_0042.off curtain/train/curtain_0043.off curtain/train/curtain_0044.off curtain/train/curtain_0045.off curtain/train/curtain_0046.off curtain/train/curtain_0047.off curtain/train/curtain_0048.off curtain/train/curtain_0049.off curtain/train/curtain_0050.off curtain/train/curtain_0051.off curtain/train/curtain_0052.off curtain/train/curtain_0053.off curtain/train/curtain_0054.off curtain/train/curtain_0055.off curtain/train/curtain_0056.off curtain/train/curtain_0057.off curtain/train/curtain_0058.off curtain/train/curtain_0059.off curtain/train/curtain_0060.off curtain/train/curtain_0061.off curtain/train/curtain_0062.off curtain/train/curtain_0063.off curtain/train/curtain_0064.off curtain/train/curtain_0065.off curtain/train/curtain_0066.off curtain/train/curtain_0067.off curtain/train/curtain_0068.off curtain/train/curtain_0069.off curtain/train/curtain_0070.off curtain/train/curtain_0071.off curtain/train/curtain_0072.off curtain/train/curtain_0073.off curtain/train/curtain_0074.off curtain/train/curtain_0075.off curtain/train/curtain_0076.off curtain/train/curtain_0077.off curtain/train/curtain_0078.off curtain/train/curtain_0079.off curtain/train/curtain_0080.off curtain/train/curtain_0081.off curtain/train/curtain_0082.off curtain/train/curtain_0083.off curtain/train/curtain_0084.off curtain/train/curtain_0085.off curtain/train/curtain_0086.off curtain/train/curtain_0087.off curtain/train/curtain_0088.off curtain/train/curtain_0089.off curtain/train/curtain_0090.off curtain/train/curtain_0091.off curtain/train/curtain_0092.off curtain/train/curtain_0093.off curtain/train/curtain_0094.off curtain/train/curtain_0095.off curtain/train/curtain_0096.off curtain/train/curtain_0097.off curtain/train/curtain_0098.off curtain/train/curtain_0099.off curtain/train/curtain_0100.off curtain/train/curtain_0101.off curtain/train/curtain_0102.off curtain/train/curtain_0103.off curtain/train/curtain_0104.off curtain/train/curtain_0105.off curtain/train/curtain_0106.off curtain/train/curtain_0107.off curtain/train/curtain_0108.off curtain/train/curtain_0109.off curtain/train/curtain_0110.off curtain/train/curtain_0111.off curtain/train/curtain_0112.off curtain/train/curtain_0113.off curtain/train/curtain_0114.off curtain/train/curtain_0115.off curtain/train/curtain_0116.off curtain/train/curtain_0117.off curtain/train/curtain_0118.off curtain/train/curtain_0119.off curtain/train/curtain_0120.off curtain/train/curtain_0121.off curtain/train/curtain_0122.off curtain/train/curtain_0123.off curtain/train/curtain_0124.off curtain/train/curtain_0125.off wardrobe/train/wardrobe_0001.off wardrobe/train/wardrobe_0002.off wardrobe/train/wardrobe_0003.off wardrobe/train/wardrobe_0004.off wardrobe/train/wardrobe_0005.off wardrobe/train/wardrobe_0006.off wardrobe/train/wardrobe_0007.off wardrobe/train/wardrobe_0008.off wardrobe/train/wardrobe_0009.off wardrobe/train/wardrobe_0010.off wardrobe/train/wardrobe_0011.off wardrobe/train/wardrobe_0012.off wardrobe/train/wardrobe_0013.off wardrobe/train/wardrobe_0014.off wardrobe/train/wardrobe_0015.off wardrobe/train/wardrobe_0016.off wardrobe/train/wardrobe_0017.off wardrobe/train/wardrobe_0018.off wardrobe/train/wardrobe_0019.off wardrobe/train/wardrobe_0020.off wardrobe/train/wardrobe_0021.off wardrobe/train/wardrobe_0022.off wardrobe/train/wardrobe_0023.off wardrobe/train/wardrobe_0024.off wardrobe/train/wardrobe_0025.off wardrobe/train/wardrobe_0026.off wardrobe/train/wardrobe_0027.off wardrobe/train/wardrobe_0028.off wardrobe/train/wardrobe_0029.off wardrobe/train/wardrobe_0030.off wardrobe/train/wardrobe_0031.off wardrobe/train/wardrobe_0032.off wardrobe/train/wardrobe_0033.off wardrobe/train/wardrobe_0034.off wardrobe/train/wardrobe_0035.off wardrobe/train/wardrobe_0036.off wardrobe/train/wardrobe_0037.off wardrobe/train/wardrobe_0038.off wardrobe/train/wardrobe_0039.off wardrobe/train/wardrobe_0040.off wardrobe/train/wardrobe_0041.off wardrobe/train/wardrobe_0042.off wardrobe/train/wardrobe_0043.off wardrobe/train/wardrobe_0044.off wardrobe/train/wardrobe_0045.off wardrobe/train/wardrobe_0046.off wardrobe/train/wardrobe_0047.off wardrobe/train/wardrobe_0048.off wardrobe/train/wardrobe_0049.off wardrobe/train/wardrobe_0050.off wardrobe/train/wardrobe_0051.off wardrobe/train/wardrobe_0052.off wardrobe/train/wardrobe_0053.off wardrobe/train/wardrobe_0054.off wardrobe/train/wardrobe_0055.off wardrobe/train/wardrobe_0056.off wardrobe/train/wardrobe_0057.off wardrobe/train/wardrobe_0058.off wardrobe/train/wardrobe_0059.off wardrobe/train/wardrobe_0060.off wardrobe/train/wardrobe_0061.off wardrobe/train/wardrobe_0062.off wardrobe/train/wardrobe_0063.off wardrobe/train/wardrobe_0064.off wardrobe/train/wardrobe_0065.off wardrobe/train/wardrobe_0066.off wardrobe/train/wardrobe_0067.off wardrobe/train/wardrobe_0068.off wardrobe/train/wardrobe_0069.off wardrobe/train/wardrobe_0070.off wardrobe/train/wardrobe_0071.off wardrobe/train/wardrobe_0072.off wardrobe/train/wardrobe_0073.off wardrobe/train/wardrobe_0074.off wardrobe/train/wardrobe_0075.off wardrobe/train/wardrobe_0076.off wardrobe/train/wardrobe_0077.off wardrobe/train/wardrobe_0078.off wardrobe/train/wardrobe_0079.off stool/train/stool_0001.off stool/train/stool_0002.off stool/train/stool_0003.off stool/train/stool_0004.off stool/train/stool_0005.off stool/train/stool_0006.off stool/train/stool_0007.off stool/train/stool_0008.off stool/train/stool_0009.off stool/train/stool_0010.off stool/train/stool_0011.off stool/train/stool_0012.off stool/train/stool_0013.off stool/train/stool_0014.off stool/train/stool_0015.off stool/train/stool_0016.off stool/train/stool_0017.off stool/train/stool_0018.off stool/train/stool_0019.off stool/train/stool_0020.off stool/train/stool_0021.off stool/train/stool_0022.off stool/train/stool_0023.off stool/train/stool_0024.off stool/train/stool_0025.off stool/train/stool_0026.off stool/train/stool_0027.off stool/train/stool_0028.off stool/train/stool_0029.off stool/train/stool_0030.off stool/train/stool_0031.off stool/train/stool_0032.off stool/train/stool_0033.off stool/train/stool_0034.off stool/train/stool_0035.off stool/train/stool_0036.off stool/train/stool_0037.off stool/train/stool_0038.off stool/train/stool_0039.off stool/train/stool_0040.off stool/train/stool_0041.off stool/train/stool_0042.off stool/train/stool_0043.off stool/train/stool_0044.off stool/train/stool_0045.off stool/train/stool_0046.off stool/train/stool_0047.off stool/train/stool_0048.off stool/train/stool_0049.off stool/train/stool_0050.off stool/train/stool_0051.off stool/train/stool_0052.off stool/train/stool_0053.off stool/train/stool_0054.off stool/train/stool_0055.off stool/train/stool_0056.off stool/train/stool_0057.off stool/train/stool_0058.off stool/train/stool_0059.off stool/train/stool_0060.off stool/train/stool_0061.off stool/train/stool_0062.off stool/train/stool_0063.off stool/train/stool_0064.off stool/train/stool_0065.off stool/train/stool_0066.off stool/train/stool_0067.off stool/train/stool_0068.off stool/train/stool_0069.off stool/train/stool_0070.off stool/train/stool_0071.off stool/train/stool_0072.off stool/train/stool_0073.off stool/train/stool_0074.off stool/train/stool_0075.off stool/train/stool_0076.off stool/train/stool_0077.off stool/train/stool_0078.off stool/train/stool_0079.off stool/train/stool_0080.off stool/train/stool_0081.off mantel/train/mantel_0001.off mantel/train/mantel_0002.off mantel/train/mantel_0003.off mantel/train/mantel_0004.off mantel/train/mantel_0005.off mantel/train/mantel_0006.off mantel/train/mantel_0007.off mantel/train/mantel_0008.off mantel/train/mantel_0009.off mantel/train/mantel_0010.off mantel/train/mantel_0011.off mantel/train/mantel_0012.off mantel/train/mantel_0013.off mantel/train/mantel_0014.off mantel/train/mantel_0015.off mantel/train/mantel_0016.off mantel/train/mantel_0017.off mantel/train/mantel_0018.off mantel/train/mantel_0019.off mantel/train/mantel_0020.off mantel/train/mantel_0021.off mantel/train/mantel_0022.off mantel/train/mantel_0023.off mantel/train/mantel_0024.off mantel/train/mantel_0025.off mantel/train/mantel_0026.off mantel/train/mantel_0027.off mantel/train/mantel_0028.off mantel/train/mantel_0029.off mantel/train/mantel_0030.off mantel/train/mantel_0031.off mantel/train/mantel_0032.off mantel/train/mantel_0033.off mantel/train/mantel_0034.off mantel/train/mantel_0035.off mantel/train/mantel_0036.off mantel/train/mantel_0037.off mantel/train/mantel_0038.off mantel/train/mantel_0039.off mantel/train/mantel_0040.off mantel/train/mantel_0041.off mantel/train/mantel_0042.off mantel/train/mantel_0043.off mantel/train/mantel_0044.off mantel/train/mantel_0045.off mantel/train/mantel_0046.off mantel/train/mantel_0047.off mantel/train/mantel_0048.off mantel/train/mantel_0049.off mantel/train/mantel_0050.off mantel/train/mantel_0051.off mantel/train/mantel_0052.off mantel/train/mantel_0053.off mantel/train/mantel_0054.off mantel/train/mantel_0055.off mantel/train/mantel_0056.off mantel/train/mantel_0057.off mantel/train/mantel_0058.off mantel/train/mantel_0059.off mantel/train/mantel_0060.off mantel/train/mantel_0061.off mantel/train/mantel_0062.off mantel/train/mantel_0063.off mantel/train/mantel_0064.off mantel/train/mantel_0065.off mantel/train/mantel_0066.off mantel/train/mantel_0067.off mantel/train/mantel_0068.off mantel/train/mantel_0069.off mantel/train/mantel_0070.off mantel/train/mantel_0071.off mantel/train/mantel_0072.off mantel/train/mantel_0073.off mantel/train/mantel_0074.off mantel/train/mantel_0075.off mantel/train/mantel_0076.off mantel/train/mantel_0077.off mantel/train/mantel_0078.off mantel/train/mantel_0079.off mantel/train/mantel_0080.off mantel/train/mantel_0081.off mantel/train/mantel_0082.off mantel/train/mantel_0083.off mantel/train/mantel_0084.off mantel/train/mantel_0085.off mantel/train/mantel_0086.off mantel/train/mantel_0087.off mantel/train/mantel_0088.off mantel/train/mantel_0089.off mantel/train/mantel_0090.off mantel/train/mantel_0091.off mantel/train/mantel_0092.off mantel/train/mantel_0093.off mantel/train/mantel_0094.off mantel/train/mantel_0095.off mantel/train/mantel_0096.off mantel/train/mantel_0097.off mantel/train/mantel_0098.off mantel/train/mantel_0099.off mantel/train/mantel_0100.off mantel/train/mantel_0101.off mantel/train/mantel_0102.off mantel/train/mantel_0103.off mantel/train/mantel_0104.off mantel/train/mantel_0105.off mantel/train/mantel_0106.off mantel/train/mantel_0107.off mantel/train/mantel_0108.off mantel/train/mantel_0109.off mantel/train/mantel_0110.off mantel/train/mantel_0111.off mantel/train/mantel_0112.off mantel/train/mantel_0113.off mantel/train/mantel_0114.off mantel/train/mantel_0115.off mantel/train/mantel_0116.off mantel/train/mantel_0117.off mantel/train/mantel_0118.off mantel/train/mantel_0119.off mantel/train/mantel_0120.off mantel/train/mantel_0121.off mantel/train/mantel_0122.off mantel/train/mantel_0123.off mantel/train/mantel_0124.off mantel/train/mantel_0125.off mantel/train/mantel_0126.off mantel/train/mantel_0127.off mantel/train/mantel_0128.off mantel/train/mantel_0129.off mantel/train/mantel_0130.off mantel/train/mantel_0131.off mantel/train/mantel_0132.off mantel/train/mantel_0133.off mantel/train/mantel_0134.off mantel/train/mantel_0135.off mantel/train/mantel_0136.off mantel/train/mantel_0137.off mantel/train/mantel_0138.off mantel/train/mantel_0139.off mantel/train/mantel_0140.off mantel/train/mantel_0141.off mantel/train/mantel_0142.off mantel/train/mantel_0143.off mantel/train/mantel_0144.off mantel/train/mantel_0145.off mantel/train/mantel_0146.off mantel/train/mantel_0147.off mantel/train/mantel_0148.off mantel/train/mantel_0149.off mantel/train/mantel_0150.off mantel/train/mantel_0151.off mantel/train/mantel_0152.off mantel/train/mantel_0153.off mantel/train/mantel_0154.off mantel/train/mantel_0155.off mantel/train/mantel_0156.off mantel/train/mantel_0157.off mantel/train/mantel_0158.off mantel/train/mantel_0159.off mantel/train/mantel_0160.off mantel/train/mantel_0161.off mantel/train/mantel_0162.off mantel/train/mantel_0163.off mantel/train/mantel_0164.off mantel/train/mantel_0165.off mantel/train/mantel_0166.off mantel/train/mantel_0167.off mantel/train/mantel_0168.off mantel/train/mantel_0169.off mantel/train/mantel_0170.off mantel/train/mantel_0171.off mantel/train/mantel_0172.off mantel/train/mantel_0173.off mantel/train/mantel_0174.off mantel/train/mantel_0175.off mantel/train/mantel_0176.off mantel/train/mantel_0177.off mantel/train/mantel_0178.off mantel/train/mantel_0179.off mantel/train/mantel_0180.off mantel/train/mantel_0181.off mantel/train/mantel_0182.off mantel/train/mantel_0183.off mantel/train/mantel_0184.off mantel/train/mantel_0185.off mantel/train/mantel_0186.off mantel/train/mantel_0187.off mantel/train/mantel_0188.off mantel/train/mantel_0189.off mantel/train/mantel_0190.off mantel/train/mantel_0191.off mantel/train/mantel_0192.off mantel/train/mantel_0193.off mantel/train/mantel_0194.off mantel/train/mantel_0195.off mantel/train/mantel_0196.off mantel/train/mantel_0197.off mantel/train/mantel_0198.off mantel/train/mantel_0199.off mantel/train/mantel_0200.off mantel/train/mantel_0201.off mantel/train/mantel_0202.off mantel/train/mantel_0203.off mantel/train/mantel_0204.off mantel/train/mantel_0205.off mantel/train/mantel_0206.off mantel/train/mantel_0207.off mantel/train/mantel_0208.off mantel/train/mantel_0209.off mantel/train/mantel_0210.off mantel/train/mantel_0211.off mantel/train/mantel_0212.off mantel/train/mantel_0213.off mantel/train/mantel_0214.off mantel/train/mantel_0215.off mantel/train/mantel_0216.off mantel/train/mantel_0217.off mantel/train/mantel_0218.off mantel/train/mantel_0219.off mantel/train/mantel_0220.off mantel/train/mantel_0221.off mantel/train/mantel_0222.off mantel/train/mantel_0223.off mantel/train/mantel_0224.off mantel/train/mantel_0225.off mantel/train/mantel_0226.off mantel/train/mantel_0227.off mantel/train/mantel_0228.off mantel/train/mantel_0229.off mantel/train/mantel_0230.off mantel/train/mantel_0231.off mantel/train/mantel_0232.off mantel/train/mantel_0233.off mantel/train/mantel_0234.off mantel/train/mantel_0235.off mantel/train/mantel_0236.off mantel/train/mantel_0237.off mantel/train/mantel_0238.off mantel/train/mantel_0239.off mantel/train/mantel_0240.off mantel/train/mantel_0241.off mantel/train/mantel_0242.off mantel/train/mantel_0243.off mantel/train/mantel_0244.off mantel/train/mantel_0245.off mantel/train/mantel_0246.off mantel/train/mantel_0247.off mantel/train/mantel_0248.off mantel/train/mantel_0249.off mantel/train/mantel_0250.off mantel/train/mantel_0251.off mantel/train/mantel_0252.off mantel/train/mantel_0253.off mantel/train/mantel_0254.off mantel/train/mantel_0255.off mantel/train/mantel_0256.off cup/train/cup_0001.off cup/train/cup_0002.off cup/train/cup_0003.off cup/train/cup_0004.off cup/train/cup_0005.off cup/train/cup_0006.off cup/train/cup_0007.off cup/train/cup_0008.off cup/train/cup_0009.off cup/train/cup_0010.off cup/train/cup_0011.off cup/train/cup_0012.off cup/train/cup_0013.off cup/train/cup_0014.off cup/train/cup_0015.off cup/train/cup_0016.off cup/train/cup_0017.off cup/train/cup_0018.off cup/train/cup_0019.off cup/train/cup_0020.off cup/train/cup_0021.off cup/train/cup_0022.off cup/train/cup_0023.off cup/train/cup_0024.off cup/train/cup_0025.off cup/train/cup_0026.off cup/train/cup_0027.off cup/train/cup_0028.off cup/train/cup_0029.off cup/train/cup_0030.off cup/train/cup_0031.off cup/train/cup_0032.off cup/train/cup_0033.off cup/train/cup_0034.off cup/train/cup_0035.off cup/train/cup_0036.off cup/train/cup_0037.off cup/train/cup_0038.off cup/train/cup_0039.off cup/train/cup_0040.off cup/train/cup_0041.off cup/train/cup_0042.off cup/train/cup_0043.off cup/train/cup_0044.off cup/train/cup_0045.off cup/train/cup_0046.off cup/train/cup_0047.off cup/train/cup_0048.off cup/train/cup_0049.off cup/train/cup_0050.off cup/train/cup_0051.off cup/train/cup_0052.off cup/train/cup_0053.off cup/train/cup_0054.off cup/train/cup_0055.off cup/train/cup_0056.off cup/train/cup_0057.off cup/train/cup_0058.off cup/train/cup_0059.off cup/train/cup_0060.off cup/train/cup_0061.off cup/train/cup_0062.off cup/train/cup_0063.off cup/train/cup_0064.off cup/train/cup_0065.off cup/train/cup_0066.off cup/train/cup_0067.off cup/train/cup_0068.off cup/train/cup_0069.off cup/train/cup_0070.off cup/train/cup_0071.off cup/train/cup_0072.off radio/train/radio_0001.off radio/train/radio_0002.off radio/train/radio_0003.off radio/train/radio_0004.off radio/train/radio_0005.off radio/train/radio_0006.off radio/train/radio_0007.off radio/train/radio_0008.off radio/train/radio_0009.off radio/train/radio_0010.off radio/train/radio_0011.off radio/train/radio_0012.off radio/train/radio_0013.off radio/train/radio_0014.off radio/train/radio_0015.off radio/train/radio_0016.off radio/train/radio_0017.off radio/train/radio_0018.off radio/train/radio_0019.off radio/train/radio_0020.off radio/train/radio_0021.off radio/train/radio_0022.off radio/train/radio_0023.off radio/train/radio_0024.off radio/train/radio_0025.off radio/train/radio_0026.off radio/train/radio_0027.off radio/train/radio_0028.off radio/train/radio_0029.off radio/train/radio_0030.off radio/train/radio_0031.off radio/train/radio_0032.off radio/train/radio_0033.off radio/train/radio_0034.off radio/train/radio_0035.off radio/train/radio_0036.off radio/train/radio_0037.off radio/train/radio_0038.off radio/train/radio_0039.off radio/train/radio_0040.off radio/train/radio_0041.off radio/train/radio_0042.off radio/train/radio_0043.off radio/train/radio_0044.off radio/train/radio_0045.off radio/train/radio_0046.off radio/train/radio_0047.off radio/train/radio_0048.off radio/train/radio_0049.off radio/train/radio_0050.off radio/train/radio_0051.off radio/train/radio_0052.off radio/train/radio_0053.off radio/train/radio_0054.off radio/train/radio_0055.off radio/train/radio_0056.off radio/train/radio_0057.off radio/train/radio_0058.off radio/train/radio_0059.off radio/train/radio_0060.off radio/train/radio_0061.off radio/train/radio_0062.off radio/train/radio_0063.off radio/train/radio_0064.off radio/train/radio_0065.off radio/train/radio_0066.off radio/train/radio_0067.off radio/train/radio_0068.off radio/train/radio_0069.off radio/train/radio_0070.off radio/train/radio_0071.off radio/train/radio_0072.off radio/train/radio_0073.off radio/train/radio_0074.off radio/train/radio_0075.off radio/train/radio_0076.off radio/train/radio_0077.off radio/train/radio_0078.off radio/train/radio_0079.off radio/train/radio_0080.off radio/train/radio_0081.off radio/train/radio_0082.off radio/train/radio_0083.off radio/train/radio_0084.off radio/train/radio_0085.off radio/train/radio_0086.off radio/train/radio_0087.off radio/train/radio_0088.off radio/train/radio_0089.off radio/train/radio_0090.off radio/train/radio_0091.off radio/train/radio_0092.off radio/train/radio_0093.off radio/train/radio_0094.off airplane/train/airplane_0001.off airplane/train/airplane_0002.off airplane/train/airplane_0003.off airplane/train/airplane_0004.off airplane/train/airplane_0005.off airplane/train/airplane_0006.off airplane/train/airplane_0007.off airplane/train/airplane_0008.off airplane/train/airplane_0009.off airplane/train/airplane_0010.off airplane/train/airplane_0011.off airplane/train/airplane_0012.off airplane/train/airplane_0013.off airplane/train/airplane_0014.off airplane/train/airplane_0015.off airplane/train/airplane_0016.off airplane/train/airplane_0017.off airplane/train/airplane_0018.off airplane/train/airplane_0019.off airplane/train/airplane_0020.off airplane/train/airplane_0021.off airplane/train/airplane_0022.off airplane/train/airplane_0023.off airplane/train/airplane_0024.off airplane/train/airplane_0025.off airplane/train/airplane_0026.off airplane/train/airplane_0027.off airplane/train/airplane_0028.off airplane/train/airplane_0029.off airplane/train/airplane_0030.off airplane/train/airplane_0031.off airplane/train/airplane_0032.off airplane/train/airplane_0033.off airplane/train/airplane_0034.off airplane/train/airplane_0035.off airplane/train/airplane_0036.off airplane/train/airplane_0037.off airplane/train/airplane_0038.off airplane/train/airplane_0039.off airplane/train/airplane_0040.off airplane/train/airplane_0041.off airplane/train/airplane_0042.off airplane/train/airplane_0043.off airplane/train/airplane_0044.off airplane/train/airplane_0045.off airplane/train/airplane_0046.off airplane/train/airplane_0047.off airplane/train/airplane_0048.off airplane/train/airplane_0049.off airplane/train/airplane_0050.off airplane/train/airplane_0051.off airplane/train/airplane_0052.off airplane/train/airplane_0053.off airplane/train/airplane_0054.off airplane/train/airplane_0055.off airplane/train/airplane_0056.off airplane/train/airplane_0057.off airplane/train/airplane_0058.off airplane/train/airplane_0059.off airplane/train/airplane_0060.off airplane/train/airplane_0061.off airplane/train/airplane_0062.off airplane/train/airplane_0063.off airplane/train/airplane_0064.off airplane/train/airplane_0065.off airplane/train/airplane_0066.off airplane/train/airplane_0067.off airplane/train/airplane_0068.off airplane/train/airplane_0069.off airplane/train/airplane_0070.off airplane/train/airplane_0071.off airplane/train/airplane_0072.off airplane/train/airplane_0073.off airplane/train/airplane_0074.off airplane/train/airplane_0075.off airplane/train/airplane_0076.off airplane/train/airplane_0077.off airplane/train/airplane_0078.off airplane/train/airplane_0079.off airplane/train/airplane_0080.off airplane/train/airplane_0081.off airplane/train/airplane_0082.off airplane/train/airplane_0083.off airplane/train/airplane_0084.off airplane/train/airplane_0085.off airplane/train/airplane_0086.off airplane/train/airplane_0087.off airplane/train/airplane_0088.off airplane/train/airplane_0089.off airplane/train/airplane_0090.off airplane/train/airplane_0091.off airplane/train/airplane_0092.off airplane/train/airplane_0093.off airplane/train/airplane_0094.off airplane/train/airplane_0095.off airplane/train/airplane_0096.off airplane/train/airplane_0097.off airplane/train/airplane_0098.off airplane/train/airplane_0099.off airplane/train/airplane_0100.off airplane/train/airplane_0101.off airplane/train/airplane_0102.off airplane/train/airplane_0103.off airplane/train/airplane_0104.off airplane/train/airplane_0105.off airplane/train/airplane_0106.off airplane/train/airplane_0107.off airplane/train/airplane_0108.off airplane/train/airplane_0109.off airplane/train/airplane_0110.off airplane/train/airplane_0111.off airplane/train/airplane_0112.off airplane/train/airplane_0113.off airplane/train/airplane_0114.off airplane/train/airplane_0115.off airplane/train/airplane_0116.off airplane/train/airplane_0117.off airplane/train/airplane_0118.off airplane/train/airplane_0119.off airplane/train/airplane_0120.off airplane/train/airplane_0121.off airplane/train/airplane_0122.off airplane/train/airplane_0123.off airplane/train/airplane_0124.off airplane/train/airplane_0125.off airplane/train/airplane_0126.off airplane/train/airplane_0127.off airplane/train/airplane_0128.off airplane/train/airplane_0129.off airplane/train/airplane_0130.off airplane/train/airplane_0131.off airplane/train/airplane_0132.off airplane/train/airplane_0133.off airplane/train/airplane_0134.off airplane/train/airplane_0135.off airplane/train/airplane_0136.off airplane/train/airplane_0137.off airplane/train/airplane_0138.off airplane/train/airplane_0139.off airplane/train/airplane_0140.off airplane/train/airplane_0141.off airplane/train/airplane_0142.off airplane/train/airplane_0143.off airplane/train/airplane_0144.off airplane/train/airplane_0145.off airplane/train/airplane_0146.off airplane/train/airplane_0147.off airplane/train/airplane_0148.off airplane/train/airplane_0149.off airplane/train/airplane_0150.off airplane/train/airplane_0151.off airplane/train/airplane_0152.off airplane/train/airplane_0153.off airplane/train/airplane_0154.off airplane/train/airplane_0155.off airplane/train/airplane_0156.off airplane/train/airplane_0157.off airplane/train/airplane_0158.off airplane/train/airplane_0159.off airplane/train/airplane_0160.off airplane/train/airplane_0161.off airplane/train/airplane_0162.off airplane/train/airplane_0163.off airplane/train/airplane_0164.off airplane/train/airplane_0165.off airplane/train/airplane_0166.off airplane/train/airplane_0167.off airplane/train/airplane_0168.off airplane/train/airplane_0169.off airplane/train/airplane_0170.off airplane/train/airplane_0171.off airplane/train/airplane_0172.off airplane/train/airplane_0173.off airplane/train/airplane_0174.off airplane/train/airplane_0175.off airplane/train/airplane_0176.off airplane/train/airplane_0177.off airplane/train/airplane_0178.off airplane/train/airplane_0179.off airplane/train/airplane_0180.off airplane/train/airplane_0181.off airplane/train/airplane_0182.off airplane/train/airplane_0183.off airplane/train/airplane_0184.off airplane/train/airplane_0185.off airplane/train/airplane_0186.off airplane/train/airplane_0187.off airplane/train/airplane_0188.off airplane/train/airplane_0189.off airplane/train/airplane_0190.off airplane/train/airplane_0191.off airplane/train/airplane_0192.off airplane/train/airplane_0193.off airplane/train/airplane_0194.off airplane/train/airplane_0195.off airplane/train/airplane_0196.off airplane/train/airplane_0197.off airplane/train/airplane_0198.off airplane/train/airplane_0199.off airplane/train/airplane_0200.off airplane/train/airplane_0201.off airplane/train/airplane_0202.off airplane/train/airplane_0203.off airplane/train/airplane_0204.off airplane/train/airplane_0205.off airplane/train/airplane_0206.off airplane/train/airplane_0207.off airplane/train/airplane_0208.off airplane/train/airplane_0209.off airplane/train/airplane_0210.off airplane/train/airplane_0211.off airplane/train/airplane_0212.off airplane/train/airplane_0213.off airplane/train/airplane_0214.off airplane/train/airplane_0215.off airplane/train/airplane_0216.off airplane/train/airplane_0217.off airplane/train/airplane_0218.off airplane/train/airplane_0219.off airplane/train/airplane_0220.off airplane/train/airplane_0221.off airplane/train/airplane_0222.off airplane/train/airplane_0223.off airplane/train/airplane_0224.off airplane/train/airplane_0225.off airplane/train/airplane_0226.off airplane/train/airplane_0227.off airplane/train/airplane_0228.off airplane/train/airplane_0229.off airplane/train/airplane_0230.off airplane/train/airplane_0231.off airplane/train/airplane_0232.off airplane/train/airplane_0233.off airplane/train/airplane_0234.off airplane/train/airplane_0235.off airplane/train/airplane_0236.off airplane/train/airplane_0237.off airplane/train/airplane_0238.off airplane/train/airplane_0239.off airplane/train/airplane_0240.off airplane/train/airplane_0241.off airplane/train/airplane_0242.off airplane/train/airplane_0243.off airplane/train/airplane_0244.off airplane/train/airplane_0245.off airplane/train/airplane_0246.off airplane/train/airplane_0247.off airplane/train/airplane_0248.off airplane/train/airplane_0249.off airplane/train/airplane_0250.off airplane/train/airplane_0251.off airplane/train/airplane_0252.off airplane/train/airplane_0253.off airplane/train/airplane_0254.off airplane/train/airplane_0255.off airplane/train/airplane_0256.off airplane/train/airplane_0257.off airplane/train/airplane_0258.off airplane/train/airplane_0259.off airplane/train/airplane_0260.off airplane/train/airplane_0261.off airplane/train/airplane_0262.off airplane/train/airplane_0263.off airplane/train/airplane_0264.off airplane/train/airplane_0265.off airplane/train/airplane_0266.off airplane/train/airplane_0267.off airplane/train/airplane_0268.off airplane/train/airplane_0269.off airplane/train/airplane_0270.off airplane/train/airplane_0271.off airplane/train/airplane_0272.off airplane/train/airplane_0273.off airplane/train/airplane_0274.off airplane/train/airplane_0275.off airplane/train/airplane_0276.off airplane/train/airplane_0277.off airplane/train/airplane_0278.off airplane/train/airplane_0279.off airplane/train/airplane_0280.off airplane/train/airplane_0281.off airplane/train/airplane_0282.off airplane/train/airplane_0283.off airplane/train/airplane_0284.off airplane/train/airplane_0285.off airplane/train/airplane_0286.off airplane/train/airplane_0287.off airplane/train/airplane_0288.off airplane/train/airplane_0289.off airplane/train/airplane_0290.off airplane/train/airplane_0291.off airplane/train/airplane_0292.off airplane/train/airplane_0293.off airplane/train/airplane_0294.off airplane/train/airplane_0295.off airplane/train/airplane_0296.off airplane/train/airplane_0297.off airplane/train/airplane_0298.off airplane/train/airplane_0299.off airplane/train/airplane_0300.off airplane/train/airplane_0301.off airplane/train/airplane_0302.off airplane/train/airplane_0303.off airplane/train/airplane_0304.off airplane/train/airplane_0305.off airplane/train/airplane_0306.off airplane/train/airplane_0307.off airplane/train/airplane_0308.off airplane/train/airplane_0309.off airplane/train/airplane_0310.off airplane/train/airplane_0311.off airplane/train/airplane_0312.off airplane/train/airplane_0313.off airplane/train/airplane_0314.off airplane/train/airplane_0315.off airplane/train/airplane_0316.off airplane/train/airplane_0317.off airplane/train/airplane_0318.off airplane/train/airplane_0319.off airplane/train/airplane_0320.off airplane/train/airplane_0321.off airplane/train/airplane_0322.off airplane/train/airplane_0323.off airplane/train/airplane_0324.off airplane/train/airplane_0325.off airplane/train/airplane_0326.off airplane/train/airplane_0327.off airplane/train/airplane_0328.off airplane/train/airplane_0329.off airplane/train/airplane_0330.off airplane/train/airplane_0331.off airplane/train/airplane_0332.off airplane/train/airplane_0333.off airplane/train/airplane_0334.off airplane/train/airplane_0335.off airplane/train/airplane_0336.off airplane/train/airplane_0337.off airplane/train/airplane_0338.off airplane/train/airplane_0339.off airplane/train/airplane_0340.off airplane/train/airplane_0341.off airplane/train/airplane_0342.off airplane/train/airplane_0343.off airplane/train/airplane_0344.off airplane/train/airplane_0345.off airplane/train/airplane_0346.off airplane/train/airplane_0347.off airplane/train/airplane_0348.off airplane/train/airplane_0349.off airplane/train/airplane_0350.off airplane/train/airplane_0351.off airplane/train/airplane_0352.off airplane/train/airplane_0353.off airplane/train/airplane_0354.off airplane/train/airplane_0355.off airplane/train/airplane_0356.off airplane/train/airplane_0357.off airplane/train/airplane_0358.off airplane/train/airplane_0359.off airplane/train/airplane_0360.off airplane/train/airplane_0361.off airplane/train/airplane_0362.off airplane/train/airplane_0363.off airplane/train/airplane_0364.off airplane/train/airplane_0365.off airplane/train/airplane_0366.off airplane/train/airplane_0367.off airplane/train/airplane_0368.off airplane/train/airplane_0369.off airplane/train/airplane_0370.off airplane/train/airplane_0371.off airplane/train/airplane_0372.off airplane/train/airplane_0373.off airplane/train/airplane_0374.off airplane/train/airplane_0375.off airplane/train/airplane_0376.off airplane/train/airplane_0377.off airplane/train/airplane_0378.off airplane/train/airplane_0379.off airplane/train/airplane_0380.off airplane/train/airplane_0381.off airplane/train/airplane_0382.off airplane/train/airplane_0383.off airplane/train/airplane_0384.off airplane/train/airplane_0385.off airplane/train/airplane_0386.off airplane/train/airplane_0387.off airplane/train/airplane_0388.off airplane/train/airplane_0389.off airplane/train/airplane_0390.off airplane/train/airplane_0391.off airplane/train/airplane_0392.off airplane/train/airplane_0393.off airplane/train/airplane_0394.off airplane/train/airplane_0395.off airplane/train/airplane_0396.off airplane/train/airplane_0397.off airplane/train/airplane_0398.off airplane/train/airplane_0399.off airplane/train/airplane_0400.off airplane/train/airplane_0401.off airplane/train/airplane_0402.off airplane/train/airplane_0403.off airplane/train/airplane_0404.off airplane/train/airplane_0405.off airplane/train/airplane_0406.off airplane/train/airplane_0407.off airplane/train/airplane_0408.off airplane/train/airplane_0409.off airplane/train/airplane_0410.off airplane/train/airplane_0411.off airplane/train/airplane_0412.off airplane/train/airplane_0413.off airplane/train/airplane_0414.off airplane/train/airplane_0415.off airplane/train/airplane_0416.off airplane/train/airplane_0417.off airplane/train/airplane_0418.off airplane/train/airplane_0419.off airplane/train/airplane_0420.off airplane/train/airplane_0421.off airplane/train/airplane_0422.off airplane/train/airplane_0423.off airplane/train/airplane_0424.off airplane/train/airplane_0425.off airplane/train/airplane_0426.off airplane/train/airplane_0427.off airplane/train/airplane_0428.off airplane/train/airplane_0429.off airplane/train/airplane_0430.off airplane/train/airplane_0431.off airplane/train/airplane_0432.off airplane/train/airplane_0433.off airplane/train/airplane_0434.off airplane/train/airplane_0435.off airplane/train/airplane_0436.off airplane/train/airplane_0437.off airplane/train/airplane_0438.off airplane/train/airplane_0439.off airplane/train/airplane_0440.off airplane/train/airplane_0441.off airplane/train/airplane_0442.off airplane/train/airplane_0443.off airplane/train/airplane_0444.off airplane/train/airplane_0445.off airplane/train/airplane_0446.off airplane/train/airplane_0447.off airplane/train/airplane_0448.off airplane/train/airplane_0449.off airplane/train/airplane_0450.off airplane/train/airplane_0451.off airplane/train/airplane_0452.off airplane/train/airplane_0453.off airplane/train/airplane_0454.off airplane/train/airplane_0455.off airplane/train/airplane_0456.off airplane/train/airplane_0457.off airplane/train/airplane_0458.off airplane/train/airplane_0459.off airplane/train/airplane_0460.off airplane/train/airplane_0461.off airplane/train/airplane_0462.off airplane/train/airplane_0463.off airplane/train/airplane_0464.off airplane/train/airplane_0465.off airplane/train/airplane_0466.off airplane/train/airplane_0467.off airplane/train/airplane_0468.off airplane/train/airplane_0469.off airplane/train/airplane_0470.off airplane/train/airplane_0471.off airplane/train/airplane_0472.off airplane/train/airplane_0473.off airplane/train/airplane_0474.off airplane/train/airplane_0475.off airplane/train/airplane_0476.off airplane/train/airplane_0477.off airplane/train/airplane_0478.off airplane/train/airplane_0479.off airplane/train/airplane_0480.off airplane/train/airplane_0481.off airplane/train/airplane_0482.off airplane/train/airplane_0483.off airplane/train/airplane_0484.off airplane/train/airplane_0485.off airplane/train/airplane_0486.off airplane/train/airplane_0487.off airplane/train/airplane_0488.off airplane/train/airplane_0489.off airplane/train/airplane_0490.off airplane/train/airplane_0491.off airplane/train/airplane_0492.off airplane/train/airplane_0493.off airplane/train/airplane_0494.off airplane/train/airplane_0495.off airplane/train/airplane_0496.off airplane/train/airplane_0497.off airplane/train/airplane_0498.off airplane/train/airplane_0499.off airplane/train/airplane_0500.off airplane/train/airplane_0501.off airplane/train/airplane_0502.off airplane/train/airplane_0503.off airplane/train/airplane_0504.off airplane/train/airplane_0505.off airplane/train/airplane_0506.off airplane/train/airplane_0507.off airplane/train/airplane_0508.off airplane/train/airplane_0509.off airplane/train/airplane_0510.off airplane/train/airplane_0511.off airplane/train/airplane_0512.off airplane/train/airplane_0513.off airplane/train/airplane_0514.off airplane/train/airplane_0515.off airplane/train/airplane_0516.off airplane/train/airplane_0517.off airplane/train/airplane_0518.off airplane/train/airplane_0519.off airplane/train/airplane_0520.off airplane/train/airplane_0521.off airplane/train/airplane_0522.off airplane/train/airplane_0523.off airplane/train/airplane_0524.off airplane/train/airplane_0525.off airplane/train/airplane_0526.off airplane/train/airplane_0527.off airplane/train/airplane_0528.off airplane/train/airplane_0529.off airplane/train/airplane_0530.off airplane/train/airplane_0531.off airplane/train/airplane_0532.off airplane/train/airplane_0533.off airplane/train/airplane_0534.off airplane/train/airplane_0535.off airplane/train/airplane_0536.off airplane/train/airplane_0537.off airplane/train/airplane_0538.off airplane/train/airplane_0539.off airplane/train/airplane_0540.off airplane/train/airplane_0541.off airplane/train/airplane_0542.off airplane/train/airplane_0543.off airplane/train/airplane_0544.off airplane/train/airplane_0545.off airplane/train/airplane_0546.off airplane/train/airplane_0547.off airplane/train/airplane_0548.off airplane/train/airplane_0549.off airplane/train/airplane_0550.off airplane/train/airplane_0551.off airplane/train/airplane_0552.off airplane/train/airplane_0553.off airplane/train/airplane_0554.off airplane/train/airplane_0555.off airplane/train/airplane_0556.off airplane/train/airplane_0557.off airplane/train/airplane_0558.off airplane/train/airplane_0559.off airplane/train/airplane_0560.off airplane/train/airplane_0561.off airplane/train/airplane_0562.off airplane/train/airplane_0563.off airplane/train/airplane_0564.off table/train/table_0001.off table/train/table_0002.off table/train/table_0003.off table/train/table_0004.off table/train/table_0005.off table/train/table_0006.off table/train/table_0007.off table/train/table_0008.off table/train/table_0009.off table/train/table_0010.off table/train/table_0011.off table/train/table_0012.off table/train/table_0013.off table/train/table_0014.off table/train/table_0015.off table/train/table_0016.off table/train/table_0017.off table/train/table_0018.off table/train/table_0019.off table/train/table_0020.off table/train/table_0021.off table/train/table_0022.off table/train/table_0023.off table/train/table_0024.off table/train/table_0025.off table/train/table_0026.off table/train/table_0027.off table/train/table_0028.off table/train/table_0029.off table/train/table_0030.off table/train/table_0031.off table/train/table_0032.off table/train/table_0033.off table/train/table_0034.off table/train/table_0035.off table/train/table_0036.off table/train/table_0037.off table/train/table_0038.off table/train/table_0039.off table/train/table_0040.off table/train/table_0041.off table/train/table_0042.off table/train/table_0043.off table/train/table_0044.off table/train/table_0045.off table/train/table_0046.off table/train/table_0047.off table/train/table_0048.off table/train/table_0049.off table/train/table_0050.off table/train/table_0051.off table/train/table_0052.off table/train/table_0053.off table/train/table_0054.off table/train/table_0055.off table/train/table_0056.off table/train/table_0057.off table/train/table_0058.off table/train/table_0059.off table/train/table_0060.off table/train/table_0061.off table/train/table_0062.off table/train/table_0063.off table/train/table_0064.off table/train/table_0065.off table/train/table_0066.off table/train/table_0067.off table/train/table_0068.off table/train/table_0069.off table/train/table_0070.off table/train/table_0071.off table/train/table_0072.off table/train/table_0073.off table/train/table_0074.off table/train/table_0075.off table/train/table_0076.off table/train/table_0077.off table/train/table_0078.off table/train/table_0079.off table/train/table_0080.off table/train/table_0081.off table/train/table_0082.off table/train/table_0083.off table/train/table_0084.off table/train/table_0085.off table/train/table_0086.off table/train/table_0087.off table/train/table_0088.off table/train/table_0089.off table/train/table_0090.off table/train/table_0091.off table/train/table_0092.off table/train/table_0093.off table/train/table_0094.off table/train/table_0095.off table/train/table_0096.off table/train/table_0097.off table/train/table_0098.off table/train/table_0099.off table/train/table_0100.off table/train/table_0101.off table/train/table_0102.off table/train/table_0103.off table/train/table_0104.off table/train/table_0105.off table/train/table_0106.off table/train/table_0107.off table/train/table_0108.off table/train/table_0109.off table/train/table_0110.off table/train/table_0111.off table/train/table_0112.off table/train/table_0113.off table/train/table_0114.off table/train/table_0115.off table/train/table_0116.off table/train/table_0117.off table/train/table_0118.off table/train/table_0119.off table/train/table_0120.off table/train/table_0121.off table/train/table_0122.off table/train/table_0123.off table/train/table_0124.off table/train/table_0125.off table/train/table_0126.off table/train/table_0127.off table/train/table_0128.off table/train/table_0129.off table/train/table_0130.off table/train/table_0131.off table/train/table_0132.off table/train/table_0133.off table/train/table_0134.off table/train/table_0135.off table/train/table_0136.off table/train/table_0137.off table/train/table_0138.off table/train/table_0139.off table/train/table_0140.off table/train/table_0141.off table/train/table_0142.off table/train/table_0143.off table/train/table_0144.off table/train/table_0145.off table/train/table_0146.off table/train/table_0147.off table/train/table_0148.off table/train/table_0149.off table/train/table_0150.off table/train/table_0151.off table/train/table_0152.off table/train/table_0153.off table/train/table_0154.off table/train/table_0155.off table/train/table_0156.off table/train/table_0157.off table/train/table_0158.off table/train/table_0159.off table/train/table_0160.off table/train/table_0161.off table/train/table_0162.off table/train/table_0163.off table/train/table_0164.off table/train/table_0165.off table/train/table_0166.off table/train/table_0167.off table/train/table_0168.off table/train/table_0169.off table/train/table_0170.off table/train/table_0171.off table/train/table_0172.off table/train/table_0173.off table/train/table_0174.off table/train/table_0175.off table/train/table_0176.off table/train/table_0177.off table/train/table_0178.off table/train/table_0179.off table/train/table_0180.off table/train/table_0181.off table/train/table_0182.off table/train/table_0183.off table/train/table_0184.off table/train/table_0185.off table/train/table_0186.off table/train/table_0187.off table/train/table_0188.off table/train/table_0189.off table/train/table_0190.off table/train/table_0191.off table/train/table_0192.off table/train/table_0193.off table/train/table_0194.off table/train/table_0195.off table/train/table_0196.off table/train/table_0197.off table/train/table_0198.off table/train/table_0199.off table/train/table_0200.off table/train/table_0201.off table/train/table_0202.off table/train/table_0203.off table/train/table_0204.off table/train/table_0205.off table/train/table_0206.off table/train/table_0207.off table/train/table_0208.off table/train/table_0209.off table/train/table_0210.off table/train/table_0211.off table/train/table_0212.off table/train/table_0213.off table/train/table_0214.off table/train/table_0215.off table/train/table_0216.off table/train/table_0217.off table/train/table_0218.off table/train/table_0219.off table/train/table_0220.off table/train/table_0221.off table/train/table_0222.off table/train/table_0223.off table/train/table_0224.off table/train/table_0225.off table/train/table_0226.off table/train/table_0227.off table/train/table_0228.off table/train/table_0229.off table/train/table_0230.off table/train/table_0231.off table/train/table_0232.off table/train/table_0233.off table/train/table_0234.off table/train/table_0235.off table/train/table_0236.off table/train/table_0237.off table/train/table_0238.off table/train/table_0239.off table/train/table_0240.off table/train/table_0241.off table/train/table_0242.off table/train/table_0243.off table/train/table_0244.off table/train/table_0245.off table/train/table_0246.off table/train/table_0247.off table/train/table_0248.off table/train/table_0249.off table/train/table_0250.off table/train/table_0251.off table/train/table_0252.off table/train/table_0253.off table/train/table_0254.off table/train/table_0255.off table/train/table_0256.off table/train/table_0257.off table/train/table_0258.off table/train/table_0259.off table/train/table_0260.off table/train/table_0261.off table/train/table_0262.off table/train/table_0263.off table/train/table_0264.off table/train/table_0265.off table/train/table_0266.off table/train/table_0267.off table/train/table_0268.off table/train/table_0269.off table/train/table_0270.off table/train/table_0271.off table/train/table_0272.off table/train/table_0273.off table/train/table_0274.off table/train/table_0275.off table/train/table_0276.off table/train/table_0277.off table/train/table_0278.off table/train/table_0279.off table/train/table_0280.off table/train/table_0281.off table/train/table_0282.off table/train/table_0283.off table/train/table_0284.off table/train/table_0285.off table/train/table_0286.off table/train/table_0287.off table/train/table_0288.off table/train/table_0289.off table/train/table_0290.off table/train/table_0291.off table/train/table_0292.off table/train/table_0293.off table/train/table_0294.off table/train/table_0295.off table/train/table_0296.off table/train/table_0297.off table/train/table_0298.off table/train/table_0299.off table/train/table_0300.off table/train/table_0301.off table/train/table_0302.off table/train/table_0303.off table/train/table_0304.off table/train/table_0305.off table/train/table_0306.off table/train/table_0307.off table/train/table_0308.off table/train/table_0309.off table/train/table_0310.off table/train/table_0311.off table/train/table_0312.off table/train/table_0313.off table/train/table_0314.off table/train/table_0315.off table/train/table_0316.off table/train/table_0317.off table/train/table_0318.off table/train/table_0319.off table/train/table_0320.off table/train/table_0321.off table/train/table_0322.off table/train/table_0323.off table/train/table_0324.off table/train/table_0325.off table/train/table_0326.off table/train/table_0327.off table/train/table_0328.off table/train/table_0329.off table/train/table_0330.off table/train/table_0331.off table/train/table_0332.off table/train/table_0333.off table/train/table_0334.off table/train/table_0335.off table/train/table_0336.off table/train/table_0337.off table/train/table_0338.off table/train/table_0339.off table/train/table_0340.off table/train/table_0341.off table/train/table_0342.off table/train/table_0343.off table/train/table_0344.off table/train/table_0345.off table/train/table_0346.off table/train/table_0347.off table/train/table_0348.off table/train/table_0349.off table/train/table_0350.off table/train/table_0351.off table/train/table_0352.off table/train/table_0353.off bench/train/bench_0001.off bench/train/bench_0002.off bench/train/bench_0003.off bench/train/bench_0004.off bench/train/bench_0005.off bench/train/bench_0006.off bench/train/bench_0007.off bench/train/bench_0008.off bench/train/bench_0009.off bench/train/bench_0010.off bench/train/bench_0011.off bench/train/bench_0012.off bench/train/bench_0013.off bench/train/bench_0014.off bench/train/bench_0015.off bench/train/bench_0016.off bench/train/bench_0017.off bench/train/bench_0018.off bench/train/bench_0019.off bench/train/bench_0020.off bench/train/bench_0021.off bench/train/bench_0022.off bench/train/bench_0023.off bench/train/bench_0024.off bench/train/bench_0025.off bench/train/bench_0026.off bench/train/bench_0027.off bench/train/bench_0028.off bench/train/bench_0029.off bench/train/bench_0030.off bench/train/bench_0031.off bench/train/bench_0032.off bench/train/bench_0033.off bench/train/bench_0034.off bench/train/bench_0035.off bench/train/bench_0036.off bench/train/bench_0037.off bench/train/bench_0038.off bench/train/bench_0039.off bench/train/bench_0040.off bench/train/bench_0041.off bench/train/bench_0042.off bench/train/bench_0043.off bench/train/bench_0044.off bench/train/bench_0045.off bench/train/bench_0046.off bench/train/bench_0047.off bench/train/bench_0048.off bench/train/bench_0049.off bench/train/bench_0050.off bench/train/bench_0051.off bench/train/bench_0052.off bench/train/bench_0053.off bench/train/bench_0054.off bench/train/bench_0055.off bench/train/bench_0056.off bench/train/bench_0057.off bench/train/bench_0058.off bench/train/bench_0059.off bench/train/bench_0060.off bench/train/bench_0061.off bench/train/bench_0062.off bench/train/bench_0063.off bench/train/bench_0064.off bench/train/bench_0065.off bench/train/bench_0066.off bench/train/bench_0067.off bench/train/bench_0068.off bench/train/bench_0069.off bench/train/bench_0070.off bench/train/bench_0071.off bench/train/bench_0072.off bench/train/bench_0073.off bench/train/bench_0074.off bench/train/bench_0075.off bench/train/bench_0076.off bench/train/bench_0077.off bench/train/bench_0078.off bench/train/bench_0079.off bench/train/bench_0080.off bench/train/bench_0081.off bench/train/bench_0082.off bench/train/bench_0083.off bench/train/bench_0084.off bench/train/bench_0085.off bench/train/bench_0086.off bench/train/bench_0087.off bench/train/bench_0088.off bench/train/bench_0089.off bench/train/bench_0090.off bench/train/bench_0091.off bench/train/bench_0092.off bench/train/bench_0093.off bench/train/bench_0094.off bench/train/bench_0095.off bench/train/bench_0096.off bench/train/bench_0097.off bench/train/bench_0098.off bench/train/bench_0099.off bench/train/bench_0100.off bench/train/bench_0101.off bench/train/bench_0102.off bench/train/bench_0103.off bench/train/bench_0104.off bench/train/bench_0105.off bench/train/bench_0106.off bench/train/bench_0107.off bench/train/bench_0108.off bench/train/bench_0109.off bench/train/bench_0110.off bench/train/bench_0111.off bench/train/bench_0112.off bench/train/bench_0113.off bench/train/bench_0114.off bench/train/bench_0115.off bench/train/bench_0116.off bench/train/bench_0117.off bench/train/bench_0118.off bench/train/bench_0119.off bench/train/bench_0120.off bench/train/bench_0121.off bench/train/bench_0122.off bench/train/bench_0123.off bench/train/bench_0124.off bench/train/bench_0125.off bench/train/bench_0126.off bench/train/bench_0127.off bench/train/bench_0128.off bench/train/bench_0129.off bench/train/bench_0130.off bench/train/bench_0131.off bench/train/bench_0132.off bench/train/bench_0133.off bench/train/bench_0134.off bench/train/bench_0135.off bench/train/bench_0136.off bench/train/bench_0137.off bench/train/bench_0138.off bench/train/bench_0139.off bench/train/bench_0140.off bench/train/bench_0141.off bench/train/bench_0142.off bench/train/bench_0143.off bench/train/bench_0144.off bench/train/bench_0145.off bench/train/bench_0146.off bench/train/bench_0147.off bench/train/bench_0148.off bench/train/bench_0149.off bench/train/bench_0150.off bench/train/bench_0151.off bench/train/bench_0152.off bench/train/bench_0153.off bench/train/bench_0154.off bench/train/bench_0155.off bench/train/bench_0156.off plant/train/plant_0001.off plant/train/plant_0002.off plant/train/plant_0003.off plant/train/plant_0004.off plant/train/plant_0005.off plant/train/plant_0006.off plant/train/plant_0007.off plant/train/plant_0008.off plant/train/plant_0009.off plant/train/plant_0010.off plant/train/plant_0011.off plant/train/plant_0012.off plant/train/plant_0013.off plant/train/plant_0014.off plant/train/plant_0015.off plant/train/plant_0016.off plant/train/plant_0017.off plant/train/plant_0018.off plant/train/plant_0019.off plant/train/plant_0020.off plant/train/plant_0021.off plant/train/plant_0022.off plant/train/plant_0023.off plant/train/plant_0024.off plant/train/plant_0025.off plant/train/plant_0026.off plant/train/plant_0027.off plant/train/plant_0028.off plant/train/plant_0029.off plant/train/plant_0030.off plant/train/plant_0031.off plant/train/plant_0032.off plant/train/plant_0033.off plant/train/plant_0034.off plant/train/plant_0035.off plant/train/plant_0036.off plant/train/plant_0037.off plant/train/plant_0038.off plant/train/plant_0039.off plant/train/plant_0040.off plant/train/plant_0041.off plant/train/plant_0042.off plant/train/plant_0043.off plant/train/plant_0044.off plant/train/plant_0045.off plant/train/plant_0046.off plant/train/plant_0047.off plant/train/plant_0048.off plant/train/plant_0049.off plant/train/plant_0050.off plant/train/plant_0051.off plant/train/plant_0052.off plant/train/plant_0053.off plant/train/plant_0054.off plant/train/plant_0055.off plant/train/plant_0056.off plant/train/plant_0057.off plant/train/plant_0058.off plant/train/plant_0059.off plant/train/plant_0060.off plant/train/plant_0061.off plant/train/plant_0062.off plant/train/plant_0063.off plant/train/plant_0064.off plant/train/plant_0065.off plant/train/plant_0066.off plant/train/plant_0067.off plant/train/plant_0068.off plant/train/plant_0069.off plant/train/plant_0070.off plant/train/plant_0071.off plant/train/plant_0072.off plant/train/plant_0073.off plant/train/plant_0074.off plant/train/plant_0075.off plant/train/plant_0076.off plant/train/plant_0077.off plant/train/plant_0078.off plant/train/plant_0079.off plant/train/plant_0080.off plant/train/plant_0081.off plant/train/plant_0082.off plant/train/plant_0083.off plant/train/plant_0084.off plant/train/plant_0085.off plant/train/plant_0086.off plant/train/plant_0087.off plant/train/plant_0088.off plant/train/plant_0089.off plant/train/plant_0090.off plant/train/plant_0091.off plant/train/plant_0092.off plant/train/plant_0093.off plant/train/plant_0094.off plant/train/plant_0095.off plant/train/plant_0096.off plant/train/plant_0097.off plant/train/plant_0098.off plant/train/plant_0099.off plant/train/plant_0100.off plant/train/plant_0101.off plant/train/plant_0102.off plant/train/plant_0103.off plant/train/plant_0104.off plant/train/plant_0105.off plant/train/plant_0106.off plant/train/plant_0107.off plant/train/plant_0108.off plant/train/plant_0109.off plant/train/plant_0110.off plant/train/plant_0111.off plant/train/plant_0112.off plant/train/plant_0113.off plant/train/plant_0114.off plant/train/plant_0115.off plant/train/plant_0116.off plant/train/plant_0117.off plant/train/plant_0118.off plant/train/plant_0119.off plant/train/plant_0120.off plant/train/plant_0121.off plant/train/plant_0122.off plant/train/plant_0123.off plant/train/plant_0124.off plant/train/plant_0125.off plant/train/plant_0126.off plant/train/plant_0127.off plant/train/plant_0128.off plant/train/plant_0129.off plant/train/plant_0130.off plant/train/plant_0131.off plant/train/plant_0132.off plant/train/plant_0133.off plant/train/plant_0134.off plant/train/plant_0135.off plant/train/plant_0136.off plant/train/plant_0137.off plant/train/plant_0138.off plant/train/plant_0139.off plant/train/plant_0140.off plant/train/plant_0141.off plant/train/plant_0142.off plant/train/plant_0143.off plant/train/plant_0144.off plant/train/plant_0145.off plant/train/plant_0146.off plant/train/plant_0147.off plant/train/plant_0148.off plant/train/plant_0149.off plant/train/plant_0150.off plant/train/plant_0151.off plant/train/plant_0152.off plant/train/plant_0153.off plant/train/plant_0154.off plant/train/plant_0155.off plant/train/plant_0156.off plant/train/plant_0157.off plant/train/plant_0158.off plant/train/plant_0159.off plant/train/plant_0160.off plant/train/plant_0161.off plant/train/plant_0162.off plant/train/plant_0163.off plant/train/plant_0164.off plant/train/plant_0165.off plant/train/plant_0166.off plant/train/plant_0167.off plant/train/plant_0168.off plant/train/plant_0169.off plant/train/plant_0170.off plant/train/plant_0171.off plant/train/plant_0172.off plant/train/plant_0173.off plant/train/plant_0174.off plant/train/plant_0175.off plant/train/plant_0176.off plant/train/plant_0177.off plant/train/plant_0178.off plant/train/plant_0179.off plant/train/plant_0180.off plant/train/plant_0181.off plant/train/plant_0182.off plant/train/plant_0183.off plant/train/plant_0184.off plant/train/plant_0185.off plant/train/plant_0186.off plant/train/plant_0187.off plant/train/plant_0188.off plant/train/plant_0189.off plant/train/plant_0190.off plant/train/plant_0191.off plant/train/plant_0192.off plant/train/plant_0193.off plant/train/plant_0194.off plant/train/plant_0195.off plant/train/plant_0196.off plant/train/plant_0197.off plant/train/plant_0198.off plant/train/plant_0199.off plant/train/plant_0200.off plant/train/plant_0201.off plant/train/plant_0202.off plant/train/plant_0203.off plant/train/plant_0204.off plant/train/plant_0205.off plant/train/plant_0206.off plant/train/plant_0207.off plant/train/plant_0208.off plant/train/plant_0209.off plant/train/plant_0210.off plant/train/plant_0211.off plant/train/plant_0212.off plant/train/plant_0213.off plant/train/plant_0214.off plant/train/plant_0215.off plant/train/plant_0216.off chair/train/chair_0001.off chair/train/chair_0002.off chair/train/chair_0003.off chair/train/chair_0004.off chair/train/chair_0005.off chair/train/chair_0006.off chair/train/chair_0007.off chair/train/chair_0008.off chair/train/chair_0009.off chair/train/chair_0010.off chair/train/chair_0011.off chair/train/chair_0012.off chair/train/chair_0013.off chair/train/chair_0014.off chair/train/chair_0015.off chair/train/chair_0016.off chair/train/chair_0017.off chair/train/chair_0018.off chair/train/chair_0019.off chair/train/chair_0020.off chair/train/chair_0021.off chair/train/chair_0022.off chair/train/chair_0023.off chair/train/chair_0024.off chair/train/chair_0025.off chair/train/chair_0026.off chair/train/chair_0027.off chair/train/chair_0028.off chair/train/chair_0029.off chair/train/chair_0030.off chair/train/chair_0031.off chair/train/chair_0032.off chair/train/chair_0033.off chair/train/chair_0034.off chair/train/chair_0035.off chair/train/chair_0036.off chair/train/chair_0037.off chair/train/chair_0038.off chair/train/chair_0039.off chair/train/chair_0040.off chair/train/chair_0041.off chair/train/chair_0042.off chair/train/chair_0043.off chair/train/chair_0044.off chair/train/chair_0045.off chair/train/chair_0046.off chair/train/chair_0047.off chair/train/chair_0048.off chair/train/chair_0049.off chair/train/chair_0050.off chair/train/chair_0051.off chair/train/chair_0052.off chair/train/chair_0053.off chair/train/chair_0054.off chair/train/chair_0055.off chair/train/chair_0056.off chair/train/chair_0057.off chair/train/chair_0058.off chair/train/chair_0059.off chair/train/chair_0060.off chair/train/chair_0061.off chair/train/chair_0062.off chair/train/chair_0063.off chair/train/chair_0064.off chair/train/chair_0065.off chair/train/chair_0066.off chair/train/chair_0067.off chair/train/chair_0068.off chair/train/chair_0069.off chair/train/chair_0070.off chair/train/chair_0071.off chair/train/chair_0072.off chair/train/chair_0073.off chair/train/chair_0074.off chair/train/chair_0075.off chair/train/chair_0076.off chair/train/chair_0077.off chair/train/chair_0078.off chair/train/chair_0079.off chair/train/chair_0080.off chair/train/chair_0081.off chair/train/chair_0082.off chair/train/chair_0083.off chair/train/chair_0084.off chair/train/chair_0085.off chair/train/chair_0086.off chair/train/chair_0087.off chair/train/chair_0088.off chair/train/chair_0089.off chair/train/chair_0090.off chair/train/chair_0091.off chair/train/chair_0092.off chair/train/chair_0093.off chair/train/chair_0094.off chair/train/chair_0095.off chair/train/chair_0096.off chair/train/chair_0097.off chair/train/chair_0098.off chair/train/chair_0099.off chair/train/chair_0100.off chair/train/chair_0101.off chair/train/chair_0102.off chair/train/chair_0103.off chair/train/chair_0104.off chair/train/chair_0105.off chair/train/chair_0106.off chair/train/chair_0107.off chair/train/chair_0108.off chair/train/chair_0109.off chair/train/chair_0110.off chair/train/chair_0111.off chair/train/chair_0112.off chair/train/chair_0113.off chair/train/chair_0114.off chair/train/chair_0115.off chair/train/chair_0116.off chair/train/chair_0117.off chair/train/chair_0118.off chair/train/chair_0119.off chair/train/chair_0120.off chair/train/chair_0121.off chair/train/chair_0122.off chair/train/chair_0123.off chair/train/chair_0124.off chair/train/chair_0125.off chair/train/chair_0126.off chair/train/chair_0127.off chair/train/chair_0128.off chair/train/chair_0129.off chair/train/chair_0130.off chair/train/chair_0131.off chair/train/chair_0132.off chair/train/chair_0133.off chair/train/chair_0134.off chair/train/chair_0135.off chair/train/chair_0136.off chair/train/chair_0137.off chair/train/chair_0138.off chair/train/chair_0139.off chair/train/chair_0140.off chair/train/chair_0141.off chair/train/chair_0142.off chair/train/chair_0143.off chair/train/chair_0144.off chair/train/chair_0145.off chair/train/chair_0146.off chair/train/chair_0147.off chair/train/chair_0148.off chair/train/chair_0149.off chair/train/chair_0150.off chair/train/chair_0151.off chair/train/chair_0152.off chair/train/chair_0153.off chair/train/chair_0154.off chair/train/chair_0155.off chair/train/chair_0156.off chair/train/chair_0157.off chair/train/chair_0158.off chair/train/chair_0159.off chair/train/chair_0160.off chair/train/chair_0161.off chair/train/chair_0162.off chair/train/chair_0163.off chair/train/chair_0164.off chair/train/chair_0165.off chair/train/chair_0166.off chair/train/chair_0167.off chair/train/chair_0168.off chair/train/chair_0169.off chair/train/chair_0170.off chair/train/chair_0171.off chair/train/chair_0172.off chair/train/chair_0173.off chair/train/chair_0174.off chair/train/chair_0175.off chair/train/chair_0176.off chair/train/chair_0177.off chair/train/chair_0178.off chair/train/chair_0179.off chair/train/chair_0180.off chair/train/chair_0181.off chair/train/chair_0182.off chair/train/chair_0183.off chair/train/chair_0184.off chair/train/chair_0185.off chair/train/chair_0186.off chair/train/chair_0187.off chair/train/chair_0188.off chair/train/chair_0189.off chair/train/chair_0190.off chair/train/chair_0191.off chair/train/chair_0192.off chair/train/chair_0193.off chair/train/chair_0194.off chair/train/chair_0195.off chair/train/chair_0196.off chair/train/chair_0197.off chair/train/chair_0198.off chair/train/chair_0199.off chair/train/chair_0200.off chair/train/chair_0201.off chair/train/chair_0202.off chair/train/chair_0203.off chair/train/chair_0204.off chair/train/chair_0205.off chair/train/chair_0206.off chair/train/chair_0207.off chair/train/chair_0208.off chair/train/chair_0209.off chair/train/chair_0210.off chair/train/chair_0211.off chair/train/chair_0212.off chair/train/chair_0213.off chair/train/chair_0214.off chair/train/chair_0215.off chair/train/chair_0216.off chair/train/chair_0217.off chair/train/chair_0218.off chair/train/chair_0219.off chair/train/chair_0220.off chair/train/chair_0221.off chair/train/chair_0222.off chair/train/chair_0223.off chair/train/chair_0224.off chair/train/chair_0225.off chair/train/chair_0226.off chair/train/chair_0227.off chair/train/chair_0228.off chair/train/chair_0229.off chair/train/chair_0230.off chair/train/chair_0231.off chair/train/chair_0232.off chair/train/chair_0233.off chair/train/chair_0234.off chair/train/chair_0235.off chair/train/chair_0236.off chair/train/chair_0237.off chair/train/chair_0238.off chair/train/chair_0239.off chair/train/chair_0240.off chair/train/chair_0241.off chair/train/chair_0242.off chair/train/chair_0243.off chair/train/chair_0244.off chair/train/chair_0245.off chair/train/chair_0246.off chair/train/chair_0247.off chair/train/chair_0248.off chair/train/chair_0249.off chair/train/chair_0250.off chair/train/chair_0251.off chair/train/chair_0252.off chair/train/chair_0253.off chair/train/chair_0254.off chair/train/chair_0255.off chair/train/chair_0256.off chair/train/chair_0257.off chair/train/chair_0258.off chair/train/chair_0259.off chair/train/chair_0260.off chair/train/chair_0261.off chair/train/chair_0262.off chair/train/chair_0263.off chair/train/chair_0264.off chair/train/chair_0265.off chair/train/chair_0266.off chair/train/chair_0267.off chair/train/chair_0268.off chair/train/chair_0269.off chair/train/chair_0270.off chair/train/chair_0271.off chair/train/chair_0272.off chair/train/chair_0273.off chair/train/chair_0274.off chair/train/chair_0275.off chair/train/chair_0276.off chair/train/chair_0277.off chair/train/chair_0278.off chair/train/chair_0279.off chair/train/chair_0280.off chair/train/chair_0281.off chair/train/chair_0282.off chair/train/chair_0283.off chair/train/chair_0284.off chair/train/chair_0285.off chair/train/chair_0286.off chair/train/chair_0287.off chair/train/chair_0288.off chair/train/chair_0289.off chair/train/chair_0290.off chair/train/chair_0291.off chair/train/chair_0292.off chair/train/chair_0293.off chair/train/chair_0294.off chair/train/chair_0295.off chair/train/chair_0296.off chair/train/chair_0297.off chair/train/chair_0298.off chair/train/chair_0299.off chair/train/chair_0300.off chair/train/chair_0301.off chair/train/chair_0302.off chair/train/chair_0303.off chair/train/chair_0304.off chair/train/chair_0305.off chair/train/chair_0306.off chair/train/chair_0307.off chair/train/chair_0308.off chair/train/chair_0309.off chair/train/chair_0310.off chair/train/chair_0311.off chair/train/chair_0312.off chair/train/chair_0313.off chair/train/chair_0314.off chair/train/chair_0315.off chair/train/chair_0316.off chair/train/chair_0317.off chair/train/chair_0318.off chair/train/chair_0319.off chair/train/chair_0320.off chair/train/chair_0321.off chair/train/chair_0322.off chair/train/chair_0323.off chair/train/chair_0324.off chair/train/chair_0325.off chair/train/chair_0326.off chair/train/chair_0327.off chair/train/chair_0328.off chair/train/chair_0329.off chair/train/chair_0330.off chair/train/chair_0331.off chair/train/chair_0332.off chair/train/chair_0333.off chair/train/chair_0334.off chair/train/chair_0335.off chair/train/chair_0336.off chair/train/chair_0337.off chair/train/chair_0338.off chair/train/chair_0339.off chair/train/chair_0340.off chair/train/chair_0341.off chair/train/chair_0342.off chair/train/chair_0343.off chair/train/chair_0344.off chair/train/chair_0345.off chair/train/chair_0346.off chair/train/chair_0347.off chair/train/chair_0348.off chair/train/chair_0349.off chair/train/chair_0350.off chair/train/chair_0351.off chair/train/chair_0352.off chair/train/chair_0353.off chair/train/chair_0354.off chair/train/chair_0355.off chair/train/chair_0356.off chair/train/chair_0357.off chair/train/chair_0358.off chair/train/chair_0359.off chair/train/chair_0360.off chair/train/chair_0361.off chair/train/chair_0362.off chair/train/chair_0363.off chair/train/chair_0364.off chair/train/chair_0365.off chair/train/chair_0366.off chair/train/chair_0367.off chair/train/chair_0368.off chair/train/chair_0369.off chair/train/chair_0370.off chair/train/chair_0371.off chair/train/chair_0372.off chair/train/chair_0373.off chair/train/chair_0374.off chair/train/chair_0375.off chair/train/chair_0376.off chair/train/chair_0377.off chair/train/chair_0378.off chair/train/chair_0379.off chair/train/chair_0380.off chair/train/chair_0381.off chair/train/chair_0382.off chair/train/chair_0383.off chair/train/chair_0384.off chair/train/chair_0385.off chair/train/chair_0386.off chair/train/chair_0387.off chair/train/chair_0388.off chair/train/chair_0389.off chair/train/chair_0390.off chair/train/chair_0391.off chair/train/chair_0392.off chair/train/chair_0393.off chair/train/chair_0394.off chair/train/chair_0395.off chair/train/chair_0396.off chair/train/chair_0397.off chair/train/chair_0398.off chair/train/chair_0399.off chair/train/chair_0400.off chair/train/chair_0401.off chair/train/chair_0402.off chair/train/chair_0403.off chair/train/chair_0404.off chair/train/chair_0405.off chair/train/chair_0406.off chair/train/chair_0407.off chair/train/chair_0408.off chair/train/chair_0409.off chair/train/chair_0410.off chair/train/chair_0411.off chair/train/chair_0412.off chair/train/chair_0413.off chair/train/chair_0414.off chair/train/chair_0415.off chair/train/chair_0416.off chair/train/chair_0417.off chair/train/chair_0418.off chair/train/chair_0419.off chair/train/chair_0420.off chair/train/chair_0421.off chair/train/chair_0422.off chair/train/chair_0423.off chair/train/chair_0424.off chair/train/chair_0425.off chair/train/chair_0426.off chair/train/chair_0427.off chair/train/chair_0428.off chair/train/chair_0429.off chair/train/chair_0430.off chair/train/chair_0431.off chair/train/chair_0432.off chair/train/chair_0433.off chair/train/chair_0434.off chair/train/chair_0435.off chair/train/chair_0436.off chair/train/chair_0437.off chair/train/chair_0438.off chair/train/chair_0439.off chair/train/chair_0440.off chair/train/chair_0441.off chair/train/chair_0442.off chair/train/chair_0443.off chair/train/chair_0444.off chair/train/chair_0445.off chair/train/chair_0446.off chair/train/chair_0447.off chair/train/chair_0448.off chair/train/chair_0449.off chair/train/chair_0450.off chair/train/chair_0451.off chair/train/chair_0452.off chair/train/chair_0453.off chair/train/chair_0454.off chair/train/chair_0455.off chair/train/chair_0456.off chair/train/chair_0457.off chair/train/chair_0458.off chair/train/chair_0459.off chair/train/chair_0460.off chair/train/chair_0461.off chair/train/chair_0462.off chair/train/chair_0463.off chair/train/chair_0464.off chair/train/chair_0465.off chair/train/chair_0466.off chair/train/chair_0467.off chair/train/chair_0468.off chair/train/chair_0469.off chair/train/chair_0470.off chair/train/chair_0471.off chair/train/chair_0472.off chair/train/chair_0473.off chair/train/chair_0474.off chair/train/chair_0475.off chair/train/chair_0476.off chair/train/chair_0477.off chair/train/chair_0478.off chair/train/chair_0479.off chair/train/chair_0480.off chair/train/chair_0481.off chair/train/chair_0482.off chair/train/chair_0483.off chair/train/chair_0484.off chair/train/chair_0485.off chair/train/chair_0486.off chair/train/chair_0487.off chair/train/chair_0488.off chair/train/chair_0489.off chair/train/chair_0490.off chair/train/chair_0491.off chair/train/chair_0492.off chair/train/chair_0493.off chair/train/chair_0494.off chair/train/chair_0495.off chair/train/chair_0496.off chair/train/chair_0497.off chair/train/chair_0498.off chair/train/chair_0499.off chair/train/chair_0500.off chair/train/chair_0501.off chair/train/chair_0502.off chair/train/chair_0503.off chair/train/chair_0504.off chair/train/chair_0505.off chair/train/chair_0506.off chair/train/chair_0507.off chair/train/chair_0508.off chair/train/chair_0509.off chair/train/chair_0510.off chair/train/chair_0511.off chair/train/chair_0512.off chair/train/chair_0513.off chair/train/chair_0514.off chair/train/chair_0515.off chair/train/chair_0516.off chair/train/chair_0517.off chair/train/chair_0518.off chair/train/chair_0519.off chair/train/chair_0520.off chair/train/chair_0521.off chair/train/chair_0522.off chair/train/chair_0523.off chair/train/chair_0524.off chair/train/chair_0525.off chair/train/chair_0526.off chair/train/chair_0527.off chair/train/chair_0528.off chair/train/chair_0529.off chair/train/chair_0530.off chair/train/chair_0531.off chair/train/chair_0532.off chair/train/chair_0533.off chair/train/chair_0534.off chair/train/chair_0535.off chair/train/chair_0536.off chair/train/chair_0537.off chair/train/chair_0538.off chair/train/chair_0539.off chair/train/chair_0540.off chair/train/chair_0541.off chair/train/chair_0542.off chair/train/chair_0543.off chair/train/chair_0544.off chair/train/chair_0545.off chair/train/chair_0546.off chair/train/chair_0547.off chair/train/chair_0548.off chair/train/chair_0549.off chair/train/chair_0550.off chair/train/chair_0551.off chair/train/chair_0552.off chair/train/chair_0553.off chair/train/chair_0554.off chair/train/chair_0555.off chair/train/chair_0556.off chair/train/chair_0557.off chair/train/chair_0558.off chair/train/chair_0559.off chair/train/chair_0560.off chair/train/chair_0561.off chair/train/chair_0562.off chair/train/chair_0563.off chair/train/chair_0564.off chair/train/chair_0565.off chair/train/chair_0566.off chair/train/chair_0567.off chair/train/chair_0568.off chair/train/chair_0569.off chair/train/chair_0570.off chair/train/chair_0571.off chair/train/chair_0572.off chair/train/chair_0573.off chair/train/chair_0574.off chair/train/chair_0575.off chair/train/chair_0576.off chair/train/chair_0577.off chair/train/chair_0578.off chair/train/chair_0579.off chair/train/chair_0580.off chair/train/chair_0581.off chair/train/chair_0582.off chair/train/chair_0583.off chair/train/chair_0584.off chair/train/chair_0585.off chair/train/chair_0586.off chair/train/chair_0587.off chair/train/chair_0588.off chair/train/chair_0589.off chair/train/chair_0590.off chair/train/chair_0591.off chair/train/chair_0592.off chair/train/chair_0593.off chair/train/chair_0594.off chair/train/chair_0595.off chair/train/chair_0596.off chair/train/chair_0597.off chair/train/chair_0598.off chair/train/chair_0599.off chair/train/chair_0600.off chair/train/chair_0601.off chair/train/chair_0602.off chair/train/chair_0603.off chair/train/chair_0604.off chair/train/chair_0605.off chair/train/chair_0606.off chair/train/chair_0607.off chair/train/chair_0608.off chair/train/chair_0609.off chair/train/chair_0610.off chair/train/chair_0611.off chair/train/chair_0612.off chair/train/chair_0613.off chair/train/chair_0614.off chair/train/chair_0615.off chair/train/chair_0616.off chair/train/chair_0617.off chair/train/chair_0618.off chair/train/chair_0619.off chair/train/chair_0620.off chair/train/chair_0621.off chair/train/chair_0622.off chair/train/chair_0623.off chair/train/chair_0624.off chair/train/chair_0625.off chair/train/chair_0626.off chair/train/chair_0627.off chair/train/chair_0628.off chair/train/chair_0629.off chair/train/chair_0630.off chair/train/chair_0631.off chair/train/chair_0632.off chair/train/chair_0633.off chair/train/chair_0634.off chair/train/chair_0635.off chair/train/chair_0636.off chair/train/chair_0637.off chair/train/chair_0638.off chair/train/chair_0639.off chair/train/chair_0640.off chair/train/chair_0641.off chair/train/chair_0642.off chair/train/chair_0643.off chair/train/chair_0644.off chair/train/chair_0645.off chair/train/chair_0646.off chair/train/chair_0647.off chair/train/chair_0648.off chair/train/chair_0649.off chair/train/chair_0650.off chair/train/chair_0651.off chair/train/chair_0652.off chair/train/chair_0653.off chair/train/chair_0654.off chair/train/chair_0655.off chair/train/chair_0656.off chair/train/chair_0657.off chair/train/chair_0658.off chair/train/chair_0659.off chair/train/chair_0660.off chair/train/chair_0661.off chair/train/chair_0662.off chair/train/chair_0663.off chair/train/chair_0664.off chair/train/chair_0665.off chair/train/chair_0666.off chair/train/chair_0667.off chair/train/chair_0668.off chair/train/chair_0669.off chair/train/chair_0670.off chair/train/chair_0671.off chair/train/chair_0672.off chair/train/chair_0673.off chair/train/chair_0674.off chair/train/chair_0675.off chair/train/chair_0676.off chair/train/chair_0677.off chair/train/chair_0678.off chair/train/chair_0679.off chair/train/chair_0680.off chair/train/chair_0681.off chair/train/chair_0682.off chair/train/chair_0683.off chair/train/chair_0684.off chair/train/chair_0685.off chair/train/chair_0686.off chair/train/chair_0687.off chair/train/chair_0688.off chair/train/chair_0689.off chair/train/chair_0690.off chair/train/chair_0691.off chair/train/chair_0692.off chair/train/chair_0693.off chair/train/chair_0694.off chair/train/chair_0695.off chair/train/chair_0696.off chair/train/chair_0697.off chair/train/chair_0698.off chair/train/chair_0699.off chair/train/chair_0700.off chair/train/chair_0701.off chair/train/chair_0702.off chair/train/chair_0703.off chair/train/chair_0704.off chair/train/chair_0705.off chair/train/chair_0706.off chair/train/chair_0707.off chair/train/chair_0708.off chair/train/chair_0709.off chair/train/chair_0710.off chair/train/chair_0711.off chair/train/chair_0712.off chair/train/chair_0713.off chair/train/chair_0714.off chair/train/chair_0715.off chair/train/chair_0716.off chair/train/chair_0717.off chair/train/chair_0718.off chair/train/chair_0719.off chair/train/chair_0720.off chair/train/chair_0721.off chair/train/chair_0722.off chair/train/chair_0723.off chair/train/chair_0724.off chair/train/chair_0725.off chair/train/chair_0726.off chair/train/chair_0727.off chair/train/chair_0728.off chair/train/chair_0729.off chair/train/chair_0730.off chair/train/chair_0731.off chair/train/chair_0732.off chair/train/chair_0733.off chair/train/chair_0734.off chair/train/chair_0735.off chair/train/chair_0736.off chair/train/chair_0737.off chair/train/chair_0738.off chair/train/chair_0739.off chair/train/chair_0740.off chair/train/chair_0741.off chair/train/chair_0742.off chair/train/chair_0743.off chair/train/chair_0744.off chair/train/chair_0745.off chair/train/chair_0746.off chair/train/chair_0747.off chair/train/chair_0748.off chair/train/chair_0749.off chair/train/chair_0750.off chair/train/chair_0751.off chair/train/chair_0752.off chair/train/chair_0753.off chair/train/chair_0754.off chair/train/chair_0755.off chair/train/chair_0756.off chair/train/chair_0757.off chair/train/chair_0758.off chair/train/chair_0759.off chair/train/chair_0760.off chair/train/chair_0761.off chair/train/chair_0762.off chair/train/chair_0763.off chair/train/chair_0764.off chair/train/chair_0765.off chair/train/chair_0766.off chair/train/chair_0767.off chair/train/chair_0768.off chair/train/chair_0769.off chair/train/chair_0770.off chair/train/chair_0771.off chair/train/chair_0772.off chair/train/chair_0773.off chair/train/chair_0774.off chair/train/chair_0775.off chair/train/chair_0776.off chair/train/chair_0777.off chair/train/chair_0778.off chair/train/chair_0779.off chair/train/chair_0780.off chair/train/chair_0781.off chair/train/chair_0782.off chair/train/chair_0783.off chair/train/chair_0784.off chair/train/chair_0785.off chair/train/chair_0786.off chair/train/chair_0787.off chair/train/chair_0788.off chair/train/chair_0789.off chair/train/chair_0790.off chair/train/chair_0791.off chair/train/chair_0792.off chair/train/chair_0793.off chair/train/chair_0794.off chair/train/chair_0795.off chair/train/chair_0796.off chair/train/chair_0797.off chair/train/chair_0798.off chair/train/chair_0799.off chair/train/chair_0800.off chair/train/chair_0801.off vase/train/vase_0001.off vase/train/vase_0002.off vase/train/vase_0003.off vase/train/vase_0004.off vase/train/vase_0005.off vase/train/vase_0006.off vase/train/vase_0007.off vase/train/vase_0008.off vase/train/vase_0009.off vase/train/vase_0010.off vase/train/vase_0011.off vase/train/vase_0012.off vase/train/vase_0013.off vase/train/vase_0014.off vase/train/vase_0015.off vase/train/vase_0016.off vase/train/vase_0017.off vase/train/vase_0018.off vase/train/vase_0019.off vase/train/vase_0020.off vase/train/vase_0021.off vase/train/vase_0022.off vase/train/vase_0023.off vase/train/vase_0024.off vase/train/vase_0025.off vase/train/vase_0026.off vase/train/vase_0027.off vase/train/vase_0028.off vase/train/vase_0029.off vase/train/vase_0030.off vase/train/vase_0031.off vase/train/vase_0032.off vase/train/vase_0033.off vase/train/vase_0034.off vase/train/vase_0035.off vase/train/vase_0036.off vase/train/vase_0037.off vase/train/vase_0038.off vase/train/vase_0039.off vase/train/vase_0040.off vase/train/vase_0041.off vase/train/vase_0042.off vase/train/vase_0043.off vase/train/vase_0044.off vase/train/vase_0045.off vase/train/vase_0046.off vase/train/vase_0047.off vase/train/vase_0048.off vase/train/vase_0049.off vase/train/vase_0050.off vase/train/vase_0051.off vase/train/vase_0052.off vase/train/vase_0053.off vase/train/vase_0054.off vase/train/vase_0055.off vase/train/vase_0056.off vase/train/vase_0057.off vase/train/vase_0058.off vase/train/vase_0059.off vase/train/vase_0060.off vase/train/vase_0061.off vase/train/vase_0062.off vase/train/vase_0063.off vase/train/vase_0064.off vase/train/vase_0065.off vase/train/vase_0066.off vase/train/vase_0067.off vase/train/vase_0068.off vase/train/vase_0069.off vase/train/vase_0070.off vase/train/vase_0071.off vase/train/vase_0072.off vase/train/vase_0073.off vase/train/vase_0074.off vase/train/vase_0075.off vase/train/vase_0076.off vase/train/vase_0077.off vase/train/vase_0078.off vase/train/vase_0079.off vase/train/vase_0080.off vase/train/vase_0081.off vase/train/vase_0082.off vase/train/vase_0083.off vase/train/vase_0084.off vase/train/vase_0085.off vase/train/vase_0086.off vase/train/vase_0087.off vase/train/vase_0088.off vase/train/vase_0089.off vase/train/vase_0090.off vase/train/vase_0091.off vase/train/vase_0092.off vase/train/vase_0093.off vase/train/vase_0094.off vase/train/vase_0095.off vase/train/vase_0096.off vase/train/vase_0097.off vase/train/vase_0098.off vase/train/vase_0099.off vase/train/vase_0100.off vase/train/vase_0101.off vase/train/vase_0102.off vase/train/vase_0103.off vase/train/vase_0104.off vase/train/vase_0105.off vase/train/vase_0106.off vase/train/vase_0107.off vase/train/vase_0108.off vase/train/vase_0109.off vase/train/vase_0110.off vase/train/vase_0111.off vase/train/vase_0112.off vase/train/vase_0113.off vase/train/vase_0114.off vase/train/vase_0115.off vase/train/vase_0116.off vase/train/vase_0117.off vase/train/vase_0118.off vase/train/vase_0119.off vase/train/vase_0120.off vase/train/vase_0121.off vase/train/vase_0122.off vase/train/vase_0123.off vase/train/vase_0124.off vase/train/vase_0125.off vase/train/vase_0126.off vase/train/vase_0127.off vase/train/vase_0128.off vase/train/vase_0129.off vase/train/vase_0130.off vase/train/vase_0131.off vase/train/vase_0132.off vase/train/vase_0133.off vase/train/vase_0134.off vase/train/vase_0135.off vase/train/vase_0136.off vase/train/vase_0137.off vase/train/vase_0138.off vase/train/vase_0139.off vase/train/vase_0140.off vase/train/vase_0141.off vase/train/vase_0142.off vase/train/vase_0143.off vase/train/vase_0144.off vase/train/vase_0145.off vase/train/vase_0146.off vase/train/vase_0147.off vase/train/vase_0148.off vase/train/vase_0149.off vase/train/vase_0150.off vase/train/vase_0151.off vase/train/vase_0152.off vase/train/vase_0153.off vase/train/vase_0154.off vase/train/vase_0155.off vase/train/vase_0156.off vase/train/vase_0157.off vase/train/vase_0158.off vase/train/vase_0159.off vase/train/vase_0160.off vase/train/vase_0161.off vase/train/vase_0162.off vase/train/vase_0163.off vase/train/vase_0164.off vase/train/vase_0165.off vase/train/vase_0166.off vase/train/vase_0167.off vase/train/vase_0168.off vase/train/vase_0169.off vase/train/vase_0170.off vase/train/vase_0171.off vase/train/vase_0172.off vase/train/vase_0173.off vase/train/vase_0174.off vase/train/vase_0175.off vase/train/vase_0176.off vase/train/vase_0177.off vase/train/vase_0178.off vase/train/vase_0179.off vase/train/vase_0180.off vase/train/vase_0181.off vase/train/vase_0182.off vase/train/vase_0183.off vase/train/vase_0184.off vase/train/vase_0185.off vase/train/vase_0186.off vase/train/vase_0187.off vase/train/vase_0188.off vase/train/vase_0189.off vase/train/vase_0190.off vase/train/vase_0191.off vase/train/vase_0192.off vase/train/vase_0193.off vase/train/vase_0194.off vase/train/vase_0195.off vase/train/vase_0196.off vase/train/vase_0197.off vase/train/vase_0198.off vase/train/vase_0199.off vase/train/vase_0200.off vase/train/vase_0201.off vase/train/vase_0202.off vase/train/vase_0203.off vase/train/vase_0204.off vase/train/vase_0205.off vase/train/vase_0206.off vase/train/vase_0207.off vase/train/vase_0208.off vase/train/vase_0209.off vase/train/vase_0210.off vase/train/vase_0211.off vase/train/vase_0212.off vase/train/vase_0213.off vase/train/vase_0214.off vase/train/vase_0215.off vase/train/vase_0216.off vase/train/vase_0217.off vase/train/vase_0218.off vase/train/vase_0219.off vase/train/vase_0220.off vase/train/vase_0221.off vase/train/vase_0222.off vase/train/vase_0223.off vase/train/vase_0224.off vase/train/vase_0225.off vase/train/vase_0226.off vase/train/vase_0227.off vase/train/vase_0228.off vase/train/vase_0229.off vase/train/vase_0230.off vase/train/vase_0231.off vase/train/vase_0232.off vase/train/vase_0233.off vase/train/vase_0234.off vase/train/vase_0235.off vase/train/vase_0236.off vase/train/vase_0237.off vase/train/vase_0238.off vase/train/vase_0239.off vase/train/vase_0240.off vase/train/vase_0241.off vase/train/vase_0242.off vase/train/vase_0243.off vase/train/vase_0244.off vase/train/vase_0245.off vase/train/vase_0246.off vase/train/vase_0247.off vase/train/vase_0248.off vase/train/vase_0249.off vase/train/vase_0250.off vase/train/vase_0251.off vase/train/vase_0252.off vase/train/vase_0253.off vase/train/vase_0254.off vase/train/vase_0255.off vase/train/vase_0256.off vase/train/vase_0257.off vase/train/vase_0258.off vase/train/vase_0259.off vase/train/vase_0260.off vase/train/vase_0261.off vase/train/vase_0262.off vase/train/vase_0263.off vase/train/vase_0264.off vase/train/vase_0265.off vase/train/vase_0266.off vase/train/vase_0267.off vase/train/vase_0268.off vase/train/vase_0269.off vase/train/vase_0270.off vase/train/vase_0271.off vase/train/vase_0272.off vase/train/vase_0273.off vase/train/vase_0274.off vase/train/vase_0275.off vase/train/vase_0276.off vase/train/vase_0277.off vase/train/vase_0278.off vase/train/vase_0279.off vase/train/vase_0280.off vase/train/vase_0281.off vase/train/vase_0282.off vase/train/vase_0283.off vase/train/vase_0284.off vase/train/vase_0285.off vase/train/vase_0286.off vase/train/vase_0287.off vase/train/vase_0288.off vase/train/vase_0289.off vase/train/vase_0290.off vase/train/vase_0291.off vase/train/vase_0292.off vase/train/vase_0293.off vase/train/vase_0294.off vase/train/vase_0295.off vase/train/vase_0296.off vase/train/vase_0297.off vase/train/vase_0298.off vase/train/vase_0299.off vase/train/vase_0300.off vase/train/vase_0301.off vase/train/vase_0302.off vase/train/vase_0303.off vase/train/vase_0304.off vase/train/vase_0305.off vase/train/vase_0306.off vase/train/vase_0307.off vase/train/vase_0308.off vase/train/vase_0309.off vase/train/vase_0310.off vase/train/vase_0311.off vase/train/vase_0312.off vase/train/vase_0313.off vase/train/vase_0314.off vase/train/vase_0315.off vase/train/vase_0316.off vase/train/vase_0317.off vase/train/vase_0318.off vase/train/vase_0319.off vase/train/vase_0320.off vase/train/vase_0321.off vase/train/vase_0322.off vase/train/vase_0323.off vase/train/vase_0324.off vase/train/vase_0325.off vase/train/vase_0326.off vase/train/vase_0327.off vase/train/vase_0328.off vase/train/vase_0329.off vase/train/vase_0330.off vase/train/vase_0331.off vase/train/vase_0332.off vase/train/vase_0333.off vase/train/vase_0334.off vase/train/vase_0335.off vase/train/vase_0336.off vase/train/vase_0337.off vase/train/vase_0338.off vase/train/vase_0339.off vase/train/vase_0340.off vase/train/vase_0341.off vase/train/vase_0342.off vase/train/vase_0343.off vase/train/vase_0344.off vase/train/vase_0345.off vase/train/vase_0346.off vase/train/vase_0347.off vase/train/vase_0348.off vase/train/vase_0349.off vase/train/vase_0350.off vase/train/vase_0351.off vase/train/vase_0352.off vase/train/vase_0353.off vase/train/vase_0354.off vase/train/vase_0355.off vase/train/vase_0356.off vase/train/vase_0357.off vase/train/vase_0358.off vase/train/vase_0359.off vase/train/vase_0360.off vase/train/vase_0361.off vase/train/vase_0362.off vase/train/vase_0363.off vase/train/vase_0364.off vase/train/vase_0365.off vase/train/vase_0366.off vase/train/vase_0367.off vase/train/vase_0368.off vase/train/vase_0369.off vase/train/vase_0370.off vase/train/vase_0371.off vase/train/vase_0372.off vase/train/vase_0373.off vase/train/vase_0374.off vase/train/vase_0375.off vase/train/vase_0376.off vase/train/vase_0377.off vase/train/vase_0378.off vase/train/vase_0379.off vase/train/vase_0380.off vase/train/vase_0381.off vase/train/vase_0382.off vase/train/vase_0383.off vase/train/vase_0384.off vase/train/vase_0385.off vase/train/vase_0386.off vase/train/vase_0387.off vase/train/vase_0388.off vase/train/vase_0389.off vase/train/vase_0390.off vase/train/vase_0391.off vase/train/vase_0392.off vase/train/vase_0393.off vase/train/vase_0394.off vase/train/vase_0395.off vase/train/vase_0396.off vase/train/vase_0397.off vase/train/vase_0398.off vase/train/vase_0399.off vase/train/vase_0400.off vase/train/vase_0401.off vase/train/vase_0402.off vase/train/vase_0403.off vase/train/vase_0404.off vase/train/vase_0405.off vase/train/vase_0406.off vase/train/vase_0407.off vase/train/vase_0408.off vase/train/vase_0409.off vase/train/vase_0410.off vase/train/vase_0411.off vase/train/vase_0412.off vase/train/vase_0413.off vase/train/vase_0414.off vase/train/vase_0415.off vase/train/vase_0416.off vase/train/vase_0417.off vase/train/vase_0418.off vase/train/vase_0419.off vase/train/vase_0420.off vase/train/vase_0421.off vase/train/vase_0422.off vase/train/vase_0423.off vase/train/vase_0424.off vase/train/vase_0425.off vase/train/vase_0426.off vase/train/vase_0427.off vase/train/vase_0428.off bookshelf/train/bookshelf_0001.off bookshelf/train/bookshelf_0002.off bookshelf/train/bookshelf_0003.off bookshelf/train/bookshelf_0004.off bookshelf/train/bookshelf_0005.off bookshelf/train/bookshelf_0006.off bookshelf/train/bookshelf_0007.off bookshelf/train/bookshelf_0008.off bookshelf/train/bookshelf_0009.off bookshelf/train/bookshelf_0010.off bookshelf/train/bookshelf_0011.off bookshelf/train/bookshelf_0012.off bookshelf/train/bookshelf_0013.off bookshelf/train/bookshelf_0014.off bookshelf/train/bookshelf_0015.off bookshelf/train/bookshelf_0016.off bookshelf/train/bookshelf_0017.off bookshelf/train/bookshelf_0018.off bookshelf/train/bookshelf_0019.off bookshelf/train/bookshelf_0020.off bookshelf/train/bookshelf_0021.off bookshelf/train/bookshelf_0022.off bookshelf/train/bookshelf_0023.off bookshelf/train/bookshelf_0024.off bookshelf/train/bookshelf_0025.off bookshelf/train/bookshelf_0026.off bookshelf/train/bookshelf_0027.off bookshelf/train/bookshelf_0028.off bookshelf/train/bookshelf_0029.off bookshelf/train/bookshelf_0030.off bookshelf/train/bookshelf_0031.off bookshelf/train/bookshelf_0032.off bookshelf/train/bookshelf_0033.off bookshelf/train/bookshelf_0034.off bookshelf/train/bookshelf_0035.off bookshelf/train/bookshelf_0036.off bookshelf/train/bookshelf_0037.off bookshelf/train/bookshelf_0038.off bookshelf/train/bookshelf_0039.off bookshelf/train/bookshelf_0040.off bookshelf/train/bookshelf_0041.off bookshelf/train/bookshelf_0042.off bookshelf/train/bookshelf_0043.off bookshelf/train/bookshelf_0044.off bookshelf/train/bookshelf_0045.off bookshelf/train/bookshelf_0046.off bookshelf/train/bookshelf_0047.off bookshelf/train/bookshelf_0048.off bookshelf/train/bookshelf_0049.off bookshelf/train/bookshelf_0050.off bookshelf/train/bookshelf_0051.off bookshelf/train/bookshelf_0052.off bookshelf/train/bookshelf_0053.off bookshelf/train/bookshelf_0054.off bookshelf/train/bookshelf_0055.off bookshelf/train/bookshelf_0056.off bookshelf/train/bookshelf_0057.off bookshelf/train/bookshelf_0058.off bookshelf/train/bookshelf_0059.off bookshelf/train/bookshelf_0060.off bookshelf/train/bookshelf_0061.off bookshelf/train/bookshelf_0062.off bookshelf/train/bookshelf_0063.off bookshelf/train/bookshelf_0064.off bookshelf/train/bookshelf_0065.off bookshelf/train/bookshelf_0066.off bookshelf/train/bookshelf_0067.off bookshelf/train/bookshelf_0068.off bookshelf/train/bookshelf_0069.off bookshelf/train/bookshelf_0070.off bookshelf/train/bookshelf_0071.off bookshelf/train/bookshelf_0072.off bookshelf/train/bookshelf_0073.off bookshelf/train/bookshelf_0074.off bookshelf/train/bookshelf_0075.off bookshelf/train/bookshelf_0076.off bookshelf/train/bookshelf_0077.off bookshelf/train/bookshelf_0078.off bookshelf/train/bookshelf_0079.off bookshelf/train/bookshelf_0080.off bookshelf/train/bookshelf_0081.off bookshelf/train/bookshelf_0082.off bookshelf/train/bookshelf_0083.off bookshelf/train/bookshelf_0084.off bookshelf/train/bookshelf_0085.off bookshelf/train/bookshelf_0086.off bookshelf/train/bookshelf_0087.off bookshelf/train/bookshelf_0088.off bookshelf/train/bookshelf_0089.off bookshelf/train/bookshelf_0090.off bookshelf/train/bookshelf_0091.off bookshelf/train/bookshelf_0092.off bookshelf/train/bookshelf_0093.off bookshelf/train/bookshelf_0094.off bookshelf/train/bookshelf_0095.off bookshelf/train/bookshelf_0096.off bookshelf/train/bookshelf_0097.off bookshelf/train/bookshelf_0098.off bookshelf/train/bookshelf_0099.off bookshelf/train/bookshelf_0100.off bookshelf/train/bookshelf_0101.off bookshelf/train/bookshelf_0102.off bookshelf/train/bookshelf_0103.off bookshelf/train/bookshelf_0104.off bookshelf/train/bookshelf_0105.off bookshelf/train/bookshelf_0106.off bookshelf/train/bookshelf_0107.off bookshelf/train/bookshelf_0108.off bookshelf/train/bookshelf_0109.off bookshelf/train/bookshelf_0110.off bookshelf/train/bookshelf_0111.off bookshelf/train/bookshelf_0112.off bookshelf/train/bookshelf_0113.off bookshelf/train/bookshelf_0114.off bookshelf/train/bookshelf_0115.off bookshelf/train/bookshelf_0116.off bookshelf/train/bookshelf_0117.off bookshelf/train/bookshelf_0118.off bookshelf/train/bookshelf_0119.off bookshelf/train/bookshelf_0120.off bookshelf/train/bookshelf_0121.off bookshelf/train/bookshelf_0122.off bookshelf/train/bookshelf_0123.off bookshelf/train/bookshelf_0124.off bookshelf/train/bookshelf_0125.off bookshelf/train/bookshelf_0126.off bookshelf/train/bookshelf_0127.off bookshelf/train/bookshelf_0128.off bookshelf/train/bookshelf_0129.off bookshelf/train/bookshelf_0130.off bookshelf/train/bookshelf_0131.off bookshelf/train/bookshelf_0132.off bookshelf/train/bookshelf_0133.off bookshelf/train/bookshelf_0134.off bookshelf/train/bookshelf_0135.off bookshelf/train/bookshelf_0136.off bookshelf/train/bookshelf_0137.off bookshelf/train/bookshelf_0138.off bookshelf/train/bookshelf_0139.off bookshelf/train/bookshelf_0140.off bookshelf/train/bookshelf_0141.off bookshelf/train/bookshelf_0142.off bookshelf/train/bookshelf_0143.off bookshelf/train/bookshelf_0144.off bookshelf/train/bookshelf_0145.off bookshelf/train/bookshelf_0146.off bookshelf/train/bookshelf_0147.off bookshelf/train/bookshelf_0148.off bookshelf/train/bookshelf_0149.off bookshelf/train/bookshelf_0150.off bookshelf/train/bookshelf_0151.off bookshelf/train/bookshelf_0152.off bookshelf/train/bookshelf_0153.off bookshelf/train/bookshelf_0154.off bookshelf/train/bookshelf_0155.off bookshelf/train/bookshelf_0156.off bookshelf/train/bookshelf_0157.off bookshelf/train/bookshelf_0158.off bookshelf/train/bookshelf_0159.off bookshelf/train/bookshelf_0160.off bookshelf/train/bookshelf_0161.off bookshelf/train/bookshelf_0162.off bookshelf/train/bookshelf_0163.off bookshelf/train/bookshelf_0164.off bookshelf/train/bookshelf_0165.off bookshelf/train/bookshelf_0166.off bookshelf/train/bookshelf_0167.off bookshelf/train/bookshelf_0168.off bookshelf/train/bookshelf_0169.off bookshelf/train/bookshelf_0170.off bookshelf/train/bookshelf_0171.off bookshelf/train/bookshelf_0172.off bookshelf/train/bookshelf_0173.off bookshelf/train/bookshelf_0174.off bookshelf/train/bookshelf_0175.off bookshelf/train/bookshelf_0176.off bookshelf/train/bookshelf_0177.off bookshelf/train/bookshelf_0178.off bookshelf/train/bookshelf_0179.off bookshelf/train/bookshelf_0180.off bookshelf/train/bookshelf_0181.off bookshelf/train/bookshelf_0182.off bookshelf/train/bookshelf_0183.off bookshelf/train/bookshelf_0184.off bookshelf/train/bookshelf_0185.off bookshelf/train/bookshelf_0186.off bookshelf/train/bookshelf_0187.off bookshelf/train/bookshelf_0188.off bookshelf/train/bookshelf_0189.off bookshelf/train/bookshelf_0190.off bookshelf/train/bookshelf_0191.off bookshelf/train/bookshelf_0192.off bookshelf/train/bookshelf_0193.off bookshelf/train/bookshelf_0194.off bookshelf/train/bookshelf_0195.off bookshelf/train/bookshelf_0196.off bookshelf/train/bookshelf_0197.off bookshelf/train/bookshelf_0198.off bookshelf/train/bookshelf_0199.off bookshelf/train/bookshelf_0200.off bookshelf/train/bookshelf_0201.off bookshelf/train/bookshelf_0202.off bookshelf/train/bookshelf_0203.off bookshelf/train/bookshelf_0204.off bookshelf/train/bookshelf_0205.off bookshelf/train/bookshelf_0206.off bookshelf/train/bookshelf_0207.off bookshelf/train/bookshelf_0208.off bookshelf/train/bookshelf_0209.off bookshelf/train/bookshelf_0210.off bookshelf/train/bookshelf_0211.off bookshelf/train/bookshelf_0212.off bookshelf/train/bookshelf_0213.off bookshelf/train/bookshelf_0214.off bookshelf/train/bookshelf_0215.off bookshelf/train/bookshelf_0216.off bookshelf/train/bookshelf_0217.off bookshelf/train/bookshelf_0218.off bookshelf/train/bookshelf_0219.off bookshelf/train/bookshelf_0220.off bookshelf/train/bookshelf_0221.off bookshelf/train/bookshelf_0222.off bookshelf/train/bookshelf_0223.off bookshelf/train/bookshelf_0224.off bookshelf/train/bookshelf_0225.off bookshelf/train/bookshelf_0226.off bookshelf/train/bookshelf_0227.off bookshelf/train/bookshelf_0228.off bookshelf/train/bookshelf_0229.off bookshelf/train/bookshelf_0230.off bookshelf/train/bookshelf_0231.off bookshelf/train/bookshelf_0232.off bookshelf/train/bookshelf_0233.off bookshelf/train/bookshelf_0234.off bookshelf/train/bookshelf_0235.off bookshelf/train/bookshelf_0236.off bookshelf/train/bookshelf_0237.off bookshelf/train/bookshelf_0238.off bookshelf/train/bookshelf_0239.off bookshelf/train/bookshelf_0240.off bookshelf/train/bookshelf_0241.off bookshelf/train/bookshelf_0242.off bookshelf/train/bookshelf_0243.off bookshelf/train/bookshelf_0244.off bookshelf/train/bookshelf_0245.off bookshelf/train/bookshelf_0246.off bookshelf/train/bookshelf_0247.off bookshelf/train/bookshelf_0248.off bookshelf/train/bookshelf_0249.off bookshelf/train/bookshelf_0250.off bookshelf/train/bookshelf_0251.off bookshelf/train/bookshelf_0252.off bookshelf/train/bookshelf_0253.off bookshelf/train/bookshelf_0254.off bookshelf/train/bookshelf_0255.off bookshelf/train/bookshelf_0256.off bookshelf/train/bookshelf_0257.off bookshelf/train/bookshelf_0258.off bookshelf/train/bookshelf_0259.off bookshelf/train/bookshelf_0260.off bookshelf/train/bookshelf_0261.off bookshelf/train/bookshelf_0262.off bookshelf/train/bookshelf_0263.off bookshelf/train/bookshelf_0264.off bookshelf/train/bookshelf_0265.off bookshelf/train/bookshelf_0266.off bookshelf/train/bookshelf_0267.off bookshelf/train/bookshelf_0268.off bookshelf/train/bookshelf_0269.off bookshelf/train/bookshelf_0270.off bookshelf/train/bookshelf_0271.off bookshelf/train/bookshelf_0272.off bookshelf/train/bookshelf_0273.off bookshelf/train/bookshelf_0274.off bookshelf/train/bookshelf_0275.off bookshelf/train/bookshelf_0276.off bookshelf/train/bookshelf_0277.off bookshelf/train/bookshelf_0278.off bookshelf/train/bookshelf_0279.off bookshelf/train/bookshelf_0280.off bookshelf/train/bookshelf_0281.off bookshelf/train/bookshelf_0282.off bookshelf/train/bookshelf_0283.off bookshelf/train/bookshelf_0284.off bookshelf/train/bookshelf_0285.off bookshelf/train/bookshelf_0286.off bookshelf/train/bookshelf_0287.off bookshelf/train/bookshelf_0288.off bookshelf/train/bookshelf_0289.off bookshelf/train/bookshelf_0290.off bookshelf/train/bookshelf_0291.off bookshelf/train/bookshelf_0292.off bookshelf/train/bookshelf_0293.off bookshelf/train/bookshelf_0294.off bookshelf/train/bookshelf_0295.off bookshelf/train/bookshelf_0296.off bookshelf/train/bookshelf_0297.off bookshelf/train/bookshelf_0298.off bookshelf/train/bookshelf_0299.off bookshelf/train/bookshelf_0300.off bookshelf/train/bookshelf_0301.off bookshelf/train/bookshelf_0302.off bookshelf/train/bookshelf_0303.off bookshelf/train/bookshelf_0304.off bookshelf/train/bookshelf_0305.off bookshelf/train/bookshelf_0306.off bookshelf/train/bookshelf_0307.off bookshelf/train/bookshelf_0308.off bookshelf/train/bookshelf_0309.off bookshelf/train/bookshelf_0310.off bookshelf/train/bookshelf_0311.off bookshelf/train/bookshelf_0312.off bookshelf/train/bookshelf_0313.off bookshelf/train/bookshelf_0314.off bookshelf/train/bookshelf_0315.off bookshelf/train/bookshelf_0316.off bookshelf/train/bookshelf_0317.off bookshelf/train/bookshelf_0318.off bookshelf/train/bookshelf_0319.off bookshelf/train/bookshelf_0320.off bookshelf/train/bookshelf_0321.off bookshelf/train/bookshelf_0322.off bookshelf/train/bookshelf_0323.off bookshelf/train/bookshelf_0324.off bookshelf/train/bookshelf_0325.off bookshelf/train/bookshelf_0326.off bookshelf/train/bookshelf_0327.off bookshelf/train/bookshelf_0328.off bookshelf/train/bookshelf_0329.off bookshelf/train/bookshelf_0330.off bookshelf/train/bookshelf_0331.off bookshelf/train/bookshelf_0332.off bookshelf/train/bookshelf_0333.off bookshelf/train/bookshelf_0334.off bookshelf/train/bookshelf_0335.off bookshelf/train/bookshelf_0336.off bookshelf/train/bookshelf_0337.off bookshelf/train/bookshelf_0338.off bookshelf/train/bookshelf_0339.off bookshelf/train/bookshelf_0340.off bookshelf/train/bookshelf_0341.off bookshelf/train/bookshelf_0342.off bookshelf/train/bookshelf_0343.off bookshelf/train/bookshelf_0344.off bookshelf/train/bookshelf_0345.off bookshelf/train/bookshelf_0346.off bookshelf/train/bookshelf_0347.off bookshelf/train/bookshelf_0348.off bookshelf/train/bookshelf_0349.off bookshelf/train/bookshelf_0350.off bookshelf/train/bookshelf_0351.off bookshelf/train/bookshelf_0352.off bookshelf/train/bookshelf_0353.off bookshelf/train/bookshelf_0354.off bookshelf/train/bookshelf_0355.off bookshelf/train/bookshelf_0356.off bookshelf/train/bookshelf_0357.off bookshelf/train/bookshelf_0358.off bookshelf/train/bookshelf_0359.off bookshelf/train/bookshelf_0360.off bookshelf/train/bookshelf_0361.off bookshelf/train/bookshelf_0362.off bookshelf/train/bookshelf_0363.off bookshelf/train/bookshelf_0364.off bookshelf/train/bookshelf_0365.off bookshelf/train/bookshelf_0366.off bookshelf/train/bookshelf_0367.off bookshelf/train/bookshelf_0368.off bookshelf/train/bookshelf_0369.off bookshelf/train/bookshelf_0370.off bookshelf/train/bookshelf_0371.off bookshelf/train/bookshelf_0372.off bookshelf/train/bookshelf_0373.off bookshelf/train/bookshelf_0374.off bookshelf/train/bookshelf_0375.off bookshelf/train/bookshelf_0376.off bookshelf/train/bookshelf_0377.off bookshelf/train/bookshelf_0378.off bookshelf/train/bookshelf_0379.off bookshelf/train/bookshelf_0380.off bookshelf/train/bookshelf_0381.off bookshelf/train/bookshelf_0382.off bookshelf/train/bookshelf_0383.off bookshelf/train/bookshelf_0384.off bookshelf/train/bookshelf_0385.off bookshelf/train/bookshelf_0386.off bookshelf/train/bookshelf_0387.off bookshelf/train/bookshelf_0388.off bookshelf/train/bookshelf_0389.off bookshelf/train/bookshelf_0390.off bookshelf/train/bookshelf_0391.off bookshelf/train/bookshelf_0392.off bookshelf/train/bookshelf_0393.off bookshelf/train/bookshelf_0394.off bookshelf/train/bookshelf_0395.off bookshelf/train/bookshelf_0396.off bookshelf/train/bookshelf_0397.off bookshelf/train/bookshelf_0398.off bookshelf/train/bookshelf_0399.off bookshelf/train/bookshelf_0400.off bookshelf/train/bookshelf_0401.off bookshelf/train/bookshelf_0402.off bookshelf/train/bookshelf_0403.off bookshelf/train/bookshelf_0404.off bookshelf/train/bookshelf_0405.off bookshelf/train/bookshelf_0406.off bookshelf/train/bookshelf_0407.off bookshelf/train/bookshelf_0408.off bookshelf/train/bookshelf_0409.off bookshelf/train/bookshelf_0410.off bookshelf/train/bookshelf_0411.off bookshelf/train/bookshelf_0412.off bookshelf/train/bookshelf_0413.off bookshelf/train/bookshelf_0414.off bookshelf/train/bookshelf_0415.off bookshelf/train/bookshelf_0416.off bookshelf/train/bookshelf_0417.off bookshelf/train/bookshelf_0418.off bookshelf/train/bookshelf_0419.off bookshelf/train/bookshelf_0420.off bookshelf/train/bookshelf_0421.off bookshelf/train/bookshelf_0422.off bookshelf/train/bookshelf_0423.off bookshelf/train/bookshelf_0424.off bookshelf/train/bookshelf_0425.off bookshelf/train/bookshelf_0426.off bookshelf/train/bookshelf_0427.off bookshelf/train/bookshelf_0428.off bookshelf/train/bookshelf_0429.off bookshelf/train/bookshelf_0430.off bookshelf/train/bookshelf_0431.off bookshelf/train/bookshelf_0432.off bookshelf/train/bookshelf_0433.off bookshelf/train/bookshelf_0434.off bookshelf/train/bookshelf_0435.off bookshelf/train/bookshelf_0436.off bookshelf/train/bookshelf_0437.off bookshelf/train/bookshelf_0438.off bookshelf/train/bookshelf_0439.off bookshelf/train/bookshelf_0440.off bookshelf/train/bookshelf_0441.off bookshelf/train/bookshelf_0442.off bookshelf/train/bookshelf_0443.off bookshelf/train/bookshelf_0444.off bookshelf/train/bookshelf_0445.off bookshelf/train/bookshelf_0446.off bookshelf/train/bookshelf_0447.off bookshelf/train/bookshelf_0448.off bookshelf/train/bookshelf_0449.off bookshelf/train/bookshelf_0450.off bookshelf/train/bookshelf_0451.off bookshelf/train/bookshelf_0452.off bookshelf/train/bookshelf_0453.off bookshelf/train/bookshelf_0454.off bookshelf/train/bookshelf_0455.off bookshelf/train/bookshelf_0456.off bookshelf/train/bookshelf_0457.off bookshelf/train/bookshelf_0458.off bookshelf/train/bookshelf_0459.off bookshelf/train/bookshelf_0460.off bookshelf/train/bookshelf_0461.off bookshelf/train/bookshelf_0462.off bookshelf/train/bookshelf_0463.off bookshelf/train/bookshelf_0464.off bookshelf/train/bookshelf_0465.off bookshelf/train/bookshelf_0466.off bookshelf/train/bookshelf_0467.off bookshelf/train/bookshelf_0468.off bookshelf/train/bookshelf_0469.off bookshelf/train/bookshelf_0470.off bookshelf/train/bookshelf_0471.off bookshelf/train/bookshelf_0472.off bookshelf/train/bookshelf_0473.off bookshelf/train/bookshelf_0474.off bookshelf/train/bookshelf_0475.off bookshelf/train/bookshelf_0476.off bookshelf/train/bookshelf_0477.off bookshelf/train/bookshelf_0478.off bookshelf/train/bookshelf_0479.off bookshelf/train/bookshelf_0480.off bookshelf/train/bookshelf_0481.off bookshelf/train/bookshelf_0482.off bookshelf/train/bookshelf_0483.off bookshelf/train/bookshelf_0484.off bookshelf/train/bookshelf_0485.off bookshelf/train/bookshelf_0486.off bookshelf/train/bookshelf_0487.off bookshelf/train/bookshelf_0488.off bookshelf/train/bookshelf_0489.off bookshelf/train/bookshelf_0490.off bookshelf/train/bookshelf_0491.off bookshelf/train/bookshelf_0492.off bookshelf/train/bookshelf_0493.off bookshelf/train/bookshelf_0494.off bookshelf/train/bookshelf_0495.off bookshelf/train/bookshelf_0496.off bookshelf/train/bookshelf_0497.off bookshelf/train/bookshelf_0498.off bookshelf/train/bookshelf_0499.off bookshelf/train/bookshelf_0500.off bookshelf/train/bookshelf_0501.off bookshelf/train/bookshelf_0502.off bookshelf/train/bookshelf_0503.off bookshelf/train/bookshelf_0504.off bookshelf/train/bookshelf_0505.off bookshelf/train/bookshelf_0506.off bookshelf/train/bookshelf_0507.off bookshelf/train/bookshelf_0508.off bookshelf/train/bookshelf_0509.off bookshelf/train/bookshelf_0510.off bookshelf/train/bookshelf_0511.off bookshelf/train/bookshelf_0512.off bookshelf/train/bookshelf_0513.off bookshelf/train/bookshelf_0514.off bookshelf/train/bookshelf_0515.off guitar/train/guitar_0001.off guitar/train/guitar_0002.off guitar/train/guitar_0003.off guitar/train/guitar_0004.off guitar/train/guitar_0005.off guitar/train/guitar_0006.off guitar/train/guitar_0007.off guitar/train/guitar_0008.off guitar/train/guitar_0009.off guitar/train/guitar_0010.off guitar/train/guitar_0011.off guitar/train/guitar_0012.off guitar/train/guitar_0013.off guitar/train/guitar_0014.off guitar/train/guitar_0015.off guitar/train/guitar_0016.off guitar/train/guitar_0017.off guitar/train/guitar_0018.off guitar/train/guitar_0019.off guitar/train/guitar_0020.off guitar/train/guitar_0021.off guitar/train/guitar_0022.off guitar/train/guitar_0023.off guitar/train/guitar_0024.off guitar/train/guitar_0025.off guitar/train/guitar_0026.off guitar/train/guitar_0027.off guitar/train/guitar_0028.off guitar/train/guitar_0029.off guitar/train/guitar_0030.off guitar/train/guitar_0031.off guitar/train/guitar_0032.off guitar/train/guitar_0033.off guitar/train/guitar_0034.off guitar/train/guitar_0035.off guitar/train/guitar_0036.off guitar/train/guitar_0037.off guitar/train/guitar_0038.off guitar/train/guitar_0039.off guitar/train/guitar_0040.off guitar/train/guitar_0041.off guitar/train/guitar_0042.off guitar/train/guitar_0043.off guitar/train/guitar_0044.off guitar/train/guitar_0045.off guitar/train/guitar_0046.off guitar/train/guitar_0047.off guitar/train/guitar_0048.off guitar/train/guitar_0049.off guitar/train/guitar_0050.off guitar/train/guitar_0051.off guitar/train/guitar_0052.off guitar/train/guitar_0053.off guitar/train/guitar_0054.off guitar/train/guitar_0055.off guitar/train/guitar_0056.off guitar/train/guitar_0057.off guitar/train/guitar_0058.off guitar/train/guitar_0059.off guitar/train/guitar_0060.off guitar/train/guitar_0061.off guitar/train/guitar_0062.off guitar/train/guitar_0063.off guitar/train/guitar_0064.off guitar/train/guitar_0065.off guitar/train/guitar_0066.off guitar/train/guitar_0067.off guitar/train/guitar_0068.off guitar/train/guitar_0069.off guitar/train/guitar_0070.off guitar/train/guitar_0071.off guitar/train/guitar_0072.off guitar/train/guitar_0073.off guitar/train/guitar_0074.off guitar/train/guitar_0075.off guitar/train/guitar_0076.off guitar/train/guitar_0077.off guitar/train/guitar_0078.off guitar/train/guitar_0079.off guitar/train/guitar_0080.off guitar/train/guitar_0081.off guitar/train/guitar_0082.off guitar/train/guitar_0083.off guitar/train/guitar_0084.off guitar/train/guitar_0085.off guitar/train/guitar_0086.off guitar/train/guitar_0087.off guitar/train/guitar_0088.off guitar/train/guitar_0089.off guitar/train/guitar_0090.off guitar/train/guitar_0091.off guitar/train/guitar_0092.off guitar/train/guitar_0093.off guitar/train/guitar_0094.off guitar/train/guitar_0095.off guitar/train/guitar_0096.off guitar/train/guitar_0097.off guitar/train/guitar_0098.off guitar/train/guitar_0099.off guitar/train/guitar_0100.off guitar/train/guitar_0101.off guitar/train/guitar_0102.off guitar/train/guitar_0103.off guitar/train/guitar_0104.off guitar/train/guitar_0105.off guitar/train/guitar_0106.off guitar/train/guitar_0107.off guitar/train/guitar_0108.off guitar/train/guitar_0109.off guitar/train/guitar_0110.off guitar/train/guitar_0111.off guitar/train/guitar_0112.off guitar/train/guitar_0113.off guitar/train/guitar_0114.off guitar/train/guitar_0115.off guitar/train/guitar_0116.off guitar/train/guitar_0117.off guitar/train/guitar_0118.off guitar/train/guitar_0119.off guitar/train/guitar_0120.off guitar/train/guitar_0121.off guitar/train/guitar_0122.off guitar/train/guitar_0123.off guitar/train/guitar_0124.off guitar/train/guitar_0125.off guitar/train/guitar_0126.off guitar/train/guitar_0127.off guitar/train/guitar_0128.off guitar/train/guitar_0129.off guitar/train/guitar_0130.off guitar/train/guitar_0131.off guitar/train/guitar_0132.off guitar/train/guitar_0133.off guitar/train/guitar_0134.off guitar/train/guitar_0135.off guitar/train/guitar_0136.off guitar/train/guitar_0137.off guitar/train/guitar_0138.off guitar/train/guitar_0139.off guitar/train/guitar_0140.off tv_stand/train/tv_stand_0001.off tv_stand/train/tv_stand_0002.off tv_stand/train/tv_stand_0003.off tv_stand/train/tv_stand_0004.off tv_stand/train/tv_stand_0005.off tv_stand/train/tv_stand_0006.off tv_stand/train/tv_stand_0007.off tv_stand/train/tv_stand_0008.off tv_stand/train/tv_stand_0009.off tv_stand/train/tv_stand_0010.off tv_stand/train/tv_stand_0011.off tv_stand/train/tv_stand_0012.off tv_stand/train/tv_stand_0013.off tv_stand/train/tv_stand_0014.off tv_stand/train/tv_stand_0015.off tv_stand/train/tv_stand_0016.off tv_stand/train/tv_stand_0017.off tv_stand/train/tv_stand_0018.off tv_stand/train/tv_stand_0019.off tv_stand/train/tv_stand_0020.off tv_stand/train/tv_stand_0021.off tv_stand/train/tv_stand_0022.off tv_stand/train/tv_stand_0023.off tv_stand/train/tv_stand_0024.off tv_stand/train/tv_stand_0025.off tv_stand/train/tv_stand_0026.off tv_stand/train/tv_stand_0027.off tv_stand/train/tv_stand_0028.off tv_stand/train/tv_stand_0029.off tv_stand/train/tv_stand_0030.off tv_stand/train/tv_stand_0031.off tv_stand/train/tv_stand_0032.off tv_stand/train/tv_stand_0033.off tv_stand/train/tv_stand_0034.off tv_stand/train/tv_stand_0035.off tv_stand/train/tv_stand_0036.off tv_stand/train/tv_stand_0037.off tv_stand/train/tv_stand_0038.off tv_stand/train/tv_stand_0039.off tv_stand/train/tv_stand_0040.off tv_stand/train/tv_stand_0041.off tv_stand/train/tv_stand_0042.off tv_stand/train/tv_stand_0043.off tv_stand/train/tv_stand_0044.off tv_stand/train/tv_stand_0045.off tv_stand/train/tv_stand_0046.off tv_stand/train/tv_stand_0047.off tv_stand/train/tv_stand_0048.off tv_stand/train/tv_stand_0049.off tv_stand/train/tv_stand_0050.off tv_stand/train/tv_stand_0051.off tv_stand/train/tv_stand_0052.off tv_stand/train/tv_stand_0053.off tv_stand/train/tv_stand_0054.off tv_stand/train/tv_stand_0055.off tv_stand/train/tv_stand_0056.off tv_stand/train/tv_stand_0057.off tv_stand/train/tv_stand_0058.off tv_stand/train/tv_stand_0059.off tv_stand/train/tv_stand_0060.off tv_stand/train/tv_stand_0061.off tv_stand/train/tv_stand_0062.off tv_stand/train/tv_stand_0063.off tv_stand/train/tv_stand_0064.off tv_stand/train/tv_stand_0065.off tv_stand/train/tv_stand_0066.off tv_stand/train/tv_stand_0067.off tv_stand/train/tv_stand_0068.off tv_stand/train/tv_stand_0069.off tv_stand/train/tv_stand_0070.off tv_stand/train/tv_stand_0071.off tv_stand/train/tv_stand_0072.off tv_stand/train/tv_stand_0073.off tv_stand/train/tv_stand_0074.off tv_stand/train/tv_stand_0075.off tv_stand/train/tv_stand_0076.off tv_stand/train/tv_stand_0077.off tv_stand/train/tv_stand_0078.off tv_stand/train/tv_stand_0079.off tv_stand/train/tv_stand_0080.off tv_stand/train/tv_stand_0081.off tv_stand/train/tv_stand_0082.off tv_stand/train/tv_stand_0083.off tv_stand/train/tv_stand_0084.off tv_stand/train/tv_stand_0085.off tv_stand/train/tv_stand_0086.off tv_stand/train/tv_stand_0087.off tv_stand/train/tv_stand_0088.off tv_stand/train/tv_stand_0089.off tv_stand/train/tv_stand_0090.off tv_stand/train/tv_stand_0091.off tv_stand/train/tv_stand_0092.off tv_stand/train/tv_stand_0093.off tv_stand/train/tv_stand_0094.off tv_stand/train/tv_stand_0095.off tv_stand/train/tv_stand_0096.off tv_stand/train/tv_stand_0097.off tv_stand/train/tv_stand_0098.off tv_stand/train/tv_stand_0099.off tv_stand/train/tv_stand_0100.off tv_stand/train/tv_stand_0101.off tv_stand/train/tv_stand_0102.off tv_stand/train/tv_stand_0103.off tv_stand/train/tv_stand_0104.off tv_stand/train/tv_stand_0105.off tv_stand/train/tv_stand_0106.off tv_stand/train/tv_stand_0107.off tv_stand/train/tv_stand_0108.off tv_stand/train/tv_stand_0109.off tv_stand/train/tv_stand_0110.off tv_stand/train/tv_stand_0111.off tv_stand/train/tv_stand_0112.off tv_stand/train/tv_stand_0113.off tv_stand/train/tv_stand_0114.off tv_stand/train/tv_stand_0115.off tv_stand/train/tv_stand_0116.off tv_stand/train/tv_stand_0117.off tv_stand/train/tv_stand_0118.off tv_stand/train/tv_stand_0119.off tv_stand/train/tv_stand_0120.off tv_stand/train/tv_stand_0121.off tv_stand/train/tv_stand_0122.off tv_stand/train/tv_stand_0123.off tv_stand/train/tv_stand_0124.off tv_stand/train/tv_stand_0125.off tv_stand/train/tv_stand_0126.off tv_stand/train/tv_stand_0127.off tv_stand/train/tv_stand_0128.off tv_stand/train/tv_stand_0129.off tv_stand/train/tv_stand_0130.off tv_stand/train/tv_stand_0131.off tv_stand/train/tv_stand_0132.off tv_stand/train/tv_stand_0133.off tv_stand/train/tv_stand_0134.off tv_stand/train/tv_stand_0135.off tv_stand/train/tv_stand_0136.off tv_stand/train/tv_stand_0137.off tv_stand/train/tv_stand_0138.off tv_stand/train/tv_stand_0139.off tv_stand/train/tv_stand_0140.off tv_stand/train/tv_stand_0141.off tv_stand/train/tv_stand_0142.off tv_stand/train/tv_stand_0143.off tv_stand/train/tv_stand_0144.off tv_stand/train/tv_stand_0145.off tv_stand/train/tv_stand_0146.off tv_stand/train/tv_stand_0147.off tv_stand/train/tv_stand_0148.off tv_stand/train/tv_stand_0149.off tv_stand/train/tv_stand_0150.off tv_stand/train/tv_stand_0151.off tv_stand/train/tv_stand_0152.off tv_stand/train/tv_stand_0153.off tv_stand/train/tv_stand_0154.off tv_stand/train/tv_stand_0155.off tv_stand/train/tv_stand_0156.off tv_stand/train/tv_stand_0157.off tv_stand/train/tv_stand_0158.off tv_stand/train/tv_stand_0159.off tv_stand/train/tv_stand_0160.off tv_stand/train/tv_stand_0161.off tv_stand/train/tv_stand_0162.off tv_stand/train/tv_stand_0163.off tv_stand/train/tv_stand_0164.off tv_stand/train/tv_stand_0165.off tv_stand/train/tv_stand_0166.off tv_stand/train/tv_stand_0167.off tv_stand/train/tv_stand_0168.off tv_stand/train/tv_stand_0169.off tv_stand/train/tv_stand_0170.off tv_stand/train/tv_stand_0171.off tv_stand/train/tv_stand_0172.off tv_stand/train/tv_stand_0173.off tv_stand/train/tv_stand_0174.off tv_stand/train/tv_stand_0175.off tv_stand/train/tv_stand_0176.off tv_stand/train/tv_stand_0177.off tv_stand/train/tv_stand_0178.off tv_stand/train/tv_stand_0179.off tv_stand/train/tv_stand_0180.off tv_stand/train/tv_stand_0181.off tv_stand/train/tv_stand_0182.off tv_stand/train/tv_stand_0183.off tv_stand/train/tv_stand_0184.off tv_stand/train/tv_stand_0185.off tv_stand/train/tv_stand_0186.off tv_stand/train/tv_stand_0187.off tv_stand/train/tv_stand_0188.off tv_stand/train/tv_stand_0189.off tv_stand/train/tv_stand_0190.off tv_stand/train/tv_stand_0191.off tv_stand/train/tv_stand_0192.off tv_stand/train/tv_stand_0193.off tv_stand/train/tv_stand_0194.off tv_stand/train/tv_stand_0195.off tv_stand/train/tv_stand_0196.off tv_stand/train/tv_stand_0197.off tv_stand/train/tv_stand_0198.off tv_stand/train/tv_stand_0199.off tv_stand/train/tv_stand_0200.off tv_stand/train/tv_stand_0201.off tv_stand/train/tv_stand_0202.off tv_stand/train/tv_stand_0203.off tv_stand/train/tv_stand_0204.off tv_stand/train/tv_stand_0205.off tv_stand/train/tv_stand_0206.off tv_stand/train/tv_stand_0207.off tv_stand/train/tv_stand_0208.off tv_stand/train/tv_stand_0209.off tv_stand/train/tv_stand_0210.off tv_stand/train/tv_stand_0211.off tv_stand/train/tv_stand_0212.off tv_stand/train/tv_stand_0213.off tv_stand/train/tv_stand_0214.off tv_stand/train/tv_stand_0215.off tv_stand/train/tv_stand_0216.off tv_stand/train/tv_stand_0217.off tv_stand/train/tv_stand_0218.off tv_stand/train/tv_stand_0219.off tv_stand/train/tv_stand_0220.off tv_stand/train/tv_stand_0221.off tv_stand/train/tv_stand_0222.off tv_stand/train/tv_stand_0223.off tv_stand/train/tv_stand_0224.off tv_stand/train/tv_stand_0225.off tv_stand/train/tv_stand_0226.off tv_stand/train/tv_stand_0227.off tv_stand/train/tv_stand_0228.off tv_stand/train/tv_stand_0229.off tv_stand/train/tv_stand_0230.off tv_stand/train/tv_stand_0231.off tv_stand/train/tv_stand_0232.off tv_stand/train/tv_stand_0233.off tv_stand/train/tv_stand_0234.off tv_stand/train/tv_stand_0235.off tv_stand/train/tv_stand_0236.off tv_stand/train/tv_stand_0237.off tv_stand/train/tv_stand_0238.off tv_stand/train/tv_stand_0239.off tv_stand/train/tv_stand_0240.off tv_stand/train/tv_stand_0241.off bathtub/train/bathtub_0001.off bathtub/train/bathtub_0002.off bathtub/train/bathtub_0003.off bathtub/train/bathtub_0004.off bathtub/train/bathtub_0005.off bathtub/train/bathtub_0006.off bathtub/train/bathtub_0007.off bathtub/train/bathtub_0008.off bathtub/train/bathtub_0009.off bathtub/train/bathtub_0010.off bathtub/train/bathtub_0011.off bathtub/train/bathtub_0012.off bathtub/train/bathtub_0013.off bathtub/train/bathtub_0014.off bathtub/train/bathtub_0015.off bathtub/train/bathtub_0016.off bathtub/train/bathtub_0017.off bathtub/train/bathtub_0018.off bathtub/train/bathtub_0019.off bathtub/train/bathtub_0020.off bathtub/train/bathtub_0021.off bathtub/train/bathtub_0022.off bathtub/train/bathtub_0023.off bathtub/train/bathtub_0024.off bathtub/train/bathtub_0025.off bathtub/train/bathtub_0026.off bathtub/train/bathtub_0027.off bathtub/train/bathtub_0028.off bathtub/train/bathtub_0029.off bathtub/train/bathtub_0030.off bathtub/train/bathtub_0031.off bathtub/train/bathtub_0032.off bathtub/train/bathtub_0033.off bathtub/train/bathtub_0034.off bathtub/train/bathtub_0035.off bathtub/train/bathtub_0036.off bathtub/train/bathtub_0037.off bathtub/train/bathtub_0038.off bathtub/train/bathtub_0039.off bathtub/train/bathtub_0040.off bathtub/train/bathtub_0041.off bathtub/train/bathtub_0042.off bathtub/train/bathtub_0043.off bathtub/train/bathtub_0044.off bathtub/train/bathtub_0045.off bathtub/train/bathtub_0046.off bathtub/train/bathtub_0047.off bathtub/train/bathtub_0048.off bathtub/train/bathtub_0049.off bathtub/train/bathtub_0050.off bathtub/train/bathtub_0051.off bathtub/train/bathtub_0052.off bathtub/train/bathtub_0053.off bathtub/train/bathtub_0054.off bathtub/train/bathtub_0055.off bathtub/train/bathtub_0056.off bathtub/train/bathtub_0057.off bathtub/train/bathtub_0058.off bathtub/train/bathtub_0059.off bathtub/train/bathtub_0060.off bathtub/train/bathtub_0061.off bathtub/train/bathtub_0062.off bathtub/train/bathtub_0063.off bathtub/train/bathtub_0064.off bathtub/train/bathtub_0065.off bathtub/train/bathtub_0066.off bathtub/train/bathtub_0067.off bathtub/train/bathtub_0068.off bathtub/train/bathtub_0069.off bathtub/train/bathtub_0070.off bathtub/train/bathtub_0071.off bathtub/train/bathtub_0072.off bathtub/train/bathtub_0073.off bathtub/train/bathtub_0074.off bathtub/train/bathtub_0075.off bathtub/train/bathtub_0076.off bathtub/train/bathtub_0077.off bathtub/train/bathtub_0078.off bathtub/train/bathtub_0079.off bathtub/train/bathtub_0080.off bathtub/train/bathtub_0081.off bathtub/train/bathtub_0082.off bathtub/train/bathtub_0083.off bathtub/train/bathtub_0084.off bathtub/train/bathtub_0085.off bathtub/train/bathtub_0086.off bathtub/train/bathtub_0087.off bathtub/train/bathtub_0088.off bathtub/train/bathtub_0089.off bathtub/train/bathtub_0090.off bathtub/train/bathtub_0091.off bathtub/train/bathtub_0092.off bathtub/train/bathtub_0093.off bathtub/train/bathtub_0094.off bathtub/train/bathtub_0095.off bathtub/train/bathtub_0096.off monitor/train/monitor_0001.off monitor/train/monitor_0002.off monitor/train/monitor_0003.off monitor/train/monitor_0004.off monitor/train/monitor_0005.off monitor/train/monitor_0006.off monitor/train/monitor_0007.off monitor/train/monitor_0008.off monitor/train/monitor_0009.off monitor/train/monitor_0010.off monitor/train/monitor_0011.off monitor/train/monitor_0012.off monitor/train/monitor_0013.off monitor/train/monitor_0014.off monitor/train/monitor_0015.off monitor/train/monitor_0016.off monitor/train/monitor_0017.off monitor/train/monitor_0018.off monitor/train/monitor_0019.off monitor/train/monitor_0020.off monitor/train/monitor_0021.off monitor/train/monitor_0022.off monitor/train/monitor_0023.off monitor/train/monitor_0024.off monitor/train/monitor_0025.off monitor/train/monitor_0026.off monitor/train/monitor_0027.off monitor/train/monitor_0028.off monitor/train/monitor_0029.off monitor/train/monitor_0030.off monitor/train/monitor_0031.off monitor/train/monitor_0032.off monitor/train/monitor_0033.off monitor/train/monitor_0034.off monitor/train/monitor_0035.off monitor/train/monitor_0036.off monitor/train/monitor_0037.off monitor/train/monitor_0038.off monitor/train/monitor_0039.off monitor/train/monitor_0040.off monitor/train/monitor_0041.off monitor/train/monitor_0042.off monitor/train/monitor_0043.off monitor/train/monitor_0044.off monitor/train/monitor_0045.off monitor/train/monitor_0046.off monitor/train/monitor_0047.off monitor/train/monitor_0048.off monitor/train/monitor_0049.off monitor/train/monitor_0050.off monitor/train/monitor_0051.off monitor/train/monitor_0052.off monitor/train/monitor_0053.off monitor/train/monitor_0054.off monitor/train/monitor_0055.off monitor/train/monitor_0056.off monitor/train/monitor_0057.off monitor/train/monitor_0058.off monitor/train/monitor_0059.off monitor/train/monitor_0060.off monitor/train/monitor_0061.off monitor/train/monitor_0062.off monitor/train/monitor_0063.off monitor/train/monitor_0064.off monitor/train/monitor_0065.off monitor/train/monitor_0066.off monitor/train/monitor_0067.off monitor/train/monitor_0068.off monitor/train/monitor_0069.off monitor/train/monitor_0070.off monitor/train/monitor_0071.off monitor/train/monitor_0072.off monitor/train/monitor_0073.off monitor/train/monitor_0074.off monitor/train/monitor_0075.off monitor/train/monitor_0076.off monitor/train/monitor_0077.off monitor/train/monitor_0078.off monitor/train/monitor_0079.off monitor/train/monitor_0080.off monitor/train/monitor_0081.off monitor/train/monitor_0082.off monitor/train/monitor_0083.off monitor/train/monitor_0084.off monitor/train/monitor_0085.off monitor/train/monitor_0086.off monitor/train/monitor_0087.off monitor/train/monitor_0088.off monitor/train/monitor_0089.off monitor/train/monitor_0090.off monitor/train/monitor_0091.off monitor/train/monitor_0092.off monitor/train/monitor_0093.off monitor/train/monitor_0094.off monitor/train/monitor_0095.off monitor/train/monitor_0096.off monitor/train/monitor_0097.off monitor/train/monitor_0098.off monitor/train/monitor_0099.off monitor/train/monitor_0100.off monitor/train/monitor_0101.off monitor/train/monitor_0102.off monitor/train/monitor_0103.off monitor/train/monitor_0104.off monitor/train/monitor_0105.off monitor/train/monitor_0106.off monitor/train/monitor_0107.off monitor/train/monitor_0108.off monitor/train/monitor_0109.off monitor/train/monitor_0110.off monitor/train/monitor_0111.off monitor/train/monitor_0112.off monitor/train/monitor_0113.off monitor/train/monitor_0114.off monitor/train/monitor_0115.off monitor/train/monitor_0116.off monitor/train/monitor_0117.off monitor/train/monitor_0118.off monitor/train/monitor_0119.off monitor/train/monitor_0120.off monitor/train/monitor_0121.off monitor/train/monitor_0122.off monitor/train/monitor_0123.off monitor/train/monitor_0124.off monitor/train/monitor_0125.off monitor/train/monitor_0126.off monitor/train/monitor_0127.off monitor/train/monitor_0128.off monitor/train/monitor_0129.off monitor/train/monitor_0130.off monitor/train/monitor_0131.off monitor/train/monitor_0132.off monitor/train/monitor_0133.off monitor/train/monitor_0134.off monitor/train/monitor_0135.off monitor/train/monitor_0136.off monitor/train/monitor_0137.off monitor/train/monitor_0138.off monitor/train/monitor_0139.off monitor/train/monitor_0140.off monitor/train/monitor_0141.off monitor/train/monitor_0142.off monitor/train/monitor_0143.off monitor/train/monitor_0144.off monitor/train/monitor_0145.off monitor/train/monitor_0146.off monitor/train/monitor_0147.off monitor/train/monitor_0148.off monitor/train/monitor_0149.off monitor/train/monitor_0150.off monitor/train/monitor_0151.off monitor/train/monitor_0152.off monitor/train/monitor_0153.off monitor/train/monitor_0154.off monitor/train/monitor_0155.off monitor/train/monitor_0156.off monitor/train/monitor_0157.off monitor/train/monitor_0158.off monitor/train/monitor_0159.off monitor/train/monitor_0160.off monitor/train/monitor_0161.off monitor/train/monitor_0162.off monitor/train/monitor_0163.off monitor/train/monitor_0164.off monitor/train/monitor_0165.off monitor/train/monitor_0166.off monitor/train/monitor_0167.off monitor/train/monitor_0168.off monitor/train/monitor_0169.off monitor/train/monitor_0170.off monitor/train/monitor_0171.off monitor/train/monitor_0172.off monitor/train/monitor_0173.off monitor/train/monitor_0174.off monitor/train/monitor_0175.off monitor/train/monitor_0176.off monitor/train/monitor_0177.off monitor/train/monitor_0178.off monitor/train/monitor_0179.off monitor/train/monitor_0180.off monitor/train/monitor_0181.off monitor/train/monitor_0182.off monitor/train/monitor_0183.off monitor/train/monitor_0184.off monitor/train/monitor_0185.off monitor/train/monitor_0186.off monitor/train/monitor_0187.off monitor/train/monitor_0188.off monitor/train/monitor_0189.off monitor/train/monitor_0190.off monitor/train/monitor_0191.off monitor/train/monitor_0192.off monitor/train/monitor_0193.off monitor/train/monitor_0194.off monitor/train/monitor_0195.off monitor/train/monitor_0196.off monitor/train/monitor_0197.off monitor/train/monitor_0198.off monitor/train/monitor_0199.off monitor/train/monitor_0200.off monitor/train/monitor_0201.off monitor/train/monitor_0202.off monitor/train/monitor_0203.off monitor/train/monitor_0204.off monitor/train/monitor_0205.off monitor/train/monitor_0206.off monitor/train/monitor_0207.off monitor/train/monitor_0208.off monitor/train/monitor_0209.off monitor/train/monitor_0210.off monitor/train/monitor_0211.off monitor/train/monitor_0212.off monitor/train/monitor_0213.off monitor/train/monitor_0214.off monitor/train/monitor_0215.off monitor/train/monitor_0216.off monitor/train/monitor_0217.off monitor/train/monitor_0218.off monitor/train/monitor_0219.off monitor/train/monitor_0220.off monitor/train/monitor_0221.off monitor/train/monitor_0222.off monitor/train/monitor_0223.off monitor/train/monitor_0224.off monitor/train/monitor_0225.off monitor/train/monitor_0226.off monitor/train/monitor_0227.off monitor/train/monitor_0228.off monitor/train/monitor_0229.off monitor/train/monitor_0230.off monitor/train/monitor_0231.off monitor/train/monitor_0232.off monitor/train/monitor_0233.off monitor/train/monitor_0234.off monitor/train/monitor_0235.off monitor/train/monitor_0236.off monitor/train/monitor_0237.off monitor/train/monitor_0238.off monitor/train/monitor_0239.off monitor/train/monitor_0240.off monitor/train/monitor_0241.off monitor/train/monitor_0242.off monitor/train/monitor_0243.off monitor/train/monitor_0244.off monitor/train/monitor_0245.off monitor/train/monitor_0246.off monitor/train/monitor_0247.off monitor/train/monitor_0248.off monitor/train/monitor_0249.off monitor/train/monitor_0250.off monitor/train/monitor_0251.off monitor/train/monitor_0252.off monitor/train/monitor_0253.off monitor/train/monitor_0254.off monitor/train/monitor_0255.off monitor/train/monitor_0256.off monitor/train/monitor_0257.off monitor/train/monitor_0258.off monitor/train/monitor_0259.off monitor/train/monitor_0260.off monitor/train/monitor_0261.off monitor/train/monitor_0262.off monitor/train/monitor_0263.off monitor/train/monitor_0264.off monitor/train/monitor_0265.off monitor/train/monitor_0266.off monitor/train/monitor_0267.off monitor/train/monitor_0268.off monitor/train/monitor_0269.off monitor/train/monitor_0270.off monitor/train/monitor_0271.off monitor/train/monitor_0272.off monitor/train/monitor_0273.off monitor/train/monitor_0274.off monitor/train/monitor_0275.off monitor/train/monitor_0276.off monitor/train/monitor_0277.off monitor/train/monitor_0278.off monitor/train/monitor_0279.off monitor/train/monitor_0280.off monitor/train/monitor_0281.off monitor/train/monitor_0282.off monitor/train/monitor_0283.off monitor/train/monitor_0284.off monitor/train/monitor_0285.off monitor/train/monitor_0286.off monitor/train/monitor_0287.off monitor/train/monitor_0288.off monitor/train/monitor_0289.off monitor/train/monitor_0290.off monitor/train/monitor_0291.off monitor/train/monitor_0292.off monitor/train/monitor_0293.off monitor/train/monitor_0294.off monitor/train/monitor_0295.off monitor/train/monitor_0296.off monitor/train/monitor_0297.off monitor/train/monitor_0298.off monitor/train/monitor_0299.off monitor/train/monitor_0300.off monitor/train/monitor_0301.off monitor/train/monitor_0302.off monitor/train/monitor_0303.off monitor/train/monitor_0304.off monitor/train/monitor_0305.off monitor/train/monitor_0306.off monitor/train/monitor_0307.off monitor/train/monitor_0308.off monitor/train/monitor_0309.off monitor/train/monitor_0310.off monitor/train/monitor_0311.off monitor/train/monitor_0312.off monitor/train/monitor_0313.off monitor/train/monitor_0314.off monitor/train/monitor_0315.off monitor/train/monitor_0316.off monitor/train/monitor_0317.off monitor/train/monitor_0318.off monitor/train/monitor_0319.off monitor/train/monitor_0320.off monitor/train/monitor_0321.off monitor/train/monitor_0322.off monitor/train/monitor_0323.off monitor/train/monitor_0324.off monitor/train/monitor_0325.off monitor/train/monitor_0326.off monitor/train/monitor_0327.off monitor/train/monitor_0328.off monitor/train/monitor_0329.off monitor/train/monitor_0330.off monitor/train/monitor_0331.off monitor/train/monitor_0332.off monitor/train/monitor_0333.off monitor/train/monitor_0334.off monitor/train/monitor_0335.off monitor/train/monitor_0336.off monitor/train/monitor_0337.off monitor/train/monitor_0338.off monitor/train/monitor_0339.off monitor/train/monitor_0340.off monitor/train/monitor_0341.off monitor/train/monitor_0342.off monitor/train/monitor_0343.off monitor/train/monitor_0344.off monitor/train/monitor_0345.off monitor/train/monitor_0346.off monitor/train/monitor_0347.off monitor/train/monitor_0348.off monitor/train/monitor_0349.off monitor/train/monitor_0350.off monitor/train/monitor_0351.off monitor/train/monitor_0352.off monitor/train/monitor_0353.off monitor/train/monitor_0354.off monitor/train/monitor_0355.off monitor/train/monitor_0356.off monitor/train/monitor_0357.off monitor/train/monitor_0358.off monitor/train/monitor_0359.off monitor/train/monitor_0360.off monitor/train/monitor_0361.off monitor/train/monitor_0362.off monitor/train/monitor_0363.off monitor/train/monitor_0364.off monitor/train/monitor_0365.off monitor/train/monitor_0366.off monitor/train/monitor_0367.off monitor/train/monitor_0368.off monitor/train/monitor_0369.off monitor/train/monitor_0370.off monitor/train/monitor_0371.off monitor/train/monitor_0372.off monitor/train/monitor_0373.off monitor/train/monitor_0374.off monitor/train/monitor_0375.off monitor/train/monitor_0376.off monitor/train/monitor_0377.off monitor/train/monitor_0378.off monitor/train/monitor_0379.off monitor/train/monitor_0380.off monitor/train/monitor_0381.off monitor/train/monitor_0382.off monitor/train/monitor_0383.off monitor/train/monitor_0384.off monitor/train/monitor_0385.off monitor/train/monitor_0386.off monitor/train/monitor_0387.off monitor/train/monitor_0388.off monitor/train/monitor_0389.off monitor/train/monitor_0390.off monitor/train/monitor_0391.off monitor/train/monitor_0392.off monitor/train/monitor_0393.off monitor/train/monitor_0394.off monitor/train/monitor_0395.off monitor/train/monitor_0396.off monitor/train/monitor_0397.off monitor/train/monitor_0398.off monitor/train/monitor_0399.off monitor/train/monitor_0400.off monitor/train/monitor_0401.off monitor/train/monitor_0402.off monitor/train/monitor_0403.off monitor/train/monitor_0404.off monitor/train/monitor_0405.off monitor/train/monitor_0406.off monitor/train/monitor_0407.off monitor/train/monitor_0408.off monitor/train/monitor_0409.off monitor/train/monitor_0410.off monitor/train/monitor_0411.off monitor/train/monitor_0412.off monitor/train/monitor_0413.off monitor/train/monitor_0414.off monitor/train/monitor_0415.off monitor/train/monitor_0416.off monitor/train/monitor_0417.off monitor/train/monitor_0418.off monitor/train/monitor_0419.off bottle/train/bottle_0001.off bottle/train/bottle_0002.off bottle/train/bottle_0003.off bottle/train/bottle_0004.off bottle/train/bottle_0005.off bottle/train/bottle_0006.off bottle/train/bottle_0007.off bottle/train/bottle_0008.off bottle/train/bottle_0009.off bottle/train/bottle_0010.off bottle/train/bottle_0011.off bottle/train/bottle_0012.off bottle/train/bottle_0013.off bottle/train/bottle_0014.off bottle/train/bottle_0015.off bottle/train/bottle_0016.off bottle/train/bottle_0017.off bottle/train/bottle_0018.off bottle/train/bottle_0019.off bottle/train/bottle_0020.off bottle/train/bottle_0021.off bottle/train/bottle_0022.off bottle/train/bottle_0023.off bottle/train/bottle_0024.off bottle/train/bottle_0025.off bottle/train/bottle_0026.off bottle/train/bottle_0027.off bottle/train/bottle_0028.off bottle/train/bottle_0029.off bottle/train/bottle_0030.off bottle/train/bottle_0031.off bottle/train/bottle_0032.off bottle/train/bottle_0033.off bottle/train/bottle_0034.off bottle/train/bottle_0035.off bottle/train/bottle_0036.off bottle/train/bottle_0037.off bottle/train/bottle_0038.off bottle/train/bottle_0039.off bottle/train/bottle_0040.off bottle/train/bottle_0041.off bottle/train/bottle_0042.off bottle/train/bottle_0043.off bottle/train/bottle_0044.off bottle/train/bottle_0045.off bottle/train/bottle_0046.off bottle/train/bottle_0047.off bottle/train/bottle_0048.off bottle/train/bottle_0049.off bottle/train/bottle_0050.off bottle/train/bottle_0051.off bottle/train/bottle_0052.off bottle/train/bottle_0053.off bottle/train/bottle_0054.off bottle/train/bottle_0055.off bottle/train/bottle_0056.off bottle/train/bottle_0057.off bottle/train/bottle_0058.off bottle/train/bottle_0059.off bottle/train/bottle_0060.off bottle/train/bottle_0061.off bottle/train/bottle_0062.off bottle/train/bottle_0063.off bottle/train/bottle_0064.off bottle/train/bottle_0065.off bottle/train/bottle_0066.off bottle/train/bottle_0067.off bottle/train/bottle_0068.off bottle/train/bottle_0069.off bottle/train/bottle_0070.off bottle/train/bottle_0071.off bottle/train/bottle_0072.off bottle/train/bottle_0073.off bottle/train/bottle_0074.off bottle/train/bottle_0075.off bottle/train/bottle_0076.off bottle/train/bottle_0077.off bottle/train/bottle_0078.off bottle/train/bottle_0079.off bottle/train/bottle_0080.off bottle/train/bottle_0081.off bottle/train/bottle_0082.off bottle/train/bottle_0083.off bottle/train/bottle_0084.off bottle/train/bottle_0085.off bottle/train/bottle_0086.off bottle/train/bottle_0087.off bottle/train/bottle_0088.off bottle/train/bottle_0089.off bottle/train/bottle_0090.off bottle/train/bottle_0091.off bottle/train/bottle_0092.off bottle/train/bottle_0093.off bottle/train/bottle_0094.off bottle/train/bottle_0095.off bottle/train/bottle_0096.off bottle/train/bottle_0097.off bottle/train/bottle_0098.off bottle/train/bottle_0099.off bottle/train/bottle_0100.off bottle/train/bottle_0101.off bottle/train/bottle_0102.off bottle/train/bottle_0103.off bottle/train/bottle_0104.off bottle/train/bottle_0105.off bottle/train/bottle_0106.off bottle/train/bottle_0107.off bottle/train/bottle_0108.off bottle/train/bottle_0109.off bottle/train/bottle_0110.off bottle/train/bottle_0111.off bottle/train/bottle_0112.off bottle/train/bottle_0113.off bottle/train/bottle_0114.off bottle/train/bottle_0115.off bottle/train/bottle_0116.off bottle/train/bottle_0117.off bottle/train/bottle_0118.off bottle/train/bottle_0119.off bottle/train/bottle_0120.off bottle/train/bottle_0121.off bottle/train/bottle_0122.off bottle/train/bottle_0123.off bottle/train/bottle_0124.off bottle/train/bottle_0125.off bottle/train/bottle_0126.off bottle/train/bottle_0127.off bottle/train/bottle_0128.off bottle/train/bottle_0129.off bottle/train/bottle_0130.off bottle/train/bottle_0131.off bottle/train/bottle_0132.off bottle/train/bottle_0133.off bottle/train/bottle_0134.off bottle/train/bottle_0135.off bottle/train/bottle_0136.off bottle/train/bottle_0137.off bottle/train/bottle_0138.off bottle/train/bottle_0139.off bottle/train/bottle_0140.off bottle/train/bottle_0141.off bottle/train/bottle_0142.off bottle/train/bottle_0143.off bottle/train/bottle_0144.off bottle/train/bottle_0145.off bottle/train/bottle_0146.off bottle/train/bottle_0147.off bottle/train/bottle_0148.off bottle/train/bottle_0149.off bottle/train/bottle_0150.off bottle/train/bottle_0151.off bottle/train/bottle_0152.off bottle/train/bottle_0153.off bottle/train/bottle_0154.off bottle/train/bottle_0155.off bottle/train/bottle_0156.off bottle/train/bottle_0157.off bottle/train/bottle_0158.off bottle/train/bottle_0159.off bottle/train/bottle_0160.off bottle/train/bottle_0161.off bottle/train/bottle_0162.off bottle/train/bottle_0163.off bottle/train/bottle_0164.off bottle/train/bottle_0165.off bottle/train/bottle_0166.off bottle/train/bottle_0167.off bottle/train/bottle_0168.off bottle/train/bottle_0169.off bottle/train/bottle_0170.off bottle/train/bottle_0171.off bottle/train/bottle_0172.off bottle/train/bottle_0173.off bottle/train/bottle_0174.off bottle/train/bottle_0175.off bottle/train/bottle_0176.off bottle/train/bottle_0177.off bottle/train/bottle_0178.off bottle/train/bottle_0179.off bottle/train/bottle_0180.off bottle/train/bottle_0181.off bottle/train/bottle_0182.off bottle/train/bottle_0183.off bottle/train/bottle_0184.off bottle/train/bottle_0185.off bottle/train/bottle_0186.off bottle/train/bottle_0187.off bottle/train/bottle_0188.off bottle/train/bottle_0189.off bottle/train/bottle_0190.off bottle/train/bottle_0191.off bottle/train/bottle_0192.off bottle/train/bottle_0193.off bottle/train/bottle_0194.off bottle/train/bottle_0195.off bottle/train/bottle_0196.off bottle/train/bottle_0197.off bottle/train/bottle_0198.off bottle/train/bottle_0199.off bottle/train/bottle_0200.off bottle/train/bottle_0201.off bottle/train/bottle_0202.off bottle/train/bottle_0203.off bottle/train/bottle_0204.off bottle/train/bottle_0205.off bottle/train/bottle_0206.off bottle/train/bottle_0207.off bottle/train/bottle_0208.off bottle/train/bottle_0209.off bottle/train/bottle_0210.off bottle/train/bottle_0211.off bottle/train/bottle_0212.off bottle/train/bottle_0213.off bottle/train/bottle_0214.off bottle/train/bottle_0215.off bottle/train/bottle_0216.off bottle/train/bottle_0217.off bottle/train/bottle_0218.off bottle/train/bottle_0219.off bottle/train/bottle_0220.off bottle/train/bottle_0221.off bottle/train/bottle_0222.off bottle/train/bottle_0223.off bottle/train/bottle_0224.off bottle/train/bottle_0225.off bottle/train/bottle_0226.off bottle/train/bottle_0227.off bottle/train/bottle_0228.off bottle/train/bottle_0229.off bottle/train/bottle_0230.off bottle/train/bottle_0231.off bottle/train/bottle_0232.off bottle/train/bottle_0233.off bottle/train/bottle_0234.off bottle/train/bottle_0235.off bottle/train/bottle_0236.off bottle/train/bottle_0237.off bottle/train/bottle_0238.off bottle/train/bottle_0239.off bottle/train/bottle_0240.off bottle/train/bottle_0241.off bottle/train/bottle_0242.off bottle/train/bottle_0243.off bottle/train/bottle_0244.off bottle/train/bottle_0245.off bottle/train/bottle_0246.off bottle/train/bottle_0247.off bottle/train/bottle_0248.off bottle/train/bottle_0249.off bottle/train/bottle_0250.off bottle/train/bottle_0251.off bottle/train/bottle_0252.off bottle/train/bottle_0253.off bottle/train/bottle_0254.off bottle/train/bottle_0255.off bottle/train/bottle_0256.off bottle/train/bottle_0257.off bottle/train/bottle_0258.off bottle/train/bottle_0259.off bottle/train/bottle_0260.off bottle/train/bottle_0261.off bottle/train/bottle_0262.off bottle/train/bottle_0263.off bottle/train/bottle_0264.off bottle/train/bottle_0265.off bottle/train/bottle_0266.off bottle/train/bottle_0267.off bottle/train/bottle_0268.off bottle/train/bottle_0269.off bottle/train/bottle_0270.off bottle/train/bottle_0271.off bottle/train/bottle_0272.off bottle/train/bottle_0273.off bottle/train/bottle_0274.off bottle/train/bottle_0275.off bottle/train/bottle_0276.off bottle/train/bottle_0277.off bottle/train/bottle_0278.off bottle/train/bottle_0279.off bottle/train/bottle_0280.off bottle/train/bottle_0281.off bottle/train/bottle_0282.off bottle/train/bottle_0283.off bottle/train/bottle_0284.off bottle/train/bottle_0285.off bottle/train/bottle_0286.off bottle/train/bottle_0287.off bottle/train/bottle_0288.off bottle/train/bottle_0289.off bottle/train/bottle_0290.off bottle/train/bottle_0291.off bottle/train/bottle_0292.off bottle/train/bottle_0293.off bottle/train/bottle_0294.off bottle/train/bottle_0295.off bottle/train/bottle_0296.off bottle/train/bottle_0297.off bottle/train/bottle_0298.off bottle/train/bottle_0299.off bottle/train/bottle_0300.off bottle/train/bottle_0301.off bottle/train/bottle_0302.off bowl/train/bowl_0001.off bowl/train/bowl_0002.off bowl/train/bowl_0003.off bowl/train/bowl_0004.off bowl/train/bowl_0005.off bowl/train/bowl_0006.off bowl/train/bowl_0007.off bowl/train/bowl_0008.off bowl/train/bowl_0009.off bowl/train/bowl_0010.off bowl/train/bowl_0011.off bowl/train/bowl_0012.off bowl/train/bowl_0013.off bowl/train/bowl_0014.off bowl/train/bowl_0015.off bowl/train/bowl_0016.off bowl/train/bowl_0017.off bowl/train/bowl_0018.off bowl/train/bowl_0019.off bowl/train/bowl_0020.off bowl/train/bowl_0021.off bowl/train/bowl_0022.off bowl/train/bowl_0023.off bowl/train/bowl_0024.off bowl/train/bowl_0025.off bowl/train/bowl_0026.off bowl/train/bowl_0027.off bowl/train/bowl_0028.off bowl/train/bowl_0029.off bowl/train/bowl_0030.off bowl/train/bowl_0031.off bowl/train/bowl_0032.off bowl/train/bowl_0033.off bowl/train/bowl_0034.off bowl/train/bowl_0035.off bowl/train/bowl_0036.off bowl/train/bowl_0037.off bowl/train/bowl_0038.off bowl/train/bowl_0039.off bowl/train/bowl_0040.off bowl/train/bowl_0041.off bowl/train/bowl_0042.off bowl/train/bowl_0043.off bowl/train/bowl_0044.off bowl/train/bowl_0045.off bowl/train/bowl_0046.off bowl/train/bowl_0047.off bowl/train/bowl_0048.off bowl/train/bowl_0049.off bowl/train/bowl_0050.off bowl/train/bowl_0051.off bowl/train/bowl_0052.off bowl/train/bowl_0053.off bowl/train/bowl_0054.off bowl/train/bowl_0055.off bowl/train/bowl_0056.off bowl/train/bowl_0057.off bowl/train/bowl_0058.off keyboard/train/keyboard_0001.off keyboard/train/keyboard_0002.off keyboard/train/keyboard_0003.off keyboard/train/keyboard_0004.off keyboard/train/keyboard_0005.off keyboard/train/keyboard_0006.off keyboard/train/keyboard_0007.off keyboard/train/keyboard_0008.off keyboard/train/keyboard_0009.off keyboard/train/keyboard_0010.off keyboard/train/keyboard_0011.off keyboard/train/keyboard_0012.off keyboard/train/keyboard_0013.off keyboard/train/keyboard_0014.off keyboard/train/keyboard_0015.off keyboard/train/keyboard_0016.off keyboard/train/keyboard_0017.off keyboard/train/keyboard_0018.off keyboard/train/keyboard_0019.off keyboard/train/keyboard_0020.off keyboard/train/keyboard_0021.off keyboard/train/keyboard_0022.off keyboard/train/keyboard_0023.off keyboard/train/keyboard_0024.off keyboard/train/keyboard_0025.off keyboard/train/keyboard_0026.off keyboard/train/keyboard_0027.off keyboard/train/keyboard_0028.off keyboard/train/keyboard_0029.off keyboard/train/keyboard_0030.off keyboard/train/keyboard_0031.off keyboard/train/keyboard_0032.off keyboard/train/keyboard_0033.off keyboard/train/keyboard_0034.off keyboard/train/keyboard_0035.off keyboard/train/keyboard_0036.off keyboard/train/keyboard_0037.off keyboard/train/keyboard_0038.off keyboard/train/keyboard_0039.off keyboard/train/keyboard_0040.off keyboard/train/keyboard_0041.off keyboard/train/keyboard_0042.off keyboard/train/keyboard_0043.off keyboard/train/keyboard_0044.off keyboard/train/keyboard_0045.off keyboard/train/keyboard_0046.off keyboard/train/keyboard_0047.off keyboard/train/keyboard_0048.off keyboard/train/keyboard_0049.off keyboard/train/keyboard_0050.off keyboard/train/keyboard_0051.off keyboard/train/keyboard_0052.off keyboard/train/keyboard_0053.off keyboard/train/keyboard_0054.off keyboard/train/keyboard_0055.off keyboard/train/keyboard_0056.off keyboard/train/keyboard_0057.off keyboard/train/keyboard_0058.off keyboard/train/keyboard_0059.off keyboard/train/keyboard_0060.off keyboard/train/keyboard_0061.off keyboard/train/keyboard_0062.off keyboard/train/keyboard_0063.off keyboard/train/keyboard_0064.off keyboard/train/keyboard_0065.off keyboard/train/keyboard_0066.off keyboard/train/keyboard_0067.off keyboard/train/keyboard_0068.off keyboard/train/keyboard_0069.off keyboard/train/keyboard_0070.off keyboard/train/keyboard_0071.off keyboard/train/keyboard_0072.off keyboard/train/keyboard_0073.off keyboard/train/keyboard_0074.off keyboard/train/keyboard_0075.off keyboard/train/keyboard_0076.off keyboard/train/keyboard_0077.off keyboard/train/keyboard_0078.off keyboard/train/keyboard_0079.off keyboard/train/keyboard_0080.off keyboard/train/keyboard_0081.off keyboard/train/keyboard_0082.off keyboard/train/keyboard_0083.off keyboard/train/keyboard_0084.off keyboard/train/keyboard_0085.off keyboard/train/keyboard_0086.off keyboard/train/keyboard_0087.off keyboard/train/keyboard_0088.off keyboard/train/keyboard_0089.off keyboard/train/keyboard_0090.off keyboard/train/keyboard_0091.off keyboard/train/keyboard_0092.off keyboard/train/keyboard_0093.off keyboard/train/keyboard_0094.off keyboard/train/keyboard_0095.off keyboard/train/keyboard_0096.off keyboard/train/keyboard_0097.off keyboard/train/keyboard_0098.off keyboard/train/keyboard_0099.off keyboard/train/keyboard_0100.off keyboard/train/keyboard_0101.off keyboard/train/keyboard_0102.off keyboard/train/keyboard_0103.off keyboard/train/keyboard_0104.off keyboard/train/keyboard_0105.off keyboard/train/keyboard_0106.off keyboard/train/keyboard_0107.off keyboard/train/keyboard_0108.off keyboard/train/keyboard_0109.off keyboard/train/keyboard_0110.off keyboard/train/keyboard_0111.off keyboard/train/keyboard_0112.off keyboard/train/keyboard_0113.off keyboard/train/keyboard_0114.off keyboard/train/keyboard_0115.off keyboard/train/keyboard_0116.off keyboard/train/keyboard_0117.off keyboard/train/keyboard_0118.off keyboard/train/keyboard_0119.off keyboard/train/keyboard_0120.off keyboard/train/keyboard_0121.off keyboard/train/keyboard_0122.off keyboard/train/keyboard_0123.off keyboard/train/keyboard_0124.off keyboard/train/keyboard_0125.off keyboard/train/keyboard_0126.off keyboard/train/keyboard_0127.off keyboard/train/keyboard_0128.off keyboard/train/keyboard_0129.off keyboard/train/keyboard_0130.off keyboard/train/keyboard_0131.off desk/train/desk_0001.off desk/train/desk_0002.off desk/train/desk_0003.off desk/train/desk_0004.off desk/train/desk_0005.off desk/train/desk_0006.off desk/train/desk_0007.off desk/train/desk_0008.off desk/train/desk_0009.off desk/train/desk_0010.off desk/train/desk_0011.off desk/train/desk_0012.off desk/train/desk_0013.off desk/train/desk_0014.off desk/train/desk_0015.off desk/train/desk_0016.off desk/train/desk_0017.off desk/train/desk_0018.off desk/train/desk_0019.off desk/train/desk_0020.off desk/train/desk_0021.off desk/train/desk_0022.off desk/train/desk_0023.off desk/train/desk_0024.off desk/train/desk_0025.off desk/train/desk_0026.off desk/train/desk_0027.off desk/train/desk_0028.off desk/train/desk_0029.off desk/train/desk_0030.off desk/train/desk_0031.off desk/train/desk_0032.off desk/train/desk_0033.off desk/train/desk_0034.off desk/train/desk_0035.off desk/train/desk_0036.off desk/train/desk_0037.off desk/train/desk_0038.off desk/train/desk_0039.off desk/train/desk_0040.off desk/train/desk_0041.off desk/train/desk_0042.off desk/train/desk_0043.off desk/train/desk_0044.off desk/train/desk_0045.off desk/train/desk_0046.off desk/train/desk_0047.off desk/train/desk_0048.off desk/train/desk_0049.off desk/train/desk_0050.off desk/train/desk_0051.off desk/train/desk_0052.off desk/train/desk_0053.off desk/train/desk_0054.off desk/train/desk_0055.off desk/train/desk_0056.off desk/train/desk_0057.off desk/train/desk_0058.off desk/train/desk_0059.off desk/train/desk_0060.off desk/train/desk_0061.off desk/train/desk_0062.off desk/train/desk_0063.off desk/train/desk_0064.off desk/train/desk_0065.off desk/train/desk_0066.off desk/train/desk_0067.off desk/train/desk_0068.off desk/train/desk_0069.off desk/train/desk_0070.off desk/train/desk_0071.off desk/train/desk_0072.off desk/train/desk_0073.off desk/train/desk_0074.off desk/train/desk_0075.off desk/train/desk_0076.off desk/train/desk_0077.off desk/train/desk_0078.off desk/train/desk_0079.off desk/train/desk_0080.off desk/train/desk_0081.off desk/train/desk_0082.off desk/train/desk_0083.off desk/train/desk_0084.off desk/train/desk_0085.off desk/train/desk_0086.off desk/train/desk_0087.off desk/train/desk_0088.off desk/train/desk_0089.off desk/train/desk_0090.off desk/train/desk_0091.off desk/train/desk_0092.off desk/train/desk_0093.off desk/train/desk_0094.off desk/train/desk_0095.off desk/train/desk_0096.off desk/train/desk_0097.off desk/train/desk_0098.off desk/train/desk_0099.off desk/train/desk_0100.off desk/train/desk_0101.off desk/train/desk_0102.off desk/train/desk_0103.off desk/train/desk_0104.off desk/train/desk_0105.off desk/train/desk_0106.off desk/train/desk_0107.off desk/train/desk_0108.off desk/train/desk_0109.off desk/train/desk_0110.off desk/train/desk_0111.off desk/train/desk_0112.off desk/train/desk_0113.off desk/train/desk_0114.off desk/train/desk_0115.off desk/train/desk_0116.off desk/train/desk_0117.off desk/train/desk_0118.off desk/train/desk_0119.off desk/train/desk_0120.off desk/train/desk_0121.off desk/train/desk_0122.off desk/train/desk_0123.off desk/train/desk_0124.off desk/train/desk_0125.off desk/train/desk_0126.off desk/train/desk_0127.off desk/train/desk_0128.off desk/train/desk_0129.off desk/train/desk_0130.off desk/train/desk_0131.off desk/train/desk_0132.off desk/train/desk_0133.off desk/train/desk_0134.off desk/train/desk_0135.off desk/train/desk_0136.off desk/train/desk_0137.off desk/train/desk_0138.off desk/train/desk_0139.off desk/train/desk_0140.off desk/train/desk_0141.off desk/train/desk_0142.off desk/train/desk_0143.off desk/train/desk_0144.off desk/train/desk_0145.off desk/train/desk_0146.off desk/train/desk_0147.off desk/train/desk_0148.off desk/train/desk_0149.off desk/train/desk_0150.off desk/train/desk_0151.off desk/train/desk_0152.off desk/train/desk_0153.off desk/train/desk_0154.off desk/train/desk_0155.off desk/train/desk_0156.off desk/train/desk_0157.off desk/train/desk_0158.off desk/train/desk_0159.off desk/train/desk_0160.off desk/train/desk_0161.off desk/train/desk_0162.off desk/train/desk_0163.off desk/train/desk_0164.off desk/train/desk_0165.off desk/train/desk_0166.off desk/train/desk_0167.off desk/train/desk_0168.off desk/train/desk_0169.off desk/train/desk_0170.off desk/train/desk_0171.off desk/train/desk_0172.off desk/train/desk_0173.off desk/train/desk_0174.off desk/train/desk_0175.off desk/train/desk_0176.off desk/train/desk_0177.off desk/train/desk_0178.off desk/train/desk_0179.off desk/train/desk_0180.off bed/train/bed_0001.off bed/train/bed_0002.off bed/train/bed_0003.off bed/train/bed_0004.off bed/train/bed_0005.off bed/train/bed_0006.off bed/train/bed_0007.off bed/train/bed_0008.off bed/train/bed_0009.off bed/train/bed_0010.off bed/train/bed_0011.off bed/train/bed_0012.off bed/train/bed_0013.off bed/train/bed_0014.off bed/train/bed_0015.off bed/train/bed_0016.off bed/train/bed_0017.off bed/train/bed_0018.off bed/train/bed_0019.off bed/train/bed_0020.off bed/train/bed_0021.off bed/train/bed_0022.off bed/train/bed_0023.off bed/train/bed_0024.off bed/train/bed_0025.off bed/train/bed_0026.off bed/train/bed_0027.off bed/train/bed_0028.off bed/train/bed_0029.off bed/train/bed_0030.off bed/train/bed_0031.off bed/train/bed_0032.off bed/train/bed_0033.off bed/train/bed_0034.off bed/train/bed_0035.off bed/train/bed_0036.off bed/train/bed_0037.off bed/train/bed_0038.off bed/train/bed_0039.off bed/train/bed_0040.off bed/train/bed_0041.off bed/train/bed_0042.off bed/train/bed_0043.off bed/train/bed_0044.off bed/train/bed_0045.off bed/train/bed_0046.off bed/train/bed_0047.off bed/train/bed_0048.off bed/train/bed_0049.off bed/train/bed_0050.off bed/train/bed_0051.off bed/train/bed_0052.off bed/train/bed_0053.off bed/train/bed_0054.off bed/train/bed_0055.off bed/train/bed_0056.off bed/train/bed_0057.off bed/train/bed_0058.off bed/train/bed_0059.off bed/train/bed_0060.off bed/train/bed_0061.off bed/train/bed_0062.off bed/train/bed_0063.off bed/train/bed_0064.off bed/train/bed_0065.off bed/train/bed_0066.off bed/train/bed_0067.off bed/train/bed_0068.off bed/train/bed_0069.off bed/train/bed_0070.off bed/train/bed_0071.off bed/train/bed_0072.off bed/train/bed_0073.off bed/train/bed_0074.off bed/train/bed_0075.off bed/train/bed_0076.off bed/train/bed_0077.off bed/train/bed_0078.off bed/train/bed_0079.off bed/train/bed_0080.off bed/train/bed_0081.off bed/train/bed_0082.off bed/train/bed_0083.off bed/train/bed_0084.off bed/train/bed_0085.off bed/train/bed_0086.off bed/train/bed_0087.off bed/train/bed_0088.off bed/train/bed_0089.off bed/train/bed_0090.off bed/train/bed_0091.off bed/train/bed_0092.off bed/train/bed_0093.off bed/train/bed_0094.off bed/train/bed_0095.off bed/train/bed_0096.off bed/train/bed_0097.off bed/train/bed_0098.off bed/train/bed_0099.off bed/train/bed_0100.off bed/train/bed_0101.off bed/train/bed_0102.off bed/train/bed_0103.off bed/train/bed_0104.off bed/train/bed_0105.off bed/train/bed_0106.off bed/train/bed_0107.off bed/train/bed_0108.off bed/train/bed_0109.off bed/train/bed_0110.off bed/train/bed_0111.off bed/train/bed_0112.off bed/train/bed_0113.off bed/train/bed_0114.off bed/train/bed_0115.off bed/train/bed_0116.off bed/train/bed_0117.off bed/train/bed_0118.off bed/train/bed_0119.off bed/train/bed_0120.off bed/train/bed_0121.off bed/train/bed_0122.off bed/train/bed_0123.off bed/train/bed_0124.off bed/train/bed_0125.off bed/train/bed_0126.off bed/train/bed_0127.off bed/train/bed_0128.off bed/train/bed_0129.off bed/train/bed_0130.off bed/train/bed_0131.off bed/train/bed_0132.off bed/train/bed_0133.off bed/train/bed_0134.off bed/train/bed_0135.off bed/train/bed_0136.off bed/train/bed_0137.off bed/train/bed_0138.off bed/train/bed_0139.off bed/train/bed_0140.off bed/train/bed_0141.off bed/train/bed_0142.off bed/train/bed_0143.off bed/train/bed_0144.off bed/train/bed_0145.off bed/train/bed_0146.off bed/train/bed_0147.off bed/train/bed_0148.off bed/train/bed_0149.off bed/train/bed_0150.off bed/train/bed_0151.off bed/train/bed_0152.off bed/train/bed_0153.off bed/train/bed_0154.off bed/train/bed_0155.off bed/train/bed_0156.off bed/train/bed_0157.off bed/train/bed_0158.off bed/train/bed_0159.off bed/train/bed_0160.off bed/train/bed_0161.off bed/train/bed_0162.off bed/train/bed_0163.off bed/train/bed_0164.off bed/train/bed_0165.off bed/train/bed_0166.off bed/train/bed_0167.off bed/train/bed_0168.off bed/train/bed_0169.off bed/train/bed_0170.off bed/train/bed_0171.off bed/train/bed_0172.off bed/train/bed_0173.off bed/train/bed_0174.off bed/train/bed_0175.off bed/train/bed_0176.off bed/train/bed_0177.off bed/train/bed_0178.off bed/train/bed_0179.off bed/train/bed_0180.off bed/train/bed_0181.off bed/train/bed_0182.off bed/train/bed_0183.off bed/train/bed_0184.off bed/train/bed_0185.off bed/train/bed_0186.off bed/train/bed_0187.off bed/train/bed_0188.off bed/train/bed_0189.off bed/train/bed_0190.off bed/train/bed_0191.off bed/train/bed_0192.off bed/train/bed_0193.off bed/train/bed_0194.off bed/train/bed_0195.off bed/train/bed_0196.off bed/train/bed_0197.off bed/train/bed_0198.off bed/train/bed_0199.off bed/train/bed_0200.off bed/train/bed_0201.off bed/train/bed_0202.off bed/train/bed_0203.off bed/train/bed_0204.off bed/train/bed_0205.off bed/train/bed_0206.off bed/train/bed_0207.off bed/train/bed_0208.off bed/train/bed_0209.off bed/train/bed_0210.off bed/train/bed_0211.off bed/train/bed_0212.off bed/train/bed_0213.off bed/train/bed_0214.off bed/train/bed_0215.off bed/train/bed_0216.off bed/train/bed_0217.off bed/train/bed_0218.off bed/train/bed_0219.off bed/train/bed_0220.off bed/train/bed_0221.off bed/train/bed_0222.off bed/train/bed_0223.off bed/train/bed_0224.off bed/train/bed_0225.off bed/train/bed_0226.off bed/train/bed_0227.off bed/train/bed_0228.off bed/train/bed_0229.off bed/train/bed_0230.off bed/train/bed_0231.off bed/train/bed_0232.off bed/train/bed_0233.off bed/train/bed_0234.off bed/train/bed_0235.off bed/train/bed_0236.off bed/train/bed_0237.off bed/train/bed_0238.off bed/train/bed_0239.off bed/train/bed_0240.off bed/train/bed_0241.off bed/train/bed_0242.off bed/train/bed_0243.off bed/train/bed_0244.off bed/train/bed_0245.off bed/train/bed_0246.off bed/train/bed_0247.off bed/train/bed_0248.off bed/train/bed_0249.off bed/train/bed_0250.off bed/train/bed_0251.off bed/train/bed_0252.off bed/train/bed_0253.off bed/train/bed_0254.off bed/train/bed_0255.off bed/train/bed_0256.off bed/train/bed_0257.off bed/train/bed_0258.off bed/train/bed_0259.off bed/train/bed_0260.off bed/train/bed_0261.off bed/train/bed_0262.off bed/train/bed_0263.off bed/train/bed_0264.off bed/train/bed_0265.off bed/train/bed_0266.off bed/train/bed_0267.off bed/train/bed_0268.off bed/train/bed_0269.off bed/train/bed_0270.off bed/train/bed_0271.off bed/train/bed_0272.off bed/train/bed_0273.off bed/train/bed_0274.off bed/train/bed_0275.off bed/train/bed_0276.off bed/train/bed_0277.off bed/train/bed_0278.off bed/train/bed_0279.off bed/train/bed_0280.off bed/train/bed_0281.off bed/train/bed_0282.off bed/train/bed_0283.off bed/train/bed_0284.off bed/train/bed_0285.off bed/train/bed_0286.off bed/train/bed_0287.off bed/train/bed_0288.off bed/train/bed_0289.off bed/train/bed_0290.off bed/train/bed_0291.off bed/train/bed_0292.off bed/train/bed_0293.off bed/train/bed_0294.off bed/train/bed_0295.off bed/train/bed_0296.off bed/train/bed_0297.off bed/train/bed_0298.off bed/train/bed_0299.off bed/train/bed_0300.off bed/train/bed_0301.off bed/train/bed_0302.off bed/train/bed_0303.off bed/train/bed_0304.off bed/train/bed_0305.off bed/train/bed_0306.off bed/train/bed_0307.off bed/train/bed_0308.off bed/train/bed_0309.off bed/train/bed_0310.off bed/train/bed_0311.off bed/train/bed_0312.off bed/train/bed_0313.off bed/train/bed_0314.off bed/train/bed_0315.off bed/train/bed_0316.off bed/train/bed_0317.off bed/train/bed_0318.off bed/train/bed_0319.off bed/train/bed_0320.off bed/train/bed_0321.off bed/train/bed_0322.off bed/train/bed_0323.off bed/train/bed_0324.off bed/train/bed_0325.off bed/train/bed_0326.off bed/train/bed_0327.off bed/train/bed_0328.off bed/train/bed_0329.off bed/train/bed_0330.off bed/train/bed_0331.off bed/train/bed_0332.off bed/train/bed_0333.off bed/train/bed_0334.off bed/train/bed_0335.off bed/train/bed_0336.off bed/train/bed_0337.off bed/train/bed_0338.off bed/train/bed_0339.off bed/train/bed_0340.off bed/train/bed_0341.off bed/train/bed_0342.off bed/train/bed_0343.off bed/train/bed_0344.off bed/train/bed_0345.off bed/train/bed_0346.off bed/train/bed_0347.off bed/train/bed_0348.off bed/train/bed_0349.off bed/train/bed_0350.off bed/train/bed_0351.off bed/train/bed_0352.off bed/train/bed_0353.off bed/train/bed_0354.off bed/train/bed_0355.off bed/train/bed_0356.off bed/train/bed_0357.off bed/train/bed_0358.off bed/train/bed_0359.off bed/train/bed_0360.off bed/train/bed_0361.off bed/train/bed_0362.off bed/train/bed_0363.off bed/train/bed_0364.off bed/train/bed_0365.off bed/train/bed_0366.off bed/train/bed_0367.off bed/train/bed_0368.off bed/train/bed_0369.off bed/train/bed_0370.off bed/train/bed_0371.off bed/train/bed_0372.off bed/train/bed_0373.off bed/train/bed_0374.off bed/train/bed_0375.off bed/train/bed_0376.off bed/train/bed_0377.off bed/train/bed_0378.off bed/train/bed_0379.off bed/train/bed_0380.off bed/train/bed_0381.off bed/train/bed_0382.off bed/train/bed_0383.off bed/train/bed_0384.off bed/train/bed_0385.off bed/train/bed_0386.off bed/train/bed_0387.off bed/train/bed_0388.off bed/train/bed_0389.off bed/train/bed_0390.off bed/train/bed_0391.off bed/train/bed_0392.off bed/train/bed_0393.off bed/train/bed_0394.off bed/train/bed_0395.off bed/train/bed_0396.off bed/train/bed_0397.off bed/train/bed_0398.off bed/train/bed_0399.off bed/train/bed_0400.off bed/train/bed_0401.off bed/train/bed_0402.off bed/train/bed_0403.off bed/train/bed_0404.off bed/train/bed_0405.off bed/train/bed_0406.off bed/train/bed_0407.off bed/train/bed_0408.off bed/train/bed_0409.off bed/train/bed_0410.off bed/train/bed_0411.off bed/train/bed_0412.off bed/train/bed_0413.off bed/train/bed_0414.off bed/train/bed_0415.off bed/train/bed_0416.off bed/train/bed_0417.off bed/train/bed_0418.off bed/train/bed_0419.off bed/train/bed_0420.off bed/train/bed_0421.off bed/train/bed_0422.off bed/train/bed_0423.off bed/train/bed_0424.off bed/train/bed_0425.off bed/train/bed_0426.off bed/train/bed_0427.off bed/train/bed_0428.off bed/train/bed_0429.off bed/train/bed_0430.off bed/train/bed_0431.off bed/train/bed_0432.off bed/train/bed_0433.off bed/train/bed_0434.off bed/train/bed_0435.off bed/train/bed_0436.off bed/train/bed_0437.off bed/train/bed_0438.off bed/train/bed_0439.off bed/train/bed_0440.off bed/train/bed_0441.off bed/train/bed_0442.off bed/train/bed_0443.off bed/train/bed_0444.off bed/train/bed_0445.off bed/train/bed_0446.off bed/train/bed_0447.off bed/train/bed_0448.off bed/train/bed_0449.off bed/train/bed_0450.off bed/train/bed_0451.off bed/train/bed_0452.off bed/train/bed_0453.off bed/train/bed_0454.off bed/train/bed_0455.off bed/train/bed_0456.off bed/train/bed_0457.off bed/train/bed_0458.off bed/train/bed_0459.off bed/train/bed_0460.off bed/train/bed_0461.off bed/train/bed_0462.off bed/train/bed_0463.off bed/train/bed_0464.off tent/train/tent_0001.off tent/train/tent_0002.off tent/train/tent_0003.off tent/train/tent_0004.off tent/train/tent_0005.off tent/train/tent_0006.off tent/train/tent_0007.off tent/train/tent_0008.off tent/train/tent_0009.off tent/train/tent_0010.off tent/train/tent_0011.off tent/train/tent_0012.off tent/train/tent_0013.off tent/train/tent_0014.off tent/train/tent_0015.off tent/train/tent_0016.off tent/train/tent_0017.off tent/train/tent_0018.off tent/train/tent_0019.off tent/train/tent_0020.off tent/train/tent_0021.off tent/train/tent_0022.off tent/train/tent_0023.off tent/train/tent_0024.off tent/train/tent_0025.off tent/train/tent_0026.off tent/train/tent_0027.off tent/train/tent_0028.off tent/train/tent_0029.off tent/train/tent_0030.off tent/train/tent_0031.off tent/train/tent_0032.off tent/train/tent_0033.off tent/train/tent_0034.off tent/train/tent_0035.off tent/train/tent_0036.off tent/train/tent_0037.off tent/train/tent_0038.off tent/train/tent_0039.off tent/train/tent_0040.off tent/train/tent_0041.off tent/train/tent_0042.off tent/train/tent_0043.off tent/train/tent_0044.off tent/train/tent_0045.off tent/train/tent_0046.off tent/train/tent_0047.off tent/train/tent_0048.off tent/train/tent_0049.off tent/train/tent_0050.off tent/train/tent_0051.off tent/train/tent_0052.off tent/train/tent_0053.off tent/train/tent_0054.off tent/train/tent_0055.off tent/train/tent_0056.off tent/train/tent_0057.off tent/train/tent_0058.off tent/train/tent_0059.off tent/train/tent_0060.off tent/train/tent_0061.off tent/train/tent_0062.off tent/train/tent_0063.off tent/train/tent_0064.off tent/train/tent_0065.off tent/train/tent_0066.off tent/train/tent_0067.off tent/train/tent_0068.off tent/train/tent_0069.off tent/train/tent_0070.off tent/train/tent_0071.off tent/train/tent_0072.off tent/train/tent_0073.off tent/train/tent_0074.off tent/train/tent_0075.off tent/train/tent_0076.off tent/train/tent_0077.off tent/train/tent_0078.off tent/train/tent_0079.off tent/train/tent_0080.off tent/train/tent_0081.off tent/train/tent_0082.off tent/train/tent_0083.off tent/train/tent_0084.off tent/train/tent_0085.off tent/train/tent_0086.off tent/train/tent_0087.off tent/train/tent_0088.off tent/train/tent_0089.off tent/train/tent_0090.off tent/train/tent_0091.off tent/train/tent_0092.off tent/train/tent_0093.off tent/train/tent_0094.off tent/train/tent_0095.off tent/train/tent_0096.off tent/train/tent_0097.off tent/train/tent_0098.off tent/train/tent_0099.off tent/train/tent_0100.off tent/train/tent_0101.off tent/train/tent_0102.off tent/train/tent_0103.off tent/train/tent_0104.off tent/train/tent_0105.off tent/train/tent_0106.off tent/train/tent_0107.off tent/train/tent_0108.off tent/train/tent_0109.off tent/train/tent_0110.off tent/train/tent_0111.off tent/train/tent_0112.off tent/train/tent_0113.off tent/train/tent_0114.off tent/train/tent_0115.off tent/train/tent_0116.off tent/train/tent_0117.off tent/train/tent_0118.off tent/train/tent_0119.off tent/train/tent_0120.off tent/train/tent_0121.off tent/train/tent_0122.off tent/train/tent_0123.off tent/train/tent_0124.off tent/train/tent_0125.off tent/train/tent_0126.off tent/train/tent_0127.off tent/train/tent_0128.off tent/train/tent_0129.off tent/train/tent_0130.off tent/train/tent_0131.off tent/train/tent_0132.off tent/train/tent_0133.off tent/train/tent_0134.off tent/train/tent_0135.off tent/train/tent_0136.off tent/train/tent_0137.off tent/train/tent_0138.off tent/train/tent_0139.off tent/train/tent_0140.off tent/train/tent_0141.off tent/train/tent_0142.off tent/train/tent_0143.off tent/train/tent_0144.off tent/train/tent_0145.off tent/train/tent_0146.off tent/train/tent_0147.off piano/train/piano_0001.off piano/train/piano_0002.off piano/train/piano_0003.off piano/train/piano_0004.off piano/train/piano_0005.off piano/train/piano_0006.off piano/train/piano_0007.off piano/train/piano_0008.off piano/train/piano_0009.off piano/train/piano_0010.off piano/train/piano_0011.off piano/train/piano_0012.off piano/train/piano_0013.off piano/train/piano_0014.off piano/train/piano_0015.off piano/train/piano_0016.off piano/train/piano_0017.off piano/train/piano_0018.off piano/train/piano_0019.off piano/train/piano_0020.off piano/train/piano_0021.off piano/train/piano_0022.off piano/train/piano_0023.off piano/train/piano_0024.off piano/train/piano_0025.off piano/train/piano_0026.off piano/train/piano_0027.off piano/train/piano_0028.off piano/train/piano_0029.off piano/train/piano_0030.off piano/train/piano_0031.off piano/train/piano_0032.off piano/train/piano_0033.off piano/train/piano_0034.off piano/train/piano_0035.off piano/train/piano_0036.off piano/train/piano_0037.off piano/train/piano_0038.off piano/train/piano_0039.off piano/train/piano_0040.off piano/train/piano_0041.off piano/train/piano_0042.off piano/train/piano_0043.off piano/train/piano_0044.off piano/train/piano_0045.off piano/train/piano_0046.off piano/train/piano_0047.off piano/train/piano_0048.off piano/train/piano_0049.off piano/train/piano_0050.off piano/train/piano_0051.off piano/train/piano_0052.off piano/train/piano_0053.off piano/train/piano_0054.off piano/train/piano_0055.off piano/train/piano_0056.off piano/train/piano_0057.off piano/train/piano_0058.off piano/train/piano_0059.off piano/train/piano_0060.off piano/train/piano_0061.off piano/train/piano_0062.off piano/train/piano_0063.off piano/train/piano_0064.off piano/train/piano_0065.off piano/train/piano_0066.off piano/train/piano_0067.off piano/train/piano_0068.off piano/train/piano_0069.off piano/train/piano_0070.off piano/train/piano_0071.off piano/train/piano_0072.off piano/train/piano_0073.off piano/train/piano_0074.off piano/train/piano_0075.off piano/train/piano_0076.off piano/train/piano_0077.off piano/train/piano_0078.off piano/train/piano_0079.off piano/train/piano_0080.off piano/train/piano_0081.off piano/train/piano_0082.off piano/train/piano_0083.off piano/train/piano_0084.off piano/train/piano_0085.off piano/train/piano_0086.off piano/train/piano_0087.off piano/train/piano_0088.off piano/train/piano_0089.off piano/train/piano_0090.off piano/train/piano_0091.off piano/train/piano_0092.off piano/train/piano_0093.off piano/train/piano_0094.off piano/train/piano_0095.off piano/train/piano_0096.off piano/train/piano_0097.off piano/train/piano_0098.off piano/train/piano_0099.off piano/train/piano_0100.off piano/train/piano_0101.off piano/train/piano_0102.off piano/train/piano_0103.off piano/train/piano_0104.off piano/train/piano_0105.off piano/train/piano_0106.off piano/train/piano_0107.off piano/train/piano_0108.off piano/train/piano_0109.off piano/train/piano_0110.off piano/train/piano_0111.off piano/train/piano_0112.off piano/train/piano_0113.off piano/train/piano_0114.off piano/train/piano_0115.off piano/train/piano_0116.off piano/train/piano_0117.off piano/train/piano_0118.off piano/train/piano_0119.off piano/train/piano_0120.off piano/train/piano_0121.off piano/train/piano_0122.off piano/train/piano_0123.off piano/train/piano_0124.off piano/train/piano_0125.off piano/train/piano_0126.off piano/train/piano_0127.off piano/train/piano_0128.off piano/train/piano_0129.off piano/train/piano_0130.off piano/train/piano_0131.off piano/train/piano_0132.off piano/train/piano_0133.off piano/train/piano_0134.off piano/train/piano_0135.off piano/train/piano_0136.off piano/train/piano_0137.off piano/train/piano_0138.off piano/train/piano_0139.off piano/train/piano_0140.off piano/train/piano_0141.off piano/train/piano_0142.off piano/train/piano_0143.off piano/train/piano_0144.off piano/train/piano_0145.off piano/train/piano_0146.off piano/train/piano_0147.off piano/train/piano_0148.off piano/train/piano_0149.off piano/train/piano_0150.off piano/train/piano_0151.off piano/train/piano_0152.off piano/train/piano_0153.off piano/train/piano_0154.off piano/train/piano_0155.off piano/train/piano_0156.off piano/train/piano_0157.off piano/train/piano_0158.off piano/train/piano_0159.off piano/train/piano_0160.off piano/train/piano_0161.off piano/train/piano_0162.off piano/train/piano_0163.off piano/train/piano_0164.off piano/train/piano_0165.off piano/train/piano_0166.off piano/train/piano_0167.off piano/train/piano_0168.off piano/train/piano_0169.off piano/train/piano_0170.off piano/train/piano_0171.off piano/train/piano_0172.off piano/train/piano_0173.off piano/train/piano_0174.off piano/train/piano_0175.off piano/train/piano_0176.off piano/train/piano_0177.off piano/train/piano_0178.off piano/train/piano_0179.off piano/train/piano_0180.off piano/train/piano_0181.off piano/train/piano_0182.off piano/train/piano_0183.off piano/train/piano_0184.off piano/train/piano_0185.off piano/train/piano_0186.off piano/train/piano_0187.off piano/train/piano_0188.off piano/train/piano_0189.off piano/train/piano_0190.off piano/train/piano_0191.off piano/train/piano_0192.off piano/train/piano_0193.off piano/train/piano_0194.off piano/train/piano_0195.off piano/train/piano_0196.off piano/train/piano_0197.off piano/train/piano_0198.off piano/train/piano_0199.off piano/train/piano_0200.off piano/train/piano_0201.off piano/train/piano_0202.off piano/train/piano_0203.off piano/train/piano_0204.off piano/train/piano_0205.off piano/train/piano_0206.off piano/train/piano_0207.off piano/train/piano_0208.off sofa/train/sofa_0001.off sofa/train/sofa_0002.off sofa/train/sofa_0003.off sofa/train/sofa_0004.off sofa/train/sofa_0005.off sofa/train/sofa_0006.off sofa/train/sofa_0007.off sofa/train/sofa_0008.off sofa/train/sofa_0009.off sofa/train/sofa_0010.off sofa/train/sofa_0011.off sofa/train/sofa_0012.off sofa/train/sofa_0013.off sofa/train/sofa_0014.off sofa/train/sofa_0015.off sofa/train/sofa_0016.off sofa/train/sofa_0017.off sofa/train/sofa_0018.off sofa/train/sofa_0019.off sofa/train/sofa_0020.off sofa/train/sofa_0021.off sofa/train/sofa_0022.off sofa/train/sofa_0023.off sofa/train/sofa_0024.off sofa/train/sofa_0025.off sofa/train/sofa_0026.off sofa/train/sofa_0027.off sofa/train/sofa_0028.off sofa/train/sofa_0029.off sofa/train/sofa_0030.off sofa/train/sofa_0031.off sofa/train/sofa_0032.off sofa/train/sofa_0033.off sofa/train/sofa_0034.off sofa/train/sofa_0035.off sofa/train/sofa_0036.off sofa/train/sofa_0037.off sofa/train/sofa_0038.off sofa/train/sofa_0039.off sofa/train/sofa_0040.off sofa/train/sofa_0041.off sofa/train/sofa_0042.off sofa/train/sofa_0043.off sofa/train/sofa_0044.off sofa/train/sofa_0045.off sofa/train/sofa_0046.off sofa/train/sofa_0047.off sofa/train/sofa_0048.off sofa/train/sofa_0049.off sofa/train/sofa_0050.off sofa/train/sofa_0051.off sofa/train/sofa_0052.off sofa/train/sofa_0053.off sofa/train/sofa_0054.off sofa/train/sofa_0055.off sofa/train/sofa_0056.off sofa/train/sofa_0057.off sofa/train/sofa_0058.off sofa/train/sofa_0059.off sofa/train/sofa_0060.off sofa/train/sofa_0061.off sofa/train/sofa_0062.off sofa/train/sofa_0063.off sofa/train/sofa_0064.off sofa/train/sofa_0065.off sofa/train/sofa_0066.off sofa/train/sofa_0067.off sofa/train/sofa_0068.off sofa/train/sofa_0069.off sofa/train/sofa_0070.off sofa/train/sofa_0071.off sofa/train/sofa_0072.off sofa/train/sofa_0073.off sofa/train/sofa_0074.off sofa/train/sofa_0075.off sofa/train/sofa_0076.off sofa/train/sofa_0077.off sofa/train/sofa_0078.off sofa/train/sofa_0079.off sofa/train/sofa_0080.off sofa/train/sofa_0081.off sofa/train/sofa_0082.off sofa/train/sofa_0083.off sofa/train/sofa_0084.off sofa/train/sofa_0085.off sofa/train/sofa_0086.off sofa/train/sofa_0087.off sofa/train/sofa_0088.off sofa/train/sofa_0089.off sofa/train/sofa_0090.off sofa/train/sofa_0091.off sofa/train/sofa_0092.off sofa/train/sofa_0093.off sofa/train/sofa_0094.off sofa/train/sofa_0095.off sofa/train/sofa_0096.off sofa/train/sofa_0097.off sofa/train/sofa_0098.off sofa/train/sofa_0099.off sofa/train/sofa_0100.off sofa/train/sofa_0101.off sofa/train/sofa_0102.off sofa/train/sofa_0103.off sofa/train/sofa_0104.off sofa/train/sofa_0105.off sofa/train/sofa_0106.off sofa/train/sofa_0107.off sofa/train/sofa_0108.off sofa/train/sofa_0109.off sofa/train/sofa_0110.off sofa/train/sofa_0111.off sofa/train/sofa_0112.off sofa/train/sofa_0113.off sofa/train/sofa_0114.off sofa/train/sofa_0115.off sofa/train/sofa_0116.off sofa/train/sofa_0117.off sofa/train/sofa_0118.off sofa/train/sofa_0119.off sofa/train/sofa_0120.off sofa/train/sofa_0121.off sofa/train/sofa_0122.off sofa/train/sofa_0123.off sofa/train/sofa_0124.off sofa/train/sofa_0125.off sofa/train/sofa_0126.off sofa/train/sofa_0127.off sofa/train/sofa_0128.off sofa/train/sofa_0129.off sofa/train/sofa_0130.off sofa/train/sofa_0131.off sofa/train/sofa_0132.off sofa/train/sofa_0133.off sofa/train/sofa_0134.off sofa/train/sofa_0135.off sofa/train/sofa_0136.off sofa/train/sofa_0137.off sofa/train/sofa_0138.off sofa/train/sofa_0139.off sofa/train/sofa_0140.off sofa/train/sofa_0141.off sofa/train/sofa_0142.off sofa/train/sofa_0143.off sofa/train/sofa_0144.off sofa/train/sofa_0145.off sofa/train/sofa_0146.off sofa/train/sofa_0147.off sofa/train/sofa_0148.off sofa/train/sofa_0149.off sofa/train/sofa_0150.off sofa/train/sofa_0151.off sofa/train/sofa_0152.off sofa/train/sofa_0153.off sofa/train/sofa_0154.off sofa/train/sofa_0155.off sofa/train/sofa_0156.off sofa/train/sofa_0157.off sofa/train/sofa_0158.off sofa/train/sofa_0159.off sofa/train/sofa_0160.off sofa/train/sofa_0161.off sofa/train/sofa_0162.off sofa/train/sofa_0163.off sofa/train/sofa_0164.off sofa/train/sofa_0165.off sofa/train/sofa_0166.off sofa/train/sofa_0167.off sofa/train/sofa_0168.off sofa/train/sofa_0169.off sofa/train/sofa_0170.off sofa/train/sofa_0171.off sofa/train/sofa_0172.off sofa/train/sofa_0173.off sofa/train/sofa_0174.off sofa/train/sofa_0175.off sofa/train/sofa_0176.off sofa/train/sofa_0177.off sofa/train/sofa_0178.off sofa/train/sofa_0179.off sofa/train/sofa_0180.off sofa/train/sofa_0181.off sofa/train/sofa_0182.off sofa/train/sofa_0183.off sofa/train/sofa_0184.off sofa/train/sofa_0185.off sofa/train/sofa_0186.off sofa/train/sofa_0187.off sofa/train/sofa_0188.off sofa/train/sofa_0189.off sofa/train/sofa_0190.off sofa/train/sofa_0191.off sofa/train/sofa_0192.off sofa/train/sofa_0193.off sofa/train/sofa_0194.off sofa/train/sofa_0195.off sofa/train/sofa_0196.off sofa/train/sofa_0197.off sofa/train/sofa_0198.off sofa/train/sofa_0199.off sofa/train/sofa_0200.off sofa/train/sofa_0201.off sofa/train/sofa_0202.off sofa/train/sofa_0203.off sofa/train/sofa_0204.off sofa/train/sofa_0205.off sofa/train/sofa_0206.off sofa/train/sofa_0207.off sofa/train/sofa_0208.off sofa/train/sofa_0209.off sofa/train/sofa_0210.off sofa/train/sofa_0211.off sofa/train/sofa_0212.off sofa/train/sofa_0213.off sofa/train/sofa_0214.off sofa/train/sofa_0215.off sofa/train/sofa_0216.off sofa/train/sofa_0217.off sofa/train/sofa_0218.off sofa/train/sofa_0219.off sofa/train/sofa_0220.off sofa/train/sofa_0221.off sofa/train/sofa_0222.off sofa/train/sofa_0223.off sofa/train/sofa_0224.off sofa/train/sofa_0225.off sofa/train/sofa_0226.off sofa/train/sofa_0227.off sofa/train/sofa_0228.off sofa/train/sofa_0229.off sofa/train/sofa_0230.off sofa/train/sofa_0231.off sofa/train/sofa_0232.off sofa/train/sofa_0233.off sofa/train/sofa_0234.off sofa/train/sofa_0235.off sofa/train/sofa_0236.off sofa/train/sofa_0237.off sofa/train/sofa_0238.off sofa/train/sofa_0239.off sofa/train/sofa_0240.off sofa/train/sofa_0241.off sofa/train/sofa_0242.off sofa/train/sofa_0243.off sofa/train/sofa_0244.off sofa/train/sofa_0245.off sofa/train/sofa_0246.off sofa/train/sofa_0247.off sofa/train/sofa_0248.off sofa/train/sofa_0249.off sofa/train/sofa_0250.off sofa/train/sofa_0251.off sofa/train/sofa_0252.off sofa/train/sofa_0253.off sofa/train/sofa_0254.off sofa/train/sofa_0255.off sofa/train/sofa_0256.off sofa/train/sofa_0257.off sofa/train/sofa_0258.off sofa/train/sofa_0259.off sofa/train/sofa_0260.off sofa/train/sofa_0261.off sofa/train/sofa_0262.off sofa/train/sofa_0263.off sofa/train/sofa_0264.off sofa/train/sofa_0265.off sofa/train/sofa_0266.off sofa/train/sofa_0267.off sofa/train/sofa_0268.off sofa/train/sofa_0269.off sofa/train/sofa_0270.off sofa/train/sofa_0271.off sofa/train/sofa_0272.off sofa/train/sofa_0273.off sofa/train/sofa_0274.off sofa/train/sofa_0275.off sofa/train/sofa_0276.off sofa/train/sofa_0277.off sofa/train/sofa_0278.off sofa/train/sofa_0279.off sofa/train/sofa_0280.off sofa/train/sofa_0281.off sofa/train/sofa_0282.off sofa/train/sofa_0283.off sofa/train/sofa_0284.off sofa/train/sofa_0285.off sofa/train/sofa_0286.off sofa/train/sofa_0287.off sofa/train/sofa_0288.off sofa/train/sofa_0289.off sofa/train/sofa_0290.off sofa/train/sofa_0291.off sofa/train/sofa_0292.off sofa/train/sofa_0293.off sofa/train/sofa_0294.off sofa/train/sofa_0295.off sofa/train/sofa_0296.off sofa/train/sofa_0297.off sofa/train/sofa_0298.off sofa/train/sofa_0299.off sofa/train/sofa_0300.off sofa/train/sofa_0301.off sofa/train/sofa_0302.off sofa/train/sofa_0303.off sofa/train/sofa_0304.off sofa/train/sofa_0305.off sofa/train/sofa_0306.off sofa/train/sofa_0307.off sofa/train/sofa_0308.off sofa/train/sofa_0309.off sofa/train/sofa_0310.off sofa/train/sofa_0311.off sofa/train/sofa_0312.off sofa/train/sofa_0313.off sofa/train/sofa_0314.off sofa/train/sofa_0315.off sofa/train/sofa_0316.off sofa/train/sofa_0317.off sofa/train/sofa_0318.off sofa/train/sofa_0319.off sofa/train/sofa_0320.off sofa/train/sofa_0321.off sofa/train/sofa_0322.off sofa/train/sofa_0323.off sofa/train/sofa_0324.off sofa/train/sofa_0325.off sofa/train/sofa_0326.off sofa/train/sofa_0327.off sofa/train/sofa_0328.off sofa/train/sofa_0329.off sofa/train/sofa_0330.off sofa/train/sofa_0331.off sofa/train/sofa_0332.off sofa/train/sofa_0333.off sofa/train/sofa_0334.off sofa/train/sofa_0335.off sofa/train/sofa_0336.off sofa/train/sofa_0337.off sofa/train/sofa_0338.off sofa/train/sofa_0339.off sofa/train/sofa_0340.off sofa/train/sofa_0341.off sofa/train/sofa_0342.off sofa/train/sofa_0343.off sofa/train/sofa_0344.off sofa/train/sofa_0345.off sofa/train/sofa_0346.off sofa/train/sofa_0347.off sofa/train/sofa_0348.off sofa/train/sofa_0349.off sofa/train/sofa_0350.off sofa/train/sofa_0351.off sofa/train/sofa_0352.off sofa/train/sofa_0353.off sofa/train/sofa_0354.off sofa/train/sofa_0355.off sofa/train/sofa_0356.off sofa/train/sofa_0357.off sofa/train/sofa_0358.off sofa/train/sofa_0359.off sofa/train/sofa_0360.off sofa/train/sofa_0361.off sofa/train/sofa_0362.off sofa/train/sofa_0363.off sofa/train/sofa_0364.off sofa/train/sofa_0365.off sofa/train/sofa_0366.off sofa/train/sofa_0367.off sofa/train/sofa_0368.off sofa/train/sofa_0369.off sofa/train/sofa_0370.off sofa/train/sofa_0371.off sofa/train/sofa_0372.off sofa/train/sofa_0373.off sofa/train/sofa_0374.off sofa/train/sofa_0375.off sofa/train/sofa_0376.off sofa/train/sofa_0377.off sofa/train/sofa_0378.off sofa/train/sofa_0379.off sofa/train/sofa_0380.off sofa/train/sofa_0381.off sofa/train/sofa_0382.off sofa/train/sofa_0383.off sofa/train/sofa_0384.off sofa/train/sofa_0385.off sofa/train/sofa_0386.off sofa/train/sofa_0387.off sofa/train/sofa_0388.off sofa/train/sofa_0389.off sofa/train/sofa_0390.off sofa/train/sofa_0391.off sofa/train/sofa_0392.off sofa/train/sofa_0393.off sofa/train/sofa_0394.off sofa/train/sofa_0395.off sofa/train/sofa_0396.off sofa/train/sofa_0397.off sofa/train/sofa_0398.off sofa/train/sofa_0399.off sofa/train/sofa_0400.off sofa/train/sofa_0401.off sofa/train/sofa_0402.off sofa/train/sofa_0403.off sofa/train/sofa_0404.off sofa/train/sofa_0405.off sofa/train/sofa_0406.off sofa/train/sofa_0407.off sofa/train/sofa_0408.off sofa/train/sofa_0409.off sofa/train/sofa_0410.off sofa/train/sofa_0411.off sofa/train/sofa_0412.off sofa/train/sofa_0413.off sofa/train/sofa_0414.off sofa/train/sofa_0415.off sofa/train/sofa_0416.off sofa/train/sofa_0417.off sofa/train/sofa_0418.off sofa/train/sofa_0419.off sofa/train/sofa_0420.off sofa/train/sofa_0421.off sofa/train/sofa_0422.off sofa/train/sofa_0423.off sofa/train/sofa_0424.off sofa/train/sofa_0425.off sofa/train/sofa_0426.off sofa/train/sofa_0427.off sofa/train/sofa_0428.off sofa/train/sofa_0429.off sofa/train/sofa_0430.off sofa/train/sofa_0431.off sofa/train/sofa_0432.off sofa/train/sofa_0433.off sofa/train/sofa_0434.off sofa/train/sofa_0435.off sofa/train/sofa_0436.off sofa/train/sofa_0437.off sofa/train/sofa_0438.off sofa/train/sofa_0439.off sofa/train/sofa_0440.off sofa/train/sofa_0441.off sofa/train/sofa_0442.off sofa/train/sofa_0443.off sofa/train/sofa_0444.off sofa/train/sofa_0445.off sofa/train/sofa_0446.off sofa/train/sofa_0447.off sofa/train/sofa_0448.off sofa/train/sofa_0449.off sofa/train/sofa_0450.off sofa/train/sofa_0451.off sofa/train/sofa_0452.off sofa/train/sofa_0453.off sofa/train/sofa_0454.off sofa/train/sofa_0455.off sofa/train/sofa_0456.off sofa/train/sofa_0457.off sofa/train/sofa_0458.off sofa/train/sofa_0459.off sofa/train/sofa_0460.off sofa/train/sofa_0461.off sofa/train/sofa_0462.off sofa/train/sofa_0463.off sofa/train/sofa_0464.off sofa/train/sofa_0465.off sofa/train/sofa_0466.off sofa/train/sofa_0467.off sofa/train/sofa_0468.off sofa/train/sofa_0469.off sofa/train/sofa_0470.off sofa/train/sofa_0471.off sofa/train/sofa_0472.off sofa/train/sofa_0473.off sofa/train/sofa_0474.off sofa/train/sofa_0475.off sofa/train/sofa_0476.off sofa/train/sofa_0477.off sofa/train/sofa_0478.off sofa/train/sofa_0479.off sofa/train/sofa_0480.off sofa/train/sofa_0481.off sofa/train/sofa_0482.off sofa/train/sofa_0483.off sofa/train/sofa_0484.off sofa/train/sofa_0485.off sofa/train/sofa_0486.off sofa/train/sofa_0487.off sofa/train/sofa_0488.off sofa/train/sofa_0489.off sofa/train/sofa_0490.off sofa/train/sofa_0491.off sofa/train/sofa_0492.off sofa/train/sofa_0493.off sofa/train/sofa_0494.off sofa/train/sofa_0495.off sofa/train/sofa_0496.off sofa/train/sofa_0497.off sofa/train/sofa_0498.off sofa/train/sofa_0499.off sofa/train/sofa_0500.off sofa/train/sofa_0501.off sofa/train/sofa_0502.off sofa/train/sofa_0503.off sofa/train/sofa_0504.off sofa/train/sofa_0505.off sofa/train/sofa_0506.off sofa/train/sofa_0507.off sofa/train/sofa_0508.off sofa/train/sofa_0509.off sofa/train/sofa_0510.off sofa/train/sofa_0511.off sofa/train/sofa_0512.off sofa/train/sofa_0513.off sofa/train/sofa_0514.off sofa/train/sofa_0515.off sofa/train/sofa_0516.off sofa/train/sofa_0517.off sofa/train/sofa_0518.off sofa/train/sofa_0519.off sofa/train/sofa_0520.off sofa/train/sofa_0521.off sofa/train/sofa_0522.off sofa/train/sofa_0523.off sofa/train/sofa_0524.off sofa/train/sofa_0525.off sofa/train/sofa_0526.off sofa/train/sofa_0527.off sofa/train/sofa_0528.off sofa/train/sofa_0529.off sofa/train/sofa_0530.off sofa/train/sofa_0531.off sofa/train/sofa_0532.off sofa/train/sofa_0533.off sofa/train/sofa_0534.off sofa/train/sofa_0535.off sofa/train/sofa_0536.off sofa/train/sofa_0537.off sofa/train/sofa_0538.off sofa/train/sofa_0539.off sofa/train/sofa_0540.off sofa/train/sofa_0541.off sofa/train/sofa_0542.off sofa/train/sofa_0543.off sofa/train/sofa_0544.off sofa/train/sofa_0545.off sofa/train/sofa_0546.off sofa/train/sofa_0547.off sofa/train/sofa_0548.off sofa/train/sofa_0549.off sofa/train/sofa_0550.off sofa/train/sofa_0551.off sofa/train/sofa_0552.off sofa/train/sofa_0553.off sofa/train/sofa_0554.off sofa/train/sofa_0555.off sofa/train/sofa_0556.off sofa/train/sofa_0557.off sofa/train/sofa_0558.off sofa/train/sofa_0559.off sofa/train/sofa_0560.off sofa/train/sofa_0561.off sofa/train/sofa_0562.off sofa/train/sofa_0563.off sofa/train/sofa_0564.off sofa/train/sofa_0565.off sofa/train/sofa_0566.off sofa/train/sofa_0567.off sofa/train/sofa_0568.off sofa/train/sofa_0569.off sofa/train/sofa_0570.off sofa/train/sofa_0571.off sofa/train/sofa_0572.off sofa/train/sofa_0573.off sofa/train/sofa_0574.off sofa/train/sofa_0575.off sofa/train/sofa_0576.off sofa/train/sofa_0577.off sofa/train/sofa_0578.off sofa/train/sofa_0579.off sofa/train/sofa_0580.off sofa/train/sofa_0581.off sofa/train/sofa_0582.off sofa/train/sofa_0583.off sofa/train/sofa_0584.off sofa/train/sofa_0585.off sofa/train/sofa_0586.off sofa/train/sofa_0587.off sofa/train/sofa_0588.off sofa/train/sofa_0589.off sofa/train/sofa_0590.off sofa/train/sofa_0591.off sofa/train/sofa_0592.off sofa/train/sofa_0593.off sofa/train/sofa_0594.off sofa/train/sofa_0595.off sofa/train/sofa_0596.off sofa/train/sofa_0597.off sofa/train/sofa_0598.off sofa/train/sofa_0599.off sofa/train/sofa_0600.off sofa/train/sofa_0601.off sofa/train/sofa_0602.off sofa/train/sofa_0603.off sofa/train/sofa_0604.off sofa/train/sofa_0605.off sofa/train/sofa_0606.off sofa/train/sofa_0607.off sofa/train/sofa_0608.off sofa/train/sofa_0609.off sofa/train/sofa_0610.off sofa/train/sofa_0611.off sofa/train/sofa_0612.off person/train/person_0001.off person/train/person_0002.off person/train/person_0003.off person/train/person_0004.off person/train/person_0005.off person/train/person_0006.off person/train/person_0007.off person/train/person_0008.off person/train/person_0009.off person/train/person_0010.off person/train/person_0011.off person/train/person_0012.off person/train/person_0013.off person/train/person_0014.off person/train/person_0015.off person/train/person_0016.off person/train/person_0017.off person/train/person_0018.off person/train/person_0019.off person/train/person_0020.off person/train/person_0021.off person/train/person_0022.off person/train/person_0023.off person/train/person_0024.off person/train/person_0025.off person/train/person_0026.off person/train/person_0027.off person/train/person_0028.off person/train/person_0029.off person/train/person_0030.off person/train/person_0031.off person/train/person_0032.off person/train/person_0033.off person/train/person_0034.off person/train/person_0035.off person/train/person_0036.off person/train/person_0037.off person/train/person_0038.off person/train/person_0039.off person/train/person_0040.off person/train/person_0041.off person/train/person_0042.off person/train/person_0043.off person/train/person_0044.off person/train/person_0045.off person/train/person_0046.off person/train/person_0047.off person/train/person_0048.off person/train/person_0049.off person/train/person_0050.off person/train/person_0051.off person/train/person_0052.off person/train/person_0053.off person/train/person_0054.off person/train/person_0055.off person/train/person_0056.off person/train/person_0057.off person/train/person_0058.off person/train/person_0059.off person/train/person_0060.off person/train/person_0061.off person/train/person_0062.off person/train/person_0063.off person/train/person_0064.off person/train/person_0065.off person/train/person_0066.off person/train/person_0067.off person/train/person_0068.off person/train/person_0069.off person/train/person_0070.off person/train/person_0071.off person/train/person_0072.off person/train/person_0073.off person/train/person_0074.off person/train/person_0075.off person/train/person_0076.off person/train/person_0077.off person/train/person_0078.off person/train/person_0079.off person/train/person_0080.off xbox/train/xbox_0001.off xbox/train/xbox_0002.off xbox/train/xbox_0003.off xbox/train/xbox_0004.off xbox/train/xbox_0005.off xbox/train/xbox_0006.off xbox/train/xbox_0007.off xbox/train/xbox_0008.off xbox/train/xbox_0009.off xbox/train/xbox_0010.off xbox/train/xbox_0011.off xbox/train/xbox_0012.off xbox/train/xbox_0013.off xbox/train/xbox_0014.off xbox/train/xbox_0015.off xbox/train/xbox_0016.off xbox/train/xbox_0017.off xbox/train/xbox_0018.off xbox/train/xbox_0019.off xbox/train/xbox_0020.off xbox/train/xbox_0021.off xbox/train/xbox_0022.off xbox/train/xbox_0023.off xbox/train/xbox_0024.off xbox/train/xbox_0025.off xbox/train/xbox_0026.off xbox/train/xbox_0027.off xbox/train/xbox_0028.off xbox/train/xbox_0029.off xbox/train/xbox_0030.off xbox/train/xbox_0031.off xbox/train/xbox_0032.off xbox/train/xbox_0033.off xbox/train/xbox_0034.off xbox/train/xbox_0035.off xbox/train/xbox_0036.off xbox/train/xbox_0037.off xbox/train/xbox_0038.off xbox/train/xbox_0039.off xbox/train/xbox_0040.off xbox/train/xbox_0041.off xbox/train/xbox_0042.off xbox/train/xbox_0043.off xbox/train/xbox_0044.off xbox/train/xbox_0045.off xbox/train/xbox_0046.off xbox/train/xbox_0047.off xbox/train/xbox_0048.off xbox/train/xbox_0049.off xbox/train/xbox_0050.off xbox/train/xbox_0051.off xbox/train/xbox_0052.off xbox/train/xbox_0053.off xbox/train/xbox_0054.off xbox/train/xbox_0055.off xbox/train/xbox_0056.off xbox/train/xbox_0057.off xbox/train/xbox_0058.off xbox/train/xbox_0059.off xbox/train/xbox_0060.off xbox/train/xbox_0061.off xbox/train/xbox_0062.off xbox/train/xbox_0063.off xbox/train/xbox_0064.off xbox/train/xbox_0065.off xbox/train/xbox_0066.off xbox/train/xbox_0067.off xbox/train/xbox_0068.off xbox/train/xbox_0069.off xbox/train/xbox_0070.off xbox/train/xbox_0071.off xbox/train/xbox_0072.off xbox/train/xbox_0073.off xbox/train/xbox_0074.off xbox/train/xbox_0075.off xbox/train/xbox_0076.off xbox/train/xbox_0077.off xbox/train/xbox_0078.off xbox/train/xbox_0079.off xbox/train/xbox_0080.off xbox/train/xbox_0081.off xbox/train/xbox_0082.off xbox/train/xbox_0083.off xbox/train/xbox_0084.off xbox/train/xbox_0085.off xbox/train/xbox_0086.off xbox/train/xbox_0087.off xbox/train/xbox_0088.off xbox/train/xbox_0089.off xbox/train/xbox_0090.off xbox/train/xbox_0091.off xbox/train/xbox_0092.off xbox/train/xbox_0093.off stairs/train/stairs_0001.off stairs/train/stairs_0002.off stairs/train/stairs_0003.off stairs/train/stairs_0004.off stairs/train/stairs_0005.off stairs/train/stairs_0006.off stairs/train/stairs_0007.off stairs/train/stairs_0008.off stairs/train/stairs_0009.off stairs/train/stairs_0010.off stairs/train/stairs_0011.off stairs/train/stairs_0012.off stairs/train/stairs_0013.off stairs/train/stairs_0014.off stairs/train/stairs_0015.off stairs/train/stairs_0016.off stairs/train/stairs_0017.off stairs/train/stairs_0018.off stairs/train/stairs_0019.off stairs/train/stairs_0020.off stairs/train/stairs_0021.off stairs/train/stairs_0022.off stairs/train/stairs_0023.off stairs/train/stairs_0024.off stairs/train/stairs_0025.off stairs/train/stairs_0026.off stairs/train/stairs_0027.off stairs/train/stairs_0028.off stairs/train/stairs_0029.off stairs/train/stairs_0030.off stairs/train/stairs_0031.off stairs/train/stairs_0032.off stairs/train/stairs_0033.off stairs/train/stairs_0034.off stairs/train/stairs_0035.off stairs/train/stairs_0036.off stairs/train/stairs_0037.off stairs/train/stairs_0038.off stairs/train/stairs_0039.off stairs/train/stairs_0040.off stairs/train/stairs_0041.off stairs/train/stairs_0042.off stairs/train/stairs_0043.off stairs/train/stairs_0044.off stairs/train/stairs_0045.off stairs/train/stairs_0046.off stairs/train/stairs_0047.off stairs/train/stairs_0048.off stairs/train/stairs_0049.off stairs/train/stairs_0050.off stairs/train/stairs_0051.off stairs/train/stairs_0052.off stairs/train/stairs_0053.off stairs/train/stairs_0054.off stairs/train/stairs_0055.off stairs/train/stairs_0056.off stairs/train/stairs_0057.off stairs/train/stairs_0058.off stairs/train/stairs_0059.off stairs/train/stairs_0060.off stairs/train/stairs_0061.off stairs/train/stairs_0062.off stairs/train/stairs_0063.off stairs/train/stairs_0064.off stairs/train/stairs_0065.off stairs/train/stairs_0066.off stairs/train/stairs_0067.off stairs/train/stairs_0068.off stairs/train/stairs_0069.off stairs/train/stairs_0070.off stairs/train/stairs_0071.off stairs/train/stairs_0072.off stairs/train/stairs_0073.off stairs/train/stairs_0074.off stairs/train/stairs_0075.off stairs/train/stairs_0076.off stairs/train/stairs_0077.off stairs/train/stairs_0078.off stairs/train/stairs_0079.off stairs/train/stairs_0080.off stairs/train/stairs_0081.off stairs/train/stairs_0082.off stairs/train/stairs_0083.off stairs/train/stairs_0084.off stairs/train/stairs_0085.off stairs/train/stairs_0086.off stairs/train/stairs_0087.off stairs/train/stairs_0088.off stairs/train/stairs_0089.off stairs/train/stairs_0090.off stairs/train/stairs_0091.off stairs/train/stairs_0092.off stairs/train/stairs_0093.off stairs/train/stairs_0094.off stairs/train/stairs_0095.off stairs/train/stairs_0096.off stairs/train/stairs_0097.off stairs/train/stairs_0098.off stairs/train/stairs_0099.off stairs/train/stairs_0100.off stairs/train/stairs_0101.off stairs/train/stairs_0102.off stairs/train/stairs_0103.off stairs/train/stairs_0104.off stairs/train/stairs_0105.off stairs/train/stairs_0106.off stairs/train/stairs_0107.off stairs/train/stairs_0108.off stairs/train/stairs_0109.off stairs/train/stairs_0110.off stairs/train/stairs_0111.off stairs/train/stairs_0112.off cone/train/cone_0001.off cone/train/cone_0002.off cone/train/cone_0003.off cone/train/cone_0004.off cone/train/cone_0005.off cone/train/cone_0006.off cone/train/cone_0007.off cone/train/cone_0008.off cone/train/cone_0009.off cone/train/cone_0010.off cone/train/cone_0011.off cone/train/cone_0012.off cone/train/cone_0013.off cone/train/cone_0014.off cone/train/cone_0015.off cone/train/cone_0016.off cone/train/cone_0017.off cone/train/cone_0018.off cone/train/cone_0019.off cone/train/cone_0020.off cone/train/cone_0021.off cone/train/cone_0022.off cone/train/cone_0023.off cone/train/cone_0024.off cone/train/cone_0025.off cone/train/cone_0026.off cone/train/cone_0027.off cone/train/cone_0028.off cone/train/cone_0029.off cone/train/cone_0030.off cone/train/cone_0031.off cone/train/cone_0032.off cone/train/cone_0033.off cone/train/cone_0034.off cone/train/cone_0035.off cone/train/cone_0036.off cone/train/cone_0037.off cone/train/cone_0038.off cone/train/cone_0039.off cone/train/cone_0040.off cone/train/cone_0041.off cone/train/cone_0042.off cone/train/cone_0043.off cone/train/cone_0044.off cone/train/cone_0045.off cone/train/cone_0046.off cone/train/cone_0047.off cone/train/cone_0048.off cone/train/cone_0049.off cone/train/cone_0050.off cone/train/cone_0051.off cone/train/cone_0052.off cone/train/cone_0053.off cone/train/cone_0054.off cone/train/cone_0055.off cone/train/cone_0056.off cone/train/cone_0057.off cone/train/cone_0058.off cone/train/cone_0059.off cone/train/cone_0060.off cone/train/cone_0061.off cone/train/cone_0062.off cone/train/cone_0063.off cone/train/cone_0064.off cone/train/cone_0065.off cone/train/cone_0066.off cone/train/cone_0067.off cone/train/cone_0068.off cone/train/cone_0069.off cone/train/cone_0070.off cone/train/cone_0071.off cone/train/cone_0072.off cone/train/cone_0073.off cone/train/cone_0074.off cone/train/cone_0075.off cone/train/cone_0076.off cone/train/cone_0077.off cone/train/cone_0078.off cone/train/cone_0079.off cone/train/cone_0080.off cone/train/cone_0081.off cone/train/cone_0082.off cone/train/cone_0083.off cone/train/cone_0084.off cone/train/cone_0085.off cone/train/cone_0086.off cone/train/cone_0087.off cone/train/cone_0088.off cone/train/cone_0089.off cone/train/cone_0090.off cone/train/cone_0091.off cone/train/cone_0092.off cone/train/cone_0093.off cone/train/cone_0094.off cone/train/cone_0095.off cone/train/cone_0096.off cone/train/cone_0097.off cone/train/cone_0098.off cone/train/cone_0099.off cone/train/cone_0100.off cone/train/cone_0101.off cone/train/cone_0102.off cone/train/cone_0103.off cone/train/cone_0104.off cone/train/cone_0105.off cone/train/cone_0106.off cone/train/cone_0107.off cone/train/cone_0108.off cone/train/cone_0109.off cone/train/cone_0110.off cone/train/cone_0111.off cone/train/cone_0112.off cone/train/cone_0113.off cone/train/cone_0114.off cone/train/cone_0115.off cone/train/cone_0116.off cone/train/cone_0117.off cone/train/cone_0118.off cone/train/cone_0119.off cone/train/cone_0120.off cone/train/cone_0121.off cone/train/cone_0122.off cone/train/cone_0123.off cone/train/cone_0124.off cone/train/cone_0125.off cone/train/cone_0126.off cone/train/cone_0127.off cone/train/cone_0128.off cone/train/cone_0129.off cone/train/cone_0130.off cone/train/cone_0131.off cone/train/cone_0132.off cone/train/cone_0133.off cone/train/cone_0134.off cone/train/cone_0135.off cone/train/cone_0136.off cone/train/cone_0137.off cone/train/cone_0138.off cone/train/cone_0139.off cone/train/cone_0140.off cone/train/cone_0141.off cone/train/cone_0142.off cone/train/cone_0143.off cone/train/cone_0144.off cone/train/cone_0145.off cone/train/cone_0146.off cone/train/cone_0147.off cone/train/cone_0148.off cone/train/cone_0149.off cone/train/cone_0150.off cone/train/cone_0151.off lamp/train/lamp_0001.off lamp/train/lamp_0002.off lamp/train/lamp_0003.off lamp/train/lamp_0004.off lamp/train/lamp_0005.off lamp/train/lamp_0006.off lamp/train/lamp_0007.off lamp/train/lamp_0008.off lamp/train/lamp_0009.off lamp/train/lamp_0010.off lamp/train/lamp_0011.off lamp/train/lamp_0012.off lamp/train/lamp_0013.off lamp/train/lamp_0014.off lamp/train/lamp_0015.off lamp/train/lamp_0016.off lamp/train/lamp_0017.off lamp/train/lamp_0018.off lamp/train/lamp_0019.off lamp/train/lamp_0020.off lamp/train/lamp_0021.off lamp/train/lamp_0022.off lamp/train/lamp_0023.off lamp/train/lamp_0024.off lamp/train/lamp_0025.off lamp/train/lamp_0026.off lamp/train/lamp_0027.off lamp/train/lamp_0028.off lamp/train/lamp_0029.off lamp/train/lamp_0030.off lamp/train/lamp_0031.off lamp/train/lamp_0032.off lamp/train/lamp_0033.off lamp/train/lamp_0034.off lamp/train/lamp_0035.off lamp/train/lamp_0036.off lamp/train/lamp_0037.off lamp/train/lamp_0038.off lamp/train/lamp_0039.off lamp/train/lamp_0040.off lamp/train/lamp_0041.off lamp/train/lamp_0042.off lamp/train/lamp_0043.off lamp/train/lamp_0044.off lamp/train/lamp_0045.off lamp/train/lamp_0046.off lamp/train/lamp_0047.off lamp/train/lamp_0048.off lamp/train/lamp_0049.off lamp/train/lamp_0050.off lamp/train/lamp_0051.off lamp/train/lamp_0052.off lamp/train/lamp_0053.off lamp/train/lamp_0054.off lamp/train/lamp_0055.off lamp/train/lamp_0056.off lamp/train/lamp_0057.off lamp/train/lamp_0058.off lamp/train/lamp_0059.off lamp/train/lamp_0060.off lamp/train/lamp_0061.off lamp/train/lamp_0062.off lamp/train/lamp_0063.off lamp/train/lamp_0064.off lamp/train/lamp_0065.off lamp/train/lamp_0066.off lamp/train/lamp_0067.off lamp/train/lamp_0068.off lamp/train/lamp_0069.off lamp/train/lamp_0070.off lamp/train/lamp_0071.off lamp/train/lamp_0072.off lamp/train/lamp_0073.off lamp/train/lamp_0074.off lamp/train/lamp_0075.off lamp/train/lamp_0076.off lamp/train/lamp_0077.off lamp/train/lamp_0078.off lamp/train/lamp_0079.off lamp/train/lamp_0080.off lamp/train/lamp_0081.off lamp/train/lamp_0082.off lamp/train/lamp_0083.off lamp/train/lamp_0084.off lamp/train/lamp_0085.off lamp/train/lamp_0086.off lamp/train/lamp_0087.off lamp/train/lamp_0088.off lamp/train/lamp_0089.off lamp/train/lamp_0090.off lamp/train/lamp_0091.off lamp/train/lamp_0092.off lamp/train/lamp_0093.off lamp/train/lamp_0094.off lamp/train/lamp_0095.off lamp/train/lamp_0096.off lamp/train/lamp_0097.off lamp/train/lamp_0098.off lamp/train/lamp_0099.off lamp/train/lamp_0100.off lamp/train/lamp_0101.off lamp/train/lamp_0102.off lamp/train/lamp_0103.off lamp/train/lamp_0104.off lamp/train/lamp_0105.off lamp/train/lamp_0106.off lamp/train/lamp_0107.off lamp/train/lamp_0108.off lamp/train/lamp_0109.off lamp/train/lamp_0110.off lamp/train/lamp_0111.off lamp/train/lamp_0112.off door/train/door_0001.off door/train/door_0002.off door/train/door_0003.off door/train/door_0004.off door/train/door_0005.off door/train/door_0006.off door/train/door_0007.off door/train/door_0008.off door/train/door_0009.off door/train/door_0010.off door/train/door_0011.off door/train/door_0012.off door/train/door_0013.off door/train/door_0014.off door/train/door_0015.off door/train/door_0016.off door/train/door_0017.off door/train/door_0018.off door/train/door_0019.off door/train/door_0020.off door/train/door_0021.off door/train/door_0022.off door/train/door_0023.off door/train/door_0024.off door/train/door_0025.off door/train/door_0026.off door/train/door_0027.off door/train/door_0028.off door/train/door_0029.off door/train/door_0030.off door/train/door_0031.off door/train/door_0032.off door/train/door_0033.off door/train/door_0034.off door/train/door_0035.off door/train/door_0036.off door/train/door_0037.off door/train/door_0038.off door/train/door_0039.off door/train/door_0040.off door/train/door_0041.off door/train/door_0042.off door/train/door_0043.off door/train/door_0044.off door/train/door_0045.off door/train/door_0046.off door/train/door_0047.off door/train/door_0048.off door/train/door_0049.off door/train/door_0050.off door/train/door_0051.off door/train/door_0052.off door/train/door_0053.off door/train/door_0054.off door/train/door_0055.off door/train/door_0056.off door/train/door_0057.off door/train/door_0058.off door/train/door_0059.off door/train/door_0060.off door/train/door_0061.off door/train/door_0062.off door/train/door_0063.off door/train/door_0064.off door/train/door_0065.off door/train/door_0066.off door/train/door_0067.off door/train/door_0068.off door/train/door_0069.off door/train/door_0070.off door/train/door_0071.off door/train/door_0072.off door/train/door_0073.off door/train/door_0074.off door/train/door_0075.off door/train/door_0076.off door/train/door_0077.off door/train/door_0078.off door/train/door_0079.off door/train/door_0080.off door/train/door_0081.off door/train/door_0082.off door/train/door_0083.off door/train/door_0084.off door/train/door_0085.off door/train/door_0086.off door/train/door_0087.off door/train/door_0088.off door/train/door_0089.off door/train/door_0090.off door/train/door_0091.off door/train/door_0092.off door/train/door_0093.off door/train/door_0094.off door/train/door_0095.off door/train/door_0096.off door/train/door_0097.off door/train/door_0098.off door/train/door_0099.off range_hood/train/range_hood_0001.off range_hood/train/range_hood_0002.off range_hood/train/range_hood_0003.off range_hood/train/range_hood_0004.off range_hood/train/range_hood_0005.off range_hood/train/range_hood_0006.off range_hood/train/range_hood_0007.off range_hood/train/range_hood_0008.off range_hood/train/range_hood_0009.off range_hood/train/range_hood_0010.off range_hood/train/range_hood_0011.off range_hood/train/range_hood_0012.off range_hood/train/range_hood_0013.off range_hood/train/range_hood_0014.off range_hood/train/range_hood_0015.off range_hood/train/range_hood_0016.off range_hood/train/range_hood_0017.off range_hood/train/range_hood_0018.off range_hood/train/range_hood_0019.off range_hood/train/range_hood_0020.off range_hood/train/range_hood_0021.off range_hood/train/range_hood_0022.off range_hood/train/range_hood_0023.off range_hood/train/range_hood_0024.off range_hood/train/range_hood_0025.off range_hood/train/range_hood_0026.off range_hood/train/range_hood_0027.off range_hood/train/range_hood_0028.off range_hood/train/range_hood_0029.off range_hood/train/range_hood_0030.off range_hood/train/range_hood_0031.off range_hood/train/range_hood_0032.off range_hood/train/range_hood_0033.off range_hood/train/range_hood_0034.off range_hood/train/range_hood_0035.off range_hood/train/range_hood_0036.off range_hood/train/range_hood_0037.off range_hood/train/range_hood_0038.off range_hood/train/range_hood_0039.off range_hood/train/range_hood_0040.off range_hood/train/range_hood_0041.off range_hood/train/range_hood_0042.off range_hood/train/range_hood_0043.off range_hood/train/range_hood_0044.off range_hood/train/range_hood_0045.off range_hood/train/range_hood_0046.off range_hood/train/range_hood_0047.off range_hood/train/range_hood_0048.off range_hood/train/range_hood_0049.off range_hood/train/range_hood_0050.off range_hood/train/range_hood_0051.off range_hood/train/range_hood_0052.off range_hood/train/range_hood_0053.off range_hood/train/range_hood_0054.off range_hood/train/range_hood_0055.off range_hood/train/range_hood_0056.off range_hood/train/range_hood_0057.off range_hood/train/range_hood_0058.off range_hood/train/range_hood_0059.off range_hood/train/range_hood_0060.off range_hood/train/range_hood_0061.off range_hood/train/range_hood_0062.off range_hood/train/range_hood_0063.off range_hood/train/range_hood_0064.off range_hood/train/range_hood_0065.off range_hood/train/range_hood_0066.off range_hood/train/range_hood_0067.off range_hood/train/range_hood_0068.off range_hood/train/range_hood_0069.off range_hood/train/range_hood_0070.off range_hood/train/range_hood_0071.off range_hood/train/range_hood_0072.off range_hood/train/range_hood_0073.off range_hood/train/range_hood_0074.off range_hood/train/range_hood_0075.off range_hood/train/range_hood_0076.off range_hood/train/range_hood_0077.off range_hood/train/range_hood_0078.off range_hood/train/range_hood_0079.off range_hood/train/range_hood_0080.off range_hood/train/range_hood_0081.off range_hood/train/range_hood_0082.off range_hood/train/range_hood_0083.off range_hood/train/range_hood_0084.off range_hood/train/range_hood_0085.off range_hood/train/range_hood_0086.off range_hood/train/range_hood_0087.off range_hood/train/range_hood_0088.off range_hood/train/range_hood_0089.off range_hood/train/range_hood_0090.off range_hood/train/range_hood_0091.off range_hood/train/range_hood_0092.off range_hood/train/range_hood_0093.off range_hood/train/range_hood_0094.off range_hood/train/range_hood_0095.off range_hood/train/range_hood_0096.off range_hood/train/range_hood_0097.off range_hood/train/range_hood_0098.off range_hood/train/range_hood_0099.off range_hood/train/range_hood_0100.off range_hood/train/range_hood_0101.off range_hood/train/range_hood_0102.off range_hood/train/range_hood_0103.off range_hood/train/range_hood_0104.off flower_pot/train/flower_pot_0001.off flower_pot/train/flower_pot_0002.off flower_pot/train/flower_pot_0003.off flower_pot/train/flower_pot_0004.off flower_pot/train/flower_pot_0005.off flower_pot/train/flower_pot_0006.off flower_pot/train/flower_pot_0007.off flower_pot/train/flower_pot_0008.off flower_pot/train/flower_pot_0009.off flower_pot/train/flower_pot_0010.off flower_pot/train/flower_pot_0011.off flower_pot/train/flower_pot_0012.off flower_pot/train/flower_pot_0013.off flower_pot/train/flower_pot_0014.off flower_pot/train/flower_pot_0015.off flower_pot/train/flower_pot_0016.off flower_pot/train/flower_pot_0017.off flower_pot/train/flower_pot_0018.off flower_pot/train/flower_pot_0019.off flower_pot/train/flower_pot_0020.off flower_pot/train/flower_pot_0021.off flower_pot/train/flower_pot_0022.off flower_pot/train/flower_pot_0023.off flower_pot/train/flower_pot_0024.off flower_pot/train/flower_pot_0025.off flower_pot/train/flower_pot_0026.off flower_pot/train/flower_pot_0027.off flower_pot/train/flower_pot_0028.off flower_pot/train/flower_pot_0029.off flower_pot/train/flower_pot_0030.off flower_pot/train/flower_pot_0031.off flower_pot/train/flower_pot_0032.off flower_pot/train/flower_pot_0033.off flower_pot/train/flower_pot_0034.off flower_pot/train/flower_pot_0035.off flower_pot/train/flower_pot_0036.off flower_pot/train/flower_pot_0037.off flower_pot/train/flower_pot_0038.off flower_pot/train/flower_pot_0039.off flower_pot/train/flower_pot_0040.off flower_pot/train/flower_pot_0041.off flower_pot/train/flower_pot_0042.off flower_pot/train/flower_pot_0043.off flower_pot/train/flower_pot_0044.off flower_pot/train/flower_pot_0045.off flower_pot/train/flower_pot_0046.off flower_pot/train/flower_pot_0047.off flower_pot/train/flower_pot_0048.off flower_pot/train/flower_pot_0049.off flower_pot/train/flower_pot_0050.off flower_pot/train/flower_pot_0051.off flower_pot/train/flower_pot_0052.off flower_pot/train/flower_pot_0053.off flower_pot/train/flower_pot_0054.off flower_pot/train/flower_pot_0055.off flower_pot/train/flower_pot_0056.off flower_pot/train/flower_pot_0057.off flower_pot/train/flower_pot_0058.off flower_pot/train/flower_pot_0059.off flower_pot/train/flower_pot_0060.off flower_pot/train/flower_pot_0061.off flower_pot/train/flower_pot_0062.off flower_pot/train/flower_pot_0063.off flower_pot/train/flower_pot_0064.off flower_pot/train/flower_pot_0065.off flower_pot/train/flower_pot_0066.off flower_pot/train/flower_pot_0067.off flower_pot/train/flower_pot_0068.off flower_pot/train/flower_pot_0069.off flower_pot/train/flower_pot_0070.off flower_pot/train/flower_pot_0071.off flower_pot/train/flower_pot_0072.off flower_pot/train/flower_pot_0073.off flower_pot/train/flower_pot_0074.off flower_pot/train/flower_pot_0075.off flower_pot/train/flower_pot_0076.off flower_pot/train/flower_pot_0077.off flower_pot/train/flower_pot_0078.off flower_pot/train/flower_pot_0079.off flower_pot/train/flower_pot_0080.off flower_pot/train/flower_pot_0081.off flower_pot/train/flower_pot_0082.off flower_pot/train/flower_pot_0083.off flower_pot/train/flower_pot_0084.off flower_pot/train/flower_pot_0085.off flower_pot/train/flower_pot_0086.off flower_pot/train/flower_pot_0087.off flower_pot/train/flower_pot_0088.off flower_pot/train/flower_pot_0089.off flower_pot/train/flower_pot_0090.off flower_pot/train/flower_pot_0091.off flower_pot/train/flower_pot_0092.off flower_pot/train/flower_pot_0093.off flower_pot/train/flower_pot_0094.off flower_pot/train/flower_pot_0095.off flower_pot/train/flower_pot_0096.off flower_pot/train/flower_pot_0097.off flower_pot/train/flower_pot_0098.off flower_pot/train/flower_pot_0099.off flower_pot/train/flower_pot_0100.off flower_pot/train/flower_pot_0101.off flower_pot/train/flower_pot_0102.off flower_pot/train/flower_pot_0103.off flower_pot/train/flower_pot_0104.off flower_pot/train/flower_pot_0105.off flower_pot/train/flower_pot_0106.off flower_pot/train/flower_pot_0107.off flower_pot/train/flower_pot_0108.off flower_pot/train/flower_pot_0109.off flower_pot/train/flower_pot_0110.off flower_pot/train/flower_pot_0111.off flower_pot/train/flower_pot_0112.off flower_pot/train/flower_pot_0113.off flower_pot/train/flower_pot_0114.off flower_pot/train/flower_pot_0115.off flower_pot/train/flower_pot_0116.off flower_pot/train/flower_pot_0117.off flower_pot/train/flower_pot_0118.off flower_pot/train/flower_pot_0119.off flower_pot/train/flower_pot_0120.off flower_pot/train/flower_pot_0121.off flower_pot/train/flower_pot_0122.off flower_pot/train/flower_pot_0123.off flower_pot/train/flower_pot_0124.off flower_pot/train/flower_pot_0125.off flower_pot/train/flower_pot_0126.off flower_pot/train/flower_pot_0127.off flower_pot/train/flower_pot_0128.off flower_pot/train/flower_pot_0129.off flower_pot/train/flower_pot_0130.off flower_pot/train/flower_pot_0131.off flower_pot/train/flower_pot_0132.off flower_pot/train/flower_pot_0133.off flower_pot/train/flower_pot_0134.off flower_pot/train/flower_pot_0135.off ================================================ FILE: dataloader/split/train_scan2cad.txt ================================================ full_annotations_clean_train.json ================================================ FILE: dataloader/split/val_3dmatch.txt ================================================ sun3d-brown_bm_4-brown_bm_4 sun3d-harvard_c11-hv_c11_2 7-scenes-heads rgbd-scenes-v2-scene_10 bundlefusion-office0 analysis-by-synthesis-apt2-kitchen ================================================ FILE: dataloader/split/val_kitti.txt ================================================ 6 7 ================================================ FILE: dataloader/split/val_modelnet40.txt ================================================ glass_box/train/glass_box_0155.off glass_box/train/glass_box_0156.off glass_box/train/glass_box_0157.off glass_box/train/glass_box_0158.off glass_box/train/glass_box_0159.off glass_box/train/glass_box_0160.off glass_box/train/glass_box_0161.off glass_box/train/glass_box_0162.off glass_box/train/glass_box_0163.off glass_box/train/glass_box_0164.off glass_box/train/glass_box_0165.off glass_box/train/glass_box_0166.off glass_box/train/glass_box_0167.off glass_box/train/glass_box_0168.off glass_box/train/glass_box_0169.off glass_box/train/glass_box_0170.off glass_box/train/glass_box_0171.off laptop/train/laptop_0136.off laptop/train/laptop_0137.off laptop/train/laptop_0138.off laptop/train/laptop_0139.off laptop/train/laptop_0140.off laptop/train/laptop_0141.off laptop/train/laptop_0142.off laptop/train/laptop_0143.off laptop/train/laptop_0144.off laptop/train/laptop_0145.off laptop/train/laptop_0146.off laptop/train/laptop_0147.off laptop/train/laptop_0148.off laptop/train/laptop_0149.off sink/train/sink_0117.off sink/train/sink_0118.off sink/train/sink_0119.off sink/train/sink_0120.off sink/train/sink_0121.off sink/train/sink_0122.off sink/train/sink_0123.off sink/train/sink_0124.off sink/train/sink_0125.off sink/train/sink_0126.off sink/train/sink_0127.off sink/train/sink_0128.off night_stand/train/night_stand_0181.off night_stand/train/night_stand_0182.off night_stand/train/night_stand_0183.off night_stand/train/night_stand_0184.off night_stand/train/night_stand_0185.off night_stand/train/night_stand_0186.off night_stand/train/night_stand_0187.off night_stand/train/night_stand_0188.off night_stand/train/night_stand_0189.off night_stand/train/night_stand_0190.off night_stand/train/night_stand_0191.off night_stand/train/night_stand_0192.off night_stand/train/night_stand_0193.off night_stand/train/night_stand_0194.off night_stand/train/night_stand_0195.off night_stand/train/night_stand_0196.off night_stand/train/night_stand_0197.off night_stand/train/night_stand_0198.off night_stand/train/night_stand_0199.off night_stand/train/night_stand_0200.off car/train/car_0179.off car/train/car_0180.off car/train/car_0181.off car/train/car_0182.off car/train/car_0183.off car/train/car_0184.off car/train/car_0185.off car/train/car_0186.off car/train/car_0187.off car/train/car_0188.off car/train/car_0189.off car/train/car_0190.off car/train/car_0191.off car/train/car_0192.off car/train/car_0193.off car/train/car_0194.off car/train/car_0195.off car/train/car_0196.off car/train/car_0197.off dresser/train/dresser_0181.off dresser/train/dresser_0182.off dresser/train/dresser_0183.off dresser/train/dresser_0184.off dresser/train/dresser_0185.off dresser/train/dresser_0186.off dresser/train/dresser_0187.off dresser/train/dresser_0188.off dresser/train/dresser_0189.off dresser/train/dresser_0190.off dresser/train/dresser_0191.off dresser/train/dresser_0192.off dresser/train/dresser_0193.off dresser/train/dresser_0194.off dresser/train/dresser_0195.off dresser/train/dresser_0196.off dresser/train/dresser_0197.off dresser/train/dresser_0198.off dresser/train/dresser_0199.off dresser/train/dresser_0200.off toilet/train/toilet_0311.off toilet/train/toilet_0312.off toilet/train/toilet_0313.off toilet/train/toilet_0314.off toilet/train/toilet_0315.off toilet/train/toilet_0316.off toilet/train/toilet_0317.off toilet/train/toilet_0318.off toilet/train/toilet_0319.off toilet/train/toilet_0320.off toilet/train/toilet_0321.off toilet/train/toilet_0322.off toilet/train/toilet_0323.off toilet/train/toilet_0324.off toilet/train/toilet_0325.off toilet/train/toilet_0326.off toilet/train/toilet_0327.off toilet/train/toilet_0328.off toilet/train/toilet_0329.off toilet/train/toilet_0330.off toilet/train/toilet_0331.off toilet/train/toilet_0332.off toilet/train/toilet_0333.off toilet/train/toilet_0334.off toilet/train/toilet_0335.off toilet/train/toilet_0336.off toilet/train/toilet_0337.off toilet/train/toilet_0338.off toilet/train/toilet_0339.off toilet/train/toilet_0340.off toilet/train/toilet_0341.off toilet/train/toilet_0342.off toilet/train/toilet_0343.off toilet/train/toilet_0344.off curtain/train/curtain_0126.off curtain/train/curtain_0127.off curtain/train/curtain_0128.off curtain/train/curtain_0129.off curtain/train/curtain_0130.off curtain/train/curtain_0131.off curtain/train/curtain_0132.off curtain/train/curtain_0133.off curtain/train/curtain_0134.off curtain/train/curtain_0135.off curtain/train/curtain_0136.off curtain/train/curtain_0137.off curtain/train/curtain_0138.off wardrobe/train/wardrobe_0080.off wardrobe/train/wardrobe_0081.off wardrobe/train/wardrobe_0082.off wardrobe/train/wardrobe_0083.off wardrobe/train/wardrobe_0084.off wardrobe/train/wardrobe_0085.off wardrobe/train/wardrobe_0086.off wardrobe/train/wardrobe_0087.off stool/train/stool_0082.off stool/train/stool_0083.off stool/train/stool_0084.off stool/train/stool_0085.off stool/train/stool_0086.off stool/train/stool_0087.off stool/train/stool_0088.off stool/train/stool_0089.off stool/train/stool_0090.off mantel/train/mantel_0257.off mantel/train/mantel_0258.off mantel/train/mantel_0259.off mantel/train/mantel_0260.off mantel/train/mantel_0261.off mantel/train/mantel_0262.off mantel/train/mantel_0263.off mantel/train/mantel_0264.off mantel/train/mantel_0265.off mantel/train/mantel_0266.off mantel/train/mantel_0267.off mantel/train/mantel_0268.off mantel/train/mantel_0269.off mantel/train/mantel_0270.off mantel/train/mantel_0271.off mantel/train/mantel_0272.off mantel/train/mantel_0273.off mantel/train/mantel_0274.off mantel/train/mantel_0275.off mantel/train/mantel_0276.off mantel/train/mantel_0277.off mantel/train/mantel_0278.off mantel/train/mantel_0279.off mantel/train/mantel_0280.off mantel/train/mantel_0281.off mantel/train/mantel_0282.off mantel/train/mantel_0283.off mantel/train/mantel_0284.off cup/train/cup_0073.off cup/train/cup_0074.off cup/train/cup_0075.off cup/train/cup_0076.off cup/train/cup_0077.off cup/train/cup_0078.off cup/train/cup_0079.off radio/train/radio_0095.off radio/train/radio_0096.off radio/train/radio_0097.off radio/train/radio_0098.off radio/train/radio_0099.off radio/train/radio_0100.off radio/train/radio_0101.off radio/train/radio_0102.off radio/train/radio_0103.off radio/train/radio_0104.off airplane/train/airplane_0565.off airplane/train/airplane_0566.off airplane/train/airplane_0567.off airplane/train/airplane_0568.off airplane/train/airplane_0569.off airplane/train/airplane_0570.off airplane/train/airplane_0571.off airplane/train/airplane_0572.off airplane/train/airplane_0573.off airplane/train/airplane_0574.off airplane/train/airplane_0575.off airplane/train/airplane_0576.off airplane/train/airplane_0577.off airplane/train/airplane_0578.off airplane/train/airplane_0579.off airplane/train/airplane_0580.off airplane/train/airplane_0581.off airplane/train/airplane_0582.off airplane/train/airplane_0583.off airplane/train/airplane_0584.off airplane/train/airplane_0585.off airplane/train/airplane_0586.off airplane/train/airplane_0587.off airplane/train/airplane_0588.off airplane/train/airplane_0589.off airplane/train/airplane_0590.off airplane/train/airplane_0591.off airplane/train/airplane_0592.off airplane/train/airplane_0593.off airplane/train/airplane_0594.off airplane/train/airplane_0595.off airplane/train/airplane_0596.off airplane/train/airplane_0597.off airplane/train/airplane_0598.off airplane/train/airplane_0599.off airplane/train/airplane_0600.off airplane/train/airplane_0601.off airplane/train/airplane_0602.off airplane/train/airplane_0603.off airplane/train/airplane_0604.off airplane/train/airplane_0605.off airplane/train/airplane_0606.off airplane/train/airplane_0607.off airplane/train/airplane_0608.off airplane/train/airplane_0609.off airplane/train/airplane_0610.off airplane/train/airplane_0611.off airplane/train/airplane_0612.off airplane/train/airplane_0613.off airplane/train/airplane_0614.off airplane/train/airplane_0615.off airplane/train/airplane_0616.off airplane/train/airplane_0617.off airplane/train/airplane_0618.off airplane/train/airplane_0619.off airplane/train/airplane_0620.off airplane/train/airplane_0621.off airplane/train/airplane_0622.off airplane/train/airplane_0623.off airplane/train/airplane_0624.off airplane/train/airplane_0625.off airplane/train/airplane_0626.off table/train/table_0354.off table/train/table_0355.off table/train/table_0356.off table/train/table_0357.off table/train/table_0358.off table/train/table_0359.off table/train/table_0360.off table/train/table_0361.off table/train/table_0362.off table/train/table_0363.off table/train/table_0364.off table/train/table_0365.off table/train/table_0366.off table/train/table_0367.off table/train/table_0368.off table/train/table_0369.off table/train/table_0370.off table/train/table_0371.off table/train/table_0372.off table/train/table_0373.off table/train/table_0374.off table/train/table_0375.off table/train/table_0376.off table/train/table_0377.off table/train/table_0378.off table/train/table_0379.off table/train/table_0380.off table/train/table_0381.off table/train/table_0382.off table/train/table_0383.off table/train/table_0384.off table/train/table_0385.off table/train/table_0386.off table/train/table_0387.off table/train/table_0388.off table/train/table_0389.off table/train/table_0390.off table/train/table_0391.off table/train/table_0392.off bench/train/bench_0157.off bench/train/bench_0158.off bench/train/bench_0159.off bench/train/bench_0160.off bench/train/bench_0161.off bench/train/bench_0162.off bench/train/bench_0163.off bench/train/bench_0164.off bench/train/bench_0165.off bench/train/bench_0166.off bench/train/bench_0167.off bench/train/bench_0168.off bench/train/bench_0169.off bench/train/bench_0170.off bench/train/bench_0171.off bench/train/bench_0172.off bench/train/bench_0173.off plant/train/plant_0217.off plant/train/plant_0218.off plant/train/plant_0219.off plant/train/plant_0220.off plant/train/plant_0221.off plant/train/plant_0222.off plant/train/plant_0223.off plant/train/plant_0224.off plant/train/plant_0225.off plant/train/plant_0226.off plant/train/plant_0227.off plant/train/plant_0228.off plant/train/plant_0229.off plant/train/plant_0230.off plant/train/plant_0231.off plant/train/plant_0232.off plant/train/plant_0233.off plant/train/plant_0234.off plant/train/plant_0235.off plant/train/plant_0236.off plant/train/plant_0237.off plant/train/plant_0238.off plant/train/plant_0239.off plant/train/plant_0240.off chair/train/chair_0802.off chair/train/chair_0803.off chair/train/chair_0804.off chair/train/chair_0805.off chair/train/chair_0806.off chair/train/chair_0807.off chair/train/chair_0808.off chair/train/chair_0809.off chair/train/chair_0810.off chair/train/chair_0811.off chair/train/chair_0812.off chair/train/chair_0813.off chair/train/chair_0814.off chair/train/chair_0815.off chair/train/chair_0816.off chair/train/chair_0817.off chair/train/chair_0818.off chair/train/chair_0819.off chair/train/chair_0820.off chair/train/chair_0821.off chair/train/chair_0822.off chair/train/chair_0823.off chair/train/chair_0824.off chair/train/chair_0825.off chair/train/chair_0826.off chair/train/chair_0827.off chair/train/chair_0828.off chair/train/chair_0829.off chair/train/chair_0830.off chair/train/chair_0831.off chair/train/chair_0832.off chair/train/chair_0833.off chair/train/chair_0834.off chair/train/chair_0835.off chair/train/chair_0836.off chair/train/chair_0837.off chair/train/chair_0838.off chair/train/chair_0839.off chair/train/chair_0840.off chair/train/chair_0841.off chair/train/chair_0842.off chair/train/chair_0843.off chair/train/chair_0844.off chair/train/chair_0845.off chair/train/chair_0846.off chair/train/chair_0847.off chair/train/chair_0848.off chair/train/chair_0849.off chair/train/chair_0850.off chair/train/chair_0851.off chair/train/chair_0852.off chair/train/chair_0853.off chair/train/chair_0854.off chair/train/chair_0855.off chair/train/chair_0856.off chair/train/chair_0857.off chair/train/chair_0858.off chair/train/chair_0859.off chair/train/chair_0860.off chair/train/chair_0861.off chair/train/chair_0862.off chair/train/chair_0863.off chair/train/chair_0864.off chair/train/chair_0865.off chair/train/chair_0866.off chair/train/chair_0867.off chair/train/chair_0868.off chair/train/chair_0869.off chair/train/chair_0870.off chair/train/chair_0871.off chair/train/chair_0872.off chair/train/chair_0873.off chair/train/chair_0874.off chair/train/chair_0875.off chair/train/chair_0876.off chair/train/chair_0877.off chair/train/chair_0878.off chair/train/chair_0879.off chair/train/chair_0880.off chair/train/chair_0881.off chair/train/chair_0882.off chair/train/chair_0883.off chair/train/chair_0884.off chair/train/chair_0885.off chair/train/chair_0886.off chair/train/chair_0887.off chair/train/chair_0888.off chair/train/chair_0889.off vase/train/vase_0429.off vase/train/vase_0430.off vase/train/vase_0431.off vase/train/vase_0432.off vase/train/vase_0433.off vase/train/vase_0434.off vase/train/vase_0435.off vase/train/vase_0436.off vase/train/vase_0437.off vase/train/vase_0438.off vase/train/vase_0439.off vase/train/vase_0440.off vase/train/vase_0441.off vase/train/vase_0442.off vase/train/vase_0443.off vase/train/vase_0444.off vase/train/vase_0445.off vase/train/vase_0446.off vase/train/vase_0447.off vase/train/vase_0448.off vase/train/vase_0449.off vase/train/vase_0450.off vase/train/vase_0451.off vase/train/vase_0452.off vase/train/vase_0453.off vase/train/vase_0454.off vase/train/vase_0455.off vase/train/vase_0456.off vase/train/vase_0457.off vase/train/vase_0458.off vase/train/vase_0459.off vase/train/vase_0460.off vase/train/vase_0461.off vase/train/vase_0462.off vase/train/vase_0463.off vase/train/vase_0464.off vase/train/vase_0465.off vase/train/vase_0466.off vase/train/vase_0467.off vase/train/vase_0468.off vase/train/vase_0469.off vase/train/vase_0470.off vase/train/vase_0471.off vase/train/vase_0472.off vase/train/vase_0473.off vase/train/vase_0474.off vase/train/vase_0475.off bookshelf/train/bookshelf_0516.off bookshelf/train/bookshelf_0517.off bookshelf/train/bookshelf_0518.off bookshelf/train/bookshelf_0519.off bookshelf/train/bookshelf_0520.off bookshelf/train/bookshelf_0521.off bookshelf/train/bookshelf_0522.off bookshelf/train/bookshelf_0523.off bookshelf/train/bookshelf_0524.off bookshelf/train/bookshelf_0525.off bookshelf/train/bookshelf_0526.off bookshelf/train/bookshelf_0527.off bookshelf/train/bookshelf_0528.off bookshelf/train/bookshelf_0529.off bookshelf/train/bookshelf_0530.off bookshelf/train/bookshelf_0531.off bookshelf/train/bookshelf_0532.off bookshelf/train/bookshelf_0533.off bookshelf/train/bookshelf_0534.off bookshelf/train/bookshelf_0535.off bookshelf/train/bookshelf_0536.off bookshelf/train/bookshelf_0537.off bookshelf/train/bookshelf_0538.off bookshelf/train/bookshelf_0539.off bookshelf/train/bookshelf_0540.off bookshelf/train/bookshelf_0541.off bookshelf/train/bookshelf_0542.off bookshelf/train/bookshelf_0543.off bookshelf/train/bookshelf_0544.off bookshelf/train/bookshelf_0545.off bookshelf/train/bookshelf_0546.off bookshelf/train/bookshelf_0547.off bookshelf/train/bookshelf_0548.off bookshelf/train/bookshelf_0549.off bookshelf/train/bookshelf_0550.off bookshelf/train/bookshelf_0551.off bookshelf/train/bookshelf_0552.off bookshelf/train/bookshelf_0553.off bookshelf/train/bookshelf_0554.off bookshelf/train/bookshelf_0555.off bookshelf/train/bookshelf_0556.off bookshelf/train/bookshelf_0557.off bookshelf/train/bookshelf_0558.off bookshelf/train/bookshelf_0559.off bookshelf/train/bookshelf_0560.off bookshelf/train/bookshelf_0561.off bookshelf/train/bookshelf_0562.off bookshelf/train/bookshelf_0563.off bookshelf/train/bookshelf_0564.off bookshelf/train/bookshelf_0565.off bookshelf/train/bookshelf_0566.off bookshelf/train/bookshelf_0567.off bookshelf/train/bookshelf_0568.off bookshelf/train/bookshelf_0569.off bookshelf/train/bookshelf_0570.off bookshelf/train/bookshelf_0571.off bookshelf/train/bookshelf_0572.off guitar/train/guitar_0141.off guitar/train/guitar_0142.off guitar/train/guitar_0143.off guitar/train/guitar_0144.off guitar/train/guitar_0145.off guitar/train/guitar_0146.off guitar/train/guitar_0147.off guitar/train/guitar_0148.off guitar/train/guitar_0149.off guitar/train/guitar_0150.off guitar/train/guitar_0151.off guitar/train/guitar_0152.off guitar/train/guitar_0153.off guitar/train/guitar_0154.off guitar/train/guitar_0155.off tv_stand/train/tv_stand_0242.off tv_stand/train/tv_stand_0243.off tv_stand/train/tv_stand_0244.off tv_stand/train/tv_stand_0245.off tv_stand/train/tv_stand_0246.off tv_stand/train/tv_stand_0247.off tv_stand/train/tv_stand_0248.off tv_stand/train/tv_stand_0249.off tv_stand/train/tv_stand_0250.off tv_stand/train/tv_stand_0251.off tv_stand/train/tv_stand_0252.off tv_stand/train/tv_stand_0253.off tv_stand/train/tv_stand_0254.off tv_stand/train/tv_stand_0255.off tv_stand/train/tv_stand_0256.off tv_stand/train/tv_stand_0257.off tv_stand/train/tv_stand_0258.off tv_stand/train/tv_stand_0259.off tv_stand/train/tv_stand_0260.off tv_stand/train/tv_stand_0261.off tv_stand/train/tv_stand_0262.off tv_stand/train/tv_stand_0263.off tv_stand/train/tv_stand_0264.off tv_stand/train/tv_stand_0265.off tv_stand/train/tv_stand_0266.off tv_stand/train/tv_stand_0267.off bathtub/train/bathtub_0097.off bathtub/train/bathtub_0098.off bathtub/train/bathtub_0099.off bathtub/train/bathtub_0100.off bathtub/train/bathtub_0101.off bathtub/train/bathtub_0102.off bathtub/train/bathtub_0103.off bathtub/train/bathtub_0104.off bathtub/train/bathtub_0105.off bathtub/train/bathtub_0106.off monitor/train/monitor_0420.off monitor/train/monitor_0421.off monitor/train/monitor_0422.off monitor/train/monitor_0423.off monitor/train/monitor_0424.off monitor/train/monitor_0425.off monitor/train/monitor_0426.off monitor/train/monitor_0427.off monitor/train/monitor_0428.off monitor/train/monitor_0429.off monitor/train/monitor_0430.off monitor/train/monitor_0431.off monitor/train/monitor_0432.off monitor/train/monitor_0433.off monitor/train/monitor_0434.off monitor/train/monitor_0435.off monitor/train/monitor_0436.off monitor/train/monitor_0437.off monitor/train/monitor_0438.off monitor/train/monitor_0439.off monitor/train/monitor_0440.off monitor/train/monitor_0441.off monitor/train/monitor_0442.off monitor/train/monitor_0443.off monitor/train/monitor_0444.off monitor/train/monitor_0445.off monitor/train/monitor_0446.off monitor/train/monitor_0447.off monitor/train/monitor_0448.off monitor/train/monitor_0449.off monitor/train/monitor_0450.off monitor/train/monitor_0451.off monitor/train/monitor_0452.off monitor/train/monitor_0453.off monitor/train/monitor_0454.off monitor/train/monitor_0455.off monitor/train/monitor_0456.off monitor/train/monitor_0457.off monitor/train/monitor_0458.off monitor/train/monitor_0459.off monitor/train/monitor_0460.off monitor/train/monitor_0461.off monitor/train/monitor_0462.off monitor/train/monitor_0463.off monitor/train/monitor_0464.off monitor/train/monitor_0465.off bottle/train/bottle_0303.off bottle/train/bottle_0304.off bottle/train/bottle_0305.off bottle/train/bottle_0306.off bottle/train/bottle_0307.off bottle/train/bottle_0308.off bottle/train/bottle_0309.off bottle/train/bottle_0310.off bottle/train/bottle_0311.off bottle/train/bottle_0312.off bottle/train/bottle_0313.off bottle/train/bottle_0314.off bottle/train/bottle_0315.off bottle/train/bottle_0316.off bottle/train/bottle_0317.off bottle/train/bottle_0318.off bottle/train/bottle_0319.off bottle/train/bottle_0320.off bottle/train/bottle_0321.off bottle/train/bottle_0322.off bottle/train/bottle_0323.off bottle/train/bottle_0324.off bottle/train/bottle_0325.off bottle/train/bottle_0326.off bottle/train/bottle_0327.off bottle/train/bottle_0328.off bottle/train/bottle_0329.off bottle/train/bottle_0330.off bottle/train/bottle_0331.off bottle/train/bottle_0332.off bottle/train/bottle_0333.off bottle/train/bottle_0334.off bottle/train/bottle_0335.off bowl/train/bowl_0059.off bowl/train/bowl_0060.off bowl/train/bowl_0061.off bowl/train/bowl_0062.off bowl/train/bowl_0063.off bowl/train/bowl_0064.off keyboard/train/keyboard_0132.off keyboard/train/keyboard_0133.off keyboard/train/keyboard_0134.off keyboard/train/keyboard_0135.off keyboard/train/keyboard_0136.off keyboard/train/keyboard_0137.off keyboard/train/keyboard_0138.off keyboard/train/keyboard_0139.off keyboard/train/keyboard_0140.off keyboard/train/keyboard_0141.off keyboard/train/keyboard_0142.off keyboard/train/keyboard_0143.off keyboard/train/keyboard_0144.off keyboard/train/keyboard_0145.off desk/train/desk_0181.off desk/train/desk_0182.off desk/train/desk_0183.off desk/train/desk_0184.off desk/train/desk_0185.off desk/train/desk_0186.off desk/train/desk_0187.off desk/train/desk_0188.off desk/train/desk_0189.off desk/train/desk_0190.off desk/train/desk_0191.off desk/train/desk_0192.off desk/train/desk_0193.off desk/train/desk_0194.off desk/train/desk_0195.off desk/train/desk_0196.off desk/train/desk_0197.off desk/train/desk_0198.off desk/train/desk_0199.off desk/train/desk_0200.off bed/train/bed_0465.off bed/train/bed_0466.off bed/train/bed_0467.off bed/train/bed_0468.off bed/train/bed_0469.off bed/train/bed_0470.off bed/train/bed_0471.off bed/train/bed_0472.off bed/train/bed_0473.off bed/train/bed_0474.off bed/train/bed_0475.off bed/train/bed_0476.off bed/train/bed_0477.off bed/train/bed_0478.off bed/train/bed_0479.off bed/train/bed_0480.off bed/train/bed_0481.off bed/train/bed_0482.off bed/train/bed_0483.off bed/train/bed_0484.off bed/train/bed_0485.off bed/train/bed_0486.off bed/train/bed_0487.off bed/train/bed_0488.off bed/train/bed_0489.off bed/train/bed_0490.off bed/train/bed_0491.off bed/train/bed_0492.off bed/train/bed_0493.off bed/train/bed_0494.off bed/train/bed_0495.off bed/train/bed_0496.off bed/train/bed_0497.off bed/train/bed_0498.off bed/train/bed_0499.off bed/train/bed_0500.off bed/train/bed_0501.off bed/train/bed_0502.off bed/train/bed_0503.off bed/train/bed_0504.off bed/train/bed_0505.off bed/train/bed_0506.off bed/train/bed_0507.off bed/train/bed_0508.off bed/train/bed_0509.off bed/train/bed_0510.off bed/train/bed_0511.off bed/train/bed_0512.off bed/train/bed_0513.off bed/train/bed_0514.off bed/train/bed_0515.off tent/train/tent_0148.off tent/train/tent_0149.off tent/train/tent_0150.off tent/train/tent_0151.off tent/train/tent_0152.off tent/train/tent_0153.off tent/train/tent_0154.off tent/train/tent_0155.off tent/train/tent_0156.off tent/train/tent_0157.off tent/train/tent_0158.off tent/train/tent_0159.off tent/train/tent_0160.off tent/train/tent_0161.off tent/train/tent_0162.off tent/train/tent_0163.off piano/train/piano_0209.off piano/train/piano_0210.off piano/train/piano_0211.off piano/train/piano_0212.off piano/train/piano_0213.off piano/train/piano_0214.off piano/train/piano_0215.off piano/train/piano_0216.off piano/train/piano_0217.off piano/train/piano_0218.off piano/train/piano_0219.off piano/train/piano_0220.off piano/train/piano_0221.off piano/train/piano_0222.off piano/train/piano_0223.off piano/train/piano_0224.off piano/train/piano_0225.off piano/train/piano_0226.off piano/train/piano_0227.off piano/train/piano_0228.off piano/train/piano_0229.off piano/train/piano_0230.off piano/train/piano_0231.off sofa/train/sofa_0613.off sofa/train/sofa_0614.off sofa/train/sofa_0615.off sofa/train/sofa_0616.off sofa/train/sofa_0617.off sofa/train/sofa_0618.off sofa/train/sofa_0619.off sofa/train/sofa_0620.off sofa/train/sofa_0621.off sofa/train/sofa_0622.off sofa/train/sofa_0623.off sofa/train/sofa_0624.off sofa/train/sofa_0625.off sofa/train/sofa_0626.off sofa/train/sofa_0627.off sofa/train/sofa_0628.off sofa/train/sofa_0629.off sofa/train/sofa_0630.off sofa/train/sofa_0631.off sofa/train/sofa_0632.off sofa/train/sofa_0633.off sofa/train/sofa_0634.off sofa/train/sofa_0635.off sofa/train/sofa_0636.off sofa/train/sofa_0637.off sofa/train/sofa_0638.off sofa/train/sofa_0639.off sofa/train/sofa_0640.off sofa/train/sofa_0641.off sofa/train/sofa_0642.off sofa/train/sofa_0643.off sofa/train/sofa_0644.off sofa/train/sofa_0645.off sofa/train/sofa_0646.off sofa/train/sofa_0647.off sofa/train/sofa_0648.off sofa/train/sofa_0649.off sofa/train/sofa_0650.off sofa/train/sofa_0651.off sofa/train/sofa_0652.off sofa/train/sofa_0653.off sofa/train/sofa_0654.off sofa/train/sofa_0655.off sofa/train/sofa_0656.off sofa/train/sofa_0657.off sofa/train/sofa_0658.off sofa/train/sofa_0659.off sofa/train/sofa_0660.off sofa/train/sofa_0661.off sofa/train/sofa_0662.off sofa/train/sofa_0663.off sofa/train/sofa_0664.off sofa/train/sofa_0665.off sofa/train/sofa_0666.off sofa/train/sofa_0667.off sofa/train/sofa_0668.off sofa/train/sofa_0669.off sofa/train/sofa_0670.off sofa/train/sofa_0671.off sofa/train/sofa_0672.off sofa/train/sofa_0673.off sofa/train/sofa_0674.off sofa/train/sofa_0675.off sofa/train/sofa_0676.off sofa/train/sofa_0677.off sofa/train/sofa_0678.off sofa/train/sofa_0679.off sofa/train/sofa_0680.off person/train/person_0081.off person/train/person_0082.off person/train/person_0083.off person/train/person_0084.off person/train/person_0085.off person/train/person_0086.off person/train/person_0087.off person/train/person_0088.off xbox/train/xbox_0094.off xbox/train/xbox_0095.off xbox/train/xbox_0096.off xbox/train/xbox_0097.off xbox/train/xbox_0098.off xbox/train/xbox_0099.off xbox/train/xbox_0100.off xbox/train/xbox_0101.off xbox/train/xbox_0102.off xbox/train/xbox_0103.off stairs/train/stairs_0113.off stairs/train/stairs_0114.off stairs/train/stairs_0115.off stairs/train/stairs_0116.off stairs/train/stairs_0117.off stairs/train/stairs_0118.off stairs/train/stairs_0119.off stairs/train/stairs_0120.off stairs/train/stairs_0121.off stairs/train/stairs_0122.off stairs/train/stairs_0123.off stairs/train/stairs_0124.off cone/train/cone_0152.off cone/train/cone_0153.off cone/train/cone_0154.off cone/train/cone_0155.off cone/train/cone_0156.off cone/train/cone_0157.off cone/train/cone_0158.off cone/train/cone_0159.off cone/train/cone_0160.off cone/train/cone_0161.off cone/train/cone_0162.off cone/train/cone_0163.off cone/train/cone_0164.off cone/train/cone_0165.off cone/train/cone_0166.off cone/train/cone_0167.off lamp/train/lamp_0113.off lamp/train/lamp_0114.off lamp/train/lamp_0115.off lamp/train/lamp_0116.off lamp/train/lamp_0117.off lamp/train/lamp_0118.off lamp/train/lamp_0119.off lamp/train/lamp_0120.off lamp/train/lamp_0121.off lamp/train/lamp_0122.off lamp/train/lamp_0123.off lamp/train/lamp_0124.off door/train/door_0100.off door/train/door_0101.off door/train/door_0102.off door/train/door_0103.off door/train/door_0104.off door/train/door_0105.off door/train/door_0106.off door/train/door_0107.off door/train/door_0108.off door/train/door_0109.off range_hood/train/range_hood_0105.off range_hood/train/range_hood_0106.off range_hood/train/range_hood_0107.off range_hood/train/range_hood_0108.off range_hood/train/range_hood_0109.off range_hood/train/range_hood_0110.off range_hood/train/range_hood_0111.off range_hood/train/range_hood_0112.off range_hood/train/range_hood_0113.off range_hood/train/range_hood_0114.off range_hood/train/range_hood_0115.off flower_pot/train/flower_pot_0136.off flower_pot/train/flower_pot_0137.off flower_pot/train/flower_pot_0138.off flower_pot/train/flower_pot_0139.off flower_pot/train/flower_pot_0140.off flower_pot/train/flower_pot_0141.off flower_pot/train/flower_pot_0142.off flower_pot/train/flower_pot_0143.off flower_pot/train/flower_pot_0144.off flower_pot/train/flower_pot_0145.off flower_pot/train/flower_pot_0146.off flower_pot/train/flower_pot_0147.off flower_pot/train/flower_pot_0148.off flower_pot/train/flower_pot_0149.off ================================================ FILE: dataloader/split/val_scan2cad.txt ================================================ full_annotations_clean_val.json ================================================ FILE: dataloader/threedmatch_loader.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import glob from dataloader.base_loader import * from dataloader.transforms import * from util.pointcloud import get_matching_indices, make_open3d_point_cloud from util.file import read_trajectory class IndoorPairDataset(PairDataset): ''' Train dataset ''' OVERLAP_RATIO = None AUGMENT = None def __init__(self, phase, transform=None, random_rotation=True, random_scale=True, manual_seed=False, config=None): PairDataset.__init__(self, phase, transform, random_rotation, random_scale, manual_seed, config) self.root = root = config.threed_match_dir self.use_xyz_feature = config.use_xyz_feature logging.info(f"Loading the subset {phase} from {root}") subset_names = open(self.DATA_FILES[phase]).read().split() for name in subset_names: fname = name + "*%.2f.txt" % self.OVERLAP_RATIO fnames_txt = glob.glob(root + "/" + fname) assert len(fnames_txt) > 0, f"Make sure that the path {root} has data {fname}" for fname_txt in fnames_txt: with open(fname_txt) as f: content = f.readlines() fnames = [x.strip().split() for x in content] for fname in fnames: self.files.append([fname[0], fname[1]]) def __getitem__(self, idx): file0 = os.path.join(self.root, self.files[idx][0]) file1 = os.path.join(self.root, self.files[idx][1]) data0 = np.load(file0) data1 = np.load(file1) xyz0 = data0["pcd"] xyz1 = data1["pcd"] matching_search_voxel_size = self.matching_search_voxel_size if self.random_scale and random.random() < 0.95: scale = self.min_scale + \ (self.max_scale - self.min_scale) * random.random() matching_search_voxel_size *= scale xyz0 = scale * xyz0 xyz1 = scale * xyz1 if self.random_rotation: T0 = sample_random_trans(xyz0, self.randg, self.rotation_range) T1 = sample_random_trans(xyz1, self.randg, self.rotation_range) trans = T1 @ np.linalg.inv(T0) xyz0 = self.apply_transform(xyz0, T0) xyz1 = self.apply_transform(xyz1, T1) else: trans = np.identity(4) # Voxelization xyz0_th = torch.from_numpy(xyz0) xyz1_th = torch.from_numpy(xyz1) sel0 = ME.utils.sparse_quantize(xyz0_th / self.voxel_size, return_index=True) sel1 = ME.utils.sparse_quantize(xyz1_th / self.voxel_size, return_index=True) # Make point clouds using voxelized points pcd0 = make_open3d_point_cloud(xyz0[sel0]) pcd1 = make_open3d_point_cloud(xyz1[sel1]) # Select features and points using the returned voxelized indices # 3DMatch color is not helpful # pcd0.colors = o3d.utility.Vector3dVector(color0[sel0]) # pcd1.colors = o3d.utility.Vector3dVector(color1[sel1]) # Get matches matches = get_matching_indices(pcd0, pcd1, trans, matching_search_voxel_size) # Get features npts0 = len(sel0) npts1 = len(sel1) feats_train0, feats_train1 = [], [] unique_xyz0_th = xyz0_th[sel0] unique_xyz1_th = xyz1_th[sel1] # xyz as feats if self.use_xyz_feature: feats_train0.append(unique_xyz0_th - unique_xyz0_th.mean(0)) feats_train1.append(unique_xyz1_th - unique_xyz1_th.mean(0)) else: feats_train0.append(torch.ones((npts0, 1))) feats_train1.append(torch.ones((npts1, 1))) feats0 = torch.cat(feats_train0, 1) feats1 = torch.cat(feats_train1, 1) coords0 = torch.floor(unique_xyz0_th / self.voxel_size) coords1 = torch.floor(unique_xyz1_th / self.voxel_size) if self.transform: coords0, feats0 = self.transform(coords0, feats0) coords1, feats1 = self.transform(coords1, feats1) extra_package = {'idx': idx, 'file0': file0, 'file1': file1} return (unique_xyz0_th.float(), unique_xyz1_th.float(), coords0.int(), coords1.int(), feats0.float(), feats1.float(), matches, trans, extra_package) class ThreeDMatchPairDataset03(IndoorPairDataset): OVERLAP_RATIO = 0.3 DATA_FILES = { 'train': './dataloader/split/train_3dmatch.txt', 'val': './dataloader/split/val_3dmatch.txt', 'test': './dataloader/split/test_3dmatch.txt' } class ThreeDMatchPairDataset05(ThreeDMatchPairDataset03): OVERLAP_RATIO = 0.5 class ThreeDMatchPairDataset07(ThreeDMatchPairDataset03): OVERLAP_RATIO = 0.7 class ThreeDMatchTrajectoryDataset(PairDataset): ''' Test dataset ''' DATA_FILES = { 'train': './dataloader/split/train_3dmatch.txt', 'val': './dataloader/split/val_3dmatch.txt', 'test': './dataloader/split/test_3dmatch.txt' } def __init__(self, phase, transform=None, random_rotation=True, random_scale=True, manual_seed=False, scene_id=None, config=None, return_ply_names=False): PairDataset.__init__(self, phase, transform, random_rotation, random_scale, manual_seed, config) self.root = config.threed_match_dir subset_names = open(self.DATA_FILES[phase]).read().split() if scene_id is not None: subset_names = [subset_names[scene_id]] for sname in subset_names: traj_file = os.path.join(self.root, sname + '-evaluation/gt.log') assert os.path.exists(traj_file) traj = read_trajectory(traj_file) for ctraj in traj: i = ctraj.metadata[0] j = ctraj.metadata[1] T_gt = ctraj.pose self.files.append((sname, i, j, T_gt)) self.return_ply_names = return_ply_names def __getitem__(self, pair_index): sname, i, j, T_gt = self.files[pair_index] ply_name0 = os.path.join(self.root, sname, f'cloud_bin_{i}.ply') ply_name1 = os.path.join(self.root, sname, f'cloud_bin_{j}.ply') if self.return_ply_names: return sname, ply_name0, ply_name1, T_gt pcd0 = o3d.io.read_point_cloud(ply_name0) pcd1 = o3d.io.read_point_cloud(ply_name1) pcd0 = np.asarray(pcd0.points) pcd1 = np.asarray(pcd1.points) return sname, pcd0, pcd1, T_gt ================================================ FILE: dataloader/transforms.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import numpy as np import random from scipy.linalg import expm, norm # Rotation matrix along axis with angle theta def M(axis, theta): return expm(np.cross(np.eye(3), axis / norm(axis) * theta)) def sample_random_trans(pcd, randg, rotation_range=360): T = np.eye(4) R = M(randg.rand(3) - 0.5, rotation_range * np.pi / 180.0 * (randg.rand(1) - 0.5)) T[:3, :3] = R T[:3, 3] = R.dot(-np.mean(pcd, axis=0)) return T class Compose: def __init__(self, transforms): self.transforms = transforms def __call__(self, coords, feats): for transform in self.transforms: coords, feats = transform(coords, feats) return coords, feats class Jitter: def __init__(self, mu=0, sigma=0.01): self.mu = mu self.sigma = sigma def __call__(self, coords, feats): if random.random() < 0.95: feats += self.sigma * torch.randn(feats.shape[0], feats.shape[1]) if self.mu != 0: feats += self.mu return coords, feats class ChromaticShift: def __init__(self, mu=0, sigma=0.1): self.mu = mu self.sigma = sigma def __call__(self, coords, feats): if random.random() < 0.95: feats[:, :3] += torch.randn(self.mu, self.sigma, (1, 3)) return coords, feats ================================================ FILE: demo.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import os from urllib.request import urlretrieve import open3d as o3d from core.deep_global_registration import DeepGlobalRegistration from config import get_config BASE_URL = "http://node2.chrischoy.org/data/" DOWNLOAD_LIST = [ (BASE_URL + "datasets/registration/", "redkitchen_000.ply"), (BASE_URL + "datasets/registration/", "redkitchen_010.ply"), (BASE_URL + "projects/DGR/", "ResUNetBN2C-feat32-3dmatch-v0.05.pth") ] # Check if the weights and file exist and download if not os.path.isfile('redkitchen_000.ply'): print('Downloading weights and pointcloud files...') for f in DOWNLOAD_LIST: print(f"Downloading {f}") urlretrieve(f[0] + f[1], f[1]) if __name__ == '__main__': config = get_config() if config.weights is None: config.weights = DOWNLOAD_LIST[-1][-1] # preprocessing pcd0 = o3d.io.read_point_cloud(config.pcd0) pcd0.estimate_normals() pcd1 = o3d.io.read_point_cloud(config.pcd1) pcd1.estimate_normals() # registration dgr = DeepGlobalRegistration(config) T01 = dgr.register(pcd0, pcd1) o3d.visualization.draw_geometries([pcd0, pcd1]) pcd0.transform(T01) print(T01) o3d.visualization.draw_geometries([pcd0, pcd1]) ================================================ FILE: model/__init__.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import logging import model.simpleunet as simpleunets import model.resunet as resunets import model.pyramidnet as pyramids MODELS = [] def add_models(module): MODELS.extend([getattr(module, a) for a in dir(module) if 'Net' in a or 'MLP' in a]) add_models(simpleunets) add_models(resunets) add_models(pyramids) def load_model(name): '''Creates and returns an instance of the model given its class name. ''' # Find the model class from its name all_models = MODELS mdict = {model.__name__: model for model in all_models} if name not in mdict: logging.info(f'Invalid model index. You put {name}. Options are:') # Display a list of valid model names for model in all_models: logging.info('\t* {}'.format(model.__name__)) return None NetClass = mdict[name] return NetClass ================================================ FILE: model/common.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch.nn as nn import MinkowskiEngine as ME def get_norm(norm_type, num_feats, bn_momentum=0.05, dimension=-1): if norm_type == 'BN': return ME.MinkowskiBatchNorm(num_feats, momentum=bn_momentum) elif norm_type == 'IN': return ME.MinkowskiInstanceNorm(num_feats) elif norm_type == 'INBN': return nn.Sequential( ME.MinkowskiInstanceNorm(num_feats), ME.MinkowskiBatchNorm(num_feats, momentum=bn_momentum)) else: raise ValueError(f'Type {norm_type}, not defined') def get_nonlinearity(non_type): if non_type == 'ReLU': return ME.MinkowskiReLU() elif non_type == 'ELU': # return ME.MinkowskiInstanceNorm(num_feats, dimension=dimension) return ME.MinkowskiELU() else: raise ValueError(f'Type {non_type}, not defined') ================================================ FILE: model/pyramidnet.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import torch.nn as nn import MinkowskiEngine as ME from model.common import get_norm, get_nonlinearity from model.residual_block import get_block, conv, conv_tr, conv_norm_non class PyramidModule(ME.MinkowskiNetwork): NONLINEARITY = 'ELU' NORM_TYPE = 'BN' REGION_TYPE = ME.RegionType.HYPER_CUBE def __init__(self, inc, outc, inner_inc, inner_outc, inner_module=None, depth=1, bn_momentum=0.05, dimension=-1): ME.MinkowskiNetwork.__init__(self, dimension) self.depth = depth self.conv = nn.Sequential( conv_norm_non( inc, inner_inc, 3, 2, dimension, region_type=self.REGION_TYPE, norm_type=self.NORM_TYPE, nonlinearity=self.NONLINEARITY), *[ get_block( self.NORM_TYPE, inner_inc, inner_inc, bn_momentum=bn_momentum, region_type=self.REGION_TYPE, dimension=dimension) for d in range(depth) ]) self.inner_module = inner_module self.convtr = nn.Sequential( conv_tr( in_channels=inner_outc, out_channels=inner_outc, kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=self.REGION_TYPE, dimension=dimension), get_norm( self.NORM_TYPE, inner_outc, bn_momentum=bn_momentum, dimension=dimension), get_nonlinearity(self.NONLINEARITY)) self.cat_conv = conv_norm_non( inner_outc + inc, outc, 1, 1, dimension, norm_type=self.NORM_TYPE, nonlinearity=self.NONLINEARITY) def forward(self, x): y = self.conv(x) if self.inner_module: y = self.inner_module(y) y = self.convtr(y) y = ME.cat(x, y) return self.cat_conv(y) class PyramidModuleINBN(PyramidModule): NORM_TYPE = 'INBN' class PyramidNet(ME.MinkowskiNetwork): NORM_TYPE = 'BN' NONLINEARITY = 'ELU' PYRAMID_MODULE = PyramidModule CHANNELS = [32, 64, 128, 128] TR_CHANNELS = [64, 128, 128, 128] DEPTHS = [1, 1, 1, 1] # None b1, b2, b3, btr3, btr2 # 1 2 3 -3 -2 -1 REGION_TYPE = ME.RegionType.HYPER_CUBE # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) self.conv1_kernel_size = conv1_kernel_size self.normalize_feature = normalize_feature self.initialize_network(in_channels, out_channels, bn_momentum, D) def initialize_network(self, in_channels, out_channels, bn_momentum, dimension): NORM_TYPE = self.NORM_TYPE NONLINEARITY = self.NONLINEARITY CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS DEPTHS = self.DEPTHS REGION_TYPE = self.REGION_TYPE self.conv = conv_norm_non( in_channels, CHANNELS[0], kernel_size=self.conv1_kernel_size, stride=1, dimension=dimension, bn_momentum=bn_momentum, region_type=REGION_TYPE, norm_type=NORM_TYPE, nonlinearity=NONLINEARITY) pyramid = None for d in range(len(DEPTHS) - 1, 0, -1): pyramid = self.PYRAMID_MODULE( CHANNELS[d - 1], TR_CHANNELS[d - 1], CHANNELS[d], TR_CHANNELS[d], pyramid, DEPTHS[d], dimension=dimension) self.pyramid = pyramid self.final = nn.Sequential( conv_norm_non( TR_CHANNELS[0], TR_CHANNELS[0], kernel_size=3, stride=1, dimension=dimension), conv(TR_CHANNELS[0], out_channels, 1, 1, dimension=dimension)) def forward(self, x): out = self.conv(x) out = self.pyramid(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class PyramidNet6(PyramidNet): CHANNELS = [32, 64, 128, 192, 256, 256] TR_CHANNELS = [64, 128, 192, 192, 256, 256] DEPTHS = [1, 1, 1, 1, 1, 1] class PyramidNet6NoBlock(PyramidNet6): DEPTHS = [0, 0, 0, 0, 0, 0] class PyramidNet6INBN(PyramidNet6): NORM_TYPE = 'INBN' PYRAMID_MODULE = PyramidModuleINBN class PyramidNet6INBNNoBlock(PyramidNet6INBN): NORM_TYPE = 'INBN' class PyramidNet8(PyramidNet): CHANNELS = [32, 64, 128, 128, 192, 192, 256, 256] TR_CHANNELS = [64, 128, 128, 192, 192, 192, 256, 256] DEPTHS = [1, 1, 1, 1, 1, 1, 1, 1] class PyramidNet8INBN(PyramidNet8): NORM_TYPE = 'INBN' PYRAMID_MODULE = PyramidModuleINBN ================================================ FILE: model/residual_block.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch.nn as nn from model.common import get_norm, get_nonlinearity import MinkowskiEngine as ME import MinkowskiEngine.MinkowskiFunctional as MEF def conv(in_channels, out_channels, kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=0, dimension=3): if not isinstance(region_type, ME.RegionType): if region_type == 0: region_type = ME.RegionType.HYPER_CUBE elif region_type == 1: region_type = ME.RegionType.HYPER_CROSS else: raise ValueError('Unsupported region type') kernel_generator = ME.KernelGenerator( kernel_size=kernel_size, stride=stride, dilation=dilation, region_type=region_type, dimension=dimension) return ME.MinkowskiConvolution( in_channels, out_channels, kernel_size=kernel_size, stride=stride, kernel_generator=kernel_generator, dimension=dimension) def conv_tr(in_channels, out_channels, kernel_size, stride=1, dilation=1, has_bias=False, region_type=ME.RegionType.HYPER_CUBE, dimension=-1): assert dimension > 0, 'Dimension must be a positive integer' kernel_generator = ME.KernelGenerator( kernel_size, stride, dilation, is_transpose=True, region_type=region_type, dimension=dimension) kernel_generator = ME.KernelGenerator( kernel_size, stride, dilation, is_transpose=True, region_type=region_type, dimension=dimension) return ME.MinkowskiConvolutionTranspose( in_channels=in_channels, out_channels=out_channels, kernel_size=kernel_size, stride=stride, dilation=dilation, bias=has_bias, kernel_generator=kernel_generator, dimension=dimension) class BasicBlockBase(nn.Module): expansion = 1 NORM_TYPE = 'BN' def __init__(self, inplanes, planes, stride=1, dilation=1, downsample=None, bn_momentum=0.1, region_type=0, D=3): super(BasicBlockBase, self).__init__() self.conv1 = conv( inplanes, planes, kernel_size=3, stride=stride, dilation=dilation, region_type=region_type, dimension=D) self.norm1 = get_norm(self.NORM_TYPE, planes, bn_momentum=bn_momentum, dimension=D) self.conv2 = conv( planes, planes, kernel_size=3, stride=1, dilation=dilation, region_type=region_type, dimension=D) self.norm2 = get_norm(self.NORM_TYPE, planes, bn_momentum=bn_momentum, dimension=D) self.downsample = downsample def forward(self, x): residual = x out = self.conv1(x) out = self.norm1(out) out = MEF.relu(out) out = self.conv2(out) out = self.norm2(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = MEF.relu(out) return out class BasicBlockBN(BasicBlockBase): NORM_TYPE = 'BN' class BasicBlockIN(BasicBlockBase): NORM_TYPE = 'IN' class BasicBlockINBN(BasicBlockBase): NORM_TYPE = 'INBN' def get_block(norm_type, inplanes, planes, stride=1, dilation=1, downsample=None, bn_momentum=0.1, region_type=0, dimension=3): if norm_type == 'BN': Block = BasicBlockBN elif norm_type == 'IN': Block = BasicBlockIN elif norm_type == 'INBN': Block = BasicBlockINBN else: raise ValueError(f'Type {norm_type}, not defined') return Block(inplanes, planes, stride, dilation, downsample, bn_momentum, region_type, dimension) def conv_norm_non(inc, outc, kernel_size, stride, dimension, bn_momentum=0.05, region_type=ME.RegionType.HYPER_CUBE, norm_type='BN', nonlinearity='ELU'): return nn.Sequential( conv( in_channels=inc, out_channels=outc, kernel_size=kernel_size, stride=stride, dilation=1, has_bias=False, region_type=region_type, dimension=dimension), get_norm(norm_type, outc, bn_momentum=bn_momentum, dimension=dimension), get_nonlinearity(nonlinearity)) ================================================ FILE: model/resunet.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import torch.nn as nn import MinkowskiEngine as ME import MinkowskiEngine.MinkowskiFunctional as MEF from model.common import get_norm from model.residual_block import conv, conv_tr, get_block class ResUNet(ME.MinkowskiNetwork): NORM_TYPE = None BLOCK_NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128] TR_CHANNELS = [None, 32, 64, 64] REGION_TYPE = ME.RegionType.HYPER_CUBE # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS REGION_TYPE = self.REGION_TYPE self.normalize_feature = normalize_feature self.conv1 = ME.MinkowskiConvolution( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv2 = ME.MinkowskiConvolution( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv3 = ME.MinkowskiConvolution( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv3_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[3], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv2_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv1_tr = ME.MinkowskiConvolution( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out_s1 = self.block1(out_s1) out = MEF.relu(out_s1) out_s2 = self.conv2(out) out_s2 = self.norm2(out_s2) out_s2 = self.block2(out_s2) out = MEF.relu(out_s2) out_s4 = self.conv3(out) out_s4 = self.norm3(out_s4) out_s4 = self.block3(out_s4) out = MEF.relu(out_s4) out = self.conv3_tr(out) out = self.norm3_tr(out) out = self.block3_tr(out) out_s2_tr = MEF.relu(out) out = ME.cat(out_s2_tr, out_s2) out = self.conv2_tr(out) out = self.norm2_tr(out) out = self.block2_tr(out) out_s1_tr = MEF.relu(out) out = ME.cat(out_s1_tr, out_s1) out = self.conv1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class ResUNetBN(ResUNet): NORM_TYPE = 'BN' class ResUNetBNF(ResUNet): NORM_TYPE = 'BN' CHANNELS = [None, 16, 32, 64] TR_CHANNELS = [None, 16, 32, 64] class ResUNetBNFX(ResUNetBNF): REGION_TYPE = ME.RegionType.HYPER_CROSS class ResUNetSP(ME.MinkowskiNetwork): NORM_TYPE = 'BN' BLOCK_NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128] TR_CHANNELS = [None, 32, 64, 64] # None b1, b2, b3, btr3, btr2 # 1 2 3 -3 -2 -1 DEPTHS = [None, 1, 1, 1, 1, 1, None] REGION_TYPE = ME.RegionType.HYPER_CUBE # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS DEPTHS = self.DEPTHS REGION_TYPE = self.REGION_TYPE self.normalize_feature = normalize_feature self.conv1 = conv( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[1]) ]) self.pool2 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv2 = conv( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[2]) ]) self.pool3 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv3 = conv( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[3]) ]) self.pool3_tr = ME.MinkowskiPoolingTranspose(kernel_size=2, stride=2, dimension=D) self.conv3_tr = conv_tr( in_channels=CHANNELS[3], out_channels=TR_CHANNELS[3], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[-3]) ]) self.pool2_tr = ME.MinkowskiPoolingTranspose(kernel_size=2, stride=2, dimension=D) self.conv2_tr = conv_tr( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=1, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) for d in range(DEPTHS[-2]) ]) self.conv1_tr = conv_tr( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.final = conv( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out_s1 = MEF.relu(out_s1) out_s1 = self.block1(out_s1) out_s2 = self.pool2(out_s1) out_s2 = self.conv2(out_s2) out_s2 = self.norm2(out_s2) out_s2 = MEF.relu(out_s2) out_s2 = self.block2(out_s2) out_s4 = self.pool3(out_s2) out_s4 = self.conv3(out_s4) out_s4 = self.norm3(out_s4) out_s4 = MEF.relu(out_s4) out_s4 = self.block3(out_s4) out_s2t = self.pool3_tr(out_s4) out_s2t = self.conv3_tr(out_s2t) out_s2t = self.norm3_tr(out_s2t) out_s2t = MEF.relu(out_s2t) out_s2t = self.block3_tr(out_s2t) out = ME.cat(out_s2t, out_s2) out_s1t = self.conv2_tr(out) out_s1t = self.pool3_tr(out_s1t) out_s1t = self.norm2_tr(out_s1t) out_s1t = MEF.relu(out_s1t) out_s1t = self.block2_tr(out_s1t) out = ME.cat(out_s1t, out_s1) out = self.conv1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class ResUNetBNSPC(ResUNetSP): REGION_TYPE = ME.RegionType.HYPER_CROSS class ResUNetINBNSPC(ResUNetBNSPC): NORM_TYPE = 'INBN' class ResUNet2(ME.MinkowskiNetwork): NORM_TYPE = None BLOCK_NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 32, 64, 64, 128] REGION_TYPE = ME.RegionType.HYPER_CUBE # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS REGION_TYPE = self.REGION_TYPE self.normalize_feature = normalize_feature self.conv1 = conv( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv2 = conv( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv3 = conv( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv4 = conv( in_channels=CHANNELS[3], out_channels=CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4 = get_block( BLOCK_NORM_TYPE, CHANNELS[4], CHANNELS[4], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv4_tr = conv_tr( in_channels=CHANNELS[4], out_channels=TR_CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm4_tr = get_norm( NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[4], TR_CHANNELS[4], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv3_tr = conv_tr( in_channels=CHANNELS[3] + TR_CHANNELS[4], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv2_tr = conv_tr( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv1_tr = conv( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out_s1 = self.block1(out_s1) out = MEF.relu(out_s1) out_s2 = self.conv2(out) out_s2 = self.norm2(out_s2) out_s2 = self.block2(out_s2) out = MEF.relu(out_s2) out_s4 = self.conv3(out) out_s4 = self.norm3(out_s4) out_s4 = self.block3(out_s4) out = MEF.relu(out_s4) out_s8 = self.conv4(out) out_s8 = self.norm4(out_s8) out_s8 = self.block4(out_s8) out = MEF.relu(out_s8) out = self.conv4_tr(out) out = self.norm4_tr(out) out = self.block4_tr(out) out_s4_tr = MEF.relu(out) out = ME.cat(out_s4_tr, out_s4) out = self.conv3_tr(out) out = self.norm3_tr(out) out = self.block3_tr(out) out_s2_tr = MEF.relu(out) out = ME.cat(out_s2_tr, out_s2) out = self.conv2_tr(out) out = self.norm2_tr(out) out = self.block2_tr(out) out_s1_tr = MEF.relu(out) out = ME.cat(out_s1_tr, out_s1) out = self.conv1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8), coordinate_map_key=out.coordinate_map_key, coordinate_manager=out.coordinate_manager) else: return out class ResUNetBN2(ResUNet2): NORM_TYPE = 'BN' class ResUNetBN2B(ResUNet2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 64, 64] class ResUNetBN2C(ResUNet2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 64, 128] class ResUNetBN2CX(ResUNetBN2C): REGION_TYPE = ME.RegionType.HYPER_CROSS class ResUNetBN2D(ResUNet2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 128, 128] class ResUNetBN2E(ResUNet2): NORM_TYPE = 'BN' CHANNELS = [None, 128, 128, 128, 256] TR_CHANNELS = [None, 64, 128, 128, 128] class ResUNetBN2F(ResUNet2): NORM_TYPE = 'BN' CHANNELS = [None, 16, 32, 64, 128] TR_CHANNELS = [None, 16, 32, 64, 128] class ResUNetBN2FX(ResUNetBN2F): REGION_TYPE = ME.RegionType.HYPER_CROSS class ResUNet2v2(ME.MinkowskiNetwork): NORM_TYPE = None BLOCK_NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 32, 64, 64, 128] # None b1, b2, b3, b4, btr4, btr3, btr2 # 1 2 3 4,-4,-3,-2,-1 DEPTHS = [None, 1, 1, 1, 1, 1, 1, 1, None] REGION_TYPE = ME.RegionType.HYPER_CUBE # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS DEPTHS = self.DEPTHS self.normalize_feature = normalize_feature self.conv1 = ME.MinkowskiConvolution( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[1]) ]) self.conv2 = ME.MinkowskiConvolution( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[2]) ]) self.conv3 = ME.MinkowskiConvolution( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[3]) ]) self.conv4 = ME.MinkowskiConvolution( in_channels=CHANNELS[3], out_channels=CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4 = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, CHANNELS[4], CHANNELS[4], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[4]) ]) self.conv4_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[4], out_channels=TR_CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm4_tr = get_norm( NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[4], TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[-4]) ]) self.conv3_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[3] + TR_CHANNELS[4], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[-3]) ]) self.conv2_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = nn.Sequential(*[ get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) for d in range(DEPTHS[-2]) ]) self.conv1_tr = ME.MinkowskiConvolution( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) self.weight_initialization() def weight_initialization(self): for m in self.modules(): if isinstance(m, ME.MinkowskiConvolution): ME.utils.kaiming_normal_(m.kernel, mode='fan_out', nonlinearity='relu') if isinstance(m, ME.MinkowskiBatchNorm): nn.init.constant_(m.bn.weight, 1) nn.init.constant_(m.bn.bias, 0) def forward(self, x): # Receptive field size out_s1 = self.conv1(x) # 7 out_s1 = self.norm1(out_s1) out_s1 = MEF.relu(out_s1) out_s1 = self.block1(out_s1) out_s2 = self.conv2(out_s1) # 7 + 2 * 2 = 11 out_s2 = self.norm2(out_s2) out_s2 = MEF.relu(out_s2) out_s2 = self.block2(out_s2) # 11 + 2 * (2 + 2) = 19 out_s4 = self.conv3(out_s2) # 19 + 4 * 2 = 27 out_s4 = self.norm3(out_s4) out_s4 = MEF.relu(out_s4) out_s4 = self.block3(out_s4) # 27 + 4 * (2 + 2) = 43 out_s8 = self.conv4(out_s4) # 43 + 8 * 2 = 59 out_s8 = self.norm4(out_s8) out_s8 = MEF.relu(out_s8) out_s8 = self.block4(out_s8) # 59 + 8 * (2 + 2) = 91 out = self.conv4_tr(out_s8) # 91 + 4 * 2 = 99 out = self.norm4_tr(out) out = MEF.relu(out) out = self.block4_tr(out) # 99 + 4 * (2 + 2) = 115 out = ME.cat(out, out_s4) out = self.conv3_tr(out) # 115 + 2 * 2 = 119 out = self.norm3_tr(out) out = MEF.relu(out) out = self.block3_tr(out) # 119 + 2 * (2 + 2) = 127 out = ME.cat(out, out_s2) out = self.conv2_tr(out) # 127 + 2 = 129 out = self.norm2_tr(out) out = MEF.relu(out) out = self.block2_tr(out) # 129 + 1 * (2 + 2) = 133 out = ME.cat(out, out_s1) out = self.conv1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class ResUNetBN2v2(ResUNet2v2): NORM_TYPE = 'BN' class ResUNetBN2Bv2(ResUNet2v2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 64, 64] class ResUNetBN2Cv2(ResUNet2v2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 64, 128] class ResUNetBN2Dv2(ResUNet2v2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 128, 128] class ResUNetBN2Ev2(ResUNet2v2): NORM_TYPE = 'BN' CHANNELS = [None, 128, 128, 128, 256] TR_CHANNELS = [None, 64, 128, 128, 128] class ResUNetBN2Fv2(ResUNet2v2): NORM_TYPE = 'BN' CHANNELS = [None, 16, 32, 64, 128] TR_CHANNELS = [None, 16, 32, 64, 128] class ResUNet2SP(ME.MinkowskiNetwork): NORM_TYPE = None BLOCK_NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 32, 64, 64, 128] REGION_TYPE = ME.RegionType.HYPER_CUBE # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS REGION_TYPE = self.REGION_TYPE self.normalize_feature = normalize_feature self.conv1 = conv( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, region_type=ME.RegionType.HYPER_CUBE, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.block1 = get_block( BLOCK_NORM_TYPE, CHANNELS[1], CHANNELS[1], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.pool2 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv2 = conv( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2 = get_block( BLOCK_NORM_TYPE, CHANNELS[2], CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.pool3 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv3 = conv( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3 = get_block( BLOCK_NORM_TYPE, CHANNELS[3], CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.pool4 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D) self.conv4 = conv( in_channels=CHANNELS[3], out_channels=CHANNELS[4], kernel_size=3, stride=1, dilation=1, has_bias=False, region_type=ME.RegionType.HYPER_CUBE, dimension=D) self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4 = get_block( BLOCK_NORM_TYPE, CHANNELS[4], CHANNELS[4], bn_momentum=bn_momentum, region_type=ME.RegionType.HYPER_CUBE, dimension=D) self.conv4_tr = conv_tr( in_channels=CHANNELS[4], out_channels=TR_CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=ME.RegionType.HYPER_CUBE, dimension=D) self.norm4_tr = get_norm( NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.block4_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[4], TR_CHANNELS[4], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv3_tr = conv_tr( in_channels=CHANNELS[3] + TR_CHANNELS[4], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.block3_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[3], TR_CHANNELS[3], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv2_tr = conv_tr( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, region_type=REGION_TYPE, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.block2_tr = get_block( BLOCK_NORM_TYPE, TR_CHANNELS[2], TR_CHANNELS[2], bn_momentum=bn_momentum, region_type=REGION_TYPE, dimension=D) self.conv1_tr = conv( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=False, dimension=D) # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out_s1 = self.block1(out_s1) out = MEF.relu(out_s1) out_s2 = self.pool2(out) out_s2 = self.conv2(out_s2) out_s2 = self.norm2(out_s2) out_s2 = self.block2(out_s2) out = MEF.relu(out_s2) out_s4 = self.pool3(out) out_s4 = self.conv3(out_s4) out_s4 = self.norm3(out_s4) out_s4 = self.block3(out_s4) out = MEF.relu(out_s4) out_s8 = self.pool4(out) out_s8 = self.conv4(out_s8) out_s8 = self.norm4(out_s8) out_s8 = self.block4(out_s8) out = MEF.relu(out_s8) out = self.conv4_tr(out) out = self.norm4_tr(out) out = self.block4_tr(out) out_s4_tr = MEF.relu(out) out = ME.cat(out_s4_tr, out_s4) out = self.conv3_tr(out) out = self.norm3_tr(out) out = self.block3_tr(out) out_s2_tr = MEF.relu(out) out = ME.cat(out_s2_tr, out_s2) out = self.conv2_tr(out) out = self.norm2_tr(out) out = self.block2_tr(out) out_s1_tr = MEF.relu(out) out = ME.cat(out_s1_tr, out_s1) out = self.conv1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class ResUNetBN2SPC(ResUNet2SP): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 64, 128] class ResUNetBN2SPCX(ResUNetBN2SPC): REGION_TYPE = ME.RegionType.HYPER_CROSS ================================================ FILE: model/simpleunet.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import torch import MinkowskiEngine as ME import MinkowskiEngine.MinkowskiFunctional as MEF from model.common import get_norm class SimpleNet(ME.MinkowskiNetwork): NORM_TYPE = None CHANNELS = [None, 32, 64, 128] TR_CHANNELS = [None, 32, 32, 64] # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): super(SimpleNet, self).__init__(D) NORM_TYPE = self.NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS self.normalize_feature = normalize_feature self.conv1 = ME.MinkowskiConvolution( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, D=D) self.conv2 = ME.MinkowskiConvolution( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, D=D) self.conv3 = ME.MinkowskiConvolution( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, D=D) self.conv3_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[3], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm(NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, D=D) self.conv2_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2_tr = get_norm(NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, D=D) self.conv1_tr = ME.MinkowskiConvolution( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=3, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1_tr = get_norm(NORM_TYPE, TR_CHANNELS[1], bn_momentum=bn_momentum, D=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out = MEF.relu(out_s1) out_s2 = self.conv2(out) out_s2 = self.norm2(out_s2) out = MEF.relu(out_s2) out_s4 = self.conv3(out) out_s4 = self.norm3(out_s4) out = MEF.relu(out_s4) out = self.conv3_tr(out) out = self.norm3_tr(out) out_s2_tr = MEF.relu(out) out = ME.cat(out_s2_tr, out_s2) out = self.conv2_tr(out) out = self.norm2_tr(out) out_s1_tr = MEF.relu(out) out = ME.cat(out_s1_tr, out_s1) out = self.conv1_tr(out) out = self.norm1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / torch.norm(out.F, p=2, dim=1, keepdim=True), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class SimpleNetIN(SimpleNet): NORM_TYPE = 'IN' class SimpleNetBN(SimpleNet): NORM_TYPE = 'BN' class SimpleNetBNE(SimpleNetBN): CHANNELS = [None, 16, 32, 32] TR_CHANNELS = [None, 16, 16, 32] class SimpleNetINE(SimpleNetBNE): NORM_TYPE = 'IN' class SimpleNet2(ME.MinkowskiNetwork): NORM_TYPE = None CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 32, 32, 64, 64] # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS self.normalize_feature = normalize_feature self.conv1 = ME.MinkowskiConvolution( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.conv2 = ME.MinkowskiConvolution( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.conv3 = ME.MinkowskiConvolution( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.conv4 = ME.MinkowskiConvolution( in_channels=CHANNELS[3], out_channels=CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.conv4_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[4], out_channels=TR_CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm4_tr = get_norm( NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.conv3_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[3] + TR_CHANNELS[4], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.conv2_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.conv1_tr = ME.MinkowskiConvolution( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=3, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1_tr = get_norm( NORM_TYPE, TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.final = ME.MinkowskiConvolution( in_channels=TR_CHANNELS[1], out_channels=out_channels, kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out = MEF.relu(out_s1) out_s2 = self.conv2(out) out_s2 = self.norm2(out_s2) out = MEF.relu(out_s2) out_s4 = self.conv3(out) out_s4 = self.norm3(out_s4) out = MEF.relu(out_s4) out_s8 = self.conv4(out) out_s8 = self.norm4(out_s8) out = MEF.relu(out_s8) out = self.conv4_tr(out) out = self.norm4_tr(out) out_s4_tr = MEF.relu(out) out = ME.cat(out_s4_tr, out_s4) out = self.conv3_tr(out) out = self.norm3_tr(out) out_s2_tr = MEF.relu(out) out = ME.cat(out_s2_tr, out_s2) out = self.conv2_tr(out) out = self.norm2_tr(out) out_s1_tr = MEF.relu(out) out = ME.cat(out_s1_tr, out_s1) out = self.conv1_tr(out) out = self.norm1_tr(out) out = MEF.relu(out) out = self.final(out) if self.normalize_feature: return ME.SparseTensor( out.F / torch.norm(out.F, p=2, dim=1, keepdim=True), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class SimpleNetIN2(SimpleNet2): NORM_TYPE = 'IN' class SimpleNetBN2(SimpleNet2): NORM_TYPE = 'BN' class SimpleNetBN2B(SimpleNet2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 64, 64, 64, 64] class SimpleNetBN2C(SimpleNet2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 32, 64, 64, 128] class SimpleNetBN2D(SimpleNet2): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256] TR_CHANNELS = [None, 32, 64, 64, 128] class SimpleNetBN2E(SimpleNet2): NORM_TYPE = 'BN' CHANNELS = [None, 16, 32, 64, 128] TR_CHANNELS = [None, 16, 32, 32, 64] class SimpleNetIN2E(SimpleNetBN2E): NORM_TYPE = 'IN' class SimpleNet3(ME.MinkowskiNetwork): NORM_TYPE = None CHANNELS = [None, 32, 64, 128, 256, 512] TR_CHANNELS = [None, 32, 32, 64, 64, 128] # To use the model, must call initialize_coords before forward pass. # Once data is processed, call clear to reset the model before calling initialize_coords def __init__(self, in_channels=3, out_channels=32, bn_momentum=0.1, conv1_kernel_size=3, normalize_feature=False, D=3): ME.MinkowskiNetwork.__init__(self, D) NORM_TYPE = self.NORM_TYPE CHANNELS = self.CHANNELS TR_CHANNELS = self.TR_CHANNELS self.normalize_feature = normalize_feature self.conv1 = ME.MinkowskiConvolution( in_channels=in_channels, out_channels=CHANNELS[1], kernel_size=conv1_kernel_size, stride=1, dilation=1, has_bias=False, dimension=D) self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D) self.conv2 = ME.MinkowskiConvolution( in_channels=CHANNELS[1], out_channels=CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.conv3 = ME.MinkowskiConvolution( in_channels=CHANNELS[2], out_channels=CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.conv4 = ME.MinkowskiConvolution( in_channels=CHANNELS[3], out_channels=CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.conv5 = ME.MinkowskiConvolution( in_channels=CHANNELS[4], out_channels=CHANNELS[5], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm5 = get_norm(NORM_TYPE, CHANNELS[5], bn_momentum=bn_momentum, dimension=D) self.conv5_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[5], out_channels=TR_CHANNELS[5], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm5_tr = get_norm( NORM_TYPE, TR_CHANNELS[5], bn_momentum=bn_momentum, dimension=D) self.conv4_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[4] + TR_CHANNELS[5], out_channels=TR_CHANNELS[4], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm4_tr = get_norm( NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D) self.conv3_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[3] + TR_CHANNELS[4], out_channels=TR_CHANNELS[3], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm3_tr = get_norm( NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D) self.conv2_tr = ME.MinkowskiConvolutionTranspose( in_channels=CHANNELS[2] + TR_CHANNELS[3], out_channels=TR_CHANNELS[2], kernel_size=3, stride=2, dilation=1, has_bias=False, dimension=D) self.norm2_tr = get_norm( NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D) self.conv1_tr = ME.MinkowskiConvolution( in_channels=CHANNELS[1] + TR_CHANNELS[2], out_channels=TR_CHANNELS[1], kernel_size=1, stride=1, dilation=1, has_bias=True, dimension=D) def forward(self, x): out_s1 = self.conv1(x) out_s1 = self.norm1(out_s1) out = MEF.relu(out_s1) out_s2 = self.conv2(out) out_s2 = self.norm2(out_s2) out = MEF.relu(out_s2) out_s4 = self.conv3(out) out_s4 = self.norm3(out_s4) out = MEF.relu(out_s4) out_s8 = self.conv4(out) out_s8 = self.norm4(out_s8) out = MEF.relu(out_s8) out_s16 = self.conv5(out) out_s16 = self.norm5(out_s16) out = MEF.relu(out_s16) out = self.conv5_tr(out) out = self.norm5_tr(out) out_s8_tr = MEF.relu(out) out = ME.cat(out_s8_tr, out_s8) out = self.conv4_tr(out) out = self.norm4_tr(out) out_s4_tr = MEF.relu(out) out = ME.cat(out_s4_tr, out_s4) out = self.conv3_tr(out) out = self.norm3_tr(out) out_s2_tr = MEF.relu(out) out = ME.cat(out_s2_tr, out_s2) out = self.conv2_tr(out) out = self.norm2_tr(out) out_s1_tr = MEF.relu(out) out = ME.cat(out_s1_tr, out_s1) out = self.conv1_tr(out) if self.normalize_feature: return ME.SparseTensor( out.F / torch.norm(out.F, p=2, dim=1, keepdim=True), coords_key=out.coords_key, coords_manager=out.coords_man) else: return out class SimpleNetIN3(SimpleNet3): NORM_TYPE = 'IN' class SimpleNetBN3(SimpleNet3): NORM_TYPE = 'BN' class SimpleNetBN3B(SimpleNet3): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256, 512] TR_CHANNELS = [None, 32, 64, 64, 64, 128] class SimpleNetBN3C(SimpleNet3): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256, 512] TR_CHANNELS = [None, 32, 32, 64, 128, 128] class SimpleNetBN3D(SimpleNet3): NORM_TYPE = 'BN' CHANNELS = [None, 32, 64, 128, 256, 512] TR_CHANNELS = [None, 32, 64, 64, 128, 128] class SimpleNetBN3E(SimpleNet3): NORM_TYPE = 'BN' CHANNELS = [None, 16, 32, 64, 128, 256] TR_CHANNELS = [None, 16, 32, 32, 64, 128] class SimpleNetIN3E(SimpleNetBN3E): NORM_TYPE = 'IN' ================================================ FILE: requirements.txt ================================================ ansi2html==1.8.0 attrs==23.1.0 certifi==2023.7.22 charset-normalizer==3.1.0 click==8.1.3 cmake==3.26.4 ConfigArgParse==1.5.3 dash==2.11.0 dash-core-components==2.0.0 dash-html-components==2.0.0 dash-table==5.0.0 easydict==1.10 fastjsonschema==2.17.1 filelock==3.12.2 Flask==2.2.5 idna==3.4 intel-openmp==2023.1.0 itsdangerous==2.1.2 Jinja2==3.1.2 jsonschema==4.17.3 jupyter_core==5.3.1 lit==16.0.6 MarkupSafe==2.1.3 MinkowskiEngine==0.5.4 mkl==2023.1.0 mpmath==1.3.0 nbformat==5.7.0 nest-asyncio==1.5.6 networkx==3.1 numpy==1.25.0 nvidia-cublas-cu11==11.10.3.66 nvidia-cuda-cupti-cu11==11.7.101 nvidia-cuda-nvrtc-cu11==11.7.99 nvidia-cuda-runtime-cu11==11.7.99 nvidia-cudnn-cu11==8.5.0.96 nvidia-cufft-cu11==10.9.0.58 nvidia-curand-cu11==10.2.10.91 nvidia-cusolver-cu11==11.4.0.1 nvidia-cusparse-cu11==11.7.4.91 nvidia-nccl-cu11==2.14.3 nvidia-nvtx-cu11==11.7.91 open3d-cpu @ file:///home/ibrahim/tmp/Open3D/build/lib/python_package/pip_package/open3d_cpu-0.17.0%2B9238339b9-cp310-cp310-manylinux_2_37_x86_64.whl packaging==23.1 Pillow==9.5.0 platformdirs==3.8.0 plotly==5.15.0 pyrsistent==0.19.3 requests==2.31.0 retrying==1.3.4 scipy==1.11.0 six==1.16.0 sympy==1.12 tbb==2021.9.0 tenacity==8.2.2 torch==2.0.1 torchaudio==2.0.2 torchvision==0.15.2 traitlets==5.9.0 triton==2.0.0 typing_extensions==4.6.3 urllib3==2.0.3 Werkzeug==2.2.3 ================================================ FILE: scripts/analyze_stats.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 from matplotlib.patches import Rectangle import matplotlib.pyplot as plt import numpy as np import argparse PROPERTY_IDX_MAP = { 'Recall': 0, 'TE (m)': 1, 'RE (deg)': 2, 'log Time (s)': 3, 'Scene ID': 4 } def analyze_by_pair(stats, rte_thresh, rre_thresh): ''' \input stats: (num_methods, num_pairs, num_pairwise_stats=5) \return valid mean_stats: (num_methods, 4) 4 properties: recall, rte, rre, time ''' num_methods, num_pairs, num_pairwise_stats = stats.shape pairwise_stats = np.zeros((num_methods, 4)) for m in range(num_methods): # Filter valid registrations by rte / rre thresholds mask_rte = stats[m, :, 1] < rte_thresh mask_rre = stats[m, :, 2] < rre_thresh mask_valid = mask_rte * mask_rre # Recall, RTE, RRE, Time pairwise_stats[m, 0] = mask_valid.mean() pairwise_stats[m, 1] = stats[m, mask_valid, 1].mean() pairwise_stats[m, 2] = stats[m, mask_valid, 2].mean() pairwise_stats[m, 3] = stats[m, mask_valid, 3].mean() return pairwise_stats def analyze_by_scene(stats, scene_id_list, rte_thresh=0.3, rre_thresh=15): ''' \input stats: (num_methods, num_pairs, num_pairwise_stats=5) \return scene_wise mean stats: (num_methods, num_scenes, 4) 4 properties: recall, rte, rre, time ''' num_methods, num_pairs, num_pairwise_stats = stats.shape num_scenes = len(scene_id_list) scene_wise_stats = np.zeros((num_methods, len(scene_id_list), 4)) for m in range(num_methods): # Filter valid registrations by rte / rre thresholds mask_rte = stats[m, :, 1] < rte_thresh mask_rre = stats[m, :, 2] < rre_thresh mask_valid = mask_rte * mask_rre for s in scene_id_list: mask_scene = stats[m, :, 4] == s # Valid registrations in the scene mask = mask_scene * mask_valid # Recall, RTE, RRE, Time scene_wise_stats[m, s, 0] = 0 if np.sum(mask_scene) == 0 else float( np.sum(mask)) / float(np.sum(mask_scene)) scene_wise_stats[m, s, 1] = stats[m, mask, 1].mean() scene_wise_stats[m, s, 2] = stats[m, mask, 2].mean() scene_wise_stats[m, s, 3] = stats[m, mask, 3].mean() return scene_wise_stats def plot_precision_recall_curves(stats, method_names, rte_precisions, rre_precisions, output_postfix, cmap): ''' \input stats: (num_methods, num_pairs, 5) \input method_names: (num_methods) string, shown as xticks ''' num_methods, num_pairs, _ = stats.shape rre_precision_curves = np.zeros((num_methods, len(rre_precisions))) rte_precision_curves = np.zeros((num_methods, len(rte_precisions))) for i, rre_thresh in enumerate(rre_precisions): pairwise_stats = analyze_by_pair(stats, rte_thresh=np.inf, rre_thresh=rre_thresh) rre_precision_curves[:, i] = pairwise_stats[:, 0] for i, rte_thresh in enumerate(rte_precisions): pairwise_stats = analyze_by_pair(stats, rte_thresh=rte_thresh, rre_thresh=np.inf) rte_precision_curves[:, i] = pairwise_stats[:, 0] fig = plt.figure(figsize=(10, 3)) ax1 = fig.add_subplot(1, 2, 1, aspect=3.0 / np.max(rte_precisions)) ax2 = fig.add_subplot(1, 2, 2, aspect=3.0 / np.max(rre_precisions)) for m, name in enumerate(method_names): alpha = rre_precision_curves[m].mean() alpha = 1.0 if alpha > 0 else 0.0 ax1.plot(rre_precisions, rre_precision_curves[m], color=cmap[m], alpha=alpha) ax2.plot(rte_precisions, rte_precision_curves[m], color=cmap[m], alpha=alpha) ax1.set_ylabel('Recall') ax1.set_xlabel('Rotation (deg)') ax1.set_ylim((0.0, 1.0)) ax2.set_xlabel('Translation (m)') ax2.set_ylim((0.0, 1.0)) ax2.legend(method_names, loc='center left', bbox_to_anchor=(1, 0.5)) ax1.grid() ax2.grid() plt.tight_layout() plt.savefig('{}_{}.png'.format('precision_recall', output_postfix)) plt.close(fig) def plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, property_name, ylim, output_postfix, cmap): ''' \input scene_wise_stats: (num_methods, num_scenes, 4) \input method_names: (num_methods) string, shown as xticks \input scene_names: (num_scenes) string, shown as legends \input property_name: string, shown as ylabel ''' num_methods, num_scenes, _ = scene_wise_stats.shape assert len(method_names) == num_methods assert len(scene_names) == num_scenes # Initialize figure fig = plt.figure(figsize=(14, 3)) ax = fig.add_subplot(1, 1, 1) # Add some paddings w = 1.0 / (num_methods + 2) # Rightmost bar x = np.arange(0, num_scenes) - 0.5 * w * num_methods for m in range(num_methods): m_stats = scene_wise_stats[m, :, PROPERTY_IDX_MAP[property_name]] valid = not (np.logical_and.reduce(np.isnan(m_stats)) or np.logical_and.reduce(m_stats == 0)) alpha = 1.0 if valid else 0.0 ax.bar(x + m * w, m_stats, w, color=cmap[m], alpha=alpha) plt.ylim(ylim) plt.xlim((0 - w * num_methods, num_scenes)) plt.ylabel(property_name) plt.xticks(np.arange(0, num_scenes), tuple(scene_names)) ax.legend(method_names, loc='center left', bbox_to_anchor=(1, 0.5)) plt.tight_layout() plt.grid() plt.savefig('{}_{}.png'.format(property_name, output_postfix)) plt.close(fig) def plot_pareto_frontier(pairwise_stats, method_names, cmap): recalls = pairwise_stats[:, 0] times = 1.0 / pairwise_stats[:, 3] ind = np.argsort(times) offset = 0.05 plt.rcParams.update({'font.size': 30}) fig = plt.figure(figsize=(20, 12)) ax = fig.add_subplot(111) ax.set_xlabel('Number of registrations per second (log scale)') ax.set_xscale('log') xmin = np.power(10, -2.2) xmax = np.power(10, 1.5) ax.set_xlim(xmin, xmax) ax.set_ylabel('Registration recall') ax.set_ylim(-offset, 1) ax.set_yticks(np.arange(0, 1, step=0.2)) plots = [None for m in ind] max_gain = -1 for m in ind[::-1]: # 8, 9: our methods if (recalls[m] > max_gain): max_gain = recalls[m] ax.add_patch( Rectangle((0, -offset), times[m], recalls[m] + offset, facecolor=(0.94, 0.94, 0.94))) plot, = ax.plot(times[m], recalls[m], 'o', c=colors[m], markersize=30) plots[m] = plot ax.legend(plots, method_names, loc='center left', bbox_to_anchor=(1, 0.5)) plt.tight_layout() plt.savefig('frontier.png') if __name__ == '__main__': ''' Input .npz file to analyze: \prop npz['stats']: (num_methods, num_pairs, num_pairwise_stats=5) 5 pairwise stats properties consist of - \bool success: decided by evaluation thresholds, will be ignored in this script - \float rte: relative translation error (in cm) - \float rre: relative rotation error (in deg) - \float time: registration time for the pair (in ms) - \int scene_id: specific for 3DMatch test sets (8 scenes in total) \prop npz['names']: (num_methods) Corresponding method name stored in string ''' # Setup fonts from matplotlib import rc rc('font', **{'family': 'sans-serif', 'sans-serif': ['Helvetica']}) rc('text', usetex=False) # Parse arguments parser = argparse.ArgumentParser() parser.add_argument('npz', help='path to the npz file') parser.add_argument('--output_postfix', default='', help='postfix of the output') parser.add_argument('--end_method_index', default=1000, type=int, help='reserved only for making slides') args = parser.parse_args() # Load npz file with aformentioned format npz = np.load(args.npz) stats = npz['stats'] # Reserved only for making slides, will be skipped by default stats[args.end_method_index:, :, 1] = np.inf stats[args.end_method_index:, :, 2] = np.inf method_names = npz['names'] scene_names = [ 'Kitchen', 'Home1', 'Home2', 'Hotel1', 'Hotel2', 'Hotel3', 'Study', 'Lab' ] cmap = plt.get_cmap('tab20b') colors = [cmap(i) for i in np.linspace(0, 1, len(method_names))] colors.reverse() # Plot scene-wise bar charts scene_wise_stats = analyze_by_scene(stats, range(len(scene_names)), rte_thresh=0.3, rre_thresh=15) plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, 'Recall', (0.0, 1.0), args.output_postfix, colors) plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, 'TE (m)', (0.0, 0.3), args.output_postfix, colors) plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, 'RE (deg)', (0.0, 15.0), args.output_postfix, colors) # Plot rte/rre - recall curves plot_precision_recall_curves(stats, method_names, rre_precisions=np.arange(0, 15, 0.05), rte_precisions=np.arange(0, 0.3, 0.005), output_postfix=args.output_postfix, cmap=colors) pairwise_stats = analyze_by_pair(stats, rte_thresh=0.3, rre_thresh=15) plot_pareto_frontier(pairwise_stats, method_names, cmap=colors) ================================================ FILE: scripts/download_3dmatch.sh ================================================ #!/usr/bin/env bash DATA_DIR=$1 function download() { TMP_PATH="$DATA_DIR/tmp" echo "#################################" echo "Data Root Dir: ${DATA_DIR}" echo "Download Path: ${TMP_PATH}" echo "#################################" urls=( 'http://node2.chrischoy.org/data/datasets/registration/threedmatch.tgz' ) if [ ! -d "$TMP_PATH" ]; then echo ">> Create temporary directory: ${TMP_PATH}" mkdir -p "$TMP_PATH" fi cd "$TMP_PATH" echo ">> Start downloading" echo ${urls[@]} | xargs -n 1 -P 3 wget --no-check-certificate -q -c --show-progress $0 echo ">> Unpack .zip file" for filename in *.tgz do tar -xvzf $filename -C ../ done echo ">> Clear tmp directory" cd .. rm -rf ./tmp echo "#################################" echo "Done!" echo "#################################" } function main() { echo $DATA_DIR if [ -z "$DATA_DIR" ]; then echo "DATA_DIR is required config!" else download fi } main; ================================================ FILE: scripts/test_3dmatch.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 # Run with python -m scripts.test_3dmatch_refactor import os import sys import math import logging import open3d as o3d import numpy as np import time import torch import copy sys.path.append('.') import MinkowskiEngine as ME from config import get_config from model import load_model from dataloader.data_loaders import ThreeDMatchTrajectoryDataset from core.knn import find_knn_gpu from core.deep_global_registration import DeepGlobalRegistration from util.timer import Timer from util.pointcloud import make_open3d_point_cloud o3d.utility.set_verbosity_level(o3d.utility.VerbosityLevel.Warning) ch = logging.StreamHandler(sys.stdout) logging.getLogger().setLevel(logging.INFO) logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d %H:%M:%S', handlers=[ch]) # Criteria def rte_rre(T_pred, T_gt, rte_thresh, rre_thresh, eps=1e-16): if T_pred is None: return np.array([0, np.inf, np.inf]) rte = np.linalg.norm(T_pred[:3, 3] - T_gt[:3, 3]) rre = np.arccos( np.clip((np.trace(T_pred[:3, :3].T @ T_gt[:3, :3]) - 1) / 2, -1 + eps, 1 - eps)) * 180 / math.pi return np.array([rte < rte_thresh and rre < rre_thresh, rte, rre]) def analyze_stats(stats, mask, method_names): mask = (mask > 0).squeeze(1) stats = stats[:, mask, :] print('Total result mean') for i, method_name in enumerate(method_names): print(method_name) print(stats[i].mean(0)) print('Total successful result mean') for i, method_name in enumerate(method_names): sel = stats[i][:, 0] > 0 sel_stats = stats[i][sel] print(method_name) print(sel_stats.mean(0)) def create_pcd(xyz, color): # n x 3 n = xyz.shape[0] pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(xyz) pcd.colors = o3d.utility.Vector3dVector(np.tile(color, (n, 1))) pcd.estimate_normals( search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) return pcd def draw_geometries_flip(pcds): pcds_transform = [] flip_transform = [[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]] for pcd in pcds: pcd_temp = copy.deepcopy(pcd) pcd_temp.transform(flip_transform) pcds_transform.append(pcd_temp) o3d.visualization.draw_geometries(pcds_transform) def evaluate(methods, method_names, data_loader, config, debug=False): tot_num_data = len(data_loader.dataset) data_loader_iter = iter(data_loader) # Accumulate success, rre, rte, time, sid mask = np.zeros((tot_num_data, 1)).astype(int) stats = np.zeros((len(methods), tot_num_data, 5)) dataset = data_loader.dataset subset_names = open(dataset.DATA_FILES[dataset.phase]).read().split() for batch_idx in range(tot_num_data): batch = data_loader_iter.next() # Skip too sparse point clouds sname, xyz0, xyz1, trans = batch[0] sid = subset_names.index(sname) T_gt = np.linalg.inv(trans) for i, method in enumerate(methods): start = time.time() T = method.register(xyz0, xyz1) end = time.time() # Visualize if debug: print(method_names[i]) pcd0 = create_pcd(xyz0, np.array([1, 0.706, 0])) pcd1 = create_pcd(xyz1, np.array([0, 0.651, 0.929])) pcd0.transform(T) draw_geometries_flip([pcd0, pcd1]) pcd0.transform(np.linalg.inv(T)) stats[i, batch_idx, :3] = rte_rre(T, T_gt, config.success_rte_thresh, config.success_rre_thresh) stats[i, batch_idx, 3] = end - start stats[i, batch_idx, 4] = sid mask[batch_idx] = 1 if stats[i, batch_idx, 0] == 0: print(f"{method_names[i]}: failed") if batch_idx % 10 == 9: print('Summary {} / {}'.format(batch_idx, tot_num_data)) analyze_stats(stats, mask, method_names) # Save results filename = f'3dmatch-stats_{method.__class__.__name__}' if os.path.isdir(config.out_dir): out_file = os.path.join(config.out_dir, filename) else: out_file = filename # save it on the current directory print(f'Saving the stats to {out_file}') np.savez(out_file, stats=stats, names=method_names) analyze_stats(stats, mask, method_names) # Analysis per scene for i, method in enumerate(methods): print(f'Scene-wise mean {method}') scene_vals = np.zeros((len(subset_names), 3)) for sid, sname in enumerate(subset_names): curr_scene = stats[i, :, 4] == sid scene_vals[sid] = (stats[i, curr_scene, :3]).mean(0) print('All scenes') print(scene_vals) print('Scene average') print(scene_vals.mean(0)) if __name__ == '__main__': config = get_config() print(config) dgr = DeepGlobalRegistration(config) methods = [dgr] method_names = ['DGR'] dset = ThreeDMatchTrajectoryDataset(phase='test', transform=None, random_scale=False, random_rotation=False, config=config) data_loader = torch.utils.data.DataLoader(dset, batch_size=1, shuffle=False, num_workers=1, collate_fn=lambda x: x, pin_memory=False, drop_last=True) evaluate(methods, method_names, data_loader, config, debug=False) ================================================ FILE: scripts/test_kitti.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import os import sys import logging import argparse import numpy as np import open3d as o3d import torch from config import get_config from core.deep_global_registration import DeepGlobalRegistration from dataloader.kitti_loader import KITTINMPairDataset from dataloader.base_loader import CollationFunctionFactory from util.pointcloud import make_open3d_point_cloud, make_open3d_feature, pointcloud_to_spheres from util.timer import AverageMeter, Timer from scripts.test_3dmatch import rte_rre ch = logging.StreamHandler(sys.stdout) logging.getLogger().setLevel(logging.INFO) logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d %H:%M:%S', handlers=[ch]) TE_THRESH = 0.6 # m RE_THRESH = 5 # deg VISUALIZE = False def visualize_pair(xyz0, xyz1, T, voxel_size): pcd0 = pointcloud_to_spheres(xyz0, voxel_size, np.array([0, 0, 1]), sphere_size=0.6) pcd1 = pointcloud_to_spheres(xyz1, voxel_size, np.array([0, 1, 0]), sphere_size=0.6) pcd0.transform(T) o3d.visualization.draw_geometries([pcd0, pcd1]) def analyze_stats(stats): print('Total result mean') print(stats.mean(0)) sel_stats = stats[stats[:, 0] > 0] print(sel_stats.mean(0)) def evaluate(config, data_loader, method): data_timer = Timer() test_iter = data_loader.__iter__() N = len(test_iter) stats = np.zeros((N, 5)) # bool succ, rte, rre, time, drive id for i in range(len(data_loader)): data_timer.tic() try: data_dict = test_iter.next() except ValueError as exc: pass data_timer.toc() drive = data_dict['extra_packages'][0]['drive'] xyz0, xyz1 = data_dict['pcd0'][0], data_dict['pcd1'][0] T_gt = data_dict['T_gt'][0].numpy() xyz0np, xyz1np = xyz0.numpy(), xyz1.numpy() T_pred = method.register(xyz0np, xyz1np) stats[i, :3] = rte_rre(T_pred, T_gt, TE_THRESH, RE_THRESH) stats[i, 3] = method.reg_timer.diff + method.feat_timer.diff stats[i, 4] = drive if stats[i, 0] == 0: logging.info(f"Failed with RTE: {stats[i, 1]}, RRE: {stats[i, 2]}") if i % 10 == 0: succ_rate, rte, rre, avg_time, _ = stats[:i + 1].mean(0) logging.info( f"{i} / {N}: Data time: {data_timer.avg}, Feat time: {method.feat_timer.avg}," + f" Reg time: {method.reg_timer.avg}, RTE: {rte}," + f" RRE: {rre}, Success: {succ_rate * 100} %") if VISUALIZE and i % 10 == 9: visualize_pair(xyz0, xyz1, T_pred, config.voxel_size) succ_rate, rte, rre, avg_time, _ = stats.mean(0) logging.info( f"Data time: {data_timer.avg}, Feat time: {method.feat_timer.avg}," + f" Reg time: {method.reg_timer.avg}, RTE: {rte}," + f" RRE: {rre}, Success: {succ_rate * 100} %") # Save results filename = f'kitti-stats_{method.__class__.__name__}' if config.out_filename is not None: filename += f'_{config.out_filename}' if isinstance(method, FCGFWrapper): filename += '_' + method.method if 'ransac' in method.method: filename += f'_{config.ransac_iter}' if os.path.isdir(config.out_dir): out_file = os.path.join(config.out_dir, filename) else: out_file = filename # save it on the current directory print(f'Saving the stats to {out_file}') np.savez(out_file, stats=stats) analyze_stats(stats) if __name__ == '__main__': config = get_config() dgr = DeepGlobalRegistration(config) dset = KITTINMPairDataset('test', transform=None, random_rotation=False, random_scale=False, config=config) data_loader = torch.utils.data.DataLoader( dset, batch_size=1, shuffle=False, num_workers=0, collate_fn=CollationFunctionFactory(concat_correspondences=False, collation_type='collate_pair'), pin_memory=False, drop_last=False) evaluate(config, data_loader, dgr) ================================================ FILE: scripts/train_3dmatch.sh ================================================ #! /bin/bash export PATH_POSTFIX=$1 export MISC_ARGS=$2 export DATA_ROOT="./outputs/Experiment2" export DATASET=${DATASET:-ThreeDMatchPairDataset03} export THREED_MATCH_DIR=${THREED_MATCH_DIR} export MODEL=${MODEL:-ResUNetBN2C} export MODEL_N_OUT=${MODEL_N_OUT:-32} export FCGF_WEIGHTS=${FCGF_WEIGHTS:fcgf.pth} export INLIER_MODEL=${INLIER_MODEL:-ResUNetBNF} export OPTIMIZER=${OPTIMIZER:-SGD} export LR=${LR:-1e-1} export MAX_EPOCH=${MAX_EPOCH:-100} export BATCH_SIZE=${BATCH_SIZE:-8} export ITER_SIZE=${ITER_SIZE:-1} export VOXEL_SIZE=${VOXEL_SIZE:-0.05} export POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER=${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER:-4} export CONV1_KERNEL_SIZE=${CONV1_KERNEL_SIZE:-7} export EXP_GAMMA=${EXP_GAMMA:-0.99} export RANDOM_SCALE=${RANDOM_SCALE:-True} export TIME=$(date +"%Y-%m-%d_%H-%M-%S") export VERSION=$(git rev-parse HEAD) export OUT_DIR=${DATA_ROOT}/${DATASET}-v${VOXEL_SIZE}/${INLIER_MODEL}/${OPTIMIZER}-lr${LR}-e${MAX_EPOCH}-b${BATCH_SIZE}i${ITER_SIZE}-modelnout${MODEL_N_OUT}${PATH_POSTFIX}/${TIME} export PYTHONUNBUFFERED="True" echo $OUT_DIR mkdir -m 755 -p $OUT_DIR LOG=${OUT_DIR}/log_${TIME}.txt echo "Host: " $(hostname) | tee -a $LOG echo "Conda " $(which conda) | tee -a $LOG echo $(pwd) | tee -a $LOG echo "Version: " $VERSION | tee -a $LOG echo "Git diff" | tee -a $LOG echo "" | tee -a $LOG git diff | tee -a $LOG echo "" | tee -a $LOG nvidia-smi | tee -a $LOG # Training python train.py \ --weights ${FCGF_WEIGHTS} \ --dataset ${DATASET} \ --threed_match_dir ${THREED_MATCH_DIR} \ --feat_model ${MODEL} \ --feat_model_n_out ${MODEL_N_OUT} \ --feat_conv1_kernel_size ${CONV1_KERNEL_SIZE} \ --inlier_model ${INLIER_MODEL} \ --optimizer ${OPTIMIZER} \ --lr ${LR} \ --batch_size ${BATCH_SIZE} \ --val_batch_size ${BATCH_SIZE} \ --iter_size ${ITER_SIZE} \ --max_epoch ${MAX_EPOCH} \ --voxel_size ${VOXEL_SIZE} \ --out_dir ${OUT_DIR} \ --use_random_scale ${RANDOM_SCALE} \ --positive_pair_search_voxel_size_multiplier ${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER} \ $MISC_ARGS 2>&1 | tee -a $LOG # Test python -m scripts.test_3dmatch \ $MISC_ARGS \ --threed_match_dir ${THREED_MATCH_DIR} \ --weights ${OUT_DIR}/best_val_checkpoint.pth \ 2>&1 | tee -a $LOG ================================================ FILE: scripts/train_kitti.sh ================================================ #! /bin/bash export PATH_POSTFIX=$1 export MISC_ARGS=$2 export DATA_ROOT="./outputs/Experiment3" export DATASET=${DATASET:-KITTINMPairDataset} export KITTI_PATH=${KITTI_PATH} export MODEL=${MODEL:-ResUNetBN2C} export MODEL_N_OUT=${MODEL_N_OUT:-32} export FCGF_WEIGHTS=${FCGF_WEIGHTS} export INLIER_MODEL=${INLIER_MODEL:-ResUNetBN2C} export OPTIMIZER=${OPTIMIZER:-SGD} export LR=${LR:-1e-2} export MAX_EPOCH=${MAX_EPOCH:-100} export BATCH_SIZE=${BATCH_SIZE:-8} export ITER_SIZE=${ITER_SIZE:-1} export VOXEL_SIZE=${VOXEL_SIZE:-0.3} export POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER=${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER:-4} export CONV1_KERNEL_SIZE=${CONV1_KERNEL_SIZE:-5} export EXP_GAMMA=${EXP_GAMMA:-0.99} export RANDOM_SCALE=${RANDOM_SCALE:-True} export TIME=$(date +"%Y-%m-%d_%H-%M-%S") export VERSION=$(git rev-parse HEAD) export OUT_DIR=${DATA_ROOT}/${DATASET}-v${VOXEL_SIZE}/${INLIER_MODEL}/${OPTIMIZER}-lr${LR}-e${MAX_EPOCH}-b${BATCH_SIZE}i${ITER_SIZE}-modelnout${MODEL_N_OUT}${PATH_POSTFIX}/${TIME} export PYTHONUNBUFFERED="True" echo $OUT_DIR mkdir -m 755 -p $OUT_DIR LOG=${OUT_DIR}/log_${TIME}.txt echo "Host: " $(hostname) | tee -a $LOG echo "Conda " $(which conda) | tee -a $LOG echo $(pwd) | tee -a $LOG echo "Version: " $VERSION | tee -a $LOG echo "Git diff" | tee -a $LOG echo "" | tee -a $LOG git diff | tee -a $LOG echo "" | tee -a $LOG nvidia-smi | tee -a $LOG # Training python train.py \ --weights ${FCGF_WEIGHTS} \ --dataset ${DATASET} \ --feat_model ${MODEL} \ --feat_model_n_out ${MODEL_N_OUT} \ --feat_conv1_kernel_size ${CONV1_KERNEL_SIZE} \ --inlier_model ${INLIER_MODEL} \ --optimizer ${OPTIMIZER} \ --lr ${LR} \ --batch_size ${BATCH_SIZE} \ --val_batch_size ${BATCH_SIZE} \ --iter_size ${ITER_SIZE} \ --max_epoch ${MAX_EPOCH} \ --voxel_size ${VOXEL_SIZE} \ --out_dir ${OUT_DIR} \ --use_random_scale ${RANDOM_SCALE} \ --kitti_dir ${KITTI_PATH} \ --success_rte_thresh 2 \ --success_rre_thresh 5 \ --positive_pair_search_voxel_size_multiplier ${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER} \ $MISC_ARGS 2>&1 | tee -a $LOG # Test python -m scripts.test_kitti \ --kitti_dir ${KITTI_PATH} \ --save_dir ${OUT_DIR} | tee -a $LOG ================================================ FILE: train.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import open3d as o3d # prevent loading error import sys import json import logging import torch from easydict import EasyDict as edict from config import get_config from dataloader.data_loaders import make_data_loader from core.trainer import WeightedProcrustesTrainer ch = logging.StreamHandler(sys.stdout) logging.getLogger().setLevel(logging.INFO) logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d %H:%M:%S', handlers=[ch]) torch.manual_seed(0) torch.cuda.manual_seed(0) logging.basicConfig(level=logging.INFO, format="") def main(config, resume=False): train_loader = make_data_loader(config, config.train_phase, config.batch_size, num_workers=config.train_num_workers, shuffle=True) if config.test_valid: val_loader = make_data_loader(config, config.val_phase, config.val_batch_size, num_workers=config.val_num_workers, shuffle=True) else: val_loader = None trainer = WeightedProcrustesTrainer( config=config, data_loader=train_loader, val_data_loader=val_loader, ) trainer.train() if __name__ == "__main__": logger = logging.getLogger() config = get_config() dconfig = vars(config) if config.resume_dir: resume_config = json.load(open(config.resume_dir + '/config.json', 'r')) for k in dconfig: if k not in ['resume_dir'] and k in resume_config: dconfig[k] = resume_config[k] dconfig['resume'] = resume_config['out_dir'] + '/checkpoint.pth' logging.info('===> Configurations') for k in dconfig: logging.info(' {}: {}'.format(k, dconfig[k])) # Convert to dict config = edict(dconfig) main(config) ================================================ FILE: util/__init__.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 ================================================ FILE: util/file.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import os import re from os import listdir from os.path import isfile, isdir, join, splitext import numpy as np def read_txt(path): """Read txt file into lines. """ with open(path) as f: lines = f.readlines() lines = [x.strip() for x in lines] return lines def ensure_dir(path): if not os.path.exists(path): os.makedirs(path, mode=0o755) def sorted_alphanum(file_list_ordered): def convert(text): return int(text) if text.isdigit() else text def alphanum_key(key): return [convert(c) for c in re.split('([0-9]+)', key)] return sorted(file_list_ordered, key=alphanum_key) def get_file_list(path, extension=None): if extension is None: file_list = [join(path, f) for f in listdir(path) if isfile(join(path, f))] else: file_list = [ join(path, f) for f in listdir(path) if isfile(join(path, f)) and splitext(f)[1] == extension ] file_list = sorted_alphanum(file_list) return file_list def get_file_list_specific(path, color_depth, extension=None): if extension is None: file_list = [join(path, f) for f in listdir(path) if isfile(join(path, f))] else: file_list = [ join(path, f) for f in listdir(path) if isfile(join(path, f)) and color_depth in f and splitext(f)[1] == extension ] file_list = sorted_alphanum(file_list) return file_list def get_folder_list(path): folder_list = [join(path, f) for f in listdir(path) if isdir(join(path, f))] folder_list = sorted_alphanum(folder_list) return folder_list def read_trajectory(filename, dim=4): class CameraPose: def __init__(self, meta, mat): self.metadata = meta self.pose = mat def __str__(self): return 'metadata : ' + ' '.join(map(str, self.metadata)) + '\n' + \ "pose : " + "\n" + np.array_str(self.pose) traj = [] with open(filename, 'r') as f: metastr = f.readline() while metastr: metadata = list(map(int, metastr.split())) mat = np.zeros(shape=(dim, dim)) for i in range(dim): matstr = f.readline() mat[i, :] = np.fromstring(matstr, dtype=float, sep=' \t') traj.append(CameraPose(metadata, mat)) metastr = f.readline() return traj ================================================ FILE: util/integration.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import open3d as o3d import argparse import os, sys import numpy as np def read_rgbd_image(color_file, depth_file, max_depth=4.5): ''' \return RGBD image ''' color = o3d.io.read_image(color_file) depth = o3d.io.read_image(depth_file) # We assume depth scale is always 1000.0 rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( color, depth, depth_trunc=max_depth, convert_rgb_to_intensity=False) return rgbd_image def read_pose(pose_file): ''' \return 4x4 np matrix ''' pose = np.loadtxt(pose_file) assert pose is not None return pose def read_intrinsics(intrinsic_file): ''' \return fx, fy, cx, cy ''' K = np.loadtxt(intrinsic_file) assert K is not None return K[0, 0], K[1, 1], K[0, 2], K[1, 2] def integrate_rgb_frames_for_fragment(color_files, depth_files, pose_files, seq_path, intrinsic, fragment_id, n_fragments, n_frames_per_fragment, voxel_length=0.008): volume = o3d.integration.ScalableTSDFVolume( voxel_length=voxel_length, sdf_trunc=0.04, color_type=o3d.integration.TSDFVolumeColorType.RGB8) start = fragment_id * n_frames_per_fragment end = min(start + n_frames_per_fragment, len(pose_files)) for i_abs in range(start, end): print("Fragment %03d / %03d :: integrate rgbd frame %d (%d of %d)." % (fragment_id, n_fragments - 1, i_abs, i_abs - start + 1, end - start)) rgbd = read_rgbd_image( os.path.join(seq_path, color_files[i_abs]), os.path.join(seq_path, depth_files[i_abs])) pose = read_pose(os.path.join(seq_path, pose_files[i_abs])) volume.integrate(rgbd, intrinsic, np.linalg.inv(pose)) mesh = volume.extract_triangle_mesh() return mesh def process_seq(seq_path, output_path, n_frames_per_fragment, display=False): files = os.listdir(seq_path) if 'intrinsics.txt' in files: fx, fy, cx, cy = read_intrinsics(os.path.join(seq_path, 'intrinsics.txt')) else: fx, fy, cx, cy = read_intrinsics(os.path.join(seq_path, '../camera-intrinsics.txt')) rgb_files = sorted(list(filter(lambda x: x.endswith('.color.png'), files))) depth_files = sorted(list(filter(lambda x: x.endswith('.depth.png'), files))) pose_files = sorted(list(filter(lambda x: x.endswith('.pose.txt'), files))) assert len(rgb_files) > 0 assert len(rgb_files) == len(depth_files) assert len(rgb_files) == len(pose_files) # get width and height to prepare for intrinsics rgb_sample = o3d.io.read_image(os.path.join(seq_path, rgb_files[0])) width, height = rgb_sample.get_max_bound() intrinsic = o3d.camera.PinholeCameraIntrinsic(int(width), int(height), fx, fy, cx, cy) n_fragments = ((len(rgb_files) + n_frames_per_fragment - 1)) // n_frames_per_fragment for fragment_id in range(0, n_fragments): mesh = integrate_rgb_frames_for_fragment(rgb_files, depth_files, pose_files, seq_path, intrinsic, fragment_id, n_fragments, n_frames_per_fragment) if display: o3d.visualization.draw_geometries([mesh]) mesh_name = os.path.join(output_seq_path, 'fragment-{}.ply'.format(fragment_id)) o3d.io.write_triangle_mesh(mesh_name, mesh) if __name__ == '__main__': parser = argparse.ArgumentParser( description='RGB-D integration for 3DMatch raw dataset') parser.add_argument( 'dataset', help='path to dataset that contains colors, depths and poses') parser.add_argument('output', help='path to output fragments') args = parser.parse_args() scene_name = args.dataset.split('/')[-1] if not os.path.exists(args.output): os.makedirs(args.output) output_scene_path = os.path.join(args.output, scene_name) if os.path.exists(output_scene_path): choice = input( 'Path {} already exists, continue? (Y / N)'.format(output_scene_path)) if choice != 'Y' and choice != 'y': print('abort') exit else: os.makedirs(output_scene_path) seqs = list(filter(lambda x: x.startswith('seq'), os.listdir(args.dataset))) for seq in seqs: output_seq_path = os.path.join(output_scene_path, seq) if not os.path.exists(output_seq_path): os.makedirs(output_seq_path) process_seq( os.path.join(args.dataset, seq), output_seq_path, n_frames_per_fragment=50, display=False) ================================================ FILE: util/pointcloud.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import copy import numpy as np import math import open3d as o3d from core.knn import find_knn_cpu def make_open3d_point_cloud(xyz, color=None): pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(xyz.cpu().detach().numpy()) if color is not None: if len(color) != len(xyz): color = np.tile(color, (len(xyz), 1)) pcd.colors = o3d.utility.Vector3dVector(color) return pcd def make_open3d_feature(data, dim, npts): feature = o3d.registration.Feature() feature.resize(dim, npts) feature.data = data.cpu().numpy().astype('d').transpose() return feature def make_open3d_feature_from_numpy(data): assert isinstance(data, np.ndarray) assert data.ndim == 2 feature = o3d.registration.Feature() feature.resize(data.shape[1], data.shape[0]) feature.data = data.astype('d').transpose() return feature def pointcloud_to_spheres(pcd, voxel_size, color, sphere_size=0.6): spheres = o3d.geometry.TriangleMesh() s = o3d.geometry.TriangleMesh.create_sphere(radius=voxel_size * sphere_size) s.compute_vertex_normals() s.paint_uniform_color(color) if isinstance(pcd, o3d.geometry.PointCloud): pcd = np.array(pcd.points) for i, p in enumerate(pcd): si = copy.deepcopy(s) trans = np.identity(4) trans[:3, 3] = p si.transform(trans) # si.paint_uniform_color(pcd.colors[i]) spheres += si return spheres def prepare_single_pointcloud(pcd, voxel_size): pcd.estimate_normals(o3d.KDTreeSearchParamHybrid(radius=voxel_size * 2.0, max_nn=30)) return pcd def prepare_pointcloud(filename, voxel_size): pcd = o3d.io.read_point_cloud(filename) T = get_random_transformation(pcd) pcd.transform(T) pcd_down = pcd.voxel_down_sample(voxel_size) return pcd_down, T def compute_overlap_ratio(pcd0, pcd1, trans, voxel_size): pcd0_down = pcd0.voxel_down_sample(voxel_size) pcd1_down = pcd1.voxel_down_sample(voxel_size) matching01 = get_matching_indices(pcd0_down, pcd1_down, trans, voxel_size, 1) matching10 = get_matching_indices(pcd1_down, pcd0_down, np.linalg.inv(trans), voxel_size, 1) overlap0 = len(matching01) / len(pcd0_down.points) overlap1 = len(matching10) / len(pcd1_down.points) return max(overlap0, overlap1) def get_matching_indices(source, target, trans, search_voxel_size, K=None): source_copy = copy.deepcopy(source) target_copy = copy.deepcopy(target) source_copy.transform(trans) pcd_tree = o3d.geometry.KDTreeFlann(target_copy) match_inds = [] for i, point in enumerate(source_copy.points): [_, idx, _] = pcd_tree.search_radius_vector_3d(point, search_voxel_size) if K is not None: idx = idx[:K] for j in idx: match_inds.append((i, j)) return match_inds def evaluate_feature(pcd0, pcd1, feat0, feat1, trans_gth, search_voxel_size): match_inds = get_matching_indices(pcd0, pcd1, trans_gth, search_voxel_size) pcd_tree = o3d.geometry.KDTreeFlann(feat1) dist = [] for ind in match_inds: k, idx, _ = pcd_tree.search_knn_vector_xd(feat0.data[:, ind[0]], 1) dist.append( np.clip(np.power(pcd1.points[ind[1]] - pcd1.points[idx[0]], 2), a_min=0.0, a_max=1.0)) return np.mean(dist) def valid_feat_ratio(pcd0, pcd1, feat0, feat1, trans_gth, thresh=0.1): pcd0_copy = copy.deepcopy(pcd0) pcd0_copy.transform(trans_gth) inds = find_knn_cpu(feat0, feat1) dist = np.sqrt(((np.array(pcd0_copy.points) - np.array(pcd1.points)[inds])**2).sum(1)) return np.mean(dist < thresh) def evaluate_feature_3dmatch(pcd0, pcd1, feat0, feat1, trans_gth, inlier_thresh=0.1): r"""Return the hit ratio (ratio of inlier correspondences and all correspondences). inliear_thresh is the inlier_threshold in meter. """ if len(pcd0.points) < len(pcd1.points): hit = valid_feat_ratio(pcd0, pcd1, feat0, feat1, trans_gth, inlier_thresh) else: hit = valid_feat_ratio(pcd1, pcd0, feat1, feat0, np.linalg.inv(trans_gth), inlier_thresh) return hit def get_matching_matrix(source, target, trans, voxel_size, debug_mode): source_copy = copy.deepcopy(source) target_copy = copy.deepcopy(target) source_copy.transform(trans) pcd_tree = o3d.geometry.KDTreeFlann(target_copy) matching_matrix = np.zeros((len(source_copy.points), len(target_copy.points))) for i, point in enumerate(source_copy.points): [k, idx, _] = pcd_tree.search_radius_vector_3d(point, voxel_size * 1.5) if k >= 1: matching_matrix[i, idx[0]] = 1 # TODO: only the cloest? return matching_matrix def get_random_transformation(pcd_input): def rot_x(x): out = np.zeros((3, 3)) c = math.cos(x) s = math.sin(x) out[0, 0] = 1 out[1, 1] = c out[1, 2] = -s out[2, 1] = s out[2, 2] = c return out def rot_y(x): out = np.zeros((3, 3)) c = math.cos(x) s = math.sin(x) out[0, 0] = c out[0, 2] = s out[1, 1] = 1 out[2, 0] = -s out[2, 2] = c return out def rot_z(x): out = np.zeros((3, 3)) c = math.cos(x) s = math.sin(x) out[0, 0] = c out[0, 1] = -s out[1, 0] = s out[1, 1] = c out[2, 2] = 1 return out pcd_output = copy.deepcopy(pcd_input) mean = np.mean(np.asarray(pcd_output.points), axis=0).transpose() xyz = np.random.uniform(0, 2 * math.pi, 3) R = np.dot(np.dot(rot_x(xyz[0]), rot_y(xyz[1])), rot_z(xyz[2])) T = np.zeros((4, 4)) T[:3, :3] = R T[:3, 3] = np.dot(-R, mean) T[3, 3] = 1 return T def draw_registration_result(source, target, transformation): source_temp = copy.deepcopy(source) target_temp = copy.deepcopy(target) source_temp.paint_uniform_color([1, 0.706, 0]) target_temp.paint_uniform_color([0, 0.651, 0.929]) source_temp.transform(transformation) o3d.visualization.draw_geometries([source_temp, target_temp]) ================================================ FILE: util/timer.py ================================================ # Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu) # # Please cite the following papers if you use any part of the code. # - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020 # - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019 # - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019 import time import numpy as np import torch class AverageMeter(object): """Computes and stores the average and current value""" def __init__(self): self.reset() def reset(self): self.val = 0 self.avg = 0 self.sum = 0.0 self.sq_sum = 0.0 self.count = 0 def update(self, val, n=1): if isinstance(val, np.ndarray): n = val.size val = val.mean() elif isinstance(val, torch.Tensor): n = val.nelement() val = val.mean().item() self.val = val self.sum += val * n self.count += n self.avg = self.sum / self.count self.sq_sum += val**2 * n self.var = self.sq_sum / self.count - self.avg ** 2 class Timer(AverageMeter): """A simple timer.""" def tic(self): # using time.time instead of time.clock because time time.clock # does not normalize for multithreading self.start_time = time.time() def toc(self, average=True): self.diff = time.time() - self.start_time self.update(self.diff) if average: return self.avg else: return self.diff