[
  {
    "path": ".gitignore",
    "content": "# Temp files\n.DS_Store\n__pycache__\n*.swp\n*.swo\n*.orig\n.idea\noutputs/\n*.pyc\n*.npy\n*.pdf\nutil/*.sh\ncheckpoints\n# *.npz\n3dmatch/\ntmp.txt\noutput.ply\nbunny.ply\ntest.sh\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Chris Choy (chrischoy@ai.stanford.edu), Wei Dong (weidong@andrew.cmu.edu)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n\nPlease cite the following papers if you use any part of the code.\n\n```\n@inproceedings{choy2020deep,\n  title={Deep Global Registration},\n  author={Choy, Christopher and Dong, Wei and Koltun, Vladlen},\n  booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},\n  year={2020}\n}\n\n@inproceedings{choy2019fully,\n    author = {Choy, Christopher and Park, Jaesik and Koltun, Vladlen},\n    title = {Fully Convolutional Geometric Features},\n    booktitle = {ICCV},\n    year = {2019},\n}\n\n@inproceedings{choy20194d,\n  title={4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks},\n  author={Choy, Christopher and Gwak, JunYoung and Savarese, Silvio},\n  booktitle={Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition},\n  year={2019}\n}\n```\n"
  },
  {
    "path": "README.md",
    "content": "# Deep Global Registration\n\n## Introduction\nThis repository contains python scripts for training and testing [Deep Global Registration, CVPR 2020 Oral](https://node1.chrischoy.org/data/publications/dgr/DGR.pdf).\nDeep Global Registration (DGR) proposes a differentiable framework for pairwise registration of real-world 3D scans. DGR consists of the following three modules:\n\n- a 6-dimensional convolutional network for correspondence confidence prediction\n- a differentiable Weighted Procrustes algorithm for closed-form pose estimation\n- a robust gradient-based SE(3) optimizer for pose refinement. \n\nFor more details, please check out\n\n- [CVPR 2020 oral paper](https://node1.chrischoy.org/data/publications/dgr/DGR.pdf)\n- [1min oral video](https://youtu.be/stzgn6DkozA)\n- [Full CVPR oral presentation](https://youtu.be/Iy17wvo07BU)\n\n[![1min oral](assets/1min-oral.png)](https://youtu.be/stzgn6DkozA)\n\n\n## Quick Pipleine Visualization\n| Indoor 3DMatch Registration | Outdoor KITTI Lidar Registration |\n|:---------------------------:|:---------------------------:|\n| ![](https://chrischoy.github.io/images/publication/dgr/text_100.gif) | ![](https://chrischoy.github.io/images/publication/dgr/kitti1_optimized.gif) |\n\n## Related Works\nRecent 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.\nWe 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.\n\n## Deep Global Registration\nThe 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.\n\nThe 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.\nThe 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.\n\nOur third component is a robust optimization module that fine-tunes the alignment produced by the Weighted Procrustes solver and the failure detection module.\nThis 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.\n\n## Configuration\nOur network is built on the [MinkowskiEngine](https://github.com/StanfordVL/MinkowskiEngine) and the system requirements are:\n\n- Ubuntu 14.04 or higher\n- <b>CUDA 10.1.243 or higher</b>\n- pytorch 1.5 or higher\n- python 3.6 or higher\n- GCC 7\n\nYou can install the MinkowskiEngine and the python requirements on your system with:\n\n```shell\n# Install MinkowskiEngine\nsudo apt install libopenblas-dev g++-7\npip install torch\nexport CXX=g++-7; pip install -U MinkowskiEngine --install-option=\"--blas=openblas\" -v\n\n# Download and setup DeepGlobalRegistration\ngit clone https://github.com/chrischoy/DeepGlobalRegistration.git\ncd DeepGlobalRegistration\npip install -r requirements.txt\n```\n\n## Demo\nYou may register your own data with relevant pretrained DGR models. 3DMatch is suitable for indoor RGB-D scans; KITTI is for outdoor LiDAR scans.\n\n| Inlier Model | FCGF model  | Dataset | Voxel Size    | Feature Dimension | Performance                | Link   |\n|:------------:|:-----------:|:-------:|:-------------:|:-----------------:|:--------------------------:|:------:|\n| 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) |\n| 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) |\n\n\n```shell\npython demo.py\n```\n\n| Input PointClouds           | Output Prediction           |\n|:---------------------------:|:---------------------------:|\n| ![](assets/demo_inputs.png) | ![](assets/demo_outputs.png) |\n\n\n## Experiments\n| Comparison | Speed vs. Recall Pareto Frontier |\n| -------  | --------------- |\n| ![Comparison](assets/comparison-3dmatch.png) | ![Frontier](assets/frontier.png) |\n\n\n## Training\nThe entire network depends on pretrained [FCGF models](https://github.com/chrischoy/FCGF#model-zoo). Please download corresponding models before training.\n| Model       | Normalized Feature  | Dataset | Voxel Size    | Feature Dimension |                  Link   |\n|:-----------:|:-------------------:|:-------:|:-------------:|:-----------------:|:------:|\n| ResUNetBN2C | True                | 3DMatch | 5cm   (0.05)  | 32                     | [download](https://node1.chrischoy.org/data/publications/fcgf/2019-08-16_19-21-47.pth) |\n| ResUNetBN2C | True                | KITTI   | 30cm  (0.3)   | 32                 | [download](https://node1.chrischoy.org/data/publications/fcgf/KITTI-v0.3-ResUNetBN2C-conv1-5-nout32.pth) |\n\n\n### 3DMatch\nYou may download preprocessed data and train via these commands:\n```shell\n./scripts/download_3dmatch.sh /path/to/3dmatch\nexport THREED_MATCH_DIR=/path/to/3dmatch; FCGF_WEIGHTS=/path/to/fcgf_3dmatch.pth ./scripts/train_3dmatch.sh\n```\n\n### KITTI\nFollow 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\n```shell\nexport KITTI_PATH=/path/to/kitti; FCGF_WEIGHTS=/path/to/fcgf_kitti.pth ./scripts/train_kitti.sh\n```\n\n## Testing\n3DMatch 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.\n\nTo evaluate trained model on 3DMatch or KITTI, you may use\n```shell\npython -m scripts.test_3dmatch --threed_match_dir /path/to/3dmatch_test/ --weights /path/to/dgr_3dmatch.pth\n```\nand\n```shell\npython -m scripts.test_kitti --kitti_dir /path/to/kitti/ --weights /path/to/dgr_kitti.pth\n```\n\n## Generate figures\nWe also provide experimental results of 3DMatch comparisons in `results.npz`. To reproduce figures we presented in the paper, you may use\n```shell\npython scripts/analyze_stats.py assets/results.npz\n```\n\n## Citing our work\nPlease cite the following papers if you use our code:\n\n```latex\n@inproceedings{choy2020deep,\n  title={Deep Global Registration},\n  author={Choy, Christopher and Dong, Wei and Koltun, Vladlen},\n  booktitle={CVPR},\n  year={2020}\n}\n\n@inproceedings{choy2019fully,\n  title = {Fully Convolutional Geometric Features},\n  author = {Choy, Christopher and Park, Jaesik and Koltun, Vladlen},\n  booktitle = {ICCV},\n  year = {2019}\n}\n\n@inproceedings{choy20194d,\n  title={4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks},\n  author={Choy, Christopher and Gwak, JunYoung and Savarese, Silvio},\n  booktitle={CVPR},\n  year={2019}\n}\n```\n\n## Concurrent Works\n\nThere have a number of 3D registration works published concurrently.\n\n- Gojcic et al., [Learning Multiview 3D Point Cloud Registration, CVPR'20](https://github.com/zgojcic/3D_multiview_reg)\n- Wang et al., [PRNet: Self-Supervised Learning for Partial-to-Partial Registration, NeurIPS'19](https://github.com/WangYueFt/prnet)\n- Yang et al., [TEASER: Fast and Certifiable Point Cloud Registration, arXiv'20](https://github.com/MIT-SPARK/TEASER-plusplus)\n"
  },
  {
    "path": "config.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport argparse\n\narg_lists = []\nparser = argparse.ArgumentParser()\n\n\ndef add_argument_group(name):\n  arg = parser.add_argument_group(name)\n  arg_lists.append(arg)\n  return arg\n\n\ndef str2bool(v):\n  return v.lower() in ('true', '1')\n\n\n# yapf: disable\nlogging_arg = add_argument_group('Logging')\nlogging_arg.add_argument('--out_dir', type=str, default='outputs')\n\ntrainer_arg = add_argument_group('Trainer')\ntrainer_arg.add_argument('--trainer', type=str, default='WeightedProcrustesTrainer')\n\n# Batch setting\ntrainer_arg.add_argument('--batch_size', type=int, default=4)\ntrainer_arg.add_argument('--val_batch_size', type=int, default=1)\n\n# Data loader configs\ntrainer_arg.add_argument('--train_phase', type=str, default=\"train\")\ntrainer_arg.add_argument('--val_phase', type=str, default=\"val\")\ntrainer_arg.add_argument('--test_phase', type=str, default=\"test\")\n\n# Data augmentation\ntrainer_arg.add_argument('--use_random_scale', type=str2bool, default=False)\ntrainer_arg.add_argument('--min_scale', type=float, default=0.8)\ntrainer_arg.add_argument('--max_scale', type=float, default=1.2)\n\ntrainer_arg.add_argument('--use_random_rotation', type=str2bool, default=True)\ntrainer_arg.add_argument('--rotation_range', type=float, default=360)\ntrainer_arg.add_argument(\n    '--positive_pair_search_voxel_size_multiplier', type=float, default=1.5)\n\ntrainer_arg.add_argument('--save_epoch_freq', type=int, default=1)\ntrainer_arg.add_argument('--val_epoch_freq', type=int, default=1)\n\ntrainer_arg.add_argument('--stat_freq', type=int, default=40, help='Frequency for writing stats to log')\ntrainer_arg.add_argument('--test_valid', type=str2bool, default=True)\ntrainer_arg.add_argument('--val_max_iter', type=int, default=400)\n\n\ntrainer_arg.add_argument('--use_balanced_loss', type=str2bool, default=False)\ntrainer_arg.add_argument('--inlier_direct_loss_weight', type=float, default=1.)\ntrainer_arg.add_argument('--procrustes_loss_weight', type=float, default=1.)\ntrainer_arg.add_argument('--trans_weight', type=float, default=1)\n\ntrainer_arg.add_argument('--eval_registration', type=str2bool, default=True)\ntrainer_arg.add_argument('--clip_weight_thresh', type=float, default=0.05, help='Weight threshold for detecting inliers')\ntrainer_arg.add_argument('--best_val_metric', type=str, default='succ_rate')\n\n# Inlier detection trainer\ninlier_arg = add_argument_group('Inlier')\ninlier_arg.add_argument('--inlier_model', type=str, default='ResUNetBN2C')\ninlier_arg.add_argument('--inlier_feature_type', type=str, default='ones')\ninlier_arg.add_argument('--inlier_conv1_kernel_size', type=int, default=3)\ninlier_arg.add_argument('--inlier_knn', type=int, default=1)\ninlier_arg.add_argument('--knn_search_method', type=str, default='gpu')\ninlier_arg.add_argument('--inlier_use_direct_loss', type=str2bool, default=True)\n\n# Feature specific configurations\nfeat_arg = add_argument_group('feat')\nfeat_arg.add_argument('--feat_model', type=str, default='SimpleNetBN2C')\nfeat_arg.add_argument('--feat_model_n_out', type=int, default=16, help='Feature dimension')\nfeat_arg.add_argument('--feat_conv1_kernel_size', type=int, default=3)\nfeat_arg.add_argument('--normalize_feature', type=str2bool, default=True)\nfeat_arg.add_argument('--use_xyz_feature', type=str2bool, default=False)\nfeat_arg.add_argument('--dist_type', type=str, default='L2')\n\n# Optimizer arguments\nopt_arg = add_argument_group('Optimizer')\nopt_arg.add_argument('--optimizer', type=str, default='SGD')\nopt_arg.add_argument('--max_epoch', type=int, default=100)\nopt_arg.add_argument('--lr', type=float, default=1e-1)\nopt_arg.add_argument('--momentum', type=float, default=0.8)\nopt_arg.add_argument('--sgd_momentum', type=float, default=0.9)\nopt_arg.add_argument('--sgd_dampening', type=float, default=0.1)\nopt_arg.add_argument('--adam_beta1', type=float, default=0.9)\nopt_arg.add_argument('--adam_beta2', type=float, default=0.999)\nopt_arg.add_argument('--weight_decay', type=float, default=1e-4)\nopt_arg.add_argument('--iter_size', type=int, default=1, help='accumulate gradient')\nopt_arg.add_argument('--bn_momentum', type=float, default=0.05)\nopt_arg.add_argument('--exp_gamma', type=float, default=0.99)\nopt_arg.add_argument('--scheduler', type=str, default='ExpLR')\nopt_arg.add_argument('--num_train_iter', type=int, default=-1, help='train N iter if positive')\nopt_arg.add_argument('--icp_cache_path', type=str, default=\"icp\")\n\n# Misc\nmisc_arg = add_argument_group('Misc')\nmisc_arg.add_argument('--use_gpu', type=str2bool, default=True)\nmisc_arg.add_argument('--weights', type=str, default=None)\nmisc_arg.add_argument('--weights_dir', type=str, default=None)\nmisc_arg.add_argument('--resume', type=str, default=None)\nmisc_arg.add_argument('--resume_dir', type=str, default=None)\nmisc_arg.add_argument('--train_num_workers', type=int, default=2)\nmisc_arg.add_argument('--val_num_workers', type=int, default=1)\nmisc_arg.add_argument('--test_num_workers', type=int, default=2)\nmisc_arg.add_argument('--fast_validation', type=str2bool, default=False)\nmisc_arg.add_argument('--nn_max_n', type=int, default=250, help='The maximum number of features to find nearest neighbors in batch')\n\n# Dataset specific configurations\ndata_arg = add_argument_group('Data')\ndata_arg.add_argument('--dataset', type=str, default='ThreeDMatchPairDataset03')\ndata_arg.add_argument('--voxel_size', type=float, default=0.025)\ndata_arg.add_argument('--threed_match_dir', type=str, default='.')\ndata_arg.add_argument('--kitti_dir', type=str, default=None, help=\"Path to the KITTI odometry dataset. This path should contain <kitti_dir>/dataset/sequences.\")\ndata_arg.add_argument('--kitti_max_time_diff', type=int, default=3, help='max time difference between pairs (non inclusive)')\ndata_arg.add_argument('--kitti_date', type=str, default='2011_09_26')\n\n# Evaluation\neval_arg = add_argument_group('Data')\neval_arg.add_argument('--hit_ratio_thresh', type=float, default=0.1)\neval_arg.add_argument('--success_rte_thresh', type=float, default=0.3, help='Success if the RTE below this (m)')\neval_arg.add_argument('--success_rre_thresh', type=float, default=15, help='Success if the RTE below this (degree)')\neval_arg.add_argument('--test_random_crop', action='store_true')\neval_arg.add_argument('--test_random_rotation', type=str2bool, default=False)\n\n# Demo\ndemo_arg = add_argument_group('demo')\ndemo_arg.add_argument('--pcd0', default=\"redkitchen_000.ply\", type=str)\ndemo_arg.add_argument('--pcd1', default=\"redkitchen_010.ply\", type=str)\n# yapf: enable\n\n\ndef get_config():\n  args = parser.parse_args()\n  return args\n"
  },
  {
    "path": "core/__init__.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\n"
  },
  {
    "path": "core/correspondence.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport copy\nimport numpy as np\n\nimport open3d as o3d\nimport torch\n\n\ndef _hash(arr, M=None):\n  if isinstance(arr, np.ndarray):\n    N, D = arr.shape\n  else:\n    N, D = len(arr[0]), len(arr)\n\n  hash_vec = np.zeros(N, dtype=np.int64)\n  for d in range(D):\n    if isinstance(arr, np.ndarray):\n      hash_vec += arr[:, d] * M**d\n    else:\n      hash_vec += arr[d] * M**d\n  return hash_vec\n\n\ndef find_correct_correspondence(pos_pairs, pred_pairs, hash_seed=None, len_batch=None):\n  assert len(pos_pairs) == len(pred_pairs)\n  if hash_seed is None:\n    assert len(len_batch) == len(pos_pairs)\n\n  corrects = []\n  for i, pos_pred in enumerate(zip(pos_pairs, pred_pairs)):\n    pos_pair, pred_pair = pos_pred\n    if isinstance(pos_pair, torch.Tensor):\n      pos_pair = pos_pair.numpy()\n    if isinstance(pred_pair, torch.Tensor):\n      pred_pair = pred_pair.numpy()\n\n    if hash_seed is None:\n      N0, N1 = len_batch[i]\n      _hash_seed = max(N0, N1)\n    else:\n      _hash_seed = hash_seed\n\n    pos_keys = _hash(pos_pair, _hash_seed)\n    pred_keys = _hash(pred_pair, _hash_seed)\n\n    corrects.append(np.isin(pred_keys, pos_keys, assume_unique=False))\n\n  return np.hstack(corrects)\n\n"
  },
  {
    "path": "core/deep_global_registration.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport os\nimport sys\nimport math\nimport logging\nimport open3d as o3d\nimport numpy as np\nimport time\nimport torch\nimport copy\nimport MinkowskiEngine as ME\n\nsys.path.append('.')\nfrom model import load_model\n\nfrom core.registration import GlobalRegistration\nfrom core.knn import find_knn_gpu\n\nfrom util.timer import Timer\nfrom util.pointcloud import make_open3d_point_cloud\n\n\n# Feature-based registrations in Open3D\ndef registration_ransac_based_on_feature_matching(pcd0, pcd1, feats0, feats1,\n                                                  distance_threshold, num_iterations):\n  assert feats0.shape[1] == feats1.shape[1]\n\n  source_feat = o3d.registration.Feature()\n  source_feat.resize(feats0.shape[1], len(feats0))\n  source_feat.data = feats0.astype('d').transpose()\n\n  target_feat = o3d.registration.Feature()\n  target_feat.resize(feats1.shape[1], len(feats1))\n  target_feat.data = feats1.astype('d').transpose()\n\n  result = o3d.registration.registration_ransac_based_on_feature_matching(\n      pcd0, pcd1, source_feat, target_feat, distance_threshold,\n      o3d.registration.TransformationEstimationPointToPoint(False), 4,\n      [o3d.registration.CorrespondenceCheckerBasedOnDistance(distance_threshold)],\n      o3d.registration.RANSACConvergenceCriteria(num_iterations, 1000))\n\n  return result.transformation\n\n\ndef registration_ransac_based_on_correspondence(pcd0, pcd1, idx0, idx1,\n                                                distance_threshold, num_iterations):\n  corres = np.stack((idx0, idx1), axis=1)\n  corres = o3d.utility.Vector2iVector(corres)\n\n  result = o3d.pipelines.registration.registration_ransac_based_on_correspondence(\n      source = pcd0,\n      target = pcd1,\n      corres = corres,\n      max_correspondence_distance = distance_threshold,\n      estimation_method = o3d.pipelines.registration.TransformationEstimationPointToPoint(False),\n      ransac_n = 4,\n      criteria = o3d.pipelines.registration.RANSACConvergenceCriteria(4000000, num_iterations))\n\n  return result.transformation\n\n\nclass DeepGlobalRegistration:\n  def __init__(self, config, device=torch.device('cuda')):\n    # Basic config\n    self.config = config\n    self.clip_weight_thresh = self.config.clip_weight_thresh\n    self.device = device\n\n    # Safeguard\n    self.safeguard_method = 'correspondence'  # correspondence, feature_matching\n\n    # Final tuning\n    self.use_icp = True\n\n    # Misc\n    self.feat_timer = Timer()\n    self.reg_timer = Timer()\n\n    # Model config loading\n    print(\"=> loading checkpoint '{}'\".format(config.weights))\n    assert os.path.exists(config.weights)\n\n    state = torch.load(config.weights)\n    network_config = state['config']\n    self.network_config = network_config\n    self.config.inlier_feature_type = network_config.inlier_feature_type\n    self.voxel_size = network_config.voxel_size\n    print(f'=> Setting voxel size to {self.voxel_size}')\n\n    # FCGF network initialization\n    num_feats = 1\n    try:\n      FCGFModel = load_model(network_config['feat_model'])\n      self.fcgf_model = FCGFModel(\n          num_feats,\n          network_config['feat_model_n_out'],\n          bn_momentum=network_config['bn_momentum'],\n          conv1_kernel_size=network_config['feat_conv1_kernel_size'],\n          normalize_feature=network_config['normalize_feature'])\n\n    except KeyError:  # legacy pretrained models\n      FCGFModel = load_model(network_config['model'])\n      self.fcgf_model = FCGFModel(num_feats,\n                                  network_config['model_n_out'],\n                                  bn_momentum=network_config['bn_momentum'],\n                                  conv1_kernel_size=network_config['conv1_kernel_size'],\n                                  normalize_feature=network_config['normalize_feature'])\n\n    self.fcgf_model.load_state_dict(state['state_dict'])\n    self.fcgf_model = self.fcgf_model.to(device)\n    self.fcgf_model.eval()\n\n    # Inlier network initialization\n    num_feats = 6 if network_config.inlier_feature_type == 'coords' else 1\n    InlierModel = load_model(network_config['inlier_model'])\n    self.inlier_model = InlierModel(\n        num_feats,\n        1,\n        bn_momentum=network_config['bn_momentum'],\n        conv1_kernel_size=network_config['inlier_conv1_kernel_size'],\n        normalize_feature=False,\n        D=6)\n\n    self.inlier_model.load_state_dict(state['state_dict_inlier'])\n    self.inlier_model = self.inlier_model.to(self.device)\n    self.inlier_model.eval()\n    print(\"=> loading finished\")\n\n  def preprocess(self, pcd):\n    '''\n    Stage 0: preprocess raw input point cloud\n    Input: raw point cloud\n    Output: voxelized point cloud with\n    - xyz:    unique point cloud with one point per voxel\n    - coords: coords after voxelization\n    - feats:  dummy feature placeholder for general sparse convolution\n    '''\n    if isinstance(pcd, o3d.geometry.PointCloud):\n      xyz = np.array(pcd.points)\n    elif isinstance(pcd, np.ndarray):\n      xyz = pcd\n    else:\n      raise Exception('Unrecognized pcd type')\n\n    # Voxelization:\n    # Maintain double type for xyz to improve numerical accuracy in quantization\n    _, sel = ME.utils.sparse_quantize(xyz / self.voxel_size, return_index=True)\n    npts = len(sel)\n\n    xyz = torch.from_numpy(xyz[sel]).to(self.device)\n\n    # ME standard batch coordinates\n    coords = ME.utils.batched_coordinates([torch.floor(xyz / self.voxel_size).int()], device=self.device)\n    feats = torch.ones(npts, 1)\n\n    return xyz.float(), coords, feats\n\n  def fcgf_feature_extraction(self, feats, coords):\n    '''\n    Step 1: extract fast and accurate FCGF feature per point\n    '''\n    sinput = ME.SparseTensor(feats, coordinates=coords, device=self.device)\n\n    return self.fcgf_model(sinput).F\n\n  def fcgf_feature_matching(self, feats0, feats1):\n    '''\n    Step 2: coarsely match FCGF features to generate initial correspondences\n    '''\n    nns = find_knn_gpu(feats0,\n                       feats1,\n                       nn_max_n=self.network_config.nn_max_n,\n                       knn=1,\n                       return_distance=False)\n    corres_idx0 = torch.arange(len(nns)).long().squeeze().to(self.device)\n    corres_idx1 = nns.long().squeeze()\n\n    return corres_idx0, corres_idx1\n\n  def inlier_feature_generation(self, xyz0, xyz1, coords0, coords1, fcgf_feats0,\n                                fcgf_feats1, corres_idx0, corres_idx1):\n    '''\n    Step 3: generate features for inlier prediction\n    '''\n    assert len(corres_idx0) == len(corres_idx1)\n\n    feat_type = self.config.inlier_feature_type\n    assert feat_type in ['ones', 'feats', 'coords']\n\n    corres_idx0 = corres_idx0.to(self.device)\n    corres_idx1 = corres_idx1.to(self.device)\n\n    if feat_type == 'ones':\n      feat = torch.ones((len(corres_idx0), 1)).float()\n    elif feat_type == 'feats':\n      feat = torch.cat((fcgf_feats0[corres_idx0], fcgf_feats1[corres_idx1]), dim=1)\n    elif feat_type == 'coords':\n      feat = torch.cat((torch.cos(xyz0[corres_idx0]), torch.cos(xyz1[corres_idx1])),\n                       dim=1)\n    else:  # should never reach here\n      raise TypeError('Undefined feature type')\n\n    return feat\n\n  def inlier_prediction(self, inlier_feats, coords):\n    '''\n    Step 4: predict inlier likelihood\n    '''\n    sinput = ME.SparseTensor(inlier_feats, coordinates=coords, device=self.device)\n    soutput = self.inlier_model(sinput)\n\n    return soutput.F\n\n  def safeguard_registration(self, pcd0, pcd1, idx0, idx1, feats0, feats1,\n                             distance_threshold, num_iterations):\n    if self.safeguard_method == 'correspondence':\n      T = registration_ransac_based_on_correspondence(pcd0,\n                                                      pcd1,\n                                                      idx0.cpu().numpy(),\n                                                      idx1.cpu().numpy(),\n                                                      distance_threshold,\n                                                      num_iterations=num_iterations)\n    elif self.safeguard_method == 'fcgf_feature_matching':\n      T = registration_ransac_based_on_fcgf_feature_matching(pcd0, pcd1,\n                                                             feats0.cpu().numpy(),\n                                                             feats1.cpu().numpy(),\n                                                             distance_threshold,\n                                                             num_iterations)\n    else:\n      raise ValueError('Undefined')\n    return T\n\n  def register(self, xyz0, xyz1, inlier_thr=0.00):\n    '''\n    Main algorithm of DeepGlobalRegistration\n    '''\n    self.reg_timer.tic()\n    with torch.no_grad():\n      # Step 0: voxelize and generate sparse input\n      xyz0, coords0, feats0 = self.preprocess(xyz0)\n      xyz1, coords1, feats1 = self.preprocess(xyz1)\n\n      # Step 1: Feature extraction\n      self.feat_timer.tic()\n      fcgf_feats0 = self.fcgf_feature_extraction(feats0, coords0)\n      fcgf_feats1 = self.fcgf_feature_extraction(feats1, coords1)\n      self.feat_timer.toc()\n\n      # Step 2: Coarse correspondences\n      corres_idx0, corres_idx1 = self.fcgf_feature_matching(fcgf_feats0, fcgf_feats1)\n\n      # Step 3: Inlier feature generation\n      # coords[corres_idx0]: 1D temporal + 3D spatial coord\n      # coords[corres_idx1, 1:]: 3D spatial coord\n      # => 1D temporal + 6D spatial coord\n      inlier_coords = torch.cat((coords0[corres_idx0], coords1[corres_idx1, 1:]),\n                                dim=1).int()\n      inlier_feats = self.inlier_feature_generation(xyz0, xyz1, coords0, coords1,\n                                                    fcgf_feats0, fcgf_feats1,\n                                                    corres_idx0, corres_idx1)\n\n      # Step 4: Inlier likelihood estimation and truncation\n      logit = self.inlier_prediction(inlier_feats.contiguous(), coords=inlier_coords)\n      weights = logit.sigmoid()\n      if self.clip_weight_thresh > 0:\n        weights[weights < self.clip_weight_thresh] = 0\n      wsum = weights.sum().item()\n\n    # Step 5: Registration. Note: torch's gradient may be required at this stage\n    # > Case 0: Weighted Procrustes + Robust Refinement\n    wsum_threshold = max(200, len(weights) * 0.05)\n    sign = '>=' if wsum >= wsum_threshold else '<'\n    print(f'=> Weighted sum {wsum:.2f} {sign} threshold {wsum_threshold}')\n\n    T = np.identity(4)\n    if wsum >= wsum_threshold:\n      try:\n        rot, trans, opt_output = GlobalRegistration(xyz0[corres_idx0],\n                                                    xyz1[corres_idx1],\n                                                    weights=weights.detach(),\n                                                    break_threshold_ratio=1e-4,\n                                                    quantization_size=2 *\n                                                    self.voxel_size,\n                                                    verbose=False)\n        T[0:3, 0:3] = rot.detach().cpu().numpy()\n        T[0:3, 3] = trans.detach().cpu().numpy()\n        dgr_time = self.reg_timer.toc()\n        print(f'=> DGR takes {dgr_time:.2} s')\n\n      except RuntimeError:\n        # Will directly go to Safeguard\n        print('###############################################')\n        print('# WARNING: SVD failed, weights sum: ', wsum)\n        print('# Falling back to Safeguard')\n        print('###############################################')\n\n    else:\n      # > Case 1: Safeguard RANSAC + (Optional) ICP\n      pcd0 = make_open3d_point_cloud(xyz0)\n      pcd1 = make_open3d_point_cloud(xyz1)\n      T = self.safeguard_registration(pcd0,\n                                      pcd1,\n                                      corres_idx0,\n                                      corres_idx1,\n                                      feats0,\n                                      feats1,\n                                      2 * self.voxel_size,\n                                      num_iterations=80000)\n      safeguard_time = self.reg_timer.toc()\n      print(f'=> Safeguard takes {safeguard_time:.2} s')\n\n    if self.use_icp:\n      T = o3d.pipelines.registration.registration_icp(\n          source=make_open3d_point_cloud(xyz0),\n          target=make_open3d_point_cloud(xyz1),\n          max_correspondence_distance=self.voxel_size * 2,\n          init=T).transformation\n\n    return T\n"
  },
  {
    "path": "core/knn.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport numpy as np\nfrom scipy.spatial import cKDTree\n\nfrom core.metrics import pdist\n\n\ndef find_knn_cpu(feat0, feat1, knn=1, return_distance=False):\n  feat1tree = cKDTree(feat1)\n  dists, nn_inds = feat1tree.query(feat0, k=knn, n_jobs=-1)\n  if return_distance:\n    return nn_inds, dists\n  else:\n    return nn_inds\n\n\ndef find_knn_gpu(F0, F1, nn_max_n=-1, knn=1, return_distance=False):\n\n  def knn_dist(f0, f1, knn=1, dist_type='L2'):\n    knn_dists, knn_inds = [], []\n    with torch.no_grad():\n      dist = pdist(f0, f1, dist_type=dist_type)\n      min_dist, ind = dist.min(dim=1, keepdim=True)\n\n      knn_dists.append(min_dist)\n      knn_inds.append(ind)\n\n      if knn > 1:\n        for k in range(knn - 1):\n          NR, NC = dist.shape\n          flat_ind = (torch.arange(NR) * NC).type_as(ind) + ind.squeeze()\n          dist.view(-1)[flat_ind] = np.inf\n          min_dist, ind = dist.min(dim=1, keepdim=True)\n\n          knn_dists.append(min_dist)\n          knn_inds.append(ind)\n\n    min_dist = torch.cat(knn_dists, 1)\n    ind = torch.cat(knn_inds, 1)\n\n    return min_dist, ind\n\n  # Too much memory if F0 or F1 large. Divide the F0\n  if nn_max_n > 1:\n    N = len(F0)\n    C = int(np.ceil(N / nn_max_n))\n    stride = nn_max_n\n    dists, inds = [], []\n\n    for i in range(C):\n      with torch.no_grad():\n        dist, ind = knn_dist(F0[i * stride:(i + 1) * stride], F1, knn=knn, dist_type='L2')\n      dists.append(dist)\n      inds.append(ind)\n\n    dists = torch.cat(dists)\n    inds = torch.cat(inds)\n    assert len(inds) == N\n\n  else:\n    dist = pdist(F0, F1, dist_type='SquareL2')\n    min_dist, inds = dist.min(dim=1)\n    dists = min_dist.detach().unsqueeze(1) #.cpu()\n    # inds = inds.cpu()\n  if return_distance:\n    return inds, dists\n  else:\n    return inds\n\n\ndef find_knn_batch(F0,\n                   F1,\n                   len_batch,\n                   return_distance=False,\n                   nn_max_n=-1,\n                   knn=1,\n                   search_method=None,\n                   concat_results=False):\n  if search_method is None or search_method == 'gpu':\n    return find_knn_gpu_batch(\n        F0,\n        F1,\n        len_batch=len_batch,\n        nn_max_n=nn_max_n,\n        knn=knn,\n        return_distance=return_distance,\n        concat_results=concat_results)\n  elif search_method == 'cpu':\n    return find_knn_cpu_batch(\n        F0,\n        F1,\n        len_batch=len_batch,\n        knn=knn,\n        return_distance=return_distance,\n        concat_results=concat_results)\n  else:\n    raise ValueError(f'Search method {search_method} not defined')\n\n\ndef find_knn_gpu_batch(F0,\n                       F1,\n                       len_batch,\n                       nn_max_n=-1,\n                       knn=1,\n                       return_distance=False,\n                       concat_results=False):\n  dists, nns = [], []\n  start0, start1 = 0, 0\n  for N0, N1 in len_batch:\n    nn = find_knn_gpu(\n        F0[start0:start0 + N0],\n        F1[start1:start1 + N1],\n        nn_max_n=nn_max_n,\n        knn=knn,\n        return_distance=return_distance)\n    if return_distance:\n      nn, dist = nn\n      dists.append(dist)\n    if concat_results:\n      nns.append(nn + start1)\n    else:\n      nns.append(nn)\n    start0 += N0\n    start1 += N1\n\n  if concat_results:\n    nns = torch.cat(nns)\n    if return_distance:\n      dists = torch.cat(dists)\n\n  if return_distance:\n    return nns, dists\n  else:\n    return nns\n\n\ndef find_knn_cpu_batch(F0,\n                       F1,\n                       len_batch,\n                       knn=1,\n                       return_distance=False,\n                       concat_results=False):\n  if not isinstance(F0, np.ndarray):\n    F0 = F0.detach().cpu().numpy()\n    F1 = F1.detach().cpu().numpy()\n\n  dists, nns = [], []\n  start0, start1 = 0, 0\n  for N0, N1 in len_batch:\n    nn = find_knn_cpu(\n        F0[start0:start0 + N0], F1[start1:start1 + N1], return_distance=return_distance)\n    if return_distance:\n      nn, dist = nn\n      dists.append(dist)\n    if concat_results:\n      nns.append(nn + start1)\n    else:\n      nns.append(nn + start1)\n    start0 += N0\n    start1 += N1\n\n  if concat_results:\n    nns = np.hstack(nns)\n    if return_distance:\n      dists = np.hstack(dists)\n\n  if return_distance:\n    return torch.from_numpy(nns), torch.from_numpy(dists)\n  else:\n    return torch.from_numpy(nns)\n"
  },
  {
    "path": "core/loss.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport torch.nn as nn\n\nimport numpy as np\n\n\nclass UnbalancedLoss(nn.Module):\n  NUM_LABELS = 2\n\n  def __init__(self):\n    super().__init__()\n    self.crit = nn.BCEWithLogitsLoss()\n\n  def forward(self, logits, label):\n    return self.crit(logits, label.to(torch.float))\n\n\nclass BalancedLoss(nn.Module):\n  NUM_LABELS = 2\n\n  def __init__(self):\n    super().__init__()\n    self.crit = nn.BCEWithLogitsLoss()\n\n  def forward(self, logits, label):\n    assert torch.all(label < self.NUM_LABELS)\n    loss = torch.scalar_tensor(0.).to(logits)\n    for i in range(self.NUM_LABELS):\n      target_mask = label == i\n      if torch.any(target_mask):\n        loss += self.crit(logits[target_mask], label[target_mask].to(\n            torch.float)) / self.NUM_LABELS\n    return loss\n\n\nclass HighDimSmoothL1Loss:\n\n  def __init__(self, weights, quantization_size=1, eps=np.finfo(np.float32).eps):\n    self.eps = eps\n    self.quantization_size = quantization_size\n    self.weights = weights\n    if self.weights is not None:\n      self.w1 = weights.sum()\n\n  def __call__(self, X, Y):\n    sq_dist = torch.sum(((X - Y) / self.quantization_size)**2, axis=1, keepdim=True)\n    use_sq_half = 0.5 * (sq_dist < 1).float()\n\n    loss = (0.5 - use_sq_half) * (torch.sqrt(sq_dist + self.eps) -\n                                  0.5) + use_sq_half * sq_dist\n\n    if self.weights is None:\n      return loss.mean()\n    else:\n      return (loss * self.weights).sum() / self.w1\n"
  },
  {
    "path": "core/metrics.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport torch.functional as F\n\n\ndef rotation_mat2angle(R):\n  return torch.acos(torch.clamp((torch.trace(R) - 1) / 2, -0.9999, 0.9999))\n\n\ndef rotation_error(R1, R2):\n  assert R1.shape == R2.shape\n  return torch.acos(torch.clamp((torch.trace(torch.mm(R1.t(), R2)) - 1) / 2, -0.9999, 0.9999))\n\n\ndef translation_error(t1, t2):\n  assert t1.shape == t2.shape\n  return torch.sqrt(((t1 - t2)**2).sum())\n\n\ndef batch_rotation_error(rots1, rots2):\n  r\"\"\"\n  arccos( (tr(R_1^T R_2) - 1) / 2 )\n  rots1: B x 3 x 3 or B x 9\n  rots1: B x 3 x 3 or B x 9\n  \"\"\"\n  assert len(rots1) == len(rots2)\n  trace_r1Tr2 = (rots1.reshape(-1, 9) * rots2.reshape(-1, 9)).sum(1)\n  side = (trace_r1Tr2 - 1) / 2\n  return torch.acos(torch.clamp(side, min=-0.999, max=0.999))\n\n\ndef batch_translation_error(trans1, trans2):\n  r\"\"\"\n  trans1: B x 3\n  trans2: B x 3\n  \"\"\"\n  assert len(trans1) == len(trans2)\n  return torch.norm(trans1 - trans2, p=2, dim=1, keepdim=False)\n\n\n\ndef eval_metrics(output, target):\n  output = (F.sigmoid(output) > 0.5)\n  target = target\n  return torch.norm(output - target)\n\n\ndef corr_dist(est, gth, xyz0, xyz1, weight=None, max_dist=1):\n  xyz0_est = xyz0 @ est[:3, :3].t() + est[:3, 3]\n  xyz0_gth = xyz0 @ gth[:3, :3].t() + gth[:3, 3]\n  dists = torch.clamp(torch.sqrt(((xyz0_est - xyz0_gth).pow(2)).sum(1)), max=max_dist)\n  if weight is not None:\n    dists = weight * dists\n  return dists.mean()\n\n\ndef pdist(A, B, dist_type='L2'):\n  if dist_type == 'L2':\n    D2 = torch.sum((A.unsqueeze(1) - B.unsqueeze(0)).pow(2), 2)\n    return torch.sqrt(D2 + 1e-7)\n  elif dist_type == 'SquareL2':\n    return torch.sum((A.unsqueeze(1) - B.unsqueeze(0)).pow(2), 2)\n  else:\n    raise NotImplementedError('Not implemented')\n\n\ndef get_loss_fn(loss):\n  if loss == 'corr_dist':\n    return corr_dist\n  else:\n    raise ValueError(f'Loss {loss}, not defined')\n"
  },
  {
    "path": "core/registration.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport numpy as np\n\nimport torch\nimport torch.optim as optim\n\nfrom core.knn import pdist\nfrom core.loss import HighDimSmoothL1Loss\n\n\ndef ortho2rotation(poses):\n  r\"\"\"\n  poses: batch x 6\n  \"\"\"\n  def normalize_vector(v):\n    r\"\"\"\n    Batch x 3\n    \"\"\"\n    v_mag = torch.sqrt((v**2).sum(1, keepdim=True))\n    v_mag = torch.clamp(v_mag, min=1e-8)\n    v = v / v_mag\n    return v\n\n  def cross_product(u, v):\n    r\"\"\"\n    u: batch x 3\n    v: batch x 3\n    \"\"\"\n    i = u[:, 1] * v[:, 2] - u[:, 2] * v[:, 1]\n    j = u[:, 2] * v[:, 0] - u[:, 0] * v[:, 2]\n    k = u[:, 0] * v[:, 1] - u[:, 1] * v[:, 0]\n\n    i = i[:, None]\n    j = j[:, None]\n    k = k[:, None]\n    return torch.cat((i, j, k), 1)\n\n  def proj_u2a(u, a):\n    r\"\"\"\n    u: batch x 3\n    a: batch x 3\n    \"\"\"\n    inner_prod = (u * a).sum(1, keepdim=True)\n    norm2 = (u**2).sum(1, keepdim=True)\n    norm2 = torch.clamp(norm2, min=1e-8)\n    factor = inner_prod / norm2\n    return factor * u\n\n  x_raw = poses[:, 0:3]\n  y_raw = poses[:, 3:6]\n\n  x = normalize_vector(x_raw)\n  y = normalize_vector(y_raw - proj_u2a(x, y_raw))\n  z = cross_product(x, y)\n\n  x = x[:, :, None]\n  y = y[:, :, None]\n  z = z[:, :, None]\n  return torch.cat((x, y, z), 2)\n\n\ndef argmin_se3_squared_dist(X, Y):\n  \"\"\"\n  X: torch tensor N x 3\n  Y: torch tensor N x 3\n  \"\"\"\n  # https://ieeexplore.ieee.org/document/88573\n  assert len(X) == len(Y)\n  mux = X.mean(0, keepdim=True)\n  muy = Y.mean(0, keepdim=True)\n\n  Sxy = (Y - muy).t().mm(X - mux) / len(X)\n  U, D, V = Sxy.svd()\n  # svd = gesvd.GESVDFunction()\n  # U, S, V = svd.apply(Sxy)\n  # S[-1, -1] = U.det() * V.det()\n  S = torch.eye(3)\n  if U.det() * V.det() < 0:\n    S[-1, -1] = -1\n\n  R = U.mm(S.mm(V.t()))\n  t = muy.squeeze() - R.mm(mux.t()).squeeze()\n  return R, t\n\n\ndef weighted_procrustes(X, Y, w, eps):\n  \"\"\"\n  X: torch tensor N x 3\n  Y: torch tensor N x 3\n  w: torch tensor N\n  \"\"\"\n  # https://ieeexplore.ieee.org/document/88573\n  assert len(X) == len(Y)\n  W1 = torch.abs(w).sum()\n  w_norm = w / (W1 + eps)\n  mux = (w_norm * X).sum(0, keepdim=True)\n  muy = (w_norm * Y).sum(0, keepdim=True)\n\n  # Use CPU for small arrays\n  Sxy = (Y - muy).t().mm(w_norm * (X - mux)).cpu().double()\n  U, D, V = Sxy.svd()\n  S = torch.eye(3).double()\n  if U.det() * V.det() < 0:\n    S[-1, -1] = -1\n\n  R = U.mm(S.mm(V.t())).float()\n  t = (muy.cpu().squeeze() - R.mm(mux.cpu().t()).squeeze()).float()\n  return R, t\n\n\nclass Transformation(torch.nn.Module):\n  def __init__(self, R_init=None, t_init=None):\n    torch.nn.Module.__init__(self)\n    rot_init = torch.rand(1, 6)\n    trans_init = torch.zeros(1, 3)\n    if R_init is not None:\n      rot_init[0, :3] = R_init[:, 0]\n      rot_init[0, 3:] = R_init[:, 1]\n    if t_init is not None:\n      trans_init[0] = t_init\n\n    self.rot6d = torch.nn.Parameter(rot_init)\n    self.trans = torch.nn.Parameter(trans_init)\n\n  def forward(self, points):\n    rot_mat = ortho2rotation(self.rot6d)\n    return points @ rot_mat[0].t() + self.trans\n\n\ndef GlobalRegistration(points,\n        trans_points,\n        weights=None,\n        max_iter=1000,\n        verbose=False,\n        stat_freq=20,\n        max_break_count=20,\n        break_threshold_ratio=1e-5,\n        loss_fn=None,\n        quantization_size=1):\n  if isinstance(points, np.ndarray):\n    points = torch.from_numpy(points).float()\n\n  if isinstance(trans_points, np.ndarray):\n    trans_points = torch.from_numpy(trans_points).float()\n\n  if loss_fn is None:\n    if weights is not None:\n      weights.requires_grad = False\n    loss_fn = HighDimSmoothL1Loss(weights, quantization_size)\n\n  if weights is None:\n    # Get the initialization using https://ieeexplore.ieee.org/document/88573\n    R, t = argmin_se3_squared_dist(points, trans_points)\n  else:\n    R, t = weighted_procrustes(points, trans_points, weights, loss_fn.eps)\n  transformation = Transformation(R, t).to(points.device)\n\n  optimizer = optim.Adam(transformation.parameters(), lr=1e-1)\n  scheduler = optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.999)\n  loss_prev = loss_fn(transformation(points), trans_points).item()\n  break_counter = 0\n\n  # Transform points\n  for i in range(max_iter):\n    new_points = transformation(points)\n    loss = loss_fn(new_points, trans_points)\n    if loss.item() < 1e-7:\n      break\n\n    optimizer.zero_grad()\n    loss.backward()\n    optimizer.step()\n    scheduler.step()\n    if i % stat_freq == 0 and verbose:\n      print(i, scheduler.get_lr(), loss.item())\n\n    if abs(loss_prev - loss.item()) < loss_prev * break_threshold_ratio:\n      break_counter += 1\n      if break_counter >= max_break_count:\n        break\n\n    loss_prev = loss.item()\n\n  rot6d = transformation.rot6d.detach()\n  trans = transformation.trans.detach()\n\n  opt_result = {'iterations': i, 'loss': loss.item(), 'break_count': break_counter}\n\n  return ortho2rotation(rot6d)[0], trans, opt_result\n"
  },
  {
    "path": "core/trainer.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\n# Written by Chris Choy <chrischoy@ai.stanford.edu>\n# Distributed under MIT License\nimport time\nimport os\nimport os.path as osp\nimport gc\nimport logging\nimport numpy as np\nimport json\n\nimport torch\nimport torch.optim as optim\nimport torch.nn.functional as F\nfrom tensorboardX import SummaryWriter\n\nfrom model import load_model\nfrom core.knn import find_knn_batch\nfrom core.correspondence import find_correct_correspondence\nfrom core.loss import UnbalancedLoss, BalancedLoss\nfrom core.metrics import batch_rotation_error, batch_translation_error\nimport core.registration as GlobalRegistration\n\nfrom util.timer import Timer, AverageMeter\nfrom util.file import ensure_dir\n\nimport MinkowskiEngine as ME\n\neps = np.finfo(float).eps\nnp2th = torch.from_numpy\n\n\nclass WeightedProcrustesTrainer:\n  def __init__(self, config, data_loader, val_data_loader=None):\n    # occupancy only for 3D Match dataset. For ScanNet, use RGB 3 channels.\n    num_feats = 3 if config.use_xyz_feature else 1\n\n    # Feature model initialization\n    if config.use_gpu and not torch.cuda.is_available():\n      logging.warning('Warning: There\\'s no CUDA support on this machine, '\n                      'training is performed on CPU.')\n      raise ValueError('GPU not available, but cuda flag set')\n    self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\n    self.config = config\n\n    # Training config\n    self.max_epoch = config.max_epoch\n    self.start_epoch = 1\n    self.checkpoint_dir = config.out_dir\n\n    self.data_loader = data_loader\n    self.train_data_loader_iter = self.data_loader.__iter__()\n\n    self.iter_size = config.iter_size\n    self.batch_size = data_loader.batch_size\n\n    # Validation config\n    self.val_max_iter = config.val_max_iter\n    self.val_epoch_freq = config.val_epoch_freq\n    self.best_val_metric = config.best_val_metric\n    self.best_val_epoch = -np.inf\n    self.best_val = -np.inf\n\n    self.val_data_loader = val_data_loader\n    self.test_valid = True if self.val_data_loader is not None else False\n\n    # Logging\n    self.log_step = int(np.sqrt(self.config.batch_size))\n    self.writer = SummaryWriter(config.out_dir)\n\n    # Model\n    FeatModel = load_model(config.feat_model)\n    InlierModel = load_model(config.inlier_model)\n\n    num_feats = 6 if self.config.inlier_feature_type == 'coords' else 1\n    self.feat_model = FeatModel(num_feats,\n                                config.feat_model_n_out,\n                                bn_momentum=config.bn_momentum,\n                                conv1_kernel_size=config.feat_conv1_kernel_size,\n                                normalize_feature=config.normalize_feature).to(\n                                    self.device)\n    logging.info(self.feat_model)\n\n    self.inlier_model = InlierModel(num_feats,\n                                    1,\n                                    bn_momentum=config.bn_momentum,\n                                    conv1_kernel_size=config.inlier_conv1_kernel_size,\n                                    normalize_feature=False,\n                                    D=6).to(self.device)\n    logging.info(self.inlier_model)\n\n    # Loss and optimizer\n    self.clip_weight_thresh = self.config.clip_weight_thresh\n    if self.config.use_balanced_loss:\n      self.crit = BalancedLoss()\n    else:\n      self.crit = UnbalancedLoss()\n\n    self.optimizer = getattr(optim, config.optimizer)(self.inlier_model.parameters(),\n                                                      lr=config.lr,\n                                                      momentum=config.momentum,\n                                                      weight_decay=config.weight_decay)\n    self.scheduler = optim.lr_scheduler.ExponentialLR(self.optimizer, config.exp_gamma)\n\n    # Output preparation\n    ensure_dir(self.checkpoint_dir)\n    json.dump(config,\n              open(os.path.join(self.checkpoint_dir, 'config.json'), 'w'),\n              indent=4,\n              sort_keys=False)\n\n    self._load_weights(config)\n\n  def train(self):\n    \"\"\"\n    Major interface\n    Full training logic: train, valid, and save\n    \"\"\"\n    # Baseline random feature performance\n    if self.test_valid:\n      val_dict = self._valid_epoch()\n      for k, v in val_dict.items():\n        self.writer.add_scalar(f'val/{k}', v, 0)\n\n    # Train and valid\n    for epoch in range(self.start_epoch, self.max_epoch + 1):\n      lr = self.scheduler.get_lr()\n      logging.info(f\" Epoch: {epoch}, LR: {lr}\")\n      self._train_epoch(epoch)\n      self._save_checkpoint(epoch)\n      self.scheduler.step()\n\n      if self.test_valid and epoch % self.val_epoch_freq == 0:\n        val_dict = self._valid_epoch()\n        for k, v in val_dict.items():\n          self.writer.add_scalar(f'val/{k}', v, epoch)\n\n        if self.best_val < val_dict[self.best_val_metric]:\n          logging.info(\n              f'Saving the best val model with {self.best_val_metric}: {val_dict[self.best_val_metric]}'\n          )\n          self.best_val = val_dict[self.best_val_metric]\n          self.best_val_epoch = epoch\n          self._save_checkpoint(epoch, 'best_val_checkpoint')\n\n        else:\n          logging.info(\n              f'Current best val model with {self.best_val_metric}: {self.best_val} at epoch {self.best_val_epoch}'\n          )\n\n  def _train_epoch(self, epoch):\n    gc.collect()\n\n    # Fix the feature model and train the inlier model\n    self.feat_model.eval()\n    self.inlier_model.train()\n\n    # Epoch starts from 1\n    total_loss, total_num = 0, 0.0\n    data_loader = self.data_loader\n    iter_size = self.iter_size\n\n    # Meters for statistics\n    average_valid_meter = AverageMeter()\n    loss_meter = AverageMeter()\n    data_meter = AverageMeter()\n    regist_succ_meter = AverageMeter()\n    regist_rte_meter = AverageMeter()\n    regist_rre_meter = AverageMeter()\n\n    # Timers for profiling\n    data_timer = Timer()\n    nn_timer = Timer()\n    inlier_timer = Timer()\n    total_timer = Timer()\n\n    if self.config.num_train_iter > 0:\n      num_train_iter = self.config.num_train_iter\n    else:\n      num_train_iter = len(data_loader) // iter_size\n    start_iter = (epoch - 1) * num_train_iter\n\n    tp, fp, tn, fn = 0, 0, 0, 0\n\n    # Iterate over batches\n    for curr_iter in range(num_train_iter):\n      self.optimizer.zero_grad()\n\n      batch_loss, data_time = 0, 0\n      total_timer.tic()\n\n      for iter_idx in range(iter_size):\n        data_timer.tic()\n        input_dict = self.get_data(self.train_data_loader_iter)\n        data_time += data_timer.toc(average=False)\n\n        # Initial inlier prediction with FCGF and KNN matching\n        reg_coords, reg_feats, pred_pairs, is_correct, feat_time, nn_time = self.generate_inlier_input(\n            xyz0=input_dict['pcd0'],\n            xyz1=input_dict['pcd1'],\n            iC0=input_dict['sinput0_C'],\n            iC1=input_dict['sinput1_C'],\n            iF0=input_dict['sinput0_F'],\n            iF1=input_dict['sinput1_F'],\n            len_batch=input_dict['len_batch'],\n            pos_pairs=input_dict['correspondences'])\n        nn_timer.update(nn_time)\n\n        # Inlier prediction with 6D ConvNet\n        inlier_timer.tic()\n        reg_sinput = ME.SparseTensor(reg_feats.contiguous(),\n                                     coords=reg_coords.int()).to(self.device)\n        reg_soutput = self.inlier_model(reg_sinput)\n        inlier_timer.toc()\n\n        logits = reg_soutput.F\n        weights = logits.sigmoid()\n\n        # Truncate weights too low\n        # For training, inplace modification is prohibited for backward\n        if self.clip_weight_thresh > 0:\n          weights_tmp = torch.zeros_like(weights)\n          valid_mask = weights > self.clip_weight_thresh\n          weights_tmp[valid_mask] = weights[valid_mask]\n          weights = weights_tmp\n\n        # Weighted Procrustes\n        pred_rots, pred_trans, ws = self.weighted_procrustes(xyz0s=input_dict['pcd0'],\n                                                             xyz1s=input_dict['pcd1'],\n                                                             pred_pairs=pred_pairs,\n                                                             weights=weights)\n\n        # Get batch registration loss\n        gt_rots, gt_trans = self.decompose_rotation_translation(input_dict['T_gt'])\n        rot_error = batch_rotation_error(pred_rots, gt_rots)\n        trans_error = batch_translation_error(pred_trans, gt_trans)\n        individual_loss = rot_error + self.config.trans_weight * trans_error\n\n        # Select batches with at least 10 valid correspondences\n        valid_mask = ws > 10\n        num_valid = valid_mask.sum().item()\n        average_valid_meter.update(num_valid)\n\n        # Registration loss against registration GT\n        loss = self.config.procrustes_loss_weight * individual_loss[valid_mask].mean()\n        if not np.isfinite(loss.item()):\n          max_val = loss.item()\n          logging.info('Loss is infinite, abort ')\n          continue\n\n        # Direct inlier loss against nearest neighbor searched GT\n        target = torch.from_numpy(is_correct).squeeze()\n        if self.config.inlier_use_direct_loss:\n          inlier_loss = self.config.inlier_direct_loss_weight * self.crit(\n              logits.cpu().squeeze(), target.to(torch.float)) / iter_size\n          loss += inlier_loss\n\n        loss.backward()\n\n        # Update statistics before backprop\n        with torch.no_grad():\n          regist_rre_meter.update(rot_error.squeeze() * 180 / np.pi)\n          regist_rte_meter.update(trans_error.squeeze())\n\n          success = (trans_error.squeeze() < self.config.success_rte_thresh) * (\n              rot_error.squeeze() * 180 / np.pi < self.config.success_rre_thresh)\n          regist_succ_meter.update(success.float())\n\n          batch_loss += loss.mean().item()\n\n          neg_target = (~target).to(torch.bool)\n          pred = logits > 0  # todo thresh\n          pred_on_pos, pred_on_neg = pred[target], pred[neg_target]\n          tp += pred_on_pos.sum().item()\n          fp += pred_on_neg.sum().item()\n          tn += (~pred_on_neg).sum().item()\n          fn += (~pred_on_pos).sum().item()\n\n          # Check gradient and avoid backprop of inf values\n          max_grad = torch.abs(self.inlier_model.final.kernel.grad).max().cpu().item()\n\n        # Backprop only if gradient is finite\n        if not np.isfinite(max_grad):\n          self.optimizer.zero_grad()\n          logging.info(f'Clearing the NaN gradient at iter {curr_iter}')\n        else:\n          self.optimizer.step()\n\n      gc.collect()\n\n      torch.cuda.empty_cache()\n\n      total_loss += batch_loss\n      total_num += 1.0\n      total_timer.toc()\n      data_meter.update(data_time)\n      loss_meter.update(batch_loss)\n\n      # Output to logs\n      if curr_iter % self.config.stat_freq == 0:\n        precision = tp / (tp + fp + eps)\n        recall = tp / (tp + fn + eps)\n        f1 = 2 * (precision * recall) / (precision + recall + eps)\n        tpr = tp / (tp + fn + eps)\n        tnr = tn / (tn + fp + eps)\n        balanced_accuracy = (tpr + tnr) / 2\n\n        correspondence_accuracy = is_correct.sum() / len(is_correct)\n\n        stat = {\n            'loss': loss_meter.avg,\n            'precision': precision,\n            'recall': recall,\n            'tpr': tpr,\n            'tnr': tnr,\n            'balanced_accuracy': balanced_accuracy,\n            'f1': f1,\n            'num_valid': average_valid_meter.avg,\n        }\n\n        for k, v in stat.items():\n          self.writer.add_scalar(f'train/{k}', v, start_iter + curr_iter)\n\n        logging.info(' '.join([\n            f\"Train Epoch: {epoch} [{curr_iter}/{num_train_iter}],\",\n            f\"Current Loss: {loss_meter.avg:.3e},\",\n            f\"Correspondence acc: {correspondence_accuracy:.3e}\",\n            f\", Precision: {precision:.4f}, Recall: {recall:.4f}, F1: {f1:.4f},\",\n            f\"TPR: {tpr:.4f}, TNR: {tnr:.4f}, BAcc: {balanced_accuracy:.4f}\",\n            f\"RTE: {regist_rte_meter.avg:.3e}, RRE: {regist_rre_meter.avg:.3e},\",\n            f\"Succ rate: {regist_succ_meter.avg:3e}\",\n            f\"Avg num valid: {average_valid_meter.avg:3e}\",\n            f\"\\tData time: {data_meter.avg:.4f}, Train time: {total_timer.avg - data_meter.avg:.4f},\",\n            f\"NN search time: {nn_timer.avg:.3e}, Total time: {total_timer.avg:.4f}\"\n        ]))\n\n        loss_meter.reset()\n        regist_rte_meter.reset()\n        regist_rre_meter.reset()\n        regist_succ_meter.reset()\n        average_valid_meter.reset()\n        data_meter.reset()\n        total_timer.reset()\n\n        tp, fp, tn, fn = 0, 0, 0, 0\n\n  def _valid_epoch(self):\n    # Change the network to evaluation mode\n    self.feat_model.eval()\n    self.inlier_model.eval()\n    self.val_data_loader.dataset.reset_seed(0)\n\n    num_data = 0\n    loss_meter = AverageMeter()\n    hit_ratio_meter = AverageMeter()\n    regist_succ_meter = AverageMeter()\n    regist_rte_meter = AverageMeter()\n    regist_rre_meter = AverageMeter()\n    data_timer = Timer()\n    feat_timer = Timer()\n    inlier_timer = Timer()\n    nn_timer = Timer()\n    dgr_timer = Timer()\n\n    tot_num_data = len(self.val_data_loader.dataset)\n    if self.val_max_iter > 0:\n      tot_num_data = min(self.val_max_iter, tot_num_data)\n    tot_num_data = int(tot_num_data / self.val_data_loader.batch_size)\n    data_loader_iter = self.val_data_loader.__iter__()\n\n    tp, fp, tn, fn = 0, 0, 0, 0\n    for batch_idx in range(tot_num_data):\n      data_timer.tic()\n      input_dict = self.get_data(data_loader_iter)\n      data_timer.toc()\n\n      reg_coords, reg_feats, pred_pairs, is_correct, feat_time, nn_time = self.generate_inlier_input(\n          xyz0=input_dict['pcd0'],\n          xyz1=input_dict['pcd1'],\n          iC0=input_dict['sinput0_C'],\n          iC1=input_dict['sinput1_C'],\n          iF0=input_dict['sinput0_F'],\n          iF1=input_dict['sinput1_F'],\n          len_batch=input_dict['len_batch'],\n          pos_pairs=input_dict['correspondences'])\n      feat_timer.update(feat_time)\n      nn_timer.update(nn_time)\n\n      hit_ratio_meter.update(is_correct.sum().item() / len(is_correct))\n\n      inlier_timer.tic()\n      reg_sinput = ME.SparseTensor(reg_feats.contiguous(),\n                                   coords=reg_coords.int()).to(self.device)\n      reg_soutput = self.inlier_model(reg_sinput)\n      inlier_timer.toc()\n\n      dgr_timer.tic()\n      logits = reg_soutput.F\n      weights = logits.sigmoid()\n\n      if self.clip_weight_thresh > 0:\n        weights[weights < self.clip_weight_thresh] = 0\n\n      # Weighted Procrustes\n      pred_rots, pred_trans, ws = self.weighted_procrustes(xyz0s=input_dict['pcd0'],\n                                                           xyz1s=input_dict['pcd1'],\n                                                           pred_pairs=pred_pairs,\n                                                           weights=weights)\n      dgr_timer.toc()\n\n      valid_mask = ws > 10\n      gt_rots, gt_trans = self.decompose_rotation_translation(input_dict['T_gt'])\n      rot_error = batch_rotation_error(pred_rots, gt_rots) * 180 / np.pi\n      trans_error = batch_translation_error(pred_trans, gt_trans)\n\n      regist_rre_meter.update(rot_error.squeeze())\n      regist_rte_meter.update(trans_error.squeeze())\n\n      # Compute success\n      success = (trans_error < self.config.success_rte_thresh) * (\n          rot_error < self.config.success_rre_thresh) * valid_mask\n      regist_succ_meter.update(success.float())\n\n      target = torch.from_numpy(is_correct).squeeze()\n      neg_target = (~target).to(torch.bool)\n      pred = weights > 0.5  # TODO thresh\n      pred_on_pos, pred_on_neg = pred[target], pred[neg_target]\n      tp += pred_on_pos.sum().item()\n      fp += pred_on_neg.sum().item()\n      tn += (~pred_on_neg).sum().item()\n      fn += (~pred_on_pos).sum().item()\n\n      num_data += 1\n      torch.cuda.empty_cache()\n\n      if batch_idx % self.config.stat_freq == 0:\n        precision = tp / (tp + fp + eps)\n        recall = tp / (tp + fn + eps)\n        f1 = 2 * (precision * recall) / (precision + recall + eps)\n        tpr = tp / (tp + fn + eps)\n        tnr = tn / (tn + fp + eps)\n        balanced_accuracy = (tpr + tnr) / 2\n        logging.info(' '.join([\n            f\"Validation iter {num_data} / {tot_num_data} : Data Loading Time: {data_timer.avg:.3e},\",\n            f\"NN search time: {nn_timer.avg:.3e}\",\n            f\"Feature Extraction Time: {feat_timer.avg:.3e}, Inlier Time: {inlier_timer.avg:.3e},\",\n            f\"Loss: {loss_meter.avg:.4f}, Hit Ratio: {hit_ratio_meter.avg:.4f}, Precision: {precision:.4f}, Recall: {recall:.4f}, F1: {f1:.4f}, \",\n            f\"TPR: {tpr:.4f}, TNR: {tnr:.4f}, BAcc: {balanced_accuracy:.4f}, \",\n            f\"DGR RTE: {regist_rte_meter.avg:.3e}, DGR RRE: {regist_rre_meter.avg:.3e}, DGR Time: {dgr_timer.avg:.3e}\",\n            f\"DGR Succ rate: {regist_succ_meter.avg:3e}\",\n        ]))\n        data_timer.reset()\n\n    precision = tp / (tp + fp + eps)\n    recall = tp / (tp + fn + eps)\n    f1 = 2 * (precision * recall) / (precision + recall + eps)\n    tpr = tp / (tp + fn + eps)\n    tnr = tn / (tn + fp + eps)\n    balanced_accuracy = (tpr + tnr) / 2\n\n    logging.info(' '.join([\n        f\"Feature Extraction Time: {feat_timer.avg:.3e}, NN search time: {nn_timer.avg:.3e}\",\n        f\"Inlier Time: {inlier_timer.avg:.3e}, Final Loss: {loss_meter.avg}, \",\n        f\"Loss: {loss_meter.avg}, Hit Ratio: {hit_ratio_meter.avg:.4f}, Precision: {precision}, Recall: {recall}, F1: {f1}, \",\n        f\"TPR: {tpr}, TNR: {tnr}, BAcc: {balanced_accuracy}, \",\n        f\"RTE: {regist_rte_meter.avg:.3e}, RRE: {regist_rre_meter.avg:.3e}, DGR Time: {dgr_timer.avg:.3e}\",\n        f\"DGR Succ rate: {regist_succ_meter.avg:3e}\",\n    ]))\n\n    stat = {\n        'loss': loss_meter.avg,\n        'precision': precision,\n        'recall': recall,\n        'tpr': tpr,\n        'tnr': tnr,\n        'balanced_accuracy': balanced_accuracy,\n        'f1': f1,\n        'regist_rte': regist_rte_meter.avg,\n        'regist_rre': regist_rre_meter.avg,\n        'succ_rate': regist_succ_meter.avg\n    }\n\n    return stat\n\n  def _load_weights(self, config):\n    if config.resume is None and config.weights:\n      logging.info(\"=> loading weights for inlier model '{}'\".format(config.weights))\n      checkpoint = torch.load(config.weights)\n      self.feat_model.load_state_dict(checkpoint['state_dict'])\n      logging.info(\"=> Loaded base model weights from '{}'\".format(config.weights))\n      if 'state_dict_inlier' in checkpoint:\n        self.inlier_model.load_state_dict(checkpoint['state_dict_inlier'])\n        logging.info(\"=> Loaded inlier weights from '{}'\".format(config.weights))\n      else:\n        logging.warn(\"Inlier weight not found in '{}'\".format(config.weights))\n\n    if config.resume is not None:\n      if osp.isfile(config.resume):\n        logging.info(\"=> loading checkpoint '{}'\".format(config.resume))\n        state = torch.load(config.resume)\n\n        self.start_epoch = state['epoch']\n        self.feat_model.load_state_dict(state['state_dict'])\n        self.feat_model = self.feat_model.to(self.device)\n        self.scheduler.load_state_dict(state['scheduler'])\n        self.optimizer.load_state_dict(state['optimizer'])\n\n        if 'best_val' in state.keys():\n          self.best_val = state['best_val']\n          self.best_val_epoch = state['best_val_epoch']\n          self.best_val_metric = state['best_val_metric']\n\n        if 'state_dict_inlier' in state:\n          self.inlier_model.load_state_dict(state['state_dict_inlier'])\n          self.inlier_model = self.inlier_model.to(self.device)\n        else:\n          logging.warn(\"Inlier weights not found in '{}'\".format(config.resume))\n      else:\n        logging.warn(\"Inlier weights does not exist at '{}'\".format(config.resume))\n\n  def _save_checkpoint(self, epoch, filename='checkpoint'):\n    \"\"\"\n    Saving checkpoints\n\n    :param epoch: current epoch number\n    :param log: logging information of the epoch\n    :param save_best: if True, rename the saved checkpoint to 'model_best.pth'\n    \"\"\"\n    print('_save_checkpoint from inlier_trainer')\n    state = {\n        'epoch': epoch,\n        'state_dict': self.feat_model.state_dict(),\n        'state_dict_inlier': self.inlier_model.state_dict(),\n        'optimizer': self.optimizer.state_dict(),\n        'scheduler': self.scheduler.state_dict(),\n        'config': self.config,\n        'best_val': self.best_val,\n        'best_val_epoch': self.best_val_epoch,\n        'best_val_metric': self.best_val_metric\n    }\n    filename = os.path.join(self.checkpoint_dir, f'{filename}.pth')\n    logging.info(\"Saving checkpoint: {} ...\".format(filename))\n    torch.save(state, filename)\n\n  def get_data(self, iterator):\n    while True:\n      try:\n        input_data = iterator.next()\n      except ValueError as e:\n        logging.info('Skipping an empty batch')\n        continue\n\n      return input_data\n\n  def decompose_by_length(self, tensor, reference_tensors):\n    decomposed_tensors = []\n    start_ind = 0\n    for r in reference_tensors:\n      N = len(r)\n      decomposed_tensors.append(tensor[start_ind:start_ind + N])\n      start_ind += N\n    return decomposed_tensors\n\n  def decompose_rotation_translation(self, Ts):\n    Ts = Ts.float()\n    Rs = Ts[:, :3, :3]\n    ts = Ts[:, :3, 3]\n\n    Rs.require_grad = False\n    ts.require_grad = False\n\n    return Rs, ts\n\n  def weighted_procrustes(self, xyz0s, xyz1s, pred_pairs, weights):\n    decomposed_weights = self.decompose_by_length(weights, pred_pairs)\n    RT = []\n    ws = []\n\n    for xyz0, xyz1, pred_pair, w in zip(xyz0s, xyz1s, pred_pairs, decomposed_weights):\n      xyz0.requires_grad = False\n      xyz1.requires_grad = False\n      ws.append(w.sum().item())\n      predT = GlobalRegistration.weighted_procrustes(\n          X=xyz0[pred_pair[:, 0]].to(self.device),\n          Y=xyz1[pred_pair[:, 1]].to(self.device),\n          w=w,\n          eps=np.finfo(np.float32).eps)\n      RT.append(predT)\n\n    Rs, ts = list(zip(*RT))\n    Rs = torch.stack(Rs, 0)\n    ts = torch.stack(ts, 0)\n    ws = torch.Tensor(ws)\n    return Rs, ts, ws\n\n  def generate_inlier_features(self, xyz0, xyz1, C0, C1, F0, F1, pair_ind0, pair_ind1):\n    \"\"\"\n    Assume that the indices 0 and indices 1 gives the pairs in the\n    (downsampled) correspondences.\n    \"\"\"\n    assert len(pair_ind0) == len(pair_ind1)\n    reg_feat_type = self.config.inlier_feature_type\n    assert reg_feat_type in ['ones', 'coords', 'counts', 'feats']\n\n    # Move coordinates and indices to the device\n    if 'coords' in reg_feat_type:\n      C0 = C0.to(self.device)\n      C1 = C1.to(self.device)\n\n    # TODO: change it to append the features and then concat at last\n    if reg_feat_type == 'ones':\n      reg_feat = torch.ones((len(pair_ind0), 1)).to(torch.float32)\n    elif reg_feat_type == 'feats':\n      reg_feat = torch.cat((F0[pair_ind0], F1[pair_ind1]), dim=1)\n    elif reg_feat_type == 'coords':\n      reg_feat = torch.cat((torch.cos(torch.cat(\n          xyz0, 0)[pair_ind0]), torch.cos(torch.cat(xyz1, 0)[pair_ind1])),\n                           dim=1)\n    else:\n      raise ValueError('Inlier feature type not defined')\n\n    return reg_feat\n\n  def generate_inlier_input(self, xyz0, xyz1, iC0, iC1, iF0, iF1, len_batch, pos_pairs):\n    # pairs consist of (xyz1 index, xyz0 index)\n    stime = time.time()\n    sinput0 = ME.SparseTensor(iF0, coords=iC0).to(self.device)\n    oF0 = self.feat_model(sinput0).F\n\n    sinput1 = ME.SparseTensor(iF1, coords=iC1).to(self.device)\n    oF1 = self.feat_model(sinput1).F\n    feat_time = time.time() - stime\n\n    stime = time.time()\n    pred_pairs = self.find_pairs(oF0, oF1, len_batch)\n    nn_time = time.time() - stime\n\n    is_correct = find_correct_correspondence(pos_pairs, pred_pairs, len_batch=len_batch)\n\n    cat_pred_pairs = []\n    start_inds = torch.zeros((1, 2)).long()\n    for lens, pred_pair in zip(len_batch, pred_pairs):\n      cat_pred_pairs.append(pred_pair + start_inds)\n      start_inds += torch.LongTensor(lens)\n\n    cat_pred_pairs = torch.cat(cat_pred_pairs, 0)\n    pred_pair_inds0, pred_pair_inds1 = cat_pred_pairs.t()\n    reg_coords = torch.cat((iC0[pred_pair_inds0], iC1[pred_pair_inds1, 1:]), 1)\n    reg_feats = self.generate_inlier_features(xyz0, xyz1, iC0, iC1, oF0, oF1,\n                                              pred_pair_inds0, pred_pair_inds1).float()\n\n    return reg_coords, reg_feats, pred_pairs, is_correct, feat_time, nn_time\n\n  def find_pairs(self, F0, F1, len_batch):\n    nn_batch = find_knn_batch(F0,\n                              F1,\n                              len_batch,\n                              nn_max_n=self.config.nn_max_n,\n                              knn=self.config.inlier_knn,\n                              return_distance=False,\n                              search_method=self.config.knn_search_method)\n\n    pred_pairs = []\n    for nns, lens in zip(nn_batch, len_batch):\n      pred_pair_ind0, pred_pair_ind1 = torch.arange(\n          len(nns)).long()[:, None], nns.long().cpu()\n      nn_pairs = []\n      for j in range(nns.shape[1]):\n        nn_pairs.append(\n            torch.cat((pred_pair_ind0.cpu(), pred_pair_ind1[:, j].unsqueeze(1)), 1))\n\n      pred_pairs.append(torch.cat(nn_pairs, 0))\n    return pred_pairs\n"
  },
  {
    "path": "dataloader/base_loader.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\n#\n# Written by Chris Choy <chrischoy@ai.stanford.edu>\n# Distributed under MIT License\nimport os\nimport logging\nimport random\nimport torch\nimport torch.utils.data\nimport numpy as np\n\nimport dataloader.transforms as t\nfrom dataloader.inf_sampler import InfSampler\n\nimport MinkowskiEngine as ME\nimport open3d as o3d\n\n\nclass CollationFunctionFactory:\n  def __init__(self, concat_correspondences=True, collation_type='default'):\n    self.concat_correspondences = concat_correspondences\n    if collation_type == 'default':\n      self.collation_fn = self.collate_default\n    elif collation_type == 'collate_pair':\n      self.collation_fn = self.collate_pair_fn\n    else:\n      raise ValueError(f'collation_type {collation_type} not found')\n\n  def __call__(self, list_data):\n    return self.collation_fn(list_data)\n\n  def collate_default(self, list_data):\n    return list_data\n\n  def collate_pair_fn(self, list_data):\n    N = len(list_data)\n    list_data = [data for data in list_data if data is not None]\n    if N != len(list_data):\n      logging.info(f\"Retain {len(list_data)} from {N} data.\")\n    if len(list_data) == 0:\n      raise ValueError('No data in the batch')\n\n    xyz0, xyz1, coords0, coords1, feats0, feats1, matching_inds, trans, extra_packages = list(\n        zip(*list_data))\n    matching_inds_batch, trans_batch, len_batch = [], [], []\n\n    coords_batch0 = ME.utils.batched_coordinates(coords0)\n    coords_batch1 = ME.utils.batched_coordinates(coords1)\n    trans_batch = torch.from_numpy(np.stack(trans)).float()\n\n    curr_start_inds = torch.zeros((1, 2), dtype=torch.int32)\n    for batch_id, _ in enumerate(coords0):\n      # For scan2cad there will be empty matching_inds even after filtering\n      # This check will skip these pairs while not affecting other datasets\n      if (len(matching_inds[batch_id]) == 0):\n        continue\n\n      N0 = coords0[batch_id].shape[0]\n      N1 = coords1[batch_id].shape[0]\n\n      if self.concat_correspondences:\n        matching_inds_batch.append(\n            torch.IntTensor(matching_inds[batch_id]) + curr_start_inds)\n      else:\n        matching_inds_batch.append(torch.IntTensor(matching_inds[batch_id]))\n\n      len_batch.append([N0, N1])\n\n      # Move the head\n      curr_start_inds[0, 0] += N0\n      curr_start_inds[0, 1] += N1\n\n    # Concatenate all lists\n    feats_batch0 = torch.cat(feats0, 0).float()\n    feats_batch1 = torch.cat(feats1, 0).float()\n    # xyz_batch0 = torch.cat(xyz0, 0).float()\n    # xyz_batch1 = torch.cat(xyz1, 0).float()\n    # trans_batch = torch.cat(trans_batch, 0).float()\n    if self.concat_correspondences:\n      matching_inds_batch = torch.cat(matching_inds_batch, 0).int()\n\n    return {\n        'pcd0': xyz0,\n        'pcd1': xyz1,\n        'sinput0_C': coords_batch0,\n        'sinput0_F': feats_batch0,\n        'sinput1_C': coords_batch1,\n        'sinput1_F': feats_batch1,\n        'correspondences': matching_inds_batch,\n        'T_gt': trans_batch,\n        'len_batch': len_batch,\n        'extra_packages': extra_packages,\n    }\n\n\nclass PairDataset(torch.utils.data.Dataset):\n  AUGMENT = None\n\n  def __init__(self,\n               phase,\n               transform=None,\n               random_rotation=True,\n               random_scale=True,\n               manual_seed=False,\n               config=None):\n    self.phase = phase\n    self.files = []\n    self.data_objects = []\n    self.transform = transform\n    self.voxel_size = config.voxel_size\n    self.matching_search_voxel_size = \\\n        config.voxel_size * config.positive_pair_search_voxel_size_multiplier\n\n    self.random_scale = random_scale\n    self.min_scale = config.min_scale\n    self.max_scale = config.max_scale\n    self.random_rotation = random_rotation\n    self.rotation_range = config.rotation_range\n    self.randg = np.random.RandomState()\n    if manual_seed:\n      self.reset_seed()\n\n  def reset_seed(self, seed=0):\n    logging.info(f\"Resetting the data loader seed to {seed}\")\n    self.randg.seed(seed)\n\n  def apply_transform(self, pts, trans):\n    R = trans[:3, :3]\n    T = trans[:3, 3]\n    pts = pts @ R.T + T\n    return pts\n\n  def __len__(self):\n    return len(self.files)\n"
  },
  {
    "path": "dataloader/data_loaders.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nfrom dataloader.threedmatch_loader import *\nfrom dataloader.kitti_loader import *\n\nALL_DATASETS = [\n    ThreeDMatchPairDataset07, ThreeDMatchPairDataset05, ThreeDMatchPairDataset03,\n    ThreeDMatchTrajectoryDataset, KITTIPairDataset, KITTINMPairDataset\n]\ndataset_str_mapping = {d.__name__: d for d in ALL_DATASETS}\n\n\ndef make_data_loader(config, phase, batch_size, num_workers=0, shuffle=None):\n  assert phase in ['train', 'trainval', 'val', 'test']\n  if shuffle is None:\n    shuffle = phase != 'test'\n\n  if config.dataset not in dataset_str_mapping.keys():\n    logging.error(f'Dataset {config.dataset}, does not exists in ' +\n                  ', '.join(dataset_str_mapping.keys()))\n\n  Dataset = dataset_str_mapping[config.dataset]\n\n  use_random_scale = False\n  use_random_rotation = False\n  transforms = []\n  if phase in ['train', 'trainval']:\n    use_random_rotation = config.use_random_rotation\n    use_random_scale = config.use_random_scale\n    transforms += [t.Jitter()]\n\n  if phase in ['val', 'test']:\n    use_random_rotation = config.test_random_rotation\n\n  dset = Dataset(phase,\n                 transform=t.Compose(transforms),\n                 random_scale=use_random_scale,\n                 random_rotation=use_random_rotation,\n                 config=config)\n\n  collation_fn = CollationFunctionFactory(concat_correspondences=False,\n                                          collation_type='collate_pair')\n\n  loader = torch.utils.data.DataLoader(dset,\n                                       batch_size=batch_size,\n                                       collate_fn=collation_fn,\n                                       num_workers=num_workers,\n                                       sampler=InfSampler(dset, shuffle))\n\n  return loader\n"
  },
  {
    "path": "dataloader/inf_sampler.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nfrom torch.utils.data.sampler import Sampler\n\n\nclass InfSampler(Sampler):\n  \"\"\"Samples elements randomly, without replacement.\n\n    Arguments:\n        data_source (Dataset): dataset to sample from\n    \"\"\"\n\n  def __init__(self, data_source, shuffle=False):\n    self.data_source = data_source\n    self.shuffle = shuffle\n    self.reset_permutation()\n\n  def reset_permutation(self):\n    perm = len(self.data_source)\n    if self.shuffle:\n      perm = torch.randperm(perm)\n    self._perm = perm.tolist()\n\n  def __iter__(self):\n    return self\n\n  def __next__(self):\n    if len(self._perm) == 0:\n      self.reset_permutation()\n    return self._perm.pop()\n\n  def __len__(self):\n    return len(self.data_source)\n"
  },
  {
    "path": "dataloader/kitti_loader.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport os\nimport glob\n\nfrom dataloader.base_loader import *\nfrom dataloader.transforms import *\nfrom util.pointcloud import get_matching_indices, make_open3d_point_cloud\n\nkitti_cache = {}\nkitti_icp_cache = {}\n\nclass KITTIPairDataset(PairDataset):\n  AUGMENT = None\n  DATA_FILES = {\n      'train': './dataloader/split/train_kitti.txt',\n      'val': './dataloader/split/val_kitti.txt',\n      'test': './dataloader/split/test_kitti.txt'\n  }\n  TEST_RANDOM_ROTATION = False\n  IS_ODOMETRY = True\n\n  def __init__(self,\n               phase,\n               transform=None,\n               random_rotation=True,\n               random_scale=True,\n               manual_seed=False,\n               config=None):\n    # For evaluation, use the odometry dataset training following the 3DFeat eval method\n    self.root = root = config.kitti_dir + '/dataset'\n    random_rotation = self.TEST_RANDOM_ROTATION\n    self.icp_path = config.icp_cache_path\n    try:\n      os.mkdir(self.icp_path)\n    except OSError as error:\n      pass\n    PairDataset.__init__(self, phase, transform, random_rotation, random_scale,\n                         manual_seed, config)\n\n    logging.info(f\"Loading the subset {phase} from {root}\")\n    # Use the kitti root\n    self.max_time_diff = max_time_diff = config.kitti_max_time_diff\n\n    subset_names = open(self.DATA_FILES[phase]).read().split()\n    for dirname in subset_names:\n      drive_id = int(dirname)\n      inames = self.get_all_scan_ids(drive_id)\n      for start_time in inames:\n        for time_diff in range(2, max_time_diff):\n          pair_time = time_diff + start_time\n          if pair_time in inames:\n            self.files.append((drive_id, start_time, pair_time))\n\n  def get_all_scan_ids(self, drive_id):\n    fnames = glob.glob(self.root + '/sequences/%02d/velodyne/*.bin' % drive_id)\n    assert len(\n        fnames) > 0, f\"Make sure that the path {self.root} has drive id: {drive_id}\"\n    inames = [int(os.path.split(fname)[-1][:-4]) for fname in fnames]\n    return inames\n\n  @property\n  def velo2cam(self):\n    try:\n      velo2cam = self._velo2cam\n    except AttributeError:\n      R = np.array([\n          7.533745e-03, -9.999714e-01, -6.166020e-04, 1.480249e-02, 7.280733e-04,\n          -9.998902e-01, 9.998621e-01, 7.523790e-03, 1.480755e-02\n      ]).reshape(3, 3)\n      T = np.array([-4.069766e-03, -7.631618e-02, -2.717806e-01]).reshape(3, 1)\n      velo2cam = np.hstack([R, T])\n      self._velo2cam = np.vstack((velo2cam, [0, 0, 0, 1])).T\n    return self._velo2cam\n\n  def get_video_odometry(self, drive, indices=None, ext='.txt', return_all=False):\n    data_path = self.root + '/poses/%02d.txt' % drive\n    if data_path not in kitti_cache:\n      kitti_cache[data_path] = np.genfromtxt(data_path)\n    if return_all:\n      return kitti_cache[data_path]\n    else:\n      return kitti_cache[data_path][indices]\n\n  def odometry_to_positions(self, odometry):\n    T_w_cam0 = odometry.reshape(3, 4)\n    T_w_cam0 = np.vstack((T_w_cam0, [0, 0, 0, 1]))\n    return T_w_cam0\n\n  def rot3d(self, axis, angle):\n    ei = np.ones(3, dtype='bool')\n    ei[axis] = 0\n    i = np.nonzero(ei)[0]\n    m = np.eye(3)\n    c, s = np.cos(angle), np.sin(angle)\n    m[i[0], i[0]] = c\n    m[i[0], i[1]] = -s\n    m[i[1], i[0]] = s\n    m[i[1], i[1]] = c\n    return m\n\n  def pos_transform(self, pos):\n    x, y, z, rx, ry, rz, _ = pos[0]\n    RT = np.eye(4)\n    RT[:3, :3] = np.dot(np.dot(self.rot3d(0, rx), self.rot3d(1, ry)), self.rot3d(2, rz))\n    RT[:3, 3] = [x, y, z]\n    return RT\n\n  def get_position_transform(self, pos0, pos1, invert=False):\n    T0 = self.pos_transform(pos0)\n    T1 = self.pos_transform(pos1)\n    return (np.dot(T1, np.linalg.inv(T0)).T if not invert else np.dot(\n        np.linalg.inv(T1), T0).T)\n\n  def _get_velodyne_fn(self, drive, t):\n    fname = self.root + '/sequences/%02d/velodyne/%06d.bin' % (drive, t)\n    return fname\n\n  def __getitem__(self, idx):\n    drive = self.files[idx][0]\n    t0, t1 = self.files[idx][1], self.files[idx][2]\n    all_odometry = self.get_video_odometry(drive, [t0, t1])\n    positions = [self.odometry_to_positions(odometry) for odometry in all_odometry]\n    fname0 = self._get_velodyne_fn(drive, t0)\n    fname1 = self._get_velodyne_fn(drive, t1)\n\n    # XYZ and reflectance\n    xyzr0 = np.fromfile(fname0, dtype=np.float32).reshape(-1, 4)\n    xyzr1 = np.fromfile(fname1, dtype=np.float32).reshape(-1, 4)\n\n    xyz0 = xyzr0[:, :3]\n    xyz1 = xyzr1[:, :3]\n\n    key = '%d_%d_%d' % (drive, t0, t1)\n    filename = self.icp_path + '/' + key + '.npy'\n    if key not in kitti_icp_cache:\n      if not os.path.exists(filename):\n        # work on the downsampled xyzs, 0.05m == 5cm\n        sel0 = ME.utils.sparse_quantize(xyz0 / 0.05, return_index=True)\n        sel1 = ME.utils.sparse_quantize(xyz1 / 0.05, return_index=True)\n\n        M = (self.velo2cam @ positions[0].T @ np.linalg.inv(positions[1].T)\n             @ np.linalg.inv(self.velo2cam)).T\n        xyz0_t = self.apply_transform(xyz0[sel0], M)\n        pcd0 = make_open3d_point_cloud(xyz0_t)\n        pcd1 = make_open3d_point_cloud(xyz1[sel1])\n        reg = o3d.registration.registration_icp(pcd0, pcd1, 0.2, np.eye(4),\n                                   o3d.registration.TransformationEstimationPointToPoint(),\n                                   o3d.registration.ICPConvergenceCriteria(max_iteration=200))\n        pcd0.transform(reg.transformation)\n        # pcd0.transform(M2) or self.apply_transform(xyz0, M2)\n        M2 = M @ reg.transformation\n        # o3d.draw_geometries([pcd0, pcd1])\n        # write to a file\n        np.save(filename, M2)\n      else:\n        M2 = np.load(filename)\n      kitti_icp_cache[key] = M2\n    else:\n      M2 = kitti_icp_cache[key]\n\n    if self.random_rotation:\n      T0 = sample_random_trans(xyz0, self.randg, np.pi / 4)\n      T1 = sample_random_trans(xyz1, self.randg, np.pi / 4)\n      trans = T1 @ M2 @ np.linalg.inv(T0)\n\n      xyz0 = self.apply_transform(xyz0, T0)\n      xyz1 = self.apply_transform(xyz1, T1)\n    else:\n      trans = M2\n\n    matching_search_voxel_size = self.matching_search_voxel_size\n    if self.random_scale and random.random() < 0.95:\n      scale = self.min_scale + \\\n          (self.max_scale - self.min_scale) * random.random()\n      matching_search_voxel_size *= scale\n      xyz0 = scale * xyz0\n      xyz1 = scale * xyz1\n\n    # Voxelization\n    xyz0_th = torch.from_numpy(xyz0)\n    xyz1_th = torch.from_numpy(xyz1)\n\n    sel0 = ME.utils.sparse_quantize(xyz0_th / self.voxel_size, return_index=True)\n    sel1 = ME.utils.sparse_quantize(xyz1_th / self.voxel_size, return_index=True)\n\n    # Make point clouds using voxelized points\n    pcd0 = make_open3d_point_cloud(xyz0[sel0])\n    pcd1 = make_open3d_point_cloud(xyz1[sel1])\n\n    # Get matches\n    matches = get_matching_indices(pcd0, pcd1, trans, matching_search_voxel_size)\n    if len(matches) < 1000:\n      raise ValueError(f\"Insufficient matches in {drive}, {t0}, {t1}\")\n\n    # Get features\n    npts0 = len(sel0)\n    npts1 = len(sel1)\n\n    feats_train0, feats_train1 = [], []\n\n    unique_xyz0_th = xyz0_th[sel0]\n    unique_xyz1_th = xyz1_th[sel1]\n\n    feats_train0.append(torch.ones((npts0, 1)))\n    feats_train1.append(torch.ones((npts1, 1)))\n\n    feats0 = torch.cat(feats_train0, 1)\n    feats1 = torch.cat(feats_train1, 1)\n\n    coords0 = torch.floor(unique_xyz0_th / self.voxel_size)\n    coords1 = torch.floor(unique_xyz1_th / self.voxel_size)\n\n    if self.transform:\n      coords0, feats0 = self.transform(coords0, feats0)\n      coords1, feats1 = self.transform(coords1, feats1)\n\n    extra_package = {'drive': drive, 't0': t0, 't1': t1}\n\n    return (unique_xyz0_th.float(),\n            unique_xyz1_th.float(), coords0.int(), coords1.int(), feats0.float(),\n            feats1.float(), matches, trans, extra_package)\n\n\nclass KITTINMPairDataset(KITTIPairDataset):\n  r\"\"\"\n  Generate KITTI pairs within N meter distance\n  \"\"\"\n  MIN_DIST = 10\n\n  def __init__(self,\n               phase,\n               transform=None,\n               random_rotation=True,\n               random_scale=True,\n               manual_seed=False,\n               config=None):\n    self.root = root = os.path.join(config.kitti_dir, 'dataset')\n    self.icp_path = os.path.join(config.kitti_dir, config.icp_cache_path)\n    try:\n      os.mkdir(self.icp_path)\n    except OSError as error:\n      pass\n    random_rotation = self.TEST_RANDOM_ROTATION\n    PairDataset.__init__(self, phase, transform, random_rotation, random_scale,\n                         manual_seed, config)\n\n    logging.info(f\"Loading the subset {phase} from {root}\")\n\n    subset_names = open(self.DATA_FILES[phase]).read().split()\n    for dirname in subset_names:\n      drive_id = int(dirname)\n      fnames = glob.glob(root + '/sequences/%02d/velodyne/*.bin' % drive_id)\n      assert len(fnames) > 0, f\"Make sure that the path {root} has data {dirname}\"\n      inames = sorted([int(os.path.split(fname)[-1][:-4]) for fname in fnames])\n\n      all_odo = self.get_video_odometry(drive_id, return_all=True)\n      all_pos = np.array([self.odometry_to_positions(odo) for odo in all_odo])\n      Ts = all_pos[:, :3, 3]\n      pdist = (Ts.reshape(1, -1, 3) - Ts.reshape(-1, 1, 3))**2\n      pdist = np.sqrt(pdist.sum(-1))\n      more_than_10 = pdist > self.MIN_DIST\n      curr_time = inames[0]\n      while curr_time in inames:\n        # Find the min index\n        next_time = np.where(more_than_10[curr_time][curr_time:curr_time + 100])[0]\n        if len(next_time) == 0:\n          curr_time += 1\n        else:\n          # Follow https://github.com/yewzijian/3DFeatNet/blob/master/scripts_data_processing/kitti/process_kitti_data.m#L44\n          next_time = next_time[0] + curr_time - 1\n\n        if next_time in inames:\n          self.files.append((drive_id, curr_time, next_time))\n          curr_time = next_time + 1\n\n    # Remove problematic sequence\n    for item in [\n        (8, 15, 58),\n    ]:\n      if item in self.files:\n        self.files.pop(self.files.index(item))\n"
  },
  {
    "path": "dataloader/split/test_3dmatch.txt",
    "content": "7-scenes-redkitchen\nsun3d-home_at-home_at_scan1_2013_jan_1\nsun3d-home_md-home_md_scan9_2012_sep_30\nsun3d-hotel_uc-scan3\nsun3d-hotel_umd-maryland_hotel1\nsun3d-hotel_umd-maryland_hotel3\nsun3d-mit_76_studyroom-76-1studyroom2\nsun3d-mit_lab_hj-lab_hj_tea_nov_2_2012_scan1_erika"
  },
  {
    "path": "dataloader/split/test_kitti.txt",
    "content": "8\n9\n10\n"
  },
  {
    "path": "dataloader/split/test_modelnet40.txt",
    "content": "glass_box/test/glass_box_0172.off\nglass_box/test/glass_box_0173.off\nglass_box/test/glass_box_0174.off\nglass_box/test/glass_box_0175.off\nglass_box/test/glass_box_0176.off\nglass_box/test/glass_box_0177.off\nglass_box/test/glass_box_0178.off\nglass_box/test/glass_box_0179.off\nglass_box/test/glass_box_0180.off\nglass_box/test/glass_box_0181.off\nglass_box/test/glass_box_0182.off\nglass_box/test/glass_box_0183.off\nglass_box/test/glass_box_0184.off\nglass_box/test/glass_box_0185.off\nglass_box/test/glass_box_0186.off\nglass_box/test/glass_box_0187.off\nglass_box/test/glass_box_0188.off\nglass_box/test/glass_box_0189.off\nglass_box/test/glass_box_0190.off\nglass_box/test/glass_box_0191.off\nglass_box/test/glass_box_0192.off\nglass_box/test/glass_box_0193.off\nglass_box/test/glass_box_0194.off\nglass_box/test/glass_box_0195.off\nglass_box/test/glass_box_0196.off\nglass_box/test/glass_box_0197.off\nglass_box/test/glass_box_0198.off\nglass_box/test/glass_box_0199.off\nglass_box/test/glass_box_0200.off\nglass_box/test/glass_box_0201.off\nglass_box/test/glass_box_0202.off\nglass_box/test/glass_box_0203.off\nglass_box/test/glass_box_0204.off\nglass_box/test/glass_box_0205.off\nglass_box/test/glass_box_0206.off\nglass_box/test/glass_box_0207.off\nglass_box/test/glass_box_0208.off\nglass_box/test/glass_box_0209.off\nglass_box/test/glass_box_0210.off\nglass_box/test/glass_box_0211.off\nglass_box/test/glass_box_0212.off\nglass_box/test/glass_box_0213.off\nglass_box/test/glass_box_0214.off\nglass_box/test/glass_box_0215.off\nglass_box/test/glass_box_0216.off\nglass_box/test/glass_box_0217.off\nglass_box/test/glass_box_0218.off\nglass_box/test/glass_box_0219.off\nglass_box/test/glass_box_0220.off\nglass_box/test/glass_box_0221.off\nglass_box/test/glass_box_0222.off\nglass_box/test/glass_box_0223.off\nglass_box/test/glass_box_0224.off\nglass_box/test/glass_box_0225.off\nglass_box/test/glass_box_0226.off\nglass_box/test/glass_box_0227.off\nglass_box/test/glass_box_0228.off\nglass_box/test/glass_box_0229.off\nglass_box/test/glass_box_0230.off\nglass_box/test/glass_box_0231.off\nglass_box/test/glass_box_0232.off\nglass_box/test/glass_box_0233.off\nglass_box/test/glass_box_0234.off\nglass_box/test/glass_box_0235.off\nglass_box/test/glass_box_0236.off\nglass_box/test/glass_box_0237.off\nglass_box/test/glass_box_0238.off\nglass_box/test/glass_box_0239.off\nglass_box/test/glass_box_0240.off\nglass_box/test/glass_box_0241.off\nglass_box/test/glass_box_0242.off\nglass_box/test/glass_box_0243.off\nglass_box/test/glass_box_0244.off\nglass_box/test/glass_box_0245.off\nglass_box/test/glass_box_0246.off\nglass_box/test/glass_box_0247.off\nglass_box/test/glass_box_0248.off\nglass_box/test/glass_box_0249.off\nglass_box/test/glass_box_0250.off\nglass_box/test/glass_box_0251.off\nglass_box/test/glass_box_0252.off\nglass_box/test/glass_box_0253.off\nglass_box/test/glass_box_0254.off\nglass_box/test/glass_box_0255.off\nglass_box/test/glass_box_0256.off\nglass_box/test/glass_box_0257.off\nglass_box/test/glass_box_0258.off\nglass_box/test/glass_box_0259.off\nglass_box/test/glass_box_0260.off\nglass_box/test/glass_box_0261.off\nglass_box/test/glass_box_0262.off\nglass_box/test/glass_box_0263.off\nglass_box/test/glass_box_0264.off\nglass_box/test/glass_box_0265.off\nglass_box/test/glass_box_0266.off\nglass_box/test/glass_box_0267.off\nglass_box/test/glass_box_0268.off\nglass_box/test/glass_box_0269.off\nglass_box/test/glass_box_0270.off\nglass_box/test/glass_box_0271.off\nlaptop/test/laptop_0150.off\nlaptop/test/laptop_0151.off\nlaptop/test/laptop_0152.off\nlaptop/test/laptop_0153.off\nlaptop/test/laptop_0154.off\nlaptop/test/laptop_0155.off\nlaptop/test/laptop_0156.off\nlaptop/test/laptop_0157.off\nlaptop/test/laptop_0158.off\nlaptop/test/laptop_0159.off\nlaptop/test/laptop_0160.off\nlaptop/test/laptop_0161.off\nlaptop/test/laptop_0162.off\nlaptop/test/laptop_0163.off\nlaptop/test/laptop_0164.off\nlaptop/test/laptop_0165.off\nlaptop/test/laptop_0166.off\nlaptop/test/laptop_0167.off\nlaptop/test/laptop_0168.off\nlaptop/test/laptop_0169.off\nsink/test/sink_0129.off\nsink/test/sink_0130.off\nsink/test/sink_0131.off\nsink/test/sink_0132.off\nsink/test/sink_0133.off\nsink/test/sink_0134.off\nsink/test/sink_0135.off\nsink/test/sink_0136.off\nsink/test/sink_0137.off\nsink/test/sink_0138.off\nsink/test/sink_0139.off\nsink/test/sink_0140.off\nsink/test/sink_0141.off\nsink/test/sink_0142.off\nsink/test/sink_0143.off\nsink/test/sink_0144.off\nsink/test/sink_0145.off\nsink/test/sink_0146.off\nsink/test/sink_0147.off\nsink/test/sink_0148.off\nnight_stand/test/night_stand_0201.off\nnight_stand/test/night_stand_0202.off\nnight_stand/test/night_stand_0203.off\nnight_stand/test/night_stand_0204.off\nnight_stand/test/night_stand_0205.off\nnight_stand/test/night_stand_0206.off\nnight_stand/test/night_stand_0207.off\nnight_stand/test/night_stand_0208.off\nnight_stand/test/night_stand_0209.off\nnight_stand/test/night_stand_0210.off\nnight_stand/test/night_stand_0211.off\nnight_stand/test/night_stand_0212.off\nnight_stand/test/night_stand_0213.off\nnight_stand/test/night_stand_0214.off\nnight_stand/test/night_stand_0215.off\nnight_stand/test/night_stand_0216.off\nnight_stand/test/night_stand_0217.off\nnight_stand/test/night_stand_0218.off\nnight_stand/test/night_stand_0219.off\nnight_stand/test/night_stand_0220.off\nnight_stand/test/night_stand_0221.off\nnight_stand/test/night_stand_0222.off\nnight_stand/test/night_stand_0223.off\nnight_stand/test/night_stand_0224.off\nnight_stand/test/night_stand_0225.off\nnight_stand/test/night_stand_0226.off\nnight_stand/test/night_stand_0227.off\nnight_stand/test/night_stand_0228.off\nnight_stand/test/night_stand_0229.off\nnight_stand/test/night_stand_0230.off\nnight_stand/test/night_stand_0231.off\nnight_stand/test/night_stand_0232.off\nnight_stand/test/night_stand_0233.off\nnight_stand/test/night_stand_0234.off\nnight_stand/test/night_stand_0235.off\nnight_stand/test/night_stand_0236.off\nnight_stand/test/night_stand_0237.off\nnight_stand/test/night_stand_0238.off\nnight_stand/test/night_stand_0239.off\nnight_stand/test/night_stand_0240.off\nnight_stand/test/night_stand_0241.off\nnight_stand/test/night_stand_0242.off\nnight_stand/test/night_stand_0243.off\nnight_stand/test/night_stand_0244.off\nnight_stand/test/night_stand_0245.off\nnight_stand/test/night_stand_0246.off\nnight_stand/test/night_stand_0247.off\nnight_stand/test/night_stand_0248.off\nnight_stand/test/night_stand_0249.off\nnight_stand/test/night_stand_0250.off\nnight_stand/test/night_stand_0251.off\nnight_stand/test/night_stand_0252.off\nnight_stand/test/night_stand_0253.off\nnight_stand/test/night_stand_0254.off\nnight_stand/test/night_stand_0255.off\nnight_stand/test/night_stand_0256.off\nnight_stand/test/night_stand_0257.off\nnight_stand/test/night_stand_0258.off\nnight_stand/test/night_stand_0259.off\nnight_stand/test/night_stand_0260.off\nnight_stand/test/night_stand_0261.off\nnight_stand/test/night_stand_0262.off\nnight_stand/test/night_stand_0263.off\nnight_stand/test/night_stand_0264.off\nnight_stand/test/night_stand_0265.off\nnight_stand/test/night_stand_0266.off\nnight_stand/test/night_stand_0267.off\nnight_stand/test/night_stand_0268.off\nnight_stand/test/night_stand_0269.off\nnight_stand/test/night_stand_0270.off\nnight_stand/test/night_stand_0271.off\nnight_stand/test/night_stand_0272.off\nnight_stand/test/night_stand_0273.off\nnight_stand/test/night_stand_0274.off\nnight_stand/test/night_stand_0275.off\nnight_stand/test/night_stand_0276.off\nnight_stand/test/night_stand_0277.off\nnight_stand/test/night_stand_0278.off\nnight_stand/test/night_stand_0279.off\nnight_stand/test/night_stand_0280.off\nnight_stand/test/night_stand_0281.off\nnight_stand/test/night_stand_0282.off\nnight_stand/test/night_stand_0283.off\nnight_stand/test/night_stand_0284.off\nnight_stand/test/night_stand_0285.off\nnight_stand/test/night_stand_0286.off\ncar/test/car_0198.off\ncar/test/car_0199.off\ncar/test/car_0200.off\ncar/test/car_0201.off\ncar/test/car_0202.off\ncar/test/car_0203.off\ncar/test/car_0204.off\ncar/test/car_0205.off\ncar/test/car_0206.off\ncar/test/car_0207.off\ncar/test/car_0208.off\ncar/test/car_0209.off\ncar/test/car_0210.off\ncar/test/car_0211.off\ncar/test/car_0212.off\ncar/test/car_0213.off\ncar/test/car_0214.off\ncar/test/car_0215.off\ncar/test/car_0216.off\ncar/test/car_0217.off\ncar/test/car_0218.off\ncar/test/car_0219.off\ncar/test/car_0220.off\ncar/test/car_0221.off\ncar/test/car_0222.off\ncar/test/car_0223.off\ncar/test/car_0224.off\ncar/test/car_0225.off\ncar/test/car_0226.off\ncar/test/car_0227.off\ncar/test/car_0228.off\ncar/test/car_0229.off\ncar/test/car_0230.off\ncar/test/car_0231.off\ncar/test/car_0232.off\ncar/test/car_0233.off\ncar/test/car_0234.off\ncar/test/car_0235.off\ncar/test/car_0236.off\ncar/test/car_0237.off\ncar/test/car_0238.off\ncar/test/car_0239.off\ncar/test/car_0240.off\ncar/test/car_0241.off\ncar/test/car_0242.off\ncar/test/car_0243.off\ncar/test/car_0244.off\ncar/test/car_0245.off\ncar/test/car_0246.off\ncar/test/car_0247.off\ncar/test/car_0248.off\ncar/test/car_0249.off\ncar/test/car_0250.off\ncar/test/car_0251.off\ncar/test/car_0252.off\ncar/test/car_0253.off\ncar/test/car_0254.off\ncar/test/car_0255.off\ncar/test/car_0256.off\ncar/test/car_0257.off\ncar/test/car_0258.off\ncar/test/car_0259.off\ncar/test/car_0260.off\ncar/test/car_0261.off\ncar/test/car_0262.off\ncar/test/car_0263.off\ncar/test/car_0264.off\ncar/test/car_0265.off\ncar/test/car_0266.off\ncar/test/car_0267.off\ncar/test/car_0268.off\ncar/test/car_0269.off\ncar/test/car_0270.off\ncar/test/car_0271.off\ncar/test/car_0272.off\ncar/test/car_0273.off\ncar/test/car_0274.off\ncar/test/car_0275.off\ncar/test/car_0276.off\ncar/test/car_0277.off\ncar/test/car_0278.off\ncar/test/car_0279.off\ncar/test/car_0280.off\ncar/test/car_0281.off\ncar/test/car_0282.off\ncar/test/car_0283.off\ncar/test/car_0284.off\ncar/test/car_0285.off\ncar/test/car_0286.off\ncar/test/car_0287.off\ncar/test/car_0288.off\ncar/test/car_0289.off\ncar/test/car_0290.off\ncar/test/car_0291.off\ncar/test/car_0292.off\ncar/test/car_0293.off\ncar/test/car_0294.off\ncar/test/car_0295.off\ncar/test/car_0296.off\ncar/test/car_0297.off\ndresser/test/dresser_0201.off\ndresser/test/dresser_0202.off\ndresser/test/dresser_0203.off\ndresser/test/dresser_0204.off\ndresser/test/dresser_0205.off\ndresser/test/dresser_0206.off\ndresser/test/dresser_0207.off\ndresser/test/dresser_0208.off\ndresser/test/dresser_0209.off\ndresser/test/dresser_0210.off\ndresser/test/dresser_0211.off\ndresser/test/dresser_0212.off\ndresser/test/dresser_0213.off\ndresser/test/dresser_0214.off\ndresser/test/dresser_0215.off\ndresser/test/dresser_0216.off\ndresser/test/dresser_0217.off\ndresser/test/dresser_0218.off\ndresser/test/dresser_0219.off\ndresser/test/dresser_0220.off\ndresser/test/dresser_0221.off\ndresser/test/dresser_0222.off\ndresser/test/dresser_0223.off\ndresser/test/dresser_0224.off\ndresser/test/dresser_0225.off\ndresser/test/dresser_0226.off\ndresser/test/dresser_0227.off\ndresser/test/dresser_0228.off\ndresser/test/dresser_0229.off\ndresser/test/dresser_0230.off\ndresser/test/dresser_0231.off\ndresser/test/dresser_0232.off\ndresser/test/dresser_0233.off\ndresser/test/dresser_0234.off\ndresser/test/dresser_0235.off\ndresser/test/dresser_0236.off\ndresser/test/dresser_0237.off\ndresser/test/dresser_0238.off\ndresser/test/dresser_0239.off\ndresser/test/dresser_0240.off\ndresser/test/dresser_0241.off\ndresser/test/dresser_0242.off\ndresser/test/dresser_0243.off\ndresser/test/dresser_0244.off\ndresser/test/dresser_0245.off\ndresser/test/dresser_0246.off\ndresser/test/dresser_0247.off\ndresser/test/dresser_0248.off\ndresser/test/dresser_0249.off\ndresser/test/dresser_0250.off\ndresser/test/dresser_0251.off\ndresser/test/dresser_0252.off\ndresser/test/dresser_0253.off\ndresser/test/dresser_0254.off\ndresser/test/dresser_0255.off\ndresser/test/dresser_0256.off\ndresser/test/dresser_0257.off\ndresser/test/dresser_0258.off\ndresser/test/dresser_0259.off\ndresser/test/dresser_0260.off\ndresser/test/dresser_0261.off\ndresser/test/dresser_0262.off\ndresser/test/dresser_0263.off\ndresser/test/dresser_0264.off\ndresser/test/dresser_0265.off\ndresser/test/dresser_0266.off\ndresser/test/dresser_0267.off\ndresser/test/dresser_0268.off\ndresser/test/dresser_0269.off\ndresser/test/dresser_0270.off\ndresser/test/dresser_0271.off\ndresser/test/dresser_0272.off\ndresser/test/dresser_0273.off\ndresser/test/dresser_0274.off\ndresser/test/dresser_0275.off\ndresser/test/dresser_0276.off\ndresser/test/dresser_0277.off\ndresser/test/dresser_0278.off\ndresser/test/dresser_0279.off\ndresser/test/dresser_0280.off\ndresser/test/dresser_0281.off\ndresser/test/dresser_0282.off\ndresser/test/dresser_0283.off\ndresser/test/dresser_0284.off\ndresser/test/dresser_0285.off\ndresser/test/dresser_0286.off\ntoilet/test/toilet_0345.off\ntoilet/test/toilet_0346.off\ntoilet/test/toilet_0347.off\ntoilet/test/toilet_0348.off\ntoilet/test/toilet_0349.off\ntoilet/test/toilet_0350.off\ntoilet/test/toilet_0351.off\ntoilet/test/toilet_0352.off\ntoilet/test/toilet_0353.off\ntoilet/test/toilet_0354.off\ntoilet/test/toilet_0355.off\ntoilet/test/toilet_0356.off\ntoilet/test/toilet_0357.off\ntoilet/test/toilet_0358.off\ntoilet/test/toilet_0359.off\ntoilet/test/toilet_0360.off\ntoilet/test/toilet_0361.off\ntoilet/test/toilet_0362.off\ntoilet/test/toilet_0363.off\ntoilet/test/toilet_0364.off\ntoilet/test/toilet_0365.off\ntoilet/test/toilet_0366.off\ntoilet/test/toilet_0367.off\ntoilet/test/toilet_0368.off\ntoilet/test/toilet_0369.off\ntoilet/test/toilet_0370.off\ntoilet/test/toilet_0371.off\ntoilet/test/toilet_0372.off\ntoilet/test/toilet_0373.off\ntoilet/test/toilet_0374.off\ntoilet/test/toilet_0375.off\ntoilet/test/toilet_0376.off\ntoilet/test/toilet_0377.off\ntoilet/test/toilet_0378.off\ntoilet/test/toilet_0379.off\ntoilet/test/toilet_0380.off\ntoilet/test/toilet_0381.off\ntoilet/test/toilet_0382.off\ntoilet/test/toilet_0383.off\ntoilet/test/toilet_0384.off\ntoilet/test/toilet_0385.off\ntoilet/test/toilet_0386.off\ntoilet/test/toilet_0387.off\ntoilet/test/toilet_0388.off\ntoilet/test/toilet_0389.off\ntoilet/test/toilet_0390.off\ntoilet/test/toilet_0391.off\ntoilet/test/toilet_0392.off\ntoilet/test/toilet_0393.off\ntoilet/test/toilet_0394.off\ntoilet/test/toilet_0395.off\ntoilet/test/toilet_0396.off\ntoilet/test/toilet_0397.off\ntoilet/test/toilet_0398.off\ntoilet/test/toilet_0399.off\ntoilet/test/toilet_0400.off\ntoilet/test/toilet_0401.off\ntoilet/test/toilet_0402.off\ntoilet/test/toilet_0403.off\ntoilet/test/toilet_0404.off\ntoilet/test/toilet_0405.off\ntoilet/test/toilet_0406.off\ntoilet/test/toilet_0407.off\ntoilet/test/toilet_0408.off\ntoilet/test/toilet_0409.off\ntoilet/test/toilet_0410.off\ntoilet/test/toilet_0411.off\ntoilet/test/toilet_0412.off\ntoilet/test/toilet_0413.off\ntoilet/test/toilet_0414.off\ntoilet/test/toilet_0415.off\ntoilet/test/toilet_0416.off\ntoilet/test/toilet_0417.off\ntoilet/test/toilet_0418.off\ntoilet/test/toilet_0419.off\ntoilet/test/toilet_0420.off\ntoilet/test/toilet_0421.off\ntoilet/test/toilet_0422.off\ntoilet/test/toilet_0423.off\ntoilet/test/toilet_0424.off\ntoilet/test/toilet_0425.off\ntoilet/test/toilet_0426.off\ntoilet/test/toilet_0427.off\ntoilet/test/toilet_0428.off\ntoilet/test/toilet_0429.off\ntoilet/test/toilet_0430.off\ntoilet/test/toilet_0431.off\ntoilet/test/toilet_0432.off\ntoilet/test/toilet_0433.off\ntoilet/test/toilet_0434.off\ntoilet/test/toilet_0435.off\ntoilet/test/toilet_0436.off\ntoilet/test/toilet_0437.off\ntoilet/test/toilet_0438.off\ntoilet/test/toilet_0439.off\ntoilet/test/toilet_0440.off\ntoilet/test/toilet_0441.off\ntoilet/test/toilet_0442.off\ntoilet/test/toilet_0443.off\ntoilet/test/toilet_0444.off\ncurtain/test/curtain_0139.off\ncurtain/test/curtain_0140.off\ncurtain/test/curtain_0141.off\ncurtain/test/curtain_0142.off\ncurtain/test/curtain_0143.off\ncurtain/test/curtain_0144.off\ncurtain/test/curtain_0145.off\ncurtain/test/curtain_0146.off\ncurtain/test/curtain_0147.off\ncurtain/test/curtain_0148.off\ncurtain/test/curtain_0149.off\ncurtain/test/curtain_0150.off\ncurtain/test/curtain_0151.off\ncurtain/test/curtain_0152.off\ncurtain/test/curtain_0153.off\ncurtain/test/curtain_0154.off\ncurtain/test/curtain_0155.off\ncurtain/test/curtain_0156.off\ncurtain/test/curtain_0157.off\ncurtain/test/curtain_0158.off\nwardrobe/test/wardrobe_0088.off\nwardrobe/test/wardrobe_0089.off\nwardrobe/test/wardrobe_0090.off\nwardrobe/test/wardrobe_0091.off\nwardrobe/test/wardrobe_0092.off\nwardrobe/test/wardrobe_0093.off\nwardrobe/test/wardrobe_0094.off\nwardrobe/test/wardrobe_0095.off\nwardrobe/test/wardrobe_0096.off\nwardrobe/test/wardrobe_0097.off\nwardrobe/test/wardrobe_0098.off\nwardrobe/test/wardrobe_0099.off\nwardrobe/test/wardrobe_0100.off\nwardrobe/test/wardrobe_0101.off\nwardrobe/test/wardrobe_0102.off\nwardrobe/test/wardrobe_0103.off\nwardrobe/test/wardrobe_0104.off\nwardrobe/test/wardrobe_0105.off\nwardrobe/test/wardrobe_0106.off\nwardrobe/test/wardrobe_0107.off\nstool/test/stool_0091.off\nstool/test/stool_0092.off\nstool/test/stool_0093.off\nstool/test/stool_0094.off\nstool/test/stool_0095.off\nstool/test/stool_0096.off\nstool/test/stool_0097.off\nstool/test/stool_0098.off\nstool/test/stool_0099.off\nstool/test/stool_0100.off\nstool/test/stool_0101.off\nstool/test/stool_0102.off\nstool/test/stool_0103.off\nstool/test/stool_0104.off\nstool/test/stool_0105.off\nstool/test/stool_0106.off\nstool/test/stool_0107.off\nstool/test/stool_0108.off\nstool/test/stool_0109.off\nstool/test/stool_0110.off\nmantel/test/mantel_0285.off\nmantel/test/mantel_0286.off\nmantel/test/mantel_0287.off\nmantel/test/mantel_0288.off\nmantel/test/mantel_0289.off\nmantel/test/mantel_0290.off\nmantel/test/mantel_0291.off\nmantel/test/mantel_0292.off\nmantel/test/mantel_0293.off\nmantel/test/mantel_0294.off\nmantel/test/mantel_0295.off\nmantel/test/mantel_0296.off\nmantel/test/mantel_0297.off\nmantel/test/mantel_0298.off\nmantel/test/mantel_0299.off\nmantel/test/mantel_0300.off\nmantel/test/mantel_0301.off\nmantel/test/mantel_0302.off\nmantel/test/mantel_0303.off\nmantel/test/mantel_0304.off\nmantel/test/mantel_0305.off\nmantel/test/mantel_0306.off\nmantel/test/mantel_0307.off\nmantel/test/mantel_0308.off\nmantel/test/mantel_0309.off\nmantel/test/mantel_0310.off\nmantel/test/mantel_0311.off\nmantel/test/mantel_0312.off\nmantel/test/mantel_0313.off\nmantel/test/mantel_0314.off\nmantel/test/mantel_0315.off\nmantel/test/mantel_0316.off\nmantel/test/mantel_0317.off\nmantel/test/mantel_0318.off\nmantel/test/mantel_0319.off\nmantel/test/mantel_0320.off\nmantel/test/mantel_0321.off\nmantel/test/mantel_0322.off\nmantel/test/mantel_0323.off\nmantel/test/mantel_0324.off\nmantel/test/mantel_0325.off\nmantel/test/mantel_0326.off\nmantel/test/mantel_0327.off\nmantel/test/mantel_0328.off\nmantel/test/mantel_0329.off\nmantel/test/mantel_0330.off\nmantel/test/mantel_0331.off\nmantel/test/mantel_0332.off\nmantel/test/mantel_0333.off\nmantel/test/mantel_0334.off\nmantel/test/mantel_0335.off\nmantel/test/mantel_0336.off\nmantel/test/mantel_0337.off\nmantel/test/mantel_0338.off\nmantel/test/mantel_0339.off\nmantel/test/mantel_0340.off\nmantel/test/mantel_0341.off\nmantel/test/mantel_0342.off\nmantel/test/mantel_0343.off\nmantel/test/mantel_0344.off\nmantel/test/mantel_0345.off\nmantel/test/mantel_0346.off\nmantel/test/mantel_0347.off\nmantel/test/mantel_0348.off\nmantel/test/mantel_0349.off\nmantel/test/mantel_0350.off\nmantel/test/mantel_0351.off\nmantel/test/mantel_0352.off\nmantel/test/mantel_0353.off\nmantel/test/mantel_0354.off\nmantel/test/mantel_0355.off\nmantel/test/mantel_0356.off\nmantel/test/mantel_0357.off\nmantel/test/mantel_0358.off\nmantel/test/mantel_0359.off\nmantel/test/mantel_0360.off\nmantel/test/mantel_0361.off\nmantel/test/mantel_0362.off\nmantel/test/mantel_0363.off\nmantel/test/mantel_0364.off\nmantel/test/mantel_0365.off\nmantel/test/mantel_0366.off\nmantel/test/mantel_0367.off\nmantel/test/mantel_0368.off\nmantel/test/mantel_0369.off\nmantel/test/mantel_0370.off\nmantel/test/mantel_0371.off\nmantel/test/mantel_0372.off\nmantel/test/mantel_0373.off\nmantel/test/mantel_0374.off\nmantel/test/mantel_0375.off\nmantel/test/mantel_0376.off\nmantel/test/mantel_0377.off\nmantel/test/mantel_0378.off\nmantel/test/mantel_0379.off\nmantel/test/mantel_0380.off\nmantel/test/mantel_0381.off\nmantel/test/mantel_0382.off\nmantel/test/mantel_0383.off\nmantel/test/mantel_0384.off\ncup/test/cup_0080.off\ncup/test/cup_0081.off\ncup/test/cup_0082.off\ncup/test/cup_0083.off\ncup/test/cup_0084.off\ncup/test/cup_0085.off\ncup/test/cup_0086.off\ncup/test/cup_0087.off\ncup/test/cup_0088.off\ncup/test/cup_0089.off\ncup/test/cup_0090.off\ncup/test/cup_0091.off\ncup/test/cup_0092.off\ncup/test/cup_0093.off\ncup/test/cup_0094.off\ncup/test/cup_0095.off\ncup/test/cup_0096.off\ncup/test/cup_0097.off\ncup/test/cup_0098.off\ncup/test/cup_0099.off\nradio/test/radio_0105.off\nradio/test/radio_0106.off\nradio/test/radio_0107.off\nradio/test/radio_0108.off\nradio/test/radio_0109.off\nradio/test/radio_0110.off\nradio/test/radio_0111.off\nradio/test/radio_0112.off\nradio/test/radio_0113.off\nradio/test/radio_0114.off\nradio/test/radio_0115.off\nradio/test/radio_0116.off\nradio/test/radio_0117.off\nradio/test/radio_0118.off\nradio/test/radio_0119.off\nradio/test/radio_0120.off\nradio/test/radio_0121.off\nradio/test/radio_0122.off\nradio/test/radio_0123.off\nradio/test/radio_0124.off\nairplane/test/airplane_0627.off\nairplane/test/airplane_0628.off\nairplane/test/airplane_0629.off\nairplane/test/airplane_0630.off\nairplane/test/airplane_0631.off\nairplane/test/airplane_0632.off\nairplane/test/airplane_0633.off\nairplane/test/airplane_0634.off\nairplane/test/airplane_0635.off\nairplane/test/airplane_0636.off\nairplane/test/airplane_0637.off\nairplane/test/airplane_0638.off\nairplane/test/airplane_0639.off\nairplane/test/airplane_0640.off\nairplane/test/airplane_0641.off\nairplane/test/airplane_0642.off\nairplane/test/airplane_0643.off\nairplane/test/airplane_0644.off\nairplane/test/airplane_0645.off\nairplane/test/airplane_0646.off\nairplane/test/airplane_0647.off\nairplane/test/airplane_0648.off\nairplane/test/airplane_0649.off\nairplane/test/airplane_0650.off\nairplane/test/airplane_0651.off\nairplane/test/airplane_0652.off\nairplane/test/airplane_0653.off\nairplane/test/airplane_0654.off\nairplane/test/airplane_0655.off\nairplane/test/airplane_0656.off\nairplane/test/airplane_0657.off\nairplane/test/airplane_0658.off\nairplane/test/airplane_0659.off\nairplane/test/airplane_0660.off\nairplane/test/airplane_0661.off\nairplane/test/airplane_0662.off\nairplane/test/airplane_0663.off\nairplane/test/airplane_0664.off\nairplane/test/airplane_0665.off\nairplane/test/airplane_0666.off\nairplane/test/airplane_0667.off\nairplane/test/airplane_0668.off\nairplane/test/airplane_0669.off\nairplane/test/airplane_0670.off\nairplane/test/airplane_0671.off\nairplane/test/airplane_0672.off\nairplane/test/airplane_0673.off\nairplane/test/airplane_0674.off\nairplane/test/airplane_0675.off\nairplane/test/airplane_0676.off\nairplane/test/airplane_0677.off\nairplane/test/airplane_0678.off\nairplane/test/airplane_0679.off\nairplane/test/airplane_0680.off\nairplane/test/airplane_0681.off\nairplane/test/airplane_0682.off\nairplane/test/airplane_0683.off\nairplane/test/airplane_0684.off\nairplane/test/airplane_0685.off\nairplane/test/airplane_0686.off\nairplane/test/airplane_0687.off\nairplane/test/airplane_0688.off\nairplane/test/airplane_0689.off\nairplane/test/airplane_0690.off\nairplane/test/airplane_0691.off\nairplane/test/airplane_0692.off\nairplane/test/airplane_0693.off\nairplane/test/airplane_0694.off\nairplane/test/airplane_0695.off\nairplane/test/airplane_0696.off\nairplane/test/airplane_0697.off\nairplane/test/airplane_0698.off\nairplane/test/airplane_0699.off\nairplane/test/airplane_0700.off\nairplane/test/airplane_0701.off\nairplane/test/airplane_0702.off\nairplane/test/airplane_0703.off\nairplane/test/airplane_0704.off\nairplane/test/airplane_0705.off\nairplane/test/airplane_0706.off\nairplane/test/airplane_0707.off\nairplane/test/airplane_0708.off\nairplane/test/airplane_0709.off\nairplane/test/airplane_0710.off\nairplane/test/airplane_0711.off\nairplane/test/airplane_0712.off\nairplane/test/airplane_0713.off\nairplane/test/airplane_0714.off\nairplane/test/airplane_0715.off\nairplane/test/airplane_0716.off\nairplane/test/airplane_0717.off\nairplane/test/airplane_0718.off\nairplane/test/airplane_0719.off\nairplane/test/airplane_0720.off\nairplane/test/airplane_0721.off\nairplane/test/airplane_0722.off\nairplane/test/airplane_0723.off\nairplane/test/airplane_0724.off\nairplane/test/airplane_0725.off\nairplane/test/airplane_0726.off\ntable/test/table_0393.off\ntable/test/table_0394.off\ntable/test/table_0395.off\ntable/test/table_0396.off\ntable/test/table_0397.off\ntable/test/table_0398.off\ntable/test/table_0399.off\ntable/test/table_0400.off\ntable/test/table_0401.off\ntable/test/table_0402.off\ntable/test/table_0403.off\ntable/test/table_0404.off\ntable/test/table_0405.off\ntable/test/table_0406.off\ntable/test/table_0407.off\ntable/test/table_0408.off\ntable/test/table_0409.off\ntable/test/table_0410.off\ntable/test/table_0411.off\ntable/test/table_0412.off\ntable/test/table_0413.off\ntable/test/table_0414.off\ntable/test/table_0415.off\ntable/test/table_0416.off\ntable/test/table_0417.off\ntable/test/table_0418.off\ntable/test/table_0419.off\ntable/test/table_0420.off\ntable/test/table_0421.off\ntable/test/table_0422.off\ntable/test/table_0423.off\ntable/test/table_0424.off\ntable/test/table_0425.off\ntable/test/table_0426.off\ntable/test/table_0427.off\ntable/test/table_0428.off\ntable/test/table_0429.off\ntable/test/table_0430.off\ntable/test/table_0431.off\ntable/test/table_0432.off\ntable/test/table_0433.off\ntable/test/table_0434.off\ntable/test/table_0435.off\ntable/test/table_0436.off\ntable/test/table_0437.off\ntable/test/table_0438.off\ntable/test/table_0439.off\ntable/test/table_0440.off\ntable/test/table_0441.off\ntable/test/table_0442.off\ntable/test/table_0443.off\ntable/test/table_0444.off\ntable/test/table_0445.off\ntable/test/table_0446.off\ntable/test/table_0447.off\ntable/test/table_0448.off\ntable/test/table_0449.off\ntable/test/table_0450.off\ntable/test/table_0451.off\ntable/test/table_0452.off\ntable/test/table_0453.off\ntable/test/table_0454.off\ntable/test/table_0455.off\ntable/test/table_0456.off\ntable/test/table_0457.off\ntable/test/table_0458.off\ntable/test/table_0459.off\ntable/test/table_0460.off\ntable/test/table_0461.off\ntable/test/table_0462.off\ntable/test/table_0463.off\ntable/test/table_0464.off\ntable/test/table_0465.off\ntable/test/table_0466.off\ntable/test/table_0467.off\ntable/test/table_0468.off\ntable/test/table_0469.off\ntable/test/table_0470.off\ntable/test/table_0471.off\ntable/test/table_0472.off\ntable/test/table_0473.off\ntable/test/table_0474.off\ntable/test/table_0475.off\ntable/test/table_0476.off\ntable/test/table_0477.off\ntable/test/table_0478.off\ntable/test/table_0479.off\ntable/test/table_0480.off\ntable/test/table_0481.off\ntable/test/table_0482.off\ntable/test/table_0483.off\ntable/test/table_0484.off\ntable/test/table_0485.off\ntable/test/table_0486.off\ntable/test/table_0487.off\ntable/test/table_0488.off\ntable/test/table_0489.off\ntable/test/table_0490.off\ntable/test/table_0491.off\ntable/test/table_0492.off\nbench/test/bench_0174.off\nbench/test/bench_0175.off\nbench/test/bench_0176.off\nbench/test/bench_0177.off\nbench/test/bench_0178.off\nbench/test/bench_0179.off\nbench/test/bench_0180.off\nbench/test/bench_0181.off\nbench/test/bench_0182.off\nbench/test/bench_0183.off\nbench/test/bench_0184.off\nbench/test/bench_0185.off\nbench/test/bench_0186.off\nbench/test/bench_0187.off\nbench/test/bench_0188.off\nbench/test/bench_0189.off\nbench/test/bench_0190.off\nbench/test/bench_0191.off\nbench/test/bench_0192.off\nbench/test/bench_0193.off\nplant/test/plant_0241.off\nplant/test/plant_0242.off\nplant/test/plant_0243.off\nplant/test/plant_0244.off\nplant/test/plant_0245.off\nplant/test/plant_0246.off\nplant/test/plant_0247.off\nplant/test/plant_0248.off\nplant/test/plant_0249.off\nplant/test/plant_0250.off\nplant/test/plant_0251.off\nplant/test/plant_0252.off\nplant/test/plant_0253.off\nplant/test/plant_0254.off\nplant/test/plant_0255.off\nplant/test/plant_0256.off\nplant/test/plant_0257.off\nplant/test/plant_0258.off\nplant/test/plant_0259.off\nplant/test/plant_0260.off\nplant/test/plant_0261.off\nplant/test/plant_0262.off\nplant/test/plant_0263.off\nplant/test/plant_0264.off\nplant/test/plant_0265.off\nplant/test/plant_0266.off\nplant/test/plant_0267.off\nplant/test/plant_0268.off\nplant/test/plant_0269.off\nplant/test/plant_0270.off\nplant/test/plant_0271.off\nplant/test/plant_0272.off\nplant/test/plant_0273.off\nplant/test/plant_0274.off\nplant/test/plant_0275.off\nplant/test/plant_0276.off\nplant/test/plant_0277.off\nplant/test/plant_0278.off\nplant/test/plant_0279.off\nplant/test/plant_0280.off\nplant/test/plant_0281.off\nplant/test/plant_0282.off\nplant/test/plant_0283.off\nplant/test/plant_0284.off\nplant/test/plant_0285.off\nplant/test/plant_0286.off\nplant/test/plant_0287.off\nplant/test/plant_0288.off\nplant/test/plant_0289.off\nplant/test/plant_0290.off\nplant/test/plant_0291.off\nplant/test/plant_0292.off\nplant/test/plant_0293.off\nplant/test/plant_0294.off\nplant/test/plant_0295.off\nplant/test/plant_0296.off\nplant/test/plant_0297.off\nplant/test/plant_0298.off\nplant/test/plant_0299.off\nplant/test/plant_0300.off\nplant/test/plant_0301.off\nplant/test/plant_0302.off\nplant/test/plant_0303.off\nplant/test/plant_0304.off\nplant/test/plant_0305.off\nplant/test/plant_0306.off\nplant/test/plant_0307.off\nplant/test/plant_0308.off\nplant/test/plant_0309.off\nplant/test/plant_0310.off\nplant/test/plant_0311.off\nplant/test/plant_0312.off\nplant/test/plant_0313.off\nplant/test/plant_0314.off\nplant/test/plant_0315.off\nplant/test/plant_0316.off\nplant/test/plant_0317.off\nplant/test/plant_0318.off\nplant/test/plant_0319.off\nplant/test/plant_0320.off\nplant/test/plant_0321.off\nplant/test/plant_0322.off\nplant/test/plant_0323.off\nplant/test/plant_0324.off\nplant/test/plant_0325.off\nplant/test/plant_0326.off\nplant/test/plant_0327.off\nplant/test/plant_0328.off\nplant/test/plant_0329.off\nplant/test/plant_0330.off\nplant/test/plant_0331.off\nplant/test/plant_0332.off\nplant/test/plant_0333.off\nplant/test/plant_0334.off\nplant/test/plant_0335.off\nplant/test/plant_0336.off\nplant/test/plant_0337.off\nplant/test/plant_0338.off\nplant/test/plant_0339.off\nplant/test/plant_0340.off\nchair/test/chair_0890.off\nchair/test/chair_0891.off\nchair/test/chair_0892.off\nchair/test/chair_0893.off\nchair/test/chair_0894.off\nchair/test/chair_0895.off\nchair/test/chair_0896.off\nchair/test/chair_0897.off\nchair/test/chair_0898.off\nchair/test/chair_0899.off\nchair/test/chair_0900.off\nchair/test/chair_0901.off\nchair/test/chair_0902.off\nchair/test/chair_0903.off\nchair/test/chair_0904.off\nchair/test/chair_0905.off\nchair/test/chair_0906.off\nchair/test/chair_0907.off\nchair/test/chair_0908.off\nchair/test/chair_0909.off\nchair/test/chair_0910.off\nchair/test/chair_0911.off\nchair/test/chair_0912.off\nchair/test/chair_0913.off\nchair/test/chair_0914.off\nchair/test/chair_0915.off\nchair/test/chair_0916.off\nchair/test/chair_0917.off\nchair/test/chair_0918.off\nchair/test/chair_0919.off\nchair/test/chair_0920.off\nchair/test/chair_0921.off\nchair/test/chair_0922.off\nchair/test/chair_0923.off\nchair/test/chair_0924.off\nchair/test/chair_0925.off\nchair/test/chair_0926.off\nchair/test/chair_0927.off\nchair/test/chair_0928.off\nchair/test/chair_0929.off\nchair/test/chair_0930.off\nchair/test/chair_0931.off\nchair/test/chair_0932.off\nchair/test/chair_0933.off\nchair/test/chair_0934.off\nchair/test/chair_0935.off\nchair/test/chair_0936.off\nchair/test/chair_0937.off\nchair/test/chair_0938.off\nchair/test/chair_0939.off\nchair/test/chair_0940.off\nchair/test/chair_0941.off\nchair/test/chair_0942.off\nchair/test/chair_0943.off\nchair/test/chair_0944.off\nchair/test/chair_0945.off\nchair/test/chair_0946.off\nchair/test/chair_0947.off\nchair/test/chair_0948.off\nchair/test/chair_0949.off\nchair/test/chair_0950.off\nchair/test/chair_0951.off\nchair/test/chair_0952.off\nchair/test/chair_0953.off\nchair/test/chair_0954.off\nchair/test/chair_0955.off\nchair/test/chair_0956.off\nchair/test/chair_0957.off\nchair/test/chair_0958.off\nchair/test/chair_0959.off\nchair/test/chair_0960.off\nchair/test/chair_0961.off\nchair/test/chair_0962.off\nchair/test/chair_0963.off\nchair/test/chair_0964.off\nchair/test/chair_0965.off\nchair/test/chair_0966.off\nchair/test/chair_0967.off\nchair/test/chair_0968.off\nchair/test/chair_0969.off\nchair/test/chair_0970.off\nchair/test/chair_0971.off\nchair/test/chair_0972.off\nchair/test/chair_0973.off\nchair/test/chair_0974.off\nchair/test/chair_0975.off\nchair/test/chair_0976.off\nchair/test/chair_0977.off\nchair/test/chair_0978.off\nchair/test/chair_0979.off\nchair/test/chair_0980.off\nchair/test/chair_0981.off\nchair/test/chair_0982.off\nchair/test/chair_0983.off\nchair/test/chair_0984.off\nchair/test/chair_0985.off\nchair/test/chair_0986.off\nchair/test/chair_0987.off\nchair/test/chair_0988.off\nchair/test/chair_0989.off\nvase/test/vase_0476.off\nvase/test/vase_0477.off\nvase/test/vase_0478.off\nvase/test/vase_0479.off\nvase/test/vase_0480.off\nvase/test/vase_0481.off\nvase/test/vase_0482.off\nvase/test/vase_0483.off\nvase/test/vase_0484.off\nvase/test/vase_0485.off\nvase/test/vase_0486.off\nvase/test/vase_0487.off\nvase/test/vase_0488.off\nvase/test/vase_0489.off\nvase/test/vase_0490.off\nvase/test/vase_0491.off\nvase/test/vase_0492.off\nvase/test/vase_0493.off\nvase/test/vase_0494.off\nvase/test/vase_0495.off\nvase/test/vase_0496.off\nvase/test/vase_0497.off\nvase/test/vase_0498.off\nvase/test/vase_0499.off\nvase/test/vase_0500.off\nvase/test/vase_0501.off\nvase/test/vase_0502.off\nvase/test/vase_0503.off\nvase/test/vase_0504.off\nvase/test/vase_0505.off\nvase/test/vase_0506.off\nvase/test/vase_0507.off\nvase/test/vase_0508.off\nvase/test/vase_0509.off\nvase/test/vase_0510.off\nvase/test/vase_0511.off\nvase/test/vase_0512.off\nvase/test/vase_0513.off\nvase/test/vase_0514.off\nvase/test/vase_0515.off\nvase/test/vase_0516.off\nvase/test/vase_0517.off\nvase/test/vase_0518.off\nvase/test/vase_0519.off\nvase/test/vase_0520.off\nvase/test/vase_0521.off\nvase/test/vase_0522.off\nvase/test/vase_0523.off\nvase/test/vase_0524.off\nvase/test/vase_0525.off\nvase/test/vase_0526.off\nvase/test/vase_0527.off\nvase/test/vase_0528.off\nvase/test/vase_0529.off\nvase/test/vase_0530.off\nvase/test/vase_0531.off\nvase/test/vase_0532.off\nvase/test/vase_0533.off\nvase/test/vase_0534.off\nvase/test/vase_0535.off\nvase/test/vase_0536.off\nvase/test/vase_0537.off\nvase/test/vase_0538.off\nvase/test/vase_0539.off\nvase/test/vase_0540.off\nvase/test/vase_0541.off\nvase/test/vase_0542.off\nvase/test/vase_0543.off\nvase/test/vase_0544.off\nvase/test/vase_0545.off\nvase/test/vase_0546.off\nvase/test/vase_0547.off\nvase/test/vase_0548.off\nvase/test/vase_0549.off\nvase/test/vase_0550.off\nvase/test/vase_0551.off\nvase/test/vase_0552.off\nvase/test/vase_0553.off\nvase/test/vase_0554.off\nvase/test/vase_0555.off\nvase/test/vase_0556.off\nvase/test/vase_0557.off\nvase/test/vase_0558.off\nvase/test/vase_0559.off\nvase/test/vase_0560.off\nvase/test/vase_0561.off\nvase/test/vase_0562.off\nvase/test/vase_0563.off\nvase/test/vase_0564.off\nvase/test/vase_0565.off\nvase/test/vase_0566.off\nvase/test/vase_0567.off\nvase/test/vase_0568.off\nvase/test/vase_0569.off\nvase/test/vase_0570.off\nvase/test/vase_0571.off\nvase/test/vase_0572.off\nvase/test/vase_0573.off\nvase/test/vase_0574.off\nvase/test/vase_0575.off\nbookshelf/test/bookshelf_0573.off\nbookshelf/test/bookshelf_0574.off\nbookshelf/test/bookshelf_0575.off\nbookshelf/test/bookshelf_0576.off\nbookshelf/test/bookshelf_0577.off\nbookshelf/test/bookshelf_0578.off\nbookshelf/test/bookshelf_0579.off\nbookshelf/test/bookshelf_0580.off\nbookshelf/test/bookshelf_0581.off\nbookshelf/test/bookshelf_0582.off\nbookshelf/test/bookshelf_0583.off\nbookshelf/test/bookshelf_0584.off\nbookshelf/test/bookshelf_0585.off\nbookshelf/test/bookshelf_0586.off\nbookshelf/test/bookshelf_0587.off\nbookshelf/test/bookshelf_0588.off\nbookshelf/test/bookshelf_0589.off\nbookshelf/test/bookshelf_0590.off\nbookshelf/test/bookshelf_0591.off\nbookshelf/test/bookshelf_0592.off\nbookshelf/test/bookshelf_0593.off\nbookshelf/test/bookshelf_0594.off\nbookshelf/test/bookshelf_0595.off\nbookshelf/test/bookshelf_0596.off\nbookshelf/test/bookshelf_0597.off\nbookshelf/test/bookshelf_0598.off\nbookshelf/test/bookshelf_0599.off\nbookshelf/test/bookshelf_0600.off\nbookshelf/test/bookshelf_0601.off\nbookshelf/test/bookshelf_0602.off\nbookshelf/test/bookshelf_0603.off\nbookshelf/test/bookshelf_0604.off\nbookshelf/test/bookshelf_0605.off\nbookshelf/test/bookshelf_0606.off\nbookshelf/test/bookshelf_0607.off\nbookshelf/test/bookshelf_0608.off\nbookshelf/test/bookshelf_0609.off\nbookshelf/test/bookshelf_0610.off\nbookshelf/test/bookshelf_0611.off\nbookshelf/test/bookshelf_0612.off\nbookshelf/test/bookshelf_0613.off\nbookshelf/test/bookshelf_0614.off\nbookshelf/test/bookshelf_0615.off\nbookshelf/test/bookshelf_0616.off\nbookshelf/test/bookshelf_0617.off\nbookshelf/test/bookshelf_0618.off\nbookshelf/test/bookshelf_0619.off\nbookshelf/test/bookshelf_0620.off\nbookshelf/test/bookshelf_0621.off\nbookshelf/test/bookshelf_0622.off\nbookshelf/test/bookshelf_0623.off\nbookshelf/test/bookshelf_0624.off\nbookshelf/test/bookshelf_0625.off\nbookshelf/test/bookshelf_0626.off\nbookshelf/test/bookshelf_0627.off\nbookshelf/test/bookshelf_0628.off\nbookshelf/test/bookshelf_0629.off\nbookshelf/test/bookshelf_0630.off\nbookshelf/test/bookshelf_0631.off\nbookshelf/test/bookshelf_0632.off\nbookshelf/test/bookshelf_0633.off\nbookshelf/test/bookshelf_0634.off\nbookshelf/test/bookshelf_0635.off\nbookshelf/test/bookshelf_0636.off\nbookshelf/test/bookshelf_0637.off\nbookshelf/test/bookshelf_0638.off\nbookshelf/test/bookshelf_0639.off\nbookshelf/test/bookshelf_0640.off\nbookshelf/test/bookshelf_0641.off\nbookshelf/test/bookshelf_0642.off\nbookshelf/test/bookshelf_0643.off\nbookshelf/test/bookshelf_0644.off\nbookshelf/test/bookshelf_0645.off\nbookshelf/test/bookshelf_0646.off\nbookshelf/test/bookshelf_0647.off\nbookshelf/test/bookshelf_0648.off\nbookshelf/test/bookshelf_0649.off\nbookshelf/test/bookshelf_0650.off\nbookshelf/test/bookshelf_0651.off\nbookshelf/test/bookshelf_0652.off\nbookshelf/test/bookshelf_0653.off\nbookshelf/test/bookshelf_0654.off\nbookshelf/test/bookshelf_0655.off\nbookshelf/test/bookshelf_0656.off\nbookshelf/test/bookshelf_0657.off\nbookshelf/test/bookshelf_0658.off\nbookshelf/test/bookshelf_0659.off\nbookshelf/test/bookshelf_0660.off\nbookshelf/test/bookshelf_0661.off\nbookshelf/test/bookshelf_0662.off\nbookshelf/test/bookshelf_0663.off\nbookshelf/test/bookshelf_0664.off\nbookshelf/test/bookshelf_0665.off\nbookshelf/test/bookshelf_0666.off\nbookshelf/test/bookshelf_0667.off\nbookshelf/test/bookshelf_0668.off\nbookshelf/test/bookshelf_0669.off\nbookshelf/test/bookshelf_0670.off\nbookshelf/test/bookshelf_0671.off\nbookshelf/test/bookshelf_0672.off\nguitar/test/guitar_0156.off\nguitar/test/guitar_0157.off\nguitar/test/guitar_0158.off\nguitar/test/guitar_0159.off\nguitar/test/guitar_0160.off\nguitar/test/guitar_0161.off\nguitar/test/guitar_0162.off\nguitar/test/guitar_0163.off\nguitar/test/guitar_0164.off\nguitar/test/guitar_0165.off\nguitar/test/guitar_0166.off\nguitar/test/guitar_0167.off\nguitar/test/guitar_0168.off\nguitar/test/guitar_0169.off\nguitar/test/guitar_0170.off\nguitar/test/guitar_0171.off\nguitar/test/guitar_0172.off\nguitar/test/guitar_0173.off\nguitar/test/guitar_0174.off\nguitar/test/guitar_0175.off\nguitar/test/guitar_0176.off\nguitar/test/guitar_0177.off\nguitar/test/guitar_0178.off\nguitar/test/guitar_0179.off\nguitar/test/guitar_0180.off\nguitar/test/guitar_0181.off\nguitar/test/guitar_0182.off\nguitar/test/guitar_0183.off\nguitar/test/guitar_0184.off\nguitar/test/guitar_0185.off\nguitar/test/guitar_0186.off\nguitar/test/guitar_0187.off\nguitar/test/guitar_0188.off\nguitar/test/guitar_0189.off\nguitar/test/guitar_0190.off\nguitar/test/guitar_0191.off\nguitar/test/guitar_0192.off\nguitar/test/guitar_0193.off\nguitar/test/guitar_0194.off\nguitar/test/guitar_0195.off\nguitar/test/guitar_0196.off\nguitar/test/guitar_0197.off\nguitar/test/guitar_0198.off\nguitar/test/guitar_0199.off\nguitar/test/guitar_0200.off\nguitar/test/guitar_0201.off\nguitar/test/guitar_0202.off\nguitar/test/guitar_0203.off\nguitar/test/guitar_0204.off\nguitar/test/guitar_0205.off\nguitar/test/guitar_0206.off\nguitar/test/guitar_0207.off\nguitar/test/guitar_0208.off\nguitar/test/guitar_0209.off\nguitar/test/guitar_0210.off\nguitar/test/guitar_0211.off\nguitar/test/guitar_0212.off\nguitar/test/guitar_0213.off\nguitar/test/guitar_0214.off\nguitar/test/guitar_0215.off\nguitar/test/guitar_0216.off\nguitar/test/guitar_0217.off\nguitar/test/guitar_0218.off\nguitar/test/guitar_0219.off\nguitar/test/guitar_0220.off\nguitar/test/guitar_0221.off\nguitar/test/guitar_0222.off\nguitar/test/guitar_0223.off\nguitar/test/guitar_0224.off\nguitar/test/guitar_0225.off\nguitar/test/guitar_0226.off\nguitar/test/guitar_0227.off\nguitar/test/guitar_0228.off\nguitar/test/guitar_0229.off\nguitar/test/guitar_0230.off\nguitar/test/guitar_0231.off\nguitar/test/guitar_0232.off\nguitar/test/guitar_0233.off\nguitar/test/guitar_0234.off\nguitar/test/guitar_0235.off\nguitar/test/guitar_0236.off\nguitar/test/guitar_0237.off\nguitar/test/guitar_0238.off\nguitar/test/guitar_0239.off\nguitar/test/guitar_0240.off\nguitar/test/guitar_0241.off\nguitar/test/guitar_0242.off\nguitar/test/guitar_0243.off\nguitar/test/guitar_0244.off\nguitar/test/guitar_0245.off\nguitar/test/guitar_0246.off\nguitar/test/guitar_0247.off\nguitar/test/guitar_0248.off\nguitar/test/guitar_0249.off\nguitar/test/guitar_0250.off\nguitar/test/guitar_0251.off\nguitar/test/guitar_0252.off\nguitar/test/guitar_0253.off\nguitar/test/guitar_0254.off\nguitar/test/guitar_0255.off\ntv_stand/test/tv_stand_0268.off\ntv_stand/test/tv_stand_0269.off\ntv_stand/test/tv_stand_0270.off\ntv_stand/test/tv_stand_0271.off\ntv_stand/test/tv_stand_0272.off\ntv_stand/test/tv_stand_0273.off\ntv_stand/test/tv_stand_0274.off\ntv_stand/test/tv_stand_0275.off\ntv_stand/test/tv_stand_0276.off\ntv_stand/test/tv_stand_0277.off\ntv_stand/test/tv_stand_0278.off\ntv_stand/test/tv_stand_0279.off\ntv_stand/test/tv_stand_0280.off\ntv_stand/test/tv_stand_0281.off\ntv_stand/test/tv_stand_0282.off\ntv_stand/test/tv_stand_0283.off\ntv_stand/test/tv_stand_0284.off\ntv_stand/test/tv_stand_0285.off\ntv_stand/test/tv_stand_0286.off\ntv_stand/test/tv_stand_0287.off\ntv_stand/test/tv_stand_0288.off\ntv_stand/test/tv_stand_0289.off\ntv_stand/test/tv_stand_0290.off\ntv_stand/test/tv_stand_0291.off\ntv_stand/test/tv_stand_0292.off\ntv_stand/test/tv_stand_0293.off\ntv_stand/test/tv_stand_0294.off\ntv_stand/test/tv_stand_0295.off\ntv_stand/test/tv_stand_0296.off\ntv_stand/test/tv_stand_0297.off\ntv_stand/test/tv_stand_0298.off\ntv_stand/test/tv_stand_0299.off\ntv_stand/test/tv_stand_0300.off\ntv_stand/test/tv_stand_0301.off\ntv_stand/test/tv_stand_0302.off\ntv_stand/test/tv_stand_0303.off\ntv_stand/test/tv_stand_0304.off\ntv_stand/test/tv_stand_0305.off\ntv_stand/test/tv_stand_0306.off\ntv_stand/test/tv_stand_0307.off\ntv_stand/test/tv_stand_0308.off\ntv_stand/test/tv_stand_0309.off\ntv_stand/test/tv_stand_0310.off\ntv_stand/test/tv_stand_0311.off\ntv_stand/test/tv_stand_0312.off\ntv_stand/test/tv_stand_0313.off\ntv_stand/test/tv_stand_0314.off\ntv_stand/test/tv_stand_0315.off\ntv_stand/test/tv_stand_0316.off\ntv_stand/test/tv_stand_0317.off\ntv_stand/test/tv_stand_0318.off\ntv_stand/test/tv_stand_0319.off\ntv_stand/test/tv_stand_0320.off\ntv_stand/test/tv_stand_0321.off\ntv_stand/test/tv_stand_0322.off\ntv_stand/test/tv_stand_0323.off\ntv_stand/test/tv_stand_0324.off\ntv_stand/test/tv_stand_0325.off\ntv_stand/test/tv_stand_0326.off\ntv_stand/test/tv_stand_0327.off\ntv_stand/test/tv_stand_0328.off\ntv_stand/test/tv_stand_0329.off\ntv_stand/test/tv_stand_0330.off\ntv_stand/test/tv_stand_0331.off\ntv_stand/test/tv_stand_0332.off\ntv_stand/test/tv_stand_0333.off\ntv_stand/test/tv_stand_0334.off\ntv_stand/test/tv_stand_0335.off\ntv_stand/test/tv_stand_0336.off\ntv_stand/test/tv_stand_0337.off\ntv_stand/test/tv_stand_0338.off\ntv_stand/test/tv_stand_0339.off\ntv_stand/test/tv_stand_0340.off\ntv_stand/test/tv_stand_0341.off\ntv_stand/test/tv_stand_0342.off\ntv_stand/test/tv_stand_0343.off\ntv_stand/test/tv_stand_0344.off\ntv_stand/test/tv_stand_0345.off\ntv_stand/test/tv_stand_0346.off\ntv_stand/test/tv_stand_0347.off\ntv_stand/test/tv_stand_0348.off\ntv_stand/test/tv_stand_0349.off\ntv_stand/test/tv_stand_0350.off\ntv_stand/test/tv_stand_0351.off\ntv_stand/test/tv_stand_0352.off\ntv_stand/test/tv_stand_0353.off\ntv_stand/test/tv_stand_0354.off\ntv_stand/test/tv_stand_0355.off\ntv_stand/test/tv_stand_0356.off\ntv_stand/test/tv_stand_0357.off\ntv_stand/test/tv_stand_0358.off\ntv_stand/test/tv_stand_0359.off\ntv_stand/test/tv_stand_0360.off\ntv_stand/test/tv_stand_0361.off\ntv_stand/test/tv_stand_0362.off\ntv_stand/test/tv_stand_0363.off\ntv_stand/test/tv_stand_0364.off\ntv_stand/test/tv_stand_0365.off\ntv_stand/test/tv_stand_0366.off\ntv_stand/test/tv_stand_0367.off\nbathtub/test/bathtub_0107.off\nbathtub/test/bathtub_0108.off\nbathtub/test/bathtub_0109.off\nbathtub/test/bathtub_0110.off\nbathtub/test/bathtub_0111.off\nbathtub/test/bathtub_0112.off\nbathtub/test/bathtub_0113.off\nbathtub/test/bathtub_0114.off\nbathtub/test/bathtub_0115.off\nbathtub/test/bathtub_0116.off\nbathtub/test/bathtub_0117.off\nbathtub/test/bathtub_0118.off\nbathtub/test/bathtub_0119.off\nbathtub/test/bathtub_0120.off\nbathtub/test/bathtub_0121.off\nbathtub/test/bathtub_0122.off\nbathtub/test/bathtub_0123.off\nbathtub/test/bathtub_0124.off\nbathtub/test/bathtub_0125.off\nbathtub/test/bathtub_0126.off\nbathtub/test/bathtub_0127.off\nbathtub/test/bathtub_0128.off\nbathtub/test/bathtub_0129.off\nbathtub/test/bathtub_0130.off\nbathtub/test/bathtub_0131.off\nbathtub/test/bathtub_0132.off\nbathtub/test/bathtub_0133.off\nbathtub/test/bathtub_0134.off\nbathtub/test/bathtub_0135.off\nbathtub/test/bathtub_0136.off\nbathtub/test/bathtub_0137.off\nbathtub/test/bathtub_0138.off\nbathtub/test/bathtub_0139.off\nbathtub/test/bathtub_0140.off\nbathtub/test/bathtub_0141.off\nbathtub/test/bathtub_0142.off\nbathtub/test/bathtub_0143.off\nbathtub/test/bathtub_0144.off\nbathtub/test/bathtub_0145.off\nbathtub/test/bathtub_0146.off\nbathtub/test/bathtub_0147.off\nbathtub/test/bathtub_0148.off\nbathtub/test/bathtub_0149.off\nbathtub/test/bathtub_0150.off\nbathtub/test/bathtub_0151.off\nbathtub/test/bathtub_0152.off\nbathtub/test/bathtub_0153.off\nbathtub/test/bathtub_0154.off\nbathtub/test/bathtub_0155.off\nbathtub/test/bathtub_0156.off\nmonitor/test/monitor_0466.off\nmonitor/test/monitor_0467.off\nmonitor/test/monitor_0468.off\nmonitor/test/monitor_0469.off\nmonitor/test/monitor_0470.off\nmonitor/test/monitor_0471.off\nmonitor/test/monitor_0472.off\nmonitor/test/monitor_0473.off\nmonitor/test/monitor_0474.off\nmonitor/test/monitor_0475.off\nmonitor/test/monitor_0476.off\nmonitor/test/monitor_0477.off\nmonitor/test/monitor_0478.off\nmonitor/test/monitor_0479.off\nmonitor/test/monitor_0480.off\nmonitor/test/monitor_0481.off\nmonitor/test/monitor_0482.off\nmonitor/test/monitor_0483.off\nmonitor/test/monitor_0484.off\nmonitor/test/monitor_0485.off\nmonitor/test/monitor_0486.off\nmonitor/test/monitor_0487.off\nmonitor/test/monitor_0488.off\nmonitor/test/monitor_0489.off\nmonitor/test/monitor_0490.off\nmonitor/test/monitor_0491.off\nmonitor/test/monitor_0492.off\nmonitor/test/monitor_0493.off\nmonitor/test/monitor_0494.off\nmonitor/test/monitor_0495.off\nmonitor/test/monitor_0496.off\nmonitor/test/monitor_0497.off\nmonitor/test/monitor_0498.off\nmonitor/test/monitor_0499.off\nmonitor/test/monitor_0500.off\nmonitor/test/monitor_0501.off\nmonitor/test/monitor_0502.off\nmonitor/test/monitor_0503.off\nmonitor/test/monitor_0504.off\nmonitor/test/monitor_0505.off\nmonitor/test/monitor_0506.off\nmonitor/test/monitor_0507.off\nmonitor/test/monitor_0508.off\nmonitor/test/monitor_0509.off\nmonitor/test/monitor_0510.off\nmonitor/test/monitor_0511.off\nmonitor/test/monitor_0512.off\nmonitor/test/monitor_0513.off\nmonitor/test/monitor_0514.off\nmonitor/test/monitor_0515.off\nmonitor/test/monitor_0516.off\nmonitor/test/monitor_0517.off\nmonitor/test/monitor_0518.off\nmonitor/test/monitor_0519.off\nmonitor/test/monitor_0520.off\nmonitor/test/monitor_0521.off\nmonitor/test/monitor_0522.off\nmonitor/test/monitor_0523.off\nmonitor/test/monitor_0524.off\nmonitor/test/monitor_0525.off\nmonitor/test/monitor_0526.off\nmonitor/test/monitor_0527.off\nmonitor/test/monitor_0528.off\nmonitor/test/monitor_0529.off\nmonitor/test/monitor_0530.off\nmonitor/test/monitor_0531.off\nmonitor/test/monitor_0532.off\nmonitor/test/monitor_0533.off\nmonitor/test/monitor_0534.off\nmonitor/test/monitor_0535.off\nmonitor/test/monitor_0536.off\nmonitor/test/monitor_0537.off\nmonitor/test/monitor_0538.off\nmonitor/test/monitor_0539.off\nmonitor/test/monitor_0540.off\nmonitor/test/monitor_0541.off\nmonitor/test/monitor_0542.off\nmonitor/test/monitor_0543.off\nmonitor/test/monitor_0544.off\nmonitor/test/monitor_0545.off\nmonitor/test/monitor_0546.off\nmonitor/test/monitor_0547.off\nmonitor/test/monitor_0548.off\nmonitor/test/monitor_0549.off\nmonitor/test/monitor_0550.off\nmonitor/test/monitor_0551.off\nmonitor/test/monitor_0552.off\nmonitor/test/monitor_0553.off\nmonitor/test/monitor_0554.off\nmonitor/test/monitor_0555.off\nmonitor/test/monitor_0556.off\nmonitor/test/monitor_0557.off\nmonitor/test/monitor_0558.off\nmonitor/test/monitor_0559.off\nmonitor/test/monitor_0560.off\nmonitor/test/monitor_0561.off\nmonitor/test/monitor_0562.off\nmonitor/test/monitor_0563.off\nmonitor/test/monitor_0564.off\nmonitor/test/monitor_0565.off\nbottle/test/bottle_0336.off\nbottle/test/bottle_0337.off\nbottle/test/bottle_0338.off\nbottle/test/bottle_0339.off\nbottle/test/bottle_0340.off\nbottle/test/bottle_0341.off\nbottle/test/bottle_0342.off\nbottle/test/bottle_0343.off\nbottle/test/bottle_0344.off\nbottle/test/bottle_0345.off\nbottle/test/bottle_0346.off\nbottle/test/bottle_0347.off\nbottle/test/bottle_0348.off\nbottle/test/bottle_0349.off\nbottle/test/bottle_0350.off\nbottle/test/bottle_0351.off\nbottle/test/bottle_0352.off\nbottle/test/bottle_0353.off\nbottle/test/bottle_0354.off\nbottle/test/bottle_0355.off\nbottle/test/bottle_0356.off\nbottle/test/bottle_0357.off\nbottle/test/bottle_0358.off\nbottle/test/bottle_0359.off\nbottle/test/bottle_0360.off\nbottle/test/bottle_0361.off\nbottle/test/bottle_0362.off\nbottle/test/bottle_0363.off\nbottle/test/bottle_0364.off\nbottle/test/bottle_0365.off\nbottle/test/bottle_0366.off\nbottle/test/bottle_0367.off\nbottle/test/bottle_0368.off\nbottle/test/bottle_0369.off\nbottle/test/bottle_0370.off\nbottle/test/bottle_0371.off\nbottle/test/bottle_0372.off\nbottle/test/bottle_0373.off\nbottle/test/bottle_0374.off\nbottle/test/bottle_0375.off\nbottle/test/bottle_0376.off\nbottle/test/bottle_0377.off\nbottle/test/bottle_0378.off\nbottle/test/bottle_0379.off\nbottle/test/bottle_0380.off\nbottle/test/bottle_0381.off\nbottle/test/bottle_0382.off\nbottle/test/bottle_0383.off\nbottle/test/bottle_0384.off\nbottle/test/bottle_0385.off\nbottle/test/bottle_0386.off\nbottle/test/bottle_0387.off\nbottle/test/bottle_0388.off\nbottle/test/bottle_0389.off\nbottle/test/bottle_0390.off\nbottle/test/bottle_0391.off\nbottle/test/bottle_0392.off\nbottle/test/bottle_0393.off\nbottle/test/bottle_0394.off\nbottle/test/bottle_0395.off\nbottle/test/bottle_0396.off\nbottle/test/bottle_0397.off\nbottle/test/bottle_0398.off\nbottle/test/bottle_0399.off\nbottle/test/bottle_0400.off\nbottle/test/bottle_0401.off\nbottle/test/bottle_0402.off\nbottle/test/bottle_0403.off\nbottle/test/bottle_0404.off\nbottle/test/bottle_0405.off\nbottle/test/bottle_0406.off\nbottle/test/bottle_0407.off\nbottle/test/bottle_0408.off\nbottle/test/bottle_0409.off\nbottle/test/bottle_0410.off\nbottle/test/bottle_0411.off\nbottle/test/bottle_0412.off\nbottle/test/bottle_0413.off\nbottle/test/bottle_0414.off\nbottle/test/bottle_0415.off\nbottle/test/bottle_0416.off\nbottle/test/bottle_0417.off\nbottle/test/bottle_0418.off\nbottle/test/bottle_0419.off\nbottle/test/bottle_0420.off\nbottle/test/bottle_0421.off\nbottle/test/bottle_0422.off\nbottle/test/bottle_0423.off\nbottle/test/bottle_0424.off\nbottle/test/bottle_0425.off\nbottle/test/bottle_0426.off\nbottle/test/bottle_0427.off\nbottle/test/bottle_0428.off\nbottle/test/bottle_0429.off\nbottle/test/bottle_0430.off\nbottle/test/bottle_0431.off\nbottle/test/bottle_0432.off\nbottle/test/bottle_0433.off\nbottle/test/bottle_0434.off\nbottle/test/bottle_0435.off\nbowl/test/bowl_0065.off\nbowl/test/bowl_0066.off\nbowl/test/bowl_0067.off\nbowl/test/bowl_0068.off\nbowl/test/bowl_0069.off\nbowl/test/bowl_0070.off\nbowl/test/bowl_0071.off\nbowl/test/bowl_0072.off\nbowl/test/bowl_0073.off\nbowl/test/bowl_0074.off\nbowl/test/bowl_0075.off\nbowl/test/bowl_0076.off\nbowl/test/bowl_0077.off\nbowl/test/bowl_0078.off\nbowl/test/bowl_0079.off\nbowl/test/bowl_0080.off\nbowl/test/bowl_0081.off\nbowl/test/bowl_0082.off\nbowl/test/bowl_0083.off\nbowl/test/bowl_0084.off\nkeyboard/test/keyboard_0146.off\nkeyboard/test/keyboard_0147.off\nkeyboard/test/keyboard_0148.off\nkeyboard/test/keyboard_0149.off\nkeyboard/test/keyboard_0150.off\nkeyboard/test/keyboard_0151.off\nkeyboard/test/keyboard_0152.off\nkeyboard/test/keyboard_0153.off\nkeyboard/test/keyboard_0154.off\nkeyboard/test/keyboard_0155.off\nkeyboard/test/keyboard_0156.off\nkeyboard/test/keyboard_0157.off\nkeyboard/test/keyboard_0158.off\nkeyboard/test/keyboard_0159.off\nkeyboard/test/keyboard_0160.off\nkeyboard/test/keyboard_0161.off\nkeyboard/test/keyboard_0162.off\nkeyboard/test/keyboard_0163.off\nkeyboard/test/keyboard_0164.off\nkeyboard/test/keyboard_0165.off\ndesk/test/desk_0201.off\ndesk/test/desk_0202.off\ndesk/test/desk_0203.off\ndesk/test/desk_0204.off\ndesk/test/desk_0205.off\ndesk/test/desk_0206.off\ndesk/test/desk_0207.off\ndesk/test/desk_0208.off\ndesk/test/desk_0209.off\ndesk/test/desk_0210.off\ndesk/test/desk_0211.off\ndesk/test/desk_0212.off\ndesk/test/desk_0213.off\ndesk/test/desk_0214.off\ndesk/test/desk_0215.off\ndesk/test/desk_0216.off\ndesk/test/desk_0217.off\ndesk/test/desk_0218.off\ndesk/test/desk_0219.off\ndesk/test/desk_0220.off\ndesk/test/desk_0221.off\ndesk/test/desk_0222.off\ndesk/test/desk_0223.off\ndesk/test/desk_0224.off\ndesk/test/desk_0225.off\ndesk/test/desk_0226.off\ndesk/test/desk_0227.off\ndesk/test/desk_0228.off\ndesk/test/desk_0229.off\ndesk/test/desk_0230.off\ndesk/test/desk_0231.off\ndesk/test/desk_0232.off\ndesk/test/desk_0233.off\ndesk/test/desk_0234.off\ndesk/test/desk_0235.off\ndesk/test/desk_0236.off\ndesk/test/desk_0237.off\ndesk/test/desk_0238.off\ndesk/test/desk_0239.off\ndesk/test/desk_0240.off\ndesk/test/desk_0241.off\ndesk/test/desk_0242.off\ndesk/test/desk_0243.off\ndesk/test/desk_0244.off\ndesk/test/desk_0245.off\ndesk/test/desk_0246.off\ndesk/test/desk_0247.off\ndesk/test/desk_0248.off\ndesk/test/desk_0249.off\ndesk/test/desk_0250.off\ndesk/test/desk_0251.off\ndesk/test/desk_0252.off\ndesk/test/desk_0253.off\ndesk/test/desk_0254.off\ndesk/test/desk_0255.off\ndesk/test/desk_0256.off\ndesk/test/desk_0257.off\ndesk/test/desk_0258.off\ndesk/test/desk_0259.off\ndesk/test/desk_0260.off\ndesk/test/desk_0261.off\ndesk/test/desk_0262.off\ndesk/test/desk_0263.off\ndesk/test/desk_0264.off\ndesk/test/desk_0265.off\ndesk/test/desk_0266.off\ndesk/test/desk_0267.off\ndesk/test/desk_0268.off\ndesk/test/desk_0269.off\ndesk/test/desk_0270.off\ndesk/test/desk_0271.off\ndesk/test/desk_0272.off\ndesk/test/desk_0273.off\ndesk/test/desk_0274.off\ndesk/test/desk_0275.off\ndesk/test/desk_0276.off\ndesk/test/desk_0277.off\ndesk/test/desk_0278.off\ndesk/test/desk_0279.off\ndesk/test/desk_0280.off\ndesk/test/desk_0281.off\ndesk/test/desk_0282.off\ndesk/test/desk_0283.off\ndesk/test/desk_0284.off\ndesk/test/desk_0285.off\ndesk/test/desk_0286.off\nbed/test/bed_0516.off\nbed/test/bed_0517.off\nbed/test/bed_0518.off\nbed/test/bed_0519.off\nbed/test/bed_0520.off\nbed/test/bed_0521.off\nbed/test/bed_0522.off\nbed/test/bed_0523.off\nbed/test/bed_0524.off\nbed/test/bed_0525.off\nbed/test/bed_0526.off\nbed/test/bed_0527.off\nbed/test/bed_0528.off\nbed/test/bed_0529.off\nbed/test/bed_0530.off\nbed/test/bed_0531.off\nbed/test/bed_0532.off\nbed/test/bed_0533.off\nbed/test/bed_0534.off\nbed/test/bed_0535.off\nbed/test/bed_0536.off\nbed/test/bed_0537.off\nbed/test/bed_0538.off\nbed/test/bed_0539.off\nbed/test/bed_0540.off\nbed/test/bed_0541.off\nbed/test/bed_0542.off\nbed/test/bed_0543.off\nbed/test/bed_0544.off\nbed/test/bed_0545.off\nbed/test/bed_0546.off\nbed/test/bed_0547.off\nbed/test/bed_0548.off\nbed/test/bed_0549.off\nbed/test/bed_0550.off\nbed/test/bed_0551.off\nbed/test/bed_0552.off\nbed/test/bed_0553.off\nbed/test/bed_0554.off\nbed/test/bed_0555.off\nbed/test/bed_0556.off\nbed/test/bed_0557.off\nbed/test/bed_0558.off\nbed/test/bed_0559.off\nbed/test/bed_0560.off\nbed/test/bed_0561.off\nbed/test/bed_0562.off\nbed/test/bed_0563.off\nbed/test/bed_0564.off\nbed/test/bed_0565.off\nbed/test/bed_0566.off\nbed/test/bed_0567.off\nbed/test/bed_0568.off\nbed/test/bed_0569.off\nbed/test/bed_0570.off\nbed/test/bed_0571.off\nbed/test/bed_0572.off\nbed/test/bed_0573.off\nbed/test/bed_0574.off\nbed/test/bed_0575.off\nbed/test/bed_0576.off\nbed/test/bed_0577.off\nbed/test/bed_0578.off\nbed/test/bed_0579.off\nbed/test/bed_0580.off\nbed/test/bed_0581.off\nbed/test/bed_0582.off\nbed/test/bed_0583.off\nbed/test/bed_0584.off\nbed/test/bed_0585.off\nbed/test/bed_0586.off\nbed/test/bed_0587.off\nbed/test/bed_0588.off\nbed/test/bed_0589.off\nbed/test/bed_0590.off\nbed/test/bed_0591.off\nbed/test/bed_0592.off\nbed/test/bed_0593.off\nbed/test/bed_0594.off\nbed/test/bed_0595.off\nbed/test/bed_0596.off\nbed/test/bed_0597.off\nbed/test/bed_0598.off\nbed/test/bed_0599.off\nbed/test/bed_0600.off\nbed/test/bed_0601.off\nbed/test/bed_0602.off\nbed/test/bed_0603.off\nbed/test/bed_0604.off\nbed/test/bed_0605.off\nbed/test/bed_0606.off\nbed/test/bed_0607.off\nbed/test/bed_0608.off\nbed/test/bed_0609.off\nbed/test/bed_0610.off\nbed/test/bed_0611.off\nbed/test/bed_0612.off\nbed/test/bed_0613.off\nbed/test/bed_0614.off\nbed/test/bed_0615.off\ntent/test/tent_0164.off\ntent/test/tent_0165.off\ntent/test/tent_0166.off\ntent/test/tent_0167.off\ntent/test/tent_0168.off\ntent/test/tent_0169.off\ntent/test/tent_0170.off\ntent/test/tent_0171.off\ntent/test/tent_0172.off\ntent/test/tent_0173.off\ntent/test/tent_0174.off\ntent/test/tent_0175.off\ntent/test/tent_0176.off\ntent/test/tent_0177.off\ntent/test/tent_0178.off\ntent/test/tent_0179.off\ntent/test/tent_0180.off\ntent/test/tent_0181.off\ntent/test/tent_0182.off\ntent/test/tent_0183.off\npiano/test/piano_0232.off\npiano/test/piano_0233.off\npiano/test/piano_0234.off\npiano/test/piano_0235.off\npiano/test/piano_0236.off\npiano/test/piano_0237.off\npiano/test/piano_0238.off\npiano/test/piano_0239.off\npiano/test/piano_0240.off\npiano/test/piano_0241.off\npiano/test/piano_0242.off\npiano/test/piano_0243.off\npiano/test/piano_0244.off\npiano/test/piano_0245.off\npiano/test/piano_0246.off\npiano/test/piano_0247.off\npiano/test/piano_0248.off\npiano/test/piano_0249.off\npiano/test/piano_0250.off\npiano/test/piano_0251.off\npiano/test/piano_0252.off\npiano/test/piano_0253.off\npiano/test/piano_0254.off\npiano/test/piano_0255.off\npiano/test/piano_0256.off\npiano/test/piano_0257.off\npiano/test/piano_0258.off\npiano/test/piano_0259.off\npiano/test/piano_0260.off\npiano/test/piano_0261.off\npiano/test/piano_0262.off\npiano/test/piano_0263.off\npiano/test/piano_0264.off\npiano/test/piano_0265.off\npiano/test/piano_0266.off\npiano/test/piano_0267.off\npiano/test/piano_0268.off\npiano/test/piano_0269.off\npiano/test/piano_0270.off\npiano/test/piano_0271.off\npiano/test/piano_0272.off\npiano/test/piano_0273.off\npiano/test/piano_0274.off\npiano/test/piano_0275.off\npiano/test/piano_0276.off\npiano/test/piano_0277.off\npiano/test/piano_0278.off\npiano/test/piano_0279.off\npiano/test/piano_0280.off\npiano/test/piano_0281.off\npiano/test/piano_0282.off\npiano/test/piano_0283.off\npiano/test/piano_0284.off\npiano/test/piano_0285.off\npiano/test/piano_0286.off\npiano/test/piano_0287.off\npiano/test/piano_0288.off\npiano/test/piano_0289.off\npiano/test/piano_0290.off\npiano/test/piano_0291.off\npiano/test/piano_0292.off\npiano/test/piano_0293.off\npiano/test/piano_0294.off\npiano/test/piano_0295.off\npiano/test/piano_0296.off\npiano/test/piano_0297.off\npiano/test/piano_0298.off\npiano/test/piano_0299.off\npiano/test/piano_0300.off\npiano/test/piano_0301.off\npiano/test/piano_0302.off\npiano/test/piano_0303.off\npiano/test/piano_0304.off\npiano/test/piano_0305.off\npiano/test/piano_0306.off\npiano/test/piano_0307.off\npiano/test/piano_0308.off\npiano/test/piano_0309.off\npiano/test/piano_0310.off\npiano/test/piano_0311.off\npiano/test/piano_0312.off\npiano/test/piano_0313.off\npiano/test/piano_0314.off\npiano/test/piano_0315.off\npiano/test/piano_0316.off\npiano/test/piano_0317.off\npiano/test/piano_0318.off\npiano/test/piano_0319.off\npiano/test/piano_0320.off\npiano/test/piano_0321.off\npiano/test/piano_0322.off\npiano/test/piano_0323.off\npiano/test/piano_0324.off\npiano/test/piano_0325.off\npiano/test/piano_0326.off\npiano/test/piano_0327.off\npiano/test/piano_0328.off\npiano/test/piano_0329.off\npiano/test/piano_0330.off\npiano/test/piano_0331.off\nsofa/test/sofa_0681.off\nsofa/test/sofa_0682.off\nsofa/test/sofa_0683.off\nsofa/test/sofa_0684.off\nsofa/test/sofa_0685.off\nsofa/test/sofa_0686.off\nsofa/test/sofa_0687.off\nsofa/test/sofa_0688.off\nsofa/test/sofa_0689.off\nsofa/test/sofa_0690.off\nsofa/test/sofa_0691.off\nsofa/test/sofa_0692.off\nsofa/test/sofa_0693.off\nsofa/test/sofa_0694.off\nsofa/test/sofa_0695.off\nsofa/test/sofa_0696.off\nsofa/test/sofa_0697.off\nsofa/test/sofa_0698.off\nsofa/test/sofa_0699.off\nsofa/test/sofa_0700.off\nsofa/test/sofa_0701.off\nsofa/test/sofa_0702.off\nsofa/test/sofa_0703.off\nsofa/test/sofa_0704.off\nsofa/test/sofa_0705.off\nsofa/test/sofa_0706.off\nsofa/test/sofa_0707.off\nsofa/test/sofa_0708.off\nsofa/test/sofa_0709.off\nsofa/test/sofa_0710.off\nsofa/test/sofa_0711.off\nsofa/test/sofa_0712.off\nsofa/test/sofa_0713.off\nsofa/test/sofa_0714.off\nsofa/test/sofa_0715.off\nsofa/test/sofa_0716.off\nsofa/test/sofa_0717.off\nsofa/test/sofa_0718.off\nsofa/test/sofa_0719.off\nsofa/test/sofa_0720.off\nsofa/test/sofa_0721.off\nsofa/test/sofa_0722.off\nsofa/test/sofa_0723.off\nsofa/test/sofa_0724.off\nsofa/test/sofa_0725.off\nsofa/test/sofa_0726.off\nsofa/test/sofa_0727.off\nsofa/test/sofa_0728.off\nsofa/test/sofa_0729.off\nsofa/test/sofa_0730.off\nsofa/test/sofa_0731.off\nsofa/test/sofa_0732.off\nsofa/test/sofa_0733.off\nsofa/test/sofa_0734.off\nsofa/test/sofa_0735.off\nsofa/test/sofa_0736.off\nsofa/test/sofa_0737.off\nsofa/test/sofa_0738.off\nsofa/test/sofa_0739.off\nsofa/test/sofa_0740.off\nsofa/test/sofa_0741.off\nsofa/test/sofa_0742.off\nsofa/test/sofa_0743.off\nsofa/test/sofa_0744.off\nsofa/test/sofa_0745.off\nsofa/test/sofa_0746.off\nsofa/test/sofa_0747.off\nsofa/test/sofa_0748.off\nsofa/test/sofa_0749.off\nsofa/test/sofa_0750.off\nsofa/test/sofa_0751.off\nsofa/test/sofa_0752.off\nsofa/test/sofa_0753.off\nsofa/test/sofa_0754.off\nsofa/test/sofa_0755.off\nsofa/test/sofa_0756.off\nsofa/test/sofa_0757.off\nsofa/test/sofa_0758.off\nsofa/test/sofa_0759.off\nsofa/test/sofa_0760.off\nsofa/test/sofa_0761.off\nsofa/test/sofa_0762.off\nsofa/test/sofa_0763.off\nsofa/test/sofa_0764.off\nsofa/test/sofa_0765.off\nsofa/test/sofa_0766.off\nsofa/test/sofa_0767.off\nsofa/test/sofa_0768.off\nsofa/test/sofa_0769.off\nsofa/test/sofa_0770.off\nsofa/test/sofa_0771.off\nsofa/test/sofa_0772.off\nsofa/test/sofa_0773.off\nsofa/test/sofa_0774.off\nsofa/test/sofa_0775.off\nsofa/test/sofa_0776.off\nsofa/test/sofa_0777.off\nsofa/test/sofa_0778.off\nsofa/test/sofa_0779.off\nsofa/test/sofa_0780.off\nperson/test/person_0089.off\nperson/test/person_0090.off\nperson/test/person_0091.off\nperson/test/person_0092.off\nperson/test/person_0093.off\nperson/test/person_0094.off\nperson/test/person_0095.off\nperson/test/person_0096.off\nperson/test/person_0097.off\nperson/test/person_0098.off\nperson/test/person_0099.off\nperson/test/person_0100.off\nperson/test/person_0101.off\nperson/test/person_0102.off\nperson/test/person_0103.off\nperson/test/person_0104.off\nperson/test/person_0105.off\nperson/test/person_0106.off\nperson/test/person_0107.off\nperson/test/person_0108.off\nxbox/test/xbox_0104.off\nxbox/test/xbox_0105.off\nxbox/test/xbox_0106.off\nxbox/test/xbox_0107.off\nxbox/test/xbox_0108.off\nxbox/test/xbox_0109.off\nxbox/test/xbox_0110.off\nxbox/test/xbox_0111.off\nxbox/test/xbox_0112.off\nxbox/test/xbox_0113.off\nxbox/test/xbox_0114.off\nxbox/test/xbox_0115.off\nxbox/test/xbox_0116.off\nxbox/test/xbox_0117.off\nxbox/test/xbox_0118.off\nxbox/test/xbox_0119.off\nxbox/test/xbox_0120.off\nxbox/test/xbox_0121.off\nxbox/test/xbox_0122.off\nxbox/test/xbox_0123.off\nstairs/test/stairs_0125.off\nstairs/test/stairs_0126.off\nstairs/test/stairs_0127.off\nstairs/test/stairs_0128.off\nstairs/test/stairs_0129.off\nstairs/test/stairs_0130.off\nstairs/test/stairs_0131.off\nstairs/test/stairs_0132.off\nstairs/test/stairs_0133.off\nstairs/test/stairs_0134.off\nstairs/test/stairs_0135.off\nstairs/test/stairs_0136.off\nstairs/test/stairs_0137.off\nstairs/test/stairs_0138.off\nstairs/test/stairs_0139.off\nstairs/test/stairs_0140.off\nstairs/test/stairs_0141.off\nstairs/test/stairs_0142.off\nstairs/test/stairs_0143.off\nstairs/test/stairs_0144.off\ncone/test/cone_0168.off\ncone/test/cone_0169.off\ncone/test/cone_0170.off\ncone/test/cone_0171.off\ncone/test/cone_0172.off\ncone/test/cone_0173.off\ncone/test/cone_0174.off\ncone/test/cone_0175.off\ncone/test/cone_0176.off\ncone/test/cone_0177.off\ncone/test/cone_0178.off\ncone/test/cone_0179.off\ncone/test/cone_0180.off\ncone/test/cone_0181.off\ncone/test/cone_0182.off\ncone/test/cone_0183.off\ncone/test/cone_0184.off\ncone/test/cone_0185.off\ncone/test/cone_0186.off\ncone/test/cone_0187.off\nlamp/test/lamp_0125.off\nlamp/test/lamp_0126.off\nlamp/test/lamp_0127.off\nlamp/test/lamp_0128.off\nlamp/test/lamp_0129.off\nlamp/test/lamp_0130.off\nlamp/test/lamp_0131.off\nlamp/test/lamp_0132.off\nlamp/test/lamp_0133.off\nlamp/test/lamp_0134.off\nlamp/test/lamp_0135.off\nlamp/test/lamp_0136.off\nlamp/test/lamp_0137.off\nlamp/test/lamp_0138.off\nlamp/test/lamp_0139.off\nlamp/test/lamp_0140.off\nlamp/test/lamp_0141.off\nlamp/test/lamp_0142.off\nlamp/test/lamp_0143.off\nlamp/test/lamp_0144.off\ndoor/test/door_0110.off\ndoor/test/door_0111.off\ndoor/test/door_0112.off\ndoor/test/door_0113.off\ndoor/test/door_0114.off\ndoor/test/door_0115.off\ndoor/test/door_0116.off\ndoor/test/door_0117.off\ndoor/test/door_0118.off\ndoor/test/door_0119.off\ndoor/test/door_0120.off\ndoor/test/door_0121.off\ndoor/test/door_0122.off\ndoor/test/door_0123.off\ndoor/test/door_0124.off\ndoor/test/door_0125.off\ndoor/test/door_0126.off\ndoor/test/door_0127.off\ndoor/test/door_0128.off\ndoor/test/door_0129.off\nrange_hood/test/range_hood_0116.off\nrange_hood/test/range_hood_0117.off\nrange_hood/test/range_hood_0118.off\nrange_hood/test/range_hood_0119.off\nrange_hood/test/range_hood_0120.off\nrange_hood/test/range_hood_0121.off\nrange_hood/test/range_hood_0122.off\nrange_hood/test/range_hood_0123.off\nrange_hood/test/range_hood_0124.off\nrange_hood/test/range_hood_0125.off\nrange_hood/test/range_hood_0126.off\nrange_hood/test/range_hood_0127.off\nrange_hood/test/range_hood_0128.off\nrange_hood/test/range_hood_0129.off\nrange_hood/test/range_hood_0130.off\nrange_hood/test/range_hood_0131.off\nrange_hood/test/range_hood_0132.off\nrange_hood/test/range_hood_0133.off\nrange_hood/test/range_hood_0134.off\nrange_hood/test/range_hood_0135.off\nrange_hood/test/range_hood_0136.off\nrange_hood/test/range_hood_0137.off\nrange_hood/test/range_hood_0138.off\nrange_hood/test/range_hood_0139.off\nrange_hood/test/range_hood_0140.off\nrange_hood/test/range_hood_0141.off\nrange_hood/test/range_hood_0142.off\nrange_hood/test/range_hood_0143.off\nrange_hood/test/range_hood_0144.off\nrange_hood/test/range_hood_0145.off\nrange_hood/test/range_hood_0146.off\nrange_hood/test/range_hood_0147.off\nrange_hood/test/range_hood_0148.off\nrange_hood/test/range_hood_0149.off\nrange_hood/test/range_hood_0150.off\nrange_hood/test/range_hood_0151.off\nrange_hood/test/range_hood_0152.off\nrange_hood/test/range_hood_0153.off\nrange_hood/test/range_hood_0154.off\nrange_hood/test/range_hood_0155.off\nrange_hood/test/range_hood_0156.off\nrange_hood/test/range_hood_0157.off\nrange_hood/test/range_hood_0158.off\nrange_hood/test/range_hood_0159.off\nrange_hood/test/range_hood_0160.off\nrange_hood/test/range_hood_0161.off\nrange_hood/test/range_hood_0162.off\nrange_hood/test/range_hood_0163.off\nrange_hood/test/range_hood_0164.off\nrange_hood/test/range_hood_0165.off\nrange_hood/test/range_hood_0166.off\nrange_hood/test/range_hood_0167.off\nrange_hood/test/range_hood_0168.off\nrange_hood/test/range_hood_0169.off\nrange_hood/test/range_hood_0170.off\nrange_hood/test/range_hood_0171.off\nrange_hood/test/range_hood_0172.off\nrange_hood/test/range_hood_0173.off\nrange_hood/test/range_hood_0174.off\nrange_hood/test/range_hood_0175.off\nrange_hood/test/range_hood_0176.off\nrange_hood/test/range_hood_0177.off\nrange_hood/test/range_hood_0178.off\nrange_hood/test/range_hood_0179.off\nrange_hood/test/range_hood_0180.off\nrange_hood/test/range_hood_0181.off\nrange_hood/test/range_hood_0182.off\nrange_hood/test/range_hood_0183.off\nrange_hood/test/range_hood_0184.off\nrange_hood/test/range_hood_0185.off\nrange_hood/test/range_hood_0186.off\nrange_hood/test/range_hood_0187.off\nrange_hood/test/range_hood_0188.off\nrange_hood/test/range_hood_0189.off\nrange_hood/test/range_hood_0190.off\nrange_hood/test/range_hood_0191.off\nrange_hood/test/range_hood_0192.off\nrange_hood/test/range_hood_0193.off\nrange_hood/test/range_hood_0194.off\nrange_hood/test/range_hood_0195.off\nrange_hood/test/range_hood_0196.off\nrange_hood/test/range_hood_0197.off\nrange_hood/test/range_hood_0198.off\nrange_hood/test/range_hood_0199.off\nrange_hood/test/range_hood_0200.off\nrange_hood/test/range_hood_0201.off\nrange_hood/test/range_hood_0202.off\nrange_hood/test/range_hood_0203.off\nrange_hood/test/range_hood_0204.off\nrange_hood/test/range_hood_0205.off\nrange_hood/test/range_hood_0206.off\nrange_hood/test/range_hood_0207.off\nrange_hood/test/range_hood_0208.off\nrange_hood/test/range_hood_0209.off\nrange_hood/test/range_hood_0210.off\nrange_hood/test/range_hood_0211.off\nrange_hood/test/range_hood_0212.off\nrange_hood/test/range_hood_0213.off\nrange_hood/test/range_hood_0214.off\nrange_hood/test/range_hood_0215.off\nflower_pot/test/flower_pot_0150.off\nflower_pot/test/flower_pot_0151.off\nflower_pot/test/flower_pot_0152.off\nflower_pot/test/flower_pot_0153.off\nflower_pot/test/flower_pot_0154.off\nflower_pot/test/flower_pot_0155.off\nflower_pot/test/flower_pot_0156.off\nflower_pot/test/flower_pot_0157.off\nflower_pot/test/flower_pot_0158.off\nflower_pot/test/flower_pot_0159.off\nflower_pot/test/flower_pot_0160.off\nflower_pot/test/flower_pot_0161.off\nflower_pot/test/flower_pot_0162.off\nflower_pot/test/flower_pot_0163.off\nflower_pot/test/flower_pot_0164.off\nflower_pot/test/flower_pot_0165.off\nflower_pot/test/flower_pot_0166.off\nflower_pot/test/flower_pot_0167.off\nflower_pot/test/flower_pot_0168.off\nflower_pot/test/flower_pot_0169.off"
  },
  {
    "path": "dataloader/split/test_scan2cad.txt",
    "content": "full_annotations_clean_test.json\n"
  },
  {
    "path": "dataloader/split/train_3dmatch.txt",
    "content": "sun3d-brown_bm_1-brown_bm_1\nsun3d-brown_cogsci_1-brown_cogsci_1\nsun3d-brown_cs_2-brown_cs2\nsun3d-brown_cs_3-brown_cs3\nsun3d-harvard_c3-hv_c3_1\nsun3d-harvard_c5-hv_c5_1\nsun3d-harvard_c6-hv_c6_1\nsun3d-harvard_c8-hv_c8_3\nsun3d-home_bksh-home_bksh_oct_30_2012_scan2_erika\nsun3d-hotel_nips2012-nips_4\nsun3d-hotel_sf-scan1\nsun3d-mit_32_d507-d507_2\nsun3d-mit_46_ted_lab1-ted_lab_2\nsun3d-mit_76_417-76-417b\nsun3d-mit_dorm_next_sj-dorm_next_sj_oct_30_2012_scan1_erika\nsun3d-mit_w20_athena-sc_athena_oct_29_2012_scan1_erika\n7-scenes-chess\n7-scenes-fire\n7-scenes-office\n7-scenes-pumpkin\n7-scenes-stairs\nrgbd-scenes-v2-scene_01\nrgbd-scenes-v2-scene_02\nrgbd-scenes-v2-scene_03\nrgbd-scenes-v2-scene_04\nrgbd-scenes-v2-scene_05\nrgbd-scenes-v2-scene_06\nrgbd-scenes-v2-scene_07\nrgbd-scenes-v2-scene_08\nrgbd-scenes-v2-scene_09\nrgbd-scenes-v2-scene_11\nrgbd-scenes-v2-scene_12\nrgbd-scenes-v2-scene_13\nrgbd-scenes-v2-scene_14\nbundlefusion-apt0\nbundlefusion-apt1\nbundlefusion-apt2\nbundlefusion-copyroom\nbundlefusion-office1\nbundlefusion-office2\nbundlefusion-office3\nanalysis-by-synthesis-apt1-kitchen\nanalysis-by-synthesis-apt1-living\nanalysis-by-synthesis-apt2-bed\nanalysis-by-synthesis-apt2-living\nanalysis-by-synthesis-apt2-luke\nanalysis-by-synthesis-office2-5a\nanalysis-by-synthesis-office2-5b\n"
  },
  {
    "path": "dataloader/split/train_kitti.txt",
    "content": "0\n1\n2\n3\n4\n5\n"
  },
  {
    "path": "dataloader/split/train_modelnet40.txt",
    "content": "glass_box/train/glass_box_0001.off\nglass_box/train/glass_box_0002.off\nglass_box/train/glass_box_0003.off\nglass_box/train/glass_box_0004.off\nglass_box/train/glass_box_0005.off\nglass_box/train/glass_box_0006.off\nglass_box/train/glass_box_0007.off\nglass_box/train/glass_box_0008.off\nglass_box/train/glass_box_0009.off\nglass_box/train/glass_box_0010.off\nglass_box/train/glass_box_0011.off\nglass_box/train/glass_box_0012.off\nglass_box/train/glass_box_0013.off\nglass_box/train/glass_box_0014.off\nglass_box/train/glass_box_0015.off\nglass_box/train/glass_box_0016.off\nglass_box/train/glass_box_0017.off\nglass_box/train/glass_box_0018.off\nglass_box/train/glass_box_0019.off\nglass_box/train/glass_box_0020.off\nglass_box/train/glass_box_0021.off\nglass_box/train/glass_box_0022.off\nglass_box/train/glass_box_0023.off\nglass_box/train/glass_box_0024.off\nglass_box/train/glass_box_0025.off\nglass_box/train/glass_box_0026.off\nglass_box/train/glass_box_0027.off\nglass_box/train/glass_box_0028.off\nglass_box/train/glass_box_0029.off\nglass_box/train/glass_box_0030.off\nglass_box/train/glass_box_0031.off\nglass_box/train/glass_box_0032.off\nglass_box/train/glass_box_0033.off\nglass_box/train/glass_box_0034.off\nglass_box/train/glass_box_0035.off\nglass_box/train/glass_box_0036.off\nglass_box/train/glass_box_0037.off\nglass_box/train/glass_box_0038.off\nglass_box/train/glass_box_0039.off\nglass_box/train/glass_box_0040.off\nglass_box/train/glass_box_0041.off\nglass_box/train/glass_box_0042.off\nglass_box/train/glass_box_0043.off\nglass_box/train/glass_box_0044.off\nglass_box/train/glass_box_0045.off\nglass_box/train/glass_box_0046.off\nglass_box/train/glass_box_0047.off\nglass_box/train/glass_box_0048.off\nglass_box/train/glass_box_0049.off\nglass_box/train/glass_box_0050.off\nglass_box/train/glass_box_0051.off\nglass_box/train/glass_box_0052.off\nglass_box/train/glass_box_0053.off\nglass_box/train/glass_box_0054.off\nglass_box/train/glass_box_0055.off\nglass_box/train/glass_box_0056.off\nglass_box/train/glass_box_0057.off\nglass_box/train/glass_box_0058.off\nglass_box/train/glass_box_0059.off\nglass_box/train/glass_box_0060.off\nglass_box/train/glass_box_0061.off\nglass_box/train/glass_box_0062.off\nglass_box/train/glass_box_0063.off\nglass_box/train/glass_box_0064.off\nglass_box/train/glass_box_0065.off\nglass_box/train/glass_box_0066.off\nglass_box/train/glass_box_0067.off\nglass_box/train/glass_box_0068.off\nglass_box/train/glass_box_0069.off\nglass_box/train/glass_box_0070.off\nglass_box/train/glass_box_0071.off\nglass_box/train/glass_box_0072.off\nglass_box/train/glass_box_0073.off\nglass_box/train/glass_box_0074.off\nglass_box/train/glass_box_0075.off\nglass_box/train/glass_box_0076.off\nglass_box/train/glass_box_0077.off\nglass_box/train/glass_box_0078.off\nglass_box/train/glass_box_0079.off\nglass_box/train/glass_box_0080.off\nglass_box/train/glass_box_0081.off\nglass_box/train/glass_box_0082.off\nglass_box/train/glass_box_0083.off\nglass_box/train/glass_box_0084.off\nglass_box/train/glass_box_0085.off\nglass_box/train/glass_box_0086.off\nglass_box/train/glass_box_0087.off\nglass_box/train/glass_box_0088.off\nglass_box/train/glass_box_0089.off\nglass_box/train/glass_box_0090.off\nglass_box/train/glass_box_0091.off\nglass_box/train/glass_box_0092.off\nglass_box/train/glass_box_0093.off\nglass_box/train/glass_box_0094.off\nglass_box/train/glass_box_0095.off\nglass_box/train/glass_box_0096.off\nglass_box/train/glass_box_0097.off\nglass_box/train/glass_box_0098.off\nglass_box/train/glass_box_0099.off\nglass_box/train/glass_box_0100.off\nglass_box/train/glass_box_0101.off\nglass_box/train/glass_box_0102.off\nglass_box/train/glass_box_0103.off\nglass_box/train/glass_box_0104.off\nglass_box/train/glass_box_0105.off\nglass_box/train/glass_box_0106.off\nglass_box/train/glass_box_0107.off\nglass_box/train/glass_box_0108.off\nglass_box/train/glass_box_0109.off\nglass_box/train/glass_box_0110.off\nglass_box/train/glass_box_0111.off\nglass_box/train/glass_box_0112.off\nglass_box/train/glass_box_0113.off\nglass_box/train/glass_box_0114.off\nglass_box/train/glass_box_0115.off\nglass_box/train/glass_box_0116.off\nglass_box/train/glass_box_0117.off\nglass_box/train/glass_box_0118.off\nglass_box/train/glass_box_0119.off\nglass_box/train/glass_box_0120.off\nglass_box/train/glass_box_0121.off\nglass_box/train/glass_box_0122.off\nglass_box/train/glass_box_0123.off\nglass_box/train/glass_box_0124.off\nglass_box/train/glass_box_0125.off\nglass_box/train/glass_box_0126.off\nglass_box/train/glass_box_0127.off\nglass_box/train/glass_box_0128.off\nglass_box/train/glass_box_0129.off\nglass_box/train/glass_box_0130.off\nglass_box/train/glass_box_0131.off\nglass_box/train/glass_box_0132.off\nglass_box/train/glass_box_0133.off\nglass_box/train/glass_box_0134.off\nglass_box/train/glass_box_0135.off\nglass_box/train/glass_box_0136.off\nglass_box/train/glass_box_0137.off\nglass_box/train/glass_box_0138.off\nglass_box/train/glass_box_0139.off\nglass_box/train/glass_box_0140.off\nglass_box/train/glass_box_0141.off\nglass_box/train/glass_box_0142.off\nglass_box/train/glass_box_0143.off\nglass_box/train/glass_box_0144.off\nglass_box/train/glass_box_0145.off\nglass_box/train/glass_box_0146.off\nglass_box/train/glass_box_0147.off\nglass_box/train/glass_box_0148.off\nglass_box/train/glass_box_0149.off\nglass_box/train/glass_box_0150.off\nglass_box/train/glass_box_0151.off\nglass_box/train/glass_box_0152.off\nglass_box/train/glass_box_0153.off\nglass_box/train/glass_box_0154.off\nlaptop/train/laptop_0001.off\nlaptop/train/laptop_0002.off\nlaptop/train/laptop_0003.off\nlaptop/train/laptop_0004.off\nlaptop/train/laptop_0005.off\nlaptop/train/laptop_0006.off\nlaptop/train/laptop_0007.off\nlaptop/train/laptop_0008.off\nlaptop/train/laptop_0009.off\nlaptop/train/laptop_0010.off\nlaptop/train/laptop_0011.off\nlaptop/train/laptop_0012.off\nlaptop/train/laptop_0013.off\nlaptop/train/laptop_0014.off\nlaptop/train/laptop_0015.off\nlaptop/train/laptop_0016.off\nlaptop/train/laptop_0017.off\nlaptop/train/laptop_0018.off\nlaptop/train/laptop_0019.off\nlaptop/train/laptop_0020.off\nlaptop/train/laptop_0021.off\nlaptop/train/laptop_0022.off\nlaptop/train/laptop_0023.off\nlaptop/train/laptop_0024.off\nlaptop/train/laptop_0025.off\nlaptop/train/laptop_0026.off\nlaptop/train/laptop_0027.off\nlaptop/train/laptop_0028.off\nlaptop/train/laptop_0029.off\nlaptop/train/laptop_0030.off\nlaptop/train/laptop_0031.off\nlaptop/train/laptop_0032.off\nlaptop/train/laptop_0033.off\nlaptop/train/laptop_0034.off\nlaptop/train/laptop_0035.off\nlaptop/train/laptop_0036.off\nlaptop/train/laptop_0037.off\nlaptop/train/laptop_0038.off\nlaptop/train/laptop_0039.off\nlaptop/train/laptop_0040.off\nlaptop/train/laptop_0041.off\nlaptop/train/laptop_0042.off\nlaptop/train/laptop_0043.off\nlaptop/train/laptop_0044.off\nlaptop/train/laptop_0045.off\nlaptop/train/laptop_0046.off\nlaptop/train/laptop_0047.off\nlaptop/train/laptop_0048.off\nlaptop/train/laptop_0049.off\nlaptop/train/laptop_0050.off\nlaptop/train/laptop_0051.off\nlaptop/train/laptop_0052.off\nlaptop/train/laptop_0053.off\nlaptop/train/laptop_0054.off\nlaptop/train/laptop_0055.off\nlaptop/train/laptop_0056.off\nlaptop/train/laptop_0057.off\nlaptop/train/laptop_0058.off\nlaptop/train/laptop_0059.off\nlaptop/train/laptop_0060.off\nlaptop/train/laptop_0061.off\nlaptop/train/laptop_0062.off\nlaptop/train/laptop_0063.off\nlaptop/train/laptop_0064.off\nlaptop/train/laptop_0065.off\nlaptop/train/laptop_0066.off\nlaptop/train/laptop_0067.off\nlaptop/train/laptop_0068.off\nlaptop/train/laptop_0069.off\nlaptop/train/laptop_0070.off\nlaptop/train/laptop_0071.off\nlaptop/train/laptop_0072.off\nlaptop/train/laptop_0073.off\nlaptop/train/laptop_0074.off\nlaptop/train/laptop_0075.off\nlaptop/train/laptop_0076.off\nlaptop/train/laptop_0077.off\nlaptop/train/laptop_0078.off\nlaptop/train/laptop_0079.off\nlaptop/train/laptop_0080.off\nlaptop/train/laptop_0081.off\nlaptop/train/laptop_0082.off\nlaptop/train/laptop_0083.off\nlaptop/train/laptop_0084.off\nlaptop/train/laptop_0085.off\nlaptop/train/laptop_0086.off\nlaptop/train/laptop_0087.off\nlaptop/train/laptop_0088.off\nlaptop/train/laptop_0089.off\nlaptop/train/laptop_0090.off\nlaptop/train/laptop_0091.off\nlaptop/train/laptop_0092.off\nlaptop/train/laptop_0093.off\nlaptop/train/laptop_0094.off\nlaptop/train/laptop_0095.off\nlaptop/train/laptop_0096.off\nlaptop/train/laptop_0097.off\nlaptop/train/laptop_0098.off\nlaptop/train/laptop_0099.off\nlaptop/train/laptop_0100.off\nlaptop/train/laptop_0101.off\nlaptop/train/laptop_0102.off\nlaptop/train/laptop_0103.off\nlaptop/train/laptop_0104.off\nlaptop/train/laptop_0105.off\nlaptop/train/laptop_0106.off\nlaptop/train/laptop_0107.off\nlaptop/train/laptop_0108.off\nlaptop/train/laptop_0109.off\nlaptop/train/laptop_0110.off\nlaptop/train/laptop_0111.off\nlaptop/train/laptop_0112.off\nlaptop/train/laptop_0113.off\nlaptop/train/laptop_0114.off\nlaptop/train/laptop_0115.off\nlaptop/train/laptop_0116.off\nlaptop/train/laptop_0117.off\nlaptop/train/laptop_0118.off\nlaptop/train/laptop_0119.off\nlaptop/train/laptop_0120.off\nlaptop/train/laptop_0121.off\nlaptop/train/laptop_0122.off\nlaptop/train/laptop_0123.off\nlaptop/train/laptop_0124.off\nlaptop/train/laptop_0125.off\nlaptop/train/laptop_0126.off\nlaptop/train/laptop_0127.off\nlaptop/train/laptop_0128.off\nlaptop/train/laptop_0129.off\nlaptop/train/laptop_0130.off\nlaptop/train/laptop_0131.off\nlaptop/train/laptop_0132.off\nlaptop/train/laptop_0133.off\nlaptop/train/laptop_0134.off\nlaptop/train/laptop_0135.off\nsink/train/sink_0001.off\nsink/train/sink_0002.off\nsink/train/sink_0003.off\nsink/train/sink_0004.off\nsink/train/sink_0005.off\nsink/train/sink_0006.off\nsink/train/sink_0007.off\nsink/train/sink_0008.off\nsink/train/sink_0009.off\nsink/train/sink_0010.off\nsink/train/sink_0011.off\nsink/train/sink_0012.off\nsink/train/sink_0013.off\nsink/train/sink_0014.off\nsink/train/sink_0015.off\nsink/train/sink_0016.off\nsink/train/sink_0017.off\nsink/train/sink_0018.off\nsink/train/sink_0019.off\nsink/train/sink_0020.off\nsink/train/sink_0021.off\nsink/train/sink_0022.off\nsink/train/sink_0023.off\nsink/train/sink_0024.off\nsink/train/sink_0025.off\nsink/train/sink_0026.off\nsink/train/sink_0027.off\nsink/train/sink_0028.off\nsink/train/sink_0029.off\nsink/train/sink_0030.off\nsink/train/sink_0031.off\nsink/train/sink_0032.off\nsink/train/sink_0033.off\nsink/train/sink_0034.off\nsink/train/sink_0035.off\nsink/train/sink_0036.off\nsink/train/sink_0037.off\nsink/train/sink_0038.off\nsink/train/sink_0039.off\nsink/train/sink_0040.off\nsink/train/sink_0041.off\nsink/train/sink_0042.off\nsink/train/sink_0043.off\nsink/train/sink_0044.off\nsink/train/sink_0045.off\nsink/train/sink_0046.off\nsink/train/sink_0047.off\nsink/train/sink_0048.off\nsink/train/sink_0049.off\nsink/train/sink_0050.off\nsink/train/sink_0051.off\nsink/train/sink_0052.off\nsink/train/sink_0053.off\nsink/train/sink_0054.off\nsink/train/sink_0055.off\nsink/train/sink_0056.off\nsink/train/sink_0057.off\nsink/train/sink_0058.off\nsink/train/sink_0059.off\nsink/train/sink_0060.off\nsink/train/sink_0061.off\nsink/train/sink_0062.off\nsink/train/sink_0063.off\nsink/train/sink_0064.off\nsink/train/sink_0065.off\nsink/train/sink_0066.off\nsink/train/sink_0067.off\nsink/train/sink_0068.off\nsink/train/sink_0069.off\nsink/train/sink_0070.off\nsink/train/sink_0071.off\nsink/train/sink_0072.off\nsink/train/sink_0073.off\nsink/train/sink_0074.off\nsink/train/sink_0075.off\nsink/train/sink_0076.off\nsink/train/sink_0077.off\nsink/train/sink_0078.off\nsink/train/sink_0079.off\nsink/train/sink_0080.off\nsink/train/sink_0081.off\nsink/train/sink_0082.off\nsink/train/sink_0083.off\nsink/train/sink_0084.off\nsink/train/sink_0085.off\nsink/train/sink_0086.off\nsink/train/sink_0087.off\nsink/train/sink_0088.off\nsink/train/sink_0089.off\nsink/train/sink_0090.off\nsink/train/sink_0091.off\nsink/train/sink_0092.off\nsink/train/sink_0093.off\nsink/train/sink_0094.off\nsink/train/sink_0095.off\nsink/train/sink_0096.off\nsink/train/sink_0097.off\nsink/train/sink_0098.off\nsink/train/sink_0099.off\nsink/train/sink_0100.off\nsink/train/sink_0101.off\nsink/train/sink_0102.off\nsink/train/sink_0103.off\nsink/train/sink_0104.off\nsink/train/sink_0105.off\nsink/train/sink_0106.off\nsink/train/sink_0107.off\nsink/train/sink_0108.off\nsink/train/sink_0109.off\nsink/train/sink_0110.off\nsink/train/sink_0111.off\nsink/train/sink_0112.off\nsink/train/sink_0113.off\nsink/train/sink_0114.off\nsink/train/sink_0115.off\nsink/train/sink_0116.off\nnight_stand/train/night_stand_0001.off\nnight_stand/train/night_stand_0002.off\nnight_stand/train/night_stand_0003.off\nnight_stand/train/night_stand_0004.off\nnight_stand/train/night_stand_0005.off\nnight_stand/train/night_stand_0006.off\nnight_stand/train/night_stand_0007.off\nnight_stand/train/night_stand_0008.off\nnight_stand/train/night_stand_0009.off\nnight_stand/train/night_stand_0010.off\nnight_stand/train/night_stand_0011.off\nnight_stand/train/night_stand_0012.off\nnight_stand/train/night_stand_0013.off\nnight_stand/train/night_stand_0014.off\nnight_stand/train/night_stand_0015.off\nnight_stand/train/night_stand_0016.off\nnight_stand/train/night_stand_0017.off\nnight_stand/train/night_stand_0018.off\nnight_stand/train/night_stand_0019.off\nnight_stand/train/night_stand_0020.off\nnight_stand/train/night_stand_0021.off\nnight_stand/train/night_stand_0022.off\nnight_stand/train/night_stand_0023.off\nnight_stand/train/night_stand_0024.off\nnight_stand/train/night_stand_0025.off\nnight_stand/train/night_stand_0026.off\nnight_stand/train/night_stand_0027.off\nnight_stand/train/night_stand_0028.off\nnight_stand/train/night_stand_0029.off\nnight_stand/train/night_stand_0030.off\nnight_stand/train/night_stand_0031.off\nnight_stand/train/night_stand_0032.off\nnight_stand/train/night_stand_0033.off\nnight_stand/train/night_stand_0034.off\nnight_stand/train/night_stand_0035.off\nnight_stand/train/night_stand_0036.off\nnight_stand/train/night_stand_0037.off\nnight_stand/train/night_stand_0038.off\nnight_stand/train/night_stand_0039.off\nnight_stand/train/night_stand_0040.off\nnight_stand/train/night_stand_0041.off\nnight_stand/train/night_stand_0042.off\nnight_stand/train/night_stand_0043.off\nnight_stand/train/night_stand_0044.off\nnight_stand/train/night_stand_0045.off\nnight_stand/train/night_stand_0046.off\nnight_stand/train/night_stand_0047.off\nnight_stand/train/night_stand_0048.off\nnight_stand/train/night_stand_0049.off\nnight_stand/train/night_stand_0050.off\nnight_stand/train/night_stand_0051.off\nnight_stand/train/night_stand_0052.off\nnight_stand/train/night_stand_0053.off\nnight_stand/train/night_stand_0054.off\nnight_stand/train/night_stand_0055.off\nnight_stand/train/night_stand_0056.off\nnight_stand/train/night_stand_0057.off\nnight_stand/train/night_stand_0058.off\nnight_stand/train/night_stand_0059.off\nnight_stand/train/night_stand_0060.off\nnight_stand/train/night_stand_0061.off\nnight_stand/train/night_stand_0062.off\nnight_stand/train/night_stand_0063.off\nnight_stand/train/night_stand_0064.off\nnight_stand/train/night_stand_0065.off\nnight_stand/train/night_stand_0066.off\nnight_stand/train/night_stand_0067.off\nnight_stand/train/night_stand_0068.off\nnight_stand/train/night_stand_0069.off\nnight_stand/train/night_stand_0070.off\nnight_stand/train/night_stand_0071.off\nnight_stand/train/night_stand_0072.off\nnight_stand/train/night_stand_0073.off\nnight_stand/train/night_stand_0074.off\nnight_stand/train/night_stand_0075.off\nnight_stand/train/night_stand_0076.off\nnight_stand/train/night_stand_0077.off\nnight_stand/train/night_stand_0078.off\nnight_stand/train/night_stand_0079.off\nnight_stand/train/night_stand_0080.off\nnight_stand/train/night_stand_0081.off\nnight_stand/train/night_stand_0082.off\nnight_stand/train/night_stand_0083.off\nnight_stand/train/night_stand_0084.off\nnight_stand/train/night_stand_0085.off\nnight_stand/train/night_stand_0086.off\nnight_stand/train/night_stand_0087.off\nnight_stand/train/night_stand_0088.off\nnight_stand/train/night_stand_0089.off\nnight_stand/train/night_stand_0090.off\nnight_stand/train/night_stand_0091.off\nnight_stand/train/night_stand_0092.off\nnight_stand/train/night_stand_0093.off\nnight_stand/train/night_stand_0094.off\nnight_stand/train/night_stand_0095.off\nnight_stand/train/night_stand_0096.off\nnight_stand/train/night_stand_0097.off\nnight_stand/train/night_stand_0098.off\nnight_stand/train/night_stand_0099.off\nnight_stand/train/night_stand_0100.off\nnight_stand/train/night_stand_0101.off\nnight_stand/train/night_stand_0102.off\nnight_stand/train/night_stand_0103.off\nnight_stand/train/night_stand_0104.off\nnight_stand/train/night_stand_0105.off\nnight_stand/train/night_stand_0106.off\nnight_stand/train/night_stand_0107.off\nnight_stand/train/night_stand_0108.off\nnight_stand/train/night_stand_0109.off\nnight_stand/train/night_stand_0110.off\nnight_stand/train/night_stand_0111.off\nnight_stand/train/night_stand_0112.off\nnight_stand/train/night_stand_0113.off\nnight_stand/train/night_stand_0114.off\nnight_stand/train/night_stand_0115.off\nnight_stand/train/night_stand_0116.off\nnight_stand/train/night_stand_0117.off\nnight_stand/train/night_stand_0118.off\nnight_stand/train/night_stand_0119.off\nnight_stand/train/night_stand_0120.off\nnight_stand/train/night_stand_0121.off\nnight_stand/train/night_stand_0122.off\nnight_stand/train/night_stand_0123.off\nnight_stand/train/night_stand_0124.off\nnight_stand/train/night_stand_0125.off\nnight_stand/train/night_stand_0126.off\nnight_stand/train/night_stand_0127.off\nnight_stand/train/night_stand_0128.off\nnight_stand/train/night_stand_0129.off\nnight_stand/train/night_stand_0130.off\nnight_stand/train/night_stand_0131.off\nnight_stand/train/night_stand_0132.off\nnight_stand/train/night_stand_0133.off\nnight_stand/train/night_stand_0134.off\nnight_stand/train/night_stand_0135.off\nnight_stand/train/night_stand_0136.off\nnight_stand/train/night_stand_0137.off\nnight_stand/train/night_stand_0138.off\nnight_stand/train/night_stand_0139.off\nnight_stand/train/night_stand_0140.off\nnight_stand/train/night_stand_0141.off\nnight_stand/train/night_stand_0142.off\nnight_stand/train/night_stand_0143.off\nnight_stand/train/night_stand_0144.off\nnight_stand/train/night_stand_0145.off\nnight_stand/train/night_stand_0146.off\nnight_stand/train/night_stand_0147.off\nnight_stand/train/night_stand_0148.off\nnight_stand/train/night_stand_0149.off\nnight_stand/train/night_stand_0150.off\nnight_stand/train/night_stand_0151.off\nnight_stand/train/night_stand_0152.off\nnight_stand/train/night_stand_0153.off\nnight_stand/train/night_stand_0154.off\nnight_stand/train/night_stand_0155.off\nnight_stand/train/night_stand_0156.off\nnight_stand/train/night_stand_0157.off\nnight_stand/train/night_stand_0158.off\nnight_stand/train/night_stand_0159.off\nnight_stand/train/night_stand_0160.off\nnight_stand/train/night_stand_0161.off\nnight_stand/train/night_stand_0162.off\nnight_stand/train/night_stand_0163.off\nnight_stand/train/night_stand_0164.off\nnight_stand/train/night_stand_0165.off\nnight_stand/train/night_stand_0166.off\nnight_stand/train/night_stand_0167.off\nnight_stand/train/night_stand_0168.off\nnight_stand/train/night_stand_0169.off\nnight_stand/train/night_stand_0170.off\nnight_stand/train/night_stand_0171.off\nnight_stand/train/night_stand_0172.off\nnight_stand/train/night_stand_0173.off\nnight_stand/train/night_stand_0174.off\nnight_stand/train/night_stand_0175.off\nnight_stand/train/night_stand_0176.off\nnight_stand/train/night_stand_0177.off\nnight_stand/train/night_stand_0178.off\nnight_stand/train/night_stand_0179.off\nnight_stand/train/night_stand_0180.off\ncar/train/car_0001.off\ncar/train/car_0002.off\ncar/train/car_0003.off\ncar/train/car_0004.off\ncar/train/car_0005.off\ncar/train/car_0006.off\ncar/train/car_0007.off\ncar/train/car_0008.off\ncar/train/car_0009.off\ncar/train/car_0010.off\ncar/train/car_0011.off\ncar/train/car_0012.off\ncar/train/car_0013.off\ncar/train/car_0014.off\ncar/train/car_0015.off\ncar/train/car_0016.off\ncar/train/car_0017.off\ncar/train/car_0018.off\ncar/train/car_0019.off\ncar/train/car_0020.off\ncar/train/car_0021.off\ncar/train/car_0022.off\ncar/train/car_0023.off\ncar/train/car_0024.off\ncar/train/car_0025.off\ncar/train/car_0026.off\ncar/train/car_0027.off\ncar/train/car_0028.off\ncar/train/car_0029.off\ncar/train/car_0030.off\ncar/train/car_0031.off\ncar/train/car_0032.off\ncar/train/car_0033.off\ncar/train/car_0034.off\ncar/train/car_0035.off\ncar/train/car_0036.off\ncar/train/car_0037.off\ncar/train/car_0038.off\ncar/train/car_0039.off\ncar/train/car_0040.off\ncar/train/car_0041.off\ncar/train/car_0042.off\ncar/train/car_0043.off\ncar/train/car_0044.off\ncar/train/car_0045.off\ncar/train/car_0046.off\ncar/train/car_0047.off\ncar/train/car_0048.off\ncar/train/car_0049.off\ncar/train/car_0050.off\ncar/train/car_0051.off\ncar/train/car_0052.off\ncar/train/car_0053.off\ncar/train/car_0054.off\ncar/train/car_0055.off\ncar/train/car_0056.off\ncar/train/car_0057.off\ncar/train/car_0058.off\ncar/train/car_0059.off\ncar/train/car_0060.off\ncar/train/car_0061.off\ncar/train/car_0062.off\ncar/train/car_0063.off\ncar/train/car_0064.off\ncar/train/car_0065.off\ncar/train/car_0066.off\ncar/train/car_0067.off\ncar/train/car_0068.off\ncar/train/car_0069.off\ncar/train/car_0070.off\ncar/train/car_0071.off\ncar/train/car_0072.off\ncar/train/car_0073.off\ncar/train/car_0074.off\ncar/train/car_0075.off\ncar/train/car_0076.off\ncar/train/car_0077.off\ncar/train/car_0078.off\ncar/train/car_0079.off\ncar/train/car_0080.off\ncar/train/car_0081.off\ncar/train/car_0082.off\ncar/train/car_0083.off\ncar/train/car_0084.off\ncar/train/car_0085.off\ncar/train/car_0086.off\ncar/train/car_0087.off\ncar/train/car_0088.off\ncar/train/car_0089.off\ncar/train/car_0090.off\ncar/train/car_0091.off\ncar/train/car_0092.off\ncar/train/car_0093.off\ncar/train/car_0094.off\ncar/train/car_0095.off\ncar/train/car_0096.off\ncar/train/car_0097.off\ncar/train/car_0098.off\ncar/train/car_0099.off\ncar/train/car_0100.off\ncar/train/car_0101.off\ncar/train/car_0102.off\ncar/train/car_0103.off\ncar/train/car_0104.off\ncar/train/car_0105.off\ncar/train/car_0106.off\ncar/train/car_0107.off\ncar/train/car_0108.off\ncar/train/car_0109.off\ncar/train/car_0110.off\ncar/train/car_0111.off\ncar/train/car_0112.off\ncar/train/car_0113.off\ncar/train/car_0114.off\ncar/train/car_0115.off\ncar/train/car_0116.off\ncar/train/car_0117.off\ncar/train/car_0118.off\ncar/train/car_0119.off\ncar/train/car_0120.off\ncar/train/car_0121.off\ncar/train/car_0122.off\ncar/train/car_0123.off\ncar/train/car_0124.off\ncar/train/car_0125.off\ncar/train/car_0126.off\ncar/train/car_0127.off\ncar/train/car_0128.off\ncar/train/car_0129.off\ncar/train/car_0130.off\ncar/train/car_0131.off\ncar/train/car_0132.off\ncar/train/car_0133.off\ncar/train/car_0134.off\ncar/train/car_0135.off\ncar/train/car_0136.off\ncar/train/car_0137.off\ncar/train/car_0138.off\ncar/train/car_0139.off\ncar/train/car_0140.off\ncar/train/car_0141.off\ncar/train/car_0142.off\ncar/train/car_0143.off\ncar/train/car_0144.off\ncar/train/car_0145.off\ncar/train/car_0146.off\ncar/train/car_0147.off\ncar/train/car_0148.off\ncar/train/car_0149.off\ncar/train/car_0150.off\ncar/train/car_0151.off\ncar/train/car_0152.off\ncar/train/car_0153.off\ncar/train/car_0154.off\ncar/train/car_0155.off\ncar/train/car_0156.off\ncar/train/car_0157.off\ncar/train/car_0158.off\ncar/train/car_0159.off\ncar/train/car_0160.off\ncar/train/car_0161.off\ncar/train/car_0162.off\ncar/train/car_0163.off\ncar/train/car_0164.off\ncar/train/car_0165.off\ncar/train/car_0166.off\ncar/train/car_0167.off\ncar/train/car_0168.off\ncar/train/car_0169.off\ncar/train/car_0170.off\ncar/train/car_0171.off\ncar/train/car_0172.off\ncar/train/car_0173.off\ncar/train/car_0174.off\ncar/train/car_0175.off\ncar/train/car_0176.off\ncar/train/car_0177.off\ncar/train/car_0178.off\ndresser/train/dresser_0001.off\ndresser/train/dresser_0002.off\ndresser/train/dresser_0003.off\ndresser/train/dresser_0004.off\ndresser/train/dresser_0005.off\ndresser/train/dresser_0006.off\ndresser/train/dresser_0007.off\ndresser/train/dresser_0008.off\ndresser/train/dresser_0009.off\ndresser/train/dresser_0010.off\ndresser/train/dresser_0011.off\ndresser/train/dresser_0012.off\ndresser/train/dresser_0013.off\ndresser/train/dresser_0014.off\ndresser/train/dresser_0015.off\ndresser/train/dresser_0016.off\ndresser/train/dresser_0017.off\ndresser/train/dresser_0018.off\ndresser/train/dresser_0019.off\ndresser/train/dresser_0020.off\ndresser/train/dresser_0021.off\ndresser/train/dresser_0022.off\ndresser/train/dresser_0023.off\ndresser/train/dresser_0024.off\ndresser/train/dresser_0025.off\ndresser/train/dresser_0026.off\ndresser/train/dresser_0027.off\ndresser/train/dresser_0028.off\ndresser/train/dresser_0029.off\ndresser/train/dresser_0030.off\ndresser/train/dresser_0031.off\ndresser/train/dresser_0032.off\ndresser/train/dresser_0033.off\ndresser/train/dresser_0034.off\ndresser/train/dresser_0035.off\ndresser/train/dresser_0036.off\ndresser/train/dresser_0037.off\ndresser/train/dresser_0038.off\ndresser/train/dresser_0039.off\ndresser/train/dresser_0040.off\ndresser/train/dresser_0041.off\ndresser/train/dresser_0042.off\ndresser/train/dresser_0043.off\ndresser/train/dresser_0044.off\ndresser/train/dresser_0045.off\ndresser/train/dresser_0046.off\ndresser/train/dresser_0047.off\ndresser/train/dresser_0048.off\ndresser/train/dresser_0049.off\ndresser/train/dresser_0050.off\ndresser/train/dresser_0051.off\ndresser/train/dresser_0052.off\ndresser/train/dresser_0053.off\ndresser/train/dresser_0054.off\ndresser/train/dresser_0055.off\ndresser/train/dresser_0056.off\ndresser/train/dresser_0057.off\ndresser/train/dresser_0058.off\ndresser/train/dresser_0059.off\ndresser/train/dresser_0060.off\ndresser/train/dresser_0061.off\ndresser/train/dresser_0062.off\ndresser/train/dresser_0063.off\ndresser/train/dresser_0064.off\ndresser/train/dresser_0065.off\ndresser/train/dresser_0066.off\ndresser/train/dresser_0067.off\ndresser/train/dresser_0068.off\ndresser/train/dresser_0069.off\ndresser/train/dresser_0070.off\ndresser/train/dresser_0071.off\ndresser/train/dresser_0072.off\ndresser/train/dresser_0073.off\ndresser/train/dresser_0074.off\ndresser/train/dresser_0075.off\ndresser/train/dresser_0076.off\ndresser/train/dresser_0077.off\ndresser/train/dresser_0078.off\ndresser/train/dresser_0079.off\ndresser/train/dresser_0080.off\ndresser/train/dresser_0081.off\ndresser/train/dresser_0082.off\ndresser/train/dresser_0083.off\ndresser/train/dresser_0084.off\ndresser/train/dresser_0085.off\ndresser/train/dresser_0086.off\ndresser/train/dresser_0087.off\ndresser/train/dresser_0088.off\ndresser/train/dresser_0089.off\ndresser/train/dresser_0090.off\ndresser/train/dresser_0091.off\ndresser/train/dresser_0092.off\ndresser/train/dresser_0093.off\ndresser/train/dresser_0094.off\ndresser/train/dresser_0095.off\ndresser/train/dresser_0096.off\ndresser/train/dresser_0097.off\ndresser/train/dresser_0098.off\ndresser/train/dresser_0099.off\ndresser/train/dresser_0100.off\ndresser/train/dresser_0101.off\ndresser/train/dresser_0102.off\ndresser/train/dresser_0103.off\ndresser/train/dresser_0104.off\ndresser/train/dresser_0105.off\ndresser/train/dresser_0106.off\ndresser/train/dresser_0107.off\ndresser/train/dresser_0108.off\ndresser/train/dresser_0109.off\ndresser/train/dresser_0110.off\ndresser/train/dresser_0111.off\ndresser/train/dresser_0112.off\ndresser/train/dresser_0113.off\ndresser/train/dresser_0114.off\ndresser/train/dresser_0115.off\ndresser/train/dresser_0116.off\ndresser/train/dresser_0117.off\ndresser/train/dresser_0118.off\ndresser/train/dresser_0119.off\ndresser/train/dresser_0120.off\ndresser/train/dresser_0121.off\ndresser/train/dresser_0122.off\ndresser/train/dresser_0123.off\ndresser/train/dresser_0124.off\ndresser/train/dresser_0125.off\ndresser/train/dresser_0126.off\ndresser/train/dresser_0127.off\ndresser/train/dresser_0128.off\ndresser/train/dresser_0129.off\ndresser/train/dresser_0130.off\ndresser/train/dresser_0131.off\ndresser/train/dresser_0132.off\ndresser/train/dresser_0133.off\ndresser/train/dresser_0134.off\ndresser/train/dresser_0135.off\ndresser/train/dresser_0136.off\ndresser/train/dresser_0137.off\ndresser/train/dresser_0138.off\ndresser/train/dresser_0139.off\ndresser/train/dresser_0140.off\ndresser/train/dresser_0141.off\ndresser/train/dresser_0142.off\ndresser/train/dresser_0143.off\ndresser/train/dresser_0144.off\ndresser/train/dresser_0145.off\ndresser/train/dresser_0146.off\ndresser/train/dresser_0147.off\ndresser/train/dresser_0148.off\ndresser/train/dresser_0149.off\ndresser/train/dresser_0150.off\ndresser/train/dresser_0151.off\ndresser/train/dresser_0152.off\ndresser/train/dresser_0153.off\ndresser/train/dresser_0154.off\ndresser/train/dresser_0155.off\ndresser/train/dresser_0156.off\ndresser/train/dresser_0157.off\ndresser/train/dresser_0158.off\ndresser/train/dresser_0159.off\ndresser/train/dresser_0160.off\ndresser/train/dresser_0161.off\ndresser/train/dresser_0162.off\ndresser/train/dresser_0163.off\ndresser/train/dresser_0164.off\ndresser/train/dresser_0165.off\ndresser/train/dresser_0166.off\ndresser/train/dresser_0167.off\ndresser/train/dresser_0168.off\ndresser/train/dresser_0169.off\ndresser/train/dresser_0170.off\ndresser/train/dresser_0171.off\ndresser/train/dresser_0172.off\ndresser/train/dresser_0173.off\ndresser/train/dresser_0174.off\ndresser/train/dresser_0175.off\ndresser/train/dresser_0176.off\ndresser/train/dresser_0177.off\ndresser/train/dresser_0178.off\ndresser/train/dresser_0179.off\ndresser/train/dresser_0180.off\ntoilet/train/toilet_0001.off\ntoilet/train/toilet_0002.off\ntoilet/train/toilet_0003.off\ntoilet/train/toilet_0004.off\ntoilet/train/toilet_0005.off\ntoilet/train/toilet_0006.off\ntoilet/train/toilet_0007.off\ntoilet/train/toilet_0008.off\ntoilet/train/toilet_0009.off\ntoilet/train/toilet_0010.off\ntoilet/train/toilet_0011.off\ntoilet/train/toilet_0012.off\ntoilet/train/toilet_0013.off\ntoilet/train/toilet_0014.off\ntoilet/train/toilet_0015.off\ntoilet/train/toilet_0016.off\ntoilet/train/toilet_0017.off\ntoilet/train/toilet_0018.off\ntoilet/train/toilet_0019.off\ntoilet/train/toilet_0020.off\ntoilet/train/toilet_0021.off\ntoilet/train/toilet_0022.off\ntoilet/train/toilet_0023.off\ntoilet/train/toilet_0024.off\ntoilet/train/toilet_0025.off\ntoilet/train/toilet_0026.off\ntoilet/train/toilet_0027.off\ntoilet/train/toilet_0028.off\ntoilet/train/toilet_0029.off\ntoilet/train/toilet_0030.off\ntoilet/train/toilet_0031.off\ntoilet/train/toilet_0032.off\ntoilet/train/toilet_0033.off\ntoilet/train/toilet_0034.off\ntoilet/train/toilet_0035.off\ntoilet/train/toilet_0036.off\ntoilet/train/toilet_0037.off\ntoilet/train/toilet_0038.off\ntoilet/train/toilet_0039.off\ntoilet/train/toilet_0040.off\ntoilet/train/toilet_0041.off\ntoilet/train/toilet_0042.off\ntoilet/train/toilet_0043.off\ntoilet/train/toilet_0044.off\ntoilet/train/toilet_0045.off\ntoilet/train/toilet_0046.off\ntoilet/train/toilet_0047.off\ntoilet/train/toilet_0048.off\ntoilet/train/toilet_0049.off\ntoilet/train/toilet_0050.off\ntoilet/train/toilet_0051.off\ntoilet/train/toilet_0052.off\ntoilet/train/toilet_0053.off\ntoilet/train/toilet_0054.off\ntoilet/train/toilet_0055.off\ntoilet/train/toilet_0056.off\ntoilet/train/toilet_0057.off\ntoilet/train/toilet_0058.off\ntoilet/train/toilet_0059.off\ntoilet/train/toilet_0060.off\ntoilet/train/toilet_0061.off\ntoilet/train/toilet_0062.off\ntoilet/train/toilet_0063.off\ntoilet/train/toilet_0064.off\ntoilet/train/toilet_0065.off\ntoilet/train/toilet_0066.off\ntoilet/train/toilet_0067.off\ntoilet/train/toilet_0068.off\ntoilet/train/toilet_0069.off\ntoilet/train/toilet_0070.off\ntoilet/train/toilet_0071.off\ntoilet/train/toilet_0072.off\ntoilet/train/toilet_0073.off\ntoilet/train/toilet_0074.off\ntoilet/train/toilet_0075.off\ntoilet/train/toilet_0076.off\ntoilet/train/toilet_0077.off\ntoilet/train/toilet_0078.off\ntoilet/train/toilet_0079.off\ntoilet/train/toilet_0080.off\ntoilet/train/toilet_0081.off\ntoilet/train/toilet_0082.off\ntoilet/train/toilet_0083.off\ntoilet/train/toilet_0084.off\ntoilet/train/toilet_0085.off\ntoilet/train/toilet_0086.off\ntoilet/train/toilet_0087.off\ntoilet/train/toilet_0088.off\ntoilet/train/toilet_0089.off\ntoilet/train/toilet_0090.off\ntoilet/train/toilet_0091.off\ntoilet/train/toilet_0092.off\ntoilet/train/toilet_0093.off\ntoilet/train/toilet_0094.off\ntoilet/train/toilet_0095.off\ntoilet/train/toilet_0096.off\ntoilet/train/toilet_0097.off\ntoilet/train/toilet_0098.off\ntoilet/train/toilet_0099.off\ntoilet/train/toilet_0100.off\ntoilet/train/toilet_0101.off\ntoilet/train/toilet_0102.off\ntoilet/train/toilet_0103.off\ntoilet/train/toilet_0104.off\ntoilet/train/toilet_0105.off\ntoilet/train/toilet_0106.off\ntoilet/train/toilet_0107.off\ntoilet/train/toilet_0108.off\ntoilet/train/toilet_0109.off\ntoilet/train/toilet_0110.off\ntoilet/train/toilet_0111.off\ntoilet/train/toilet_0112.off\ntoilet/train/toilet_0113.off\ntoilet/train/toilet_0114.off\ntoilet/train/toilet_0115.off\ntoilet/train/toilet_0116.off\ntoilet/train/toilet_0117.off\ntoilet/train/toilet_0118.off\ntoilet/train/toilet_0119.off\ntoilet/train/toilet_0120.off\ntoilet/train/toilet_0121.off\ntoilet/train/toilet_0122.off\ntoilet/train/toilet_0123.off\ntoilet/train/toilet_0124.off\ntoilet/train/toilet_0125.off\ntoilet/train/toilet_0126.off\ntoilet/train/toilet_0127.off\ntoilet/train/toilet_0128.off\ntoilet/train/toilet_0129.off\ntoilet/train/toilet_0130.off\ntoilet/train/toilet_0131.off\ntoilet/train/toilet_0132.off\ntoilet/train/toilet_0133.off\ntoilet/train/toilet_0134.off\ntoilet/train/toilet_0135.off\ntoilet/train/toilet_0136.off\ntoilet/train/toilet_0137.off\ntoilet/train/toilet_0138.off\ntoilet/train/toilet_0139.off\ntoilet/train/toilet_0140.off\ntoilet/train/toilet_0141.off\ntoilet/train/toilet_0142.off\ntoilet/train/toilet_0143.off\ntoilet/train/toilet_0144.off\ntoilet/train/toilet_0145.off\ntoilet/train/toilet_0146.off\ntoilet/train/toilet_0147.off\ntoilet/train/toilet_0148.off\ntoilet/train/toilet_0149.off\ntoilet/train/toilet_0150.off\ntoilet/train/toilet_0151.off\ntoilet/train/toilet_0152.off\ntoilet/train/toilet_0153.off\ntoilet/train/toilet_0154.off\ntoilet/train/toilet_0155.off\ntoilet/train/toilet_0156.off\ntoilet/train/toilet_0157.off\ntoilet/train/toilet_0158.off\ntoilet/train/toilet_0159.off\ntoilet/train/toilet_0160.off\ntoilet/train/toilet_0161.off\ntoilet/train/toilet_0162.off\ntoilet/train/toilet_0163.off\ntoilet/train/toilet_0164.off\ntoilet/train/toilet_0165.off\ntoilet/train/toilet_0166.off\ntoilet/train/toilet_0167.off\ntoilet/train/toilet_0168.off\ntoilet/train/toilet_0169.off\ntoilet/train/toilet_0170.off\ntoilet/train/toilet_0171.off\ntoilet/train/toilet_0172.off\ntoilet/train/toilet_0173.off\ntoilet/train/toilet_0174.off\ntoilet/train/toilet_0175.off\ntoilet/train/toilet_0176.off\ntoilet/train/toilet_0177.off\ntoilet/train/toilet_0178.off\ntoilet/train/toilet_0179.off\ntoilet/train/toilet_0180.off\ntoilet/train/toilet_0181.off\ntoilet/train/toilet_0182.off\ntoilet/train/toilet_0183.off\ntoilet/train/toilet_0184.off\ntoilet/train/toilet_0185.off\ntoilet/train/toilet_0186.off\ntoilet/train/toilet_0187.off\ntoilet/train/toilet_0188.off\ntoilet/train/toilet_0189.off\ntoilet/train/toilet_0190.off\ntoilet/train/toilet_0191.off\ntoilet/train/toilet_0192.off\ntoilet/train/toilet_0193.off\ntoilet/train/toilet_0194.off\ntoilet/train/toilet_0195.off\ntoilet/train/toilet_0196.off\ntoilet/train/toilet_0197.off\ntoilet/train/toilet_0198.off\ntoilet/train/toilet_0199.off\ntoilet/train/toilet_0200.off\ntoilet/train/toilet_0201.off\ntoilet/train/toilet_0202.off\ntoilet/train/toilet_0203.off\ntoilet/train/toilet_0204.off\ntoilet/train/toilet_0205.off\ntoilet/train/toilet_0206.off\ntoilet/train/toilet_0207.off\ntoilet/train/toilet_0208.off\ntoilet/train/toilet_0209.off\ntoilet/train/toilet_0210.off\ntoilet/train/toilet_0211.off\ntoilet/train/toilet_0212.off\ntoilet/train/toilet_0213.off\ntoilet/train/toilet_0214.off\ntoilet/train/toilet_0215.off\ntoilet/train/toilet_0216.off\ntoilet/train/toilet_0217.off\ntoilet/train/toilet_0218.off\ntoilet/train/toilet_0219.off\ntoilet/train/toilet_0220.off\ntoilet/train/toilet_0221.off\ntoilet/train/toilet_0222.off\ntoilet/train/toilet_0223.off\ntoilet/train/toilet_0224.off\ntoilet/train/toilet_0225.off\ntoilet/train/toilet_0226.off\ntoilet/train/toilet_0227.off\ntoilet/train/toilet_0228.off\ntoilet/train/toilet_0229.off\ntoilet/train/toilet_0230.off\ntoilet/train/toilet_0231.off\ntoilet/train/toilet_0232.off\ntoilet/train/toilet_0233.off\ntoilet/train/toilet_0234.off\ntoilet/train/toilet_0235.off\ntoilet/train/toilet_0236.off\ntoilet/train/toilet_0237.off\ntoilet/train/toilet_0238.off\ntoilet/train/toilet_0239.off\ntoilet/train/toilet_0240.off\ntoilet/train/toilet_0241.off\ntoilet/train/toilet_0242.off\ntoilet/train/toilet_0243.off\ntoilet/train/toilet_0244.off\ntoilet/train/toilet_0245.off\ntoilet/train/toilet_0246.off\ntoilet/train/toilet_0247.off\ntoilet/train/toilet_0248.off\ntoilet/train/toilet_0249.off\ntoilet/train/toilet_0250.off\ntoilet/train/toilet_0251.off\ntoilet/train/toilet_0252.off\ntoilet/train/toilet_0253.off\ntoilet/train/toilet_0254.off\ntoilet/train/toilet_0255.off\ntoilet/train/toilet_0256.off\ntoilet/train/toilet_0257.off\ntoilet/train/toilet_0258.off\ntoilet/train/toilet_0259.off\ntoilet/train/toilet_0260.off\ntoilet/train/toilet_0261.off\ntoilet/train/toilet_0262.off\ntoilet/train/toilet_0263.off\ntoilet/train/toilet_0264.off\ntoilet/train/toilet_0265.off\ntoilet/train/toilet_0266.off\ntoilet/train/toilet_0267.off\ntoilet/train/toilet_0268.off\ntoilet/train/toilet_0269.off\ntoilet/train/toilet_0270.off\ntoilet/train/toilet_0271.off\ntoilet/train/toilet_0272.off\ntoilet/train/toilet_0273.off\ntoilet/train/toilet_0274.off\ntoilet/train/toilet_0275.off\ntoilet/train/toilet_0276.off\ntoilet/train/toilet_0277.off\ntoilet/train/toilet_0278.off\ntoilet/train/toilet_0279.off\ntoilet/train/toilet_0280.off\ntoilet/train/toilet_0281.off\ntoilet/train/toilet_0282.off\ntoilet/train/toilet_0283.off\ntoilet/train/toilet_0284.off\ntoilet/train/toilet_0285.off\ntoilet/train/toilet_0286.off\ntoilet/train/toilet_0287.off\ntoilet/train/toilet_0288.off\ntoilet/train/toilet_0289.off\ntoilet/train/toilet_0290.off\ntoilet/train/toilet_0291.off\ntoilet/train/toilet_0292.off\ntoilet/train/toilet_0293.off\ntoilet/train/toilet_0294.off\ntoilet/train/toilet_0295.off\ntoilet/train/toilet_0296.off\ntoilet/train/toilet_0297.off\ntoilet/train/toilet_0298.off\ntoilet/train/toilet_0299.off\ntoilet/train/toilet_0300.off\ntoilet/train/toilet_0301.off\ntoilet/train/toilet_0302.off\ntoilet/train/toilet_0303.off\ntoilet/train/toilet_0304.off\ntoilet/train/toilet_0305.off\ntoilet/train/toilet_0306.off\ntoilet/train/toilet_0307.off\ntoilet/train/toilet_0308.off\ntoilet/train/toilet_0309.off\ntoilet/train/toilet_0310.off\ncurtain/train/curtain_0001.off\ncurtain/train/curtain_0002.off\ncurtain/train/curtain_0003.off\ncurtain/train/curtain_0004.off\ncurtain/train/curtain_0005.off\ncurtain/train/curtain_0006.off\ncurtain/train/curtain_0007.off\ncurtain/train/curtain_0008.off\ncurtain/train/curtain_0009.off\ncurtain/train/curtain_0010.off\ncurtain/train/curtain_0011.off\ncurtain/train/curtain_0012.off\ncurtain/train/curtain_0013.off\ncurtain/train/curtain_0014.off\ncurtain/train/curtain_0015.off\ncurtain/train/curtain_0016.off\ncurtain/train/curtain_0017.off\ncurtain/train/curtain_0018.off\ncurtain/train/curtain_0019.off\ncurtain/train/curtain_0020.off\ncurtain/train/curtain_0021.off\ncurtain/train/curtain_0022.off\ncurtain/train/curtain_0023.off\ncurtain/train/curtain_0024.off\ncurtain/train/curtain_0025.off\ncurtain/train/curtain_0026.off\ncurtain/train/curtain_0027.off\ncurtain/train/curtain_0028.off\ncurtain/train/curtain_0029.off\ncurtain/train/curtain_0030.off\ncurtain/train/curtain_0031.off\ncurtain/train/curtain_0032.off\ncurtain/train/curtain_0033.off\ncurtain/train/curtain_0034.off\ncurtain/train/curtain_0035.off\ncurtain/train/curtain_0036.off\ncurtain/train/curtain_0037.off\ncurtain/train/curtain_0038.off\ncurtain/train/curtain_0039.off\ncurtain/train/curtain_0040.off\ncurtain/train/curtain_0041.off\ncurtain/train/curtain_0042.off\ncurtain/train/curtain_0043.off\ncurtain/train/curtain_0044.off\ncurtain/train/curtain_0045.off\ncurtain/train/curtain_0046.off\ncurtain/train/curtain_0047.off\ncurtain/train/curtain_0048.off\ncurtain/train/curtain_0049.off\ncurtain/train/curtain_0050.off\ncurtain/train/curtain_0051.off\ncurtain/train/curtain_0052.off\ncurtain/train/curtain_0053.off\ncurtain/train/curtain_0054.off\ncurtain/train/curtain_0055.off\ncurtain/train/curtain_0056.off\ncurtain/train/curtain_0057.off\ncurtain/train/curtain_0058.off\ncurtain/train/curtain_0059.off\ncurtain/train/curtain_0060.off\ncurtain/train/curtain_0061.off\ncurtain/train/curtain_0062.off\ncurtain/train/curtain_0063.off\ncurtain/train/curtain_0064.off\ncurtain/train/curtain_0065.off\ncurtain/train/curtain_0066.off\ncurtain/train/curtain_0067.off\ncurtain/train/curtain_0068.off\ncurtain/train/curtain_0069.off\ncurtain/train/curtain_0070.off\ncurtain/train/curtain_0071.off\ncurtain/train/curtain_0072.off\ncurtain/train/curtain_0073.off\ncurtain/train/curtain_0074.off\ncurtain/train/curtain_0075.off\ncurtain/train/curtain_0076.off\ncurtain/train/curtain_0077.off\ncurtain/train/curtain_0078.off\ncurtain/train/curtain_0079.off\ncurtain/train/curtain_0080.off\ncurtain/train/curtain_0081.off\ncurtain/train/curtain_0082.off\ncurtain/train/curtain_0083.off\ncurtain/train/curtain_0084.off\ncurtain/train/curtain_0085.off\ncurtain/train/curtain_0086.off\ncurtain/train/curtain_0087.off\ncurtain/train/curtain_0088.off\ncurtain/train/curtain_0089.off\ncurtain/train/curtain_0090.off\ncurtain/train/curtain_0091.off\ncurtain/train/curtain_0092.off\ncurtain/train/curtain_0093.off\ncurtain/train/curtain_0094.off\ncurtain/train/curtain_0095.off\ncurtain/train/curtain_0096.off\ncurtain/train/curtain_0097.off\ncurtain/train/curtain_0098.off\ncurtain/train/curtain_0099.off\ncurtain/train/curtain_0100.off\ncurtain/train/curtain_0101.off\ncurtain/train/curtain_0102.off\ncurtain/train/curtain_0103.off\ncurtain/train/curtain_0104.off\ncurtain/train/curtain_0105.off\ncurtain/train/curtain_0106.off\ncurtain/train/curtain_0107.off\ncurtain/train/curtain_0108.off\ncurtain/train/curtain_0109.off\ncurtain/train/curtain_0110.off\ncurtain/train/curtain_0111.off\ncurtain/train/curtain_0112.off\ncurtain/train/curtain_0113.off\ncurtain/train/curtain_0114.off\ncurtain/train/curtain_0115.off\ncurtain/train/curtain_0116.off\ncurtain/train/curtain_0117.off\ncurtain/train/curtain_0118.off\ncurtain/train/curtain_0119.off\ncurtain/train/curtain_0120.off\ncurtain/train/curtain_0121.off\ncurtain/train/curtain_0122.off\ncurtain/train/curtain_0123.off\ncurtain/train/curtain_0124.off\ncurtain/train/curtain_0125.off\nwardrobe/train/wardrobe_0001.off\nwardrobe/train/wardrobe_0002.off\nwardrobe/train/wardrobe_0003.off\nwardrobe/train/wardrobe_0004.off\nwardrobe/train/wardrobe_0005.off\nwardrobe/train/wardrobe_0006.off\nwardrobe/train/wardrobe_0007.off\nwardrobe/train/wardrobe_0008.off\nwardrobe/train/wardrobe_0009.off\nwardrobe/train/wardrobe_0010.off\nwardrobe/train/wardrobe_0011.off\nwardrobe/train/wardrobe_0012.off\nwardrobe/train/wardrobe_0013.off\nwardrobe/train/wardrobe_0014.off\nwardrobe/train/wardrobe_0015.off\nwardrobe/train/wardrobe_0016.off\nwardrobe/train/wardrobe_0017.off\nwardrobe/train/wardrobe_0018.off\nwardrobe/train/wardrobe_0019.off\nwardrobe/train/wardrobe_0020.off\nwardrobe/train/wardrobe_0021.off\nwardrobe/train/wardrobe_0022.off\nwardrobe/train/wardrobe_0023.off\nwardrobe/train/wardrobe_0024.off\nwardrobe/train/wardrobe_0025.off\nwardrobe/train/wardrobe_0026.off\nwardrobe/train/wardrobe_0027.off\nwardrobe/train/wardrobe_0028.off\nwardrobe/train/wardrobe_0029.off\nwardrobe/train/wardrobe_0030.off\nwardrobe/train/wardrobe_0031.off\nwardrobe/train/wardrobe_0032.off\nwardrobe/train/wardrobe_0033.off\nwardrobe/train/wardrobe_0034.off\nwardrobe/train/wardrobe_0035.off\nwardrobe/train/wardrobe_0036.off\nwardrobe/train/wardrobe_0037.off\nwardrobe/train/wardrobe_0038.off\nwardrobe/train/wardrobe_0039.off\nwardrobe/train/wardrobe_0040.off\nwardrobe/train/wardrobe_0041.off\nwardrobe/train/wardrobe_0042.off\nwardrobe/train/wardrobe_0043.off\nwardrobe/train/wardrobe_0044.off\nwardrobe/train/wardrobe_0045.off\nwardrobe/train/wardrobe_0046.off\nwardrobe/train/wardrobe_0047.off\nwardrobe/train/wardrobe_0048.off\nwardrobe/train/wardrobe_0049.off\nwardrobe/train/wardrobe_0050.off\nwardrobe/train/wardrobe_0051.off\nwardrobe/train/wardrobe_0052.off\nwardrobe/train/wardrobe_0053.off\nwardrobe/train/wardrobe_0054.off\nwardrobe/train/wardrobe_0055.off\nwardrobe/train/wardrobe_0056.off\nwardrobe/train/wardrobe_0057.off\nwardrobe/train/wardrobe_0058.off\nwardrobe/train/wardrobe_0059.off\nwardrobe/train/wardrobe_0060.off\nwardrobe/train/wardrobe_0061.off\nwardrobe/train/wardrobe_0062.off\nwardrobe/train/wardrobe_0063.off\nwardrobe/train/wardrobe_0064.off\nwardrobe/train/wardrobe_0065.off\nwardrobe/train/wardrobe_0066.off\nwardrobe/train/wardrobe_0067.off\nwardrobe/train/wardrobe_0068.off\nwardrobe/train/wardrobe_0069.off\nwardrobe/train/wardrobe_0070.off\nwardrobe/train/wardrobe_0071.off\nwardrobe/train/wardrobe_0072.off\nwardrobe/train/wardrobe_0073.off\nwardrobe/train/wardrobe_0074.off\nwardrobe/train/wardrobe_0075.off\nwardrobe/train/wardrobe_0076.off\nwardrobe/train/wardrobe_0077.off\nwardrobe/train/wardrobe_0078.off\nwardrobe/train/wardrobe_0079.off\nstool/train/stool_0001.off\nstool/train/stool_0002.off\nstool/train/stool_0003.off\nstool/train/stool_0004.off\nstool/train/stool_0005.off\nstool/train/stool_0006.off\nstool/train/stool_0007.off\nstool/train/stool_0008.off\nstool/train/stool_0009.off\nstool/train/stool_0010.off\nstool/train/stool_0011.off\nstool/train/stool_0012.off\nstool/train/stool_0013.off\nstool/train/stool_0014.off\nstool/train/stool_0015.off\nstool/train/stool_0016.off\nstool/train/stool_0017.off\nstool/train/stool_0018.off\nstool/train/stool_0019.off\nstool/train/stool_0020.off\nstool/train/stool_0021.off\nstool/train/stool_0022.off\nstool/train/stool_0023.off\nstool/train/stool_0024.off\nstool/train/stool_0025.off\nstool/train/stool_0026.off\nstool/train/stool_0027.off\nstool/train/stool_0028.off\nstool/train/stool_0029.off\nstool/train/stool_0030.off\nstool/train/stool_0031.off\nstool/train/stool_0032.off\nstool/train/stool_0033.off\nstool/train/stool_0034.off\nstool/train/stool_0035.off\nstool/train/stool_0036.off\nstool/train/stool_0037.off\nstool/train/stool_0038.off\nstool/train/stool_0039.off\nstool/train/stool_0040.off\nstool/train/stool_0041.off\nstool/train/stool_0042.off\nstool/train/stool_0043.off\nstool/train/stool_0044.off\nstool/train/stool_0045.off\nstool/train/stool_0046.off\nstool/train/stool_0047.off\nstool/train/stool_0048.off\nstool/train/stool_0049.off\nstool/train/stool_0050.off\nstool/train/stool_0051.off\nstool/train/stool_0052.off\nstool/train/stool_0053.off\nstool/train/stool_0054.off\nstool/train/stool_0055.off\nstool/train/stool_0056.off\nstool/train/stool_0057.off\nstool/train/stool_0058.off\nstool/train/stool_0059.off\nstool/train/stool_0060.off\nstool/train/stool_0061.off\nstool/train/stool_0062.off\nstool/train/stool_0063.off\nstool/train/stool_0064.off\nstool/train/stool_0065.off\nstool/train/stool_0066.off\nstool/train/stool_0067.off\nstool/train/stool_0068.off\nstool/train/stool_0069.off\nstool/train/stool_0070.off\nstool/train/stool_0071.off\nstool/train/stool_0072.off\nstool/train/stool_0073.off\nstool/train/stool_0074.off\nstool/train/stool_0075.off\nstool/train/stool_0076.off\nstool/train/stool_0077.off\nstool/train/stool_0078.off\nstool/train/stool_0079.off\nstool/train/stool_0080.off\nstool/train/stool_0081.off\nmantel/train/mantel_0001.off\nmantel/train/mantel_0002.off\nmantel/train/mantel_0003.off\nmantel/train/mantel_0004.off\nmantel/train/mantel_0005.off\nmantel/train/mantel_0006.off\nmantel/train/mantel_0007.off\nmantel/train/mantel_0008.off\nmantel/train/mantel_0009.off\nmantel/train/mantel_0010.off\nmantel/train/mantel_0011.off\nmantel/train/mantel_0012.off\nmantel/train/mantel_0013.off\nmantel/train/mantel_0014.off\nmantel/train/mantel_0015.off\nmantel/train/mantel_0016.off\nmantel/train/mantel_0017.off\nmantel/train/mantel_0018.off\nmantel/train/mantel_0019.off\nmantel/train/mantel_0020.off\nmantel/train/mantel_0021.off\nmantel/train/mantel_0022.off\nmantel/train/mantel_0023.off\nmantel/train/mantel_0024.off\nmantel/train/mantel_0025.off\nmantel/train/mantel_0026.off\nmantel/train/mantel_0027.off\nmantel/train/mantel_0028.off\nmantel/train/mantel_0029.off\nmantel/train/mantel_0030.off\nmantel/train/mantel_0031.off\nmantel/train/mantel_0032.off\nmantel/train/mantel_0033.off\nmantel/train/mantel_0034.off\nmantel/train/mantel_0035.off\nmantel/train/mantel_0036.off\nmantel/train/mantel_0037.off\nmantel/train/mantel_0038.off\nmantel/train/mantel_0039.off\nmantel/train/mantel_0040.off\nmantel/train/mantel_0041.off\nmantel/train/mantel_0042.off\nmantel/train/mantel_0043.off\nmantel/train/mantel_0044.off\nmantel/train/mantel_0045.off\nmantel/train/mantel_0046.off\nmantel/train/mantel_0047.off\nmantel/train/mantel_0048.off\nmantel/train/mantel_0049.off\nmantel/train/mantel_0050.off\nmantel/train/mantel_0051.off\nmantel/train/mantel_0052.off\nmantel/train/mantel_0053.off\nmantel/train/mantel_0054.off\nmantel/train/mantel_0055.off\nmantel/train/mantel_0056.off\nmantel/train/mantel_0057.off\nmantel/train/mantel_0058.off\nmantel/train/mantel_0059.off\nmantel/train/mantel_0060.off\nmantel/train/mantel_0061.off\nmantel/train/mantel_0062.off\nmantel/train/mantel_0063.off\nmantel/train/mantel_0064.off\nmantel/train/mantel_0065.off\nmantel/train/mantel_0066.off\nmantel/train/mantel_0067.off\nmantel/train/mantel_0068.off\nmantel/train/mantel_0069.off\nmantel/train/mantel_0070.off\nmantel/train/mantel_0071.off\nmantel/train/mantel_0072.off\nmantel/train/mantel_0073.off\nmantel/train/mantel_0074.off\nmantel/train/mantel_0075.off\nmantel/train/mantel_0076.off\nmantel/train/mantel_0077.off\nmantel/train/mantel_0078.off\nmantel/train/mantel_0079.off\nmantel/train/mantel_0080.off\nmantel/train/mantel_0081.off\nmantel/train/mantel_0082.off\nmantel/train/mantel_0083.off\nmantel/train/mantel_0084.off\nmantel/train/mantel_0085.off\nmantel/train/mantel_0086.off\nmantel/train/mantel_0087.off\nmantel/train/mantel_0088.off\nmantel/train/mantel_0089.off\nmantel/train/mantel_0090.off\nmantel/train/mantel_0091.off\nmantel/train/mantel_0092.off\nmantel/train/mantel_0093.off\nmantel/train/mantel_0094.off\nmantel/train/mantel_0095.off\nmantel/train/mantel_0096.off\nmantel/train/mantel_0097.off\nmantel/train/mantel_0098.off\nmantel/train/mantel_0099.off\nmantel/train/mantel_0100.off\nmantel/train/mantel_0101.off\nmantel/train/mantel_0102.off\nmantel/train/mantel_0103.off\nmantel/train/mantel_0104.off\nmantel/train/mantel_0105.off\nmantel/train/mantel_0106.off\nmantel/train/mantel_0107.off\nmantel/train/mantel_0108.off\nmantel/train/mantel_0109.off\nmantel/train/mantel_0110.off\nmantel/train/mantel_0111.off\nmantel/train/mantel_0112.off\nmantel/train/mantel_0113.off\nmantel/train/mantel_0114.off\nmantel/train/mantel_0115.off\nmantel/train/mantel_0116.off\nmantel/train/mantel_0117.off\nmantel/train/mantel_0118.off\nmantel/train/mantel_0119.off\nmantel/train/mantel_0120.off\nmantel/train/mantel_0121.off\nmantel/train/mantel_0122.off\nmantel/train/mantel_0123.off\nmantel/train/mantel_0124.off\nmantel/train/mantel_0125.off\nmantel/train/mantel_0126.off\nmantel/train/mantel_0127.off\nmantel/train/mantel_0128.off\nmantel/train/mantel_0129.off\nmantel/train/mantel_0130.off\nmantel/train/mantel_0131.off\nmantel/train/mantel_0132.off\nmantel/train/mantel_0133.off\nmantel/train/mantel_0134.off\nmantel/train/mantel_0135.off\nmantel/train/mantel_0136.off\nmantel/train/mantel_0137.off\nmantel/train/mantel_0138.off\nmantel/train/mantel_0139.off\nmantel/train/mantel_0140.off\nmantel/train/mantel_0141.off\nmantel/train/mantel_0142.off\nmantel/train/mantel_0143.off\nmantel/train/mantel_0144.off\nmantel/train/mantel_0145.off\nmantel/train/mantel_0146.off\nmantel/train/mantel_0147.off\nmantel/train/mantel_0148.off\nmantel/train/mantel_0149.off\nmantel/train/mantel_0150.off\nmantel/train/mantel_0151.off\nmantel/train/mantel_0152.off\nmantel/train/mantel_0153.off\nmantel/train/mantel_0154.off\nmantel/train/mantel_0155.off\nmantel/train/mantel_0156.off\nmantel/train/mantel_0157.off\nmantel/train/mantel_0158.off\nmantel/train/mantel_0159.off\nmantel/train/mantel_0160.off\nmantel/train/mantel_0161.off\nmantel/train/mantel_0162.off\nmantel/train/mantel_0163.off\nmantel/train/mantel_0164.off\nmantel/train/mantel_0165.off\nmantel/train/mantel_0166.off\nmantel/train/mantel_0167.off\nmantel/train/mantel_0168.off\nmantel/train/mantel_0169.off\nmantel/train/mantel_0170.off\nmantel/train/mantel_0171.off\nmantel/train/mantel_0172.off\nmantel/train/mantel_0173.off\nmantel/train/mantel_0174.off\nmantel/train/mantel_0175.off\nmantel/train/mantel_0176.off\nmantel/train/mantel_0177.off\nmantel/train/mantel_0178.off\nmantel/train/mantel_0179.off\nmantel/train/mantel_0180.off\nmantel/train/mantel_0181.off\nmantel/train/mantel_0182.off\nmantel/train/mantel_0183.off\nmantel/train/mantel_0184.off\nmantel/train/mantel_0185.off\nmantel/train/mantel_0186.off\nmantel/train/mantel_0187.off\nmantel/train/mantel_0188.off\nmantel/train/mantel_0189.off\nmantel/train/mantel_0190.off\nmantel/train/mantel_0191.off\nmantel/train/mantel_0192.off\nmantel/train/mantel_0193.off\nmantel/train/mantel_0194.off\nmantel/train/mantel_0195.off\nmantel/train/mantel_0196.off\nmantel/train/mantel_0197.off\nmantel/train/mantel_0198.off\nmantel/train/mantel_0199.off\nmantel/train/mantel_0200.off\nmantel/train/mantel_0201.off\nmantel/train/mantel_0202.off\nmantel/train/mantel_0203.off\nmantel/train/mantel_0204.off\nmantel/train/mantel_0205.off\nmantel/train/mantel_0206.off\nmantel/train/mantel_0207.off\nmantel/train/mantel_0208.off\nmantel/train/mantel_0209.off\nmantel/train/mantel_0210.off\nmantel/train/mantel_0211.off\nmantel/train/mantel_0212.off\nmantel/train/mantel_0213.off\nmantel/train/mantel_0214.off\nmantel/train/mantel_0215.off\nmantel/train/mantel_0216.off\nmantel/train/mantel_0217.off\nmantel/train/mantel_0218.off\nmantel/train/mantel_0219.off\nmantel/train/mantel_0220.off\nmantel/train/mantel_0221.off\nmantel/train/mantel_0222.off\nmantel/train/mantel_0223.off\nmantel/train/mantel_0224.off\nmantel/train/mantel_0225.off\nmantel/train/mantel_0226.off\nmantel/train/mantel_0227.off\nmantel/train/mantel_0228.off\nmantel/train/mantel_0229.off\nmantel/train/mantel_0230.off\nmantel/train/mantel_0231.off\nmantel/train/mantel_0232.off\nmantel/train/mantel_0233.off\nmantel/train/mantel_0234.off\nmantel/train/mantel_0235.off\nmantel/train/mantel_0236.off\nmantel/train/mantel_0237.off\nmantel/train/mantel_0238.off\nmantel/train/mantel_0239.off\nmantel/train/mantel_0240.off\nmantel/train/mantel_0241.off\nmantel/train/mantel_0242.off\nmantel/train/mantel_0243.off\nmantel/train/mantel_0244.off\nmantel/train/mantel_0245.off\nmantel/train/mantel_0246.off\nmantel/train/mantel_0247.off\nmantel/train/mantel_0248.off\nmantel/train/mantel_0249.off\nmantel/train/mantel_0250.off\nmantel/train/mantel_0251.off\nmantel/train/mantel_0252.off\nmantel/train/mantel_0253.off\nmantel/train/mantel_0254.off\nmantel/train/mantel_0255.off\nmantel/train/mantel_0256.off\ncup/train/cup_0001.off\ncup/train/cup_0002.off\ncup/train/cup_0003.off\ncup/train/cup_0004.off\ncup/train/cup_0005.off\ncup/train/cup_0006.off\ncup/train/cup_0007.off\ncup/train/cup_0008.off\ncup/train/cup_0009.off\ncup/train/cup_0010.off\ncup/train/cup_0011.off\ncup/train/cup_0012.off\ncup/train/cup_0013.off\ncup/train/cup_0014.off\ncup/train/cup_0015.off\ncup/train/cup_0016.off\ncup/train/cup_0017.off\ncup/train/cup_0018.off\ncup/train/cup_0019.off\ncup/train/cup_0020.off\ncup/train/cup_0021.off\ncup/train/cup_0022.off\ncup/train/cup_0023.off\ncup/train/cup_0024.off\ncup/train/cup_0025.off\ncup/train/cup_0026.off\ncup/train/cup_0027.off\ncup/train/cup_0028.off\ncup/train/cup_0029.off\ncup/train/cup_0030.off\ncup/train/cup_0031.off\ncup/train/cup_0032.off\ncup/train/cup_0033.off\ncup/train/cup_0034.off\ncup/train/cup_0035.off\ncup/train/cup_0036.off\ncup/train/cup_0037.off\ncup/train/cup_0038.off\ncup/train/cup_0039.off\ncup/train/cup_0040.off\ncup/train/cup_0041.off\ncup/train/cup_0042.off\ncup/train/cup_0043.off\ncup/train/cup_0044.off\ncup/train/cup_0045.off\ncup/train/cup_0046.off\ncup/train/cup_0047.off\ncup/train/cup_0048.off\ncup/train/cup_0049.off\ncup/train/cup_0050.off\ncup/train/cup_0051.off\ncup/train/cup_0052.off\ncup/train/cup_0053.off\ncup/train/cup_0054.off\ncup/train/cup_0055.off\ncup/train/cup_0056.off\ncup/train/cup_0057.off\ncup/train/cup_0058.off\ncup/train/cup_0059.off\ncup/train/cup_0060.off\ncup/train/cup_0061.off\ncup/train/cup_0062.off\ncup/train/cup_0063.off\ncup/train/cup_0064.off\ncup/train/cup_0065.off\ncup/train/cup_0066.off\ncup/train/cup_0067.off\ncup/train/cup_0068.off\ncup/train/cup_0069.off\ncup/train/cup_0070.off\ncup/train/cup_0071.off\ncup/train/cup_0072.off\nradio/train/radio_0001.off\nradio/train/radio_0002.off\nradio/train/radio_0003.off\nradio/train/radio_0004.off\nradio/train/radio_0005.off\nradio/train/radio_0006.off\nradio/train/radio_0007.off\nradio/train/radio_0008.off\nradio/train/radio_0009.off\nradio/train/radio_0010.off\nradio/train/radio_0011.off\nradio/train/radio_0012.off\nradio/train/radio_0013.off\nradio/train/radio_0014.off\nradio/train/radio_0015.off\nradio/train/radio_0016.off\nradio/train/radio_0017.off\nradio/train/radio_0018.off\nradio/train/radio_0019.off\nradio/train/radio_0020.off\nradio/train/radio_0021.off\nradio/train/radio_0022.off\nradio/train/radio_0023.off\nradio/train/radio_0024.off\nradio/train/radio_0025.off\nradio/train/radio_0026.off\nradio/train/radio_0027.off\nradio/train/radio_0028.off\nradio/train/radio_0029.off\nradio/train/radio_0030.off\nradio/train/radio_0031.off\nradio/train/radio_0032.off\nradio/train/radio_0033.off\nradio/train/radio_0034.off\nradio/train/radio_0035.off\nradio/train/radio_0036.off\nradio/train/radio_0037.off\nradio/train/radio_0038.off\nradio/train/radio_0039.off\nradio/train/radio_0040.off\nradio/train/radio_0041.off\nradio/train/radio_0042.off\nradio/train/radio_0043.off\nradio/train/radio_0044.off\nradio/train/radio_0045.off\nradio/train/radio_0046.off\nradio/train/radio_0047.off\nradio/train/radio_0048.off\nradio/train/radio_0049.off\nradio/train/radio_0050.off\nradio/train/radio_0051.off\nradio/train/radio_0052.off\nradio/train/radio_0053.off\nradio/train/radio_0054.off\nradio/train/radio_0055.off\nradio/train/radio_0056.off\nradio/train/radio_0057.off\nradio/train/radio_0058.off\nradio/train/radio_0059.off\nradio/train/radio_0060.off\nradio/train/radio_0061.off\nradio/train/radio_0062.off\nradio/train/radio_0063.off\nradio/train/radio_0064.off\nradio/train/radio_0065.off\nradio/train/radio_0066.off\nradio/train/radio_0067.off\nradio/train/radio_0068.off\nradio/train/radio_0069.off\nradio/train/radio_0070.off\nradio/train/radio_0071.off\nradio/train/radio_0072.off\nradio/train/radio_0073.off\nradio/train/radio_0074.off\nradio/train/radio_0075.off\nradio/train/radio_0076.off\nradio/train/radio_0077.off\nradio/train/radio_0078.off\nradio/train/radio_0079.off\nradio/train/radio_0080.off\nradio/train/radio_0081.off\nradio/train/radio_0082.off\nradio/train/radio_0083.off\nradio/train/radio_0084.off\nradio/train/radio_0085.off\nradio/train/radio_0086.off\nradio/train/radio_0087.off\nradio/train/radio_0088.off\nradio/train/radio_0089.off\nradio/train/radio_0090.off\nradio/train/radio_0091.off\nradio/train/radio_0092.off\nradio/train/radio_0093.off\nradio/train/radio_0094.off\nairplane/train/airplane_0001.off\nairplane/train/airplane_0002.off\nairplane/train/airplane_0003.off\nairplane/train/airplane_0004.off\nairplane/train/airplane_0005.off\nairplane/train/airplane_0006.off\nairplane/train/airplane_0007.off\nairplane/train/airplane_0008.off\nairplane/train/airplane_0009.off\nairplane/train/airplane_0010.off\nairplane/train/airplane_0011.off\nairplane/train/airplane_0012.off\nairplane/train/airplane_0013.off\nairplane/train/airplane_0014.off\nairplane/train/airplane_0015.off\nairplane/train/airplane_0016.off\nairplane/train/airplane_0017.off\nairplane/train/airplane_0018.off\nairplane/train/airplane_0019.off\nairplane/train/airplane_0020.off\nairplane/train/airplane_0021.off\nairplane/train/airplane_0022.off\nairplane/train/airplane_0023.off\nairplane/train/airplane_0024.off\nairplane/train/airplane_0025.off\nairplane/train/airplane_0026.off\nairplane/train/airplane_0027.off\nairplane/train/airplane_0028.off\nairplane/train/airplane_0029.off\nairplane/train/airplane_0030.off\nairplane/train/airplane_0031.off\nairplane/train/airplane_0032.off\nairplane/train/airplane_0033.off\nairplane/train/airplane_0034.off\nairplane/train/airplane_0035.off\nairplane/train/airplane_0036.off\nairplane/train/airplane_0037.off\nairplane/train/airplane_0038.off\nairplane/train/airplane_0039.off\nairplane/train/airplane_0040.off\nairplane/train/airplane_0041.off\nairplane/train/airplane_0042.off\nairplane/train/airplane_0043.off\nairplane/train/airplane_0044.off\nairplane/train/airplane_0045.off\nairplane/train/airplane_0046.off\nairplane/train/airplane_0047.off\nairplane/train/airplane_0048.off\nairplane/train/airplane_0049.off\nairplane/train/airplane_0050.off\nairplane/train/airplane_0051.off\nairplane/train/airplane_0052.off\nairplane/train/airplane_0053.off\nairplane/train/airplane_0054.off\nairplane/train/airplane_0055.off\nairplane/train/airplane_0056.off\nairplane/train/airplane_0057.off\nairplane/train/airplane_0058.off\nairplane/train/airplane_0059.off\nairplane/train/airplane_0060.off\nairplane/train/airplane_0061.off\nairplane/train/airplane_0062.off\nairplane/train/airplane_0063.off\nairplane/train/airplane_0064.off\nairplane/train/airplane_0065.off\nairplane/train/airplane_0066.off\nairplane/train/airplane_0067.off\nairplane/train/airplane_0068.off\nairplane/train/airplane_0069.off\nairplane/train/airplane_0070.off\nairplane/train/airplane_0071.off\nairplane/train/airplane_0072.off\nairplane/train/airplane_0073.off\nairplane/train/airplane_0074.off\nairplane/train/airplane_0075.off\nairplane/train/airplane_0076.off\nairplane/train/airplane_0077.off\nairplane/train/airplane_0078.off\nairplane/train/airplane_0079.off\nairplane/train/airplane_0080.off\nairplane/train/airplane_0081.off\nairplane/train/airplane_0082.off\nairplane/train/airplane_0083.off\nairplane/train/airplane_0084.off\nairplane/train/airplane_0085.off\nairplane/train/airplane_0086.off\nairplane/train/airplane_0087.off\nairplane/train/airplane_0088.off\nairplane/train/airplane_0089.off\nairplane/train/airplane_0090.off\nairplane/train/airplane_0091.off\nairplane/train/airplane_0092.off\nairplane/train/airplane_0093.off\nairplane/train/airplane_0094.off\nairplane/train/airplane_0095.off\nairplane/train/airplane_0096.off\nairplane/train/airplane_0097.off\nairplane/train/airplane_0098.off\nairplane/train/airplane_0099.off\nairplane/train/airplane_0100.off\nairplane/train/airplane_0101.off\nairplane/train/airplane_0102.off\nairplane/train/airplane_0103.off\nairplane/train/airplane_0104.off\nairplane/train/airplane_0105.off\nairplane/train/airplane_0106.off\nairplane/train/airplane_0107.off\nairplane/train/airplane_0108.off\nairplane/train/airplane_0109.off\nairplane/train/airplane_0110.off\nairplane/train/airplane_0111.off\nairplane/train/airplane_0112.off\nairplane/train/airplane_0113.off\nairplane/train/airplane_0114.off\nairplane/train/airplane_0115.off\nairplane/train/airplane_0116.off\nairplane/train/airplane_0117.off\nairplane/train/airplane_0118.off\nairplane/train/airplane_0119.off\nairplane/train/airplane_0120.off\nairplane/train/airplane_0121.off\nairplane/train/airplane_0122.off\nairplane/train/airplane_0123.off\nairplane/train/airplane_0124.off\nairplane/train/airplane_0125.off\nairplane/train/airplane_0126.off\nairplane/train/airplane_0127.off\nairplane/train/airplane_0128.off\nairplane/train/airplane_0129.off\nairplane/train/airplane_0130.off\nairplane/train/airplane_0131.off\nairplane/train/airplane_0132.off\nairplane/train/airplane_0133.off\nairplane/train/airplane_0134.off\nairplane/train/airplane_0135.off\nairplane/train/airplane_0136.off\nairplane/train/airplane_0137.off\nairplane/train/airplane_0138.off\nairplane/train/airplane_0139.off\nairplane/train/airplane_0140.off\nairplane/train/airplane_0141.off\nairplane/train/airplane_0142.off\nairplane/train/airplane_0143.off\nairplane/train/airplane_0144.off\nairplane/train/airplane_0145.off\nairplane/train/airplane_0146.off\nairplane/train/airplane_0147.off\nairplane/train/airplane_0148.off\nairplane/train/airplane_0149.off\nairplane/train/airplane_0150.off\nairplane/train/airplane_0151.off\nairplane/train/airplane_0152.off\nairplane/train/airplane_0153.off\nairplane/train/airplane_0154.off\nairplane/train/airplane_0155.off\nairplane/train/airplane_0156.off\nairplane/train/airplane_0157.off\nairplane/train/airplane_0158.off\nairplane/train/airplane_0159.off\nairplane/train/airplane_0160.off\nairplane/train/airplane_0161.off\nairplane/train/airplane_0162.off\nairplane/train/airplane_0163.off\nairplane/train/airplane_0164.off\nairplane/train/airplane_0165.off\nairplane/train/airplane_0166.off\nairplane/train/airplane_0167.off\nairplane/train/airplane_0168.off\nairplane/train/airplane_0169.off\nairplane/train/airplane_0170.off\nairplane/train/airplane_0171.off\nairplane/train/airplane_0172.off\nairplane/train/airplane_0173.off\nairplane/train/airplane_0174.off\nairplane/train/airplane_0175.off\nairplane/train/airplane_0176.off\nairplane/train/airplane_0177.off\nairplane/train/airplane_0178.off\nairplane/train/airplane_0179.off\nairplane/train/airplane_0180.off\nairplane/train/airplane_0181.off\nairplane/train/airplane_0182.off\nairplane/train/airplane_0183.off\nairplane/train/airplane_0184.off\nairplane/train/airplane_0185.off\nairplane/train/airplane_0186.off\nairplane/train/airplane_0187.off\nairplane/train/airplane_0188.off\nairplane/train/airplane_0189.off\nairplane/train/airplane_0190.off\nairplane/train/airplane_0191.off\nairplane/train/airplane_0192.off\nairplane/train/airplane_0193.off\nairplane/train/airplane_0194.off\nairplane/train/airplane_0195.off\nairplane/train/airplane_0196.off\nairplane/train/airplane_0197.off\nairplane/train/airplane_0198.off\nairplane/train/airplane_0199.off\nairplane/train/airplane_0200.off\nairplane/train/airplane_0201.off\nairplane/train/airplane_0202.off\nairplane/train/airplane_0203.off\nairplane/train/airplane_0204.off\nairplane/train/airplane_0205.off\nairplane/train/airplane_0206.off\nairplane/train/airplane_0207.off\nairplane/train/airplane_0208.off\nairplane/train/airplane_0209.off\nairplane/train/airplane_0210.off\nairplane/train/airplane_0211.off\nairplane/train/airplane_0212.off\nairplane/train/airplane_0213.off\nairplane/train/airplane_0214.off\nairplane/train/airplane_0215.off\nairplane/train/airplane_0216.off\nairplane/train/airplane_0217.off\nairplane/train/airplane_0218.off\nairplane/train/airplane_0219.off\nairplane/train/airplane_0220.off\nairplane/train/airplane_0221.off\nairplane/train/airplane_0222.off\nairplane/train/airplane_0223.off\nairplane/train/airplane_0224.off\nairplane/train/airplane_0225.off\nairplane/train/airplane_0226.off\nairplane/train/airplane_0227.off\nairplane/train/airplane_0228.off\nairplane/train/airplane_0229.off\nairplane/train/airplane_0230.off\nairplane/train/airplane_0231.off\nairplane/train/airplane_0232.off\nairplane/train/airplane_0233.off\nairplane/train/airplane_0234.off\nairplane/train/airplane_0235.off\nairplane/train/airplane_0236.off\nairplane/train/airplane_0237.off\nairplane/train/airplane_0238.off\nairplane/train/airplane_0239.off\nairplane/train/airplane_0240.off\nairplane/train/airplane_0241.off\nairplane/train/airplane_0242.off\nairplane/train/airplane_0243.off\nairplane/train/airplane_0244.off\nairplane/train/airplane_0245.off\nairplane/train/airplane_0246.off\nairplane/train/airplane_0247.off\nairplane/train/airplane_0248.off\nairplane/train/airplane_0249.off\nairplane/train/airplane_0250.off\nairplane/train/airplane_0251.off\nairplane/train/airplane_0252.off\nairplane/train/airplane_0253.off\nairplane/train/airplane_0254.off\nairplane/train/airplane_0255.off\nairplane/train/airplane_0256.off\nairplane/train/airplane_0257.off\nairplane/train/airplane_0258.off\nairplane/train/airplane_0259.off\nairplane/train/airplane_0260.off\nairplane/train/airplane_0261.off\nairplane/train/airplane_0262.off\nairplane/train/airplane_0263.off\nairplane/train/airplane_0264.off\nairplane/train/airplane_0265.off\nairplane/train/airplane_0266.off\nairplane/train/airplane_0267.off\nairplane/train/airplane_0268.off\nairplane/train/airplane_0269.off\nairplane/train/airplane_0270.off\nairplane/train/airplane_0271.off\nairplane/train/airplane_0272.off\nairplane/train/airplane_0273.off\nairplane/train/airplane_0274.off\nairplane/train/airplane_0275.off\nairplane/train/airplane_0276.off\nairplane/train/airplane_0277.off\nairplane/train/airplane_0278.off\nairplane/train/airplane_0279.off\nairplane/train/airplane_0280.off\nairplane/train/airplane_0281.off\nairplane/train/airplane_0282.off\nairplane/train/airplane_0283.off\nairplane/train/airplane_0284.off\nairplane/train/airplane_0285.off\nairplane/train/airplane_0286.off\nairplane/train/airplane_0287.off\nairplane/train/airplane_0288.off\nairplane/train/airplane_0289.off\nairplane/train/airplane_0290.off\nairplane/train/airplane_0291.off\nairplane/train/airplane_0292.off\nairplane/train/airplane_0293.off\nairplane/train/airplane_0294.off\nairplane/train/airplane_0295.off\nairplane/train/airplane_0296.off\nairplane/train/airplane_0297.off\nairplane/train/airplane_0298.off\nairplane/train/airplane_0299.off\nairplane/train/airplane_0300.off\nairplane/train/airplane_0301.off\nairplane/train/airplane_0302.off\nairplane/train/airplane_0303.off\nairplane/train/airplane_0304.off\nairplane/train/airplane_0305.off\nairplane/train/airplane_0306.off\nairplane/train/airplane_0307.off\nairplane/train/airplane_0308.off\nairplane/train/airplane_0309.off\nairplane/train/airplane_0310.off\nairplane/train/airplane_0311.off\nairplane/train/airplane_0312.off\nairplane/train/airplane_0313.off\nairplane/train/airplane_0314.off\nairplane/train/airplane_0315.off\nairplane/train/airplane_0316.off\nairplane/train/airplane_0317.off\nairplane/train/airplane_0318.off\nairplane/train/airplane_0319.off\nairplane/train/airplane_0320.off\nairplane/train/airplane_0321.off\nairplane/train/airplane_0322.off\nairplane/train/airplane_0323.off\nairplane/train/airplane_0324.off\nairplane/train/airplane_0325.off\nairplane/train/airplane_0326.off\nairplane/train/airplane_0327.off\nairplane/train/airplane_0328.off\nairplane/train/airplane_0329.off\nairplane/train/airplane_0330.off\nairplane/train/airplane_0331.off\nairplane/train/airplane_0332.off\nairplane/train/airplane_0333.off\nairplane/train/airplane_0334.off\nairplane/train/airplane_0335.off\nairplane/train/airplane_0336.off\nairplane/train/airplane_0337.off\nairplane/train/airplane_0338.off\nairplane/train/airplane_0339.off\nairplane/train/airplane_0340.off\nairplane/train/airplane_0341.off\nairplane/train/airplane_0342.off\nairplane/train/airplane_0343.off\nairplane/train/airplane_0344.off\nairplane/train/airplane_0345.off\nairplane/train/airplane_0346.off\nairplane/train/airplane_0347.off\nairplane/train/airplane_0348.off\nairplane/train/airplane_0349.off\nairplane/train/airplane_0350.off\nairplane/train/airplane_0351.off\nairplane/train/airplane_0352.off\nairplane/train/airplane_0353.off\nairplane/train/airplane_0354.off\nairplane/train/airplane_0355.off\nairplane/train/airplane_0356.off\nairplane/train/airplane_0357.off\nairplane/train/airplane_0358.off\nairplane/train/airplane_0359.off\nairplane/train/airplane_0360.off\nairplane/train/airplane_0361.off\nairplane/train/airplane_0362.off\nairplane/train/airplane_0363.off\nairplane/train/airplane_0364.off\nairplane/train/airplane_0365.off\nairplane/train/airplane_0366.off\nairplane/train/airplane_0367.off\nairplane/train/airplane_0368.off\nairplane/train/airplane_0369.off\nairplane/train/airplane_0370.off\nairplane/train/airplane_0371.off\nairplane/train/airplane_0372.off\nairplane/train/airplane_0373.off\nairplane/train/airplane_0374.off\nairplane/train/airplane_0375.off\nairplane/train/airplane_0376.off\nairplane/train/airplane_0377.off\nairplane/train/airplane_0378.off\nairplane/train/airplane_0379.off\nairplane/train/airplane_0380.off\nairplane/train/airplane_0381.off\nairplane/train/airplane_0382.off\nairplane/train/airplane_0383.off\nairplane/train/airplane_0384.off\nairplane/train/airplane_0385.off\nairplane/train/airplane_0386.off\nairplane/train/airplane_0387.off\nairplane/train/airplane_0388.off\nairplane/train/airplane_0389.off\nairplane/train/airplane_0390.off\nairplane/train/airplane_0391.off\nairplane/train/airplane_0392.off\nairplane/train/airplane_0393.off\nairplane/train/airplane_0394.off\nairplane/train/airplane_0395.off\nairplane/train/airplane_0396.off\nairplane/train/airplane_0397.off\nairplane/train/airplane_0398.off\nairplane/train/airplane_0399.off\nairplane/train/airplane_0400.off\nairplane/train/airplane_0401.off\nairplane/train/airplane_0402.off\nairplane/train/airplane_0403.off\nairplane/train/airplane_0404.off\nairplane/train/airplane_0405.off\nairplane/train/airplane_0406.off\nairplane/train/airplane_0407.off\nairplane/train/airplane_0408.off\nairplane/train/airplane_0409.off\nairplane/train/airplane_0410.off\nairplane/train/airplane_0411.off\nairplane/train/airplane_0412.off\nairplane/train/airplane_0413.off\nairplane/train/airplane_0414.off\nairplane/train/airplane_0415.off\nairplane/train/airplane_0416.off\nairplane/train/airplane_0417.off\nairplane/train/airplane_0418.off\nairplane/train/airplane_0419.off\nairplane/train/airplane_0420.off\nairplane/train/airplane_0421.off\nairplane/train/airplane_0422.off\nairplane/train/airplane_0423.off\nairplane/train/airplane_0424.off\nairplane/train/airplane_0425.off\nairplane/train/airplane_0426.off\nairplane/train/airplane_0427.off\nairplane/train/airplane_0428.off\nairplane/train/airplane_0429.off\nairplane/train/airplane_0430.off\nairplane/train/airplane_0431.off\nairplane/train/airplane_0432.off\nairplane/train/airplane_0433.off\nairplane/train/airplane_0434.off\nairplane/train/airplane_0435.off\nairplane/train/airplane_0436.off\nairplane/train/airplane_0437.off\nairplane/train/airplane_0438.off\nairplane/train/airplane_0439.off\nairplane/train/airplane_0440.off\nairplane/train/airplane_0441.off\nairplane/train/airplane_0442.off\nairplane/train/airplane_0443.off\nairplane/train/airplane_0444.off\nairplane/train/airplane_0445.off\nairplane/train/airplane_0446.off\nairplane/train/airplane_0447.off\nairplane/train/airplane_0448.off\nairplane/train/airplane_0449.off\nairplane/train/airplane_0450.off\nairplane/train/airplane_0451.off\nairplane/train/airplane_0452.off\nairplane/train/airplane_0453.off\nairplane/train/airplane_0454.off\nairplane/train/airplane_0455.off\nairplane/train/airplane_0456.off\nairplane/train/airplane_0457.off\nairplane/train/airplane_0458.off\nairplane/train/airplane_0459.off\nairplane/train/airplane_0460.off\nairplane/train/airplane_0461.off\nairplane/train/airplane_0462.off\nairplane/train/airplane_0463.off\nairplane/train/airplane_0464.off\nairplane/train/airplane_0465.off\nairplane/train/airplane_0466.off\nairplane/train/airplane_0467.off\nairplane/train/airplane_0468.off\nairplane/train/airplane_0469.off\nairplane/train/airplane_0470.off\nairplane/train/airplane_0471.off\nairplane/train/airplane_0472.off\nairplane/train/airplane_0473.off\nairplane/train/airplane_0474.off\nairplane/train/airplane_0475.off\nairplane/train/airplane_0476.off\nairplane/train/airplane_0477.off\nairplane/train/airplane_0478.off\nairplane/train/airplane_0479.off\nairplane/train/airplane_0480.off\nairplane/train/airplane_0481.off\nairplane/train/airplane_0482.off\nairplane/train/airplane_0483.off\nairplane/train/airplane_0484.off\nairplane/train/airplane_0485.off\nairplane/train/airplane_0486.off\nairplane/train/airplane_0487.off\nairplane/train/airplane_0488.off\nairplane/train/airplane_0489.off\nairplane/train/airplane_0490.off\nairplane/train/airplane_0491.off\nairplane/train/airplane_0492.off\nairplane/train/airplane_0493.off\nairplane/train/airplane_0494.off\nairplane/train/airplane_0495.off\nairplane/train/airplane_0496.off\nairplane/train/airplane_0497.off\nairplane/train/airplane_0498.off\nairplane/train/airplane_0499.off\nairplane/train/airplane_0500.off\nairplane/train/airplane_0501.off\nairplane/train/airplane_0502.off\nairplane/train/airplane_0503.off\nairplane/train/airplane_0504.off\nairplane/train/airplane_0505.off\nairplane/train/airplane_0506.off\nairplane/train/airplane_0507.off\nairplane/train/airplane_0508.off\nairplane/train/airplane_0509.off\nairplane/train/airplane_0510.off\nairplane/train/airplane_0511.off\nairplane/train/airplane_0512.off\nairplane/train/airplane_0513.off\nairplane/train/airplane_0514.off\nairplane/train/airplane_0515.off\nairplane/train/airplane_0516.off\nairplane/train/airplane_0517.off\nairplane/train/airplane_0518.off\nairplane/train/airplane_0519.off\nairplane/train/airplane_0520.off\nairplane/train/airplane_0521.off\nairplane/train/airplane_0522.off\nairplane/train/airplane_0523.off\nairplane/train/airplane_0524.off\nairplane/train/airplane_0525.off\nairplane/train/airplane_0526.off\nairplane/train/airplane_0527.off\nairplane/train/airplane_0528.off\nairplane/train/airplane_0529.off\nairplane/train/airplane_0530.off\nairplane/train/airplane_0531.off\nairplane/train/airplane_0532.off\nairplane/train/airplane_0533.off\nairplane/train/airplane_0534.off\nairplane/train/airplane_0535.off\nairplane/train/airplane_0536.off\nairplane/train/airplane_0537.off\nairplane/train/airplane_0538.off\nairplane/train/airplane_0539.off\nairplane/train/airplane_0540.off\nairplane/train/airplane_0541.off\nairplane/train/airplane_0542.off\nairplane/train/airplane_0543.off\nairplane/train/airplane_0544.off\nairplane/train/airplane_0545.off\nairplane/train/airplane_0546.off\nairplane/train/airplane_0547.off\nairplane/train/airplane_0548.off\nairplane/train/airplane_0549.off\nairplane/train/airplane_0550.off\nairplane/train/airplane_0551.off\nairplane/train/airplane_0552.off\nairplane/train/airplane_0553.off\nairplane/train/airplane_0554.off\nairplane/train/airplane_0555.off\nairplane/train/airplane_0556.off\nairplane/train/airplane_0557.off\nairplane/train/airplane_0558.off\nairplane/train/airplane_0559.off\nairplane/train/airplane_0560.off\nairplane/train/airplane_0561.off\nairplane/train/airplane_0562.off\nairplane/train/airplane_0563.off\nairplane/train/airplane_0564.off\ntable/train/table_0001.off\ntable/train/table_0002.off\ntable/train/table_0003.off\ntable/train/table_0004.off\ntable/train/table_0005.off\ntable/train/table_0006.off\ntable/train/table_0007.off\ntable/train/table_0008.off\ntable/train/table_0009.off\ntable/train/table_0010.off\ntable/train/table_0011.off\ntable/train/table_0012.off\ntable/train/table_0013.off\ntable/train/table_0014.off\ntable/train/table_0015.off\ntable/train/table_0016.off\ntable/train/table_0017.off\ntable/train/table_0018.off\ntable/train/table_0019.off\ntable/train/table_0020.off\ntable/train/table_0021.off\ntable/train/table_0022.off\ntable/train/table_0023.off\ntable/train/table_0024.off\ntable/train/table_0025.off\ntable/train/table_0026.off\ntable/train/table_0027.off\ntable/train/table_0028.off\ntable/train/table_0029.off\ntable/train/table_0030.off\ntable/train/table_0031.off\ntable/train/table_0032.off\ntable/train/table_0033.off\ntable/train/table_0034.off\ntable/train/table_0035.off\ntable/train/table_0036.off\ntable/train/table_0037.off\ntable/train/table_0038.off\ntable/train/table_0039.off\ntable/train/table_0040.off\ntable/train/table_0041.off\ntable/train/table_0042.off\ntable/train/table_0043.off\ntable/train/table_0044.off\ntable/train/table_0045.off\ntable/train/table_0046.off\ntable/train/table_0047.off\ntable/train/table_0048.off\ntable/train/table_0049.off\ntable/train/table_0050.off\ntable/train/table_0051.off\ntable/train/table_0052.off\ntable/train/table_0053.off\ntable/train/table_0054.off\ntable/train/table_0055.off\ntable/train/table_0056.off\ntable/train/table_0057.off\ntable/train/table_0058.off\ntable/train/table_0059.off\ntable/train/table_0060.off\ntable/train/table_0061.off\ntable/train/table_0062.off\ntable/train/table_0063.off\ntable/train/table_0064.off\ntable/train/table_0065.off\ntable/train/table_0066.off\ntable/train/table_0067.off\ntable/train/table_0068.off\ntable/train/table_0069.off\ntable/train/table_0070.off\ntable/train/table_0071.off\ntable/train/table_0072.off\ntable/train/table_0073.off\ntable/train/table_0074.off\ntable/train/table_0075.off\ntable/train/table_0076.off\ntable/train/table_0077.off\ntable/train/table_0078.off\ntable/train/table_0079.off\ntable/train/table_0080.off\ntable/train/table_0081.off\ntable/train/table_0082.off\ntable/train/table_0083.off\ntable/train/table_0084.off\ntable/train/table_0085.off\ntable/train/table_0086.off\ntable/train/table_0087.off\ntable/train/table_0088.off\ntable/train/table_0089.off\ntable/train/table_0090.off\ntable/train/table_0091.off\ntable/train/table_0092.off\ntable/train/table_0093.off\ntable/train/table_0094.off\ntable/train/table_0095.off\ntable/train/table_0096.off\ntable/train/table_0097.off\ntable/train/table_0098.off\ntable/train/table_0099.off\ntable/train/table_0100.off\ntable/train/table_0101.off\ntable/train/table_0102.off\ntable/train/table_0103.off\ntable/train/table_0104.off\ntable/train/table_0105.off\ntable/train/table_0106.off\ntable/train/table_0107.off\ntable/train/table_0108.off\ntable/train/table_0109.off\ntable/train/table_0110.off\ntable/train/table_0111.off\ntable/train/table_0112.off\ntable/train/table_0113.off\ntable/train/table_0114.off\ntable/train/table_0115.off\ntable/train/table_0116.off\ntable/train/table_0117.off\ntable/train/table_0118.off\ntable/train/table_0119.off\ntable/train/table_0120.off\ntable/train/table_0121.off\ntable/train/table_0122.off\ntable/train/table_0123.off\ntable/train/table_0124.off\ntable/train/table_0125.off\ntable/train/table_0126.off\ntable/train/table_0127.off\ntable/train/table_0128.off\ntable/train/table_0129.off\ntable/train/table_0130.off\ntable/train/table_0131.off\ntable/train/table_0132.off\ntable/train/table_0133.off\ntable/train/table_0134.off\ntable/train/table_0135.off\ntable/train/table_0136.off\ntable/train/table_0137.off\ntable/train/table_0138.off\ntable/train/table_0139.off\ntable/train/table_0140.off\ntable/train/table_0141.off\ntable/train/table_0142.off\ntable/train/table_0143.off\ntable/train/table_0144.off\ntable/train/table_0145.off\ntable/train/table_0146.off\ntable/train/table_0147.off\ntable/train/table_0148.off\ntable/train/table_0149.off\ntable/train/table_0150.off\ntable/train/table_0151.off\ntable/train/table_0152.off\ntable/train/table_0153.off\ntable/train/table_0154.off\ntable/train/table_0155.off\ntable/train/table_0156.off\ntable/train/table_0157.off\ntable/train/table_0158.off\ntable/train/table_0159.off\ntable/train/table_0160.off\ntable/train/table_0161.off\ntable/train/table_0162.off\ntable/train/table_0163.off\ntable/train/table_0164.off\ntable/train/table_0165.off\ntable/train/table_0166.off\ntable/train/table_0167.off\ntable/train/table_0168.off\ntable/train/table_0169.off\ntable/train/table_0170.off\ntable/train/table_0171.off\ntable/train/table_0172.off\ntable/train/table_0173.off\ntable/train/table_0174.off\ntable/train/table_0175.off\ntable/train/table_0176.off\ntable/train/table_0177.off\ntable/train/table_0178.off\ntable/train/table_0179.off\ntable/train/table_0180.off\ntable/train/table_0181.off\ntable/train/table_0182.off\ntable/train/table_0183.off\ntable/train/table_0184.off\ntable/train/table_0185.off\ntable/train/table_0186.off\ntable/train/table_0187.off\ntable/train/table_0188.off\ntable/train/table_0189.off\ntable/train/table_0190.off\ntable/train/table_0191.off\ntable/train/table_0192.off\ntable/train/table_0193.off\ntable/train/table_0194.off\ntable/train/table_0195.off\ntable/train/table_0196.off\ntable/train/table_0197.off\ntable/train/table_0198.off\ntable/train/table_0199.off\ntable/train/table_0200.off\ntable/train/table_0201.off\ntable/train/table_0202.off\ntable/train/table_0203.off\ntable/train/table_0204.off\ntable/train/table_0205.off\ntable/train/table_0206.off\ntable/train/table_0207.off\ntable/train/table_0208.off\ntable/train/table_0209.off\ntable/train/table_0210.off\ntable/train/table_0211.off\ntable/train/table_0212.off\ntable/train/table_0213.off\ntable/train/table_0214.off\ntable/train/table_0215.off\ntable/train/table_0216.off\ntable/train/table_0217.off\ntable/train/table_0218.off\ntable/train/table_0219.off\ntable/train/table_0220.off\ntable/train/table_0221.off\ntable/train/table_0222.off\ntable/train/table_0223.off\ntable/train/table_0224.off\ntable/train/table_0225.off\ntable/train/table_0226.off\ntable/train/table_0227.off\ntable/train/table_0228.off\ntable/train/table_0229.off\ntable/train/table_0230.off\ntable/train/table_0231.off\ntable/train/table_0232.off\ntable/train/table_0233.off\ntable/train/table_0234.off\ntable/train/table_0235.off\ntable/train/table_0236.off\ntable/train/table_0237.off\ntable/train/table_0238.off\ntable/train/table_0239.off\ntable/train/table_0240.off\ntable/train/table_0241.off\ntable/train/table_0242.off\ntable/train/table_0243.off\ntable/train/table_0244.off\ntable/train/table_0245.off\ntable/train/table_0246.off\ntable/train/table_0247.off\ntable/train/table_0248.off\ntable/train/table_0249.off\ntable/train/table_0250.off\ntable/train/table_0251.off\ntable/train/table_0252.off\ntable/train/table_0253.off\ntable/train/table_0254.off\ntable/train/table_0255.off\ntable/train/table_0256.off\ntable/train/table_0257.off\ntable/train/table_0258.off\ntable/train/table_0259.off\ntable/train/table_0260.off\ntable/train/table_0261.off\ntable/train/table_0262.off\ntable/train/table_0263.off\ntable/train/table_0264.off\ntable/train/table_0265.off\ntable/train/table_0266.off\ntable/train/table_0267.off\ntable/train/table_0268.off\ntable/train/table_0269.off\ntable/train/table_0270.off\ntable/train/table_0271.off\ntable/train/table_0272.off\ntable/train/table_0273.off\ntable/train/table_0274.off\ntable/train/table_0275.off\ntable/train/table_0276.off\ntable/train/table_0277.off\ntable/train/table_0278.off\ntable/train/table_0279.off\ntable/train/table_0280.off\ntable/train/table_0281.off\ntable/train/table_0282.off\ntable/train/table_0283.off\ntable/train/table_0284.off\ntable/train/table_0285.off\ntable/train/table_0286.off\ntable/train/table_0287.off\ntable/train/table_0288.off\ntable/train/table_0289.off\ntable/train/table_0290.off\ntable/train/table_0291.off\ntable/train/table_0292.off\ntable/train/table_0293.off\ntable/train/table_0294.off\ntable/train/table_0295.off\ntable/train/table_0296.off\ntable/train/table_0297.off\ntable/train/table_0298.off\ntable/train/table_0299.off\ntable/train/table_0300.off\ntable/train/table_0301.off\ntable/train/table_0302.off\ntable/train/table_0303.off\ntable/train/table_0304.off\ntable/train/table_0305.off\ntable/train/table_0306.off\ntable/train/table_0307.off\ntable/train/table_0308.off\ntable/train/table_0309.off\ntable/train/table_0310.off\ntable/train/table_0311.off\ntable/train/table_0312.off\ntable/train/table_0313.off\ntable/train/table_0314.off\ntable/train/table_0315.off\ntable/train/table_0316.off\ntable/train/table_0317.off\ntable/train/table_0318.off\ntable/train/table_0319.off\ntable/train/table_0320.off\ntable/train/table_0321.off\ntable/train/table_0322.off\ntable/train/table_0323.off\ntable/train/table_0324.off\ntable/train/table_0325.off\ntable/train/table_0326.off\ntable/train/table_0327.off\ntable/train/table_0328.off\ntable/train/table_0329.off\ntable/train/table_0330.off\ntable/train/table_0331.off\ntable/train/table_0332.off\ntable/train/table_0333.off\ntable/train/table_0334.off\ntable/train/table_0335.off\ntable/train/table_0336.off\ntable/train/table_0337.off\ntable/train/table_0338.off\ntable/train/table_0339.off\ntable/train/table_0340.off\ntable/train/table_0341.off\ntable/train/table_0342.off\ntable/train/table_0343.off\ntable/train/table_0344.off\ntable/train/table_0345.off\ntable/train/table_0346.off\ntable/train/table_0347.off\ntable/train/table_0348.off\ntable/train/table_0349.off\ntable/train/table_0350.off\ntable/train/table_0351.off\ntable/train/table_0352.off\ntable/train/table_0353.off\nbench/train/bench_0001.off\nbench/train/bench_0002.off\nbench/train/bench_0003.off\nbench/train/bench_0004.off\nbench/train/bench_0005.off\nbench/train/bench_0006.off\nbench/train/bench_0007.off\nbench/train/bench_0008.off\nbench/train/bench_0009.off\nbench/train/bench_0010.off\nbench/train/bench_0011.off\nbench/train/bench_0012.off\nbench/train/bench_0013.off\nbench/train/bench_0014.off\nbench/train/bench_0015.off\nbench/train/bench_0016.off\nbench/train/bench_0017.off\nbench/train/bench_0018.off\nbench/train/bench_0019.off\nbench/train/bench_0020.off\nbench/train/bench_0021.off\nbench/train/bench_0022.off\nbench/train/bench_0023.off\nbench/train/bench_0024.off\nbench/train/bench_0025.off\nbench/train/bench_0026.off\nbench/train/bench_0027.off\nbench/train/bench_0028.off\nbench/train/bench_0029.off\nbench/train/bench_0030.off\nbench/train/bench_0031.off\nbench/train/bench_0032.off\nbench/train/bench_0033.off\nbench/train/bench_0034.off\nbench/train/bench_0035.off\nbench/train/bench_0036.off\nbench/train/bench_0037.off\nbench/train/bench_0038.off\nbench/train/bench_0039.off\nbench/train/bench_0040.off\nbench/train/bench_0041.off\nbench/train/bench_0042.off\nbench/train/bench_0043.off\nbench/train/bench_0044.off\nbench/train/bench_0045.off\nbench/train/bench_0046.off\nbench/train/bench_0047.off\nbench/train/bench_0048.off\nbench/train/bench_0049.off\nbench/train/bench_0050.off\nbench/train/bench_0051.off\nbench/train/bench_0052.off\nbench/train/bench_0053.off\nbench/train/bench_0054.off\nbench/train/bench_0055.off\nbench/train/bench_0056.off\nbench/train/bench_0057.off\nbench/train/bench_0058.off\nbench/train/bench_0059.off\nbench/train/bench_0060.off\nbench/train/bench_0061.off\nbench/train/bench_0062.off\nbench/train/bench_0063.off\nbench/train/bench_0064.off\nbench/train/bench_0065.off\nbench/train/bench_0066.off\nbench/train/bench_0067.off\nbench/train/bench_0068.off\nbench/train/bench_0069.off\nbench/train/bench_0070.off\nbench/train/bench_0071.off\nbench/train/bench_0072.off\nbench/train/bench_0073.off\nbench/train/bench_0074.off\nbench/train/bench_0075.off\nbench/train/bench_0076.off\nbench/train/bench_0077.off\nbench/train/bench_0078.off\nbench/train/bench_0079.off\nbench/train/bench_0080.off\nbench/train/bench_0081.off\nbench/train/bench_0082.off\nbench/train/bench_0083.off\nbench/train/bench_0084.off\nbench/train/bench_0085.off\nbench/train/bench_0086.off\nbench/train/bench_0087.off\nbench/train/bench_0088.off\nbench/train/bench_0089.off\nbench/train/bench_0090.off\nbench/train/bench_0091.off\nbench/train/bench_0092.off\nbench/train/bench_0093.off\nbench/train/bench_0094.off\nbench/train/bench_0095.off\nbench/train/bench_0096.off\nbench/train/bench_0097.off\nbench/train/bench_0098.off\nbench/train/bench_0099.off\nbench/train/bench_0100.off\nbench/train/bench_0101.off\nbench/train/bench_0102.off\nbench/train/bench_0103.off\nbench/train/bench_0104.off\nbench/train/bench_0105.off\nbench/train/bench_0106.off\nbench/train/bench_0107.off\nbench/train/bench_0108.off\nbench/train/bench_0109.off\nbench/train/bench_0110.off\nbench/train/bench_0111.off\nbench/train/bench_0112.off\nbench/train/bench_0113.off\nbench/train/bench_0114.off\nbench/train/bench_0115.off\nbench/train/bench_0116.off\nbench/train/bench_0117.off\nbench/train/bench_0118.off\nbench/train/bench_0119.off\nbench/train/bench_0120.off\nbench/train/bench_0121.off\nbench/train/bench_0122.off\nbench/train/bench_0123.off\nbench/train/bench_0124.off\nbench/train/bench_0125.off\nbench/train/bench_0126.off\nbench/train/bench_0127.off\nbench/train/bench_0128.off\nbench/train/bench_0129.off\nbench/train/bench_0130.off\nbench/train/bench_0131.off\nbench/train/bench_0132.off\nbench/train/bench_0133.off\nbench/train/bench_0134.off\nbench/train/bench_0135.off\nbench/train/bench_0136.off\nbench/train/bench_0137.off\nbench/train/bench_0138.off\nbench/train/bench_0139.off\nbench/train/bench_0140.off\nbench/train/bench_0141.off\nbench/train/bench_0142.off\nbench/train/bench_0143.off\nbench/train/bench_0144.off\nbench/train/bench_0145.off\nbench/train/bench_0146.off\nbench/train/bench_0147.off\nbench/train/bench_0148.off\nbench/train/bench_0149.off\nbench/train/bench_0150.off\nbench/train/bench_0151.off\nbench/train/bench_0152.off\nbench/train/bench_0153.off\nbench/train/bench_0154.off\nbench/train/bench_0155.off\nbench/train/bench_0156.off\nplant/train/plant_0001.off\nplant/train/plant_0002.off\nplant/train/plant_0003.off\nplant/train/plant_0004.off\nplant/train/plant_0005.off\nplant/train/plant_0006.off\nplant/train/plant_0007.off\nplant/train/plant_0008.off\nplant/train/plant_0009.off\nplant/train/plant_0010.off\nplant/train/plant_0011.off\nplant/train/plant_0012.off\nplant/train/plant_0013.off\nplant/train/plant_0014.off\nplant/train/plant_0015.off\nplant/train/plant_0016.off\nplant/train/plant_0017.off\nplant/train/plant_0018.off\nplant/train/plant_0019.off\nplant/train/plant_0020.off\nplant/train/plant_0021.off\nplant/train/plant_0022.off\nplant/train/plant_0023.off\nplant/train/plant_0024.off\nplant/train/plant_0025.off\nplant/train/plant_0026.off\nplant/train/plant_0027.off\nplant/train/plant_0028.off\nplant/train/plant_0029.off\nplant/train/plant_0030.off\nplant/train/plant_0031.off\nplant/train/plant_0032.off\nplant/train/plant_0033.off\nplant/train/plant_0034.off\nplant/train/plant_0035.off\nplant/train/plant_0036.off\nplant/train/plant_0037.off\nplant/train/plant_0038.off\nplant/train/plant_0039.off\nplant/train/plant_0040.off\nplant/train/plant_0041.off\nplant/train/plant_0042.off\nplant/train/plant_0043.off\nplant/train/plant_0044.off\nplant/train/plant_0045.off\nplant/train/plant_0046.off\nplant/train/plant_0047.off\nplant/train/plant_0048.off\nplant/train/plant_0049.off\nplant/train/plant_0050.off\nplant/train/plant_0051.off\nplant/train/plant_0052.off\nplant/train/plant_0053.off\nplant/train/plant_0054.off\nplant/train/plant_0055.off\nplant/train/plant_0056.off\nplant/train/plant_0057.off\nplant/train/plant_0058.off\nplant/train/plant_0059.off\nplant/train/plant_0060.off\nplant/train/plant_0061.off\nplant/train/plant_0062.off\nplant/train/plant_0063.off\nplant/train/plant_0064.off\nplant/train/plant_0065.off\nplant/train/plant_0066.off\nplant/train/plant_0067.off\nplant/train/plant_0068.off\nplant/train/plant_0069.off\nplant/train/plant_0070.off\nplant/train/plant_0071.off\nplant/train/plant_0072.off\nplant/train/plant_0073.off\nplant/train/plant_0074.off\nplant/train/plant_0075.off\nplant/train/plant_0076.off\nplant/train/plant_0077.off\nplant/train/plant_0078.off\nplant/train/plant_0079.off\nplant/train/plant_0080.off\nplant/train/plant_0081.off\nplant/train/plant_0082.off\nplant/train/plant_0083.off\nplant/train/plant_0084.off\nplant/train/plant_0085.off\nplant/train/plant_0086.off\nplant/train/plant_0087.off\nplant/train/plant_0088.off\nplant/train/plant_0089.off\nplant/train/plant_0090.off\nplant/train/plant_0091.off\nplant/train/plant_0092.off\nplant/train/plant_0093.off\nplant/train/plant_0094.off\nplant/train/plant_0095.off\nplant/train/plant_0096.off\nplant/train/plant_0097.off\nplant/train/plant_0098.off\nplant/train/plant_0099.off\nplant/train/plant_0100.off\nplant/train/plant_0101.off\nplant/train/plant_0102.off\nplant/train/plant_0103.off\nplant/train/plant_0104.off\nplant/train/plant_0105.off\nplant/train/plant_0106.off\nplant/train/plant_0107.off\nplant/train/plant_0108.off\nplant/train/plant_0109.off\nplant/train/plant_0110.off\nplant/train/plant_0111.off\nplant/train/plant_0112.off\nplant/train/plant_0113.off\nplant/train/plant_0114.off\nplant/train/plant_0115.off\nplant/train/plant_0116.off\nplant/train/plant_0117.off\nplant/train/plant_0118.off\nplant/train/plant_0119.off\nplant/train/plant_0120.off\nplant/train/plant_0121.off\nplant/train/plant_0122.off\nplant/train/plant_0123.off\nplant/train/plant_0124.off\nplant/train/plant_0125.off\nplant/train/plant_0126.off\nplant/train/plant_0127.off\nplant/train/plant_0128.off\nplant/train/plant_0129.off\nplant/train/plant_0130.off\nplant/train/plant_0131.off\nplant/train/plant_0132.off\nplant/train/plant_0133.off\nplant/train/plant_0134.off\nplant/train/plant_0135.off\nplant/train/plant_0136.off\nplant/train/plant_0137.off\nplant/train/plant_0138.off\nplant/train/plant_0139.off\nplant/train/plant_0140.off\nplant/train/plant_0141.off\nplant/train/plant_0142.off\nplant/train/plant_0143.off\nplant/train/plant_0144.off\nplant/train/plant_0145.off\nplant/train/plant_0146.off\nplant/train/plant_0147.off\nplant/train/plant_0148.off\nplant/train/plant_0149.off\nplant/train/plant_0150.off\nplant/train/plant_0151.off\nplant/train/plant_0152.off\nplant/train/plant_0153.off\nplant/train/plant_0154.off\nplant/train/plant_0155.off\nplant/train/plant_0156.off\nplant/train/plant_0157.off\nplant/train/plant_0158.off\nplant/train/plant_0159.off\nplant/train/plant_0160.off\nplant/train/plant_0161.off\nplant/train/plant_0162.off\nplant/train/plant_0163.off\nplant/train/plant_0164.off\nplant/train/plant_0165.off\nplant/train/plant_0166.off\nplant/train/plant_0167.off\nplant/train/plant_0168.off\nplant/train/plant_0169.off\nplant/train/plant_0170.off\nplant/train/plant_0171.off\nplant/train/plant_0172.off\nplant/train/plant_0173.off\nplant/train/plant_0174.off\nplant/train/plant_0175.off\nplant/train/plant_0176.off\nplant/train/plant_0177.off\nplant/train/plant_0178.off\nplant/train/plant_0179.off\nplant/train/plant_0180.off\nplant/train/plant_0181.off\nplant/train/plant_0182.off\nplant/train/plant_0183.off\nplant/train/plant_0184.off\nplant/train/plant_0185.off\nplant/train/plant_0186.off\nplant/train/plant_0187.off\nplant/train/plant_0188.off\nplant/train/plant_0189.off\nplant/train/plant_0190.off\nplant/train/plant_0191.off\nplant/train/plant_0192.off\nplant/train/plant_0193.off\nplant/train/plant_0194.off\nplant/train/plant_0195.off\nplant/train/plant_0196.off\nplant/train/plant_0197.off\nplant/train/plant_0198.off\nplant/train/plant_0199.off\nplant/train/plant_0200.off\nplant/train/plant_0201.off\nplant/train/plant_0202.off\nplant/train/plant_0203.off\nplant/train/plant_0204.off\nplant/train/plant_0205.off\nplant/train/plant_0206.off\nplant/train/plant_0207.off\nplant/train/plant_0208.off\nplant/train/plant_0209.off\nplant/train/plant_0210.off\nplant/train/plant_0211.off\nplant/train/plant_0212.off\nplant/train/plant_0213.off\nplant/train/plant_0214.off\nplant/train/plant_0215.off\nplant/train/plant_0216.off\nchair/train/chair_0001.off\nchair/train/chair_0002.off\nchair/train/chair_0003.off\nchair/train/chair_0004.off\nchair/train/chair_0005.off\nchair/train/chair_0006.off\nchair/train/chair_0007.off\nchair/train/chair_0008.off\nchair/train/chair_0009.off\nchair/train/chair_0010.off\nchair/train/chair_0011.off\nchair/train/chair_0012.off\nchair/train/chair_0013.off\nchair/train/chair_0014.off\nchair/train/chair_0015.off\nchair/train/chair_0016.off\nchair/train/chair_0017.off\nchair/train/chair_0018.off\nchair/train/chair_0019.off\nchair/train/chair_0020.off\nchair/train/chair_0021.off\nchair/train/chair_0022.off\nchair/train/chair_0023.off\nchair/train/chair_0024.off\nchair/train/chair_0025.off\nchair/train/chair_0026.off\nchair/train/chair_0027.off\nchair/train/chair_0028.off\nchair/train/chair_0029.off\nchair/train/chair_0030.off\nchair/train/chair_0031.off\nchair/train/chair_0032.off\nchair/train/chair_0033.off\nchair/train/chair_0034.off\nchair/train/chair_0035.off\nchair/train/chair_0036.off\nchair/train/chair_0037.off\nchair/train/chair_0038.off\nchair/train/chair_0039.off\nchair/train/chair_0040.off\nchair/train/chair_0041.off\nchair/train/chair_0042.off\nchair/train/chair_0043.off\nchair/train/chair_0044.off\nchair/train/chair_0045.off\nchair/train/chair_0046.off\nchair/train/chair_0047.off\nchair/train/chair_0048.off\nchair/train/chair_0049.off\nchair/train/chair_0050.off\nchair/train/chair_0051.off\nchair/train/chair_0052.off\nchair/train/chair_0053.off\nchair/train/chair_0054.off\nchair/train/chair_0055.off\nchair/train/chair_0056.off\nchair/train/chair_0057.off\nchair/train/chair_0058.off\nchair/train/chair_0059.off\nchair/train/chair_0060.off\nchair/train/chair_0061.off\nchair/train/chair_0062.off\nchair/train/chair_0063.off\nchair/train/chair_0064.off\nchair/train/chair_0065.off\nchair/train/chair_0066.off\nchair/train/chair_0067.off\nchair/train/chair_0068.off\nchair/train/chair_0069.off\nchair/train/chair_0070.off\nchair/train/chair_0071.off\nchair/train/chair_0072.off\nchair/train/chair_0073.off\nchair/train/chair_0074.off\nchair/train/chair_0075.off\nchair/train/chair_0076.off\nchair/train/chair_0077.off\nchair/train/chair_0078.off\nchair/train/chair_0079.off\nchair/train/chair_0080.off\nchair/train/chair_0081.off\nchair/train/chair_0082.off\nchair/train/chair_0083.off\nchair/train/chair_0084.off\nchair/train/chair_0085.off\nchair/train/chair_0086.off\nchair/train/chair_0087.off\nchair/train/chair_0088.off\nchair/train/chair_0089.off\nchair/train/chair_0090.off\nchair/train/chair_0091.off\nchair/train/chair_0092.off\nchair/train/chair_0093.off\nchair/train/chair_0094.off\nchair/train/chair_0095.off\nchair/train/chair_0096.off\nchair/train/chair_0097.off\nchair/train/chair_0098.off\nchair/train/chair_0099.off\nchair/train/chair_0100.off\nchair/train/chair_0101.off\nchair/train/chair_0102.off\nchair/train/chair_0103.off\nchair/train/chair_0104.off\nchair/train/chair_0105.off\nchair/train/chair_0106.off\nchair/train/chair_0107.off\nchair/train/chair_0108.off\nchair/train/chair_0109.off\nchair/train/chair_0110.off\nchair/train/chair_0111.off\nchair/train/chair_0112.off\nchair/train/chair_0113.off\nchair/train/chair_0114.off\nchair/train/chair_0115.off\nchair/train/chair_0116.off\nchair/train/chair_0117.off\nchair/train/chair_0118.off\nchair/train/chair_0119.off\nchair/train/chair_0120.off\nchair/train/chair_0121.off\nchair/train/chair_0122.off\nchair/train/chair_0123.off\nchair/train/chair_0124.off\nchair/train/chair_0125.off\nchair/train/chair_0126.off\nchair/train/chair_0127.off\nchair/train/chair_0128.off\nchair/train/chair_0129.off\nchair/train/chair_0130.off\nchair/train/chair_0131.off\nchair/train/chair_0132.off\nchair/train/chair_0133.off\nchair/train/chair_0134.off\nchair/train/chair_0135.off\nchair/train/chair_0136.off\nchair/train/chair_0137.off\nchair/train/chair_0138.off\nchair/train/chair_0139.off\nchair/train/chair_0140.off\nchair/train/chair_0141.off\nchair/train/chair_0142.off\nchair/train/chair_0143.off\nchair/train/chair_0144.off\nchair/train/chair_0145.off\nchair/train/chair_0146.off\nchair/train/chair_0147.off\nchair/train/chair_0148.off\nchair/train/chair_0149.off\nchair/train/chair_0150.off\nchair/train/chair_0151.off\nchair/train/chair_0152.off\nchair/train/chair_0153.off\nchair/train/chair_0154.off\nchair/train/chair_0155.off\nchair/train/chair_0156.off\nchair/train/chair_0157.off\nchair/train/chair_0158.off\nchair/train/chair_0159.off\nchair/train/chair_0160.off\nchair/train/chair_0161.off\nchair/train/chair_0162.off\nchair/train/chair_0163.off\nchair/train/chair_0164.off\nchair/train/chair_0165.off\nchair/train/chair_0166.off\nchair/train/chair_0167.off\nchair/train/chair_0168.off\nchair/train/chair_0169.off\nchair/train/chair_0170.off\nchair/train/chair_0171.off\nchair/train/chair_0172.off\nchair/train/chair_0173.off\nchair/train/chair_0174.off\nchair/train/chair_0175.off\nchair/train/chair_0176.off\nchair/train/chair_0177.off\nchair/train/chair_0178.off\nchair/train/chair_0179.off\nchair/train/chair_0180.off\nchair/train/chair_0181.off\nchair/train/chair_0182.off\nchair/train/chair_0183.off\nchair/train/chair_0184.off\nchair/train/chair_0185.off\nchair/train/chair_0186.off\nchair/train/chair_0187.off\nchair/train/chair_0188.off\nchair/train/chair_0189.off\nchair/train/chair_0190.off\nchair/train/chair_0191.off\nchair/train/chair_0192.off\nchair/train/chair_0193.off\nchair/train/chair_0194.off\nchair/train/chair_0195.off\nchair/train/chair_0196.off\nchair/train/chair_0197.off\nchair/train/chair_0198.off\nchair/train/chair_0199.off\nchair/train/chair_0200.off\nchair/train/chair_0201.off\nchair/train/chair_0202.off\nchair/train/chair_0203.off\nchair/train/chair_0204.off\nchair/train/chair_0205.off\nchair/train/chair_0206.off\nchair/train/chair_0207.off\nchair/train/chair_0208.off\nchair/train/chair_0209.off\nchair/train/chair_0210.off\nchair/train/chair_0211.off\nchair/train/chair_0212.off\nchair/train/chair_0213.off\nchair/train/chair_0214.off\nchair/train/chair_0215.off\nchair/train/chair_0216.off\nchair/train/chair_0217.off\nchair/train/chair_0218.off\nchair/train/chair_0219.off\nchair/train/chair_0220.off\nchair/train/chair_0221.off\nchair/train/chair_0222.off\nchair/train/chair_0223.off\nchair/train/chair_0224.off\nchair/train/chair_0225.off\nchair/train/chair_0226.off\nchair/train/chair_0227.off\nchair/train/chair_0228.off\nchair/train/chair_0229.off\nchair/train/chair_0230.off\nchair/train/chair_0231.off\nchair/train/chair_0232.off\nchair/train/chair_0233.off\nchair/train/chair_0234.off\nchair/train/chair_0235.off\nchair/train/chair_0236.off\nchair/train/chair_0237.off\nchair/train/chair_0238.off\nchair/train/chair_0239.off\nchair/train/chair_0240.off\nchair/train/chair_0241.off\nchair/train/chair_0242.off\nchair/train/chair_0243.off\nchair/train/chair_0244.off\nchair/train/chair_0245.off\nchair/train/chair_0246.off\nchair/train/chair_0247.off\nchair/train/chair_0248.off\nchair/train/chair_0249.off\nchair/train/chair_0250.off\nchair/train/chair_0251.off\nchair/train/chair_0252.off\nchair/train/chair_0253.off\nchair/train/chair_0254.off\nchair/train/chair_0255.off\nchair/train/chair_0256.off\nchair/train/chair_0257.off\nchair/train/chair_0258.off\nchair/train/chair_0259.off\nchair/train/chair_0260.off\nchair/train/chair_0261.off\nchair/train/chair_0262.off\nchair/train/chair_0263.off\nchair/train/chair_0264.off\nchair/train/chair_0265.off\nchair/train/chair_0266.off\nchair/train/chair_0267.off\nchair/train/chair_0268.off\nchair/train/chair_0269.off\nchair/train/chair_0270.off\nchair/train/chair_0271.off\nchair/train/chair_0272.off\nchair/train/chair_0273.off\nchair/train/chair_0274.off\nchair/train/chair_0275.off\nchair/train/chair_0276.off\nchair/train/chair_0277.off\nchair/train/chair_0278.off\nchair/train/chair_0279.off\nchair/train/chair_0280.off\nchair/train/chair_0281.off\nchair/train/chair_0282.off\nchair/train/chair_0283.off\nchair/train/chair_0284.off\nchair/train/chair_0285.off\nchair/train/chair_0286.off\nchair/train/chair_0287.off\nchair/train/chair_0288.off\nchair/train/chair_0289.off\nchair/train/chair_0290.off\nchair/train/chair_0291.off\nchair/train/chair_0292.off\nchair/train/chair_0293.off\nchair/train/chair_0294.off\nchair/train/chair_0295.off\nchair/train/chair_0296.off\nchair/train/chair_0297.off\nchair/train/chair_0298.off\nchair/train/chair_0299.off\nchair/train/chair_0300.off\nchair/train/chair_0301.off\nchair/train/chair_0302.off\nchair/train/chair_0303.off\nchair/train/chair_0304.off\nchair/train/chair_0305.off\nchair/train/chair_0306.off\nchair/train/chair_0307.off\nchair/train/chair_0308.off\nchair/train/chair_0309.off\nchair/train/chair_0310.off\nchair/train/chair_0311.off\nchair/train/chair_0312.off\nchair/train/chair_0313.off\nchair/train/chair_0314.off\nchair/train/chair_0315.off\nchair/train/chair_0316.off\nchair/train/chair_0317.off\nchair/train/chair_0318.off\nchair/train/chair_0319.off\nchair/train/chair_0320.off\nchair/train/chair_0321.off\nchair/train/chair_0322.off\nchair/train/chair_0323.off\nchair/train/chair_0324.off\nchair/train/chair_0325.off\nchair/train/chair_0326.off\nchair/train/chair_0327.off\nchair/train/chair_0328.off\nchair/train/chair_0329.off\nchair/train/chair_0330.off\nchair/train/chair_0331.off\nchair/train/chair_0332.off\nchair/train/chair_0333.off\nchair/train/chair_0334.off\nchair/train/chair_0335.off\nchair/train/chair_0336.off\nchair/train/chair_0337.off\nchair/train/chair_0338.off\nchair/train/chair_0339.off\nchair/train/chair_0340.off\nchair/train/chair_0341.off\nchair/train/chair_0342.off\nchair/train/chair_0343.off\nchair/train/chair_0344.off\nchair/train/chair_0345.off\nchair/train/chair_0346.off\nchair/train/chair_0347.off\nchair/train/chair_0348.off\nchair/train/chair_0349.off\nchair/train/chair_0350.off\nchair/train/chair_0351.off\nchair/train/chair_0352.off\nchair/train/chair_0353.off\nchair/train/chair_0354.off\nchair/train/chair_0355.off\nchair/train/chair_0356.off\nchair/train/chair_0357.off\nchair/train/chair_0358.off\nchair/train/chair_0359.off\nchair/train/chair_0360.off\nchair/train/chair_0361.off\nchair/train/chair_0362.off\nchair/train/chair_0363.off\nchair/train/chair_0364.off\nchair/train/chair_0365.off\nchair/train/chair_0366.off\nchair/train/chair_0367.off\nchair/train/chair_0368.off\nchair/train/chair_0369.off\nchair/train/chair_0370.off\nchair/train/chair_0371.off\nchair/train/chair_0372.off\nchair/train/chair_0373.off\nchair/train/chair_0374.off\nchair/train/chair_0375.off\nchair/train/chair_0376.off\nchair/train/chair_0377.off\nchair/train/chair_0378.off\nchair/train/chair_0379.off\nchair/train/chair_0380.off\nchair/train/chair_0381.off\nchair/train/chair_0382.off\nchair/train/chair_0383.off\nchair/train/chair_0384.off\nchair/train/chair_0385.off\nchair/train/chair_0386.off\nchair/train/chair_0387.off\nchair/train/chair_0388.off\nchair/train/chair_0389.off\nchair/train/chair_0390.off\nchair/train/chair_0391.off\nchair/train/chair_0392.off\nchair/train/chair_0393.off\nchair/train/chair_0394.off\nchair/train/chair_0395.off\nchair/train/chair_0396.off\nchair/train/chair_0397.off\nchair/train/chair_0398.off\nchair/train/chair_0399.off\nchair/train/chair_0400.off\nchair/train/chair_0401.off\nchair/train/chair_0402.off\nchair/train/chair_0403.off\nchair/train/chair_0404.off\nchair/train/chair_0405.off\nchair/train/chair_0406.off\nchair/train/chair_0407.off\nchair/train/chair_0408.off\nchair/train/chair_0409.off\nchair/train/chair_0410.off\nchair/train/chair_0411.off\nchair/train/chair_0412.off\nchair/train/chair_0413.off\nchair/train/chair_0414.off\nchair/train/chair_0415.off\nchair/train/chair_0416.off\nchair/train/chair_0417.off\nchair/train/chair_0418.off\nchair/train/chair_0419.off\nchair/train/chair_0420.off\nchair/train/chair_0421.off\nchair/train/chair_0422.off\nchair/train/chair_0423.off\nchair/train/chair_0424.off\nchair/train/chair_0425.off\nchair/train/chair_0426.off\nchair/train/chair_0427.off\nchair/train/chair_0428.off\nchair/train/chair_0429.off\nchair/train/chair_0430.off\nchair/train/chair_0431.off\nchair/train/chair_0432.off\nchair/train/chair_0433.off\nchair/train/chair_0434.off\nchair/train/chair_0435.off\nchair/train/chair_0436.off\nchair/train/chair_0437.off\nchair/train/chair_0438.off\nchair/train/chair_0439.off\nchair/train/chair_0440.off\nchair/train/chair_0441.off\nchair/train/chair_0442.off\nchair/train/chair_0443.off\nchair/train/chair_0444.off\nchair/train/chair_0445.off\nchair/train/chair_0446.off\nchair/train/chair_0447.off\nchair/train/chair_0448.off\nchair/train/chair_0449.off\nchair/train/chair_0450.off\nchair/train/chair_0451.off\nchair/train/chair_0452.off\nchair/train/chair_0453.off\nchair/train/chair_0454.off\nchair/train/chair_0455.off\nchair/train/chair_0456.off\nchair/train/chair_0457.off\nchair/train/chair_0458.off\nchair/train/chair_0459.off\nchair/train/chair_0460.off\nchair/train/chair_0461.off\nchair/train/chair_0462.off\nchair/train/chair_0463.off\nchair/train/chair_0464.off\nchair/train/chair_0465.off\nchair/train/chair_0466.off\nchair/train/chair_0467.off\nchair/train/chair_0468.off\nchair/train/chair_0469.off\nchair/train/chair_0470.off\nchair/train/chair_0471.off\nchair/train/chair_0472.off\nchair/train/chair_0473.off\nchair/train/chair_0474.off\nchair/train/chair_0475.off\nchair/train/chair_0476.off\nchair/train/chair_0477.off\nchair/train/chair_0478.off\nchair/train/chair_0479.off\nchair/train/chair_0480.off\nchair/train/chair_0481.off\nchair/train/chair_0482.off\nchair/train/chair_0483.off\nchair/train/chair_0484.off\nchair/train/chair_0485.off\nchair/train/chair_0486.off\nchair/train/chair_0487.off\nchair/train/chair_0488.off\nchair/train/chair_0489.off\nchair/train/chair_0490.off\nchair/train/chair_0491.off\nchair/train/chair_0492.off\nchair/train/chair_0493.off\nchair/train/chair_0494.off\nchair/train/chair_0495.off\nchair/train/chair_0496.off\nchair/train/chair_0497.off\nchair/train/chair_0498.off\nchair/train/chair_0499.off\nchair/train/chair_0500.off\nchair/train/chair_0501.off\nchair/train/chair_0502.off\nchair/train/chair_0503.off\nchair/train/chair_0504.off\nchair/train/chair_0505.off\nchair/train/chair_0506.off\nchair/train/chair_0507.off\nchair/train/chair_0508.off\nchair/train/chair_0509.off\nchair/train/chair_0510.off\nchair/train/chair_0511.off\nchair/train/chair_0512.off\nchair/train/chair_0513.off\nchair/train/chair_0514.off\nchair/train/chair_0515.off\nchair/train/chair_0516.off\nchair/train/chair_0517.off\nchair/train/chair_0518.off\nchair/train/chair_0519.off\nchair/train/chair_0520.off\nchair/train/chair_0521.off\nchair/train/chair_0522.off\nchair/train/chair_0523.off\nchair/train/chair_0524.off\nchair/train/chair_0525.off\nchair/train/chair_0526.off\nchair/train/chair_0527.off\nchair/train/chair_0528.off\nchair/train/chair_0529.off\nchair/train/chair_0530.off\nchair/train/chair_0531.off\nchair/train/chair_0532.off\nchair/train/chair_0533.off\nchair/train/chair_0534.off\nchair/train/chair_0535.off\nchair/train/chair_0536.off\nchair/train/chair_0537.off\nchair/train/chair_0538.off\nchair/train/chair_0539.off\nchair/train/chair_0540.off\nchair/train/chair_0541.off\nchair/train/chair_0542.off\nchair/train/chair_0543.off\nchair/train/chair_0544.off\nchair/train/chair_0545.off\nchair/train/chair_0546.off\nchair/train/chair_0547.off\nchair/train/chair_0548.off\nchair/train/chair_0549.off\nchair/train/chair_0550.off\nchair/train/chair_0551.off\nchair/train/chair_0552.off\nchair/train/chair_0553.off\nchair/train/chair_0554.off\nchair/train/chair_0555.off\nchair/train/chair_0556.off\nchair/train/chair_0557.off\nchair/train/chair_0558.off\nchair/train/chair_0559.off\nchair/train/chair_0560.off\nchair/train/chair_0561.off\nchair/train/chair_0562.off\nchair/train/chair_0563.off\nchair/train/chair_0564.off\nchair/train/chair_0565.off\nchair/train/chair_0566.off\nchair/train/chair_0567.off\nchair/train/chair_0568.off\nchair/train/chair_0569.off\nchair/train/chair_0570.off\nchair/train/chair_0571.off\nchair/train/chair_0572.off\nchair/train/chair_0573.off\nchair/train/chair_0574.off\nchair/train/chair_0575.off\nchair/train/chair_0576.off\nchair/train/chair_0577.off\nchair/train/chair_0578.off\nchair/train/chair_0579.off\nchair/train/chair_0580.off\nchair/train/chair_0581.off\nchair/train/chair_0582.off\nchair/train/chair_0583.off\nchair/train/chair_0584.off\nchair/train/chair_0585.off\nchair/train/chair_0586.off\nchair/train/chair_0587.off\nchair/train/chair_0588.off\nchair/train/chair_0589.off\nchair/train/chair_0590.off\nchair/train/chair_0591.off\nchair/train/chair_0592.off\nchair/train/chair_0593.off\nchair/train/chair_0594.off\nchair/train/chair_0595.off\nchair/train/chair_0596.off\nchair/train/chair_0597.off\nchair/train/chair_0598.off\nchair/train/chair_0599.off\nchair/train/chair_0600.off\nchair/train/chair_0601.off\nchair/train/chair_0602.off\nchair/train/chair_0603.off\nchair/train/chair_0604.off\nchair/train/chair_0605.off\nchair/train/chair_0606.off\nchair/train/chair_0607.off\nchair/train/chair_0608.off\nchair/train/chair_0609.off\nchair/train/chair_0610.off\nchair/train/chair_0611.off\nchair/train/chair_0612.off\nchair/train/chair_0613.off\nchair/train/chair_0614.off\nchair/train/chair_0615.off\nchair/train/chair_0616.off\nchair/train/chair_0617.off\nchair/train/chair_0618.off\nchair/train/chair_0619.off\nchair/train/chair_0620.off\nchair/train/chair_0621.off\nchair/train/chair_0622.off\nchair/train/chair_0623.off\nchair/train/chair_0624.off\nchair/train/chair_0625.off\nchair/train/chair_0626.off\nchair/train/chair_0627.off\nchair/train/chair_0628.off\nchair/train/chair_0629.off\nchair/train/chair_0630.off\nchair/train/chair_0631.off\nchair/train/chair_0632.off\nchair/train/chair_0633.off\nchair/train/chair_0634.off\nchair/train/chair_0635.off\nchair/train/chair_0636.off\nchair/train/chair_0637.off\nchair/train/chair_0638.off\nchair/train/chair_0639.off\nchair/train/chair_0640.off\nchair/train/chair_0641.off\nchair/train/chair_0642.off\nchair/train/chair_0643.off\nchair/train/chair_0644.off\nchair/train/chair_0645.off\nchair/train/chair_0646.off\nchair/train/chair_0647.off\nchair/train/chair_0648.off\nchair/train/chair_0649.off\nchair/train/chair_0650.off\nchair/train/chair_0651.off\nchair/train/chair_0652.off\nchair/train/chair_0653.off\nchair/train/chair_0654.off\nchair/train/chair_0655.off\nchair/train/chair_0656.off\nchair/train/chair_0657.off\nchair/train/chair_0658.off\nchair/train/chair_0659.off\nchair/train/chair_0660.off\nchair/train/chair_0661.off\nchair/train/chair_0662.off\nchair/train/chair_0663.off\nchair/train/chair_0664.off\nchair/train/chair_0665.off\nchair/train/chair_0666.off\nchair/train/chair_0667.off\nchair/train/chair_0668.off\nchair/train/chair_0669.off\nchair/train/chair_0670.off\nchair/train/chair_0671.off\nchair/train/chair_0672.off\nchair/train/chair_0673.off\nchair/train/chair_0674.off\nchair/train/chair_0675.off\nchair/train/chair_0676.off\nchair/train/chair_0677.off\nchair/train/chair_0678.off\nchair/train/chair_0679.off\nchair/train/chair_0680.off\nchair/train/chair_0681.off\nchair/train/chair_0682.off\nchair/train/chair_0683.off\nchair/train/chair_0684.off\nchair/train/chair_0685.off\nchair/train/chair_0686.off\nchair/train/chair_0687.off\nchair/train/chair_0688.off\nchair/train/chair_0689.off\nchair/train/chair_0690.off\nchair/train/chair_0691.off\nchair/train/chair_0692.off\nchair/train/chair_0693.off\nchair/train/chair_0694.off\nchair/train/chair_0695.off\nchair/train/chair_0696.off\nchair/train/chair_0697.off\nchair/train/chair_0698.off\nchair/train/chair_0699.off\nchair/train/chair_0700.off\nchair/train/chair_0701.off\nchair/train/chair_0702.off\nchair/train/chair_0703.off\nchair/train/chair_0704.off\nchair/train/chair_0705.off\nchair/train/chair_0706.off\nchair/train/chair_0707.off\nchair/train/chair_0708.off\nchair/train/chair_0709.off\nchair/train/chair_0710.off\nchair/train/chair_0711.off\nchair/train/chair_0712.off\nchair/train/chair_0713.off\nchair/train/chair_0714.off\nchair/train/chair_0715.off\nchair/train/chair_0716.off\nchair/train/chair_0717.off\nchair/train/chair_0718.off\nchair/train/chair_0719.off\nchair/train/chair_0720.off\nchair/train/chair_0721.off\nchair/train/chair_0722.off\nchair/train/chair_0723.off\nchair/train/chair_0724.off\nchair/train/chair_0725.off\nchair/train/chair_0726.off\nchair/train/chair_0727.off\nchair/train/chair_0728.off\nchair/train/chair_0729.off\nchair/train/chair_0730.off\nchair/train/chair_0731.off\nchair/train/chair_0732.off\nchair/train/chair_0733.off\nchair/train/chair_0734.off\nchair/train/chair_0735.off\nchair/train/chair_0736.off\nchair/train/chair_0737.off\nchair/train/chair_0738.off\nchair/train/chair_0739.off\nchair/train/chair_0740.off\nchair/train/chair_0741.off\nchair/train/chair_0742.off\nchair/train/chair_0743.off\nchair/train/chair_0744.off\nchair/train/chair_0745.off\nchair/train/chair_0746.off\nchair/train/chair_0747.off\nchair/train/chair_0748.off\nchair/train/chair_0749.off\nchair/train/chair_0750.off\nchair/train/chair_0751.off\nchair/train/chair_0752.off\nchair/train/chair_0753.off\nchair/train/chair_0754.off\nchair/train/chair_0755.off\nchair/train/chair_0756.off\nchair/train/chair_0757.off\nchair/train/chair_0758.off\nchair/train/chair_0759.off\nchair/train/chair_0760.off\nchair/train/chair_0761.off\nchair/train/chair_0762.off\nchair/train/chair_0763.off\nchair/train/chair_0764.off\nchair/train/chair_0765.off\nchair/train/chair_0766.off\nchair/train/chair_0767.off\nchair/train/chair_0768.off\nchair/train/chair_0769.off\nchair/train/chair_0770.off\nchair/train/chair_0771.off\nchair/train/chair_0772.off\nchair/train/chair_0773.off\nchair/train/chair_0774.off\nchair/train/chair_0775.off\nchair/train/chair_0776.off\nchair/train/chair_0777.off\nchair/train/chair_0778.off\nchair/train/chair_0779.off\nchair/train/chair_0780.off\nchair/train/chair_0781.off\nchair/train/chair_0782.off\nchair/train/chair_0783.off\nchair/train/chair_0784.off\nchair/train/chair_0785.off\nchair/train/chair_0786.off\nchair/train/chair_0787.off\nchair/train/chair_0788.off\nchair/train/chair_0789.off\nchair/train/chair_0790.off\nchair/train/chair_0791.off\nchair/train/chair_0792.off\nchair/train/chair_0793.off\nchair/train/chair_0794.off\nchair/train/chair_0795.off\nchair/train/chair_0796.off\nchair/train/chair_0797.off\nchair/train/chair_0798.off\nchair/train/chair_0799.off\nchair/train/chair_0800.off\nchair/train/chair_0801.off\nvase/train/vase_0001.off\nvase/train/vase_0002.off\nvase/train/vase_0003.off\nvase/train/vase_0004.off\nvase/train/vase_0005.off\nvase/train/vase_0006.off\nvase/train/vase_0007.off\nvase/train/vase_0008.off\nvase/train/vase_0009.off\nvase/train/vase_0010.off\nvase/train/vase_0011.off\nvase/train/vase_0012.off\nvase/train/vase_0013.off\nvase/train/vase_0014.off\nvase/train/vase_0015.off\nvase/train/vase_0016.off\nvase/train/vase_0017.off\nvase/train/vase_0018.off\nvase/train/vase_0019.off\nvase/train/vase_0020.off\nvase/train/vase_0021.off\nvase/train/vase_0022.off\nvase/train/vase_0023.off\nvase/train/vase_0024.off\nvase/train/vase_0025.off\nvase/train/vase_0026.off\nvase/train/vase_0027.off\nvase/train/vase_0028.off\nvase/train/vase_0029.off\nvase/train/vase_0030.off\nvase/train/vase_0031.off\nvase/train/vase_0032.off\nvase/train/vase_0033.off\nvase/train/vase_0034.off\nvase/train/vase_0035.off\nvase/train/vase_0036.off\nvase/train/vase_0037.off\nvase/train/vase_0038.off\nvase/train/vase_0039.off\nvase/train/vase_0040.off\nvase/train/vase_0041.off\nvase/train/vase_0042.off\nvase/train/vase_0043.off\nvase/train/vase_0044.off\nvase/train/vase_0045.off\nvase/train/vase_0046.off\nvase/train/vase_0047.off\nvase/train/vase_0048.off\nvase/train/vase_0049.off\nvase/train/vase_0050.off\nvase/train/vase_0051.off\nvase/train/vase_0052.off\nvase/train/vase_0053.off\nvase/train/vase_0054.off\nvase/train/vase_0055.off\nvase/train/vase_0056.off\nvase/train/vase_0057.off\nvase/train/vase_0058.off\nvase/train/vase_0059.off\nvase/train/vase_0060.off\nvase/train/vase_0061.off\nvase/train/vase_0062.off\nvase/train/vase_0063.off\nvase/train/vase_0064.off\nvase/train/vase_0065.off\nvase/train/vase_0066.off\nvase/train/vase_0067.off\nvase/train/vase_0068.off\nvase/train/vase_0069.off\nvase/train/vase_0070.off\nvase/train/vase_0071.off\nvase/train/vase_0072.off\nvase/train/vase_0073.off\nvase/train/vase_0074.off\nvase/train/vase_0075.off\nvase/train/vase_0076.off\nvase/train/vase_0077.off\nvase/train/vase_0078.off\nvase/train/vase_0079.off\nvase/train/vase_0080.off\nvase/train/vase_0081.off\nvase/train/vase_0082.off\nvase/train/vase_0083.off\nvase/train/vase_0084.off\nvase/train/vase_0085.off\nvase/train/vase_0086.off\nvase/train/vase_0087.off\nvase/train/vase_0088.off\nvase/train/vase_0089.off\nvase/train/vase_0090.off\nvase/train/vase_0091.off\nvase/train/vase_0092.off\nvase/train/vase_0093.off\nvase/train/vase_0094.off\nvase/train/vase_0095.off\nvase/train/vase_0096.off\nvase/train/vase_0097.off\nvase/train/vase_0098.off\nvase/train/vase_0099.off\nvase/train/vase_0100.off\nvase/train/vase_0101.off\nvase/train/vase_0102.off\nvase/train/vase_0103.off\nvase/train/vase_0104.off\nvase/train/vase_0105.off\nvase/train/vase_0106.off\nvase/train/vase_0107.off\nvase/train/vase_0108.off\nvase/train/vase_0109.off\nvase/train/vase_0110.off\nvase/train/vase_0111.off\nvase/train/vase_0112.off\nvase/train/vase_0113.off\nvase/train/vase_0114.off\nvase/train/vase_0115.off\nvase/train/vase_0116.off\nvase/train/vase_0117.off\nvase/train/vase_0118.off\nvase/train/vase_0119.off\nvase/train/vase_0120.off\nvase/train/vase_0121.off\nvase/train/vase_0122.off\nvase/train/vase_0123.off\nvase/train/vase_0124.off\nvase/train/vase_0125.off\nvase/train/vase_0126.off\nvase/train/vase_0127.off\nvase/train/vase_0128.off\nvase/train/vase_0129.off\nvase/train/vase_0130.off\nvase/train/vase_0131.off\nvase/train/vase_0132.off\nvase/train/vase_0133.off\nvase/train/vase_0134.off\nvase/train/vase_0135.off\nvase/train/vase_0136.off\nvase/train/vase_0137.off\nvase/train/vase_0138.off\nvase/train/vase_0139.off\nvase/train/vase_0140.off\nvase/train/vase_0141.off\nvase/train/vase_0142.off\nvase/train/vase_0143.off\nvase/train/vase_0144.off\nvase/train/vase_0145.off\nvase/train/vase_0146.off\nvase/train/vase_0147.off\nvase/train/vase_0148.off\nvase/train/vase_0149.off\nvase/train/vase_0150.off\nvase/train/vase_0151.off\nvase/train/vase_0152.off\nvase/train/vase_0153.off\nvase/train/vase_0154.off\nvase/train/vase_0155.off\nvase/train/vase_0156.off\nvase/train/vase_0157.off\nvase/train/vase_0158.off\nvase/train/vase_0159.off\nvase/train/vase_0160.off\nvase/train/vase_0161.off\nvase/train/vase_0162.off\nvase/train/vase_0163.off\nvase/train/vase_0164.off\nvase/train/vase_0165.off\nvase/train/vase_0166.off\nvase/train/vase_0167.off\nvase/train/vase_0168.off\nvase/train/vase_0169.off\nvase/train/vase_0170.off\nvase/train/vase_0171.off\nvase/train/vase_0172.off\nvase/train/vase_0173.off\nvase/train/vase_0174.off\nvase/train/vase_0175.off\nvase/train/vase_0176.off\nvase/train/vase_0177.off\nvase/train/vase_0178.off\nvase/train/vase_0179.off\nvase/train/vase_0180.off\nvase/train/vase_0181.off\nvase/train/vase_0182.off\nvase/train/vase_0183.off\nvase/train/vase_0184.off\nvase/train/vase_0185.off\nvase/train/vase_0186.off\nvase/train/vase_0187.off\nvase/train/vase_0188.off\nvase/train/vase_0189.off\nvase/train/vase_0190.off\nvase/train/vase_0191.off\nvase/train/vase_0192.off\nvase/train/vase_0193.off\nvase/train/vase_0194.off\nvase/train/vase_0195.off\nvase/train/vase_0196.off\nvase/train/vase_0197.off\nvase/train/vase_0198.off\nvase/train/vase_0199.off\nvase/train/vase_0200.off\nvase/train/vase_0201.off\nvase/train/vase_0202.off\nvase/train/vase_0203.off\nvase/train/vase_0204.off\nvase/train/vase_0205.off\nvase/train/vase_0206.off\nvase/train/vase_0207.off\nvase/train/vase_0208.off\nvase/train/vase_0209.off\nvase/train/vase_0210.off\nvase/train/vase_0211.off\nvase/train/vase_0212.off\nvase/train/vase_0213.off\nvase/train/vase_0214.off\nvase/train/vase_0215.off\nvase/train/vase_0216.off\nvase/train/vase_0217.off\nvase/train/vase_0218.off\nvase/train/vase_0219.off\nvase/train/vase_0220.off\nvase/train/vase_0221.off\nvase/train/vase_0222.off\nvase/train/vase_0223.off\nvase/train/vase_0224.off\nvase/train/vase_0225.off\nvase/train/vase_0226.off\nvase/train/vase_0227.off\nvase/train/vase_0228.off\nvase/train/vase_0229.off\nvase/train/vase_0230.off\nvase/train/vase_0231.off\nvase/train/vase_0232.off\nvase/train/vase_0233.off\nvase/train/vase_0234.off\nvase/train/vase_0235.off\nvase/train/vase_0236.off\nvase/train/vase_0237.off\nvase/train/vase_0238.off\nvase/train/vase_0239.off\nvase/train/vase_0240.off\nvase/train/vase_0241.off\nvase/train/vase_0242.off\nvase/train/vase_0243.off\nvase/train/vase_0244.off\nvase/train/vase_0245.off\nvase/train/vase_0246.off\nvase/train/vase_0247.off\nvase/train/vase_0248.off\nvase/train/vase_0249.off\nvase/train/vase_0250.off\nvase/train/vase_0251.off\nvase/train/vase_0252.off\nvase/train/vase_0253.off\nvase/train/vase_0254.off\nvase/train/vase_0255.off\nvase/train/vase_0256.off\nvase/train/vase_0257.off\nvase/train/vase_0258.off\nvase/train/vase_0259.off\nvase/train/vase_0260.off\nvase/train/vase_0261.off\nvase/train/vase_0262.off\nvase/train/vase_0263.off\nvase/train/vase_0264.off\nvase/train/vase_0265.off\nvase/train/vase_0266.off\nvase/train/vase_0267.off\nvase/train/vase_0268.off\nvase/train/vase_0269.off\nvase/train/vase_0270.off\nvase/train/vase_0271.off\nvase/train/vase_0272.off\nvase/train/vase_0273.off\nvase/train/vase_0274.off\nvase/train/vase_0275.off\nvase/train/vase_0276.off\nvase/train/vase_0277.off\nvase/train/vase_0278.off\nvase/train/vase_0279.off\nvase/train/vase_0280.off\nvase/train/vase_0281.off\nvase/train/vase_0282.off\nvase/train/vase_0283.off\nvase/train/vase_0284.off\nvase/train/vase_0285.off\nvase/train/vase_0286.off\nvase/train/vase_0287.off\nvase/train/vase_0288.off\nvase/train/vase_0289.off\nvase/train/vase_0290.off\nvase/train/vase_0291.off\nvase/train/vase_0292.off\nvase/train/vase_0293.off\nvase/train/vase_0294.off\nvase/train/vase_0295.off\nvase/train/vase_0296.off\nvase/train/vase_0297.off\nvase/train/vase_0298.off\nvase/train/vase_0299.off\nvase/train/vase_0300.off\nvase/train/vase_0301.off\nvase/train/vase_0302.off\nvase/train/vase_0303.off\nvase/train/vase_0304.off\nvase/train/vase_0305.off\nvase/train/vase_0306.off\nvase/train/vase_0307.off\nvase/train/vase_0308.off\nvase/train/vase_0309.off\nvase/train/vase_0310.off\nvase/train/vase_0311.off\nvase/train/vase_0312.off\nvase/train/vase_0313.off\nvase/train/vase_0314.off\nvase/train/vase_0315.off\nvase/train/vase_0316.off\nvase/train/vase_0317.off\nvase/train/vase_0318.off\nvase/train/vase_0319.off\nvase/train/vase_0320.off\nvase/train/vase_0321.off\nvase/train/vase_0322.off\nvase/train/vase_0323.off\nvase/train/vase_0324.off\nvase/train/vase_0325.off\nvase/train/vase_0326.off\nvase/train/vase_0327.off\nvase/train/vase_0328.off\nvase/train/vase_0329.off\nvase/train/vase_0330.off\nvase/train/vase_0331.off\nvase/train/vase_0332.off\nvase/train/vase_0333.off\nvase/train/vase_0334.off\nvase/train/vase_0335.off\nvase/train/vase_0336.off\nvase/train/vase_0337.off\nvase/train/vase_0338.off\nvase/train/vase_0339.off\nvase/train/vase_0340.off\nvase/train/vase_0341.off\nvase/train/vase_0342.off\nvase/train/vase_0343.off\nvase/train/vase_0344.off\nvase/train/vase_0345.off\nvase/train/vase_0346.off\nvase/train/vase_0347.off\nvase/train/vase_0348.off\nvase/train/vase_0349.off\nvase/train/vase_0350.off\nvase/train/vase_0351.off\nvase/train/vase_0352.off\nvase/train/vase_0353.off\nvase/train/vase_0354.off\nvase/train/vase_0355.off\nvase/train/vase_0356.off\nvase/train/vase_0357.off\nvase/train/vase_0358.off\nvase/train/vase_0359.off\nvase/train/vase_0360.off\nvase/train/vase_0361.off\nvase/train/vase_0362.off\nvase/train/vase_0363.off\nvase/train/vase_0364.off\nvase/train/vase_0365.off\nvase/train/vase_0366.off\nvase/train/vase_0367.off\nvase/train/vase_0368.off\nvase/train/vase_0369.off\nvase/train/vase_0370.off\nvase/train/vase_0371.off\nvase/train/vase_0372.off\nvase/train/vase_0373.off\nvase/train/vase_0374.off\nvase/train/vase_0375.off\nvase/train/vase_0376.off\nvase/train/vase_0377.off\nvase/train/vase_0378.off\nvase/train/vase_0379.off\nvase/train/vase_0380.off\nvase/train/vase_0381.off\nvase/train/vase_0382.off\nvase/train/vase_0383.off\nvase/train/vase_0384.off\nvase/train/vase_0385.off\nvase/train/vase_0386.off\nvase/train/vase_0387.off\nvase/train/vase_0388.off\nvase/train/vase_0389.off\nvase/train/vase_0390.off\nvase/train/vase_0391.off\nvase/train/vase_0392.off\nvase/train/vase_0393.off\nvase/train/vase_0394.off\nvase/train/vase_0395.off\nvase/train/vase_0396.off\nvase/train/vase_0397.off\nvase/train/vase_0398.off\nvase/train/vase_0399.off\nvase/train/vase_0400.off\nvase/train/vase_0401.off\nvase/train/vase_0402.off\nvase/train/vase_0403.off\nvase/train/vase_0404.off\nvase/train/vase_0405.off\nvase/train/vase_0406.off\nvase/train/vase_0407.off\nvase/train/vase_0408.off\nvase/train/vase_0409.off\nvase/train/vase_0410.off\nvase/train/vase_0411.off\nvase/train/vase_0412.off\nvase/train/vase_0413.off\nvase/train/vase_0414.off\nvase/train/vase_0415.off\nvase/train/vase_0416.off\nvase/train/vase_0417.off\nvase/train/vase_0418.off\nvase/train/vase_0419.off\nvase/train/vase_0420.off\nvase/train/vase_0421.off\nvase/train/vase_0422.off\nvase/train/vase_0423.off\nvase/train/vase_0424.off\nvase/train/vase_0425.off\nvase/train/vase_0426.off\nvase/train/vase_0427.off\nvase/train/vase_0428.off\nbookshelf/train/bookshelf_0001.off\nbookshelf/train/bookshelf_0002.off\nbookshelf/train/bookshelf_0003.off\nbookshelf/train/bookshelf_0004.off\nbookshelf/train/bookshelf_0005.off\nbookshelf/train/bookshelf_0006.off\nbookshelf/train/bookshelf_0007.off\nbookshelf/train/bookshelf_0008.off\nbookshelf/train/bookshelf_0009.off\nbookshelf/train/bookshelf_0010.off\nbookshelf/train/bookshelf_0011.off\nbookshelf/train/bookshelf_0012.off\nbookshelf/train/bookshelf_0013.off\nbookshelf/train/bookshelf_0014.off\nbookshelf/train/bookshelf_0015.off\nbookshelf/train/bookshelf_0016.off\nbookshelf/train/bookshelf_0017.off\nbookshelf/train/bookshelf_0018.off\nbookshelf/train/bookshelf_0019.off\nbookshelf/train/bookshelf_0020.off\nbookshelf/train/bookshelf_0021.off\nbookshelf/train/bookshelf_0022.off\nbookshelf/train/bookshelf_0023.off\nbookshelf/train/bookshelf_0024.off\nbookshelf/train/bookshelf_0025.off\nbookshelf/train/bookshelf_0026.off\nbookshelf/train/bookshelf_0027.off\nbookshelf/train/bookshelf_0028.off\nbookshelf/train/bookshelf_0029.off\nbookshelf/train/bookshelf_0030.off\nbookshelf/train/bookshelf_0031.off\nbookshelf/train/bookshelf_0032.off\nbookshelf/train/bookshelf_0033.off\nbookshelf/train/bookshelf_0034.off\nbookshelf/train/bookshelf_0035.off\nbookshelf/train/bookshelf_0036.off\nbookshelf/train/bookshelf_0037.off\nbookshelf/train/bookshelf_0038.off\nbookshelf/train/bookshelf_0039.off\nbookshelf/train/bookshelf_0040.off\nbookshelf/train/bookshelf_0041.off\nbookshelf/train/bookshelf_0042.off\nbookshelf/train/bookshelf_0043.off\nbookshelf/train/bookshelf_0044.off\nbookshelf/train/bookshelf_0045.off\nbookshelf/train/bookshelf_0046.off\nbookshelf/train/bookshelf_0047.off\nbookshelf/train/bookshelf_0048.off\nbookshelf/train/bookshelf_0049.off\nbookshelf/train/bookshelf_0050.off\nbookshelf/train/bookshelf_0051.off\nbookshelf/train/bookshelf_0052.off\nbookshelf/train/bookshelf_0053.off\nbookshelf/train/bookshelf_0054.off\nbookshelf/train/bookshelf_0055.off\nbookshelf/train/bookshelf_0056.off\nbookshelf/train/bookshelf_0057.off\nbookshelf/train/bookshelf_0058.off\nbookshelf/train/bookshelf_0059.off\nbookshelf/train/bookshelf_0060.off\nbookshelf/train/bookshelf_0061.off\nbookshelf/train/bookshelf_0062.off\nbookshelf/train/bookshelf_0063.off\nbookshelf/train/bookshelf_0064.off\nbookshelf/train/bookshelf_0065.off\nbookshelf/train/bookshelf_0066.off\nbookshelf/train/bookshelf_0067.off\nbookshelf/train/bookshelf_0068.off\nbookshelf/train/bookshelf_0069.off\nbookshelf/train/bookshelf_0070.off\nbookshelf/train/bookshelf_0071.off\nbookshelf/train/bookshelf_0072.off\nbookshelf/train/bookshelf_0073.off\nbookshelf/train/bookshelf_0074.off\nbookshelf/train/bookshelf_0075.off\nbookshelf/train/bookshelf_0076.off\nbookshelf/train/bookshelf_0077.off\nbookshelf/train/bookshelf_0078.off\nbookshelf/train/bookshelf_0079.off\nbookshelf/train/bookshelf_0080.off\nbookshelf/train/bookshelf_0081.off\nbookshelf/train/bookshelf_0082.off\nbookshelf/train/bookshelf_0083.off\nbookshelf/train/bookshelf_0084.off\nbookshelf/train/bookshelf_0085.off\nbookshelf/train/bookshelf_0086.off\nbookshelf/train/bookshelf_0087.off\nbookshelf/train/bookshelf_0088.off\nbookshelf/train/bookshelf_0089.off\nbookshelf/train/bookshelf_0090.off\nbookshelf/train/bookshelf_0091.off\nbookshelf/train/bookshelf_0092.off\nbookshelf/train/bookshelf_0093.off\nbookshelf/train/bookshelf_0094.off\nbookshelf/train/bookshelf_0095.off\nbookshelf/train/bookshelf_0096.off\nbookshelf/train/bookshelf_0097.off\nbookshelf/train/bookshelf_0098.off\nbookshelf/train/bookshelf_0099.off\nbookshelf/train/bookshelf_0100.off\nbookshelf/train/bookshelf_0101.off\nbookshelf/train/bookshelf_0102.off\nbookshelf/train/bookshelf_0103.off\nbookshelf/train/bookshelf_0104.off\nbookshelf/train/bookshelf_0105.off\nbookshelf/train/bookshelf_0106.off\nbookshelf/train/bookshelf_0107.off\nbookshelf/train/bookshelf_0108.off\nbookshelf/train/bookshelf_0109.off\nbookshelf/train/bookshelf_0110.off\nbookshelf/train/bookshelf_0111.off\nbookshelf/train/bookshelf_0112.off\nbookshelf/train/bookshelf_0113.off\nbookshelf/train/bookshelf_0114.off\nbookshelf/train/bookshelf_0115.off\nbookshelf/train/bookshelf_0116.off\nbookshelf/train/bookshelf_0117.off\nbookshelf/train/bookshelf_0118.off\nbookshelf/train/bookshelf_0119.off\nbookshelf/train/bookshelf_0120.off\nbookshelf/train/bookshelf_0121.off\nbookshelf/train/bookshelf_0122.off\nbookshelf/train/bookshelf_0123.off\nbookshelf/train/bookshelf_0124.off\nbookshelf/train/bookshelf_0125.off\nbookshelf/train/bookshelf_0126.off\nbookshelf/train/bookshelf_0127.off\nbookshelf/train/bookshelf_0128.off\nbookshelf/train/bookshelf_0129.off\nbookshelf/train/bookshelf_0130.off\nbookshelf/train/bookshelf_0131.off\nbookshelf/train/bookshelf_0132.off\nbookshelf/train/bookshelf_0133.off\nbookshelf/train/bookshelf_0134.off\nbookshelf/train/bookshelf_0135.off\nbookshelf/train/bookshelf_0136.off\nbookshelf/train/bookshelf_0137.off\nbookshelf/train/bookshelf_0138.off\nbookshelf/train/bookshelf_0139.off\nbookshelf/train/bookshelf_0140.off\nbookshelf/train/bookshelf_0141.off\nbookshelf/train/bookshelf_0142.off\nbookshelf/train/bookshelf_0143.off\nbookshelf/train/bookshelf_0144.off\nbookshelf/train/bookshelf_0145.off\nbookshelf/train/bookshelf_0146.off\nbookshelf/train/bookshelf_0147.off\nbookshelf/train/bookshelf_0148.off\nbookshelf/train/bookshelf_0149.off\nbookshelf/train/bookshelf_0150.off\nbookshelf/train/bookshelf_0151.off\nbookshelf/train/bookshelf_0152.off\nbookshelf/train/bookshelf_0153.off\nbookshelf/train/bookshelf_0154.off\nbookshelf/train/bookshelf_0155.off\nbookshelf/train/bookshelf_0156.off\nbookshelf/train/bookshelf_0157.off\nbookshelf/train/bookshelf_0158.off\nbookshelf/train/bookshelf_0159.off\nbookshelf/train/bookshelf_0160.off\nbookshelf/train/bookshelf_0161.off\nbookshelf/train/bookshelf_0162.off\nbookshelf/train/bookshelf_0163.off\nbookshelf/train/bookshelf_0164.off\nbookshelf/train/bookshelf_0165.off\nbookshelf/train/bookshelf_0166.off\nbookshelf/train/bookshelf_0167.off\nbookshelf/train/bookshelf_0168.off\nbookshelf/train/bookshelf_0169.off\nbookshelf/train/bookshelf_0170.off\nbookshelf/train/bookshelf_0171.off\nbookshelf/train/bookshelf_0172.off\nbookshelf/train/bookshelf_0173.off\nbookshelf/train/bookshelf_0174.off\nbookshelf/train/bookshelf_0175.off\nbookshelf/train/bookshelf_0176.off\nbookshelf/train/bookshelf_0177.off\nbookshelf/train/bookshelf_0178.off\nbookshelf/train/bookshelf_0179.off\nbookshelf/train/bookshelf_0180.off\nbookshelf/train/bookshelf_0181.off\nbookshelf/train/bookshelf_0182.off\nbookshelf/train/bookshelf_0183.off\nbookshelf/train/bookshelf_0184.off\nbookshelf/train/bookshelf_0185.off\nbookshelf/train/bookshelf_0186.off\nbookshelf/train/bookshelf_0187.off\nbookshelf/train/bookshelf_0188.off\nbookshelf/train/bookshelf_0189.off\nbookshelf/train/bookshelf_0190.off\nbookshelf/train/bookshelf_0191.off\nbookshelf/train/bookshelf_0192.off\nbookshelf/train/bookshelf_0193.off\nbookshelf/train/bookshelf_0194.off\nbookshelf/train/bookshelf_0195.off\nbookshelf/train/bookshelf_0196.off\nbookshelf/train/bookshelf_0197.off\nbookshelf/train/bookshelf_0198.off\nbookshelf/train/bookshelf_0199.off\nbookshelf/train/bookshelf_0200.off\nbookshelf/train/bookshelf_0201.off\nbookshelf/train/bookshelf_0202.off\nbookshelf/train/bookshelf_0203.off\nbookshelf/train/bookshelf_0204.off\nbookshelf/train/bookshelf_0205.off\nbookshelf/train/bookshelf_0206.off\nbookshelf/train/bookshelf_0207.off\nbookshelf/train/bookshelf_0208.off\nbookshelf/train/bookshelf_0209.off\nbookshelf/train/bookshelf_0210.off\nbookshelf/train/bookshelf_0211.off\nbookshelf/train/bookshelf_0212.off\nbookshelf/train/bookshelf_0213.off\nbookshelf/train/bookshelf_0214.off\nbookshelf/train/bookshelf_0215.off\nbookshelf/train/bookshelf_0216.off\nbookshelf/train/bookshelf_0217.off\nbookshelf/train/bookshelf_0218.off\nbookshelf/train/bookshelf_0219.off\nbookshelf/train/bookshelf_0220.off\nbookshelf/train/bookshelf_0221.off\nbookshelf/train/bookshelf_0222.off\nbookshelf/train/bookshelf_0223.off\nbookshelf/train/bookshelf_0224.off\nbookshelf/train/bookshelf_0225.off\nbookshelf/train/bookshelf_0226.off\nbookshelf/train/bookshelf_0227.off\nbookshelf/train/bookshelf_0228.off\nbookshelf/train/bookshelf_0229.off\nbookshelf/train/bookshelf_0230.off\nbookshelf/train/bookshelf_0231.off\nbookshelf/train/bookshelf_0232.off\nbookshelf/train/bookshelf_0233.off\nbookshelf/train/bookshelf_0234.off\nbookshelf/train/bookshelf_0235.off\nbookshelf/train/bookshelf_0236.off\nbookshelf/train/bookshelf_0237.off\nbookshelf/train/bookshelf_0238.off\nbookshelf/train/bookshelf_0239.off\nbookshelf/train/bookshelf_0240.off\nbookshelf/train/bookshelf_0241.off\nbookshelf/train/bookshelf_0242.off\nbookshelf/train/bookshelf_0243.off\nbookshelf/train/bookshelf_0244.off\nbookshelf/train/bookshelf_0245.off\nbookshelf/train/bookshelf_0246.off\nbookshelf/train/bookshelf_0247.off\nbookshelf/train/bookshelf_0248.off\nbookshelf/train/bookshelf_0249.off\nbookshelf/train/bookshelf_0250.off\nbookshelf/train/bookshelf_0251.off\nbookshelf/train/bookshelf_0252.off\nbookshelf/train/bookshelf_0253.off\nbookshelf/train/bookshelf_0254.off\nbookshelf/train/bookshelf_0255.off\nbookshelf/train/bookshelf_0256.off\nbookshelf/train/bookshelf_0257.off\nbookshelf/train/bookshelf_0258.off\nbookshelf/train/bookshelf_0259.off\nbookshelf/train/bookshelf_0260.off\nbookshelf/train/bookshelf_0261.off\nbookshelf/train/bookshelf_0262.off\nbookshelf/train/bookshelf_0263.off\nbookshelf/train/bookshelf_0264.off\nbookshelf/train/bookshelf_0265.off\nbookshelf/train/bookshelf_0266.off\nbookshelf/train/bookshelf_0267.off\nbookshelf/train/bookshelf_0268.off\nbookshelf/train/bookshelf_0269.off\nbookshelf/train/bookshelf_0270.off\nbookshelf/train/bookshelf_0271.off\nbookshelf/train/bookshelf_0272.off\nbookshelf/train/bookshelf_0273.off\nbookshelf/train/bookshelf_0274.off\nbookshelf/train/bookshelf_0275.off\nbookshelf/train/bookshelf_0276.off\nbookshelf/train/bookshelf_0277.off\nbookshelf/train/bookshelf_0278.off\nbookshelf/train/bookshelf_0279.off\nbookshelf/train/bookshelf_0280.off\nbookshelf/train/bookshelf_0281.off\nbookshelf/train/bookshelf_0282.off\nbookshelf/train/bookshelf_0283.off\nbookshelf/train/bookshelf_0284.off\nbookshelf/train/bookshelf_0285.off\nbookshelf/train/bookshelf_0286.off\nbookshelf/train/bookshelf_0287.off\nbookshelf/train/bookshelf_0288.off\nbookshelf/train/bookshelf_0289.off\nbookshelf/train/bookshelf_0290.off\nbookshelf/train/bookshelf_0291.off\nbookshelf/train/bookshelf_0292.off\nbookshelf/train/bookshelf_0293.off\nbookshelf/train/bookshelf_0294.off\nbookshelf/train/bookshelf_0295.off\nbookshelf/train/bookshelf_0296.off\nbookshelf/train/bookshelf_0297.off\nbookshelf/train/bookshelf_0298.off\nbookshelf/train/bookshelf_0299.off\nbookshelf/train/bookshelf_0300.off\nbookshelf/train/bookshelf_0301.off\nbookshelf/train/bookshelf_0302.off\nbookshelf/train/bookshelf_0303.off\nbookshelf/train/bookshelf_0304.off\nbookshelf/train/bookshelf_0305.off\nbookshelf/train/bookshelf_0306.off\nbookshelf/train/bookshelf_0307.off\nbookshelf/train/bookshelf_0308.off\nbookshelf/train/bookshelf_0309.off\nbookshelf/train/bookshelf_0310.off\nbookshelf/train/bookshelf_0311.off\nbookshelf/train/bookshelf_0312.off\nbookshelf/train/bookshelf_0313.off\nbookshelf/train/bookshelf_0314.off\nbookshelf/train/bookshelf_0315.off\nbookshelf/train/bookshelf_0316.off\nbookshelf/train/bookshelf_0317.off\nbookshelf/train/bookshelf_0318.off\nbookshelf/train/bookshelf_0319.off\nbookshelf/train/bookshelf_0320.off\nbookshelf/train/bookshelf_0321.off\nbookshelf/train/bookshelf_0322.off\nbookshelf/train/bookshelf_0323.off\nbookshelf/train/bookshelf_0324.off\nbookshelf/train/bookshelf_0325.off\nbookshelf/train/bookshelf_0326.off\nbookshelf/train/bookshelf_0327.off\nbookshelf/train/bookshelf_0328.off\nbookshelf/train/bookshelf_0329.off\nbookshelf/train/bookshelf_0330.off\nbookshelf/train/bookshelf_0331.off\nbookshelf/train/bookshelf_0332.off\nbookshelf/train/bookshelf_0333.off\nbookshelf/train/bookshelf_0334.off\nbookshelf/train/bookshelf_0335.off\nbookshelf/train/bookshelf_0336.off\nbookshelf/train/bookshelf_0337.off\nbookshelf/train/bookshelf_0338.off\nbookshelf/train/bookshelf_0339.off\nbookshelf/train/bookshelf_0340.off\nbookshelf/train/bookshelf_0341.off\nbookshelf/train/bookshelf_0342.off\nbookshelf/train/bookshelf_0343.off\nbookshelf/train/bookshelf_0344.off\nbookshelf/train/bookshelf_0345.off\nbookshelf/train/bookshelf_0346.off\nbookshelf/train/bookshelf_0347.off\nbookshelf/train/bookshelf_0348.off\nbookshelf/train/bookshelf_0349.off\nbookshelf/train/bookshelf_0350.off\nbookshelf/train/bookshelf_0351.off\nbookshelf/train/bookshelf_0352.off\nbookshelf/train/bookshelf_0353.off\nbookshelf/train/bookshelf_0354.off\nbookshelf/train/bookshelf_0355.off\nbookshelf/train/bookshelf_0356.off\nbookshelf/train/bookshelf_0357.off\nbookshelf/train/bookshelf_0358.off\nbookshelf/train/bookshelf_0359.off\nbookshelf/train/bookshelf_0360.off\nbookshelf/train/bookshelf_0361.off\nbookshelf/train/bookshelf_0362.off\nbookshelf/train/bookshelf_0363.off\nbookshelf/train/bookshelf_0364.off\nbookshelf/train/bookshelf_0365.off\nbookshelf/train/bookshelf_0366.off\nbookshelf/train/bookshelf_0367.off\nbookshelf/train/bookshelf_0368.off\nbookshelf/train/bookshelf_0369.off\nbookshelf/train/bookshelf_0370.off\nbookshelf/train/bookshelf_0371.off\nbookshelf/train/bookshelf_0372.off\nbookshelf/train/bookshelf_0373.off\nbookshelf/train/bookshelf_0374.off\nbookshelf/train/bookshelf_0375.off\nbookshelf/train/bookshelf_0376.off\nbookshelf/train/bookshelf_0377.off\nbookshelf/train/bookshelf_0378.off\nbookshelf/train/bookshelf_0379.off\nbookshelf/train/bookshelf_0380.off\nbookshelf/train/bookshelf_0381.off\nbookshelf/train/bookshelf_0382.off\nbookshelf/train/bookshelf_0383.off\nbookshelf/train/bookshelf_0384.off\nbookshelf/train/bookshelf_0385.off\nbookshelf/train/bookshelf_0386.off\nbookshelf/train/bookshelf_0387.off\nbookshelf/train/bookshelf_0388.off\nbookshelf/train/bookshelf_0389.off\nbookshelf/train/bookshelf_0390.off\nbookshelf/train/bookshelf_0391.off\nbookshelf/train/bookshelf_0392.off\nbookshelf/train/bookshelf_0393.off\nbookshelf/train/bookshelf_0394.off\nbookshelf/train/bookshelf_0395.off\nbookshelf/train/bookshelf_0396.off\nbookshelf/train/bookshelf_0397.off\nbookshelf/train/bookshelf_0398.off\nbookshelf/train/bookshelf_0399.off\nbookshelf/train/bookshelf_0400.off\nbookshelf/train/bookshelf_0401.off\nbookshelf/train/bookshelf_0402.off\nbookshelf/train/bookshelf_0403.off\nbookshelf/train/bookshelf_0404.off\nbookshelf/train/bookshelf_0405.off\nbookshelf/train/bookshelf_0406.off\nbookshelf/train/bookshelf_0407.off\nbookshelf/train/bookshelf_0408.off\nbookshelf/train/bookshelf_0409.off\nbookshelf/train/bookshelf_0410.off\nbookshelf/train/bookshelf_0411.off\nbookshelf/train/bookshelf_0412.off\nbookshelf/train/bookshelf_0413.off\nbookshelf/train/bookshelf_0414.off\nbookshelf/train/bookshelf_0415.off\nbookshelf/train/bookshelf_0416.off\nbookshelf/train/bookshelf_0417.off\nbookshelf/train/bookshelf_0418.off\nbookshelf/train/bookshelf_0419.off\nbookshelf/train/bookshelf_0420.off\nbookshelf/train/bookshelf_0421.off\nbookshelf/train/bookshelf_0422.off\nbookshelf/train/bookshelf_0423.off\nbookshelf/train/bookshelf_0424.off\nbookshelf/train/bookshelf_0425.off\nbookshelf/train/bookshelf_0426.off\nbookshelf/train/bookshelf_0427.off\nbookshelf/train/bookshelf_0428.off\nbookshelf/train/bookshelf_0429.off\nbookshelf/train/bookshelf_0430.off\nbookshelf/train/bookshelf_0431.off\nbookshelf/train/bookshelf_0432.off\nbookshelf/train/bookshelf_0433.off\nbookshelf/train/bookshelf_0434.off\nbookshelf/train/bookshelf_0435.off\nbookshelf/train/bookshelf_0436.off\nbookshelf/train/bookshelf_0437.off\nbookshelf/train/bookshelf_0438.off\nbookshelf/train/bookshelf_0439.off\nbookshelf/train/bookshelf_0440.off\nbookshelf/train/bookshelf_0441.off\nbookshelf/train/bookshelf_0442.off\nbookshelf/train/bookshelf_0443.off\nbookshelf/train/bookshelf_0444.off\nbookshelf/train/bookshelf_0445.off\nbookshelf/train/bookshelf_0446.off\nbookshelf/train/bookshelf_0447.off\nbookshelf/train/bookshelf_0448.off\nbookshelf/train/bookshelf_0449.off\nbookshelf/train/bookshelf_0450.off\nbookshelf/train/bookshelf_0451.off\nbookshelf/train/bookshelf_0452.off\nbookshelf/train/bookshelf_0453.off\nbookshelf/train/bookshelf_0454.off\nbookshelf/train/bookshelf_0455.off\nbookshelf/train/bookshelf_0456.off\nbookshelf/train/bookshelf_0457.off\nbookshelf/train/bookshelf_0458.off\nbookshelf/train/bookshelf_0459.off\nbookshelf/train/bookshelf_0460.off\nbookshelf/train/bookshelf_0461.off\nbookshelf/train/bookshelf_0462.off\nbookshelf/train/bookshelf_0463.off\nbookshelf/train/bookshelf_0464.off\nbookshelf/train/bookshelf_0465.off\nbookshelf/train/bookshelf_0466.off\nbookshelf/train/bookshelf_0467.off\nbookshelf/train/bookshelf_0468.off\nbookshelf/train/bookshelf_0469.off\nbookshelf/train/bookshelf_0470.off\nbookshelf/train/bookshelf_0471.off\nbookshelf/train/bookshelf_0472.off\nbookshelf/train/bookshelf_0473.off\nbookshelf/train/bookshelf_0474.off\nbookshelf/train/bookshelf_0475.off\nbookshelf/train/bookshelf_0476.off\nbookshelf/train/bookshelf_0477.off\nbookshelf/train/bookshelf_0478.off\nbookshelf/train/bookshelf_0479.off\nbookshelf/train/bookshelf_0480.off\nbookshelf/train/bookshelf_0481.off\nbookshelf/train/bookshelf_0482.off\nbookshelf/train/bookshelf_0483.off\nbookshelf/train/bookshelf_0484.off\nbookshelf/train/bookshelf_0485.off\nbookshelf/train/bookshelf_0486.off\nbookshelf/train/bookshelf_0487.off\nbookshelf/train/bookshelf_0488.off\nbookshelf/train/bookshelf_0489.off\nbookshelf/train/bookshelf_0490.off\nbookshelf/train/bookshelf_0491.off\nbookshelf/train/bookshelf_0492.off\nbookshelf/train/bookshelf_0493.off\nbookshelf/train/bookshelf_0494.off\nbookshelf/train/bookshelf_0495.off\nbookshelf/train/bookshelf_0496.off\nbookshelf/train/bookshelf_0497.off\nbookshelf/train/bookshelf_0498.off\nbookshelf/train/bookshelf_0499.off\nbookshelf/train/bookshelf_0500.off\nbookshelf/train/bookshelf_0501.off\nbookshelf/train/bookshelf_0502.off\nbookshelf/train/bookshelf_0503.off\nbookshelf/train/bookshelf_0504.off\nbookshelf/train/bookshelf_0505.off\nbookshelf/train/bookshelf_0506.off\nbookshelf/train/bookshelf_0507.off\nbookshelf/train/bookshelf_0508.off\nbookshelf/train/bookshelf_0509.off\nbookshelf/train/bookshelf_0510.off\nbookshelf/train/bookshelf_0511.off\nbookshelf/train/bookshelf_0512.off\nbookshelf/train/bookshelf_0513.off\nbookshelf/train/bookshelf_0514.off\nbookshelf/train/bookshelf_0515.off\nguitar/train/guitar_0001.off\nguitar/train/guitar_0002.off\nguitar/train/guitar_0003.off\nguitar/train/guitar_0004.off\nguitar/train/guitar_0005.off\nguitar/train/guitar_0006.off\nguitar/train/guitar_0007.off\nguitar/train/guitar_0008.off\nguitar/train/guitar_0009.off\nguitar/train/guitar_0010.off\nguitar/train/guitar_0011.off\nguitar/train/guitar_0012.off\nguitar/train/guitar_0013.off\nguitar/train/guitar_0014.off\nguitar/train/guitar_0015.off\nguitar/train/guitar_0016.off\nguitar/train/guitar_0017.off\nguitar/train/guitar_0018.off\nguitar/train/guitar_0019.off\nguitar/train/guitar_0020.off\nguitar/train/guitar_0021.off\nguitar/train/guitar_0022.off\nguitar/train/guitar_0023.off\nguitar/train/guitar_0024.off\nguitar/train/guitar_0025.off\nguitar/train/guitar_0026.off\nguitar/train/guitar_0027.off\nguitar/train/guitar_0028.off\nguitar/train/guitar_0029.off\nguitar/train/guitar_0030.off\nguitar/train/guitar_0031.off\nguitar/train/guitar_0032.off\nguitar/train/guitar_0033.off\nguitar/train/guitar_0034.off\nguitar/train/guitar_0035.off\nguitar/train/guitar_0036.off\nguitar/train/guitar_0037.off\nguitar/train/guitar_0038.off\nguitar/train/guitar_0039.off\nguitar/train/guitar_0040.off\nguitar/train/guitar_0041.off\nguitar/train/guitar_0042.off\nguitar/train/guitar_0043.off\nguitar/train/guitar_0044.off\nguitar/train/guitar_0045.off\nguitar/train/guitar_0046.off\nguitar/train/guitar_0047.off\nguitar/train/guitar_0048.off\nguitar/train/guitar_0049.off\nguitar/train/guitar_0050.off\nguitar/train/guitar_0051.off\nguitar/train/guitar_0052.off\nguitar/train/guitar_0053.off\nguitar/train/guitar_0054.off\nguitar/train/guitar_0055.off\nguitar/train/guitar_0056.off\nguitar/train/guitar_0057.off\nguitar/train/guitar_0058.off\nguitar/train/guitar_0059.off\nguitar/train/guitar_0060.off\nguitar/train/guitar_0061.off\nguitar/train/guitar_0062.off\nguitar/train/guitar_0063.off\nguitar/train/guitar_0064.off\nguitar/train/guitar_0065.off\nguitar/train/guitar_0066.off\nguitar/train/guitar_0067.off\nguitar/train/guitar_0068.off\nguitar/train/guitar_0069.off\nguitar/train/guitar_0070.off\nguitar/train/guitar_0071.off\nguitar/train/guitar_0072.off\nguitar/train/guitar_0073.off\nguitar/train/guitar_0074.off\nguitar/train/guitar_0075.off\nguitar/train/guitar_0076.off\nguitar/train/guitar_0077.off\nguitar/train/guitar_0078.off\nguitar/train/guitar_0079.off\nguitar/train/guitar_0080.off\nguitar/train/guitar_0081.off\nguitar/train/guitar_0082.off\nguitar/train/guitar_0083.off\nguitar/train/guitar_0084.off\nguitar/train/guitar_0085.off\nguitar/train/guitar_0086.off\nguitar/train/guitar_0087.off\nguitar/train/guitar_0088.off\nguitar/train/guitar_0089.off\nguitar/train/guitar_0090.off\nguitar/train/guitar_0091.off\nguitar/train/guitar_0092.off\nguitar/train/guitar_0093.off\nguitar/train/guitar_0094.off\nguitar/train/guitar_0095.off\nguitar/train/guitar_0096.off\nguitar/train/guitar_0097.off\nguitar/train/guitar_0098.off\nguitar/train/guitar_0099.off\nguitar/train/guitar_0100.off\nguitar/train/guitar_0101.off\nguitar/train/guitar_0102.off\nguitar/train/guitar_0103.off\nguitar/train/guitar_0104.off\nguitar/train/guitar_0105.off\nguitar/train/guitar_0106.off\nguitar/train/guitar_0107.off\nguitar/train/guitar_0108.off\nguitar/train/guitar_0109.off\nguitar/train/guitar_0110.off\nguitar/train/guitar_0111.off\nguitar/train/guitar_0112.off\nguitar/train/guitar_0113.off\nguitar/train/guitar_0114.off\nguitar/train/guitar_0115.off\nguitar/train/guitar_0116.off\nguitar/train/guitar_0117.off\nguitar/train/guitar_0118.off\nguitar/train/guitar_0119.off\nguitar/train/guitar_0120.off\nguitar/train/guitar_0121.off\nguitar/train/guitar_0122.off\nguitar/train/guitar_0123.off\nguitar/train/guitar_0124.off\nguitar/train/guitar_0125.off\nguitar/train/guitar_0126.off\nguitar/train/guitar_0127.off\nguitar/train/guitar_0128.off\nguitar/train/guitar_0129.off\nguitar/train/guitar_0130.off\nguitar/train/guitar_0131.off\nguitar/train/guitar_0132.off\nguitar/train/guitar_0133.off\nguitar/train/guitar_0134.off\nguitar/train/guitar_0135.off\nguitar/train/guitar_0136.off\nguitar/train/guitar_0137.off\nguitar/train/guitar_0138.off\nguitar/train/guitar_0139.off\nguitar/train/guitar_0140.off\ntv_stand/train/tv_stand_0001.off\ntv_stand/train/tv_stand_0002.off\ntv_stand/train/tv_stand_0003.off\ntv_stand/train/tv_stand_0004.off\ntv_stand/train/tv_stand_0005.off\ntv_stand/train/tv_stand_0006.off\ntv_stand/train/tv_stand_0007.off\ntv_stand/train/tv_stand_0008.off\ntv_stand/train/tv_stand_0009.off\ntv_stand/train/tv_stand_0010.off\ntv_stand/train/tv_stand_0011.off\ntv_stand/train/tv_stand_0012.off\ntv_stand/train/tv_stand_0013.off\ntv_stand/train/tv_stand_0014.off\ntv_stand/train/tv_stand_0015.off\ntv_stand/train/tv_stand_0016.off\ntv_stand/train/tv_stand_0017.off\ntv_stand/train/tv_stand_0018.off\ntv_stand/train/tv_stand_0019.off\ntv_stand/train/tv_stand_0020.off\ntv_stand/train/tv_stand_0021.off\ntv_stand/train/tv_stand_0022.off\ntv_stand/train/tv_stand_0023.off\ntv_stand/train/tv_stand_0024.off\ntv_stand/train/tv_stand_0025.off\ntv_stand/train/tv_stand_0026.off\ntv_stand/train/tv_stand_0027.off\ntv_stand/train/tv_stand_0028.off\ntv_stand/train/tv_stand_0029.off\ntv_stand/train/tv_stand_0030.off\ntv_stand/train/tv_stand_0031.off\ntv_stand/train/tv_stand_0032.off\ntv_stand/train/tv_stand_0033.off\ntv_stand/train/tv_stand_0034.off\ntv_stand/train/tv_stand_0035.off\ntv_stand/train/tv_stand_0036.off\ntv_stand/train/tv_stand_0037.off\ntv_stand/train/tv_stand_0038.off\ntv_stand/train/tv_stand_0039.off\ntv_stand/train/tv_stand_0040.off\ntv_stand/train/tv_stand_0041.off\ntv_stand/train/tv_stand_0042.off\ntv_stand/train/tv_stand_0043.off\ntv_stand/train/tv_stand_0044.off\ntv_stand/train/tv_stand_0045.off\ntv_stand/train/tv_stand_0046.off\ntv_stand/train/tv_stand_0047.off\ntv_stand/train/tv_stand_0048.off\ntv_stand/train/tv_stand_0049.off\ntv_stand/train/tv_stand_0050.off\ntv_stand/train/tv_stand_0051.off\ntv_stand/train/tv_stand_0052.off\ntv_stand/train/tv_stand_0053.off\ntv_stand/train/tv_stand_0054.off\ntv_stand/train/tv_stand_0055.off\ntv_stand/train/tv_stand_0056.off\ntv_stand/train/tv_stand_0057.off\ntv_stand/train/tv_stand_0058.off\ntv_stand/train/tv_stand_0059.off\ntv_stand/train/tv_stand_0060.off\ntv_stand/train/tv_stand_0061.off\ntv_stand/train/tv_stand_0062.off\ntv_stand/train/tv_stand_0063.off\ntv_stand/train/tv_stand_0064.off\ntv_stand/train/tv_stand_0065.off\ntv_stand/train/tv_stand_0066.off\ntv_stand/train/tv_stand_0067.off\ntv_stand/train/tv_stand_0068.off\ntv_stand/train/tv_stand_0069.off\ntv_stand/train/tv_stand_0070.off\ntv_stand/train/tv_stand_0071.off\ntv_stand/train/tv_stand_0072.off\ntv_stand/train/tv_stand_0073.off\ntv_stand/train/tv_stand_0074.off\ntv_stand/train/tv_stand_0075.off\ntv_stand/train/tv_stand_0076.off\ntv_stand/train/tv_stand_0077.off\ntv_stand/train/tv_stand_0078.off\ntv_stand/train/tv_stand_0079.off\ntv_stand/train/tv_stand_0080.off\ntv_stand/train/tv_stand_0081.off\ntv_stand/train/tv_stand_0082.off\ntv_stand/train/tv_stand_0083.off\ntv_stand/train/tv_stand_0084.off\ntv_stand/train/tv_stand_0085.off\ntv_stand/train/tv_stand_0086.off\ntv_stand/train/tv_stand_0087.off\ntv_stand/train/tv_stand_0088.off\ntv_stand/train/tv_stand_0089.off\ntv_stand/train/tv_stand_0090.off\ntv_stand/train/tv_stand_0091.off\ntv_stand/train/tv_stand_0092.off\ntv_stand/train/tv_stand_0093.off\ntv_stand/train/tv_stand_0094.off\ntv_stand/train/tv_stand_0095.off\ntv_stand/train/tv_stand_0096.off\ntv_stand/train/tv_stand_0097.off\ntv_stand/train/tv_stand_0098.off\ntv_stand/train/tv_stand_0099.off\ntv_stand/train/tv_stand_0100.off\ntv_stand/train/tv_stand_0101.off\ntv_stand/train/tv_stand_0102.off\ntv_stand/train/tv_stand_0103.off\ntv_stand/train/tv_stand_0104.off\ntv_stand/train/tv_stand_0105.off\ntv_stand/train/tv_stand_0106.off\ntv_stand/train/tv_stand_0107.off\ntv_stand/train/tv_stand_0108.off\ntv_stand/train/tv_stand_0109.off\ntv_stand/train/tv_stand_0110.off\ntv_stand/train/tv_stand_0111.off\ntv_stand/train/tv_stand_0112.off\ntv_stand/train/tv_stand_0113.off\ntv_stand/train/tv_stand_0114.off\ntv_stand/train/tv_stand_0115.off\ntv_stand/train/tv_stand_0116.off\ntv_stand/train/tv_stand_0117.off\ntv_stand/train/tv_stand_0118.off\ntv_stand/train/tv_stand_0119.off\ntv_stand/train/tv_stand_0120.off\ntv_stand/train/tv_stand_0121.off\ntv_stand/train/tv_stand_0122.off\ntv_stand/train/tv_stand_0123.off\ntv_stand/train/tv_stand_0124.off\ntv_stand/train/tv_stand_0125.off\ntv_stand/train/tv_stand_0126.off\ntv_stand/train/tv_stand_0127.off\ntv_stand/train/tv_stand_0128.off\ntv_stand/train/tv_stand_0129.off\ntv_stand/train/tv_stand_0130.off\ntv_stand/train/tv_stand_0131.off\ntv_stand/train/tv_stand_0132.off\ntv_stand/train/tv_stand_0133.off\ntv_stand/train/tv_stand_0134.off\ntv_stand/train/tv_stand_0135.off\ntv_stand/train/tv_stand_0136.off\ntv_stand/train/tv_stand_0137.off\ntv_stand/train/tv_stand_0138.off\ntv_stand/train/tv_stand_0139.off\ntv_stand/train/tv_stand_0140.off\ntv_stand/train/tv_stand_0141.off\ntv_stand/train/tv_stand_0142.off\ntv_stand/train/tv_stand_0143.off\ntv_stand/train/tv_stand_0144.off\ntv_stand/train/tv_stand_0145.off\ntv_stand/train/tv_stand_0146.off\ntv_stand/train/tv_stand_0147.off\ntv_stand/train/tv_stand_0148.off\ntv_stand/train/tv_stand_0149.off\ntv_stand/train/tv_stand_0150.off\ntv_stand/train/tv_stand_0151.off\ntv_stand/train/tv_stand_0152.off\ntv_stand/train/tv_stand_0153.off\ntv_stand/train/tv_stand_0154.off\ntv_stand/train/tv_stand_0155.off\ntv_stand/train/tv_stand_0156.off\ntv_stand/train/tv_stand_0157.off\ntv_stand/train/tv_stand_0158.off\ntv_stand/train/tv_stand_0159.off\ntv_stand/train/tv_stand_0160.off\ntv_stand/train/tv_stand_0161.off\ntv_stand/train/tv_stand_0162.off\ntv_stand/train/tv_stand_0163.off\ntv_stand/train/tv_stand_0164.off\ntv_stand/train/tv_stand_0165.off\ntv_stand/train/tv_stand_0166.off\ntv_stand/train/tv_stand_0167.off\ntv_stand/train/tv_stand_0168.off\ntv_stand/train/tv_stand_0169.off\ntv_stand/train/tv_stand_0170.off\ntv_stand/train/tv_stand_0171.off\ntv_stand/train/tv_stand_0172.off\ntv_stand/train/tv_stand_0173.off\ntv_stand/train/tv_stand_0174.off\ntv_stand/train/tv_stand_0175.off\ntv_stand/train/tv_stand_0176.off\ntv_stand/train/tv_stand_0177.off\ntv_stand/train/tv_stand_0178.off\ntv_stand/train/tv_stand_0179.off\ntv_stand/train/tv_stand_0180.off\ntv_stand/train/tv_stand_0181.off\ntv_stand/train/tv_stand_0182.off\ntv_stand/train/tv_stand_0183.off\ntv_stand/train/tv_stand_0184.off\ntv_stand/train/tv_stand_0185.off\ntv_stand/train/tv_stand_0186.off\ntv_stand/train/tv_stand_0187.off\ntv_stand/train/tv_stand_0188.off\ntv_stand/train/tv_stand_0189.off\ntv_stand/train/tv_stand_0190.off\ntv_stand/train/tv_stand_0191.off\ntv_stand/train/tv_stand_0192.off\ntv_stand/train/tv_stand_0193.off\ntv_stand/train/tv_stand_0194.off\ntv_stand/train/tv_stand_0195.off\ntv_stand/train/tv_stand_0196.off\ntv_stand/train/tv_stand_0197.off\ntv_stand/train/tv_stand_0198.off\ntv_stand/train/tv_stand_0199.off\ntv_stand/train/tv_stand_0200.off\ntv_stand/train/tv_stand_0201.off\ntv_stand/train/tv_stand_0202.off\ntv_stand/train/tv_stand_0203.off\ntv_stand/train/tv_stand_0204.off\ntv_stand/train/tv_stand_0205.off\ntv_stand/train/tv_stand_0206.off\ntv_stand/train/tv_stand_0207.off\ntv_stand/train/tv_stand_0208.off\ntv_stand/train/tv_stand_0209.off\ntv_stand/train/tv_stand_0210.off\ntv_stand/train/tv_stand_0211.off\ntv_stand/train/tv_stand_0212.off\ntv_stand/train/tv_stand_0213.off\ntv_stand/train/tv_stand_0214.off\ntv_stand/train/tv_stand_0215.off\ntv_stand/train/tv_stand_0216.off\ntv_stand/train/tv_stand_0217.off\ntv_stand/train/tv_stand_0218.off\ntv_stand/train/tv_stand_0219.off\ntv_stand/train/tv_stand_0220.off\ntv_stand/train/tv_stand_0221.off\ntv_stand/train/tv_stand_0222.off\ntv_stand/train/tv_stand_0223.off\ntv_stand/train/tv_stand_0224.off\ntv_stand/train/tv_stand_0225.off\ntv_stand/train/tv_stand_0226.off\ntv_stand/train/tv_stand_0227.off\ntv_stand/train/tv_stand_0228.off\ntv_stand/train/tv_stand_0229.off\ntv_stand/train/tv_stand_0230.off\ntv_stand/train/tv_stand_0231.off\ntv_stand/train/tv_stand_0232.off\ntv_stand/train/tv_stand_0233.off\ntv_stand/train/tv_stand_0234.off\ntv_stand/train/tv_stand_0235.off\ntv_stand/train/tv_stand_0236.off\ntv_stand/train/tv_stand_0237.off\ntv_stand/train/tv_stand_0238.off\ntv_stand/train/tv_stand_0239.off\ntv_stand/train/tv_stand_0240.off\ntv_stand/train/tv_stand_0241.off\nbathtub/train/bathtub_0001.off\nbathtub/train/bathtub_0002.off\nbathtub/train/bathtub_0003.off\nbathtub/train/bathtub_0004.off\nbathtub/train/bathtub_0005.off\nbathtub/train/bathtub_0006.off\nbathtub/train/bathtub_0007.off\nbathtub/train/bathtub_0008.off\nbathtub/train/bathtub_0009.off\nbathtub/train/bathtub_0010.off\nbathtub/train/bathtub_0011.off\nbathtub/train/bathtub_0012.off\nbathtub/train/bathtub_0013.off\nbathtub/train/bathtub_0014.off\nbathtub/train/bathtub_0015.off\nbathtub/train/bathtub_0016.off\nbathtub/train/bathtub_0017.off\nbathtub/train/bathtub_0018.off\nbathtub/train/bathtub_0019.off\nbathtub/train/bathtub_0020.off\nbathtub/train/bathtub_0021.off\nbathtub/train/bathtub_0022.off\nbathtub/train/bathtub_0023.off\nbathtub/train/bathtub_0024.off\nbathtub/train/bathtub_0025.off\nbathtub/train/bathtub_0026.off\nbathtub/train/bathtub_0027.off\nbathtub/train/bathtub_0028.off\nbathtub/train/bathtub_0029.off\nbathtub/train/bathtub_0030.off\nbathtub/train/bathtub_0031.off\nbathtub/train/bathtub_0032.off\nbathtub/train/bathtub_0033.off\nbathtub/train/bathtub_0034.off\nbathtub/train/bathtub_0035.off\nbathtub/train/bathtub_0036.off\nbathtub/train/bathtub_0037.off\nbathtub/train/bathtub_0038.off\nbathtub/train/bathtub_0039.off\nbathtub/train/bathtub_0040.off\nbathtub/train/bathtub_0041.off\nbathtub/train/bathtub_0042.off\nbathtub/train/bathtub_0043.off\nbathtub/train/bathtub_0044.off\nbathtub/train/bathtub_0045.off\nbathtub/train/bathtub_0046.off\nbathtub/train/bathtub_0047.off\nbathtub/train/bathtub_0048.off\nbathtub/train/bathtub_0049.off\nbathtub/train/bathtub_0050.off\nbathtub/train/bathtub_0051.off\nbathtub/train/bathtub_0052.off\nbathtub/train/bathtub_0053.off\nbathtub/train/bathtub_0054.off\nbathtub/train/bathtub_0055.off\nbathtub/train/bathtub_0056.off\nbathtub/train/bathtub_0057.off\nbathtub/train/bathtub_0058.off\nbathtub/train/bathtub_0059.off\nbathtub/train/bathtub_0060.off\nbathtub/train/bathtub_0061.off\nbathtub/train/bathtub_0062.off\nbathtub/train/bathtub_0063.off\nbathtub/train/bathtub_0064.off\nbathtub/train/bathtub_0065.off\nbathtub/train/bathtub_0066.off\nbathtub/train/bathtub_0067.off\nbathtub/train/bathtub_0068.off\nbathtub/train/bathtub_0069.off\nbathtub/train/bathtub_0070.off\nbathtub/train/bathtub_0071.off\nbathtub/train/bathtub_0072.off\nbathtub/train/bathtub_0073.off\nbathtub/train/bathtub_0074.off\nbathtub/train/bathtub_0075.off\nbathtub/train/bathtub_0076.off\nbathtub/train/bathtub_0077.off\nbathtub/train/bathtub_0078.off\nbathtub/train/bathtub_0079.off\nbathtub/train/bathtub_0080.off\nbathtub/train/bathtub_0081.off\nbathtub/train/bathtub_0082.off\nbathtub/train/bathtub_0083.off\nbathtub/train/bathtub_0084.off\nbathtub/train/bathtub_0085.off\nbathtub/train/bathtub_0086.off\nbathtub/train/bathtub_0087.off\nbathtub/train/bathtub_0088.off\nbathtub/train/bathtub_0089.off\nbathtub/train/bathtub_0090.off\nbathtub/train/bathtub_0091.off\nbathtub/train/bathtub_0092.off\nbathtub/train/bathtub_0093.off\nbathtub/train/bathtub_0094.off\nbathtub/train/bathtub_0095.off\nbathtub/train/bathtub_0096.off\nmonitor/train/monitor_0001.off\nmonitor/train/monitor_0002.off\nmonitor/train/monitor_0003.off\nmonitor/train/monitor_0004.off\nmonitor/train/monitor_0005.off\nmonitor/train/monitor_0006.off\nmonitor/train/monitor_0007.off\nmonitor/train/monitor_0008.off\nmonitor/train/monitor_0009.off\nmonitor/train/monitor_0010.off\nmonitor/train/monitor_0011.off\nmonitor/train/monitor_0012.off\nmonitor/train/monitor_0013.off\nmonitor/train/monitor_0014.off\nmonitor/train/monitor_0015.off\nmonitor/train/monitor_0016.off\nmonitor/train/monitor_0017.off\nmonitor/train/monitor_0018.off\nmonitor/train/monitor_0019.off\nmonitor/train/monitor_0020.off\nmonitor/train/monitor_0021.off\nmonitor/train/monitor_0022.off\nmonitor/train/monitor_0023.off\nmonitor/train/monitor_0024.off\nmonitor/train/monitor_0025.off\nmonitor/train/monitor_0026.off\nmonitor/train/monitor_0027.off\nmonitor/train/monitor_0028.off\nmonitor/train/monitor_0029.off\nmonitor/train/monitor_0030.off\nmonitor/train/monitor_0031.off\nmonitor/train/monitor_0032.off\nmonitor/train/monitor_0033.off\nmonitor/train/monitor_0034.off\nmonitor/train/monitor_0035.off\nmonitor/train/monitor_0036.off\nmonitor/train/monitor_0037.off\nmonitor/train/monitor_0038.off\nmonitor/train/monitor_0039.off\nmonitor/train/monitor_0040.off\nmonitor/train/monitor_0041.off\nmonitor/train/monitor_0042.off\nmonitor/train/monitor_0043.off\nmonitor/train/monitor_0044.off\nmonitor/train/monitor_0045.off\nmonitor/train/monitor_0046.off\nmonitor/train/monitor_0047.off\nmonitor/train/monitor_0048.off\nmonitor/train/monitor_0049.off\nmonitor/train/monitor_0050.off\nmonitor/train/monitor_0051.off\nmonitor/train/monitor_0052.off\nmonitor/train/monitor_0053.off\nmonitor/train/monitor_0054.off\nmonitor/train/monitor_0055.off\nmonitor/train/monitor_0056.off\nmonitor/train/monitor_0057.off\nmonitor/train/monitor_0058.off\nmonitor/train/monitor_0059.off\nmonitor/train/monitor_0060.off\nmonitor/train/monitor_0061.off\nmonitor/train/monitor_0062.off\nmonitor/train/monitor_0063.off\nmonitor/train/monitor_0064.off\nmonitor/train/monitor_0065.off\nmonitor/train/monitor_0066.off\nmonitor/train/monitor_0067.off\nmonitor/train/monitor_0068.off\nmonitor/train/monitor_0069.off\nmonitor/train/monitor_0070.off\nmonitor/train/monitor_0071.off\nmonitor/train/monitor_0072.off\nmonitor/train/monitor_0073.off\nmonitor/train/monitor_0074.off\nmonitor/train/monitor_0075.off\nmonitor/train/monitor_0076.off\nmonitor/train/monitor_0077.off\nmonitor/train/monitor_0078.off\nmonitor/train/monitor_0079.off\nmonitor/train/monitor_0080.off\nmonitor/train/monitor_0081.off\nmonitor/train/monitor_0082.off\nmonitor/train/monitor_0083.off\nmonitor/train/monitor_0084.off\nmonitor/train/monitor_0085.off\nmonitor/train/monitor_0086.off\nmonitor/train/monitor_0087.off\nmonitor/train/monitor_0088.off\nmonitor/train/monitor_0089.off\nmonitor/train/monitor_0090.off\nmonitor/train/monitor_0091.off\nmonitor/train/monitor_0092.off\nmonitor/train/monitor_0093.off\nmonitor/train/monitor_0094.off\nmonitor/train/monitor_0095.off\nmonitor/train/monitor_0096.off\nmonitor/train/monitor_0097.off\nmonitor/train/monitor_0098.off\nmonitor/train/monitor_0099.off\nmonitor/train/monitor_0100.off\nmonitor/train/monitor_0101.off\nmonitor/train/monitor_0102.off\nmonitor/train/monitor_0103.off\nmonitor/train/monitor_0104.off\nmonitor/train/monitor_0105.off\nmonitor/train/monitor_0106.off\nmonitor/train/monitor_0107.off\nmonitor/train/monitor_0108.off\nmonitor/train/monitor_0109.off\nmonitor/train/monitor_0110.off\nmonitor/train/monitor_0111.off\nmonitor/train/monitor_0112.off\nmonitor/train/monitor_0113.off\nmonitor/train/monitor_0114.off\nmonitor/train/monitor_0115.off\nmonitor/train/monitor_0116.off\nmonitor/train/monitor_0117.off\nmonitor/train/monitor_0118.off\nmonitor/train/monitor_0119.off\nmonitor/train/monitor_0120.off\nmonitor/train/monitor_0121.off\nmonitor/train/monitor_0122.off\nmonitor/train/monitor_0123.off\nmonitor/train/monitor_0124.off\nmonitor/train/monitor_0125.off\nmonitor/train/monitor_0126.off\nmonitor/train/monitor_0127.off\nmonitor/train/monitor_0128.off\nmonitor/train/monitor_0129.off\nmonitor/train/monitor_0130.off\nmonitor/train/monitor_0131.off\nmonitor/train/monitor_0132.off\nmonitor/train/monitor_0133.off\nmonitor/train/monitor_0134.off\nmonitor/train/monitor_0135.off\nmonitor/train/monitor_0136.off\nmonitor/train/monitor_0137.off\nmonitor/train/monitor_0138.off\nmonitor/train/monitor_0139.off\nmonitor/train/monitor_0140.off\nmonitor/train/monitor_0141.off\nmonitor/train/monitor_0142.off\nmonitor/train/monitor_0143.off\nmonitor/train/monitor_0144.off\nmonitor/train/monitor_0145.off\nmonitor/train/monitor_0146.off\nmonitor/train/monitor_0147.off\nmonitor/train/monitor_0148.off\nmonitor/train/monitor_0149.off\nmonitor/train/monitor_0150.off\nmonitor/train/monitor_0151.off\nmonitor/train/monitor_0152.off\nmonitor/train/monitor_0153.off\nmonitor/train/monitor_0154.off\nmonitor/train/monitor_0155.off\nmonitor/train/monitor_0156.off\nmonitor/train/monitor_0157.off\nmonitor/train/monitor_0158.off\nmonitor/train/monitor_0159.off\nmonitor/train/monitor_0160.off\nmonitor/train/monitor_0161.off\nmonitor/train/monitor_0162.off\nmonitor/train/monitor_0163.off\nmonitor/train/monitor_0164.off\nmonitor/train/monitor_0165.off\nmonitor/train/monitor_0166.off\nmonitor/train/monitor_0167.off\nmonitor/train/monitor_0168.off\nmonitor/train/monitor_0169.off\nmonitor/train/monitor_0170.off\nmonitor/train/monitor_0171.off\nmonitor/train/monitor_0172.off\nmonitor/train/monitor_0173.off\nmonitor/train/monitor_0174.off\nmonitor/train/monitor_0175.off\nmonitor/train/monitor_0176.off\nmonitor/train/monitor_0177.off\nmonitor/train/monitor_0178.off\nmonitor/train/monitor_0179.off\nmonitor/train/monitor_0180.off\nmonitor/train/monitor_0181.off\nmonitor/train/monitor_0182.off\nmonitor/train/monitor_0183.off\nmonitor/train/monitor_0184.off\nmonitor/train/monitor_0185.off\nmonitor/train/monitor_0186.off\nmonitor/train/monitor_0187.off\nmonitor/train/monitor_0188.off\nmonitor/train/monitor_0189.off\nmonitor/train/monitor_0190.off\nmonitor/train/monitor_0191.off\nmonitor/train/monitor_0192.off\nmonitor/train/monitor_0193.off\nmonitor/train/monitor_0194.off\nmonitor/train/monitor_0195.off\nmonitor/train/monitor_0196.off\nmonitor/train/monitor_0197.off\nmonitor/train/monitor_0198.off\nmonitor/train/monitor_0199.off\nmonitor/train/monitor_0200.off\nmonitor/train/monitor_0201.off\nmonitor/train/monitor_0202.off\nmonitor/train/monitor_0203.off\nmonitor/train/monitor_0204.off\nmonitor/train/monitor_0205.off\nmonitor/train/monitor_0206.off\nmonitor/train/monitor_0207.off\nmonitor/train/monitor_0208.off\nmonitor/train/monitor_0209.off\nmonitor/train/monitor_0210.off\nmonitor/train/monitor_0211.off\nmonitor/train/monitor_0212.off\nmonitor/train/monitor_0213.off\nmonitor/train/monitor_0214.off\nmonitor/train/monitor_0215.off\nmonitor/train/monitor_0216.off\nmonitor/train/monitor_0217.off\nmonitor/train/monitor_0218.off\nmonitor/train/monitor_0219.off\nmonitor/train/monitor_0220.off\nmonitor/train/monitor_0221.off\nmonitor/train/monitor_0222.off\nmonitor/train/monitor_0223.off\nmonitor/train/monitor_0224.off\nmonitor/train/monitor_0225.off\nmonitor/train/monitor_0226.off\nmonitor/train/monitor_0227.off\nmonitor/train/monitor_0228.off\nmonitor/train/monitor_0229.off\nmonitor/train/monitor_0230.off\nmonitor/train/monitor_0231.off\nmonitor/train/monitor_0232.off\nmonitor/train/monitor_0233.off\nmonitor/train/monitor_0234.off\nmonitor/train/monitor_0235.off\nmonitor/train/monitor_0236.off\nmonitor/train/monitor_0237.off\nmonitor/train/monitor_0238.off\nmonitor/train/monitor_0239.off\nmonitor/train/monitor_0240.off\nmonitor/train/monitor_0241.off\nmonitor/train/monitor_0242.off\nmonitor/train/monitor_0243.off\nmonitor/train/monitor_0244.off\nmonitor/train/monitor_0245.off\nmonitor/train/monitor_0246.off\nmonitor/train/monitor_0247.off\nmonitor/train/monitor_0248.off\nmonitor/train/monitor_0249.off\nmonitor/train/monitor_0250.off\nmonitor/train/monitor_0251.off\nmonitor/train/monitor_0252.off\nmonitor/train/monitor_0253.off\nmonitor/train/monitor_0254.off\nmonitor/train/monitor_0255.off\nmonitor/train/monitor_0256.off\nmonitor/train/monitor_0257.off\nmonitor/train/monitor_0258.off\nmonitor/train/monitor_0259.off\nmonitor/train/monitor_0260.off\nmonitor/train/monitor_0261.off\nmonitor/train/monitor_0262.off\nmonitor/train/monitor_0263.off\nmonitor/train/monitor_0264.off\nmonitor/train/monitor_0265.off\nmonitor/train/monitor_0266.off\nmonitor/train/monitor_0267.off\nmonitor/train/monitor_0268.off\nmonitor/train/monitor_0269.off\nmonitor/train/monitor_0270.off\nmonitor/train/monitor_0271.off\nmonitor/train/monitor_0272.off\nmonitor/train/monitor_0273.off\nmonitor/train/monitor_0274.off\nmonitor/train/monitor_0275.off\nmonitor/train/monitor_0276.off\nmonitor/train/monitor_0277.off\nmonitor/train/monitor_0278.off\nmonitor/train/monitor_0279.off\nmonitor/train/monitor_0280.off\nmonitor/train/monitor_0281.off\nmonitor/train/monitor_0282.off\nmonitor/train/monitor_0283.off\nmonitor/train/monitor_0284.off\nmonitor/train/monitor_0285.off\nmonitor/train/monitor_0286.off\nmonitor/train/monitor_0287.off\nmonitor/train/monitor_0288.off\nmonitor/train/monitor_0289.off\nmonitor/train/monitor_0290.off\nmonitor/train/monitor_0291.off\nmonitor/train/monitor_0292.off\nmonitor/train/monitor_0293.off\nmonitor/train/monitor_0294.off\nmonitor/train/monitor_0295.off\nmonitor/train/monitor_0296.off\nmonitor/train/monitor_0297.off\nmonitor/train/monitor_0298.off\nmonitor/train/monitor_0299.off\nmonitor/train/monitor_0300.off\nmonitor/train/monitor_0301.off\nmonitor/train/monitor_0302.off\nmonitor/train/monitor_0303.off\nmonitor/train/monitor_0304.off\nmonitor/train/monitor_0305.off\nmonitor/train/monitor_0306.off\nmonitor/train/monitor_0307.off\nmonitor/train/monitor_0308.off\nmonitor/train/monitor_0309.off\nmonitor/train/monitor_0310.off\nmonitor/train/monitor_0311.off\nmonitor/train/monitor_0312.off\nmonitor/train/monitor_0313.off\nmonitor/train/monitor_0314.off\nmonitor/train/monitor_0315.off\nmonitor/train/monitor_0316.off\nmonitor/train/monitor_0317.off\nmonitor/train/monitor_0318.off\nmonitor/train/monitor_0319.off\nmonitor/train/monitor_0320.off\nmonitor/train/monitor_0321.off\nmonitor/train/monitor_0322.off\nmonitor/train/monitor_0323.off\nmonitor/train/monitor_0324.off\nmonitor/train/monitor_0325.off\nmonitor/train/monitor_0326.off\nmonitor/train/monitor_0327.off\nmonitor/train/monitor_0328.off\nmonitor/train/monitor_0329.off\nmonitor/train/monitor_0330.off\nmonitor/train/monitor_0331.off\nmonitor/train/monitor_0332.off\nmonitor/train/monitor_0333.off\nmonitor/train/monitor_0334.off\nmonitor/train/monitor_0335.off\nmonitor/train/monitor_0336.off\nmonitor/train/monitor_0337.off\nmonitor/train/monitor_0338.off\nmonitor/train/monitor_0339.off\nmonitor/train/monitor_0340.off\nmonitor/train/monitor_0341.off\nmonitor/train/monitor_0342.off\nmonitor/train/monitor_0343.off\nmonitor/train/monitor_0344.off\nmonitor/train/monitor_0345.off\nmonitor/train/monitor_0346.off\nmonitor/train/monitor_0347.off\nmonitor/train/monitor_0348.off\nmonitor/train/monitor_0349.off\nmonitor/train/monitor_0350.off\nmonitor/train/monitor_0351.off\nmonitor/train/monitor_0352.off\nmonitor/train/monitor_0353.off\nmonitor/train/monitor_0354.off\nmonitor/train/monitor_0355.off\nmonitor/train/monitor_0356.off\nmonitor/train/monitor_0357.off\nmonitor/train/monitor_0358.off\nmonitor/train/monitor_0359.off\nmonitor/train/monitor_0360.off\nmonitor/train/monitor_0361.off\nmonitor/train/monitor_0362.off\nmonitor/train/monitor_0363.off\nmonitor/train/monitor_0364.off\nmonitor/train/monitor_0365.off\nmonitor/train/monitor_0366.off\nmonitor/train/monitor_0367.off\nmonitor/train/monitor_0368.off\nmonitor/train/monitor_0369.off\nmonitor/train/monitor_0370.off\nmonitor/train/monitor_0371.off\nmonitor/train/monitor_0372.off\nmonitor/train/monitor_0373.off\nmonitor/train/monitor_0374.off\nmonitor/train/monitor_0375.off\nmonitor/train/monitor_0376.off\nmonitor/train/monitor_0377.off\nmonitor/train/monitor_0378.off\nmonitor/train/monitor_0379.off\nmonitor/train/monitor_0380.off\nmonitor/train/monitor_0381.off\nmonitor/train/monitor_0382.off\nmonitor/train/monitor_0383.off\nmonitor/train/monitor_0384.off\nmonitor/train/monitor_0385.off\nmonitor/train/monitor_0386.off\nmonitor/train/monitor_0387.off\nmonitor/train/monitor_0388.off\nmonitor/train/monitor_0389.off\nmonitor/train/monitor_0390.off\nmonitor/train/monitor_0391.off\nmonitor/train/monitor_0392.off\nmonitor/train/monitor_0393.off\nmonitor/train/monitor_0394.off\nmonitor/train/monitor_0395.off\nmonitor/train/monitor_0396.off\nmonitor/train/monitor_0397.off\nmonitor/train/monitor_0398.off\nmonitor/train/monitor_0399.off\nmonitor/train/monitor_0400.off\nmonitor/train/monitor_0401.off\nmonitor/train/monitor_0402.off\nmonitor/train/monitor_0403.off\nmonitor/train/monitor_0404.off\nmonitor/train/monitor_0405.off\nmonitor/train/monitor_0406.off\nmonitor/train/monitor_0407.off\nmonitor/train/monitor_0408.off\nmonitor/train/monitor_0409.off\nmonitor/train/monitor_0410.off\nmonitor/train/monitor_0411.off\nmonitor/train/monitor_0412.off\nmonitor/train/monitor_0413.off\nmonitor/train/monitor_0414.off\nmonitor/train/monitor_0415.off\nmonitor/train/monitor_0416.off\nmonitor/train/monitor_0417.off\nmonitor/train/monitor_0418.off\nmonitor/train/monitor_0419.off\nbottle/train/bottle_0001.off\nbottle/train/bottle_0002.off\nbottle/train/bottle_0003.off\nbottle/train/bottle_0004.off\nbottle/train/bottle_0005.off\nbottle/train/bottle_0006.off\nbottle/train/bottle_0007.off\nbottle/train/bottle_0008.off\nbottle/train/bottle_0009.off\nbottle/train/bottle_0010.off\nbottle/train/bottle_0011.off\nbottle/train/bottle_0012.off\nbottle/train/bottle_0013.off\nbottle/train/bottle_0014.off\nbottle/train/bottle_0015.off\nbottle/train/bottle_0016.off\nbottle/train/bottle_0017.off\nbottle/train/bottle_0018.off\nbottle/train/bottle_0019.off\nbottle/train/bottle_0020.off\nbottle/train/bottle_0021.off\nbottle/train/bottle_0022.off\nbottle/train/bottle_0023.off\nbottle/train/bottle_0024.off\nbottle/train/bottle_0025.off\nbottle/train/bottle_0026.off\nbottle/train/bottle_0027.off\nbottle/train/bottle_0028.off\nbottle/train/bottle_0029.off\nbottle/train/bottle_0030.off\nbottle/train/bottle_0031.off\nbottle/train/bottle_0032.off\nbottle/train/bottle_0033.off\nbottle/train/bottle_0034.off\nbottle/train/bottle_0035.off\nbottle/train/bottle_0036.off\nbottle/train/bottle_0037.off\nbottle/train/bottle_0038.off\nbottle/train/bottle_0039.off\nbottle/train/bottle_0040.off\nbottle/train/bottle_0041.off\nbottle/train/bottle_0042.off\nbottle/train/bottle_0043.off\nbottle/train/bottle_0044.off\nbottle/train/bottle_0045.off\nbottle/train/bottle_0046.off\nbottle/train/bottle_0047.off\nbottle/train/bottle_0048.off\nbottle/train/bottle_0049.off\nbottle/train/bottle_0050.off\nbottle/train/bottle_0051.off\nbottle/train/bottle_0052.off\nbottle/train/bottle_0053.off\nbottle/train/bottle_0054.off\nbottle/train/bottle_0055.off\nbottle/train/bottle_0056.off\nbottle/train/bottle_0057.off\nbottle/train/bottle_0058.off\nbottle/train/bottle_0059.off\nbottle/train/bottle_0060.off\nbottle/train/bottle_0061.off\nbottle/train/bottle_0062.off\nbottle/train/bottle_0063.off\nbottle/train/bottle_0064.off\nbottle/train/bottle_0065.off\nbottle/train/bottle_0066.off\nbottle/train/bottle_0067.off\nbottle/train/bottle_0068.off\nbottle/train/bottle_0069.off\nbottle/train/bottle_0070.off\nbottle/train/bottle_0071.off\nbottle/train/bottle_0072.off\nbottle/train/bottle_0073.off\nbottle/train/bottle_0074.off\nbottle/train/bottle_0075.off\nbottle/train/bottle_0076.off\nbottle/train/bottle_0077.off\nbottle/train/bottle_0078.off\nbottle/train/bottle_0079.off\nbottle/train/bottle_0080.off\nbottle/train/bottle_0081.off\nbottle/train/bottle_0082.off\nbottle/train/bottle_0083.off\nbottle/train/bottle_0084.off\nbottle/train/bottle_0085.off\nbottle/train/bottle_0086.off\nbottle/train/bottle_0087.off\nbottle/train/bottle_0088.off\nbottle/train/bottle_0089.off\nbottle/train/bottle_0090.off\nbottle/train/bottle_0091.off\nbottle/train/bottle_0092.off\nbottle/train/bottle_0093.off\nbottle/train/bottle_0094.off\nbottle/train/bottle_0095.off\nbottle/train/bottle_0096.off\nbottle/train/bottle_0097.off\nbottle/train/bottle_0098.off\nbottle/train/bottle_0099.off\nbottle/train/bottle_0100.off\nbottle/train/bottle_0101.off\nbottle/train/bottle_0102.off\nbottle/train/bottle_0103.off\nbottle/train/bottle_0104.off\nbottle/train/bottle_0105.off\nbottle/train/bottle_0106.off\nbottle/train/bottle_0107.off\nbottle/train/bottle_0108.off\nbottle/train/bottle_0109.off\nbottle/train/bottle_0110.off\nbottle/train/bottle_0111.off\nbottle/train/bottle_0112.off\nbottle/train/bottle_0113.off\nbottle/train/bottle_0114.off\nbottle/train/bottle_0115.off\nbottle/train/bottle_0116.off\nbottle/train/bottle_0117.off\nbottle/train/bottle_0118.off\nbottle/train/bottle_0119.off\nbottle/train/bottle_0120.off\nbottle/train/bottle_0121.off\nbottle/train/bottle_0122.off\nbottle/train/bottle_0123.off\nbottle/train/bottle_0124.off\nbottle/train/bottle_0125.off\nbottle/train/bottle_0126.off\nbottle/train/bottle_0127.off\nbottle/train/bottle_0128.off\nbottle/train/bottle_0129.off\nbottle/train/bottle_0130.off\nbottle/train/bottle_0131.off\nbottle/train/bottle_0132.off\nbottle/train/bottle_0133.off\nbottle/train/bottle_0134.off\nbottle/train/bottle_0135.off\nbottle/train/bottle_0136.off\nbottle/train/bottle_0137.off\nbottle/train/bottle_0138.off\nbottle/train/bottle_0139.off\nbottle/train/bottle_0140.off\nbottle/train/bottle_0141.off\nbottle/train/bottle_0142.off\nbottle/train/bottle_0143.off\nbottle/train/bottle_0144.off\nbottle/train/bottle_0145.off\nbottle/train/bottle_0146.off\nbottle/train/bottle_0147.off\nbottle/train/bottle_0148.off\nbottle/train/bottle_0149.off\nbottle/train/bottle_0150.off\nbottle/train/bottle_0151.off\nbottle/train/bottle_0152.off\nbottle/train/bottle_0153.off\nbottle/train/bottle_0154.off\nbottle/train/bottle_0155.off\nbottle/train/bottle_0156.off\nbottle/train/bottle_0157.off\nbottle/train/bottle_0158.off\nbottle/train/bottle_0159.off\nbottle/train/bottle_0160.off\nbottle/train/bottle_0161.off\nbottle/train/bottle_0162.off\nbottle/train/bottle_0163.off\nbottle/train/bottle_0164.off\nbottle/train/bottle_0165.off\nbottle/train/bottle_0166.off\nbottle/train/bottle_0167.off\nbottle/train/bottle_0168.off\nbottle/train/bottle_0169.off\nbottle/train/bottle_0170.off\nbottle/train/bottle_0171.off\nbottle/train/bottle_0172.off\nbottle/train/bottle_0173.off\nbottle/train/bottle_0174.off\nbottle/train/bottle_0175.off\nbottle/train/bottle_0176.off\nbottle/train/bottle_0177.off\nbottle/train/bottle_0178.off\nbottle/train/bottle_0179.off\nbottle/train/bottle_0180.off\nbottle/train/bottle_0181.off\nbottle/train/bottle_0182.off\nbottle/train/bottle_0183.off\nbottle/train/bottle_0184.off\nbottle/train/bottle_0185.off\nbottle/train/bottle_0186.off\nbottle/train/bottle_0187.off\nbottle/train/bottle_0188.off\nbottle/train/bottle_0189.off\nbottle/train/bottle_0190.off\nbottle/train/bottle_0191.off\nbottle/train/bottle_0192.off\nbottle/train/bottle_0193.off\nbottle/train/bottle_0194.off\nbottle/train/bottle_0195.off\nbottle/train/bottle_0196.off\nbottle/train/bottle_0197.off\nbottle/train/bottle_0198.off\nbottle/train/bottle_0199.off\nbottle/train/bottle_0200.off\nbottle/train/bottle_0201.off\nbottle/train/bottle_0202.off\nbottle/train/bottle_0203.off\nbottle/train/bottle_0204.off\nbottle/train/bottle_0205.off\nbottle/train/bottle_0206.off\nbottle/train/bottle_0207.off\nbottle/train/bottle_0208.off\nbottle/train/bottle_0209.off\nbottle/train/bottle_0210.off\nbottle/train/bottle_0211.off\nbottle/train/bottle_0212.off\nbottle/train/bottle_0213.off\nbottle/train/bottle_0214.off\nbottle/train/bottle_0215.off\nbottle/train/bottle_0216.off\nbottle/train/bottle_0217.off\nbottle/train/bottle_0218.off\nbottle/train/bottle_0219.off\nbottle/train/bottle_0220.off\nbottle/train/bottle_0221.off\nbottle/train/bottle_0222.off\nbottle/train/bottle_0223.off\nbottle/train/bottle_0224.off\nbottle/train/bottle_0225.off\nbottle/train/bottle_0226.off\nbottle/train/bottle_0227.off\nbottle/train/bottle_0228.off\nbottle/train/bottle_0229.off\nbottle/train/bottle_0230.off\nbottle/train/bottle_0231.off\nbottle/train/bottle_0232.off\nbottle/train/bottle_0233.off\nbottle/train/bottle_0234.off\nbottle/train/bottle_0235.off\nbottle/train/bottle_0236.off\nbottle/train/bottle_0237.off\nbottle/train/bottle_0238.off\nbottle/train/bottle_0239.off\nbottle/train/bottle_0240.off\nbottle/train/bottle_0241.off\nbottle/train/bottle_0242.off\nbottle/train/bottle_0243.off\nbottle/train/bottle_0244.off\nbottle/train/bottle_0245.off\nbottle/train/bottle_0246.off\nbottle/train/bottle_0247.off\nbottle/train/bottle_0248.off\nbottle/train/bottle_0249.off\nbottle/train/bottle_0250.off\nbottle/train/bottle_0251.off\nbottle/train/bottle_0252.off\nbottle/train/bottle_0253.off\nbottle/train/bottle_0254.off\nbottle/train/bottle_0255.off\nbottle/train/bottle_0256.off\nbottle/train/bottle_0257.off\nbottle/train/bottle_0258.off\nbottle/train/bottle_0259.off\nbottle/train/bottle_0260.off\nbottle/train/bottle_0261.off\nbottle/train/bottle_0262.off\nbottle/train/bottle_0263.off\nbottle/train/bottle_0264.off\nbottle/train/bottle_0265.off\nbottle/train/bottle_0266.off\nbottle/train/bottle_0267.off\nbottle/train/bottle_0268.off\nbottle/train/bottle_0269.off\nbottle/train/bottle_0270.off\nbottle/train/bottle_0271.off\nbottle/train/bottle_0272.off\nbottle/train/bottle_0273.off\nbottle/train/bottle_0274.off\nbottle/train/bottle_0275.off\nbottle/train/bottle_0276.off\nbottle/train/bottle_0277.off\nbottle/train/bottle_0278.off\nbottle/train/bottle_0279.off\nbottle/train/bottle_0280.off\nbottle/train/bottle_0281.off\nbottle/train/bottle_0282.off\nbottle/train/bottle_0283.off\nbottle/train/bottle_0284.off\nbottle/train/bottle_0285.off\nbottle/train/bottle_0286.off\nbottle/train/bottle_0287.off\nbottle/train/bottle_0288.off\nbottle/train/bottle_0289.off\nbottle/train/bottle_0290.off\nbottle/train/bottle_0291.off\nbottle/train/bottle_0292.off\nbottle/train/bottle_0293.off\nbottle/train/bottle_0294.off\nbottle/train/bottle_0295.off\nbottle/train/bottle_0296.off\nbottle/train/bottle_0297.off\nbottle/train/bottle_0298.off\nbottle/train/bottle_0299.off\nbottle/train/bottle_0300.off\nbottle/train/bottle_0301.off\nbottle/train/bottle_0302.off\nbowl/train/bowl_0001.off\nbowl/train/bowl_0002.off\nbowl/train/bowl_0003.off\nbowl/train/bowl_0004.off\nbowl/train/bowl_0005.off\nbowl/train/bowl_0006.off\nbowl/train/bowl_0007.off\nbowl/train/bowl_0008.off\nbowl/train/bowl_0009.off\nbowl/train/bowl_0010.off\nbowl/train/bowl_0011.off\nbowl/train/bowl_0012.off\nbowl/train/bowl_0013.off\nbowl/train/bowl_0014.off\nbowl/train/bowl_0015.off\nbowl/train/bowl_0016.off\nbowl/train/bowl_0017.off\nbowl/train/bowl_0018.off\nbowl/train/bowl_0019.off\nbowl/train/bowl_0020.off\nbowl/train/bowl_0021.off\nbowl/train/bowl_0022.off\nbowl/train/bowl_0023.off\nbowl/train/bowl_0024.off\nbowl/train/bowl_0025.off\nbowl/train/bowl_0026.off\nbowl/train/bowl_0027.off\nbowl/train/bowl_0028.off\nbowl/train/bowl_0029.off\nbowl/train/bowl_0030.off\nbowl/train/bowl_0031.off\nbowl/train/bowl_0032.off\nbowl/train/bowl_0033.off\nbowl/train/bowl_0034.off\nbowl/train/bowl_0035.off\nbowl/train/bowl_0036.off\nbowl/train/bowl_0037.off\nbowl/train/bowl_0038.off\nbowl/train/bowl_0039.off\nbowl/train/bowl_0040.off\nbowl/train/bowl_0041.off\nbowl/train/bowl_0042.off\nbowl/train/bowl_0043.off\nbowl/train/bowl_0044.off\nbowl/train/bowl_0045.off\nbowl/train/bowl_0046.off\nbowl/train/bowl_0047.off\nbowl/train/bowl_0048.off\nbowl/train/bowl_0049.off\nbowl/train/bowl_0050.off\nbowl/train/bowl_0051.off\nbowl/train/bowl_0052.off\nbowl/train/bowl_0053.off\nbowl/train/bowl_0054.off\nbowl/train/bowl_0055.off\nbowl/train/bowl_0056.off\nbowl/train/bowl_0057.off\nbowl/train/bowl_0058.off\nkeyboard/train/keyboard_0001.off\nkeyboard/train/keyboard_0002.off\nkeyboard/train/keyboard_0003.off\nkeyboard/train/keyboard_0004.off\nkeyboard/train/keyboard_0005.off\nkeyboard/train/keyboard_0006.off\nkeyboard/train/keyboard_0007.off\nkeyboard/train/keyboard_0008.off\nkeyboard/train/keyboard_0009.off\nkeyboard/train/keyboard_0010.off\nkeyboard/train/keyboard_0011.off\nkeyboard/train/keyboard_0012.off\nkeyboard/train/keyboard_0013.off\nkeyboard/train/keyboard_0014.off\nkeyboard/train/keyboard_0015.off\nkeyboard/train/keyboard_0016.off\nkeyboard/train/keyboard_0017.off\nkeyboard/train/keyboard_0018.off\nkeyboard/train/keyboard_0019.off\nkeyboard/train/keyboard_0020.off\nkeyboard/train/keyboard_0021.off\nkeyboard/train/keyboard_0022.off\nkeyboard/train/keyboard_0023.off\nkeyboard/train/keyboard_0024.off\nkeyboard/train/keyboard_0025.off\nkeyboard/train/keyboard_0026.off\nkeyboard/train/keyboard_0027.off\nkeyboard/train/keyboard_0028.off\nkeyboard/train/keyboard_0029.off\nkeyboard/train/keyboard_0030.off\nkeyboard/train/keyboard_0031.off\nkeyboard/train/keyboard_0032.off\nkeyboard/train/keyboard_0033.off\nkeyboard/train/keyboard_0034.off\nkeyboard/train/keyboard_0035.off\nkeyboard/train/keyboard_0036.off\nkeyboard/train/keyboard_0037.off\nkeyboard/train/keyboard_0038.off\nkeyboard/train/keyboard_0039.off\nkeyboard/train/keyboard_0040.off\nkeyboard/train/keyboard_0041.off\nkeyboard/train/keyboard_0042.off\nkeyboard/train/keyboard_0043.off\nkeyboard/train/keyboard_0044.off\nkeyboard/train/keyboard_0045.off\nkeyboard/train/keyboard_0046.off\nkeyboard/train/keyboard_0047.off\nkeyboard/train/keyboard_0048.off\nkeyboard/train/keyboard_0049.off\nkeyboard/train/keyboard_0050.off\nkeyboard/train/keyboard_0051.off\nkeyboard/train/keyboard_0052.off\nkeyboard/train/keyboard_0053.off\nkeyboard/train/keyboard_0054.off\nkeyboard/train/keyboard_0055.off\nkeyboard/train/keyboard_0056.off\nkeyboard/train/keyboard_0057.off\nkeyboard/train/keyboard_0058.off\nkeyboard/train/keyboard_0059.off\nkeyboard/train/keyboard_0060.off\nkeyboard/train/keyboard_0061.off\nkeyboard/train/keyboard_0062.off\nkeyboard/train/keyboard_0063.off\nkeyboard/train/keyboard_0064.off\nkeyboard/train/keyboard_0065.off\nkeyboard/train/keyboard_0066.off\nkeyboard/train/keyboard_0067.off\nkeyboard/train/keyboard_0068.off\nkeyboard/train/keyboard_0069.off\nkeyboard/train/keyboard_0070.off\nkeyboard/train/keyboard_0071.off\nkeyboard/train/keyboard_0072.off\nkeyboard/train/keyboard_0073.off\nkeyboard/train/keyboard_0074.off\nkeyboard/train/keyboard_0075.off\nkeyboard/train/keyboard_0076.off\nkeyboard/train/keyboard_0077.off\nkeyboard/train/keyboard_0078.off\nkeyboard/train/keyboard_0079.off\nkeyboard/train/keyboard_0080.off\nkeyboard/train/keyboard_0081.off\nkeyboard/train/keyboard_0082.off\nkeyboard/train/keyboard_0083.off\nkeyboard/train/keyboard_0084.off\nkeyboard/train/keyboard_0085.off\nkeyboard/train/keyboard_0086.off\nkeyboard/train/keyboard_0087.off\nkeyboard/train/keyboard_0088.off\nkeyboard/train/keyboard_0089.off\nkeyboard/train/keyboard_0090.off\nkeyboard/train/keyboard_0091.off\nkeyboard/train/keyboard_0092.off\nkeyboard/train/keyboard_0093.off\nkeyboard/train/keyboard_0094.off\nkeyboard/train/keyboard_0095.off\nkeyboard/train/keyboard_0096.off\nkeyboard/train/keyboard_0097.off\nkeyboard/train/keyboard_0098.off\nkeyboard/train/keyboard_0099.off\nkeyboard/train/keyboard_0100.off\nkeyboard/train/keyboard_0101.off\nkeyboard/train/keyboard_0102.off\nkeyboard/train/keyboard_0103.off\nkeyboard/train/keyboard_0104.off\nkeyboard/train/keyboard_0105.off\nkeyboard/train/keyboard_0106.off\nkeyboard/train/keyboard_0107.off\nkeyboard/train/keyboard_0108.off\nkeyboard/train/keyboard_0109.off\nkeyboard/train/keyboard_0110.off\nkeyboard/train/keyboard_0111.off\nkeyboard/train/keyboard_0112.off\nkeyboard/train/keyboard_0113.off\nkeyboard/train/keyboard_0114.off\nkeyboard/train/keyboard_0115.off\nkeyboard/train/keyboard_0116.off\nkeyboard/train/keyboard_0117.off\nkeyboard/train/keyboard_0118.off\nkeyboard/train/keyboard_0119.off\nkeyboard/train/keyboard_0120.off\nkeyboard/train/keyboard_0121.off\nkeyboard/train/keyboard_0122.off\nkeyboard/train/keyboard_0123.off\nkeyboard/train/keyboard_0124.off\nkeyboard/train/keyboard_0125.off\nkeyboard/train/keyboard_0126.off\nkeyboard/train/keyboard_0127.off\nkeyboard/train/keyboard_0128.off\nkeyboard/train/keyboard_0129.off\nkeyboard/train/keyboard_0130.off\nkeyboard/train/keyboard_0131.off\ndesk/train/desk_0001.off\ndesk/train/desk_0002.off\ndesk/train/desk_0003.off\ndesk/train/desk_0004.off\ndesk/train/desk_0005.off\ndesk/train/desk_0006.off\ndesk/train/desk_0007.off\ndesk/train/desk_0008.off\ndesk/train/desk_0009.off\ndesk/train/desk_0010.off\ndesk/train/desk_0011.off\ndesk/train/desk_0012.off\ndesk/train/desk_0013.off\ndesk/train/desk_0014.off\ndesk/train/desk_0015.off\ndesk/train/desk_0016.off\ndesk/train/desk_0017.off\ndesk/train/desk_0018.off\ndesk/train/desk_0019.off\ndesk/train/desk_0020.off\ndesk/train/desk_0021.off\ndesk/train/desk_0022.off\ndesk/train/desk_0023.off\ndesk/train/desk_0024.off\ndesk/train/desk_0025.off\ndesk/train/desk_0026.off\ndesk/train/desk_0027.off\ndesk/train/desk_0028.off\ndesk/train/desk_0029.off\ndesk/train/desk_0030.off\ndesk/train/desk_0031.off\ndesk/train/desk_0032.off\ndesk/train/desk_0033.off\ndesk/train/desk_0034.off\ndesk/train/desk_0035.off\ndesk/train/desk_0036.off\ndesk/train/desk_0037.off\ndesk/train/desk_0038.off\ndesk/train/desk_0039.off\ndesk/train/desk_0040.off\ndesk/train/desk_0041.off\ndesk/train/desk_0042.off\ndesk/train/desk_0043.off\ndesk/train/desk_0044.off\ndesk/train/desk_0045.off\ndesk/train/desk_0046.off\ndesk/train/desk_0047.off\ndesk/train/desk_0048.off\ndesk/train/desk_0049.off\ndesk/train/desk_0050.off\ndesk/train/desk_0051.off\ndesk/train/desk_0052.off\ndesk/train/desk_0053.off\ndesk/train/desk_0054.off\ndesk/train/desk_0055.off\ndesk/train/desk_0056.off\ndesk/train/desk_0057.off\ndesk/train/desk_0058.off\ndesk/train/desk_0059.off\ndesk/train/desk_0060.off\ndesk/train/desk_0061.off\ndesk/train/desk_0062.off\ndesk/train/desk_0063.off\ndesk/train/desk_0064.off\ndesk/train/desk_0065.off\ndesk/train/desk_0066.off\ndesk/train/desk_0067.off\ndesk/train/desk_0068.off\ndesk/train/desk_0069.off\ndesk/train/desk_0070.off\ndesk/train/desk_0071.off\ndesk/train/desk_0072.off\ndesk/train/desk_0073.off\ndesk/train/desk_0074.off\ndesk/train/desk_0075.off\ndesk/train/desk_0076.off\ndesk/train/desk_0077.off\ndesk/train/desk_0078.off\ndesk/train/desk_0079.off\ndesk/train/desk_0080.off\ndesk/train/desk_0081.off\ndesk/train/desk_0082.off\ndesk/train/desk_0083.off\ndesk/train/desk_0084.off\ndesk/train/desk_0085.off\ndesk/train/desk_0086.off\ndesk/train/desk_0087.off\ndesk/train/desk_0088.off\ndesk/train/desk_0089.off\ndesk/train/desk_0090.off\ndesk/train/desk_0091.off\ndesk/train/desk_0092.off\ndesk/train/desk_0093.off\ndesk/train/desk_0094.off\ndesk/train/desk_0095.off\ndesk/train/desk_0096.off\ndesk/train/desk_0097.off\ndesk/train/desk_0098.off\ndesk/train/desk_0099.off\ndesk/train/desk_0100.off\ndesk/train/desk_0101.off\ndesk/train/desk_0102.off\ndesk/train/desk_0103.off\ndesk/train/desk_0104.off\ndesk/train/desk_0105.off\ndesk/train/desk_0106.off\ndesk/train/desk_0107.off\ndesk/train/desk_0108.off\ndesk/train/desk_0109.off\ndesk/train/desk_0110.off\ndesk/train/desk_0111.off\ndesk/train/desk_0112.off\ndesk/train/desk_0113.off\ndesk/train/desk_0114.off\ndesk/train/desk_0115.off\ndesk/train/desk_0116.off\ndesk/train/desk_0117.off\ndesk/train/desk_0118.off\ndesk/train/desk_0119.off\ndesk/train/desk_0120.off\ndesk/train/desk_0121.off\ndesk/train/desk_0122.off\ndesk/train/desk_0123.off\ndesk/train/desk_0124.off\ndesk/train/desk_0125.off\ndesk/train/desk_0126.off\ndesk/train/desk_0127.off\ndesk/train/desk_0128.off\ndesk/train/desk_0129.off\ndesk/train/desk_0130.off\ndesk/train/desk_0131.off\ndesk/train/desk_0132.off\ndesk/train/desk_0133.off\ndesk/train/desk_0134.off\ndesk/train/desk_0135.off\ndesk/train/desk_0136.off\ndesk/train/desk_0137.off\ndesk/train/desk_0138.off\ndesk/train/desk_0139.off\ndesk/train/desk_0140.off\ndesk/train/desk_0141.off\ndesk/train/desk_0142.off\ndesk/train/desk_0143.off\ndesk/train/desk_0144.off\ndesk/train/desk_0145.off\ndesk/train/desk_0146.off\ndesk/train/desk_0147.off\ndesk/train/desk_0148.off\ndesk/train/desk_0149.off\ndesk/train/desk_0150.off\ndesk/train/desk_0151.off\ndesk/train/desk_0152.off\ndesk/train/desk_0153.off\ndesk/train/desk_0154.off\ndesk/train/desk_0155.off\ndesk/train/desk_0156.off\ndesk/train/desk_0157.off\ndesk/train/desk_0158.off\ndesk/train/desk_0159.off\ndesk/train/desk_0160.off\ndesk/train/desk_0161.off\ndesk/train/desk_0162.off\ndesk/train/desk_0163.off\ndesk/train/desk_0164.off\ndesk/train/desk_0165.off\ndesk/train/desk_0166.off\ndesk/train/desk_0167.off\ndesk/train/desk_0168.off\ndesk/train/desk_0169.off\ndesk/train/desk_0170.off\ndesk/train/desk_0171.off\ndesk/train/desk_0172.off\ndesk/train/desk_0173.off\ndesk/train/desk_0174.off\ndesk/train/desk_0175.off\ndesk/train/desk_0176.off\ndesk/train/desk_0177.off\ndesk/train/desk_0178.off\ndesk/train/desk_0179.off\ndesk/train/desk_0180.off\nbed/train/bed_0001.off\nbed/train/bed_0002.off\nbed/train/bed_0003.off\nbed/train/bed_0004.off\nbed/train/bed_0005.off\nbed/train/bed_0006.off\nbed/train/bed_0007.off\nbed/train/bed_0008.off\nbed/train/bed_0009.off\nbed/train/bed_0010.off\nbed/train/bed_0011.off\nbed/train/bed_0012.off\nbed/train/bed_0013.off\nbed/train/bed_0014.off\nbed/train/bed_0015.off\nbed/train/bed_0016.off\nbed/train/bed_0017.off\nbed/train/bed_0018.off\nbed/train/bed_0019.off\nbed/train/bed_0020.off\nbed/train/bed_0021.off\nbed/train/bed_0022.off\nbed/train/bed_0023.off\nbed/train/bed_0024.off\nbed/train/bed_0025.off\nbed/train/bed_0026.off\nbed/train/bed_0027.off\nbed/train/bed_0028.off\nbed/train/bed_0029.off\nbed/train/bed_0030.off\nbed/train/bed_0031.off\nbed/train/bed_0032.off\nbed/train/bed_0033.off\nbed/train/bed_0034.off\nbed/train/bed_0035.off\nbed/train/bed_0036.off\nbed/train/bed_0037.off\nbed/train/bed_0038.off\nbed/train/bed_0039.off\nbed/train/bed_0040.off\nbed/train/bed_0041.off\nbed/train/bed_0042.off\nbed/train/bed_0043.off\nbed/train/bed_0044.off\nbed/train/bed_0045.off\nbed/train/bed_0046.off\nbed/train/bed_0047.off\nbed/train/bed_0048.off\nbed/train/bed_0049.off\nbed/train/bed_0050.off\nbed/train/bed_0051.off\nbed/train/bed_0052.off\nbed/train/bed_0053.off\nbed/train/bed_0054.off\nbed/train/bed_0055.off\nbed/train/bed_0056.off\nbed/train/bed_0057.off\nbed/train/bed_0058.off\nbed/train/bed_0059.off\nbed/train/bed_0060.off\nbed/train/bed_0061.off\nbed/train/bed_0062.off\nbed/train/bed_0063.off\nbed/train/bed_0064.off\nbed/train/bed_0065.off\nbed/train/bed_0066.off\nbed/train/bed_0067.off\nbed/train/bed_0068.off\nbed/train/bed_0069.off\nbed/train/bed_0070.off\nbed/train/bed_0071.off\nbed/train/bed_0072.off\nbed/train/bed_0073.off\nbed/train/bed_0074.off\nbed/train/bed_0075.off\nbed/train/bed_0076.off\nbed/train/bed_0077.off\nbed/train/bed_0078.off\nbed/train/bed_0079.off\nbed/train/bed_0080.off\nbed/train/bed_0081.off\nbed/train/bed_0082.off\nbed/train/bed_0083.off\nbed/train/bed_0084.off\nbed/train/bed_0085.off\nbed/train/bed_0086.off\nbed/train/bed_0087.off\nbed/train/bed_0088.off\nbed/train/bed_0089.off\nbed/train/bed_0090.off\nbed/train/bed_0091.off\nbed/train/bed_0092.off\nbed/train/bed_0093.off\nbed/train/bed_0094.off\nbed/train/bed_0095.off\nbed/train/bed_0096.off\nbed/train/bed_0097.off\nbed/train/bed_0098.off\nbed/train/bed_0099.off\nbed/train/bed_0100.off\nbed/train/bed_0101.off\nbed/train/bed_0102.off\nbed/train/bed_0103.off\nbed/train/bed_0104.off\nbed/train/bed_0105.off\nbed/train/bed_0106.off\nbed/train/bed_0107.off\nbed/train/bed_0108.off\nbed/train/bed_0109.off\nbed/train/bed_0110.off\nbed/train/bed_0111.off\nbed/train/bed_0112.off\nbed/train/bed_0113.off\nbed/train/bed_0114.off\nbed/train/bed_0115.off\nbed/train/bed_0116.off\nbed/train/bed_0117.off\nbed/train/bed_0118.off\nbed/train/bed_0119.off\nbed/train/bed_0120.off\nbed/train/bed_0121.off\nbed/train/bed_0122.off\nbed/train/bed_0123.off\nbed/train/bed_0124.off\nbed/train/bed_0125.off\nbed/train/bed_0126.off\nbed/train/bed_0127.off\nbed/train/bed_0128.off\nbed/train/bed_0129.off\nbed/train/bed_0130.off\nbed/train/bed_0131.off\nbed/train/bed_0132.off\nbed/train/bed_0133.off\nbed/train/bed_0134.off\nbed/train/bed_0135.off\nbed/train/bed_0136.off\nbed/train/bed_0137.off\nbed/train/bed_0138.off\nbed/train/bed_0139.off\nbed/train/bed_0140.off\nbed/train/bed_0141.off\nbed/train/bed_0142.off\nbed/train/bed_0143.off\nbed/train/bed_0144.off\nbed/train/bed_0145.off\nbed/train/bed_0146.off\nbed/train/bed_0147.off\nbed/train/bed_0148.off\nbed/train/bed_0149.off\nbed/train/bed_0150.off\nbed/train/bed_0151.off\nbed/train/bed_0152.off\nbed/train/bed_0153.off\nbed/train/bed_0154.off\nbed/train/bed_0155.off\nbed/train/bed_0156.off\nbed/train/bed_0157.off\nbed/train/bed_0158.off\nbed/train/bed_0159.off\nbed/train/bed_0160.off\nbed/train/bed_0161.off\nbed/train/bed_0162.off\nbed/train/bed_0163.off\nbed/train/bed_0164.off\nbed/train/bed_0165.off\nbed/train/bed_0166.off\nbed/train/bed_0167.off\nbed/train/bed_0168.off\nbed/train/bed_0169.off\nbed/train/bed_0170.off\nbed/train/bed_0171.off\nbed/train/bed_0172.off\nbed/train/bed_0173.off\nbed/train/bed_0174.off\nbed/train/bed_0175.off\nbed/train/bed_0176.off\nbed/train/bed_0177.off\nbed/train/bed_0178.off\nbed/train/bed_0179.off\nbed/train/bed_0180.off\nbed/train/bed_0181.off\nbed/train/bed_0182.off\nbed/train/bed_0183.off\nbed/train/bed_0184.off\nbed/train/bed_0185.off\nbed/train/bed_0186.off\nbed/train/bed_0187.off\nbed/train/bed_0188.off\nbed/train/bed_0189.off\nbed/train/bed_0190.off\nbed/train/bed_0191.off\nbed/train/bed_0192.off\nbed/train/bed_0193.off\nbed/train/bed_0194.off\nbed/train/bed_0195.off\nbed/train/bed_0196.off\nbed/train/bed_0197.off\nbed/train/bed_0198.off\nbed/train/bed_0199.off\nbed/train/bed_0200.off\nbed/train/bed_0201.off\nbed/train/bed_0202.off\nbed/train/bed_0203.off\nbed/train/bed_0204.off\nbed/train/bed_0205.off\nbed/train/bed_0206.off\nbed/train/bed_0207.off\nbed/train/bed_0208.off\nbed/train/bed_0209.off\nbed/train/bed_0210.off\nbed/train/bed_0211.off\nbed/train/bed_0212.off\nbed/train/bed_0213.off\nbed/train/bed_0214.off\nbed/train/bed_0215.off\nbed/train/bed_0216.off\nbed/train/bed_0217.off\nbed/train/bed_0218.off\nbed/train/bed_0219.off\nbed/train/bed_0220.off\nbed/train/bed_0221.off\nbed/train/bed_0222.off\nbed/train/bed_0223.off\nbed/train/bed_0224.off\nbed/train/bed_0225.off\nbed/train/bed_0226.off\nbed/train/bed_0227.off\nbed/train/bed_0228.off\nbed/train/bed_0229.off\nbed/train/bed_0230.off\nbed/train/bed_0231.off\nbed/train/bed_0232.off\nbed/train/bed_0233.off\nbed/train/bed_0234.off\nbed/train/bed_0235.off\nbed/train/bed_0236.off\nbed/train/bed_0237.off\nbed/train/bed_0238.off\nbed/train/bed_0239.off\nbed/train/bed_0240.off\nbed/train/bed_0241.off\nbed/train/bed_0242.off\nbed/train/bed_0243.off\nbed/train/bed_0244.off\nbed/train/bed_0245.off\nbed/train/bed_0246.off\nbed/train/bed_0247.off\nbed/train/bed_0248.off\nbed/train/bed_0249.off\nbed/train/bed_0250.off\nbed/train/bed_0251.off\nbed/train/bed_0252.off\nbed/train/bed_0253.off\nbed/train/bed_0254.off\nbed/train/bed_0255.off\nbed/train/bed_0256.off\nbed/train/bed_0257.off\nbed/train/bed_0258.off\nbed/train/bed_0259.off\nbed/train/bed_0260.off\nbed/train/bed_0261.off\nbed/train/bed_0262.off\nbed/train/bed_0263.off\nbed/train/bed_0264.off\nbed/train/bed_0265.off\nbed/train/bed_0266.off\nbed/train/bed_0267.off\nbed/train/bed_0268.off\nbed/train/bed_0269.off\nbed/train/bed_0270.off\nbed/train/bed_0271.off\nbed/train/bed_0272.off\nbed/train/bed_0273.off\nbed/train/bed_0274.off\nbed/train/bed_0275.off\nbed/train/bed_0276.off\nbed/train/bed_0277.off\nbed/train/bed_0278.off\nbed/train/bed_0279.off\nbed/train/bed_0280.off\nbed/train/bed_0281.off\nbed/train/bed_0282.off\nbed/train/bed_0283.off\nbed/train/bed_0284.off\nbed/train/bed_0285.off\nbed/train/bed_0286.off\nbed/train/bed_0287.off\nbed/train/bed_0288.off\nbed/train/bed_0289.off\nbed/train/bed_0290.off\nbed/train/bed_0291.off\nbed/train/bed_0292.off\nbed/train/bed_0293.off\nbed/train/bed_0294.off\nbed/train/bed_0295.off\nbed/train/bed_0296.off\nbed/train/bed_0297.off\nbed/train/bed_0298.off\nbed/train/bed_0299.off\nbed/train/bed_0300.off\nbed/train/bed_0301.off\nbed/train/bed_0302.off\nbed/train/bed_0303.off\nbed/train/bed_0304.off\nbed/train/bed_0305.off\nbed/train/bed_0306.off\nbed/train/bed_0307.off\nbed/train/bed_0308.off\nbed/train/bed_0309.off\nbed/train/bed_0310.off\nbed/train/bed_0311.off\nbed/train/bed_0312.off\nbed/train/bed_0313.off\nbed/train/bed_0314.off\nbed/train/bed_0315.off\nbed/train/bed_0316.off\nbed/train/bed_0317.off\nbed/train/bed_0318.off\nbed/train/bed_0319.off\nbed/train/bed_0320.off\nbed/train/bed_0321.off\nbed/train/bed_0322.off\nbed/train/bed_0323.off\nbed/train/bed_0324.off\nbed/train/bed_0325.off\nbed/train/bed_0326.off\nbed/train/bed_0327.off\nbed/train/bed_0328.off\nbed/train/bed_0329.off\nbed/train/bed_0330.off\nbed/train/bed_0331.off\nbed/train/bed_0332.off\nbed/train/bed_0333.off\nbed/train/bed_0334.off\nbed/train/bed_0335.off\nbed/train/bed_0336.off\nbed/train/bed_0337.off\nbed/train/bed_0338.off\nbed/train/bed_0339.off\nbed/train/bed_0340.off\nbed/train/bed_0341.off\nbed/train/bed_0342.off\nbed/train/bed_0343.off\nbed/train/bed_0344.off\nbed/train/bed_0345.off\nbed/train/bed_0346.off\nbed/train/bed_0347.off\nbed/train/bed_0348.off\nbed/train/bed_0349.off\nbed/train/bed_0350.off\nbed/train/bed_0351.off\nbed/train/bed_0352.off\nbed/train/bed_0353.off\nbed/train/bed_0354.off\nbed/train/bed_0355.off\nbed/train/bed_0356.off\nbed/train/bed_0357.off\nbed/train/bed_0358.off\nbed/train/bed_0359.off\nbed/train/bed_0360.off\nbed/train/bed_0361.off\nbed/train/bed_0362.off\nbed/train/bed_0363.off\nbed/train/bed_0364.off\nbed/train/bed_0365.off\nbed/train/bed_0366.off\nbed/train/bed_0367.off\nbed/train/bed_0368.off\nbed/train/bed_0369.off\nbed/train/bed_0370.off\nbed/train/bed_0371.off\nbed/train/bed_0372.off\nbed/train/bed_0373.off\nbed/train/bed_0374.off\nbed/train/bed_0375.off\nbed/train/bed_0376.off\nbed/train/bed_0377.off\nbed/train/bed_0378.off\nbed/train/bed_0379.off\nbed/train/bed_0380.off\nbed/train/bed_0381.off\nbed/train/bed_0382.off\nbed/train/bed_0383.off\nbed/train/bed_0384.off\nbed/train/bed_0385.off\nbed/train/bed_0386.off\nbed/train/bed_0387.off\nbed/train/bed_0388.off\nbed/train/bed_0389.off\nbed/train/bed_0390.off\nbed/train/bed_0391.off\nbed/train/bed_0392.off\nbed/train/bed_0393.off\nbed/train/bed_0394.off\nbed/train/bed_0395.off\nbed/train/bed_0396.off\nbed/train/bed_0397.off\nbed/train/bed_0398.off\nbed/train/bed_0399.off\nbed/train/bed_0400.off\nbed/train/bed_0401.off\nbed/train/bed_0402.off\nbed/train/bed_0403.off\nbed/train/bed_0404.off\nbed/train/bed_0405.off\nbed/train/bed_0406.off\nbed/train/bed_0407.off\nbed/train/bed_0408.off\nbed/train/bed_0409.off\nbed/train/bed_0410.off\nbed/train/bed_0411.off\nbed/train/bed_0412.off\nbed/train/bed_0413.off\nbed/train/bed_0414.off\nbed/train/bed_0415.off\nbed/train/bed_0416.off\nbed/train/bed_0417.off\nbed/train/bed_0418.off\nbed/train/bed_0419.off\nbed/train/bed_0420.off\nbed/train/bed_0421.off\nbed/train/bed_0422.off\nbed/train/bed_0423.off\nbed/train/bed_0424.off\nbed/train/bed_0425.off\nbed/train/bed_0426.off\nbed/train/bed_0427.off\nbed/train/bed_0428.off\nbed/train/bed_0429.off\nbed/train/bed_0430.off\nbed/train/bed_0431.off\nbed/train/bed_0432.off\nbed/train/bed_0433.off\nbed/train/bed_0434.off\nbed/train/bed_0435.off\nbed/train/bed_0436.off\nbed/train/bed_0437.off\nbed/train/bed_0438.off\nbed/train/bed_0439.off\nbed/train/bed_0440.off\nbed/train/bed_0441.off\nbed/train/bed_0442.off\nbed/train/bed_0443.off\nbed/train/bed_0444.off\nbed/train/bed_0445.off\nbed/train/bed_0446.off\nbed/train/bed_0447.off\nbed/train/bed_0448.off\nbed/train/bed_0449.off\nbed/train/bed_0450.off\nbed/train/bed_0451.off\nbed/train/bed_0452.off\nbed/train/bed_0453.off\nbed/train/bed_0454.off\nbed/train/bed_0455.off\nbed/train/bed_0456.off\nbed/train/bed_0457.off\nbed/train/bed_0458.off\nbed/train/bed_0459.off\nbed/train/bed_0460.off\nbed/train/bed_0461.off\nbed/train/bed_0462.off\nbed/train/bed_0463.off\nbed/train/bed_0464.off\ntent/train/tent_0001.off\ntent/train/tent_0002.off\ntent/train/tent_0003.off\ntent/train/tent_0004.off\ntent/train/tent_0005.off\ntent/train/tent_0006.off\ntent/train/tent_0007.off\ntent/train/tent_0008.off\ntent/train/tent_0009.off\ntent/train/tent_0010.off\ntent/train/tent_0011.off\ntent/train/tent_0012.off\ntent/train/tent_0013.off\ntent/train/tent_0014.off\ntent/train/tent_0015.off\ntent/train/tent_0016.off\ntent/train/tent_0017.off\ntent/train/tent_0018.off\ntent/train/tent_0019.off\ntent/train/tent_0020.off\ntent/train/tent_0021.off\ntent/train/tent_0022.off\ntent/train/tent_0023.off\ntent/train/tent_0024.off\ntent/train/tent_0025.off\ntent/train/tent_0026.off\ntent/train/tent_0027.off\ntent/train/tent_0028.off\ntent/train/tent_0029.off\ntent/train/tent_0030.off\ntent/train/tent_0031.off\ntent/train/tent_0032.off\ntent/train/tent_0033.off\ntent/train/tent_0034.off\ntent/train/tent_0035.off\ntent/train/tent_0036.off\ntent/train/tent_0037.off\ntent/train/tent_0038.off\ntent/train/tent_0039.off\ntent/train/tent_0040.off\ntent/train/tent_0041.off\ntent/train/tent_0042.off\ntent/train/tent_0043.off\ntent/train/tent_0044.off\ntent/train/tent_0045.off\ntent/train/tent_0046.off\ntent/train/tent_0047.off\ntent/train/tent_0048.off\ntent/train/tent_0049.off\ntent/train/tent_0050.off\ntent/train/tent_0051.off\ntent/train/tent_0052.off\ntent/train/tent_0053.off\ntent/train/tent_0054.off\ntent/train/tent_0055.off\ntent/train/tent_0056.off\ntent/train/tent_0057.off\ntent/train/tent_0058.off\ntent/train/tent_0059.off\ntent/train/tent_0060.off\ntent/train/tent_0061.off\ntent/train/tent_0062.off\ntent/train/tent_0063.off\ntent/train/tent_0064.off\ntent/train/tent_0065.off\ntent/train/tent_0066.off\ntent/train/tent_0067.off\ntent/train/tent_0068.off\ntent/train/tent_0069.off\ntent/train/tent_0070.off\ntent/train/tent_0071.off\ntent/train/tent_0072.off\ntent/train/tent_0073.off\ntent/train/tent_0074.off\ntent/train/tent_0075.off\ntent/train/tent_0076.off\ntent/train/tent_0077.off\ntent/train/tent_0078.off\ntent/train/tent_0079.off\ntent/train/tent_0080.off\ntent/train/tent_0081.off\ntent/train/tent_0082.off\ntent/train/tent_0083.off\ntent/train/tent_0084.off\ntent/train/tent_0085.off\ntent/train/tent_0086.off\ntent/train/tent_0087.off\ntent/train/tent_0088.off\ntent/train/tent_0089.off\ntent/train/tent_0090.off\ntent/train/tent_0091.off\ntent/train/tent_0092.off\ntent/train/tent_0093.off\ntent/train/tent_0094.off\ntent/train/tent_0095.off\ntent/train/tent_0096.off\ntent/train/tent_0097.off\ntent/train/tent_0098.off\ntent/train/tent_0099.off\ntent/train/tent_0100.off\ntent/train/tent_0101.off\ntent/train/tent_0102.off\ntent/train/tent_0103.off\ntent/train/tent_0104.off\ntent/train/tent_0105.off\ntent/train/tent_0106.off\ntent/train/tent_0107.off\ntent/train/tent_0108.off\ntent/train/tent_0109.off\ntent/train/tent_0110.off\ntent/train/tent_0111.off\ntent/train/tent_0112.off\ntent/train/tent_0113.off\ntent/train/tent_0114.off\ntent/train/tent_0115.off\ntent/train/tent_0116.off\ntent/train/tent_0117.off\ntent/train/tent_0118.off\ntent/train/tent_0119.off\ntent/train/tent_0120.off\ntent/train/tent_0121.off\ntent/train/tent_0122.off\ntent/train/tent_0123.off\ntent/train/tent_0124.off\ntent/train/tent_0125.off\ntent/train/tent_0126.off\ntent/train/tent_0127.off\ntent/train/tent_0128.off\ntent/train/tent_0129.off\ntent/train/tent_0130.off\ntent/train/tent_0131.off\ntent/train/tent_0132.off\ntent/train/tent_0133.off\ntent/train/tent_0134.off\ntent/train/tent_0135.off\ntent/train/tent_0136.off\ntent/train/tent_0137.off\ntent/train/tent_0138.off\ntent/train/tent_0139.off\ntent/train/tent_0140.off\ntent/train/tent_0141.off\ntent/train/tent_0142.off\ntent/train/tent_0143.off\ntent/train/tent_0144.off\ntent/train/tent_0145.off\ntent/train/tent_0146.off\ntent/train/tent_0147.off\npiano/train/piano_0001.off\npiano/train/piano_0002.off\npiano/train/piano_0003.off\npiano/train/piano_0004.off\npiano/train/piano_0005.off\npiano/train/piano_0006.off\npiano/train/piano_0007.off\npiano/train/piano_0008.off\npiano/train/piano_0009.off\npiano/train/piano_0010.off\npiano/train/piano_0011.off\npiano/train/piano_0012.off\npiano/train/piano_0013.off\npiano/train/piano_0014.off\npiano/train/piano_0015.off\npiano/train/piano_0016.off\npiano/train/piano_0017.off\npiano/train/piano_0018.off\npiano/train/piano_0019.off\npiano/train/piano_0020.off\npiano/train/piano_0021.off\npiano/train/piano_0022.off\npiano/train/piano_0023.off\npiano/train/piano_0024.off\npiano/train/piano_0025.off\npiano/train/piano_0026.off\npiano/train/piano_0027.off\npiano/train/piano_0028.off\npiano/train/piano_0029.off\npiano/train/piano_0030.off\npiano/train/piano_0031.off\npiano/train/piano_0032.off\npiano/train/piano_0033.off\npiano/train/piano_0034.off\npiano/train/piano_0035.off\npiano/train/piano_0036.off\npiano/train/piano_0037.off\npiano/train/piano_0038.off\npiano/train/piano_0039.off\npiano/train/piano_0040.off\npiano/train/piano_0041.off\npiano/train/piano_0042.off\npiano/train/piano_0043.off\npiano/train/piano_0044.off\npiano/train/piano_0045.off\npiano/train/piano_0046.off\npiano/train/piano_0047.off\npiano/train/piano_0048.off\npiano/train/piano_0049.off\npiano/train/piano_0050.off\npiano/train/piano_0051.off\npiano/train/piano_0052.off\npiano/train/piano_0053.off\npiano/train/piano_0054.off\npiano/train/piano_0055.off\npiano/train/piano_0056.off\npiano/train/piano_0057.off\npiano/train/piano_0058.off\npiano/train/piano_0059.off\npiano/train/piano_0060.off\npiano/train/piano_0061.off\npiano/train/piano_0062.off\npiano/train/piano_0063.off\npiano/train/piano_0064.off\npiano/train/piano_0065.off\npiano/train/piano_0066.off\npiano/train/piano_0067.off\npiano/train/piano_0068.off\npiano/train/piano_0069.off\npiano/train/piano_0070.off\npiano/train/piano_0071.off\npiano/train/piano_0072.off\npiano/train/piano_0073.off\npiano/train/piano_0074.off\npiano/train/piano_0075.off\npiano/train/piano_0076.off\npiano/train/piano_0077.off\npiano/train/piano_0078.off\npiano/train/piano_0079.off\npiano/train/piano_0080.off\npiano/train/piano_0081.off\npiano/train/piano_0082.off\npiano/train/piano_0083.off\npiano/train/piano_0084.off\npiano/train/piano_0085.off\npiano/train/piano_0086.off\npiano/train/piano_0087.off\npiano/train/piano_0088.off\npiano/train/piano_0089.off\npiano/train/piano_0090.off\npiano/train/piano_0091.off\npiano/train/piano_0092.off\npiano/train/piano_0093.off\npiano/train/piano_0094.off\npiano/train/piano_0095.off\npiano/train/piano_0096.off\npiano/train/piano_0097.off\npiano/train/piano_0098.off\npiano/train/piano_0099.off\npiano/train/piano_0100.off\npiano/train/piano_0101.off\npiano/train/piano_0102.off\npiano/train/piano_0103.off\npiano/train/piano_0104.off\npiano/train/piano_0105.off\npiano/train/piano_0106.off\npiano/train/piano_0107.off\npiano/train/piano_0108.off\npiano/train/piano_0109.off\npiano/train/piano_0110.off\npiano/train/piano_0111.off\npiano/train/piano_0112.off\npiano/train/piano_0113.off\npiano/train/piano_0114.off\npiano/train/piano_0115.off\npiano/train/piano_0116.off\npiano/train/piano_0117.off\npiano/train/piano_0118.off\npiano/train/piano_0119.off\npiano/train/piano_0120.off\npiano/train/piano_0121.off\npiano/train/piano_0122.off\npiano/train/piano_0123.off\npiano/train/piano_0124.off\npiano/train/piano_0125.off\npiano/train/piano_0126.off\npiano/train/piano_0127.off\npiano/train/piano_0128.off\npiano/train/piano_0129.off\npiano/train/piano_0130.off\npiano/train/piano_0131.off\npiano/train/piano_0132.off\npiano/train/piano_0133.off\npiano/train/piano_0134.off\npiano/train/piano_0135.off\npiano/train/piano_0136.off\npiano/train/piano_0137.off\npiano/train/piano_0138.off\npiano/train/piano_0139.off\npiano/train/piano_0140.off\npiano/train/piano_0141.off\npiano/train/piano_0142.off\npiano/train/piano_0143.off\npiano/train/piano_0144.off\npiano/train/piano_0145.off\npiano/train/piano_0146.off\npiano/train/piano_0147.off\npiano/train/piano_0148.off\npiano/train/piano_0149.off\npiano/train/piano_0150.off\npiano/train/piano_0151.off\npiano/train/piano_0152.off\npiano/train/piano_0153.off\npiano/train/piano_0154.off\npiano/train/piano_0155.off\npiano/train/piano_0156.off\npiano/train/piano_0157.off\npiano/train/piano_0158.off\npiano/train/piano_0159.off\npiano/train/piano_0160.off\npiano/train/piano_0161.off\npiano/train/piano_0162.off\npiano/train/piano_0163.off\npiano/train/piano_0164.off\npiano/train/piano_0165.off\npiano/train/piano_0166.off\npiano/train/piano_0167.off\npiano/train/piano_0168.off\npiano/train/piano_0169.off\npiano/train/piano_0170.off\npiano/train/piano_0171.off\npiano/train/piano_0172.off\npiano/train/piano_0173.off\npiano/train/piano_0174.off\npiano/train/piano_0175.off\npiano/train/piano_0176.off\npiano/train/piano_0177.off\npiano/train/piano_0178.off\npiano/train/piano_0179.off\npiano/train/piano_0180.off\npiano/train/piano_0181.off\npiano/train/piano_0182.off\npiano/train/piano_0183.off\npiano/train/piano_0184.off\npiano/train/piano_0185.off\npiano/train/piano_0186.off\npiano/train/piano_0187.off\npiano/train/piano_0188.off\npiano/train/piano_0189.off\npiano/train/piano_0190.off\npiano/train/piano_0191.off\npiano/train/piano_0192.off\npiano/train/piano_0193.off\npiano/train/piano_0194.off\npiano/train/piano_0195.off\npiano/train/piano_0196.off\npiano/train/piano_0197.off\npiano/train/piano_0198.off\npiano/train/piano_0199.off\npiano/train/piano_0200.off\npiano/train/piano_0201.off\npiano/train/piano_0202.off\npiano/train/piano_0203.off\npiano/train/piano_0204.off\npiano/train/piano_0205.off\npiano/train/piano_0206.off\npiano/train/piano_0207.off\npiano/train/piano_0208.off\nsofa/train/sofa_0001.off\nsofa/train/sofa_0002.off\nsofa/train/sofa_0003.off\nsofa/train/sofa_0004.off\nsofa/train/sofa_0005.off\nsofa/train/sofa_0006.off\nsofa/train/sofa_0007.off\nsofa/train/sofa_0008.off\nsofa/train/sofa_0009.off\nsofa/train/sofa_0010.off\nsofa/train/sofa_0011.off\nsofa/train/sofa_0012.off\nsofa/train/sofa_0013.off\nsofa/train/sofa_0014.off\nsofa/train/sofa_0015.off\nsofa/train/sofa_0016.off\nsofa/train/sofa_0017.off\nsofa/train/sofa_0018.off\nsofa/train/sofa_0019.off\nsofa/train/sofa_0020.off\nsofa/train/sofa_0021.off\nsofa/train/sofa_0022.off\nsofa/train/sofa_0023.off\nsofa/train/sofa_0024.off\nsofa/train/sofa_0025.off\nsofa/train/sofa_0026.off\nsofa/train/sofa_0027.off\nsofa/train/sofa_0028.off\nsofa/train/sofa_0029.off\nsofa/train/sofa_0030.off\nsofa/train/sofa_0031.off\nsofa/train/sofa_0032.off\nsofa/train/sofa_0033.off\nsofa/train/sofa_0034.off\nsofa/train/sofa_0035.off\nsofa/train/sofa_0036.off\nsofa/train/sofa_0037.off\nsofa/train/sofa_0038.off\nsofa/train/sofa_0039.off\nsofa/train/sofa_0040.off\nsofa/train/sofa_0041.off\nsofa/train/sofa_0042.off\nsofa/train/sofa_0043.off\nsofa/train/sofa_0044.off\nsofa/train/sofa_0045.off\nsofa/train/sofa_0046.off\nsofa/train/sofa_0047.off\nsofa/train/sofa_0048.off\nsofa/train/sofa_0049.off\nsofa/train/sofa_0050.off\nsofa/train/sofa_0051.off\nsofa/train/sofa_0052.off\nsofa/train/sofa_0053.off\nsofa/train/sofa_0054.off\nsofa/train/sofa_0055.off\nsofa/train/sofa_0056.off\nsofa/train/sofa_0057.off\nsofa/train/sofa_0058.off\nsofa/train/sofa_0059.off\nsofa/train/sofa_0060.off\nsofa/train/sofa_0061.off\nsofa/train/sofa_0062.off\nsofa/train/sofa_0063.off\nsofa/train/sofa_0064.off\nsofa/train/sofa_0065.off\nsofa/train/sofa_0066.off\nsofa/train/sofa_0067.off\nsofa/train/sofa_0068.off\nsofa/train/sofa_0069.off\nsofa/train/sofa_0070.off\nsofa/train/sofa_0071.off\nsofa/train/sofa_0072.off\nsofa/train/sofa_0073.off\nsofa/train/sofa_0074.off\nsofa/train/sofa_0075.off\nsofa/train/sofa_0076.off\nsofa/train/sofa_0077.off\nsofa/train/sofa_0078.off\nsofa/train/sofa_0079.off\nsofa/train/sofa_0080.off\nsofa/train/sofa_0081.off\nsofa/train/sofa_0082.off\nsofa/train/sofa_0083.off\nsofa/train/sofa_0084.off\nsofa/train/sofa_0085.off\nsofa/train/sofa_0086.off\nsofa/train/sofa_0087.off\nsofa/train/sofa_0088.off\nsofa/train/sofa_0089.off\nsofa/train/sofa_0090.off\nsofa/train/sofa_0091.off\nsofa/train/sofa_0092.off\nsofa/train/sofa_0093.off\nsofa/train/sofa_0094.off\nsofa/train/sofa_0095.off\nsofa/train/sofa_0096.off\nsofa/train/sofa_0097.off\nsofa/train/sofa_0098.off\nsofa/train/sofa_0099.off\nsofa/train/sofa_0100.off\nsofa/train/sofa_0101.off\nsofa/train/sofa_0102.off\nsofa/train/sofa_0103.off\nsofa/train/sofa_0104.off\nsofa/train/sofa_0105.off\nsofa/train/sofa_0106.off\nsofa/train/sofa_0107.off\nsofa/train/sofa_0108.off\nsofa/train/sofa_0109.off\nsofa/train/sofa_0110.off\nsofa/train/sofa_0111.off\nsofa/train/sofa_0112.off\nsofa/train/sofa_0113.off\nsofa/train/sofa_0114.off\nsofa/train/sofa_0115.off\nsofa/train/sofa_0116.off\nsofa/train/sofa_0117.off\nsofa/train/sofa_0118.off\nsofa/train/sofa_0119.off\nsofa/train/sofa_0120.off\nsofa/train/sofa_0121.off\nsofa/train/sofa_0122.off\nsofa/train/sofa_0123.off\nsofa/train/sofa_0124.off\nsofa/train/sofa_0125.off\nsofa/train/sofa_0126.off\nsofa/train/sofa_0127.off\nsofa/train/sofa_0128.off\nsofa/train/sofa_0129.off\nsofa/train/sofa_0130.off\nsofa/train/sofa_0131.off\nsofa/train/sofa_0132.off\nsofa/train/sofa_0133.off\nsofa/train/sofa_0134.off\nsofa/train/sofa_0135.off\nsofa/train/sofa_0136.off\nsofa/train/sofa_0137.off\nsofa/train/sofa_0138.off\nsofa/train/sofa_0139.off\nsofa/train/sofa_0140.off\nsofa/train/sofa_0141.off\nsofa/train/sofa_0142.off\nsofa/train/sofa_0143.off\nsofa/train/sofa_0144.off\nsofa/train/sofa_0145.off\nsofa/train/sofa_0146.off\nsofa/train/sofa_0147.off\nsofa/train/sofa_0148.off\nsofa/train/sofa_0149.off\nsofa/train/sofa_0150.off\nsofa/train/sofa_0151.off\nsofa/train/sofa_0152.off\nsofa/train/sofa_0153.off\nsofa/train/sofa_0154.off\nsofa/train/sofa_0155.off\nsofa/train/sofa_0156.off\nsofa/train/sofa_0157.off\nsofa/train/sofa_0158.off\nsofa/train/sofa_0159.off\nsofa/train/sofa_0160.off\nsofa/train/sofa_0161.off\nsofa/train/sofa_0162.off\nsofa/train/sofa_0163.off\nsofa/train/sofa_0164.off\nsofa/train/sofa_0165.off\nsofa/train/sofa_0166.off\nsofa/train/sofa_0167.off\nsofa/train/sofa_0168.off\nsofa/train/sofa_0169.off\nsofa/train/sofa_0170.off\nsofa/train/sofa_0171.off\nsofa/train/sofa_0172.off\nsofa/train/sofa_0173.off\nsofa/train/sofa_0174.off\nsofa/train/sofa_0175.off\nsofa/train/sofa_0176.off\nsofa/train/sofa_0177.off\nsofa/train/sofa_0178.off\nsofa/train/sofa_0179.off\nsofa/train/sofa_0180.off\nsofa/train/sofa_0181.off\nsofa/train/sofa_0182.off\nsofa/train/sofa_0183.off\nsofa/train/sofa_0184.off\nsofa/train/sofa_0185.off\nsofa/train/sofa_0186.off\nsofa/train/sofa_0187.off\nsofa/train/sofa_0188.off\nsofa/train/sofa_0189.off\nsofa/train/sofa_0190.off\nsofa/train/sofa_0191.off\nsofa/train/sofa_0192.off\nsofa/train/sofa_0193.off\nsofa/train/sofa_0194.off\nsofa/train/sofa_0195.off\nsofa/train/sofa_0196.off\nsofa/train/sofa_0197.off\nsofa/train/sofa_0198.off\nsofa/train/sofa_0199.off\nsofa/train/sofa_0200.off\nsofa/train/sofa_0201.off\nsofa/train/sofa_0202.off\nsofa/train/sofa_0203.off\nsofa/train/sofa_0204.off\nsofa/train/sofa_0205.off\nsofa/train/sofa_0206.off\nsofa/train/sofa_0207.off\nsofa/train/sofa_0208.off\nsofa/train/sofa_0209.off\nsofa/train/sofa_0210.off\nsofa/train/sofa_0211.off\nsofa/train/sofa_0212.off\nsofa/train/sofa_0213.off\nsofa/train/sofa_0214.off\nsofa/train/sofa_0215.off\nsofa/train/sofa_0216.off\nsofa/train/sofa_0217.off\nsofa/train/sofa_0218.off\nsofa/train/sofa_0219.off\nsofa/train/sofa_0220.off\nsofa/train/sofa_0221.off\nsofa/train/sofa_0222.off\nsofa/train/sofa_0223.off\nsofa/train/sofa_0224.off\nsofa/train/sofa_0225.off\nsofa/train/sofa_0226.off\nsofa/train/sofa_0227.off\nsofa/train/sofa_0228.off\nsofa/train/sofa_0229.off\nsofa/train/sofa_0230.off\nsofa/train/sofa_0231.off\nsofa/train/sofa_0232.off\nsofa/train/sofa_0233.off\nsofa/train/sofa_0234.off\nsofa/train/sofa_0235.off\nsofa/train/sofa_0236.off\nsofa/train/sofa_0237.off\nsofa/train/sofa_0238.off\nsofa/train/sofa_0239.off\nsofa/train/sofa_0240.off\nsofa/train/sofa_0241.off\nsofa/train/sofa_0242.off\nsofa/train/sofa_0243.off\nsofa/train/sofa_0244.off\nsofa/train/sofa_0245.off\nsofa/train/sofa_0246.off\nsofa/train/sofa_0247.off\nsofa/train/sofa_0248.off\nsofa/train/sofa_0249.off\nsofa/train/sofa_0250.off\nsofa/train/sofa_0251.off\nsofa/train/sofa_0252.off\nsofa/train/sofa_0253.off\nsofa/train/sofa_0254.off\nsofa/train/sofa_0255.off\nsofa/train/sofa_0256.off\nsofa/train/sofa_0257.off\nsofa/train/sofa_0258.off\nsofa/train/sofa_0259.off\nsofa/train/sofa_0260.off\nsofa/train/sofa_0261.off\nsofa/train/sofa_0262.off\nsofa/train/sofa_0263.off\nsofa/train/sofa_0264.off\nsofa/train/sofa_0265.off\nsofa/train/sofa_0266.off\nsofa/train/sofa_0267.off\nsofa/train/sofa_0268.off\nsofa/train/sofa_0269.off\nsofa/train/sofa_0270.off\nsofa/train/sofa_0271.off\nsofa/train/sofa_0272.off\nsofa/train/sofa_0273.off\nsofa/train/sofa_0274.off\nsofa/train/sofa_0275.off\nsofa/train/sofa_0276.off\nsofa/train/sofa_0277.off\nsofa/train/sofa_0278.off\nsofa/train/sofa_0279.off\nsofa/train/sofa_0280.off\nsofa/train/sofa_0281.off\nsofa/train/sofa_0282.off\nsofa/train/sofa_0283.off\nsofa/train/sofa_0284.off\nsofa/train/sofa_0285.off\nsofa/train/sofa_0286.off\nsofa/train/sofa_0287.off\nsofa/train/sofa_0288.off\nsofa/train/sofa_0289.off\nsofa/train/sofa_0290.off\nsofa/train/sofa_0291.off\nsofa/train/sofa_0292.off\nsofa/train/sofa_0293.off\nsofa/train/sofa_0294.off\nsofa/train/sofa_0295.off\nsofa/train/sofa_0296.off\nsofa/train/sofa_0297.off\nsofa/train/sofa_0298.off\nsofa/train/sofa_0299.off\nsofa/train/sofa_0300.off\nsofa/train/sofa_0301.off\nsofa/train/sofa_0302.off\nsofa/train/sofa_0303.off\nsofa/train/sofa_0304.off\nsofa/train/sofa_0305.off\nsofa/train/sofa_0306.off\nsofa/train/sofa_0307.off\nsofa/train/sofa_0308.off\nsofa/train/sofa_0309.off\nsofa/train/sofa_0310.off\nsofa/train/sofa_0311.off\nsofa/train/sofa_0312.off\nsofa/train/sofa_0313.off\nsofa/train/sofa_0314.off\nsofa/train/sofa_0315.off\nsofa/train/sofa_0316.off\nsofa/train/sofa_0317.off\nsofa/train/sofa_0318.off\nsofa/train/sofa_0319.off\nsofa/train/sofa_0320.off\nsofa/train/sofa_0321.off\nsofa/train/sofa_0322.off\nsofa/train/sofa_0323.off\nsofa/train/sofa_0324.off\nsofa/train/sofa_0325.off\nsofa/train/sofa_0326.off\nsofa/train/sofa_0327.off\nsofa/train/sofa_0328.off\nsofa/train/sofa_0329.off\nsofa/train/sofa_0330.off\nsofa/train/sofa_0331.off\nsofa/train/sofa_0332.off\nsofa/train/sofa_0333.off\nsofa/train/sofa_0334.off\nsofa/train/sofa_0335.off\nsofa/train/sofa_0336.off\nsofa/train/sofa_0337.off\nsofa/train/sofa_0338.off\nsofa/train/sofa_0339.off\nsofa/train/sofa_0340.off\nsofa/train/sofa_0341.off\nsofa/train/sofa_0342.off\nsofa/train/sofa_0343.off\nsofa/train/sofa_0344.off\nsofa/train/sofa_0345.off\nsofa/train/sofa_0346.off\nsofa/train/sofa_0347.off\nsofa/train/sofa_0348.off\nsofa/train/sofa_0349.off\nsofa/train/sofa_0350.off\nsofa/train/sofa_0351.off\nsofa/train/sofa_0352.off\nsofa/train/sofa_0353.off\nsofa/train/sofa_0354.off\nsofa/train/sofa_0355.off\nsofa/train/sofa_0356.off\nsofa/train/sofa_0357.off\nsofa/train/sofa_0358.off\nsofa/train/sofa_0359.off\nsofa/train/sofa_0360.off\nsofa/train/sofa_0361.off\nsofa/train/sofa_0362.off\nsofa/train/sofa_0363.off\nsofa/train/sofa_0364.off\nsofa/train/sofa_0365.off\nsofa/train/sofa_0366.off\nsofa/train/sofa_0367.off\nsofa/train/sofa_0368.off\nsofa/train/sofa_0369.off\nsofa/train/sofa_0370.off\nsofa/train/sofa_0371.off\nsofa/train/sofa_0372.off\nsofa/train/sofa_0373.off\nsofa/train/sofa_0374.off\nsofa/train/sofa_0375.off\nsofa/train/sofa_0376.off\nsofa/train/sofa_0377.off\nsofa/train/sofa_0378.off\nsofa/train/sofa_0379.off\nsofa/train/sofa_0380.off\nsofa/train/sofa_0381.off\nsofa/train/sofa_0382.off\nsofa/train/sofa_0383.off\nsofa/train/sofa_0384.off\nsofa/train/sofa_0385.off\nsofa/train/sofa_0386.off\nsofa/train/sofa_0387.off\nsofa/train/sofa_0388.off\nsofa/train/sofa_0389.off\nsofa/train/sofa_0390.off\nsofa/train/sofa_0391.off\nsofa/train/sofa_0392.off\nsofa/train/sofa_0393.off\nsofa/train/sofa_0394.off\nsofa/train/sofa_0395.off\nsofa/train/sofa_0396.off\nsofa/train/sofa_0397.off\nsofa/train/sofa_0398.off\nsofa/train/sofa_0399.off\nsofa/train/sofa_0400.off\nsofa/train/sofa_0401.off\nsofa/train/sofa_0402.off\nsofa/train/sofa_0403.off\nsofa/train/sofa_0404.off\nsofa/train/sofa_0405.off\nsofa/train/sofa_0406.off\nsofa/train/sofa_0407.off\nsofa/train/sofa_0408.off\nsofa/train/sofa_0409.off\nsofa/train/sofa_0410.off\nsofa/train/sofa_0411.off\nsofa/train/sofa_0412.off\nsofa/train/sofa_0413.off\nsofa/train/sofa_0414.off\nsofa/train/sofa_0415.off\nsofa/train/sofa_0416.off\nsofa/train/sofa_0417.off\nsofa/train/sofa_0418.off\nsofa/train/sofa_0419.off\nsofa/train/sofa_0420.off\nsofa/train/sofa_0421.off\nsofa/train/sofa_0422.off\nsofa/train/sofa_0423.off\nsofa/train/sofa_0424.off\nsofa/train/sofa_0425.off\nsofa/train/sofa_0426.off\nsofa/train/sofa_0427.off\nsofa/train/sofa_0428.off\nsofa/train/sofa_0429.off\nsofa/train/sofa_0430.off\nsofa/train/sofa_0431.off\nsofa/train/sofa_0432.off\nsofa/train/sofa_0433.off\nsofa/train/sofa_0434.off\nsofa/train/sofa_0435.off\nsofa/train/sofa_0436.off\nsofa/train/sofa_0437.off\nsofa/train/sofa_0438.off\nsofa/train/sofa_0439.off\nsofa/train/sofa_0440.off\nsofa/train/sofa_0441.off\nsofa/train/sofa_0442.off\nsofa/train/sofa_0443.off\nsofa/train/sofa_0444.off\nsofa/train/sofa_0445.off\nsofa/train/sofa_0446.off\nsofa/train/sofa_0447.off\nsofa/train/sofa_0448.off\nsofa/train/sofa_0449.off\nsofa/train/sofa_0450.off\nsofa/train/sofa_0451.off\nsofa/train/sofa_0452.off\nsofa/train/sofa_0453.off\nsofa/train/sofa_0454.off\nsofa/train/sofa_0455.off\nsofa/train/sofa_0456.off\nsofa/train/sofa_0457.off\nsofa/train/sofa_0458.off\nsofa/train/sofa_0459.off\nsofa/train/sofa_0460.off\nsofa/train/sofa_0461.off\nsofa/train/sofa_0462.off\nsofa/train/sofa_0463.off\nsofa/train/sofa_0464.off\nsofa/train/sofa_0465.off\nsofa/train/sofa_0466.off\nsofa/train/sofa_0467.off\nsofa/train/sofa_0468.off\nsofa/train/sofa_0469.off\nsofa/train/sofa_0470.off\nsofa/train/sofa_0471.off\nsofa/train/sofa_0472.off\nsofa/train/sofa_0473.off\nsofa/train/sofa_0474.off\nsofa/train/sofa_0475.off\nsofa/train/sofa_0476.off\nsofa/train/sofa_0477.off\nsofa/train/sofa_0478.off\nsofa/train/sofa_0479.off\nsofa/train/sofa_0480.off\nsofa/train/sofa_0481.off\nsofa/train/sofa_0482.off\nsofa/train/sofa_0483.off\nsofa/train/sofa_0484.off\nsofa/train/sofa_0485.off\nsofa/train/sofa_0486.off\nsofa/train/sofa_0487.off\nsofa/train/sofa_0488.off\nsofa/train/sofa_0489.off\nsofa/train/sofa_0490.off\nsofa/train/sofa_0491.off\nsofa/train/sofa_0492.off\nsofa/train/sofa_0493.off\nsofa/train/sofa_0494.off\nsofa/train/sofa_0495.off\nsofa/train/sofa_0496.off\nsofa/train/sofa_0497.off\nsofa/train/sofa_0498.off\nsofa/train/sofa_0499.off\nsofa/train/sofa_0500.off\nsofa/train/sofa_0501.off\nsofa/train/sofa_0502.off\nsofa/train/sofa_0503.off\nsofa/train/sofa_0504.off\nsofa/train/sofa_0505.off\nsofa/train/sofa_0506.off\nsofa/train/sofa_0507.off\nsofa/train/sofa_0508.off\nsofa/train/sofa_0509.off\nsofa/train/sofa_0510.off\nsofa/train/sofa_0511.off\nsofa/train/sofa_0512.off\nsofa/train/sofa_0513.off\nsofa/train/sofa_0514.off\nsofa/train/sofa_0515.off\nsofa/train/sofa_0516.off\nsofa/train/sofa_0517.off\nsofa/train/sofa_0518.off\nsofa/train/sofa_0519.off\nsofa/train/sofa_0520.off\nsofa/train/sofa_0521.off\nsofa/train/sofa_0522.off\nsofa/train/sofa_0523.off\nsofa/train/sofa_0524.off\nsofa/train/sofa_0525.off\nsofa/train/sofa_0526.off\nsofa/train/sofa_0527.off\nsofa/train/sofa_0528.off\nsofa/train/sofa_0529.off\nsofa/train/sofa_0530.off\nsofa/train/sofa_0531.off\nsofa/train/sofa_0532.off\nsofa/train/sofa_0533.off\nsofa/train/sofa_0534.off\nsofa/train/sofa_0535.off\nsofa/train/sofa_0536.off\nsofa/train/sofa_0537.off\nsofa/train/sofa_0538.off\nsofa/train/sofa_0539.off\nsofa/train/sofa_0540.off\nsofa/train/sofa_0541.off\nsofa/train/sofa_0542.off\nsofa/train/sofa_0543.off\nsofa/train/sofa_0544.off\nsofa/train/sofa_0545.off\nsofa/train/sofa_0546.off\nsofa/train/sofa_0547.off\nsofa/train/sofa_0548.off\nsofa/train/sofa_0549.off\nsofa/train/sofa_0550.off\nsofa/train/sofa_0551.off\nsofa/train/sofa_0552.off\nsofa/train/sofa_0553.off\nsofa/train/sofa_0554.off\nsofa/train/sofa_0555.off\nsofa/train/sofa_0556.off\nsofa/train/sofa_0557.off\nsofa/train/sofa_0558.off\nsofa/train/sofa_0559.off\nsofa/train/sofa_0560.off\nsofa/train/sofa_0561.off\nsofa/train/sofa_0562.off\nsofa/train/sofa_0563.off\nsofa/train/sofa_0564.off\nsofa/train/sofa_0565.off\nsofa/train/sofa_0566.off\nsofa/train/sofa_0567.off\nsofa/train/sofa_0568.off\nsofa/train/sofa_0569.off\nsofa/train/sofa_0570.off\nsofa/train/sofa_0571.off\nsofa/train/sofa_0572.off\nsofa/train/sofa_0573.off\nsofa/train/sofa_0574.off\nsofa/train/sofa_0575.off\nsofa/train/sofa_0576.off\nsofa/train/sofa_0577.off\nsofa/train/sofa_0578.off\nsofa/train/sofa_0579.off\nsofa/train/sofa_0580.off\nsofa/train/sofa_0581.off\nsofa/train/sofa_0582.off\nsofa/train/sofa_0583.off\nsofa/train/sofa_0584.off\nsofa/train/sofa_0585.off\nsofa/train/sofa_0586.off\nsofa/train/sofa_0587.off\nsofa/train/sofa_0588.off\nsofa/train/sofa_0589.off\nsofa/train/sofa_0590.off\nsofa/train/sofa_0591.off\nsofa/train/sofa_0592.off\nsofa/train/sofa_0593.off\nsofa/train/sofa_0594.off\nsofa/train/sofa_0595.off\nsofa/train/sofa_0596.off\nsofa/train/sofa_0597.off\nsofa/train/sofa_0598.off\nsofa/train/sofa_0599.off\nsofa/train/sofa_0600.off\nsofa/train/sofa_0601.off\nsofa/train/sofa_0602.off\nsofa/train/sofa_0603.off\nsofa/train/sofa_0604.off\nsofa/train/sofa_0605.off\nsofa/train/sofa_0606.off\nsofa/train/sofa_0607.off\nsofa/train/sofa_0608.off\nsofa/train/sofa_0609.off\nsofa/train/sofa_0610.off\nsofa/train/sofa_0611.off\nsofa/train/sofa_0612.off\nperson/train/person_0001.off\nperson/train/person_0002.off\nperson/train/person_0003.off\nperson/train/person_0004.off\nperson/train/person_0005.off\nperson/train/person_0006.off\nperson/train/person_0007.off\nperson/train/person_0008.off\nperson/train/person_0009.off\nperson/train/person_0010.off\nperson/train/person_0011.off\nperson/train/person_0012.off\nperson/train/person_0013.off\nperson/train/person_0014.off\nperson/train/person_0015.off\nperson/train/person_0016.off\nperson/train/person_0017.off\nperson/train/person_0018.off\nperson/train/person_0019.off\nperson/train/person_0020.off\nperson/train/person_0021.off\nperson/train/person_0022.off\nperson/train/person_0023.off\nperson/train/person_0024.off\nperson/train/person_0025.off\nperson/train/person_0026.off\nperson/train/person_0027.off\nperson/train/person_0028.off\nperson/train/person_0029.off\nperson/train/person_0030.off\nperson/train/person_0031.off\nperson/train/person_0032.off\nperson/train/person_0033.off\nperson/train/person_0034.off\nperson/train/person_0035.off\nperson/train/person_0036.off\nperson/train/person_0037.off\nperson/train/person_0038.off\nperson/train/person_0039.off\nperson/train/person_0040.off\nperson/train/person_0041.off\nperson/train/person_0042.off\nperson/train/person_0043.off\nperson/train/person_0044.off\nperson/train/person_0045.off\nperson/train/person_0046.off\nperson/train/person_0047.off\nperson/train/person_0048.off\nperson/train/person_0049.off\nperson/train/person_0050.off\nperson/train/person_0051.off\nperson/train/person_0052.off\nperson/train/person_0053.off\nperson/train/person_0054.off\nperson/train/person_0055.off\nperson/train/person_0056.off\nperson/train/person_0057.off\nperson/train/person_0058.off\nperson/train/person_0059.off\nperson/train/person_0060.off\nperson/train/person_0061.off\nperson/train/person_0062.off\nperson/train/person_0063.off\nperson/train/person_0064.off\nperson/train/person_0065.off\nperson/train/person_0066.off\nperson/train/person_0067.off\nperson/train/person_0068.off\nperson/train/person_0069.off\nperson/train/person_0070.off\nperson/train/person_0071.off\nperson/train/person_0072.off\nperson/train/person_0073.off\nperson/train/person_0074.off\nperson/train/person_0075.off\nperson/train/person_0076.off\nperson/train/person_0077.off\nperson/train/person_0078.off\nperson/train/person_0079.off\nperson/train/person_0080.off\nxbox/train/xbox_0001.off\nxbox/train/xbox_0002.off\nxbox/train/xbox_0003.off\nxbox/train/xbox_0004.off\nxbox/train/xbox_0005.off\nxbox/train/xbox_0006.off\nxbox/train/xbox_0007.off\nxbox/train/xbox_0008.off\nxbox/train/xbox_0009.off\nxbox/train/xbox_0010.off\nxbox/train/xbox_0011.off\nxbox/train/xbox_0012.off\nxbox/train/xbox_0013.off\nxbox/train/xbox_0014.off\nxbox/train/xbox_0015.off\nxbox/train/xbox_0016.off\nxbox/train/xbox_0017.off\nxbox/train/xbox_0018.off\nxbox/train/xbox_0019.off\nxbox/train/xbox_0020.off\nxbox/train/xbox_0021.off\nxbox/train/xbox_0022.off\nxbox/train/xbox_0023.off\nxbox/train/xbox_0024.off\nxbox/train/xbox_0025.off\nxbox/train/xbox_0026.off\nxbox/train/xbox_0027.off\nxbox/train/xbox_0028.off\nxbox/train/xbox_0029.off\nxbox/train/xbox_0030.off\nxbox/train/xbox_0031.off\nxbox/train/xbox_0032.off\nxbox/train/xbox_0033.off\nxbox/train/xbox_0034.off\nxbox/train/xbox_0035.off\nxbox/train/xbox_0036.off\nxbox/train/xbox_0037.off\nxbox/train/xbox_0038.off\nxbox/train/xbox_0039.off\nxbox/train/xbox_0040.off\nxbox/train/xbox_0041.off\nxbox/train/xbox_0042.off\nxbox/train/xbox_0043.off\nxbox/train/xbox_0044.off\nxbox/train/xbox_0045.off\nxbox/train/xbox_0046.off\nxbox/train/xbox_0047.off\nxbox/train/xbox_0048.off\nxbox/train/xbox_0049.off\nxbox/train/xbox_0050.off\nxbox/train/xbox_0051.off\nxbox/train/xbox_0052.off\nxbox/train/xbox_0053.off\nxbox/train/xbox_0054.off\nxbox/train/xbox_0055.off\nxbox/train/xbox_0056.off\nxbox/train/xbox_0057.off\nxbox/train/xbox_0058.off\nxbox/train/xbox_0059.off\nxbox/train/xbox_0060.off\nxbox/train/xbox_0061.off\nxbox/train/xbox_0062.off\nxbox/train/xbox_0063.off\nxbox/train/xbox_0064.off\nxbox/train/xbox_0065.off\nxbox/train/xbox_0066.off\nxbox/train/xbox_0067.off\nxbox/train/xbox_0068.off\nxbox/train/xbox_0069.off\nxbox/train/xbox_0070.off\nxbox/train/xbox_0071.off\nxbox/train/xbox_0072.off\nxbox/train/xbox_0073.off\nxbox/train/xbox_0074.off\nxbox/train/xbox_0075.off\nxbox/train/xbox_0076.off\nxbox/train/xbox_0077.off\nxbox/train/xbox_0078.off\nxbox/train/xbox_0079.off\nxbox/train/xbox_0080.off\nxbox/train/xbox_0081.off\nxbox/train/xbox_0082.off\nxbox/train/xbox_0083.off\nxbox/train/xbox_0084.off\nxbox/train/xbox_0085.off\nxbox/train/xbox_0086.off\nxbox/train/xbox_0087.off\nxbox/train/xbox_0088.off\nxbox/train/xbox_0089.off\nxbox/train/xbox_0090.off\nxbox/train/xbox_0091.off\nxbox/train/xbox_0092.off\nxbox/train/xbox_0093.off\nstairs/train/stairs_0001.off\nstairs/train/stairs_0002.off\nstairs/train/stairs_0003.off\nstairs/train/stairs_0004.off\nstairs/train/stairs_0005.off\nstairs/train/stairs_0006.off\nstairs/train/stairs_0007.off\nstairs/train/stairs_0008.off\nstairs/train/stairs_0009.off\nstairs/train/stairs_0010.off\nstairs/train/stairs_0011.off\nstairs/train/stairs_0012.off\nstairs/train/stairs_0013.off\nstairs/train/stairs_0014.off\nstairs/train/stairs_0015.off\nstairs/train/stairs_0016.off\nstairs/train/stairs_0017.off\nstairs/train/stairs_0018.off\nstairs/train/stairs_0019.off\nstairs/train/stairs_0020.off\nstairs/train/stairs_0021.off\nstairs/train/stairs_0022.off\nstairs/train/stairs_0023.off\nstairs/train/stairs_0024.off\nstairs/train/stairs_0025.off\nstairs/train/stairs_0026.off\nstairs/train/stairs_0027.off\nstairs/train/stairs_0028.off\nstairs/train/stairs_0029.off\nstairs/train/stairs_0030.off\nstairs/train/stairs_0031.off\nstairs/train/stairs_0032.off\nstairs/train/stairs_0033.off\nstairs/train/stairs_0034.off\nstairs/train/stairs_0035.off\nstairs/train/stairs_0036.off\nstairs/train/stairs_0037.off\nstairs/train/stairs_0038.off\nstairs/train/stairs_0039.off\nstairs/train/stairs_0040.off\nstairs/train/stairs_0041.off\nstairs/train/stairs_0042.off\nstairs/train/stairs_0043.off\nstairs/train/stairs_0044.off\nstairs/train/stairs_0045.off\nstairs/train/stairs_0046.off\nstairs/train/stairs_0047.off\nstairs/train/stairs_0048.off\nstairs/train/stairs_0049.off\nstairs/train/stairs_0050.off\nstairs/train/stairs_0051.off\nstairs/train/stairs_0052.off\nstairs/train/stairs_0053.off\nstairs/train/stairs_0054.off\nstairs/train/stairs_0055.off\nstairs/train/stairs_0056.off\nstairs/train/stairs_0057.off\nstairs/train/stairs_0058.off\nstairs/train/stairs_0059.off\nstairs/train/stairs_0060.off\nstairs/train/stairs_0061.off\nstairs/train/stairs_0062.off\nstairs/train/stairs_0063.off\nstairs/train/stairs_0064.off\nstairs/train/stairs_0065.off\nstairs/train/stairs_0066.off\nstairs/train/stairs_0067.off\nstairs/train/stairs_0068.off\nstairs/train/stairs_0069.off\nstairs/train/stairs_0070.off\nstairs/train/stairs_0071.off\nstairs/train/stairs_0072.off\nstairs/train/stairs_0073.off\nstairs/train/stairs_0074.off\nstairs/train/stairs_0075.off\nstairs/train/stairs_0076.off\nstairs/train/stairs_0077.off\nstairs/train/stairs_0078.off\nstairs/train/stairs_0079.off\nstairs/train/stairs_0080.off\nstairs/train/stairs_0081.off\nstairs/train/stairs_0082.off\nstairs/train/stairs_0083.off\nstairs/train/stairs_0084.off\nstairs/train/stairs_0085.off\nstairs/train/stairs_0086.off\nstairs/train/stairs_0087.off\nstairs/train/stairs_0088.off\nstairs/train/stairs_0089.off\nstairs/train/stairs_0090.off\nstairs/train/stairs_0091.off\nstairs/train/stairs_0092.off\nstairs/train/stairs_0093.off\nstairs/train/stairs_0094.off\nstairs/train/stairs_0095.off\nstairs/train/stairs_0096.off\nstairs/train/stairs_0097.off\nstairs/train/stairs_0098.off\nstairs/train/stairs_0099.off\nstairs/train/stairs_0100.off\nstairs/train/stairs_0101.off\nstairs/train/stairs_0102.off\nstairs/train/stairs_0103.off\nstairs/train/stairs_0104.off\nstairs/train/stairs_0105.off\nstairs/train/stairs_0106.off\nstairs/train/stairs_0107.off\nstairs/train/stairs_0108.off\nstairs/train/stairs_0109.off\nstairs/train/stairs_0110.off\nstairs/train/stairs_0111.off\nstairs/train/stairs_0112.off\ncone/train/cone_0001.off\ncone/train/cone_0002.off\ncone/train/cone_0003.off\ncone/train/cone_0004.off\ncone/train/cone_0005.off\ncone/train/cone_0006.off\ncone/train/cone_0007.off\ncone/train/cone_0008.off\ncone/train/cone_0009.off\ncone/train/cone_0010.off\ncone/train/cone_0011.off\ncone/train/cone_0012.off\ncone/train/cone_0013.off\ncone/train/cone_0014.off\ncone/train/cone_0015.off\ncone/train/cone_0016.off\ncone/train/cone_0017.off\ncone/train/cone_0018.off\ncone/train/cone_0019.off\ncone/train/cone_0020.off\ncone/train/cone_0021.off\ncone/train/cone_0022.off\ncone/train/cone_0023.off\ncone/train/cone_0024.off\ncone/train/cone_0025.off\ncone/train/cone_0026.off\ncone/train/cone_0027.off\ncone/train/cone_0028.off\ncone/train/cone_0029.off\ncone/train/cone_0030.off\ncone/train/cone_0031.off\ncone/train/cone_0032.off\ncone/train/cone_0033.off\ncone/train/cone_0034.off\ncone/train/cone_0035.off\ncone/train/cone_0036.off\ncone/train/cone_0037.off\ncone/train/cone_0038.off\ncone/train/cone_0039.off\ncone/train/cone_0040.off\ncone/train/cone_0041.off\ncone/train/cone_0042.off\ncone/train/cone_0043.off\ncone/train/cone_0044.off\ncone/train/cone_0045.off\ncone/train/cone_0046.off\ncone/train/cone_0047.off\ncone/train/cone_0048.off\ncone/train/cone_0049.off\ncone/train/cone_0050.off\ncone/train/cone_0051.off\ncone/train/cone_0052.off\ncone/train/cone_0053.off\ncone/train/cone_0054.off\ncone/train/cone_0055.off\ncone/train/cone_0056.off\ncone/train/cone_0057.off\ncone/train/cone_0058.off\ncone/train/cone_0059.off\ncone/train/cone_0060.off\ncone/train/cone_0061.off\ncone/train/cone_0062.off\ncone/train/cone_0063.off\ncone/train/cone_0064.off\ncone/train/cone_0065.off\ncone/train/cone_0066.off\ncone/train/cone_0067.off\ncone/train/cone_0068.off\ncone/train/cone_0069.off\ncone/train/cone_0070.off\ncone/train/cone_0071.off\ncone/train/cone_0072.off\ncone/train/cone_0073.off\ncone/train/cone_0074.off\ncone/train/cone_0075.off\ncone/train/cone_0076.off\ncone/train/cone_0077.off\ncone/train/cone_0078.off\ncone/train/cone_0079.off\ncone/train/cone_0080.off\ncone/train/cone_0081.off\ncone/train/cone_0082.off\ncone/train/cone_0083.off\ncone/train/cone_0084.off\ncone/train/cone_0085.off\ncone/train/cone_0086.off\ncone/train/cone_0087.off\ncone/train/cone_0088.off\ncone/train/cone_0089.off\ncone/train/cone_0090.off\ncone/train/cone_0091.off\ncone/train/cone_0092.off\ncone/train/cone_0093.off\ncone/train/cone_0094.off\ncone/train/cone_0095.off\ncone/train/cone_0096.off\ncone/train/cone_0097.off\ncone/train/cone_0098.off\ncone/train/cone_0099.off\ncone/train/cone_0100.off\ncone/train/cone_0101.off\ncone/train/cone_0102.off\ncone/train/cone_0103.off\ncone/train/cone_0104.off\ncone/train/cone_0105.off\ncone/train/cone_0106.off\ncone/train/cone_0107.off\ncone/train/cone_0108.off\ncone/train/cone_0109.off\ncone/train/cone_0110.off\ncone/train/cone_0111.off\ncone/train/cone_0112.off\ncone/train/cone_0113.off\ncone/train/cone_0114.off\ncone/train/cone_0115.off\ncone/train/cone_0116.off\ncone/train/cone_0117.off\ncone/train/cone_0118.off\ncone/train/cone_0119.off\ncone/train/cone_0120.off\ncone/train/cone_0121.off\ncone/train/cone_0122.off\ncone/train/cone_0123.off\ncone/train/cone_0124.off\ncone/train/cone_0125.off\ncone/train/cone_0126.off\ncone/train/cone_0127.off\ncone/train/cone_0128.off\ncone/train/cone_0129.off\ncone/train/cone_0130.off\ncone/train/cone_0131.off\ncone/train/cone_0132.off\ncone/train/cone_0133.off\ncone/train/cone_0134.off\ncone/train/cone_0135.off\ncone/train/cone_0136.off\ncone/train/cone_0137.off\ncone/train/cone_0138.off\ncone/train/cone_0139.off\ncone/train/cone_0140.off\ncone/train/cone_0141.off\ncone/train/cone_0142.off\ncone/train/cone_0143.off\ncone/train/cone_0144.off\ncone/train/cone_0145.off\ncone/train/cone_0146.off\ncone/train/cone_0147.off\ncone/train/cone_0148.off\ncone/train/cone_0149.off\ncone/train/cone_0150.off\ncone/train/cone_0151.off\nlamp/train/lamp_0001.off\nlamp/train/lamp_0002.off\nlamp/train/lamp_0003.off\nlamp/train/lamp_0004.off\nlamp/train/lamp_0005.off\nlamp/train/lamp_0006.off\nlamp/train/lamp_0007.off\nlamp/train/lamp_0008.off\nlamp/train/lamp_0009.off\nlamp/train/lamp_0010.off\nlamp/train/lamp_0011.off\nlamp/train/lamp_0012.off\nlamp/train/lamp_0013.off\nlamp/train/lamp_0014.off\nlamp/train/lamp_0015.off\nlamp/train/lamp_0016.off\nlamp/train/lamp_0017.off\nlamp/train/lamp_0018.off\nlamp/train/lamp_0019.off\nlamp/train/lamp_0020.off\nlamp/train/lamp_0021.off\nlamp/train/lamp_0022.off\nlamp/train/lamp_0023.off\nlamp/train/lamp_0024.off\nlamp/train/lamp_0025.off\nlamp/train/lamp_0026.off\nlamp/train/lamp_0027.off\nlamp/train/lamp_0028.off\nlamp/train/lamp_0029.off\nlamp/train/lamp_0030.off\nlamp/train/lamp_0031.off\nlamp/train/lamp_0032.off\nlamp/train/lamp_0033.off\nlamp/train/lamp_0034.off\nlamp/train/lamp_0035.off\nlamp/train/lamp_0036.off\nlamp/train/lamp_0037.off\nlamp/train/lamp_0038.off\nlamp/train/lamp_0039.off\nlamp/train/lamp_0040.off\nlamp/train/lamp_0041.off\nlamp/train/lamp_0042.off\nlamp/train/lamp_0043.off\nlamp/train/lamp_0044.off\nlamp/train/lamp_0045.off\nlamp/train/lamp_0046.off\nlamp/train/lamp_0047.off\nlamp/train/lamp_0048.off\nlamp/train/lamp_0049.off\nlamp/train/lamp_0050.off\nlamp/train/lamp_0051.off\nlamp/train/lamp_0052.off\nlamp/train/lamp_0053.off\nlamp/train/lamp_0054.off\nlamp/train/lamp_0055.off\nlamp/train/lamp_0056.off\nlamp/train/lamp_0057.off\nlamp/train/lamp_0058.off\nlamp/train/lamp_0059.off\nlamp/train/lamp_0060.off\nlamp/train/lamp_0061.off\nlamp/train/lamp_0062.off\nlamp/train/lamp_0063.off\nlamp/train/lamp_0064.off\nlamp/train/lamp_0065.off\nlamp/train/lamp_0066.off\nlamp/train/lamp_0067.off\nlamp/train/lamp_0068.off\nlamp/train/lamp_0069.off\nlamp/train/lamp_0070.off\nlamp/train/lamp_0071.off\nlamp/train/lamp_0072.off\nlamp/train/lamp_0073.off\nlamp/train/lamp_0074.off\nlamp/train/lamp_0075.off\nlamp/train/lamp_0076.off\nlamp/train/lamp_0077.off\nlamp/train/lamp_0078.off\nlamp/train/lamp_0079.off\nlamp/train/lamp_0080.off\nlamp/train/lamp_0081.off\nlamp/train/lamp_0082.off\nlamp/train/lamp_0083.off\nlamp/train/lamp_0084.off\nlamp/train/lamp_0085.off\nlamp/train/lamp_0086.off\nlamp/train/lamp_0087.off\nlamp/train/lamp_0088.off\nlamp/train/lamp_0089.off\nlamp/train/lamp_0090.off\nlamp/train/lamp_0091.off\nlamp/train/lamp_0092.off\nlamp/train/lamp_0093.off\nlamp/train/lamp_0094.off\nlamp/train/lamp_0095.off\nlamp/train/lamp_0096.off\nlamp/train/lamp_0097.off\nlamp/train/lamp_0098.off\nlamp/train/lamp_0099.off\nlamp/train/lamp_0100.off\nlamp/train/lamp_0101.off\nlamp/train/lamp_0102.off\nlamp/train/lamp_0103.off\nlamp/train/lamp_0104.off\nlamp/train/lamp_0105.off\nlamp/train/lamp_0106.off\nlamp/train/lamp_0107.off\nlamp/train/lamp_0108.off\nlamp/train/lamp_0109.off\nlamp/train/lamp_0110.off\nlamp/train/lamp_0111.off\nlamp/train/lamp_0112.off\ndoor/train/door_0001.off\ndoor/train/door_0002.off\ndoor/train/door_0003.off\ndoor/train/door_0004.off\ndoor/train/door_0005.off\ndoor/train/door_0006.off\ndoor/train/door_0007.off\ndoor/train/door_0008.off\ndoor/train/door_0009.off\ndoor/train/door_0010.off\ndoor/train/door_0011.off\ndoor/train/door_0012.off\ndoor/train/door_0013.off\ndoor/train/door_0014.off\ndoor/train/door_0015.off\ndoor/train/door_0016.off\ndoor/train/door_0017.off\ndoor/train/door_0018.off\ndoor/train/door_0019.off\ndoor/train/door_0020.off\ndoor/train/door_0021.off\ndoor/train/door_0022.off\ndoor/train/door_0023.off\ndoor/train/door_0024.off\ndoor/train/door_0025.off\ndoor/train/door_0026.off\ndoor/train/door_0027.off\ndoor/train/door_0028.off\ndoor/train/door_0029.off\ndoor/train/door_0030.off\ndoor/train/door_0031.off\ndoor/train/door_0032.off\ndoor/train/door_0033.off\ndoor/train/door_0034.off\ndoor/train/door_0035.off\ndoor/train/door_0036.off\ndoor/train/door_0037.off\ndoor/train/door_0038.off\ndoor/train/door_0039.off\ndoor/train/door_0040.off\ndoor/train/door_0041.off\ndoor/train/door_0042.off\ndoor/train/door_0043.off\ndoor/train/door_0044.off\ndoor/train/door_0045.off\ndoor/train/door_0046.off\ndoor/train/door_0047.off\ndoor/train/door_0048.off\ndoor/train/door_0049.off\ndoor/train/door_0050.off\ndoor/train/door_0051.off\ndoor/train/door_0052.off\ndoor/train/door_0053.off\ndoor/train/door_0054.off\ndoor/train/door_0055.off\ndoor/train/door_0056.off\ndoor/train/door_0057.off\ndoor/train/door_0058.off\ndoor/train/door_0059.off\ndoor/train/door_0060.off\ndoor/train/door_0061.off\ndoor/train/door_0062.off\ndoor/train/door_0063.off\ndoor/train/door_0064.off\ndoor/train/door_0065.off\ndoor/train/door_0066.off\ndoor/train/door_0067.off\ndoor/train/door_0068.off\ndoor/train/door_0069.off\ndoor/train/door_0070.off\ndoor/train/door_0071.off\ndoor/train/door_0072.off\ndoor/train/door_0073.off\ndoor/train/door_0074.off\ndoor/train/door_0075.off\ndoor/train/door_0076.off\ndoor/train/door_0077.off\ndoor/train/door_0078.off\ndoor/train/door_0079.off\ndoor/train/door_0080.off\ndoor/train/door_0081.off\ndoor/train/door_0082.off\ndoor/train/door_0083.off\ndoor/train/door_0084.off\ndoor/train/door_0085.off\ndoor/train/door_0086.off\ndoor/train/door_0087.off\ndoor/train/door_0088.off\ndoor/train/door_0089.off\ndoor/train/door_0090.off\ndoor/train/door_0091.off\ndoor/train/door_0092.off\ndoor/train/door_0093.off\ndoor/train/door_0094.off\ndoor/train/door_0095.off\ndoor/train/door_0096.off\ndoor/train/door_0097.off\ndoor/train/door_0098.off\ndoor/train/door_0099.off\nrange_hood/train/range_hood_0001.off\nrange_hood/train/range_hood_0002.off\nrange_hood/train/range_hood_0003.off\nrange_hood/train/range_hood_0004.off\nrange_hood/train/range_hood_0005.off\nrange_hood/train/range_hood_0006.off\nrange_hood/train/range_hood_0007.off\nrange_hood/train/range_hood_0008.off\nrange_hood/train/range_hood_0009.off\nrange_hood/train/range_hood_0010.off\nrange_hood/train/range_hood_0011.off\nrange_hood/train/range_hood_0012.off\nrange_hood/train/range_hood_0013.off\nrange_hood/train/range_hood_0014.off\nrange_hood/train/range_hood_0015.off\nrange_hood/train/range_hood_0016.off\nrange_hood/train/range_hood_0017.off\nrange_hood/train/range_hood_0018.off\nrange_hood/train/range_hood_0019.off\nrange_hood/train/range_hood_0020.off\nrange_hood/train/range_hood_0021.off\nrange_hood/train/range_hood_0022.off\nrange_hood/train/range_hood_0023.off\nrange_hood/train/range_hood_0024.off\nrange_hood/train/range_hood_0025.off\nrange_hood/train/range_hood_0026.off\nrange_hood/train/range_hood_0027.off\nrange_hood/train/range_hood_0028.off\nrange_hood/train/range_hood_0029.off\nrange_hood/train/range_hood_0030.off\nrange_hood/train/range_hood_0031.off\nrange_hood/train/range_hood_0032.off\nrange_hood/train/range_hood_0033.off\nrange_hood/train/range_hood_0034.off\nrange_hood/train/range_hood_0035.off\nrange_hood/train/range_hood_0036.off\nrange_hood/train/range_hood_0037.off\nrange_hood/train/range_hood_0038.off\nrange_hood/train/range_hood_0039.off\nrange_hood/train/range_hood_0040.off\nrange_hood/train/range_hood_0041.off\nrange_hood/train/range_hood_0042.off\nrange_hood/train/range_hood_0043.off\nrange_hood/train/range_hood_0044.off\nrange_hood/train/range_hood_0045.off\nrange_hood/train/range_hood_0046.off\nrange_hood/train/range_hood_0047.off\nrange_hood/train/range_hood_0048.off\nrange_hood/train/range_hood_0049.off\nrange_hood/train/range_hood_0050.off\nrange_hood/train/range_hood_0051.off\nrange_hood/train/range_hood_0052.off\nrange_hood/train/range_hood_0053.off\nrange_hood/train/range_hood_0054.off\nrange_hood/train/range_hood_0055.off\nrange_hood/train/range_hood_0056.off\nrange_hood/train/range_hood_0057.off\nrange_hood/train/range_hood_0058.off\nrange_hood/train/range_hood_0059.off\nrange_hood/train/range_hood_0060.off\nrange_hood/train/range_hood_0061.off\nrange_hood/train/range_hood_0062.off\nrange_hood/train/range_hood_0063.off\nrange_hood/train/range_hood_0064.off\nrange_hood/train/range_hood_0065.off\nrange_hood/train/range_hood_0066.off\nrange_hood/train/range_hood_0067.off\nrange_hood/train/range_hood_0068.off\nrange_hood/train/range_hood_0069.off\nrange_hood/train/range_hood_0070.off\nrange_hood/train/range_hood_0071.off\nrange_hood/train/range_hood_0072.off\nrange_hood/train/range_hood_0073.off\nrange_hood/train/range_hood_0074.off\nrange_hood/train/range_hood_0075.off\nrange_hood/train/range_hood_0076.off\nrange_hood/train/range_hood_0077.off\nrange_hood/train/range_hood_0078.off\nrange_hood/train/range_hood_0079.off\nrange_hood/train/range_hood_0080.off\nrange_hood/train/range_hood_0081.off\nrange_hood/train/range_hood_0082.off\nrange_hood/train/range_hood_0083.off\nrange_hood/train/range_hood_0084.off\nrange_hood/train/range_hood_0085.off\nrange_hood/train/range_hood_0086.off\nrange_hood/train/range_hood_0087.off\nrange_hood/train/range_hood_0088.off\nrange_hood/train/range_hood_0089.off\nrange_hood/train/range_hood_0090.off\nrange_hood/train/range_hood_0091.off\nrange_hood/train/range_hood_0092.off\nrange_hood/train/range_hood_0093.off\nrange_hood/train/range_hood_0094.off\nrange_hood/train/range_hood_0095.off\nrange_hood/train/range_hood_0096.off\nrange_hood/train/range_hood_0097.off\nrange_hood/train/range_hood_0098.off\nrange_hood/train/range_hood_0099.off\nrange_hood/train/range_hood_0100.off\nrange_hood/train/range_hood_0101.off\nrange_hood/train/range_hood_0102.off\nrange_hood/train/range_hood_0103.off\nrange_hood/train/range_hood_0104.off\nflower_pot/train/flower_pot_0001.off\nflower_pot/train/flower_pot_0002.off\nflower_pot/train/flower_pot_0003.off\nflower_pot/train/flower_pot_0004.off\nflower_pot/train/flower_pot_0005.off\nflower_pot/train/flower_pot_0006.off\nflower_pot/train/flower_pot_0007.off\nflower_pot/train/flower_pot_0008.off\nflower_pot/train/flower_pot_0009.off\nflower_pot/train/flower_pot_0010.off\nflower_pot/train/flower_pot_0011.off\nflower_pot/train/flower_pot_0012.off\nflower_pot/train/flower_pot_0013.off\nflower_pot/train/flower_pot_0014.off\nflower_pot/train/flower_pot_0015.off\nflower_pot/train/flower_pot_0016.off\nflower_pot/train/flower_pot_0017.off\nflower_pot/train/flower_pot_0018.off\nflower_pot/train/flower_pot_0019.off\nflower_pot/train/flower_pot_0020.off\nflower_pot/train/flower_pot_0021.off\nflower_pot/train/flower_pot_0022.off\nflower_pot/train/flower_pot_0023.off\nflower_pot/train/flower_pot_0024.off\nflower_pot/train/flower_pot_0025.off\nflower_pot/train/flower_pot_0026.off\nflower_pot/train/flower_pot_0027.off\nflower_pot/train/flower_pot_0028.off\nflower_pot/train/flower_pot_0029.off\nflower_pot/train/flower_pot_0030.off\nflower_pot/train/flower_pot_0031.off\nflower_pot/train/flower_pot_0032.off\nflower_pot/train/flower_pot_0033.off\nflower_pot/train/flower_pot_0034.off\nflower_pot/train/flower_pot_0035.off\nflower_pot/train/flower_pot_0036.off\nflower_pot/train/flower_pot_0037.off\nflower_pot/train/flower_pot_0038.off\nflower_pot/train/flower_pot_0039.off\nflower_pot/train/flower_pot_0040.off\nflower_pot/train/flower_pot_0041.off\nflower_pot/train/flower_pot_0042.off\nflower_pot/train/flower_pot_0043.off\nflower_pot/train/flower_pot_0044.off\nflower_pot/train/flower_pot_0045.off\nflower_pot/train/flower_pot_0046.off\nflower_pot/train/flower_pot_0047.off\nflower_pot/train/flower_pot_0048.off\nflower_pot/train/flower_pot_0049.off\nflower_pot/train/flower_pot_0050.off\nflower_pot/train/flower_pot_0051.off\nflower_pot/train/flower_pot_0052.off\nflower_pot/train/flower_pot_0053.off\nflower_pot/train/flower_pot_0054.off\nflower_pot/train/flower_pot_0055.off\nflower_pot/train/flower_pot_0056.off\nflower_pot/train/flower_pot_0057.off\nflower_pot/train/flower_pot_0058.off\nflower_pot/train/flower_pot_0059.off\nflower_pot/train/flower_pot_0060.off\nflower_pot/train/flower_pot_0061.off\nflower_pot/train/flower_pot_0062.off\nflower_pot/train/flower_pot_0063.off\nflower_pot/train/flower_pot_0064.off\nflower_pot/train/flower_pot_0065.off\nflower_pot/train/flower_pot_0066.off\nflower_pot/train/flower_pot_0067.off\nflower_pot/train/flower_pot_0068.off\nflower_pot/train/flower_pot_0069.off\nflower_pot/train/flower_pot_0070.off\nflower_pot/train/flower_pot_0071.off\nflower_pot/train/flower_pot_0072.off\nflower_pot/train/flower_pot_0073.off\nflower_pot/train/flower_pot_0074.off\nflower_pot/train/flower_pot_0075.off\nflower_pot/train/flower_pot_0076.off\nflower_pot/train/flower_pot_0077.off\nflower_pot/train/flower_pot_0078.off\nflower_pot/train/flower_pot_0079.off\nflower_pot/train/flower_pot_0080.off\nflower_pot/train/flower_pot_0081.off\nflower_pot/train/flower_pot_0082.off\nflower_pot/train/flower_pot_0083.off\nflower_pot/train/flower_pot_0084.off\nflower_pot/train/flower_pot_0085.off\nflower_pot/train/flower_pot_0086.off\nflower_pot/train/flower_pot_0087.off\nflower_pot/train/flower_pot_0088.off\nflower_pot/train/flower_pot_0089.off\nflower_pot/train/flower_pot_0090.off\nflower_pot/train/flower_pot_0091.off\nflower_pot/train/flower_pot_0092.off\nflower_pot/train/flower_pot_0093.off\nflower_pot/train/flower_pot_0094.off\nflower_pot/train/flower_pot_0095.off\nflower_pot/train/flower_pot_0096.off\nflower_pot/train/flower_pot_0097.off\nflower_pot/train/flower_pot_0098.off\nflower_pot/train/flower_pot_0099.off\nflower_pot/train/flower_pot_0100.off\nflower_pot/train/flower_pot_0101.off\nflower_pot/train/flower_pot_0102.off\nflower_pot/train/flower_pot_0103.off\nflower_pot/train/flower_pot_0104.off\nflower_pot/train/flower_pot_0105.off\nflower_pot/train/flower_pot_0106.off\nflower_pot/train/flower_pot_0107.off\nflower_pot/train/flower_pot_0108.off\nflower_pot/train/flower_pot_0109.off\nflower_pot/train/flower_pot_0110.off\nflower_pot/train/flower_pot_0111.off\nflower_pot/train/flower_pot_0112.off\nflower_pot/train/flower_pot_0113.off\nflower_pot/train/flower_pot_0114.off\nflower_pot/train/flower_pot_0115.off\nflower_pot/train/flower_pot_0116.off\nflower_pot/train/flower_pot_0117.off\nflower_pot/train/flower_pot_0118.off\nflower_pot/train/flower_pot_0119.off\nflower_pot/train/flower_pot_0120.off\nflower_pot/train/flower_pot_0121.off\nflower_pot/train/flower_pot_0122.off\nflower_pot/train/flower_pot_0123.off\nflower_pot/train/flower_pot_0124.off\nflower_pot/train/flower_pot_0125.off\nflower_pot/train/flower_pot_0126.off\nflower_pot/train/flower_pot_0127.off\nflower_pot/train/flower_pot_0128.off\nflower_pot/train/flower_pot_0129.off\nflower_pot/train/flower_pot_0130.off\nflower_pot/train/flower_pot_0131.off\nflower_pot/train/flower_pot_0132.off\nflower_pot/train/flower_pot_0133.off\nflower_pot/train/flower_pot_0134.off\nflower_pot/train/flower_pot_0135.off"
  },
  {
    "path": "dataloader/split/train_scan2cad.txt",
    "content": "full_annotations_clean_train.json\n"
  },
  {
    "path": "dataloader/split/val_3dmatch.txt",
    "content": "sun3d-brown_bm_4-brown_bm_4\nsun3d-harvard_c11-hv_c11_2\n7-scenes-heads\nrgbd-scenes-v2-scene_10\nbundlefusion-office0\nanalysis-by-synthesis-apt2-kitchen\n"
  },
  {
    "path": "dataloader/split/val_kitti.txt",
    "content": "6\n7\n"
  },
  {
    "path": "dataloader/split/val_modelnet40.txt",
    "content": "glass_box/train/glass_box_0155.off\nglass_box/train/glass_box_0156.off\nglass_box/train/glass_box_0157.off\nglass_box/train/glass_box_0158.off\nglass_box/train/glass_box_0159.off\nglass_box/train/glass_box_0160.off\nglass_box/train/glass_box_0161.off\nglass_box/train/glass_box_0162.off\nglass_box/train/glass_box_0163.off\nglass_box/train/glass_box_0164.off\nglass_box/train/glass_box_0165.off\nglass_box/train/glass_box_0166.off\nglass_box/train/glass_box_0167.off\nglass_box/train/glass_box_0168.off\nglass_box/train/glass_box_0169.off\nglass_box/train/glass_box_0170.off\nglass_box/train/glass_box_0171.off\nlaptop/train/laptop_0136.off\nlaptop/train/laptop_0137.off\nlaptop/train/laptop_0138.off\nlaptop/train/laptop_0139.off\nlaptop/train/laptop_0140.off\nlaptop/train/laptop_0141.off\nlaptop/train/laptop_0142.off\nlaptop/train/laptop_0143.off\nlaptop/train/laptop_0144.off\nlaptop/train/laptop_0145.off\nlaptop/train/laptop_0146.off\nlaptop/train/laptop_0147.off\nlaptop/train/laptop_0148.off\nlaptop/train/laptop_0149.off\nsink/train/sink_0117.off\nsink/train/sink_0118.off\nsink/train/sink_0119.off\nsink/train/sink_0120.off\nsink/train/sink_0121.off\nsink/train/sink_0122.off\nsink/train/sink_0123.off\nsink/train/sink_0124.off\nsink/train/sink_0125.off\nsink/train/sink_0126.off\nsink/train/sink_0127.off\nsink/train/sink_0128.off\nnight_stand/train/night_stand_0181.off\nnight_stand/train/night_stand_0182.off\nnight_stand/train/night_stand_0183.off\nnight_stand/train/night_stand_0184.off\nnight_stand/train/night_stand_0185.off\nnight_stand/train/night_stand_0186.off\nnight_stand/train/night_stand_0187.off\nnight_stand/train/night_stand_0188.off\nnight_stand/train/night_stand_0189.off\nnight_stand/train/night_stand_0190.off\nnight_stand/train/night_stand_0191.off\nnight_stand/train/night_stand_0192.off\nnight_stand/train/night_stand_0193.off\nnight_stand/train/night_stand_0194.off\nnight_stand/train/night_stand_0195.off\nnight_stand/train/night_stand_0196.off\nnight_stand/train/night_stand_0197.off\nnight_stand/train/night_stand_0198.off\nnight_stand/train/night_stand_0199.off\nnight_stand/train/night_stand_0200.off\ncar/train/car_0179.off\ncar/train/car_0180.off\ncar/train/car_0181.off\ncar/train/car_0182.off\ncar/train/car_0183.off\ncar/train/car_0184.off\ncar/train/car_0185.off\ncar/train/car_0186.off\ncar/train/car_0187.off\ncar/train/car_0188.off\ncar/train/car_0189.off\ncar/train/car_0190.off\ncar/train/car_0191.off\ncar/train/car_0192.off\ncar/train/car_0193.off\ncar/train/car_0194.off\ncar/train/car_0195.off\ncar/train/car_0196.off\ncar/train/car_0197.off\ndresser/train/dresser_0181.off\ndresser/train/dresser_0182.off\ndresser/train/dresser_0183.off\ndresser/train/dresser_0184.off\ndresser/train/dresser_0185.off\ndresser/train/dresser_0186.off\ndresser/train/dresser_0187.off\ndresser/train/dresser_0188.off\ndresser/train/dresser_0189.off\ndresser/train/dresser_0190.off\ndresser/train/dresser_0191.off\ndresser/train/dresser_0192.off\ndresser/train/dresser_0193.off\ndresser/train/dresser_0194.off\ndresser/train/dresser_0195.off\ndresser/train/dresser_0196.off\ndresser/train/dresser_0197.off\ndresser/train/dresser_0198.off\ndresser/train/dresser_0199.off\ndresser/train/dresser_0200.off\ntoilet/train/toilet_0311.off\ntoilet/train/toilet_0312.off\ntoilet/train/toilet_0313.off\ntoilet/train/toilet_0314.off\ntoilet/train/toilet_0315.off\ntoilet/train/toilet_0316.off\ntoilet/train/toilet_0317.off\ntoilet/train/toilet_0318.off\ntoilet/train/toilet_0319.off\ntoilet/train/toilet_0320.off\ntoilet/train/toilet_0321.off\ntoilet/train/toilet_0322.off\ntoilet/train/toilet_0323.off\ntoilet/train/toilet_0324.off\ntoilet/train/toilet_0325.off\ntoilet/train/toilet_0326.off\ntoilet/train/toilet_0327.off\ntoilet/train/toilet_0328.off\ntoilet/train/toilet_0329.off\ntoilet/train/toilet_0330.off\ntoilet/train/toilet_0331.off\ntoilet/train/toilet_0332.off\ntoilet/train/toilet_0333.off\ntoilet/train/toilet_0334.off\ntoilet/train/toilet_0335.off\ntoilet/train/toilet_0336.off\ntoilet/train/toilet_0337.off\ntoilet/train/toilet_0338.off\ntoilet/train/toilet_0339.off\ntoilet/train/toilet_0340.off\ntoilet/train/toilet_0341.off\ntoilet/train/toilet_0342.off\ntoilet/train/toilet_0343.off\ntoilet/train/toilet_0344.off\ncurtain/train/curtain_0126.off\ncurtain/train/curtain_0127.off\ncurtain/train/curtain_0128.off\ncurtain/train/curtain_0129.off\ncurtain/train/curtain_0130.off\ncurtain/train/curtain_0131.off\ncurtain/train/curtain_0132.off\ncurtain/train/curtain_0133.off\ncurtain/train/curtain_0134.off\ncurtain/train/curtain_0135.off\ncurtain/train/curtain_0136.off\ncurtain/train/curtain_0137.off\ncurtain/train/curtain_0138.off\nwardrobe/train/wardrobe_0080.off\nwardrobe/train/wardrobe_0081.off\nwardrobe/train/wardrobe_0082.off\nwardrobe/train/wardrobe_0083.off\nwardrobe/train/wardrobe_0084.off\nwardrobe/train/wardrobe_0085.off\nwardrobe/train/wardrobe_0086.off\nwardrobe/train/wardrobe_0087.off\nstool/train/stool_0082.off\nstool/train/stool_0083.off\nstool/train/stool_0084.off\nstool/train/stool_0085.off\nstool/train/stool_0086.off\nstool/train/stool_0087.off\nstool/train/stool_0088.off\nstool/train/stool_0089.off\nstool/train/stool_0090.off\nmantel/train/mantel_0257.off\nmantel/train/mantel_0258.off\nmantel/train/mantel_0259.off\nmantel/train/mantel_0260.off\nmantel/train/mantel_0261.off\nmantel/train/mantel_0262.off\nmantel/train/mantel_0263.off\nmantel/train/mantel_0264.off\nmantel/train/mantel_0265.off\nmantel/train/mantel_0266.off\nmantel/train/mantel_0267.off\nmantel/train/mantel_0268.off\nmantel/train/mantel_0269.off\nmantel/train/mantel_0270.off\nmantel/train/mantel_0271.off\nmantel/train/mantel_0272.off\nmantel/train/mantel_0273.off\nmantel/train/mantel_0274.off\nmantel/train/mantel_0275.off\nmantel/train/mantel_0276.off\nmantel/train/mantel_0277.off\nmantel/train/mantel_0278.off\nmantel/train/mantel_0279.off\nmantel/train/mantel_0280.off\nmantel/train/mantel_0281.off\nmantel/train/mantel_0282.off\nmantel/train/mantel_0283.off\nmantel/train/mantel_0284.off\ncup/train/cup_0073.off\ncup/train/cup_0074.off\ncup/train/cup_0075.off\ncup/train/cup_0076.off\ncup/train/cup_0077.off\ncup/train/cup_0078.off\ncup/train/cup_0079.off\nradio/train/radio_0095.off\nradio/train/radio_0096.off\nradio/train/radio_0097.off\nradio/train/radio_0098.off\nradio/train/radio_0099.off\nradio/train/radio_0100.off\nradio/train/radio_0101.off\nradio/train/radio_0102.off\nradio/train/radio_0103.off\nradio/train/radio_0104.off\nairplane/train/airplane_0565.off\nairplane/train/airplane_0566.off\nairplane/train/airplane_0567.off\nairplane/train/airplane_0568.off\nairplane/train/airplane_0569.off\nairplane/train/airplane_0570.off\nairplane/train/airplane_0571.off\nairplane/train/airplane_0572.off\nairplane/train/airplane_0573.off\nairplane/train/airplane_0574.off\nairplane/train/airplane_0575.off\nairplane/train/airplane_0576.off\nairplane/train/airplane_0577.off\nairplane/train/airplane_0578.off\nairplane/train/airplane_0579.off\nairplane/train/airplane_0580.off\nairplane/train/airplane_0581.off\nairplane/train/airplane_0582.off\nairplane/train/airplane_0583.off\nairplane/train/airplane_0584.off\nairplane/train/airplane_0585.off\nairplane/train/airplane_0586.off\nairplane/train/airplane_0587.off\nairplane/train/airplane_0588.off\nairplane/train/airplane_0589.off\nairplane/train/airplane_0590.off\nairplane/train/airplane_0591.off\nairplane/train/airplane_0592.off\nairplane/train/airplane_0593.off\nairplane/train/airplane_0594.off\nairplane/train/airplane_0595.off\nairplane/train/airplane_0596.off\nairplane/train/airplane_0597.off\nairplane/train/airplane_0598.off\nairplane/train/airplane_0599.off\nairplane/train/airplane_0600.off\nairplane/train/airplane_0601.off\nairplane/train/airplane_0602.off\nairplane/train/airplane_0603.off\nairplane/train/airplane_0604.off\nairplane/train/airplane_0605.off\nairplane/train/airplane_0606.off\nairplane/train/airplane_0607.off\nairplane/train/airplane_0608.off\nairplane/train/airplane_0609.off\nairplane/train/airplane_0610.off\nairplane/train/airplane_0611.off\nairplane/train/airplane_0612.off\nairplane/train/airplane_0613.off\nairplane/train/airplane_0614.off\nairplane/train/airplane_0615.off\nairplane/train/airplane_0616.off\nairplane/train/airplane_0617.off\nairplane/train/airplane_0618.off\nairplane/train/airplane_0619.off\nairplane/train/airplane_0620.off\nairplane/train/airplane_0621.off\nairplane/train/airplane_0622.off\nairplane/train/airplane_0623.off\nairplane/train/airplane_0624.off\nairplane/train/airplane_0625.off\nairplane/train/airplane_0626.off\ntable/train/table_0354.off\ntable/train/table_0355.off\ntable/train/table_0356.off\ntable/train/table_0357.off\ntable/train/table_0358.off\ntable/train/table_0359.off\ntable/train/table_0360.off\ntable/train/table_0361.off\ntable/train/table_0362.off\ntable/train/table_0363.off\ntable/train/table_0364.off\ntable/train/table_0365.off\ntable/train/table_0366.off\ntable/train/table_0367.off\ntable/train/table_0368.off\ntable/train/table_0369.off\ntable/train/table_0370.off\ntable/train/table_0371.off\ntable/train/table_0372.off\ntable/train/table_0373.off\ntable/train/table_0374.off\ntable/train/table_0375.off\ntable/train/table_0376.off\ntable/train/table_0377.off\ntable/train/table_0378.off\ntable/train/table_0379.off\ntable/train/table_0380.off\ntable/train/table_0381.off\ntable/train/table_0382.off\ntable/train/table_0383.off\ntable/train/table_0384.off\ntable/train/table_0385.off\ntable/train/table_0386.off\ntable/train/table_0387.off\ntable/train/table_0388.off\ntable/train/table_0389.off\ntable/train/table_0390.off\ntable/train/table_0391.off\ntable/train/table_0392.off\nbench/train/bench_0157.off\nbench/train/bench_0158.off\nbench/train/bench_0159.off\nbench/train/bench_0160.off\nbench/train/bench_0161.off\nbench/train/bench_0162.off\nbench/train/bench_0163.off\nbench/train/bench_0164.off\nbench/train/bench_0165.off\nbench/train/bench_0166.off\nbench/train/bench_0167.off\nbench/train/bench_0168.off\nbench/train/bench_0169.off\nbench/train/bench_0170.off\nbench/train/bench_0171.off\nbench/train/bench_0172.off\nbench/train/bench_0173.off\nplant/train/plant_0217.off\nplant/train/plant_0218.off\nplant/train/plant_0219.off\nplant/train/plant_0220.off\nplant/train/plant_0221.off\nplant/train/plant_0222.off\nplant/train/plant_0223.off\nplant/train/plant_0224.off\nplant/train/plant_0225.off\nplant/train/plant_0226.off\nplant/train/plant_0227.off\nplant/train/plant_0228.off\nplant/train/plant_0229.off\nplant/train/plant_0230.off\nplant/train/plant_0231.off\nplant/train/plant_0232.off\nplant/train/plant_0233.off\nplant/train/plant_0234.off\nplant/train/plant_0235.off\nplant/train/plant_0236.off\nplant/train/plant_0237.off\nplant/train/plant_0238.off\nplant/train/plant_0239.off\nplant/train/plant_0240.off\nchair/train/chair_0802.off\nchair/train/chair_0803.off\nchair/train/chair_0804.off\nchair/train/chair_0805.off\nchair/train/chair_0806.off\nchair/train/chair_0807.off\nchair/train/chair_0808.off\nchair/train/chair_0809.off\nchair/train/chair_0810.off\nchair/train/chair_0811.off\nchair/train/chair_0812.off\nchair/train/chair_0813.off\nchair/train/chair_0814.off\nchair/train/chair_0815.off\nchair/train/chair_0816.off\nchair/train/chair_0817.off\nchair/train/chair_0818.off\nchair/train/chair_0819.off\nchair/train/chair_0820.off\nchair/train/chair_0821.off\nchair/train/chair_0822.off\nchair/train/chair_0823.off\nchair/train/chair_0824.off\nchair/train/chair_0825.off\nchair/train/chair_0826.off\nchair/train/chair_0827.off\nchair/train/chair_0828.off\nchair/train/chair_0829.off\nchair/train/chair_0830.off\nchair/train/chair_0831.off\nchair/train/chair_0832.off\nchair/train/chair_0833.off\nchair/train/chair_0834.off\nchair/train/chair_0835.off\nchair/train/chair_0836.off\nchair/train/chair_0837.off\nchair/train/chair_0838.off\nchair/train/chair_0839.off\nchair/train/chair_0840.off\nchair/train/chair_0841.off\nchair/train/chair_0842.off\nchair/train/chair_0843.off\nchair/train/chair_0844.off\nchair/train/chair_0845.off\nchair/train/chair_0846.off\nchair/train/chair_0847.off\nchair/train/chair_0848.off\nchair/train/chair_0849.off\nchair/train/chair_0850.off\nchair/train/chair_0851.off\nchair/train/chair_0852.off\nchair/train/chair_0853.off\nchair/train/chair_0854.off\nchair/train/chair_0855.off\nchair/train/chair_0856.off\nchair/train/chair_0857.off\nchair/train/chair_0858.off\nchair/train/chair_0859.off\nchair/train/chair_0860.off\nchair/train/chair_0861.off\nchair/train/chair_0862.off\nchair/train/chair_0863.off\nchair/train/chair_0864.off\nchair/train/chair_0865.off\nchair/train/chair_0866.off\nchair/train/chair_0867.off\nchair/train/chair_0868.off\nchair/train/chair_0869.off\nchair/train/chair_0870.off\nchair/train/chair_0871.off\nchair/train/chair_0872.off\nchair/train/chair_0873.off\nchair/train/chair_0874.off\nchair/train/chair_0875.off\nchair/train/chair_0876.off\nchair/train/chair_0877.off\nchair/train/chair_0878.off\nchair/train/chair_0879.off\nchair/train/chair_0880.off\nchair/train/chair_0881.off\nchair/train/chair_0882.off\nchair/train/chair_0883.off\nchair/train/chair_0884.off\nchair/train/chair_0885.off\nchair/train/chair_0886.off\nchair/train/chair_0887.off\nchair/train/chair_0888.off\nchair/train/chair_0889.off\nvase/train/vase_0429.off\nvase/train/vase_0430.off\nvase/train/vase_0431.off\nvase/train/vase_0432.off\nvase/train/vase_0433.off\nvase/train/vase_0434.off\nvase/train/vase_0435.off\nvase/train/vase_0436.off\nvase/train/vase_0437.off\nvase/train/vase_0438.off\nvase/train/vase_0439.off\nvase/train/vase_0440.off\nvase/train/vase_0441.off\nvase/train/vase_0442.off\nvase/train/vase_0443.off\nvase/train/vase_0444.off\nvase/train/vase_0445.off\nvase/train/vase_0446.off\nvase/train/vase_0447.off\nvase/train/vase_0448.off\nvase/train/vase_0449.off\nvase/train/vase_0450.off\nvase/train/vase_0451.off\nvase/train/vase_0452.off\nvase/train/vase_0453.off\nvase/train/vase_0454.off\nvase/train/vase_0455.off\nvase/train/vase_0456.off\nvase/train/vase_0457.off\nvase/train/vase_0458.off\nvase/train/vase_0459.off\nvase/train/vase_0460.off\nvase/train/vase_0461.off\nvase/train/vase_0462.off\nvase/train/vase_0463.off\nvase/train/vase_0464.off\nvase/train/vase_0465.off\nvase/train/vase_0466.off\nvase/train/vase_0467.off\nvase/train/vase_0468.off\nvase/train/vase_0469.off\nvase/train/vase_0470.off\nvase/train/vase_0471.off\nvase/train/vase_0472.off\nvase/train/vase_0473.off\nvase/train/vase_0474.off\nvase/train/vase_0475.off\nbookshelf/train/bookshelf_0516.off\nbookshelf/train/bookshelf_0517.off\nbookshelf/train/bookshelf_0518.off\nbookshelf/train/bookshelf_0519.off\nbookshelf/train/bookshelf_0520.off\nbookshelf/train/bookshelf_0521.off\nbookshelf/train/bookshelf_0522.off\nbookshelf/train/bookshelf_0523.off\nbookshelf/train/bookshelf_0524.off\nbookshelf/train/bookshelf_0525.off\nbookshelf/train/bookshelf_0526.off\nbookshelf/train/bookshelf_0527.off\nbookshelf/train/bookshelf_0528.off\nbookshelf/train/bookshelf_0529.off\nbookshelf/train/bookshelf_0530.off\nbookshelf/train/bookshelf_0531.off\nbookshelf/train/bookshelf_0532.off\nbookshelf/train/bookshelf_0533.off\nbookshelf/train/bookshelf_0534.off\nbookshelf/train/bookshelf_0535.off\nbookshelf/train/bookshelf_0536.off\nbookshelf/train/bookshelf_0537.off\nbookshelf/train/bookshelf_0538.off\nbookshelf/train/bookshelf_0539.off\nbookshelf/train/bookshelf_0540.off\nbookshelf/train/bookshelf_0541.off\nbookshelf/train/bookshelf_0542.off\nbookshelf/train/bookshelf_0543.off\nbookshelf/train/bookshelf_0544.off\nbookshelf/train/bookshelf_0545.off\nbookshelf/train/bookshelf_0546.off\nbookshelf/train/bookshelf_0547.off\nbookshelf/train/bookshelf_0548.off\nbookshelf/train/bookshelf_0549.off\nbookshelf/train/bookshelf_0550.off\nbookshelf/train/bookshelf_0551.off\nbookshelf/train/bookshelf_0552.off\nbookshelf/train/bookshelf_0553.off\nbookshelf/train/bookshelf_0554.off\nbookshelf/train/bookshelf_0555.off\nbookshelf/train/bookshelf_0556.off\nbookshelf/train/bookshelf_0557.off\nbookshelf/train/bookshelf_0558.off\nbookshelf/train/bookshelf_0559.off\nbookshelf/train/bookshelf_0560.off\nbookshelf/train/bookshelf_0561.off\nbookshelf/train/bookshelf_0562.off\nbookshelf/train/bookshelf_0563.off\nbookshelf/train/bookshelf_0564.off\nbookshelf/train/bookshelf_0565.off\nbookshelf/train/bookshelf_0566.off\nbookshelf/train/bookshelf_0567.off\nbookshelf/train/bookshelf_0568.off\nbookshelf/train/bookshelf_0569.off\nbookshelf/train/bookshelf_0570.off\nbookshelf/train/bookshelf_0571.off\nbookshelf/train/bookshelf_0572.off\nguitar/train/guitar_0141.off\nguitar/train/guitar_0142.off\nguitar/train/guitar_0143.off\nguitar/train/guitar_0144.off\nguitar/train/guitar_0145.off\nguitar/train/guitar_0146.off\nguitar/train/guitar_0147.off\nguitar/train/guitar_0148.off\nguitar/train/guitar_0149.off\nguitar/train/guitar_0150.off\nguitar/train/guitar_0151.off\nguitar/train/guitar_0152.off\nguitar/train/guitar_0153.off\nguitar/train/guitar_0154.off\nguitar/train/guitar_0155.off\ntv_stand/train/tv_stand_0242.off\ntv_stand/train/tv_stand_0243.off\ntv_stand/train/tv_stand_0244.off\ntv_stand/train/tv_stand_0245.off\ntv_stand/train/tv_stand_0246.off\ntv_stand/train/tv_stand_0247.off\ntv_stand/train/tv_stand_0248.off\ntv_stand/train/tv_stand_0249.off\ntv_stand/train/tv_stand_0250.off\ntv_stand/train/tv_stand_0251.off\ntv_stand/train/tv_stand_0252.off\ntv_stand/train/tv_stand_0253.off\ntv_stand/train/tv_stand_0254.off\ntv_stand/train/tv_stand_0255.off\ntv_stand/train/tv_stand_0256.off\ntv_stand/train/tv_stand_0257.off\ntv_stand/train/tv_stand_0258.off\ntv_stand/train/tv_stand_0259.off\ntv_stand/train/tv_stand_0260.off\ntv_stand/train/tv_stand_0261.off\ntv_stand/train/tv_stand_0262.off\ntv_stand/train/tv_stand_0263.off\ntv_stand/train/tv_stand_0264.off\ntv_stand/train/tv_stand_0265.off\ntv_stand/train/tv_stand_0266.off\ntv_stand/train/tv_stand_0267.off\nbathtub/train/bathtub_0097.off\nbathtub/train/bathtub_0098.off\nbathtub/train/bathtub_0099.off\nbathtub/train/bathtub_0100.off\nbathtub/train/bathtub_0101.off\nbathtub/train/bathtub_0102.off\nbathtub/train/bathtub_0103.off\nbathtub/train/bathtub_0104.off\nbathtub/train/bathtub_0105.off\nbathtub/train/bathtub_0106.off\nmonitor/train/monitor_0420.off\nmonitor/train/monitor_0421.off\nmonitor/train/monitor_0422.off\nmonitor/train/monitor_0423.off\nmonitor/train/monitor_0424.off\nmonitor/train/monitor_0425.off\nmonitor/train/monitor_0426.off\nmonitor/train/monitor_0427.off\nmonitor/train/monitor_0428.off\nmonitor/train/monitor_0429.off\nmonitor/train/monitor_0430.off\nmonitor/train/monitor_0431.off\nmonitor/train/monitor_0432.off\nmonitor/train/monitor_0433.off\nmonitor/train/monitor_0434.off\nmonitor/train/monitor_0435.off\nmonitor/train/monitor_0436.off\nmonitor/train/monitor_0437.off\nmonitor/train/monitor_0438.off\nmonitor/train/monitor_0439.off\nmonitor/train/monitor_0440.off\nmonitor/train/monitor_0441.off\nmonitor/train/monitor_0442.off\nmonitor/train/monitor_0443.off\nmonitor/train/monitor_0444.off\nmonitor/train/monitor_0445.off\nmonitor/train/monitor_0446.off\nmonitor/train/monitor_0447.off\nmonitor/train/monitor_0448.off\nmonitor/train/monitor_0449.off\nmonitor/train/monitor_0450.off\nmonitor/train/monitor_0451.off\nmonitor/train/monitor_0452.off\nmonitor/train/monitor_0453.off\nmonitor/train/monitor_0454.off\nmonitor/train/monitor_0455.off\nmonitor/train/monitor_0456.off\nmonitor/train/monitor_0457.off\nmonitor/train/monitor_0458.off\nmonitor/train/monitor_0459.off\nmonitor/train/monitor_0460.off\nmonitor/train/monitor_0461.off\nmonitor/train/monitor_0462.off\nmonitor/train/monitor_0463.off\nmonitor/train/monitor_0464.off\nmonitor/train/monitor_0465.off\nbottle/train/bottle_0303.off\nbottle/train/bottle_0304.off\nbottle/train/bottle_0305.off\nbottle/train/bottle_0306.off\nbottle/train/bottle_0307.off\nbottle/train/bottle_0308.off\nbottle/train/bottle_0309.off\nbottle/train/bottle_0310.off\nbottle/train/bottle_0311.off\nbottle/train/bottle_0312.off\nbottle/train/bottle_0313.off\nbottle/train/bottle_0314.off\nbottle/train/bottle_0315.off\nbottle/train/bottle_0316.off\nbottle/train/bottle_0317.off\nbottle/train/bottle_0318.off\nbottle/train/bottle_0319.off\nbottle/train/bottle_0320.off\nbottle/train/bottle_0321.off\nbottle/train/bottle_0322.off\nbottle/train/bottle_0323.off\nbottle/train/bottle_0324.off\nbottle/train/bottle_0325.off\nbottle/train/bottle_0326.off\nbottle/train/bottle_0327.off\nbottle/train/bottle_0328.off\nbottle/train/bottle_0329.off\nbottle/train/bottle_0330.off\nbottle/train/bottle_0331.off\nbottle/train/bottle_0332.off\nbottle/train/bottle_0333.off\nbottle/train/bottle_0334.off\nbottle/train/bottle_0335.off\nbowl/train/bowl_0059.off\nbowl/train/bowl_0060.off\nbowl/train/bowl_0061.off\nbowl/train/bowl_0062.off\nbowl/train/bowl_0063.off\nbowl/train/bowl_0064.off\nkeyboard/train/keyboard_0132.off\nkeyboard/train/keyboard_0133.off\nkeyboard/train/keyboard_0134.off\nkeyboard/train/keyboard_0135.off\nkeyboard/train/keyboard_0136.off\nkeyboard/train/keyboard_0137.off\nkeyboard/train/keyboard_0138.off\nkeyboard/train/keyboard_0139.off\nkeyboard/train/keyboard_0140.off\nkeyboard/train/keyboard_0141.off\nkeyboard/train/keyboard_0142.off\nkeyboard/train/keyboard_0143.off\nkeyboard/train/keyboard_0144.off\nkeyboard/train/keyboard_0145.off\ndesk/train/desk_0181.off\ndesk/train/desk_0182.off\ndesk/train/desk_0183.off\ndesk/train/desk_0184.off\ndesk/train/desk_0185.off\ndesk/train/desk_0186.off\ndesk/train/desk_0187.off\ndesk/train/desk_0188.off\ndesk/train/desk_0189.off\ndesk/train/desk_0190.off\ndesk/train/desk_0191.off\ndesk/train/desk_0192.off\ndesk/train/desk_0193.off\ndesk/train/desk_0194.off\ndesk/train/desk_0195.off\ndesk/train/desk_0196.off\ndesk/train/desk_0197.off\ndesk/train/desk_0198.off\ndesk/train/desk_0199.off\ndesk/train/desk_0200.off\nbed/train/bed_0465.off\nbed/train/bed_0466.off\nbed/train/bed_0467.off\nbed/train/bed_0468.off\nbed/train/bed_0469.off\nbed/train/bed_0470.off\nbed/train/bed_0471.off\nbed/train/bed_0472.off\nbed/train/bed_0473.off\nbed/train/bed_0474.off\nbed/train/bed_0475.off\nbed/train/bed_0476.off\nbed/train/bed_0477.off\nbed/train/bed_0478.off\nbed/train/bed_0479.off\nbed/train/bed_0480.off\nbed/train/bed_0481.off\nbed/train/bed_0482.off\nbed/train/bed_0483.off\nbed/train/bed_0484.off\nbed/train/bed_0485.off\nbed/train/bed_0486.off\nbed/train/bed_0487.off\nbed/train/bed_0488.off\nbed/train/bed_0489.off\nbed/train/bed_0490.off\nbed/train/bed_0491.off\nbed/train/bed_0492.off\nbed/train/bed_0493.off\nbed/train/bed_0494.off\nbed/train/bed_0495.off\nbed/train/bed_0496.off\nbed/train/bed_0497.off\nbed/train/bed_0498.off\nbed/train/bed_0499.off\nbed/train/bed_0500.off\nbed/train/bed_0501.off\nbed/train/bed_0502.off\nbed/train/bed_0503.off\nbed/train/bed_0504.off\nbed/train/bed_0505.off\nbed/train/bed_0506.off\nbed/train/bed_0507.off\nbed/train/bed_0508.off\nbed/train/bed_0509.off\nbed/train/bed_0510.off\nbed/train/bed_0511.off\nbed/train/bed_0512.off\nbed/train/bed_0513.off\nbed/train/bed_0514.off\nbed/train/bed_0515.off\ntent/train/tent_0148.off\ntent/train/tent_0149.off\ntent/train/tent_0150.off\ntent/train/tent_0151.off\ntent/train/tent_0152.off\ntent/train/tent_0153.off\ntent/train/tent_0154.off\ntent/train/tent_0155.off\ntent/train/tent_0156.off\ntent/train/tent_0157.off\ntent/train/tent_0158.off\ntent/train/tent_0159.off\ntent/train/tent_0160.off\ntent/train/tent_0161.off\ntent/train/tent_0162.off\ntent/train/tent_0163.off\npiano/train/piano_0209.off\npiano/train/piano_0210.off\npiano/train/piano_0211.off\npiano/train/piano_0212.off\npiano/train/piano_0213.off\npiano/train/piano_0214.off\npiano/train/piano_0215.off\npiano/train/piano_0216.off\npiano/train/piano_0217.off\npiano/train/piano_0218.off\npiano/train/piano_0219.off\npiano/train/piano_0220.off\npiano/train/piano_0221.off\npiano/train/piano_0222.off\npiano/train/piano_0223.off\npiano/train/piano_0224.off\npiano/train/piano_0225.off\npiano/train/piano_0226.off\npiano/train/piano_0227.off\npiano/train/piano_0228.off\npiano/train/piano_0229.off\npiano/train/piano_0230.off\npiano/train/piano_0231.off\nsofa/train/sofa_0613.off\nsofa/train/sofa_0614.off\nsofa/train/sofa_0615.off\nsofa/train/sofa_0616.off\nsofa/train/sofa_0617.off\nsofa/train/sofa_0618.off\nsofa/train/sofa_0619.off\nsofa/train/sofa_0620.off\nsofa/train/sofa_0621.off\nsofa/train/sofa_0622.off\nsofa/train/sofa_0623.off\nsofa/train/sofa_0624.off\nsofa/train/sofa_0625.off\nsofa/train/sofa_0626.off\nsofa/train/sofa_0627.off\nsofa/train/sofa_0628.off\nsofa/train/sofa_0629.off\nsofa/train/sofa_0630.off\nsofa/train/sofa_0631.off\nsofa/train/sofa_0632.off\nsofa/train/sofa_0633.off\nsofa/train/sofa_0634.off\nsofa/train/sofa_0635.off\nsofa/train/sofa_0636.off\nsofa/train/sofa_0637.off\nsofa/train/sofa_0638.off\nsofa/train/sofa_0639.off\nsofa/train/sofa_0640.off\nsofa/train/sofa_0641.off\nsofa/train/sofa_0642.off\nsofa/train/sofa_0643.off\nsofa/train/sofa_0644.off\nsofa/train/sofa_0645.off\nsofa/train/sofa_0646.off\nsofa/train/sofa_0647.off\nsofa/train/sofa_0648.off\nsofa/train/sofa_0649.off\nsofa/train/sofa_0650.off\nsofa/train/sofa_0651.off\nsofa/train/sofa_0652.off\nsofa/train/sofa_0653.off\nsofa/train/sofa_0654.off\nsofa/train/sofa_0655.off\nsofa/train/sofa_0656.off\nsofa/train/sofa_0657.off\nsofa/train/sofa_0658.off\nsofa/train/sofa_0659.off\nsofa/train/sofa_0660.off\nsofa/train/sofa_0661.off\nsofa/train/sofa_0662.off\nsofa/train/sofa_0663.off\nsofa/train/sofa_0664.off\nsofa/train/sofa_0665.off\nsofa/train/sofa_0666.off\nsofa/train/sofa_0667.off\nsofa/train/sofa_0668.off\nsofa/train/sofa_0669.off\nsofa/train/sofa_0670.off\nsofa/train/sofa_0671.off\nsofa/train/sofa_0672.off\nsofa/train/sofa_0673.off\nsofa/train/sofa_0674.off\nsofa/train/sofa_0675.off\nsofa/train/sofa_0676.off\nsofa/train/sofa_0677.off\nsofa/train/sofa_0678.off\nsofa/train/sofa_0679.off\nsofa/train/sofa_0680.off\nperson/train/person_0081.off\nperson/train/person_0082.off\nperson/train/person_0083.off\nperson/train/person_0084.off\nperson/train/person_0085.off\nperson/train/person_0086.off\nperson/train/person_0087.off\nperson/train/person_0088.off\nxbox/train/xbox_0094.off\nxbox/train/xbox_0095.off\nxbox/train/xbox_0096.off\nxbox/train/xbox_0097.off\nxbox/train/xbox_0098.off\nxbox/train/xbox_0099.off\nxbox/train/xbox_0100.off\nxbox/train/xbox_0101.off\nxbox/train/xbox_0102.off\nxbox/train/xbox_0103.off\nstairs/train/stairs_0113.off\nstairs/train/stairs_0114.off\nstairs/train/stairs_0115.off\nstairs/train/stairs_0116.off\nstairs/train/stairs_0117.off\nstairs/train/stairs_0118.off\nstairs/train/stairs_0119.off\nstairs/train/stairs_0120.off\nstairs/train/stairs_0121.off\nstairs/train/stairs_0122.off\nstairs/train/stairs_0123.off\nstairs/train/stairs_0124.off\ncone/train/cone_0152.off\ncone/train/cone_0153.off\ncone/train/cone_0154.off\ncone/train/cone_0155.off\ncone/train/cone_0156.off\ncone/train/cone_0157.off\ncone/train/cone_0158.off\ncone/train/cone_0159.off\ncone/train/cone_0160.off\ncone/train/cone_0161.off\ncone/train/cone_0162.off\ncone/train/cone_0163.off\ncone/train/cone_0164.off\ncone/train/cone_0165.off\ncone/train/cone_0166.off\ncone/train/cone_0167.off\nlamp/train/lamp_0113.off\nlamp/train/lamp_0114.off\nlamp/train/lamp_0115.off\nlamp/train/lamp_0116.off\nlamp/train/lamp_0117.off\nlamp/train/lamp_0118.off\nlamp/train/lamp_0119.off\nlamp/train/lamp_0120.off\nlamp/train/lamp_0121.off\nlamp/train/lamp_0122.off\nlamp/train/lamp_0123.off\nlamp/train/lamp_0124.off\ndoor/train/door_0100.off\ndoor/train/door_0101.off\ndoor/train/door_0102.off\ndoor/train/door_0103.off\ndoor/train/door_0104.off\ndoor/train/door_0105.off\ndoor/train/door_0106.off\ndoor/train/door_0107.off\ndoor/train/door_0108.off\ndoor/train/door_0109.off\nrange_hood/train/range_hood_0105.off\nrange_hood/train/range_hood_0106.off\nrange_hood/train/range_hood_0107.off\nrange_hood/train/range_hood_0108.off\nrange_hood/train/range_hood_0109.off\nrange_hood/train/range_hood_0110.off\nrange_hood/train/range_hood_0111.off\nrange_hood/train/range_hood_0112.off\nrange_hood/train/range_hood_0113.off\nrange_hood/train/range_hood_0114.off\nrange_hood/train/range_hood_0115.off\nflower_pot/train/flower_pot_0136.off\nflower_pot/train/flower_pot_0137.off\nflower_pot/train/flower_pot_0138.off\nflower_pot/train/flower_pot_0139.off\nflower_pot/train/flower_pot_0140.off\nflower_pot/train/flower_pot_0141.off\nflower_pot/train/flower_pot_0142.off\nflower_pot/train/flower_pot_0143.off\nflower_pot/train/flower_pot_0144.off\nflower_pot/train/flower_pot_0145.off\nflower_pot/train/flower_pot_0146.off\nflower_pot/train/flower_pot_0147.off\nflower_pot/train/flower_pot_0148.off\nflower_pot/train/flower_pot_0149.off"
  },
  {
    "path": "dataloader/split/val_scan2cad.txt",
    "content": "full_annotations_clean_val.json\n"
  },
  {
    "path": "dataloader/threedmatch_loader.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport glob\n\nfrom dataloader.base_loader import *\nfrom dataloader.transforms import *\n\nfrom util.pointcloud import get_matching_indices, make_open3d_point_cloud\nfrom util.file import read_trajectory\n\n\nclass IndoorPairDataset(PairDataset):\n  '''\n  Train dataset\n  '''\n  OVERLAP_RATIO = None\n  AUGMENT = None\n\n  def __init__(self,\n               phase,\n               transform=None,\n               random_rotation=True,\n               random_scale=True,\n               manual_seed=False,\n               config=None):\n    PairDataset.__init__(self, phase, transform, random_rotation, random_scale,\n                         manual_seed, config)\n    self.root = root = config.threed_match_dir\n    self.use_xyz_feature = config.use_xyz_feature\n    logging.info(f\"Loading the subset {phase} from {root}\")\n\n    subset_names = open(self.DATA_FILES[phase]).read().split()\n    for name in subset_names:\n      fname = name + \"*%.2f.txt\" % self.OVERLAP_RATIO\n      fnames_txt = glob.glob(root + \"/\" + fname)\n      assert len(fnames_txt) > 0, f\"Make sure that the path {root} has data {fname}\"\n      for fname_txt in fnames_txt:\n        with open(fname_txt) as f:\n          content = f.readlines()\n        fnames = [x.strip().split() for x in content]\n        for fname in fnames:\n          self.files.append([fname[0], fname[1]])\n\n  def __getitem__(self, idx):\n    file0 = os.path.join(self.root, self.files[idx][0])\n    file1 = os.path.join(self.root, self.files[idx][1])\n    data0 = np.load(file0)\n    data1 = np.load(file1)\n    xyz0 = data0[\"pcd\"]\n    xyz1 = data1[\"pcd\"]\n    matching_search_voxel_size = self.matching_search_voxel_size\n\n    if self.random_scale and random.random() < 0.95:\n      scale = self.min_scale + \\\n          (self.max_scale - self.min_scale) * random.random()\n      matching_search_voxel_size *= scale\n      xyz0 = scale * xyz0\n      xyz1 = scale * xyz1\n\n    if self.random_rotation:\n      T0 = sample_random_trans(xyz0, self.randg, self.rotation_range)\n      T1 = sample_random_trans(xyz1, self.randg, self.rotation_range)\n      trans = T1 @ np.linalg.inv(T0)\n\n      xyz0 = self.apply_transform(xyz0, T0)\n      xyz1 = self.apply_transform(xyz1, T1)\n    else:\n      trans = np.identity(4)\n\n    # Voxelization\n    xyz0_th = torch.from_numpy(xyz0)\n    xyz1_th = torch.from_numpy(xyz1)\n\n    sel0 = ME.utils.sparse_quantize(xyz0_th / self.voxel_size, return_index=True)\n    sel1 = ME.utils.sparse_quantize(xyz1_th / self.voxel_size, return_index=True)\n\n    # Make point clouds using voxelized points\n    pcd0 = make_open3d_point_cloud(xyz0[sel0])\n    pcd1 = make_open3d_point_cloud(xyz1[sel1])\n\n    # Select features and points using the returned voxelized indices\n    # 3DMatch color is not helpful\n    # pcd0.colors = o3d.utility.Vector3dVector(color0[sel0])\n    # pcd1.colors = o3d.utility.Vector3dVector(color1[sel1])\n\n    # Get matches\n    matches = get_matching_indices(pcd0, pcd1, trans, matching_search_voxel_size)\n\n    # Get features\n    npts0 = len(sel0)\n    npts1 = len(sel1)\n\n    feats_train0, feats_train1 = [], []\n\n    unique_xyz0_th = xyz0_th[sel0]\n    unique_xyz1_th = xyz1_th[sel1]\n\n    # xyz as feats\n    if self.use_xyz_feature:\n      feats_train0.append(unique_xyz0_th - unique_xyz0_th.mean(0))\n      feats_train1.append(unique_xyz1_th - unique_xyz1_th.mean(0))\n    else:\n      feats_train0.append(torch.ones((npts0, 1)))\n      feats_train1.append(torch.ones((npts1, 1)))\n\n    feats0 = torch.cat(feats_train0, 1)\n    feats1 = torch.cat(feats_train1, 1)\n\n    coords0 = torch.floor(unique_xyz0_th / self.voxel_size)\n    coords1 = torch.floor(unique_xyz1_th / self.voxel_size)\n\n    if self.transform:\n      coords0, feats0 = self.transform(coords0, feats0)\n      coords1, feats1 = self.transform(coords1, feats1)\n\n    extra_package = {'idx': idx, 'file0': file0, 'file1': file1}\n\n    return (unique_xyz0_th.float(),\n            unique_xyz1_th.float(), coords0.int(), coords1.int(), feats0.float(),\n            feats1.float(), matches, trans, extra_package)\n\n\nclass ThreeDMatchPairDataset03(IndoorPairDataset):\n  OVERLAP_RATIO = 0.3\n  DATA_FILES = {\n      'train': './dataloader/split/train_3dmatch.txt',\n      'val': './dataloader/split/val_3dmatch.txt',\n      'test': './dataloader/split/test_3dmatch.txt'\n  }\n\n\nclass ThreeDMatchPairDataset05(ThreeDMatchPairDataset03):\n  OVERLAP_RATIO = 0.5\n\n\nclass ThreeDMatchPairDataset07(ThreeDMatchPairDataset03):\n  OVERLAP_RATIO = 0.7\n\n\nclass ThreeDMatchTrajectoryDataset(PairDataset):\n  '''\n  Test dataset\n  '''\n  DATA_FILES = {\n      'train': './dataloader/split/train_3dmatch.txt',\n      'val': './dataloader/split/val_3dmatch.txt',\n      'test': './dataloader/split/test_3dmatch.txt'\n  }\n\n  def __init__(self,\n               phase,\n               transform=None,\n               random_rotation=True,\n               random_scale=True,\n               manual_seed=False,\n               scene_id=None,\n               config=None,\n               return_ply_names=False):\n\n    PairDataset.__init__(self, phase, transform, random_rotation, random_scale,\n                         manual_seed, config)\n\n    self.root = config.threed_match_dir\n\n    subset_names = open(self.DATA_FILES[phase]).read().split()\n    if scene_id is not None:\n      subset_names = [subset_names[scene_id]]\n    for sname in subset_names:\n      traj_file = os.path.join(self.root, sname + '-evaluation/gt.log')\n      assert os.path.exists(traj_file)\n      traj = read_trajectory(traj_file)\n      for ctraj in traj:\n        i = ctraj.metadata[0]\n        j = ctraj.metadata[1]\n        T_gt = ctraj.pose\n        self.files.append((sname, i, j, T_gt))\n\n    self.return_ply_names = return_ply_names\n\n  def __getitem__(self, pair_index):\n    sname, i, j, T_gt = self.files[pair_index]\n    ply_name0 = os.path.join(self.root, sname, f'cloud_bin_{i}.ply')\n    ply_name1 = os.path.join(self.root, sname, f'cloud_bin_{j}.ply')\n\n    if self.return_ply_names:\n      return sname, ply_name0, ply_name1, T_gt\n\n    pcd0 = o3d.io.read_point_cloud(ply_name0)\n    pcd1 = o3d.io.read_point_cloud(ply_name1)\n    pcd0 = np.asarray(pcd0.points)\n    pcd1 = np.asarray(pcd1.points)\n    return sname, pcd0, pcd1, T_gt\n"
  },
  {
    "path": "dataloader/transforms.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport numpy as np\nimport random\nfrom scipy.linalg import expm, norm\n\n\n# Rotation matrix along axis with angle theta\ndef M(axis, theta):\n  return expm(np.cross(np.eye(3), axis / norm(axis) * theta))\n\n\ndef sample_random_trans(pcd, randg, rotation_range=360):\n  T = np.eye(4)\n  R = M(randg.rand(3) - 0.5, rotation_range * np.pi / 180.0 * (randg.rand(1) - 0.5))\n  T[:3, :3] = R\n  T[:3, 3] = R.dot(-np.mean(pcd, axis=0))\n  return T\n\n\nclass Compose:\n  def __init__(self, transforms):\n    self.transforms = transforms\n\n  def __call__(self, coords, feats):\n    for transform in self.transforms:\n      coords, feats = transform(coords, feats)\n    return coords, feats\n\n\nclass Jitter:\n  def __init__(self, mu=0, sigma=0.01):\n    self.mu = mu\n    self.sigma = sigma\n\n  def __call__(self, coords, feats):\n    if random.random() < 0.95:\n      feats += self.sigma * torch.randn(feats.shape[0], feats.shape[1])\n      if self.mu != 0:\n        feats += self.mu\n    return coords, feats\n\n\nclass ChromaticShift:\n  def __init__(self, mu=0, sigma=0.1):\n    self.mu = mu\n    self.sigma = sigma\n\n  def __call__(self, coords, feats):\n    if random.random() < 0.95:\n      feats[:, :3] += torch.randn(self.mu, self.sigma, (1, 3))\n    return coords, feats\n"
  },
  {
    "path": "demo.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport os\nfrom urllib.request import urlretrieve\n\nimport open3d as o3d\nfrom core.deep_global_registration import DeepGlobalRegistration\nfrom config import get_config\n\nBASE_URL = \"http://node2.chrischoy.org/data/\"\nDOWNLOAD_LIST = [\n    (BASE_URL + \"datasets/registration/\", \"redkitchen_000.ply\"),\n    (BASE_URL + \"datasets/registration/\", \"redkitchen_010.ply\"),\n    (BASE_URL + \"projects/DGR/\", \"ResUNetBN2C-feat32-3dmatch-v0.05.pth\")\n]\n\n# Check if the weights and file exist and download\nif not os.path.isfile('redkitchen_000.ply'):\n  print('Downloading weights and pointcloud files...')\n  for f in DOWNLOAD_LIST:\n    print(f\"Downloading {f}\")\n    urlretrieve(f[0] + f[1], f[1])\n\nif __name__ == '__main__':\n  config = get_config()\n  if config.weights is None:\n    config.weights = DOWNLOAD_LIST[-1][-1]\n\n  # preprocessing\n  pcd0 = o3d.io.read_point_cloud(config.pcd0)\n  pcd0.estimate_normals()\n  pcd1 = o3d.io.read_point_cloud(config.pcd1)\n  pcd1.estimate_normals()\n\n  # registration\n  dgr = DeepGlobalRegistration(config)\n  T01 = dgr.register(pcd0, pcd1)\n\n  o3d.visualization.draw_geometries([pcd0, pcd1])\n\n  pcd0.transform(T01)\n  print(T01)\n\n  o3d.visualization.draw_geometries([pcd0, pcd1])\n"
  },
  {
    "path": "model/__init__.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport logging\nimport model.simpleunet as simpleunets\nimport model.resunet as resunets\nimport model.pyramidnet as pyramids\n\nMODELS = []\n\n\ndef add_models(module):\n  MODELS.extend([getattr(module, a) for a in dir(module) if 'Net' in a or 'MLP' in a])\n\n\nadd_models(simpleunets)\nadd_models(resunets)\nadd_models(pyramids)\n\n\ndef load_model(name):\n  '''Creates and returns an instance of the model given its class name.\n  '''\n  # Find the model class from its name\n  all_models = MODELS\n  mdict = {model.__name__: model for model in all_models}\n  if name not in mdict:\n    logging.info(f'Invalid model index. You put {name}. Options are:')\n    # Display a list of valid model names\n    for model in all_models:\n      logging.info('\\t* {}'.format(model.__name__))\n    return None\n  NetClass = mdict[name]\n\n  return NetClass\n"
  },
  {
    "path": "model/common.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch.nn as nn\nimport MinkowskiEngine as ME\n\n\ndef get_norm(norm_type, num_feats, bn_momentum=0.05, dimension=-1):\n  if norm_type == 'BN':\n    return ME.MinkowskiBatchNorm(num_feats, momentum=bn_momentum)\n  elif norm_type == 'IN':\n    return ME.MinkowskiInstanceNorm(num_feats)\n  elif norm_type == 'INBN':\n    return nn.Sequential(\n        ME.MinkowskiInstanceNorm(num_feats),\n        ME.MinkowskiBatchNorm(num_feats, momentum=bn_momentum))\n  else:\n    raise ValueError(f'Type {norm_type}, not defined')\n\n\ndef get_nonlinearity(non_type):\n  if non_type == 'ReLU':\n    return ME.MinkowskiReLU()\n  elif non_type == 'ELU':\n    # return ME.MinkowskiInstanceNorm(num_feats, dimension=dimension)\n    return ME.MinkowskiELU()\n  else:\n    raise ValueError(f'Type {non_type}, not defined')\n"
  },
  {
    "path": "model/pyramidnet.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport torch.nn as nn\nimport MinkowskiEngine as ME\nfrom model.common import get_norm, get_nonlinearity\n\nfrom model.residual_block import get_block, conv, conv_tr, conv_norm_non\n\n\nclass PyramidModule(ME.MinkowskiNetwork):\n  NONLINEARITY = 'ELU'\n  NORM_TYPE = 'BN'\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  def __init__(self,\n               inc,\n               outc,\n               inner_inc,\n               inner_outc,\n               inner_module=None,\n               depth=1,\n               bn_momentum=0.05,\n               dimension=-1):\n    ME.MinkowskiNetwork.__init__(self, dimension)\n    self.depth = depth\n\n    self.conv = nn.Sequential(\n        conv_norm_non(\n            inc,\n            inner_inc,\n            3,\n            2,\n            dimension,\n            region_type=self.REGION_TYPE,\n            norm_type=self.NORM_TYPE,\n            nonlinearity=self.NONLINEARITY), *[\n                get_block(\n                    self.NORM_TYPE,\n                    inner_inc,\n                    inner_inc,\n                    bn_momentum=bn_momentum,\n                    region_type=self.REGION_TYPE,\n                    dimension=dimension) for d in range(depth)\n            ])\n    self.inner_module = inner_module\n    self.convtr = nn.Sequential(\n        conv_tr(\n            in_channels=inner_outc,\n            out_channels=inner_outc,\n            kernel_size=3,\n            stride=2,\n            dilation=1,\n            has_bias=False,\n            region_type=self.REGION_TYPE,\n            dimension=dimension),\n        get_norm(\n            self.NORM_TYPE, inner_outc, bn_momentum=bn_momentum, dimension=dimension),\n        get_nonlinearity(self.NONLINEARITY))\n\n    self.cat_conv = conv_norm_non(\n        inner_outc + inc,\n        outc,\n        1,\n        1,\n        dimension,\n        norm_type=self.NORM_TYPE,\n        nonlinearity=self.NONLINEARITY)\n\n  def forward(self, x):\n    y = self.conv(x)\n    if self.inner_module:\n      y = self.inner_module(y)\n    y = self.convtr(y)\n    y = ME.cat(x, y)\n    return self.cat_conv(y)\n\n\nclass PyramidModuleINBN(PyramidModule):\n  NORM_TYPE = 'INBN'\n\n\nclass PyramidNet(ME.MinkowskiNetwork):\n  NORM_TYPE = 'BN'\n  NONLINEARITY = 'ELU'\n  PYRAMID_MODULE = PyramidModule\n  CHANNELS = [32, 64, 128, 128]\n  TR_CHANNELS = [64, 128, 128, 128]\n  DEPTHS = [1, 1, 1, 1]\n  # None        b1, b2, b3, btr3, btr2\n  #               1  2  3 -3 -2 -1\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    self.conv1_kernel_size = conv1_kernel_size\n    self.normalize_feature = normalize_feature\n\n    self.initialize_network(in_channels, out_channels, bn_momentum, D)\n\n  def initialize_network(self, in_channels, out_channels, bn_momentum, dimension):\n    NORM_TYPE = self.NORM_TYPE\n    NONLINEARITY = self.NONLINEARITY\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    DEPTHS = self.DEPTHS\n    REGION_TYPE = self.REGION_TYPE\n\n    self.conv = conv_norm_non(\n        in_channels,\n        CHANNELS[0],\n        kernel_size=self.conv1_kernel_size,\n        stride=1,\n        dimension=dimension,\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        norm_type=NORM_TYPE,\n        nonlinearity=NONLINEARITY)\n\n    pyramid = None\n    for d in range(len(DEPTHS) - 1, 0, -1):\n      pyramid = self.PYRAMID_MODULE(\n          CHANNELS[d - 1],\n          TR_CHANNELS[d - 1],\n          CHANNELS[d],\n          TR_CHANNELS[d],\n          pyramid,\n          DEPTHS[d],\n          dimension=dimension)\n    self.pyramid = pyramid\n    self.final = nn.Sequential(\n        conv_norm_non(\n            TR_CHANNELS[0],\n            TR_CHANNELS[0],\n            kernel_size=3,\n            stride=1,\n            dimension=dimension),\n        conv(TR_CHANNELS[0], out_channels, 1, 1, dimension=dimension))\n\n  def forward(self, x):\n    out = self.conv(x)\n    out = self.pyramid(out)\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass PyramidNet6(PyramidNet):\n  CHANNELS = [32, 64, 128, 192, 256, 256]\n  TR_CHANNELS = [64, 128, 192, 192, 256, 256]\n  DEPTHS = [1, 1, 1, 1, 1, 1]\n\n\nclass PyramidNet6NoBlock(PyramidNet6):\n  DEPTHS = [0, 0, 0, 0, 0, 0]\n\n\nclass PyramidNet6INBN(PyramidNet6):\n  NORM_TYPE = 'INBN'\n  PYRAMID_MODULE = PyramidModuleINBN\n\n\nclass PyramidNet6INBNNoBlock(PyramidNet6INBN):\n  NORM_TYPE = 'INBN'\n\n\nclass PyramidNet8(PyramidNet):\n  CHANNELS = [32, 64, 128, 128, 192, 192, 256, 256]\n  TR_CHANNELS = [64, 128, 128, 192, 192, 192, 256, 256]\n  DEPTHS = [1, 1, 1, 1, 1, 1, 1, 1]\n\n\nclass PyramidNet8INBN(PyramidNet8):\n  NORM_TYPE = 'INBN'\n  PYRAMID_MODULE = PyramidModuleINBN\n"
  },
  {
    "path": "model/residual_block.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch.nn as nn\n\nfrom model.common import get_norm, get_nonlinearity\n\nimport MinkowskiEngine as ME\nimport MinkowskiEngine.MinkowskiFunctional as MEF\n\n\ndef conv(in_channels,\n         out_channels,\n         kernel_size=3,\n         stride=1,\n         dilation=1,\n         has_bias=False,\n         region_type=0,\n         dimension=3):\n  if not isinstance(region_type, ME.RegionType):\n    if region_type == 0:\n      region_type = ME.RegionType.HYPER_CUBE\n    elif region_type == 1:\n      region_type = ME.RegionType.HYPER_CROSS\n    else:\n      raise ValueError('Unsupported region type')\n\n  kernel_generator = ME.KernelGenerator(\n      kernel_size=kernel_size,\n      stride=stride,\n      dilation=dilation,\n      region_type=region_type,\n      dimension=dimension)\n\n  return ME.MinkowskiConvolution(\n      in_channels,\n      out_channels,\n      kernel_size=kernel_size,\n      stride=stride,\n      kernel_generator=kernel_generator,\n      dimension=dimension)\n\n\ndef conv_tr(in_channels,\n            out_channels,\n            kernel_size,\n            stride=1,\n            dilation=1,\n            has_bias=False,\n            region_type=ME.RegionType.HYPER_CUBE,\n            dimension=-1):\n  assert dimension > 0, 'Dimension must be a positive integer'\n  kernel_generator = ME.KernelGenerator(\n      kernel_size,\n      stride,\n      dilation,\n      is_transpose=True,\n      region_type=region_type,\n      dimension=dimension)\n\n  kernel_generator = ME.KernelGenerator(\n      kernel_size,\n      stride,\n      dilation,\n      is_transpose=True,\n      region_type=region_type,\n      dimension=dimension)\n\n  return ME.MinkowskiConvolutionTranspose(\n      in_channels=in_channels,\n      out_channels=out_channels,\n      kernel_size=kernel_size,\n      stride=stride,\n      dilation=dilation,\n      bias=has_bias,\n      kernel_generator=kernel_generator,\n      dimension=dimension)\n\n\nclass BasicBlockBase(nn.Module):\n  expansion = 1\n  NORM_TYPE = 'BN'\n\n  def __init__(self,\n               inplanes,\n               planes,\n               stride=1,\n               dilation=1,\n               downsample=None,\n               bn_momentum=0.1,\n               region_type=0,\n               D=3):\n    super(BasicBlockBase, self).__init__()\n\n    self.conv1 = conv(\n        inplanes,\n        planes,\n        kernel_size=3,\n        stride=stride,\n        dilation=dilation,\n        region_type=region_type,\n        dimension=D)\n    self.norm1 = get_norm(self.NORM_TYPE, planes, bn_momentum=bn_momentum, dimension=D)\n    self.conv2 = conv(\n        planes,\n        planes,\n        kernel_size=3,\n        stride=1,\n        dilation=dilation,\n        region_type=region_type,\n        dimension=D)\n    self.norm2 = get_norm(self.NORM_TYPE, planes, bn_momentum=bn_momentum, dimension=D)\n    self.downsample = downsample\n\n  def forward(self, x):\n    residual = x\n\n    out = self.conv1(x)\n    out = self.norm1(out)\n    out = MEF.relu(out)\n\n    out = self.conv2(out)\n    out = self.norm2(out)\n\n    if self.downsample is not None:\n      residual = self.downsample(x)\n\n    out += residual\n    out = MEF.relu(out)\n\n    return out\n\n\nclass BasicBlockBN(BasicBlockBase):\n  NORM_TYPE = 'BN'\n\n\nclass BasicBlockIN(BasicBlockBase):\n  NORM_TYPE = 'IN'\n\n\nclass BasicBlockINBN(BasicBlockBase):\n  NORM_TYPE = 'INBN'\n\n\ndef get_block(norm_type,\n              inplanes,\n              planes,\n              stride=1,\n              dilation=1,\n              downsample=None,\n              bn_momentum=0.1,\n              region_type=0,\n              dimension=3):\n  if norm_type == 'BN':\n    Block = BasicBlockBN\n  elif norm_type == 'IN':\n    Block = BasicBlockIN\n  elif norm_type == 'INBN':\n    Block = BasicBlockINBN\n  else:\n    raise ValueError(f'Type {norm_type}, not defined')\n\n  return Block(inplanes, planes, stride, dilation, downsample, bn_momentum, region_type,\n               dimension)\n\n\ndef conv_norm_non(inc,\n                  outc,\n                  kernel_size,\n                  stride,\n                  dimension,\n                  bn_momentum=0.05,\n                  region_type=ME.RegionType.HYPER_CUBE,\n                  norm_type='BN',\n                  nonlinearity='ELU'):\n  return nn.Sequential(\n      conv(\n          in_channels=inc,\n          out_channels=outc,\n          kernel_size=kernel_size,\n          stride=stride,\n          dilation=1,\n          has_bias=False,\n          region_type=region_type,\n          dimension=dimension),\n      get_norm(norm_type, outc, bn_momentum=bn_momentum, dimension=dimension),\n      get_nonlinearity(nonlinearity))\n"
  },
  {
    "path": "model/resunet.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport torch.nn as nn\nimport MinkowskiEngine as ME\nimport MinkowskiEngine.MinkowskiFunctional as MEF\nfrom model.common import get_norm\n\nfrom model.residual_block import conv, conv_tr, get_block\n\n\nclass ResUNet(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  BLOCK_NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128]\n  TR_CHANNELS = [None, 32, 64, 64]\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    REGION_TYPE = self.REGION_TYPE\n    self.normalize_feature = normalize_feature\n\n    self.conv1 = ME.MinkowskiConvolution(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.block1 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[1],\n        CHANNELS[1],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv2 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[2],\n        CHANNELS[2],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv3 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[3],\n        CHANNELS[3],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv3_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[3],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[3],\n        TR_CHANNELS[3],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv2_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[2],\n        TR_CHANNELS[2],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv1_tr = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n\n    # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D)\n\n    self.final = ME.MinkowskiConvolution(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out_s1 = self.block1(out_s1)\n    out = MEF.relu(out_s1)\n\n    out_s2 = self.conv2(out)\n    out_s2 = self.norm2(out_s2)\n    out_s2 = self.block2(out_s2)\n    out = MEF.relu(out_s2)\n\n    out_s4 = self.conv3(out)\n    out_s4 = self.norm3(out_s4)\n    out_s4 = self.block3(out_s4)\n    out = MEF.relu(out_s4)\n\n    out = self.conv3_tr(out)\n    out = self.norm3_tr(out)\n    out = self.block3_tr(out)\n    out_s2_tr = MEF.relu(out)\n\n    out = ME.cat(out_s2_tr, out_s2)\n\n    out = self.conv2_tr(out)\n    out = self.norm2_tr(out)\n    out = self.block2_tr(out)\n    out_s1_tr = MEF.relu(out)\n\n    out = ME.cat(out_s1_tr, out_s1)\n    out = self.conv1_tr(out)\n    out = MEF.relu(out)\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass ResUNetBN(ResUNet):\n  NORM_TYPE = 'BN'\n\n\nclass ResUNetBNF(ResUNet):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 16, 32, 64]\n  TR_CHANNELS = [None, 16, 32, 64]\n\n\nclass ResUNetBNFX(ResUNetBNF):\n  REGION_TYPE = ME.RegionType.HYPER_CROSS\n\n\nclass ResUNetSP(ME.MinkowskiNetwork):\n  NORM_TYPE = 'BN'\n  BLOCK_NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128]\n  TR_CHANNELS = [None, 32, 64, 64]\n  # None        b1, b2, b3, btr3, btr2\n  #               1  2  3 -3 -2 -1\n  DEPTHS = [None, 1, 1, 1, 1, 1, None]\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    DEPTHS = self.DEPTHS\n    REGION_TYPE = self.REGION_TYPE\n    self.normalize_feature = normalize_feature\n    self.conv1 = conv(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.block1 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[1],\n            CHANNELS[1],\n            bn_momentum=bn_momentum,\n            region_type=REGION_TYPE,\n            dimension=D) for d in range(DEPTHS[1])\n    ])\n\n    self.pool2 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D)\n    self.conv2 = conv(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[2],\n            CHANNELS[2],\n            bn_momentum=bn_momentum,\n            region_type=REGION_TYPE,\n            dimension=D) for d in range(DEPTHS[2])\n    ])\n\n    self.pool3 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D)\n    self.conv3 = conv(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[3],\n            CHANNELS[3],\n            bn_momentum=bn_momentum,\n            region_type=REGION_TYPE,\n            dimension=D) for d in range(DEPTHS[3])\n    ])\n\n    self.pool3_tr = ME.MinkowskiPoolingTranspose(kernel_size=2, stride=2, dimension=D)\n    self.conv3_tr = conv_tr(\n        in_channels=CHANNELS[3],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3_tr = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            TR_CHANNELS[3],\n            TR_CHANNELS[3],\n            bn_momentum=bn_momentum,\n            region_type=REGION_TYPE,\n            dimension=D) for d in range(DEPTHS[-3])\n    ])\n\n    self.pool2_tr = ME.MinkowskiPoolingTranspose(kernel_size=2, stride=2, dimension=D)\n    self.conv2_tr = conv_tr(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2_tr = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            TR_CHANNELS[2],\n            TR_CHANNELS[2],\n            bn_momentum=bn_momentum,\n            region_type=REGION_TYPE,\n            dimension=D) for d in range(DEPTHS[-2])\n    ])\n\n    self.conv1_tr = conv_tr(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.final = conv(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out_s1 = MEF.relu(out_s1)\n    out_s1 = self.block1(out_s1)\n\n    out_s2 = self.pool2(out_s1)\n    out_s2 = self.conv2(out_s2)\n    out_s2 = self.norm2(out_s2)\n    out_s2 = MEF.relu(out_s2)\n    out_s2 = self.block2(out_s2)\n\n    out_s4 = self.pool3(out_s2)\n    out_s4 = self.conv3(out_s4)\n    out_s4 = self.norm3(out_s4)\n    out_s4 = MEF.relu(out_s4)\n    out_s4 = self.block3(out_s4)\n\n    out_s2t = self.pool3_tr(out_s4)\n    out_s2t = self.conv3_tr(out_s2t)\n    out_s2t = self.norm3_tr(out_s2t)\n    out_s2t = MEF.relu(out_s2t)\n    out_s2t = self.block3_tr(out_s2t)\n\n    out = ME.cat(out_s2t, out_s2)\n\n    out_s1t = self.conv2_tr(out)\n    out_s1t = self.pool3_tr(out_s1t)\n    out_s1t = self.norm2_tr(out_s1t)\n    out_s1t = MEF.relu(out_s1t)\n    out_s1t = self.block2_tr(out_s1t)\n\n    out = ME.cat(out_s1t, out_s1)\n\n    out = self.conv1_tr(out)\n    out = MEF.relu(out)\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass ResUNetBNSPC(ResUNetSP):\n  REGION_TYPE = ME.RegionType.HYPER_CROSS\n\n\nclass ResUNetINBNSPC(ResUNetBNSPC):\n  NORM_TYPE = 'INBN'\n\n\nclass ResUNet2(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  BLOCK_NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 32, 64, 64, 128]\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    REGION_TYPE = self.REGION_TYPE\n    self.normalize_feature = normalize_feature\n    self.conv1 = conv(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.block1 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[1],\n        CHANNELS[1],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv2 = conv(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[2],\n        CHANNELS[2],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv3 = conv(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[3],\n        CHANNELS[3],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv4 = conv(\n        in_channels=CHANNELS[3],\n        out_channels=CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.block4 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[4],\n        CHANNELS[4],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv4_tr = conv_tr(\n        in_channels=CHANNELS[4],\n        out_channels=TR_CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm4_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.block4_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[4],\n        TR_CHANNELS[4],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv3_tr = conv_tr(\n        in_channels=CHANNELS[3] + TR_CHANNELS[4],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[3],\n        TR_CHANNELS[3],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv2_tr = conv_tr(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[2],\n        TR_CHANNELS[2],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv1_tr = conv(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n\n    # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D)\n\n    self.final = ME.MinkowskiConvolution(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out_s1 = self.block1(out_s1)\n    out = MEF.relu(out_s1)\n\n    out_s2 = self.conv2(out)\n    out_s2 = self.norm2(out_s2)\n    out_s2 = self.block2(out_s2)\n    out = MEF.relu(out_s2)\n\n    out_s4 = self.conv3(out)\n    out_s4 = self.norm3(out_s4)\n    out_s4 = self.block3(out_s4)\n    out = MEF.relu(out_s4)\n\n    out_s8 = self.conv4(out)\n    out_s8 = self.norm4(out_s8)\n    out_s8 = self.block4(out_s8)\n    out = MEF.relu(out_s8)\n\n    out = self.conv4_tr(out)\n    out = self.norm4_tr(out)\n    out = self.block4_tr(out)\n    out_s4_tr = MEF.relu(out)\n\n    out = ME.cat(out_s4_tr, out_s4)\n\n    out = self.conv3_tr(out)\n    out = self.norm3_tr(out)\n    out = self.block3_tr(out)\n    out_s2_tr = MEF.relu(out)\n\n    out = ME.cat(out_s2_tr, out_s2)\n\n    out = self.conv2_tr(out)\n    out = self.norm2_tr(out)\n    out = self.block2_tr(out)\n    out_s1_tr = MEF.relu(out)\n\n    out = ME.cat(out_s1_tr, out_s1)\n    out = self.conv1_tr(out)\n    out = MEF.relu(out)\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8),\n          coordinate_map_key=out.coordinate_map_key,\n          coordinate_manager=out.coordinate_manager)\n    else:\n      return out\n\n\nclass ResUNetBN2(ResUNet2):\n  NORM_TYPE = 'BN'\n\n\nclass ResUNetBN2B(ResUNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 64, 64]\n\n\nclass ResUNetBN2C(ResUNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 64, 128]\n\n\nclass ResUNetBN2CX(ResUNetBN2C):\n  REGION_TYPE = ME.RegionType.HYPER_CROSS\n\n\nclass ResUNetBN2D(ResUNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 128, 128]\n\n\nclass ResUNetBN2E(ResUNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 128, 128, 128, 256]\n  TR_CHANNELS = [None, 64, 128, 128, 128]\n\n\nclass ResUNetBN2F(ResUNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 16, 32, 64, 128]\n  TR_CHANNELS = [None, 16, 32, 64, 128]\n\n\nclass ResUNetBN2FX(ResUNetBN2F):\n  REGION_TYPE = ME.RegionType.HYPER_CROSS\n\n\nclass ResUNet2v2(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  BLOCK_NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 32, 64, 64, 128]\n  # None        b1, b2, b3, b4, btr4, btr3, btr2\n  #               1  2  3  4,-4,-3,-2,-1\n  DEPTHS = [None, 1, 1, 1, 1, 1, 1, 1, None]\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    DEPTHS = self.DEPTHS\n    self.normalize_feature = normalize_feature\n\n    self.conv1 = ME.MinkowskiConvolution(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.block1 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[1],\n            CHANNELS[1],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[1])\n    ])\n\n    self.conv2 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[2],\n            CHANNELS[2],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[2])\n    ])\n\n    self.conv3 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[3],\n            CHANNELS[3],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[3])\n    ])\n\n    self.conv4 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[3],\n        out_channels=CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.block4 = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            CHANNELS[4],\n            CHANNELS[4],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[4])\n    ])\n\n    self.conv4_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[4],\n        out_channels=TR_CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm4_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.block4_tr = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            TR_CHANNELS[4],\n            TR_CHANNELS[4],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[-4])\n    ])\n\n    self.conv3_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[3] + TR_CHANNELS[4],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3_tr = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            TR_CHANNELS[3],\n            TR_CHANNELS[3],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[-3])\n    ])\n\n    self.conv2_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2_tr = nn.Sequential(*[\n        get_block(\n            BLOCK_NORM_TYPE,\n            TR_CHANNELS[2],\n            TR_CHANNELS[2],\n            bn_momentum=bn_momentum,\n            dimension=D) for d in range(DEPTHS[-2])\n    ])\n\n    self.conv1_tr = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n\n    # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.final = ME.MinkowskiConvolution(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n    self.weight_initialization()\n\n  def weight_initialization(self):\n    for m in self.modules():\n      if isinstance(m, ME.MinkowskiConvolution):\n        ME.utils.kaiming_normal_(m.kernel, mode='fan_out', nonlinearity='relu')\n\n      if isinstance(m, ME.MinkowskiBatchNorm):\n        nn.init.constant_(m.bn.weight, 1)\n        nn.init.constant_(m.bn.bias, 0)\n\n  def forward(self, x):  # Receptive field size\n    out_s1 = self.conv1(x)  # 7\n    out_s1 = self.norm1(out_s1)\n    out_s1 = MEF.relu(out_s1)\n    out_s1 = self.block1(out_s1)\n\n    out_s2 = self.conv2(out_s1)  # 7 + 2 * 2 = 11\n    out_s2 = self.norm2(out_s2)\n    out_s2 = MEF.relu(out_s2)\n    out_s2 = self.block2(out_s2)  # 11 + 2 * (2 + 2) = 19\n\n    out_s4 = self.conv3(out_s2)  # 19 + 4 * 2 = 27\n    out_s4 = self.norm3(out_s4)\n    out_s4 = MEF.relu(out_s4)\n    out_s4 = self.block3(out_s4)  # 27 + 4 * (2 + 2) = 43\n\n    out_s8 = self.conv4(out_s4)  # 43 + 8 * 2 = 59\n    out_s8 = self.norm4(out_s8)\n    out_s8 = MEF.relu(out_s8)\n    out_s8 = self.block4(out_s8)  # 59 + 8 * (2 + 2) = 91\n\n    out = self.conv4_tr(out_s8)  # 91 + 4 * 2 = 99\n    out = self.norm4_tr(out)\n    out = MEF.relu(out)\n    out = self.block4_tr(out)  # 99 + 4 * (2 + 2) = 115\n\n    out = ME.cat(out, out_s4)\n\n    out = self.conv3_tr(out)  # 115 + 2 * 2 = 119\n    out = self.norm3_tr(out)\n    out = MEF.relu(out)\n    out = self.block3_tr(out)  # 119 + 2 * (2 + 2) = 127\n\n    out = ME.cat(out, out_s2)\n\n    out = self.conv2_tr(out)  # 127 + 2 = 129\n    out = self.norm2_tr(out)\n    out = MEF.relu(out)\n    out = self.block2_tr(out)  # 129 + 1 * (2 + 2) = 133\n\n    out = ME.cat(out, out_s1)\n    out = self.conv1_tr(out)\n    out = MEF.relu(out)\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass ResUNetBN2v2(ResUNet2v2):\n  NORM_TYPE = 'BN'\n\n\nclass ResUNetBN2Bv2(ResUNet2v2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 64, 64]\n\n\nclass ResUNetBN2Cv2(ResUNet2v2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 64, 128]\n\n\nclass ResUNetBN2Dv2(ResUNet2v2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 128, 128]\n\n\nclass ResUNetBN2Ev2(ResUNet2v2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 128, 128, 128, 256]\n  TR_CHANNELS = [None, 64, 128, 128, 128]\n\n\nclass ResUNetBN2Fv2(ResUNet2v2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 16, 32, 64, 128]\n  TR_CHANNELS = [None, 16, 32, 64, 128]\n\n\nclass ResUNet2SP(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  BLOCK_NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 32, 64, 64, 128]\n  REGION_TYPE = ME.RegionType.HYPER_CUBE\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    BLOCK_NORM_TYPE = self.BLOCK_NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    REGION_TYPE = self.REGION_TYPE\n    self.normalize_feature = normalize_feature\n    self.conv1 = conv(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=ME.RegionType.HYPER_CUBE,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.block1 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[1],\n        CHANNELS[1],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.pool2 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D)\n    self.conv2 = conv(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[2],\n        CHANNELS[2],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.pool3 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D)\n    self.conv3 = conv(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[3],\n        CHANNELS[3],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.pool4 = ME.MinkowskiSumPooling(kernel_size=2, stride=2, dimension=D)\n    self.conv4 = conv(\n        in_channels=CHANNELS[3],\n        out_channels=CHANNELS[4],\n        kernel_size=3,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        region_type=ME.RegionType.HYPER_CUBE,\n        dimension=D)\n    self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.block4 = get_block(\n        BLOCK_NORM_TYPE,\n        CHANNELS[4],\n        CHANNELS[4],\n        bn_momentum=bn_momentum,\n        region_type=ME.RegionType.HYPER_CUBE,\n        dimension=D)\n\n    self.conv4_tr = conv_tr(\n        in_channels=CHANNELS[4],\n        out_channels=TR_CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=ME.RegionType.HYPER_CUBE,\n        dimension=D)\n    self.norm4_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.block4_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[4],\n        TR_CHANNELS[4],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv3_tr = conv_tr(\n        in_channels=CHANNELS[3] + TR_CHANNELS[4],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.block3_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[3],\n        TR_CHANNELS[3],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv2_tr = conv_tr(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        region_type=REGION_TYPE,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.block2_tr = get_block(\n        BLOCK_NORM_TYPE,\n        TR_CHANNELS[2],\n        TR_CHANNELS[2],\n        bn_momentum=bn_momentum,\n        region_type=REGION_TYPE,\n        dimension=D)\n\n    self.conv1_tr = conv(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n\n    # self.block1_tr = BasicBlockBN(TR_CHANNELS[1], TR_CHANNELS[1], bn_momentum=bn_momentum, D=D)\n\n    self.final = ME.MinkowskiConvolution(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out_s1 = self.block1(out_s1)\n    out = MEF.relu(out_s1)\n\n    out_s2 = self.pool2(out)\n    out_s2 = self.conv2(out_s2)\n    out_s2 = self.norm2(out_s2)\n    out_s2 = self.block2(out_s2)\n    out = MEF.relu(out_s2)\n\n    out_s4 = self.pool3(out)\n    out_s4 = self.conv3(out_s4)\n    out_s4 = self.norm3(out_s4)\n    out_s4 = self.block3(out_s4)\n    out = MEF.relu(out_s4)\n\n    out_s8 = self.pool4(out)\n    out_s8 = self.conv4(out_s8)\n    out_s8 = self.norm4(out_s8)\n    out_s8 = self.block4(out_s8)\n    out = MEF.relu(out_s8)\n\n    out = self.conv4_tr(out)\n    out = self.norm4_tr(out)\n    out = self.block4_tr(out)\n    out_s4_tr = MEF.relu(out)\n\n    out = ME.cat(out_s4_tr, out_s4)\n\n    out = self.conv3_tr(out)\n    out = self.norm3_tr(out)\n    out = self.block3_tr(out)\n    out_s2_tr = MEF.relu(out)\n\n    out = ME.cat(out_s2_tr, out_s2)\n\n    out = self.conv2_tr(out)\n    out = self.norm2_tr(out)\n    out = self.block2_tr(out)\n    out_s1_tr = MEF.relu(out)\n\n    out = ME.cat(out_s1_tr, out_s1)\n    out = self.conv1_tr(out)\n    out = MEF.relu(out)\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / (torch.norm(out.F, p=2, dim=1, keepdim=True) + 1e-8),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass ResUNetBN2SPC(ResUNet2SP):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 64, 128]\n\n\nclass ResUNetBN2SPCX(ResUNetBN2SPC):\n  REGION_TYPE = ME.RegionType.HYPER_CROSS\n"
  },
  {
    "path": "model/simpleunet.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport torch\nimport MinkowskiEngine as ME\nimport MinkowskiEngine.MinkowskiFunctional as MEF\nfrom model.common import get_norm\n\n\nclass SimpleNet(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  CHANNELS = [None, 32, 64, 128]\n  TR_CHANNELS = [None, 32, 32, 64]\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    super(SimpleNet, self).__init__(D)\n    NORM_TYPE = self.NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    self.normalize_feature = normalize_feature\n    self.conv1 = ME.MinkowskiConvolution(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, D=D)\n\n    self.conv2 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, D=D)\n\n    self.conv3 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, D=D)\n\n    self.conv3_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[3],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3_tr = get_norm(NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, D=D)\n\n    self.conv2_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2_tr = get_norm(NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, D=D)\n\n    self.conv1_tr = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=3,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1_tr = get_norm(NORM_TYPE, TR_CHANNELS[1], bn_momentum=bn_momentum, D=D)\n\n    self.final = ME.MinkowskiConvolution(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out = MEF.relu(out_s1)\n\n    out_s2 = self.conv2(out)\n    out_s2 = self.norm2(out_s2)\n    out = MEF.relu(out_s2)\n\n    out_s4 = self.conv3(out)\n    out_s4 = self.norm3(out_s4)\n    out = MEF.relu(out_s4)\n\n    out = self.conv3_tr(out)\n    out = self.norm3_tr(out)\n    out_s2_tr = MEF.relu(out)\n\n    out = ME.cat(out_s2_tr, out_s2)\n\n    out = self.conv2_tr(out)\n    out = self.norm2_tr(out)\n    out_s1_tr = MEF.relu(out)\n\n    out = ME.cat(out_s1_tr, out_s1)\n    out = self.conv1_tr(out)\n    out = self.norm1_tr(out)\n    out = MEF.relu(out)\n\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / torch.norm(out.F, p=2, dim=1, keepdim=True),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass SimpleNetIN(SimpleNet):\n  NORM_TYPE = 'IN'\n\n\nclass SimpleNetBN(SimpleNet):\n  NORM_TYPE = 'BN'\n\n\nclass SimpleNetBNE(SimpleNetBN):\n  CHANNELS = [None, 16, 32, 32]\n  TR_CHANNELS = [None, 16, 16, 32]\n\n\nclass SimpleNetINE(SimpleNetBNE):\n  NORM_TYPE = 'IN'\n\n\nclass SimpleNet2(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 32, 32, 64, 64]\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    self.normalize_feature = normalize_feature\n    self.conv1 = ME.MinkowskiConvolution(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv2 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv3 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv4 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[3],\n        out_channels=CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv4_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[4],\n        out_channels=TR_CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm4_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv3_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[3] + TR_CHANNELS[4],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv2_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv1_tr = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=3,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.final = ME.MinkowskiConvolution(\n        in_channels=TR_CHANNELS[1],\n        out_channels=out_channels,\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out = MEF.relu(out_s1)\n\n    out_s2 = self.conv2(out)\n    out_s2 = self.norm2(out_s2)\n    out = MEF.relu(out_s2)\n\n    out_s4 = self.conv3(out)\n    out_s4 = self.norm3(out_s4)\n    out = MEF.relu(out_s4)\n\n    out_s8 = self.conv4(out)\n    out_s8 = self.norm4(out_s8)\n    out = MEF.relu(out_s8)\n\n    out = self.conv4_tr(out)\n    out = self.norm4_tr(out)\n    out_s4_tr = MEF.relu(out)\n\n    out = ME.cat(out_s4_tr, out_s4)\n\n    out = self.conv3_tr(out)\n    out = self.norm3_tr(out)\n    out_s2_tr = MEF.relu(out)\n\n    out = ME.cat(out_s2_tr, out_s2)\n\n    out = self.conv2_tr(out)\n    out = self.norm2_tr(out)\n    out_s1_tr = MEF.relu(out)\n\n    out = ME.cat(out_s1_tr, out_s1)\n    out = self.conv1_tr(out)\n    out = self.norm1_tr(out)\n    out = MEF.relu(out)\n\n    out = self.final(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / torch.norm(out.F, p=2, dim=1, keepdim=True),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass SimpleNetIN2(SimpleNet2):\n  NORM_TYPE = 'IN'\n\n\nclass SimpleNetBN2(SimpleNet2):\n  NORM_TYPE = 'BN'\n\n\nclass SimpleNetBN2B(SimpleNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 64, 64, 64, 64]\n\n\nclass SimpleNetBN2C(SimpleNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 32, 64, 64, 128]\n\n\nclass SimpleNetBN2D(SimpleNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 32, 64, 64, 128]\n\n\nclass SimpleNetBN2E(SimpleNet2):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 16, 32, 64, 128]\n  TR_CHANNELS = [None, 16, 32, 32, 64]\n\n\nclass SimpleNetIN2E(SimpleNetBN2E):\n  NORM_TYPE = 'IN'\n\n\nclass SimpleNet3(ME.MinkowskiNetwork):\n  NORM_TYPE = None\n  CHANNELS = [None, 32, 64, 128, 256, 512]\n  TR_CHANNELS = [None, 32, 32, 64, 64, 128]\n\n  # To use the model, must call initialize_coords before forward pass.\n  # Once data is processed, call clear to reset the model before calling initialize_coords\n  def __init__(self,\n               in_channels=3,\n               out_channels=32,\n               bn_momentum=0.1,\n               conv1_kernel_size=3,\n               normalize_feature=False,\n               D=3):\n    ME.MinkowskiNetwork.__init__(self, D)\n    NORM_TYPE = self.NORM_TYPE\n    CHANNELS = self.CHANNELS\n    TR_CHANNELS = self.TR_CHANNELS\n    self.normalize_feature = normalize_feature\n    self.conv1 = ME.MinkowskiConvolution(\n        in_channels=in_channels,\n        out_channels=CHANNELS[1],\n        kernel_size=conv1_kernel_size,\n        stride=1,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm1 = get_norm(NORM_TYPE, CHANNELS[1], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv2 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1],\n        out_channels=CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2 = get_norm(NORM_TYPE, CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv3 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[2],\n        out_channels=CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3 = get_norm(NORM_TYPE, CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv4 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[3],\n        out_channels=CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm4 = get_norm(NORM_TYPE, CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv5 = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[4],\n        out_channels=CHANNELS[5],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm5 = get_norm(NORM_TYPE, CHANNELS[5], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv5_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[5],\n        out_channels=TR_CHANNELS[5],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm5_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[5], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv4_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[4] + TR_CHANNELS[5],\n        out_channels=TR_CHANNELS[4],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm4_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[4], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv3_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[3] + TR_CHANNELS[4],\n        out_channels=TR_CHANNELS[3],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm3_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[3], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv2_tr = ME.MinkowskiConvolutionTranspose(\n        in_channels=CHANNELS[2] + TR_CHANNELS[3],\n        out_channels=TR_CHANNELS[2],\n        kernel_size=3,\n        stride=2,\n        dilation=1,\n        has_bias=False,\n        dimension=D)\n    self.norm2_tr = get_norm(\n        NORM_TYPE, TR_CHANNELS[2], bn_momentum=bn_momentum, dimension=D)\n\n    self.conv1_tr = ME.MinkowskiConvolution(\n        in_channels=CHANNELS[1] + TR_CHANNELS[2],\n        out_channels=TR_CHANNELS[1],\n        kernel_size=1,\n        stride=1,\n        dilation=1,\n        has_bias=True,\n        dimension=D)\n\n  def forward(self, x):\n    out_s1 = self.conv1(x)\n    out_s1 = self.norm1(out_s1)\n    out = MEF.relu(out_s1)\n\n    out_s2 = self.conv2(out)\n    out_s2 = self.norm2(out_s2)\n    out = MEF.relu(out_s2)\n\n    out_s4 = self.conv3(out)\n    out_s4 = self.norm3(out_s4)\n    out = MEF.relu(out_s4)\n\n    out_s8 = self.conv4(out)\n    out_s8 = self.norm4(out_s8)\n    out = MEF.relu(out_s8)\n\n    out_s16 = self.conv5(out)\n    out_s16 = self.norm5(out_s16)\n    out = MEF.relu(out_s16)\n\n    out = self.conv5_tr(out)\n    out = self.norm5_tr(out)\n    out_s8_tr = MEF.relu(out)\n\n    out = ME.cat(out_s8_tr, out_s8)\n\n    out = self.conv4_tr(out)\n    out = self.norm4_tr(out)\n    out_s4_tr = MEF.relu(out)\n\n    out = ME.cat(out_s4_tr, out_s4)\n\n    out = self.conv3_tr(out)\n    out = self.norm3_tr(out)\n    out_s2_tr = MEF.relu(out)\n\n    out = ME.cat(out_s2_tr, out_s2)\n\n    out = self.conv2_tr(out)\n    out = self.norm2_tr(out)\n    out_s1_tr = MEF.relu(out)\n\n    out = ME.cat(out_s1_tr, out_s1)\n    out = self.conv1_tr(out)\n\n    if self.normalize_feature:\n      return ME.SparseTensor(\n          out.F / torch.norm(out.F, p=2, dim=1, keepdim=True),\n          coords_key=out.coords_key,\n          coords_manager=out.coords_man)\n    else:\n      return out\n\n\nclass SimpleNetIN3(SimpleNet3):\n  NORM_TYPE = 'IN'\n\n\nclass SimpleNetBN3(SimpleNet3):\n  NORM_TYPE = 'BN'\n\n\nclass SimpleNetBN3B(SimpleNet3):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256, 512]\n  TR_CHANNELS = [None, 32, 64, 64, 64, 128]\n\n\nclass SimpleNetBN3C(SimpleNet3):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256, 512]\n  TR_CHANNELS = [None, 32, 32, 64, 128, 128]\n\n\nclass SimpleNetBN3D(SimpleNet3):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 32, 64, 128, 256, 512]\n  TR_CHANNELS = [None, 32, 64, 64, 128, 128]\n\n\nclass SimpleNetBN3E(SimpleNet3):\n  NORM_TYPE = 'BN'\n  CHANNELS = [None, 16, 32, 64, 128, 256]\n  TR_CHANNELS = [None, 16, 32, 32, 64, 128]\n\n\nclass SimpleNetIN3E(SimpleNetBN3E):\n  NORM_TYPE = 'IN'\n"
  },
  {
    "path": "requirements.txt",
    "content": "ansi2html==1.8.0\nattrs==23.1.0\ncertifi==2023.7.22\ncharset-normalizer==3.1.0\nclick==8.1.3\ncmake==3.26.4\nConfigArgParse==1.5.3\ndash==2.11.0\ndash-core-components==2.0.0\ndash-html-components==2.0.0\ndash-table==5.0.0\neasydict==1.10\nfastjsonschema==2.17.1\nfilelock==3.12.2\nFlask==2.2.5\nidna==3.4\nintel-openmp==2023.1.0\nitsdangerous==2.1.2\nJinja2==3.1.2\njsonschema==4.17.3\njupyter_core==5.3.1\nlit==16.0.6\nMarkupSafe==2.1.3\nMinkowskiEngine==0.5.4\nmkl==2023.1.0\nmpmath==1.3.0\nnbformat==5.7.0\nnest-asyncio==1.5.6\nnetworkx==3.1\nnumpy==1.25.0\nnvidia-cublas-cu11==11.10.3.66\nnvidia-cuda-cupti-cu11==11.7.101\nnvidia-cuda-nvrtc-cu11==11.7.99\nnvidia-cuda-runtime-cu11==11.7.99\nnvidia-cudnn-cu11==8.5.0.96\nnvidia-cufft-cu11==10.9.0.58\nnvidia-curand-cu11==10.2.10.91\nnvidia-cusolver-cu11==11.4.0.1\nnvidia-cusparse-cu11==11.7.4.91\nnvidia-nccl-cu11==2.14.3\nnvidia-nvtx-cu11==11.7.91\nopen3d-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\npackaging==23.1\nPillow==9.5.0\nplatformdirs==3.8.0\nplotly==5.15.0\npyrsistent==0.19.3\nrequests==2.31.0\nretrying==1.3.4\nscipy==1.11.0\nsix==1.16.0\nsympy==1.12\ntbb==2021.9.0\ntenacity==8.2.2\ntorch==2.0.1\ntorchaudio==2.0.2\ntorchvision==0.15.2\ntraitlets==5.9.0\ntriton==2.0.0\ntyping_extensions==4.6.3\nurllib3==2.0.3\nWerkzeug==2.2.3\n"
  },
  {
    "path": "scripts/analyze_stats.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nfrom matplotlib.patches import Rectangle\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport argparse\n\nPROPERTY_IDX_MAP = {\n    'Recall': 0,\n    'TE (m)': 1,\n    'RE (deg)': 2,\n    'log Time (s)': 3,\n    'Scene ID': 4\n}\n\n\ndef analyze_by_pair(stats, rte_thresh, rre_thresh):\n  '''\n  \\input stats: (num_methods, num_pairs, num_pairwise_stats=5)\n  \\return valid mean_stats: (num_methods, 4)\n  4 properties: recall, rte, rre, time\n  '''\n  num_methods, num_pairs, num_pairwise_stats = stats.shape\n  pairwise_stats = np.zeros((num_methods, 4))\n\n  for m in range(num_methods):\n    # Filter valid registrations by rte / rre thresholds\n    mask_rte = stats[m, :, 1] < rte_thresh\n    mask_rre = stats[m, :, 2] < rre_thresh\n    mask_valid = mask_rte * mask_rre\n\n    # Recall, RTE, RRE, Time\n    pairwise_stats[m, 0] = mask_valid.mean()\n    pairwise_stats[m, 1] = stats[m, mask_valid, 1].mean()\n    pairwise_stats[m, 2] = stats[m, mask_valid, 2].mean()\n    pairwise_stats[m, 3] = stats[m, mask_valid, 3].mean()\n\n  return pairwise_stats\n\n\ndef analyze_by_scene(stats, scene_id_list, rte_thresh=0.3, rre_thresh=15):\n  '''\n  \\input stats: (num_methods, num_pairs, num_pairwise_stats=5)\n  \\return scene_wise mean stats: (num_methods, num_scenes, 4)\n  4 properties: recall, rte, rre, time\n  '''\n  num_methods, num_pairs, num_pairwise_stats = stats.shape\n  num_scenes = len(scene_id_list)\n\n  scene_wise_stats = np.zeros((num_methods, len(scene_id_list), 4))\n\n  for m in range(num_methods):\n    # Filter valid registrations by rte / rre thresholds\n    mask_rte = stats[m, :, 1] < rte_thresh\n    mask_rre = stats[m, :, 2] < rre_thresh\n    mask_valid = mask_rte * mask_rre\n\n    for s in scene_id_list:\n      mask_scene = stats[m, :, 4] == s\n\n      # Valid registrations in the scene\n      mask = mask_scene * mask_valid\n\n      # Recall, RTE, RRE, Time\n      scene_wise_stats[m, s, 0] = 0 if np.sum(mask_scene) == 0 else float(\n          np.sum(mask)) / float(np.sum(mask_scene))\n      scene_wise_stats[m, s, 1] = stats[m, mask, 1].mean()\n      scene_wise_stats[m, s, 2] = stats[m, mask, 2].mean()\n      scene_wise_stats[m, s, 3] = stats[m, mask, 3].mean()\n\n  return scene_wise_stats\n\n\ndef plot_precision_recall_curves(stats, method_names, rte_precisions, rre_precisions,\n                                 output_postfix, cmap):\n  '''\n  \\input stats: (num_methods, num_pairs, 5)\n  \\input method_names:  (num_methods) string, shown as xticks\n  '''\n  num_methods, num_pairs, _ = stats.shape\n  rre_precision_curves = np.zeros((num_methods, len(rre_precisions)))\n  rte_precision_curves = np.zeros((num_methods, len(rte_precisions)))\n\n  for i, rre_thresh in enumerate(rre_precisions):\n    pairwise_stats = analyze_by_pair(stats, rte_thresh=np.inf, rre_thresh=rre_thresh)\n    rre_precision_curves[:, i] = pairwise_stats[:, 0]\n\n  for i, rte_thresh in enumerate(rte_precisions):\n    pairwise_stats = analyze_by_pair(stats, rte_thresh=rte_thresh, rre_thresh=np.inf)\n    rte_precision_curves[:, i] = pairwise_stats[:, 0]\n\n  fig = plt.figure(figsize=(10, 3))\n  ax1 = fig.add_subplot(1, 2, 1, aspect=3.0 / np.max(rte_precisions))\n  ax2 = fig.add_subplot(1, 2, 2, aspect=3.0 / np.max(rre_precisions))\n\n  for m, name in enumerate(method_names):\n    alpha = rre_precision_curves[m].mean()\n    alpha = 1.0 if alpha > 0 else 0.0\n    ax1.plot(rre_precisions, rre_precision_curves[m], color=cmap[m], alpha=alpha)\n    ax2.plot(rte_precisions, rte_precision_curves[m], color=cmap[m], alpha=alpha)\n\n  ax1.set_ylabel('Recall')\n  ax1.set_xlabel('Rotation (deg)')\n  ax1.set_ylim((0.0, 1.0))\n\n  ax2.set_xlabel('Translation (m)')\n  ax2.set_ylim((0.0, 1.0))\n  ax2.legend(method_names, loc='center left', bbox_to_anchor=(1, 0.5))\n  ax1.grid()\n  ax2.grid()\n\n  plt.tight_layout()\n  plt.savefig('{}_{}.png'.format('precision_recall', output_postfix))\n\n  plt.close(fig)\n\n\ndef plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, property_name,\n                          ylim, output_postfix, cmap):\n  '''\n  \\input scene_wise_stats: (num_methods, num_scenes, 4)\n  \\input method_names:  (num_methods) string, shown as xticks\n  \\input scene_names:   (num_scenes) string, shown as legends\n  \\input property_name: string, shown as ylabel\n  '''\n  num_methods, num_scenes, _ = scene_wise_stats.shape\n  assert len(method_names) == num_methods\n  assert len(scene_names) == num_scenes\n\n  # Initialize figure\n  fig = plt.figure(figsize=(14, 3))\n  ax = fig.add_subplot(1, 1, 1)\n\n  # Add some paddings\n  w = 1.0 / (num_methods + 2)\n\n  # Rightmost bar\n  x = np.arange(0, num_scenes) - 0.5 * w * num_methods\n\n  for m in range(num_methods):\n    m_stats = scene_wise_stats[m, :, PROPERTY_IDX_MAP[property_name]]\n    valid = not (np.logical_and.reduce(np.isnan(m_stats))\n                 or np.logical_and.reduce(m_stats == 0))\n    alpha = 1.0 if valid else 0.0\n    ax.bar(x + m * w, m_stats, w, color=cmap[m], alpha=alpha)\n\n  plt.ylim(ylim)\n  plt.xlim((0 - w * num_methods, num_scenes))\n  plt.ylabel(property_name)\n  plt.xticks(np.arange(0, num_scenes), tuple(scene_names))\n  ax.legend(method_names, loc='center left', bbox_to_anchor=(1, 0.5))\n\n  plt.tight_layout()\n  plt.grid()\n  plt.savefig('{}_{}.png'.format(property_name, output_postfix))\n  plt.close(fig)\n\n\ndef plot_pareto_frontier(pairwise_stats, method_names, cmap):\n  recalls = pairwise_stats[:, 0]\n  times = 1.0 / pairwise_stats[:, 3]\n\n  ind = np.argsort(times)\n\n  offset = 0.05\n  plt.rcParams.update({'font.size': 30})\n\n  fig = plt.figure(figsize=(20, 12))\n  ax = fig.add_subplot(111)\n  ax.set_xlabel('Number of registrations per second (log scale)')\n  ax.set_xscale('log')\n  xmin = np.power(10, -2.2)\n  xmax = np.power(10, 1.5)\n  ax.set_xlim(xmin, xmax)\n\n  ax.set_ylabel('Registration recall')\n  ax.set_ylim(-offset, 1)\n  ax.set_yticks(np.arange(0, 1, step=0.2))\n\n  plots = [None for m in ind]\n  max_gain = -1\n  for m in ind[::-1]:\n    # 8, 9: our methods\n    if (recalls[m] > max_gain):\n        max_gain = recalls[m]\n        ax.add_patch(\n          Rectangle((0, -offset),\n                    times[m],\n                    recalls[m] + offset,\n                    facecolor=(0.94, 0.94, 0.94)))\n\n    plot, = ax.plot(times[m], recalls[m], 'o', c=colors[m], markersize=30)\n    plots[m] = plot\n\n  ax.legend(plots, method_names, loc='center left', bbox_to_anchor=(1, 0.5))\n  plt.tight_layout()\n  plt.savefig('frontier.png')\n\n\nif __name__ == '__main__':\n  '''\n  Input .npz file to analyze:\n  \\prop npz['stats']: (num_methods, num_pairs, num_pairwise_stats=5)\n  5 pairwise stats properties consist of\n  - \\bool success: decided by evaluation thresholds, will be ignored in this script\n  - \\float rte: relative translation error (in cm)\n  - \\float rre: relative rotation error (in deg)\n  - \\float time: registration time for the pair (in ms)\n  - \\int scene_id: specific for 3DMatch test sets (8 scenes in total)\n\n  \\prop npz['names']: (num_methods)\n  Corresponding method name stored in string\n  '''\n\n  # Setup fonts\n  from matplotlib import rc\n  rc('font', **{'family': 'sans-serif', 'sans-serif': ['Helvetica']})\n  rc('text', usetex=False)\n\n  # Parse arguments\n  parser = argparse.ArgumentParser()\n  parser.add_argument('npz', help='path to the npz file')\n  parser.add_argument('--output_postfix', default='', help='postfix of the output')\n  parser.add_argument('--end_method_index',\n                      default=1000,\n                      type=int,\n                      help='reserved only for making slides')\n  args = parser.parse_args()\n\n  # Load npz file with aformentioned format\n  npz = np.load(args.npz)\n  stats = npz['stats']\n\n  # Reserved only for making slides, will be skipped by default\n  stats[args.end_method_index:, :, 1] = np.inf\n  stats[args.end_method_index:, :, 2] = np.inf\n\n  method_names = npz['names']\n  scene_names = [\n      'Kitchen', 'Home1', 'Home2', 'Hotel1', 'Hotel2', 'Hotel3', 'Study', 'Lab'\n  ]\n\n  cmap = plt.get_cmap('tab20b')\n  colors = [cmap(i) for i in np.linspace(0, 1, len(method_names))]\n  colors.reverse()\n\n  # Plot scene-wise bar charts\n  scene_wise_stats = analyze_by_scene(stats,\n                                      range(len(scene_names)),\n                                      rte_thresh=0.3,\n                                      rre_thresh=15)\n\n  plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, 'Recall',\n                        (0.0, 1.0), args.output_postfix, colors)\n  plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, 'TE (m)',\n                        (0.0, 0.3), args.output_postfix, colors)\n  plot_scene_wise_stats(scene_wise_stats, method_names, scene_names, 'RE (deg)',\n                        (0.0, 15.0), args.output_postfix, colors)\n\n  # Plot rte/rre - recall curves\n  plot_precision_recall_curves(stats,\n                               method_names,\n                               rre_precisions=np.arange(0, 15, 0.05),\n                               rte_precisions=np.arange(0, 0.3, 0.005),\n                               output_postfix=args.output_postfix,\n                               cmap=colors)\n\n  pairwise_stats = analyze_by_pair(stats, rte_thresh=0.3, rre_thresh=15)\n  plot_pareto_frontier(pairwise_stats, method_names, cmap=colors)\n"
  },
  {
    "path": "scripts/download_3dmatch.sh",
    "content": "#!/usr/bin/env bash\n\nDATA_DIR=$1\n\nfunction download() {\n    TMP_PATH=\"$DATA_DIR/tmp\"\n    echo \"#################################\"\n    echo \"Data Root Dir: ${DATA_DIR}\"\n    echo \"Download Path: ${TMP_PATH}\"\n    echo \"#################################\"\n    urls=(\n        'http://node2.chrischoy.org/data/datasets/registration/threedmatch.tgz'\n    )\n\n    if [ ! -d \"$TMP_PATH\" ]; then\n        echo \">> Create temporary directory: ${TMP_PATH}\"\n        mkdir -p \"$TMP_PATH\"\n    fi\n    cd \"$TMP_PATH\"\n\n    echo \">> Start downloading\"\n    echo ${urls[@]} | xargs -n 1 -P 3 wget --no-check-certificate -q -c --show-progress $0 \n\n    echo \">> Unpack .zip file\"\n    for filename in *.tgz\n    do\n        tar -xvzf $filename -C ../\n    done\n\n    echo \">> Clear tmp directory\"\n    cd ..\n    rm -rf ./tmp\n\n    echo \"#################################\"\n    echo \"Done!\"\n    echo \"#################################\"\n}\n\nfunction main() {\n    echo $DATA_DIR\n    if [ -z \"$DATA_DIR\" ]; then\n        echo \"DATA_DIR is required config!\"\n    else\n        download\n    fi\n}\n\nmain;\n"
  },
  {
    "path": "scripts/test_3dmatch.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\n# Run with python -m scripts.test_3dmatch_refactor\nimport os\nimport sys\nimport math\nimport logging\nimport open3d as o3d\nimport numpy as np\nimport time\nimport torch\nimport copy\n\nsys.path.append('.')\nimport MinkowskiEngine as ME\nfrom config import get_config\nfrom model import load_model\n\nfrom dataloader.data_loaders import ThreeDMatchTrajectoryDataset\nfrom core.knn import find_knn_gpu\nfrom core.deep_global_registration import DeepGlobalRegistration\n\nfrom util.timer import Timer\nfrom util.pointcloud import make_open3d_point_cloud\n\no3d.utility.set_verbosity_level(o3d.utility.VerbosityLevel.Warning)\nch = logging.StreamHandler(sys.stdout)\nlogging.getLogger().setLevel(logging.INFO)\nlogging.basicConfig(format='%(asctime)s %(message)s',\n                    datefmt='%m/%d %H:%M:%S',\n                    handlers=[ch])\n\n# Criteria\ndef rte_rre(T_pred, T_gt, rte_thresh, rre_thresh, eps=1e-16):\n  if T_pred is None:\n    return np.array([0, np.inf, np.inf])\n\n  rte = np.linalg.norm(T_pred[:3, 3] - T_gt[:3, 3])\n  rre = np.arccos(\n      np.clip((np.trace(T_pred[:3, :3].T @ T_gt[:3, :3]) - 1) / 2, -1 + eps,\n              1 - eps)) * 180 / math.pi\n  return np.array([rte < rte_thresh and rre < rre_thresh, rte, rre])\n\n\ndef analyze_stats(stats, mask, method_names):\n  mask = (mask > 0).squeeze(1)\n  stats = stats[:, mask, :]\n\n  print('Total result mean')\n  for i, method_name in enumerate(method_names):\n    print(method_name)\n    print(stats[i].mean(0))\n\n  print('Total successful result mean')\n  for i, method_name in enumerate(method_names):\n    sel = stats[i][:, 0] > 0\n    sel_stats = stats[i][sel]\n    print(method_name)\n    print(sel_stats.mean(0))\n\n\ndef create_pcd(xyz, color):\n  # n x 3\n  n = xyz.shape[0]\n  pcd = o3d.geometry.PointCloud()\n  pcd.points = o3d.utility.Vector3dVector(xyz)\n  pcd.colors = o3d.utility.Vector3dVector(np.tile(color, (n, 1)))\n  pcd.estimate_normals(\n      search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30))\n  return pcd\n\n\ndef draw_geometries_flip(pcds):\n  pcds_transform = []\n  flip_transform = [[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]\n  for pcd in pcds:\n    pcd_temp = copy.deepcopy(pcd)\n    pcd_temp.transform(flip_transform)\n    pcds_transform.append(pcd_temp)\n  o3d.visualization.draw_geometries(pcds_transform)\n\n\ndef evaluate(methods, method_names, data_loader, config, debug=False):\n\n  tot_num_data = len(data_loader.dataset)\n  data_loader_iter = iter(data_loader)\n\n  # Accumulate success, rre, rte, time, sid\n  mask = np.zeros((tot_num_data, 1)).astype(int)\n  stats = np.zeros((len(methods), tot_num_data, 5))\n\n  dataset = data_loader.dataset\n  subset_names = open(dataset.DATA_FILES[dataset.phase]).read().split()\n\n  for batch_idx in range(tot_num_data):\n    batch = data_loader_iter.next()\n\n    # Skip too sparse point clouds\n    sname, xyz0, xyz1, trans = batch[0]\n\n    sid = subset_names.index(sname)\n    T_gt = np.linalg.inv(trans)\n\n    for i, method in enumerate(methods):\n      start = time.time()\n      T = method.register(xyz0, xyz1)\n      end = time.time()\n\n      # Visualize\n      if debug:\n        print(method_names[i])\n        pcd0 = create_pcd(xyz0, np.array([1, 0.706, 0]))\n        pcd1 = create_pcd(xyz1, np.array([0, 0.651, 0.929]))\n\n        pcd0.transform(T)\n        draw_geometries_flip([pcd0, pcd1])\n        pcd0.transform(np.linalg.inv(T))\n\n      stats[i, batch_idx, :3] = rte_rre(T, T_gt, config.success_rte_thresh,\n                                        config.success_rre_thresh)\n      stats[i, batch_idx, 3] = end - start\n      stats[i, batch_idx, 4] = sid\n      mask[batch_idx] = 1\n      if stats[i, batch_idx, 0] == 0:\n        print(f\"{method_names[i]}: failed\")\n\n    if batch_idx % 10 == 9:\n      print('Summary {} / {}'.format(batch_idx, tot_num_data))\n      analyze_stats(stats, mask, method_names)\n\n  # Save results\n  filename = f'3dmatch-stats_{method.__class__.__name__}'\n  if os.path.isdir(config.out_dir):\n    out_file = os.path.join(config.out_dir, filename)\n  else:\n    out_file = filename  # save it on the current directory\n  print(f'Saving the stats to {out_file}')\n  np.savez(out_file, stats=stats, names=method_names)\n  analyze_stats(stats, mask, method_names)\n\n  # Analysis per scene\n  for i, method in enumerate(methods):\n    print(f'Scene-wise mean {method}')\n    scene_vals = np.zeros((len(subset_names), 3))\n    for sid, sname in enumerate(subset_names):\n      curr_scene = stats[i, :, 4] == sid\n      scene_vals[sid] = (stats[i, curr_scene, :3]).mean(0)\n\n    print('All scenes')\n    print(scene_vals)\n    print('Scene average')\n    print(scene_vals.mean(0))\n\n\nif __name__ == '__main__':\n  config = get_config()\n  print(config)\n\n  dgr = DeepGlobalRegistration(config)\n\n  methods = [dgr]\n  method_names = ['DGR']\n\n  dset = ThreeDMatchTrajectoryDataset(phase='test',\n                                      transform=None,\n                                      random_scale=False,\n                                      random_rotation=False,\n                                      config=config)\n\n  data_loader = torch.utils.data.DataLoader(dset,\n                                            batch_size=1,\n                                            shuffle=False,\n                                            num_workers=1,\n                                            collate_fn=lambda x: x,\n                                            pin_memory=False,\n                                            drop_last=True)\n\n  evaluate(methods, method_names, data_loader, config, debug=False)\n"
  },
  {
    "path": "scripts/test_kitti.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport os\nimport sys\nimport logging\nimport argparse\nimport numpy as np\nimport open3d as o3d\n\nimport torch\n\nfrom config import get_config\n\nfrom core.deep_global_registration import DeepGlobalRegistration\n\nfrom dataloader.kitti_loader import KITTINMPairDataset\nfrom dataloader.base_loader import CollationFunctionFactory\nfrom util.pointcloud import make_open3d_point_cloud, make_open3d_feature, pointcloud_to_spheres\nfrom util.timer import AverageMeter, Timer\n\nfrom scripts.test_3dmatch import rte_rre\n\nch = logging.StreamHandler(sys.stdout)\nlogging.getLogger().setLevel(logging.INFO)\nlogging.basicConfig(format='%(asctime)s %(message)s',\n                    datefmt='%m/%d %H:%M:%S',\n                    handlers=[ch])\n\nTE_THRESH = 0.6  # m\nRE_THRESH = 5  # deg\nVISUALIZE = False\n\n\ndef visualize_pair(xyz0, xyz1, T, voxel_size):\n    pcd0 = pointcloud_to_spheres(xyz0,\n                                 voxel_size,\n                                 np.array([0, 0, 1]),\n                                 sphere_size=0.6)\n    pcd1 = pointcloud_to_spheres(xyz1,\n                                 voxel_size,\n                                 np.array([0, 1, 0]),\n                                 sphere_size=0.6)\n    pcd0.transform(T)\n    o3d.visualization.draw_geometries([pcd0, pcd1])\n\n\ndef analyze_stats(stats):\n    print('Total result mean')\n    print(stats.mean(0))\n\n    sel_stats = stats[stats[:, 0] > 0]\n    print(sel_stats.mean(0))\n\n\ndef evaluate(config, data_loader, method):\n    data_timer = Timer()\n\n    test_iter = data_loader.__iter__()\n    N = len(test_iter)\n\n    stats = np.zeros((N, 5))  # bool succ, rte, rre, time, drive id\n\n    for i in range(len(data_loader)):\n        data_timer.tic()\n        try:\n            data_dict = test_iter.next()\n        except ValueError as exc:\n            pass\n        data_timer.toc()\n\n        drive = data_dict['extra_packages'][0]['drive']\n        xyz0, xyz1 = data_dict['pcd0'][0], data_dict['pcd1'][0]\n        T_gt = data_dict['T_gt'][0].numpy()\n        xyz0np, xyz1np = xyz0.numpy(), xyz1.numpy()\n\n        T_pred = method.register(xyz0np, xyz1np)\n\n        stats[i, :3] = rte_rre(T_pred, T_gt, TE_THRESH, RE_THRESH)\n        stats[i, 3] = method.reg_timer.diff + method.feat_timer.diff\n        stats[i, 4] = drive\n\n        if stats[i, 0] == 0:\n            logging.info(f\"Failed with RTE: {stats[i, 1]}, RRE: {stats[i, 2]}\")\n\n        if i % 10 == 0:\n            succ_rate, rte, rre, avg_time, _ = stats[:i + 1].mean(0)\n            logging.info(\n                f\"{i} / {N}: Data time: {data_timer.avg}, Feat time: {method.feat_timer.avg},\"\n                + f\" Reg time: {method.reg_timer.avg}, RTE: {rte},\" +\n                f\" RRE: {rre}, Success: {succ_rate * 100} %\")\n\n        if VISUALIZE and i % 10 == 9:\n            visualize_pair(xyz0, xyz1, T_pred, config.voxel_size)\n\n    succ_rate, rte, rre, avg_time, _ = stats.mean(0)\n    logging.info(\n        f\"Data time: {data_timer.avg}, Feat time: {method.feat_timer.avg},\" +\n        f\" Reg time: {method.reg_timer.avg}, RTE: {rte},\" +\n        f\" RRE: {rre}, Success: {succ_rate * 100} %\")\n\n    # Save results\n    filename = f'kitti-stats_{method.__class__.__name__}'\n    if config.out_filename is not None:\n        filename += f'_{config.out_filename}'\n    if isinstance(method, FCGFWrapper):\n        filename += '_' + method.method\n        if 'ransac' in method.method:\n            filename += f'_{config.ransac_iter}'\n    if os.path.isdir(config.out_dir):\n        out_file = os.path.join(config.out_dir, filename)\n    else:\n        out_file = filename  # save it on the current directory\n    print(f'Saving the stats to {out_file}')\n    np.savez(out_file, stats=stats)\n    analyze_stats(stats)\n\n\nif __name__ == '__main__':\n    config = get_config()\n\n    dgr = DeepGlobalRegistration(config)\n\n    dset = KITTINMPairDataset('test',\n                              transform=None,\n                              random_rotation=False,\n                              random_scale=False,\n                              config=config)\n\n    data_loader = torch.utils.data.DataLoader(\n        dset,\n        batch_size=1,\n        shuffle=False,\n        num_workers=0,\n        collate_fn=CollationFunctionFactory(concat_correspondences=False,\n                                            collation_type='collate_pair'),\n        pin_memory=False,\n        drop_last=False)\n\n    evaluate(config, data_loader, dgr)\n"
  },
  {
    "path": "scripts/train_3dmatch.sh",
    "content": "#! /bin/bash\nexport PATH_POSTFIX=$1\nexport MISC_ARGS=$2\n\nexport DATA_ROOT=\"./outputs/Experiment2\"\nexport DATASET=${DATASET:-ThreeDMatchPairDataset03}\nexport THREED_MATCH_DIR=${THREED_MATCH_DIR}\nexport MODEL=${MODEL:-ResUNetBN2C}\nexport MODEL_N_OUT=${MODEL_N_OUT:-32}\nexport FCGF_WEIGHTS=${FCGF_WEIGHTS:fcgf.pth}\nexport INLIER_MODEL=${INLIER_MODEL:-ResUNetBNF}\nexport OPTIMIZER=${OPTIMIZER:-SGD}\nexport LR=${LR:-1e-1}\nexport MAX_EPOCH=${MAX_EPOCH:-100}\nexport BATCH_SIZE=${BATCH_SIZE:-8}\nexport ITER_SIZE=${ITER_SIZE:-1}\nexport VOXEL_SIZE=${VOXEL_SIZE:-0.05}\nexport POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER=${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER:-4}\nexport CONV1_KERNEL_SIZE=${CONV1_KERNEL_SIZE:-7}\nexport EXP_GAMMA=${EXP_GAMMA:-0.99}\nexport RANDOM_SCALE=${RANDOM_SCALE:-True}\nexport TIME=$(date +\"%Y-%m-%d_%H-%M-%S\")\nexport VERSION=$(git rev-parse HEAD)\n\nexport 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}\n\nexport PYTHONUNBUFFERED=\"True\"\n\necho $OUT_DIR\n\nmkdir -m 755 -p $OUT_DIR\n\nLOG=${OUT_DIR}/log_${TIME}.txt\n\necho \"Host: \" $(hostname) | tee -a $LOG\necho \"Conda \" $(which conda) | tee -a $LOG\necho $(pwd) | tee -a $LOG\necho \"Version: \" $VERSION | tee -a $LOG\necho \"Git diff\" | tee -a $LOG\necho \"\" | tee -a $LOG\ngit diff | tee -a $LOG\necho \"\" | tee -a $LOG\nnvidia-smi | tee -a $LOG\n\n# Training\npython train.py \\\n\t--weights ${FCGF_WEIGHTS} \\\n\t--dataset ${DATASET} \\\n\t--threed_match_dir ${THREED_MATCH_DIR} \\\n\t--feat_model ${MODEL} \\\n\t--feat_model_n_out ${MODEL_N_OUT} \\\n\t--feat_conv1_kernel_size ${CONV1_KERNEL_SIZE} \\\n\t--inlier_model ${INLIER_MODEL} \\\n\t--optimizer ${OPTIMIZER} \\\n\t--lr ${LR} \\\n\t--batch_size ${BATCH_SIZE} \\\n\t--val_batch_size ${BATCH_SIZE} \\\n\t--iter_size ${ITER_SIZE} \\\n\t--max_epoch ${MAX_EPOCH} \\\n\t--voxel_size ${VOXEL_SIZE} \\\n\t--out_dir ${OUT_DIR} \\\n\t--use_random_scale ${RANDOM_SCALE} \\\n\t--positive_pair_search_voxel_size_multiplier ${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER} \\\n\t$MISC_ARGS 2>&1 | tee -a $LOG\n\n# Test\npython -m scripts.test_3dmatch \\\n\t$MISC_ARGS \\\n\t--threed_match_dir ${THREED_MATCH_DIR} \\\n\t--weights ${OUT_DIR}/best_val_checkpoint.pth \\\n\t2>&1 | tee -a $LOG\n"
  },
  {
    "path": "scripts/train_kitti.sh",
    "content": "#! /bin/bash\nexport PATH_POSTFIX=$1\nexport MISC_ARGS=$2\n\nexport DATA_ROOT=\"./outputs/Experiment3\"\nexport DATASET=${DATASET:-KITTINMPairDataset}\nexport KITTI_PATH=${KITTI_PATH}\nexport MODEL=${MODEL:-ResUNetBN2C}\nexport MODEL_N_OUT=${MODEL_N_OUT:-32}\nexport FCGF_WEIGHTS=${FCGF_WEIGHTS}\nexport INLIER_MODEL=${INLIER_MODEL:-ResUNetBN2C}\nexport OPTIMIZER=${OPTIMIZER:-SGD}\nexport LR=${LR:-1e-2}\nexport MAX_EPOCH=${MAX_EPOCH:-100}\nexport BATCH_SIZE=${BATCH_SIZE:-8}\nexport ITER_SIZE=${ITER_SIZE:-1}\nexport VOXEL_SIZE=${VOXEL_SIZE:-0.3}\nexport POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER=${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER:-4}\nexport CONV1_KERNEL_SIZE=${CONV1_KERNEL_SIZE:-5}\nexport EXP_GAMMA=${EXP_GAMMA:-0.99}\nexport RANDOM_SCALE=${RANDOM_SCALE:-True}\nexport TIME=$(date +\"%Y-%m-%d_%H-%M-%S\")\nexport VERSION=$(git rev-parse HEAD)\n\nexport 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}\n\nexport PYTHONUNBUFFERED=\"True\"\n\necho $OUT_DIR\n\nmkdir -m 755 -p $OUT_DIR\n\nLOG=${OUT_DIR}/log_${TIME}.txt\n\necho \"Host: \" $(hostname) | tee -a $LOG\necho \"Conda \" $(which conda) | tee -a $LOG\necho $(pwd) | tee -a $LOG\necho \"Version: \" $VERSION | tee -a $LOG\necho \"Git diff\" | tee -a $LOG\necho \"\" | tee -a $LOG\ngit diff | tee -a $LOG\necho \"\" | tee -a $LOG\nnvidia-smi | tee -a $LOG\n\n# Training\npython train.py \\\n\t--weights ${FCGF_WEIGHTS} \\\n\t--dataset ${DATASET} \\\n\t--feat_model ${MODEL} \\\n\t--feat_model_n_out ${MODEL_N_OUT} \\\n\t--feat_conv1_kernel_size ${CONV1_KERNEL_SIZE} \\\n\t--inlier_model ${INLIER_MODEL} \\\n\t--optimizer ${OPTIMIZER} \\\n\t--lr ${LR} \\\n\t--batch_size ${BATCH_SIZE} \\\n\t--val_batch_size ${BATCH_SIZE} \\\n\t--iter_size ${ITER_SIZE} \\\n\t--max_epoch ${MAX_EPOCH} \\\n\t--voxel_size ${VOXEL_SIZE} \\\n\t--out_dir ${OUT_DIR} \\\n\t--use_random_scale ${RANDOM_SCALE} \\\n\t--kitti_dir ${KITTI_PATH} \\\n\t--success_rte_thresh 2 \\\n\t--success_rre_thresh 5 \\\n\t--positive_pair_search_voxel_size_multiplier ${POSITIVE_PAIR_SEARCH_VOXEL_SIZE_MULTIPLIER} \\\n\t$MISC_ARGS 2>&1 | tee -a $LOG\n\n# Test\npython -m scripts.test_kitti \\\n\t--kitti_dir ${KITTI_PATH} \\\n\t--save_dir ${OUT_DIR} | tee -a $LOG\n"
  },
  {
    "path": "train.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport open3d as o3d  # prevent loading error\n\nimport sys\nimport json\nimport logging\nimport torch\nfrom easydict import EasyDict as edict\n\nfrom config import get_config\n\nfrom dataloader.data_loaders import make_data_loader\n\nfrom core.trainer import WeightedProcrustesTrainer\n\nch = logging.StreamHandler(sys.stdout)\nlogging.getLogger().setLevel(logging.INFO)\nlogging.basicConfig(format='%(asctime)s %(message)s',\n                    datefmt='%m/%d %H:%M:%S',\n                    handlers=[ch])\n\ntorch.manual_seed(0)\ntorch.cuda.manual_seed(0)\n\nlogging.basicConfig(level=logging.INFO, format=\"\")\n\n\ndef main(config, resume=False):\n  train_loader = make_data_loader(config,\n                                  config.train_phase,\n                                  config.batch_size,\n                                  num_workers=config.train_num_workers,\n                                  shuffle=True)\n\n  if config.test_valid:\n    val_loader = make_data_loader(config,\n                                  config.val_phase,\n                                  config.val_batch_size,\n                                  num_workers=config.val_num_workers,\n                                  shuffle=True)\n  else:\n    val_loader = None\n\n  trainer = WeightedProcrustesTrainer(\n      config=config,\n      data_loader=train_loader,\n      val_data_loader=val_loader,\n  )\n\n  trainer.train()\n\n\nif __name__ == \"__main__\":\n  logger = logging.getLogger()\n  config = get_config()\n\n  dconfig = vars(config)\n  if config.resume_dir:\n    resume_config = json.load(open(config.resume_dir + '/config.json', 'r'))\n    for k in dconfig:\n      if k not in ['resume_dir'] and k in resume_config:\n        dconfig[k] = resume_config[k]\n    dconfig['resume'] = resume_config['out_dir'] + '/checkpoint.pth'\n\n  logging.info('===> Configurations')\n  for k in dconfig:\n    logging.info('    {}: {}'.format(k, dconfig[k]))\n\n  # Convert to dict\n  config = edict(dconfig)\n  main(config)\n"
  },
  {
    "path": "util/__init__.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\n"
  },
  {
    "path": "util/file.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport os\nimport re\nfrom os import listdir\nfrom os.path import isfile, isdir, join, splitext\n\nimport numpy as np\n\n\ndef read_txt(path):\n  \"\"\"Read txt file into lines.\n  \"\"\"\n  with open(path) as f:\n    lines = f.readlines()\n  lines = [x.strip() for x in lines]\n  return lines\n\n\ndef ensure_dir(path):\n  if not os.path.exists(path):\n    os.makedirs(path, mode=0o755)\n\n\ndef sorted_alphanum(file_list_ordered):\n  def convert(text):\n    return int(text) if text.isdigit() else text\n\n  def alphanum_key(key):\n    return [convert(c) for c in re.split('([0-9]+)', key)]\n\n  return sorted(file_list_ordered, key=alphanum_key)\n\n\ndef get_file_list(path, extension=None):\n  if extension is None:\n    file_list = [join(path, f) for f in listdir(path) if isfile(join(path, f))]\n  else:\n    file_list = [\n        join(path, f) for f in listdir(path)\n        if isfile(join(path, f)) and splitext(f)[1] == extension\n    ]\n  file_list = sorted_alphanum(file_list)\n  return file_list\n\n\ndef get_file_list_specific(path, color_depth, extension=None):\n  if extension is None:\n    file_list = [join(path, f) for f in listdir(path) if isfile(join(path, f))]\n  else:\n    file_list = [\n        join(path, f) for f in listdir(path)\n        if isfile(join(path, f)) and color_depth in f and splitext(f)[1] == extension\n    ]\n    file_list = sorted_alphanum(file_list)\n  return file_list\n\n\ndef get_folder_list(path):\n  folder_list = [join(path, f) for f in listdir(path) if isdir(join(path, f))]\n  folder_list = sorted_alphanum(folder_list)\n  return folder_list\n\n\ndef read_trajectory(filename, dim=4):\n  class CameraPose:\n    def __init__(self, meta, mat):\n      self.metadata = meta\n      self.pose = mat\n\n    def __str__(self):\n      return 'metadata : ' + ' '.join(map(str, self.metadata)) + '\\n' + \\\n        \"pose : \" + \"\\n\" + np.array_str(self.pose)\n\n  traj = []\n  with open(filename, 'r') as f:\n    metastr = f.readline()\n    while metastr:\n      metadata = list(map(int, metastr.split()))\n      mat = np.zeros(shape=(dim, dim))\n      for i in range(dim):\n        matstr = f.readline()\n        mat[i, :] = np.fromstring(matstr, dtype=float, sep=' \\t')\n      traj.append(CameraPose(metadata, mat))\n      metastr = f.readline()\n    return traj\n"
  },
  {
    "path": "util/integration.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport open3d as o3d\nimport argparse\nimport os, sys\nimport numpy as np\n\n\ndef read_rgbd_image(color_file, depth_file, max_depth=4.5):\n  '''\n  \\return RGBD image\n  '''\n  color = o3d.io.read_image(color_file)\n  depth = o3d.io.read_image(depth_file)\n\n  # We assume depth scale is always 1000.0\n  rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth(\n      color, depth, depth_trunc=max_depth, convert_rgb_to_intensity=False)\n  return rgbd_image\n\n\ndef read_pose(pose_file):\n  '''\n  \\return 4x4 np matrix\n  '''\n  pose = np.loadtxt(pose_file)\n  assert pose is not None\n  return pose\n\n\ndef read_intrinsics(intrinsic_file):\n  '''\n  \\return fx, fy, cx, cy\n  '''\n  K = np.loadtxt(intrinsic_file)\n  assert K is not None\n  return K[0, 0], K[1, 1], K[0, 2], K[1, 2]\n\n\ndef integrate_rgb_frames_for_fragment(color_files,\n                                      depth_files,\n                                      pose_files,\n                                      seq_path,\n                                      intrinsic,\n                                      fragment_id,\n                                      n_fragments,\n                                      n_frames_per_fragment,\n                                      voxel_length=0.008):\n  volume = o3d.integration.ScalableTSDFVolume(\n      voxel_length=voxel_length,\n      sdf_trunc=0.04,\n      color_type=o3d.integration.TSDFVolumeColorType.RGB8)\n\n  start = fragment_id * n_frames_per_fragment\n  end = min(start + n_frames_per_fragment, len(pose_files))\n  for i_abs in range(start, end):\n    print(\"Fragment %03d / %03d :: integrate rgbd frame %d (%d of %d).\" %\n          (fragment_id, n_fragments - 1, i_abs, i_abs - start + 1, end - start))\n\n    rgbd = read_rgbd_image(\n        os.path.join(seq_path, color_files[i_abs]),\n        os.path.join(seq_path, depth_files[i_abs]))\n    pose = read_pose(os.path.join(seq_path, pose_files[i_abs]))\n    volume.integrate(rgbd, intrinsic, np.linalg.inv(pose))\n\n  mesh = volume.extract_triangle_mesh()\n  return mesh\n\n\ndef process_seq(seq_path, output_path, n_frames_per_fragment, display=False):\n  files = os.listdir(seq_path)\n\n  if 'intrinsics.txt' in files:\n    fx, fy, cx, cy = read_intrinsics(os.path.join(seq_path, 'intrinsics.txt'))\n  else:\n    fx, fy, cx, cy = read_intrinsics(os.path.join(seq_path, '../camera-intrinsics.txt'))\n\n  rgb_files = sorted(list(filter(lambda x: x.endswith('.color.png'), files)))\n  depth_files = sorted(list(filter(lambda x: x.endswith('.depth.png'), files)))\n  pose_files = sorted(list(filter(lambda x: x.endswith('.pose.txt'), files)))\n\n  assert len(rgb_files) > 0\n  assert len(rgb_files) == len(depth_files)\n  assert len(rgb_files) == len(pose_files)\n\n  # get width and height to prepare for intrinsics\n  rgb_sample = o3d.io.read_image(os.path.join(seq_path, rgb_files[0]))\n  width, height = rgb_sample.get_max_bound()\n  intrinsic = o3d.camera.PinholeCameraIntrinsic(int(width), int(height), fx, fy, cx, cy)\n\n  n_fragments = ((len(rgb_files) + n_frames_per_fragment - 1)) // n_frames_per_fragment\n\n  for fragment_id in range(0, n_fragments):\n    mesh = integrate_rgb_frames_for_fragment(rgb_files, depth_files, pose_files,\n                                             seq_path, intrinsic, fragment_id,\n                                             n_fragments, n_frames_per_fragment)\n    if display:\n      o3d.visualization.draw_geometries([mesh])\n\n    mesh_name = os.path.join(output_seq_path, 'fragment-{}.ply'.format(fragment_id))\n    o3d.io.write_triangle_mesh(mesh_name, mesh)\n\n\nif __name__ == '__main__':\n  parser = argparse.ArgumentParser(\n      description='RGB-D integration for 3DMatch raw dataset')\n\n  parser.add_argument(\n      'dataset', help='path to dataset that contains colors, depths and poses')\n  parser.add_argument('output', help='path to output fragments')\n\n  args = parser.parse_args()\n\n  scene_name = args.dataset.split('/')[-1]\n  if not os.path.exists(args.output):\n    os.makedirs(args.output)\n\n  output_scene_path = os.path.join(args.output, scene_name)\n  if os.path.exists(output_scene_path):\n    choice = input(\n        'Path {} already exists, continue? (Y / N)'.format(output_scene_path))\n    if choice != 'Y' and choice != 'y':\n      print('abort')\n      exit\n  else:\n    os.makedirs(output_scene_path)\n\n  seqs = list(filter(lambda x: x.startswith('seq'), os.listdir(args.dataset)))\n  for seq in seqs:\n    output_seq_path = os.path.join(output_scene_path, seq)\n    if not os.path.exists(output_seq_path):\n      os.makedirs(output_seq_path)\n    process_seq(\n        os.path.join(args.dataset, seq),\n        output_seq_path,\n        n_frames_per_fragment=50,\n        display=False)\n"
  },
  {
    "path": "util/pointcloud.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport copy\nimport numpy as np\nimport math\n\nimport open3d as o3d\nfrom core.knn import find_knn_cpu\n\n\ndef make_open3d_point_cloud(xyz, color=None):\n  pcd = o3d.geometry.PointCloud()\n  pcd.points = o3d.utility.Vector3dVector(xyz.cpu().detach().numpy())\n  if color is not None:\n    if len(color) != len(xyz):\n      color = np.tile(color, (len(xyz), 1))\n    pcd.colors = o3d.utility.Vector3dVector(color)\n  return pcd\n\n\ndef make_open3d_feature(data, dim, npts):\n  feature = o3d.registration.Feature()\n  feature.resize(dim, npts)\n  feature.data = data.cpu().numpy().astype('d').transpose()\n  return feature\n\n\ndef make_open3d_feature_from_numpy(data):\n  assert isinstance(data, np.ndarray)\n  assert data.ndim == 2\n\n  feature = o3d.registration.Feature()\n  feature.resize(data.shape[1], data.shape[0])\n  feature.data = data.astype('d').transpose()\n  return feature\n\n\ndef pointcloud_to_spheres(pcd, voxel_size, color, sphere_size=0.6):\n  spheres = o3d.geometry.TriangleMesh()\n  s = o3d.geometry.TriangleMesh.create_sphere(radius=voxel_size * sphere_size)\n  s.compute_vertex_normals()\n  s.paint_uniform_color(color)\n  if isinstance(pcd, o3d.geometry.PointCloud):\n    pcd = np.array(pcd.points)\n  for i, p in enumerate(pcd):\n    si = copy.deepcopy(s)\n    trans = np.identity(4)\n    trans[:3, 3] = p\n    si.transform(trans)\n    # si.paint_uniform_color(pcd.colors[i])\n    spheres += si\n  return spheres\n\n\ndef prepare_single_pointcloud(pcd, voxel_size):\n  pcd.estimate_normals(o3d.KDTreeSearchParamHybrid(radius=voxel_size * 2.0, max_nn=30))\n  return pcd\n\n\ndef prepare_pointcloud(filename, voxel_size):\n  pcd = o3d.io.read_point_cloud(filename)\n  T = get_random_transformation(pcd)\n  pcd.transform(T)\n  pcd_down = pcd.voxel_down_sample(voxel_size)\n  return pcd_down, T\n\n\ndef compute_overlap_ratio(pcd0, pcd1, trans, voxel_size):\n  pcd0_down = pcd0.voxel_down_sample(voxel_size)\n  pcd1_down = pcd1.voxel_down_sample(voxel_size)\n  matching01 = get_matching_indices(pcd0_down, pcd1_down, trans, voxel_size, 1)\n  matching10 = get_matching_indices(pcd1_down, pcd0_down, np.linalg.inv(trans),\n                                    voxel_size, 1)\n  overlap0 = len(matching01) / len(pcd0_down.points)\n  overlap1 = len(matching10) / len(pcd1_down.points)\n  return max(overlap0, overlap1)\n\n\ndef get_matching_indices(source, target, trans, search_voxel_size, K=None):\n  source_copy = copy.deepcopy(source)\n  target_copy = copy.deepcopy(target)\n  source_copy.transform(trans)\n  pcd_tree = o3d.geometry.KDTreeFlann(target_copy)\n\n  match_inds = []\n  for i, point in enumerate(source_copy.points):\n    [_, idx, _] = pcd_tree.search_radius_vector_3d(point, search_voxel_size)\n    if K is not None:\n      idx = idx[:K]\n    for j in idx:\n      match_inds.append((i, j))\n  return match_inds\n\n\ndef evaluate_feature(pcd0, pcd1, feat0, feat1, trans_gth, search_voxel_size):\n  match_inds = get_matching_indices(pcd0, pcd1, trans_gth, search_voxel_size)\n  pcd_tree = o3d.geometry.KDTreeFlann(feat1)\n  dist = []\n  for ind in match_inds:\n    k, idx, _ = pcd_tree.search_knn_vector_xd(feat0.data[:, ind[0]], 1)\n    dist.append(\n        np.clip(np.power(pcd1.points[ind[1]] - pcd1.points[idx[0]], 2),\n                a_min=0.0,\n                a_max=1.0))\n  return np.mean(dist)\n\n\ndef valid_feat_ratio(pcd0, pcd1, feat0, feat1, trans_gth, thresh=0.1):\n  pcd0_copy = copy.deepcopy(pcd0)\n  pcd0_copy.transform(trans_gth)\n  inds = find_knn_cpu(feat0, feat1)\n  dist = np.sqrt(((np.array(pcd0_copy.points) - np.array(pcd1.points)[inds])**2).sum(1))\n  return np.mean(dist < thresh)\n\n\ndef evaluate_feature_3dmatch(pcd0, pcd1, feat0, feat1, trans_gth, inlier_thresh=0.1):\n  r\"\"\"Return the hit ratio (ratio of inlier correspondences and all correspondences).\n\n  inliear_thresh is the inlier_threshold in meter.\n  \"\"\"\n  if len(pcd0.points) < len(pcd1.points):\n    hit = valid_feat_ratio(pcd0, pcd1, feat0, feat1, trans_gth, inlier_thresh)\n  else:\n    hit = valid_feat_ratio(pcd1, pcd0, feat1, feat0, np.linalg.inv(trans_gth),\n                           inlier_thresh)\n  return hit\n\n\ndef get_matching_matrix(source, target, trans, voxel_size, debug_mode):\n  source_copy = copy.deepcopy(source)\n  target_copy = copy.deepcopy(target)\n  source_copy.transform(trans)\n  pcd_tree = o3d.geometry.KDTreeFlann(target_copy)\n  matching_matrix = np.zeros((len(source_copy.points), len(target_copy.points)))\n\n  for i, point in enumerate(source_copy.points):\n    [k, idx, _] = pcd_tree.search_radius_vector_3d(point, voxel_size * 1.5)\n    if k >= 1:\n      matching_matrix[i, idx[0]] = 1  # TODO: only the cloest?\n\n  return matching_matrix\n\n\ndef get_random_transformation(pcd_input):\n  def rot_x(x):\n    out = np.zeros((3, 3))\n    c = math.cos(x)\n    s = math.sin(x)\n    out[0, 0] = 1\n    out[1, 1] = c\n    out[1, 2] = -s\n    out[2, 1] = s\n    out[2, 2] = c\n    return out\n\n  def rot_y(x):\n    out = np.zeros((3, 3))\n    c = math.cos(x)\n    s = math.sin(x)\n    out[0, 0] = c\n    out[0, 2] = s\n    out[1, 1] = 1\n    out[2, 0] = -s\n    out[2, 2] = c\n    return out\n\n  def rot_z(x):\n    out = np.zeros((3, 3))\n    c = math.cos(x)\n    s = math.sin(x)\n    out[0, 0] = c\n    out[0, 1] = -s\n    out[1, 0] = s\n    out[1, 1] = c\n    out[2, 2] = 1\n    return out\n\n  pcd_output = copy.deepcopy(pcd_input)\n  mean = np.mean(np.asarray(pcd_output.points), axis=0).transpose()\n  xyz = np.random.uniform(0, 2 * math.pi, 3)\n  R = np.dot(np.dot(rot_x(xyz[0]), rot_y(xyz[1])), rot_z(xyz[2]))\n  T = np.zeros((4, 4))\n  T[:3, :3] = R\n  T[:3, 3] = np.dot(-R, mean)\n  T[3, 3] = 1\n  return T\n\n\ndef draw_registration_result(source, target, transformation):\n  source_temp = copy.deepcopy(source)\n  target_temp = copy.deepcopy(target)\n  source_temp.paint_uniform_color([1, 0.706, 0])\n  target_temp.paint_uniform_color([0, 0.651, 0.929])\n  source_temp.transform(transformation)\n  o3d.visualization.draw_geometries([source_temp, target_temp])\n"
  },
  {
    "path": "util/timer.py",
    "content": "# Copyright (c) Chris Choy (chrischoy@ai.stanford.edu) and Wei Dong (weidong@andrew.cmu.edu)\n#\n# Please cite the following papers if you use any part of the code.\n# - Christopher Choy, Wei Dong, Vladlen Koltun, Deep Global Registration, CVPR 2020\n# - Christopher Choy, Jaesik Park, Vladlen Koltun, Fully Convolutional Geometric Features, ICCV 2019\n# - Christopher Choy, JunYoung Gwak, Silvio Savarese, 4D Spatio-Temporal ConvNets: Minkowski Convolutional Neural Networks, CVPR 2019\nimport time\nimport numpy as np\nimport torch\n\n\nclass AverageMeter(object):\n  \"\"\"Computes and stores the average and current value\"\"\"\n\n  def __init__(self):\n    self.reset()\n\n  def reset(self):\n    self.val = 0\n    self.avg = 0\n    self.sum = 0.0\n    self.sq_sum = 0.0\n    self.count = 0\n\n  def update(self, val, n=1):\n    if isinstance(val, np.ndarray):\n      n = val.size\n      val = val.mean()\n    elif isinstance(val, torch.Tensor):\n      n = val.nelement()\n      val = val.mean().item()\n    self.val = val\n    self.sum += val * n\n    self.count += n\n    self.avg = self.sum / self.count\n    self.sq_sum += val**2 * n\n    self.var = self.sq_sum / self.count - self.avg ** 2\n\n\nclass Timer(AverageMeter):\n  \"\"\"A simple timer.\"\"\"\n\n  def tic(self):\n    # using time.time instead of time.clock because time time.clock\n    # does not normalize for multithreading\n    self.start_time = time.time()\n\n  def toc(self, average=True):\n    self.diff = time.time() - self.start_time\n    self.update(self.diff)\n    if average:\n      return self.avg\n    else:\n      return self.diff\n"
  }
]